Full Code of Nozbe/WatermelonDB for AI

master 5c463222ecd7 cached
1087 files
5.6 MB
1.5M tokens
1296 symbols
1 requests
Download .txt
Showing preview only (6,050K chars total). Download the full file or copy to clipboard to get everything.
Repository: Nozbe/WatermelonDB
Branch: master
Commit: 5c463222ecd7
Files: 1087
Total size: 5.6 MB

Directory structure:
gitextract_rzrk799j/

├── .eslintignore
├── .eslintrc.js
├── .flowconfig
├── .gitattributes
├── .github/
│   ├── stale.yml
│   └── workflows/
│       └── ci.yml
├── .gitignore
├── .imgbotconfig
├── CHANGELOG-Unreleased.md
├── CHANGELOG.md
├── CONTRIBUTING.md
├── Gemfile
├── LICENSE
├── README.md
├── SECURITY.md
├── WatermelonDB.podspec
├── babel.config.js
├── docs-website/
│   ├── .gitignore
│   ├── README.md
│   ├── babel.config.js
│   ├── blog/
│   │   ├── 2021-08-01-mdx-blog-post.mdx
│   │   └── authors.yml
│   ├── docs/
│   │   └── docs/
│   │       ├── Advanced/
│   │       │   ├── AdvancedFields.md
│   │       │   ├── CreateUpdateTracking.md
│   │       │   ├── Flow.md
│   │       │   ├── LocalStorage.md
│   │       │   ├── Logging.md
│   │       │   ├── Migrations.md
│   │       │   ├── Performance.md
│   │       │   ├── ProTips.md
│   │       │   └── SharingDatabaseAcrossTargets.md
│   │       ├── CHANGELOG.md
│   │       ├── CONTRIBUTING.md
│   │       ├── CRUD.md
│   │       ├── Components.md
│   │       ├── Implementation/
│   │       │   ├── Architecture.md
│   │       │   ├── DatabaseAdapters.md
│   │       │   ├── Publishing.md
│   │       │   └── SyncImpl.md
│   │       ├── Installation.mdx
│   │       ├── Model.md
│   │       ├── Query.md
│   │       ├── README.md
│   │       ├── Relation.md
│   │       ├── Roadmap.md
│   │       ├── Schema.md
│   │       ├── Setup.md
│   │       ├── Sync/
│   │       │   ├── Backend.md
│   │       │   ├── Contribute.md
│   │       │   ├── FAQ.md
│   │       │   ├── Frontend.md
│   │       │   ├── Intro.md
│   │       │   ├── Limitations.md
│   │       │   └── Troubleshoot.md
│   │       └── Writers.md
│   ├── docusaurus.config.js
│   ├── package.json
│   ├── sidebars.js
│   ├── src/
│   │   ├── components/
│   │   │   └── HomepageFeatures/
│   │   │       ├── index.js
│   │   │       └── styles.module.css
│   │   ├── css/
│   │   │   └── custom.css
│   │   └── pages/
│   │       ├── index.js
│   │       └── index.module.css
│   └── static/
│       ├── .nojekyll
│       └── CNAME
├── examples/
│   └── typescript/
│       ├── AppSchema.ts
│       ├── __typetests__/
│       │   ├── README.md
│       │   ├── index.ts
│       │   ├── query.ts
│       │   └── withObservables.tsx
│       ├── package.json
│       ├── ts-example.ts
│       └── tsconfig.json
├── flow-typed/
│   ├── custom/
│   │   ├── lokijs.js
│   │   └── react-native.js
│   └── npm/
│       └── rxjs_v6.x.js
├── jest.config.js
├── metro.config.js
├── native/
│   ├── .clang-format
│   ├── .gitignore
│   ├── android/
│   │   ├── .gitignore
│   │   ├── build.gradle
│   │   ├── gradle.properties
│   │   └── src/
│   │       └── main/
│   │           ├── AndroidManifest.xml
│   │           └── java/
│   │               └── com/
│   │                   └── nozbe/
│   │                       └── watermelondb/
│   │                           ├── Connection.java
│   │                           ├── DatabaseUtils.java
│   │                           ├── MigrationNeededError.java
│   │                           ├── Queries.java
│   │                           ├── SchemaNeededError.java
│   │                           ├── WMDatabase.java
│   │                           ├── WMDatabaseBridge.java
│   │                           ├── WMDatabaseDriver.java
│   │                           ├── WatermelonDBPackage.java
│   │                           └── utils/
│   │                               ├── MigrationSet.java
│   │                               ├── Pair.java
│   │                               └── Schema.java
│   ├── android-jsi/
│   │   ├── .gitignore
│   │   ├── build.gradle
│   │   └── src/
│   │       └── main/
│   │           ├── AndroidManifest.xml
│   │           ├── cpp/
│   │           │   ├── CMakeLists.txt
│   │           │   ├── DatabasePlatformAndroid.cpp
│   │           │   ├── DatabasePlatformAndroid.h
│   │           │   └── JSIInstaller.cpp
│   │           └── java/
│   │               └── com/
│   │                   └── nozbe/
│   │                       └── watermelondb/
│   │                           ├── WatermelonDBJSIModule.java
│   │                           └── jsi/
│   │                               ├── JSIInstaller.java
│   │                               ├── WatermelonDBJSIPackage.java
│   │                               └── WatermelonJSI.java
│   ├── androidTest/
│   │   ├── .gitignore
│   │   ├── app/
│   │   │   ├── BUCK
│   │   │   ├── DemoKeystore.keystore
│   │   │   ├── build.gradle
│   │   │   ├── proguard-rules.pro
│   │   │   └── src/
│   │   │       ├── androidTest/
│   │   │       │   └── java/
│   │   │       │       └── com/
│   │   │       │           └── nozbe/
│   │   │       │               └── watermelonTest/
│   │   │       │                   └── BridgeTest.kt
│   │   │       └── main/
│   │   │           ├── AndroidManifest.xml
│   │   │           ├── java/
│   │   │           │   └── com/
│   │   │           │       └── nozbe/
│   │   │           │           └── watermelonTest/
│   │   │           │               ├── BridgeTestReporter.kt
│   │   │           │               ├── MainActivity.kt
│   │   │           │               ├── MainApplication.kt
│   │   │           │               └── NativeModulesPackage.kt
│   │   │           └── res/
│   │   │               └── values/
│   │   │                   └── strings.xml
│   │   ├── build.gradle
│   │   ├── gradle/
│   │   │   └── wrapper/
│   │   │       ├── gradle-wrapper.jar
│   │   │       └── gradle-wrapper.properties
│   │   ├── gradle.properties
│   │   ├── gradlew
│   │   ├── gradlew.bat
│   │   ├── keystores/
│   │   │   ├── BUCK
│   │   │   └── debug.keystore.properties
│   │   └── settings.gradle
│   ├── ios/
│   │   └── WatermelonDB/
│   │       ├── DatabasePlatformIOS.mm
│   │       ├── FMDB/
│   │       │   ├── LICENSE.txt
│   │       │   ├── README.markdown
│   │       │   └── src/
│   │       │       └── fmdb/
│   │       │           ├── FMDB.h
│   │       │           ├── FMDatabase.h
│   │       │           ├── FMDatabase.m
│   │       │           ├── FMDatabaseAdditions.h
│   │       │           ├── FMDatabaseAdditions.m
│   │       │           ├── FMDatabasePool.h
│   │       │           ├── FMDatabasePool.m
│   │       │           ├── FMDatabaseQueue.h
│   │       │           ├── FMDatabaseQueue.m
│   │       │           ├── FMResultSet.h
│   │       │           └── FMResultSet.m
│   │       ├── JSIInstaller.h
│   │       ├── JSIInstaller.mm
│   │       ├── WatermelonDB.h
│   │       └── objc/
│   │           ├── WMDatabase.h
│   │           ├── WMDatabase.m
│   │           ├── WMDatabaseBridge.h
│   │           ├── WMDatabaseBridge.m
│   │           ├── WMDatabaseDriver.h
│   │           └── WMDatabaseDriver.m
│   ├── iosTest/
│   │   ├── .xcode.env
│   │   ├── Podfile
│   │   ├── Pods/
│   │   │   ├── DoubleConversion/
│   │   │   │   ├── LICENSE
│   │   │   │   ├── README
│   │   │   │   └── double-conversion/
│   │   │   │       ├── bignum-dtoa.cc
│   │   │   │       ├── bignum-dtoa.h
│   │   │   │       ├── bignum.cc
│   │   │   │       ├── bignum.h
│   │   │   │       ├── cached-powers.cc
│   │   │   │       ├── cached-powers.h
│   │   │   │       ├── diy-fp.cc
│   │   │   │       ├── diy-fp.h
│   │   │   │       ├── double-conversion.cc
│   │   │   │       ├── double-conversion.h
│   │   │   │       ├── fast-dtoa.cc
│   │   │   │       ├── fast-dtoa.h
│   │   │   │       ├── fixed-dtoa.cc
│   │   │   │       ├── fixed-dtoa.h
│   │   │   │       ├── ieee.h
│   │   │   │       ├── strtod.cc
│   │   │   │       ├── strtod.h
│   │   │   │       └── utils.h
│   │   │   ├── Local Podspecs/
│   │   │   │   ├── DoubleConversion.podspec.json
│   │   │   │   ├── FBLazyVector.podspec.json
│   │   │   │   ├── RCT-Folly.podspec.json
│   │   │   │   ├── RCTDeprecation.podspec.json
│   │   │   │   ├── RCTRequired.podspec.json
│   │   │   │   ├── RCTTypeSafety.podspec.json
│   │   │   │   ├── React-Codegen.podspec.json
│   │   │   │   ├── React-Core.podspec.json
│   │   │   │   ├── React-CoreModules.podspec.json
│   │   │   │   ├── React-Fabric.podspec.json
│   │   │   │   ├── React-FabricImage.podspec.json
│   │   │   │   ├── React-ImageManager.podspec.json
│   │   │   │   ├── React-Mapbuffer.podspec.json
│   │   │   │   ├── React-NativeModulesApple.podspec.json
│   │   │   │   ├── React-RCTActionSheet.podspec.json
│   │   │   │   ├── React-RCTAnimation.podspec.json
│   │   │   │   ├── React-RCTAppDelegate.podspec.json
│   │   │   │   ├── React-RCTBlob.podspec.json
│   │   │   │   ├── React-RCTFabric.podspec.json
│   │   │   │   ├── React-RCTImage.podspec.json
│   │   │   │   ├── React-RCTLinking.podspec.json
│   │   │   │   ├── React-RCTNetwork.podspec.json
│   │   │   │   ├── React-RCTSettings.podspec.json
│   │   │   │   ├── React-RCTText.podspec.json
│   │   │   │   ├── React-RCTVibration.podspec.json
│   │   │   │   ├── React-RuntimeApple.podspec.json
│   │   │   │   ├── React-RuntimeCore.podspec.json
│   │   │   │   ├── React-RuntimeHermes.podspec.json
│   │   │   │   ├── React-callinvoker.podspec.json
│   │   │   │   ├── React-cxxreact.podspec.json
│   │   │   │   ├── React-debug.podspec.json
│   │   │   │   ├── React-featureflags.podspec.json
│   │   │   │   ├── React-graphics.podspec.json
│   │   │   │   ├── React-hermes.podspec.json
│   │   │   │   ├── React-jserrorhandler.podspec.json
│   │   │   │   ├── React-jsi.podspec.json
│   │   │   │   ├── React-jsiexecutor.podspec.json
│   │   │   │   ├── React-jsinspector.podspec.json
│   │   │   │   ├── React-jsitracing.podspec.json
│   │   │   │   ├── React-logger.podspec.json
│   │   │   │   ├── React-nativeconfig.podspec.json
│   │   │   │   ├── React-perflogger.podspec.json
│   │   │   │   ├── React-rendererdebug.podspec.json
│   │   │   │   ├── React-rncore.podspec.json
│   │   │   │   ├── React-runtimeexecutor.podspec.json
│   │   │   │   ├── React-runtimescheduler.podspec.json
│   │   │   │   ├── React-utils.podspec.json
│   │   │   │   ├── React.podspec.json
│   │   │   │   ├── ReactCommon.podspec.json
│   │   │   │   ├── WatermelonDB.podspec.json
│   │   │   │   ├── Yoga.podspec.json
│   │   │   │   ├── boost.podspec.json
│   │   │   │   ├── fmt.podspec.json
│   │   │   │   ├── glog.podspec.json
│   │   │   │   ├── hermes-engine.podspec.json
│   │   │   │   └── simdjson.podspec.json
│   │   │   ├── Pods.xcodeproj/
│   │   │   │   └── project.pbxproj
│   │   │   ├── SocketRocket/
│   │   │   │   ├── LICENSE
│   │   │   │   ├── LICENSE-examples
│   │   │   │   ├── README.md
│   │   │   │   └── SocketRocket/
│   │   │   │       ├── Internal/
│   │   │   │       │   ├── Delegate/
│   │   │   │       │   │   ├── SRDelegateController.h
│   │   │   │       │   │   └── SRDelegateController.m
│   │   │   │       │   ├── IOConsumer/
│   │   │   │       │   │   ├── SRIOConsumer.h
│   │   │   │       │   │   ├── SRIOConsumer.m
│   │   │   │       │   │   ├── SRIOConsumerPool.h
│   │   │   │       │   │   └── SRIOConsumerPool.m
│   │   │   │       │   ├── NSRunLoop+SRWebSocketPrivate.h
│   │   │   │       │   ├── NSURLRequest+SRWebSocketPrivate.h
│   │   │   │       │   ├── Proxy/
│   │   │   │       │   │   ├── SRProxyConnect.h
│   │   │   │       │   │   └── SRProxyConnect.m
│   │   │   │       │   ├── RunLoop/
│   │   │   │       │   │   ├── SRRunLoopThread.h
│   │   │   │       │   │   └── SRRunLoopThread.m
│   │   │   │       │   ├── SRConstants.h
│   │   │   │       │   ├── SRConstants.m
│   │   │   │       │   ├── Security/
│   │   │   │       │   │   ├── SRPinningSecurityPolicy.h
│   │   │   │       │   │   └── SRPinningSecurityPolicy.m
│   │   │   │       │   └── Utilities/
│   │   │   │       │       ├── SRError.h
│   │   │   │       │       ├── SRError.m
│   │   │   │       │       ├── SRHTTPConnectMessage.h
│   │   │   │       │       ├── SRHTTPConnectMessage.m
│   │   │   │       │       ├── SRHash.h
│   │   │   │       │       ├── SRHash.m
│   │   │   │       │       ├── SRLog.h
│   │   │   │       │       ├── SRLog.m
│   │   │   │       │       ├── SRMutex.h
│   │   │   │       │       ├── SRMutex.m
│   │   │   │       │       ├── SRRandom.h
│   │   │   │       │       ├── SRRandom.m
│   │   │   │       │       ├── SRSIMDHelpers.h
│   │   │   │       │       ├── SRSIMDHelpers.m
│   │   │   │       │       ├── SRURLUtilities.h
│   │   │   │       │       └── SRURLUtilities.m
│   │   │   │       ├── NSRunLoop+SRWebSocket.h
│   │   │   │       ├── NSRunLoop+SRWebSocket.m
│   │   │   │       ├── NSURLRequest+SRWebSocket.h
│   │   │   │       ├── NSURLRequest+SRWebSocket.m
│   │   │   │       ├── SRSecurityPolicy.h
│   │   │   │       ├── SRSecurityPolicy.m
│   │   │   │       ├── SRWebSocket.h
│   │   │   │       ├── SRWebSocket.m
│   │   │   │       └── SocketRocket.h
│   │   │   ├── Target Support Files/
│   │   │   │   ├── DoubleConversion/
│   │   │   │   │   ├── DoubleConversion-dummy.m
│   │   │   │   │   ├── DoubleConversion-prefix.pch
│   │   │   │   │   ├── DoubleConversion-umbrella.h
│   │   │   │   │   ├── DoubleConversion.debug.xcconfig
│   │   │   │   │   ├── DoubleConversion.modulemap
│   │   │   │   │   └── DoubleConversion.release.xcconfig
│   │   │   │   ├── FBLazyVector/
│   │   │   │   │   ├── FBLazyVector.debug.xcconfig
│   │   │   │   │   └── FBLazyVector.release.xcconfig
│   │   │   │   ├── Pods-WatermelonTester/
│   │   │   │   │   ├── Pods-WatermelonTester-acknowledgements.markdown
│   │   │   │   │   ├── Pods-WatermelonTester-acknowledgements.plist
│   │   │   │   │   ├── Pods-WatermelonTester-dummy.m
│   │   │   │   │   ├── Pods-WatermelonTester-frameworks-Debug-input-files.xcfilelist
│   │   │   │   │   ├── Pods-WatermelonTester-frameworks-Debug-output-files.xcfilelist
│   │   │   │   │   ├── Pods-WatermelonTester-frameworks-Release-input-files.xcfilelist
│   │   │   │   │   ├── Pods-WatermelonTester-frameworks-Release-output-files.xcfilelist
│   │   │   │   │   ├── Pods-WatermelonTester-frameworks.sh
│   │   │   │   │   ├── Pods-WatermelonTester-resources-Debug-input-files.xcfilelist
│   │   │   │   │   ├── Pods-WatermelonTester-resources-Debug-output-files.xcfilelist
│   │   │   │   │   ├── Pods-WatermelonTester-resources-Release-input-files.xcfilelist
│   │   │   │   │   ├── Pods-WatermelonTester-resources-Release-output-files.xcfilelist
│   │   │   │   │   ├── Pods-WatermelonTester-resources.sh
│   │   │   │   │   ├── Pods-WatermelonTester.debug.xcconfig
│   │   │   │   │   └── Pods-WatermelonTester.release.xcconfig
│   │   │   │   ├── Pods-WatermelonTester-WatermelonTesterTests/
│   │   │   │   │   ├── Pods-WatermelonTester-WatermelonTesterTests-acknowledgements.markdown
│   │   │   │   │   ├── Pods-WatermelonTester-WatermelonTesterTests-acknowledgements.plist
│   │   │   │   │   ├── Pods-WatermelonTester-WatermelonTesterTests-dummy.m
│   │   │   │   │   ├── Pods-WatermelonTester-WatermelonTesterTests-frameworks-Debug-input-files.xcfilelist
│   │   │   │   │   ├── Pods-WatermelonTester-WatermelonTesterTests-frameworks-Debug-output-files.xcfilelist
│   │   │   │   │   ├── Pods-WatermelonTester-WatermelonTesterTests-frameworks-Release-input-files.xcfilelist
│   │   │   │   │   ├── Pods-WatermelonTester-WatermelonTesterTests-frameworks-Release-output-files.xcfilelist
│   │   │   │   │   ├── Pods-WatermelonTester-WatermelonTesterTests-frameworks.sh
│   │   │   │   │   ├── Pods-WatermelonTester-WatermelonTesterTests-resources-Debug-input-files.xcfilelist
│   │   │   │   │   ├── Pods-WatermelonTester-WatermelonTesterTests-resources-Debug-output-files.xcfilelist
│   │   │   │   │   ├── Pods-WatermelonTester-WatermelonTesterTests-resources-Release-input-files.xcfilelist
│   │   │   │   │   ├── Pods-WatermelonTester-WatermelonTesterTests-resources-Release-output-files.xcfilelist
│   │   │   │   │   ├── Pods-WatermelonTester-WatermelonTesterTests-resources.sh
│   │   │   │   │   ├── Pods-WatermelonTester-WatermelonTesterTests.debug.xcconfig
│   │   │   │   │   └── Pods-WatermelonTester-WatermelonTesterTests.release.xcconfig
│   │   │   │   ├── RCT-Folly/
│   │   │   │   │   ├── RCT-Folly-dummy.m
│   │   │   │   │   ├── RCT-Folly-prefix.pch
│   │   │   │   │   ├── RCT-Folly-umbrella.h
│   │   │   │   │   ├── RCT-Folly.debug.xcconfig
│   │   │   │   │   ├── RCT-Folly.modulemap
│   │   │   │   │   └── RCT-Folly.release.xcconfig
│   │   │   │   ├── RCTDeprecation/
│   │   │   │   │   ├── RCTDeprecation-dummy.m
│   │   │   │   │   ├── RCTDeprecation-prefix.pch
│   │   │   │   │   ├── RCTDeprecation-umbrella.h
│   │   │   │   │   ├── RCTDeprecation.debug.xcconfig
│   │   │   │   │   ├── RCTDeprecation.modulemap
│   │   │   │   │   └── RCTDeprecation.release.xcconfig
│   │   │   │   ├── RCTRequired/
│   │   │   │   │   ├── RCTRequired.debug.xcconfig
│   │   │   │   │   └── RCTRequired.release.xcconfig
│   │   │   │   ├── RCTTypeSafety/
│   │   │   │   │   ├── RCTTypeSafety-dummy.m
│   │   │   │   │   ├── RCTTypeSafety-prefix.pch
│   │   │   │   │   ├── RCTTypeSafety-umbrella.h
│   │   │   │   │   ├── RCTTypeSafety.debug.xcconfig
│   │   │   │   │   ├── RCTTypeSafety.modulemap
│   │   │   │   │   └── RCTTypeSafety.release.xcconfig
│   │   │   │   ├── React/
│   │   │   │   │   ├── React.debug.xcconfig
│   │   │   │   │   └── React.release.xcconfig
│   │   │   │   ├── React-Codegen/
│   │   │   │   │   ├── React-Codegen-dummy.m
│   │   │   │   │   ├── React-Codegen-prefix.pch
│   │   │   │   │   ├── React-Codegen-umbrella.h
│   │   │   │   │   ├── React-Codegen.debug.xcconfig
│   │   │   │   │   ├── React-Codegen.modulemap
│   │   │   │   │   └── React-Codegen.release.xcconfig
│   │   │   │   ├── React-Core/
│   │   │   │   │   ├── React-Core-dummy.m
│   │   │   │   │   ├── React-Core-prefix.pch
│   │   │   │   │   ├── React-Core-umbrella.h
│   │   │   │   │   ├── React-Core.debug.xcconfig
│   │   │   │   │   ├── React-Core.modulemap
│   │   │   │   │   ├── React-Core.release.xcconfig
│   │   │   │   │   └── ResourceBundle-RCTI18nStrings-React-Core-Info.plist
│   │   │   │   ├── React-CoreModules/
│   │   │   │   │   ├── React-CoreModules-dummy.m
│   │   │   │   │   ├── React-CoreModules-prefix.pch
│   │   │   │   │   ├── React-CoreModules.debug.xcconfig
│   │   │   │   │   └── React-CoreModules.release.xcconfig
│   │   │   │   ├── React-Fabric/
│   │   │   │   │   ├── React-Fabric-dummy.m
│   │   │   │   │   ├── React-Fabric-prefix.pch
│   │   │   │   │   ├── React-Fabric-umbrella.h
│   │   │   │   │   ├── React-Fabric.debug.xcconfig
│   │   │   │   │   ├── React-Fabric.modulemap
│   │   │   │   │   └── React-Fabric.release.xcconfig
│   │   │   │   ├── React-FabricImage/
│   │   │   │   │   ├── React-FabricImage-dummy.m
│   │   │   │   │   ├── React-FabricImage-prefix.pch
│   │   │   │   │   ├── React-FabricImage.debug.xcconfig
│   │   │   │   │   └── React-FabricImage.release.xcconfig
│   │   │   │   ├── React-ImageManager/
│   │   │   │   │   ├── React-ImageManager-dummy.m
│   │   │   │   │   ├── React-ImageManager-prefix.pch
│   │   │   │   │   ├── React-ImageManager-umbrella.h
│   │   │   │   │   ├── React-ImageManager.debug.xcconfig
│   │   │   │   │   ├── React-ImageManager.modulemap
│   │   │   │   │   └── React-ImageManager.release.xcconfig
│   │   │   │   ├── React-Mapbuffer/
│   │   │   │   │   ├── React-Mapbuffer-dummy.m
│   │   │   │   │   ├── React-Mapbuffer-prefix.pch
│   │   │   │   │   ├── React-Mapbuffer.debug.xcconfig
│   │   │   │   │   └── React-Mapbuffer.release.xcconfig
│   │   │   │   ├── React-NativeModulesApple/
│   │   │   │   │   ├── React-NativeModulesApple-dummy.m
│   │   │   │   │   ├── React-NativeModulesApple-prefix.pch
│   │   │   │   │   ├── React-NativeModulesApple-umbrella.h
│   │   │   │   │   ├── React-NativeModulesApple.debug.xcconfig
│   │   │   │   │   ├── React-NativeModulesApple.modulemap
│   │   │   │   │   └── React-NativeModulesApple.release.xcconfig
│   │   │   │   ├── React-RCTActionSheet/
│   │   │   │   │   ├── React-RCTActionSheet.debug.xcconfig
│   │   │   │   │   └── React-RCTActionSheet.release.xcconfig
│   │   │   │   ├── React-RCTAnimation/
│   │   │   │   │   ├── React-RCTAnimation-dummy.m
│   │   │   │   │   ├── React-RCTAnimation-prefix.pch
│   │   │   │   │   ├── React-RCTAnimation.debug.xcconfig
│   │   │   │   │   └── React-RCTAnimation.release.xcconfig
│   │   │   │   ├── React-RCTAppDelegate/
│   │   │   │   │   ├── React-RCTAppDelegate-dummy.m
│   │   │   │   │   ├── React-RCTAppDelegate-prefix.pch
│   │   │   │   │   ├── React-RCTAppDelegate-umbrella.h
│   │   │   │   │   ├── React-RCTAppDelegate.debug.xcconfig
│   │   │   │   │   ├── React-RCTAppDelegate.modulemap
│   │   │   │   │   └── React-RCTAppDelegate.release.xcconfig
│   │   │   │   ├── React-RCTBlob/
│   │   │   │   │   ├── React-RCTBlob-dummy.m
│   │   │   │   │   ├── React-RCTBlob-prefix.pch
│   │   │   │   │   ├── React-RCTBlob.debug.xcconfig
│   │   │   │   │   └── React-RCTBlob.release.xcconfig
│   │   │   │   ├── React-RCTFabric/
│   │   │   │   │   ├── React-RCTFabric-dummy.m
│   │   │   │   │   ├── React-RCTFabric-prefix.pch
│   │   │   │   │   ├── React-RCTFabric-umbrella.h
│   │   │   │   │   ├── React-RCTFabric.debug.xcconfig
│   │   │   │   │   ├── React-RCTFabric.modulemap
│   │   │   │   │   └── React-RCTFabric.release.xcconfig
│   │   │   │   ├── React-RCTImage/
│   │   │   │   │   ├── React-RCTImage-dummy.m
│   │   │   │   │   ├── React-RCTImage-prefix.pch
│   │   │   │   │   ├── React-RCTImage.debug.xcconfig
│   │   │   │   │   └── React-RCTImage.release.xcconfig
│   │   │   │   ├── React-RCTLinking/
│   │   │   │   │   ├── React-RCTLinking-dummy.m
│   │   │   │   │   ├── React-RCTLinking-prefix.pch
│   │   │   │   │   ├── React-RCTLinking.debug.xcconfig
│   │   │   │   │   └── React-RCTLinking.release.xcconfig
│   │   │   │   ├── React-RCTNetwork/
│   │   │   │   │   ├── React-RCTNetwork-dummy.m
│   │   │   │   │   ├── React-RCTNetwork-prefix.pch
│   │   │   │   │   ├── React-RCTNetwork.debug.xcconfig
│   │   │   │   │   └── React-RCTNetwork.release.xcconfig
│   │   │   │   ├── React-RCTSettings/
│   │   │   │   │   ├── React-RCTSettings-dummy.m
│   │   │   │   │   ├── React-RCTSettings-prefix.pch
│   │   │   │   │   ├── React-RCTSettings.debug.xcconfig
│   │   │   │   │   └── React-RCTSettings.release.xcconfig
│   │   │   │   ├── React-RCTText/
│   │   │   │   │   ├── React-RCTText-dummy.m
│   │   │   │   │   ├── React-RCTText-prefix.pch
│   │   │   │   │   ├── React-RCTText.debug.xcconfig
│   │   │   │   │   └── React-RCTText.release.xcconfig
│   │   │   │   ├── React-RCTVibration/
│   │   │   │   │   ├── React-RCTVibration-dummy.m
│   │   │   │   │   ├── React-RCTVibration-prefix.pch
│   │   │   │   │   ├── React-RCTVibration.debug.xcconfig
│   │   │   │   │   └── React-RCTVibration.release.xcconfig
│   │   │   │   ├── React-RuntimeApple/
│   │   │   │   │   ├── React-RuntimeApple-dummy.m
│   │   │   │   │   ├── React-RuntimeApple-prefix.pch
│   │   │   │   │   ├── React-RuntimeApple.debug.xcconfig
│   │   │   │   │   └── React-RuntimeApple.release.xcconfig
│   │   │   │   ├── React-RuntimeCore/
│   │   │   │   │   ├── React-RuntimeCore-dummy.m
│   │   │   │   │   ├── React-RuntimeCore-prefix.pch
│   │   │   │   │   ├── React-RuntimeCore.debug.xcconfig
│   │   │   │   │   └── React-RuntimeCore.release.xcconfig
│   │   │   │   ├── React-RuntimeHermes/
│   │   │   │   │   ├── React-RuntimeHermes-dummy.m
│   │   │   │   │   ├── React-RuntimeHermes-prefix.pch
│   │   │   │   │   ├── React-RuntimeHermes.debug.xcconfig
│   │   │   │   │   └── React-RuntimeHermes.release.xcconfig
│   │   │   │   ├── React-callinvoker/
│   │   │   │   │   ├── React-callinvoker.debug.xcconfig
│   │   │   │   │   └── React-callinvoker.release.xcconfig
│   │   │   │   ├── React-cxxreact/
│   │   │   │   │   ├── React-cxxreact-dummy.m
│   │   │   │   │   ├── React-cxxreact-prefix.pch
│   │   │   │   │   ├── React-cxxreact.debug.xcconfig
│   │   │   │   │   └── React-cxxreact.release.xcconfig
│   │   │   │   ├── React-debug/
│   │   │   │   │   ├── React-debug-dummy.m
│   │   │   │   │   ├── React-debug-prefix.pch
│   │   │   │   │   ├── React-debug-umbrella.h
│   │   │   │   │   ├── React-debug.debug.xcconfig
│   │   │   │   │   ├── React-debug.modulemap
│   │   │   │   │   └── React-debug.release.xcconfig
│   │   │   │   ├── React-featureflags/
│   │   │   │   │   ├── React-featureflags-dummy.m
│   │   │   │   │   ├── React-featureflags-prefix.pch
│   │   │   │   │   ├── React-featureflags-umbrella.h
│   │   │   │   │   ├── React-featureflags.debug.xcconfig
│   │   │   │   │   ├── React-featureflags.modulemap
│   │   │   │   │   └── React-featureflags.release.xcconfig
│   │   │   │   ├── React-graphics/
│   │   │   │   │   ├── React-graphics-dummy.m
│   │   │   │   │   ├── React-graphics-prefix.pch
│   │   │   │   │   ├── React-graphics-umbrella.h
│   │   │   │   │   ├── React-graphics.debug.xcconfig
│   │   │   │   │   ├── React-graphics.modulemap
│   │   │   │   │   └── React-graphics.release.xcconfig
│   │   │   │   ├── React-hermes/
│   │   │   │   │   ├── React-hermes-dummy.m
│   │   │   │   │   ├── React-hermes-prefix.pch
│   │   │   │   │   ├── React-hermes.debug.xcconfig
│   │   │   │   │   └── React-hermes.release.xcconfig
│   │   │   │   ├── React-jserrorhandler/
│   │   │   │   │   ├── React-jserrorhandler-dummy.m
│   │   │   │   │   ├── React-jserrorhandler-prefix.pch
│   │   │   │   │   ├── React-jserrorhandler.debug.xcconfig
│   │   │   │   │   └── React-jserrorhandler.release.xcconfig
│   │   │   │   ├── React-jsi/
│   │   │   │   │   ├── React-jsi-dummy.m
│   │   │   │   │   ├── React-jsi-prefix.pch
│   │   │   │   │   ├── React-jsi-umbrella.h
│   │   │   │   │   ├── React-jsi.debug.xcconfig
│   │   │   │   │   ├── React-jsi.modulemap
│   │   │   │   │   └── React-jsi.release.xcconfig
│   │   │   │   ├── React-jsiexecutor/
│   │   │   │   │   ├── React-jsiexecutor-dummy.m
│   │   │   │   │   ├── React-jsiexecutor-prefix.pch
│   │   │   │   │   ├── React-jsiexecutor.debug.xcconfig
│   │   │   │   │   └── React-jsiexecutor.release.xcconfig
│   │   │   │   ├── React-jsinspector/
│   │   │   │   │   ├── React-jsinspector-dummy.m
│   │   │   │   │   ├── React-jsinspector-prefix.pch
│   │   │   │   │   ├── React-jsinspector-umbrella.h
│   │   │   │   │   ├── React-jsinspector.debug.xcconfig
│   │   │   │   │   ├── React-jsinspector.modulemap
│   │   │   │   │   └── React-jsinspector.release.xcconfig
│   │   │   │   ├── React-jsitracing/
│   │   │   │   │   ├── React-jsitracing.debug.xcconfig
│   │   │   │   │   └── React-jsitracing.release.xcconfig
│   │   │   │   ├── React-logger/
│   │   │   │   │   ├── React-logger-dummy.m
│   │   │   │   │   ├── React-logger-prefix.pch
│   │   │   │   │   ├── React-logger.debug.xcconfig
│   │   │   │   │   └── React-logger.release.xcconfig
│   │   │   │   ├── React-nativeconfig/
│   │   │   │   │   ├── React-nativeconfig-dummy.m
│   │   │   │   │   ├── React-nativeconfig-prefix.pch
│   │   │   │   │   ├── React-nativeconfig.debug.xcconfig
│   │   │   │   │   └── React-nativeconfig.release.xcconfig
│   │   │   │   ├── React-perflogger/
│   │   │   │   │   ├── React-perflogger-dummy.m
│   │   │   │   │   ├── React-perflogger-prefix.pch
│   │   │   │   │   ├── React-perflogger.debug.xcconfig
│   │   │   │   │   └── React-perflogger.release.xcconfig
│   │   │   │   ├── React-rendererdebug/
│   │   │   │   │   ├── React-rendererdebug-dummy.m
│   │   │   │   │   ├── React-rendererdebug-prefix.pch
│   │   │   │   │   ├── React-rendererdebug-umbrella.h
│   │   │   │   │   ├── React-rendererdebug.debug.xcconfig
│   │   │   │   │   ├── React-rendererdebug.modulemap
│   │   │   │   │   └── React-rendererdebug.release.xcconfig
│   │   │   │   ├── React-rncore/
│   │   │   │   │   ├── React-rncore.debug.xcconfig
│   │   │   │   │   └── React-rncore.release.xcconfig
│   │   │   │   ├── React-runtimeexecutor/
│   │   │   │   │   ├── React-runtimeexecutor.debug.xcconfig
│   │   │   │   │   └── React-runtimeexecutor.release.xcconfig
│   │   │   │   ├── React-runtimescheduler/
│   │   │   │   │   ├── React-runtimescheduler-dummy.m
│   │   │   │   │   ├── React-runtimescheduler-prefix.pch
│   │   │   │   │   ├── React-runtimescheduler.debug.xcconfig
│   │   │   │   │   └── React-runtimescheduler.release.xcconfig
│   │   │   │   ├── React-utils/
│   │   │   │   │   ├── React-utils-dummy.m
│   │   │   │   │   ├── React-utils-prefix.pch
│   │   │   │   │   ├── React-utils-umbrella.h
│   │   │   │   │   ├── React-utils.debug.xcconfig
│   │   │   │   │   ├── React-utils.modulemap
│   │   │   │   │   └── React-utils.release.xcconfig
│   │   │   │   ├── ReactCommon/
│   │   │   │   │   ├── ReactCommon-dummy.m
│   │   │   │   │   ├── ReactCommon-prefix.pch
│   │   │   │   │   ├── ReactCommon-umbrella.h
│   │   │   │   │   ├── ReactCommon.debug.xcconfig
│   │   │   │   │   ├── ReactCommon.modulemap
│   │   │   │   │   └── ReactCommon.release.xcconfig
│   │   │   │   ├── SocketRocket/
│   │   │   │   │   ├── SocketRocket-dummy.m
│   │   │   │   │   ├── SocketRocket-prefix.pch
│   │   │   │   │   ├── SocketRocket.debug.xcconfig
│   │   │   │   │   └── SocketRocket.release.xcconfig
│   │   │   │   ├── WatermelonDB/
│   │   │   │   │   ├── WatermelonDB-dummy.m
│   │   │   │   │   ├── WatermelonDB-prefix.pch
│   │   │   │   │   ├── WatermelonDB.debug.xcconfig
│   │   │   │   │   └── WatermelonDB.release.xcconfig
│   │   │   │   ├── Yoga/
│   │   │   │   │   ├── Yoga-dummy.m
│   │   │   │   │   ├── Yoga-prefix.pch
│   │   │   │   │   ├── Yoga-umbrella.h
│   │   │   │   │   ├── Yoga.debug.xcconfig
│   │   │   │   │   ├── Yoga.modulemap
│   │   │   │   │   └── Yoga.release.xcconfig
│   │   │   │   ├── boost/
│   │   │   │   │   ├── boost.debug.xcconfig
│   │   │   │   │   └── boost.release.xcconfig
│   │   │   │   ├── fmt/
│   │   │   │   │   ├── fmt-dummy.m
│   │   │   │   │   ├── fmt-prefix.pch
│   │   │   │   │   ├── fmt.debug.xcconfig
│   │   │   │   │   └── fmt.release.xcconfig
│   │   │   │   ├── glog/
│   │   │   │   │   ├── glog-dummy.m
│   │   │   │   │   ├── glog-prefix.pch
│   │   │   │   │   ├── glog-umbrella.h
│   │   │   │   │   ├── glog.debug.xcconfig
│   │   │   │   │   ├── glog.modulemap
│   │   │   │   │   └── glog.release.xcconfig
│   │   │   │   ├── hermes-engine/
│   │   │   │   │   ├── hermes-engine-xcframeworks-input-files.xcfilelist
│   │   │   │   │   ├── hermes-engine-xcframeworks-output-files.xcfilelist
│   │   │   │   │   ├── hermes-engine-xcframeworks.sh
│   │   │   │   │   ├── hermes-engine.debug.xcconfig
│   │   │   │   │   └── hermes-engine.release.xcconfig
│   │   │   │   └── simdjson/
│   │   │   │       ├── simdjson-dummy.m
│   │   │   │       ├── simdjson-prefix.pch
│   │   │   │       ├── simdjson-umbrella.h
│   │   │   │       ├── simdjson.debug.xcconfig
│   │   │   │       ├── simdjson.modulemap
│   │   │   │       └── simdjson.release.xcconfig
│   │   │   ├── fmt/
│   │   │   │   ├── LICENSE.rst
│   │   │   │   ├── README.rst
│   │   │   │   ├── include/
│   │   │   │   │   └── fmt/
│   │   │   │   │       ├── args.h
│   │   │   │   │       ├── chrono.h
│   │   │   │   │       ├── color.h
│   │   │   │   │       ├── compile.h
│   │   │   │   │       ├── core.h
│   │   │   │   │       ├── format-inl.h
│   │   │   │   │       ├── format.h
│   │   │   │   │       ├── os.h
│   │   │   │   │       ├── ostream.h
│   │   │   │   │       ├── printf.h
│   │   │   │   │       ├── ranges.h
│   │   │   │   │       ├── std.h
│   │   │   │   │       └── xchar.h
│   │   │   │   └── src/
│   │   │   │       └── format.cc
│   │   │   └── glog/
│   │   │       ├── COPYING
│   │   │       ├── README
│   │   │       ├── README.windows
│   │   │       └── src/
│   │   │           ├── base/
│   │   │           │   ├── commandlineflags.h
│   │   │           │   ├── googleinit.h
│   │   │           │   └── mutex.h
│   │   │           ├── config.h
│   │   │           ├── config.h.cmake.in
│   │   │           ├── config.h.in
│   │   │           ├── config_for_unittests.h
│   │   │           ├── demangle.cc
│   │   │           ├── demangle.h
│   │   │           ├── glog/
│   │   │           │   ├── log_severity.h
│   │   │           │   ├── logging.h
│   │   │           │   ├── logging.h.in
│   │   │           │   ├── raw_logging.h
│   │   │           │   ├── raw_logging.h.in
│   │   │           │   ├── stl_logging.h
│   │   │           │   ├── stl_logging.h.in
│   │   │           │   ├── vlog_is_on.h
│   │   │           │   └── vlog_is_on.h.in
│   │   │           ├── googletest.h
│   │   │           ├── logging.cc
│   │   │           ├── mock-log.h
│   │   │           ├── raw_logging.cc
│   │   │           ├── signalhandler.cc
│   │   │           ├── stacktrace.h
│   │   │           ├── stacktrace_generic-inl.h
│   │   │           ├── stacktrace_libunwind-inl.h
│   │   │           ├── stacktrace_powerpc-inl.h
│   │   │           ├── stacktrace_x86-inl.h
│   │   │           ├── stacktrace_x86_64-inl.h
│   │   │           ├── symbolize.cc
│   │   │           ├── symbolize.h
│   │   │           ├── utilities.cc
│   │   │           ├── utilities.h
│   │   │           └── vlog_is_on.cc
│   │   ├── PrivacyInfo.xcprivacy
│   │   ├── WatermelonTester/
│   │   │   ├── AppDelegate.swift
│   │   │   ├── Base.lproj/
│   │   │   │   └── LaunchScreen.xib
│   │   │   ├── BridgeTestReporter.m
│   │   │   ├── BridgeTestReporter.swift
│   │   │   ├── Images.xcassets/
│   │   │   │   ├── AppIcon.appiconset/
│   │   │   │   │   └── Contents.json
│   │   │   │   └── Contents.json
│   │   │   ├── Info.plist
│   │   │   └── WatermelonTester-Bridging-Header.h
│   │   ├── WatermelonTester.xcodeproj/
│   │   │   ├── project.pbxproj
│   │   │   └── xcshareddata/
│   │   │       └── xcschemes/
│   │   │           └── WatermelonTester.xcscheme
│   │   ├── WatermelonTester.xcworkspace/
│   │   │   ├── contents.xcworkspacedata
│   │   │   └── xcshareddata/
│   │   │       └── IDEWorkspaceChecks.plist
│   │   └── WatermelonTesterTests/
│   │       ├── BridgeTests.swift
│   │       ├── Info.plist
│   │       ├── Tests.swift
│   │       └── WatermelonTesterTests-Bridging-Header.h
│   ├── metro-transformer.js
│   ├── shared/
│   │   ├── Database-batch.cpp
│   │   ├── Database-jsi.cpp
│   │   ├── Database-query.cpp
│   │   ├── Database-sqlite.cpp
│   │   ├── Database-turboSync.cpp
│   │   ├── Database.cpp
│   │   ├── Database.h
│   │   ├── DatabaseBridge.cpp
│   │   ├── DatabasePlatform.h
│   │   ├── JSIHelpers.h
│   │   ├── Sqlite.cpp
│   │   └── Sqlite.h
│   ├── windows/
│   │   ├── .gitignore
│   │   ├── ExperimentalFeatures.props
│   │   ├── NuGet.Config
│   │   ├── WatermelonDB/
│   │   │   ├── DatabasePlatformWindows.cpp
│   │   │   ├── PropertySheet.props
│   │   │   ├── ReactPackageProvider.cpp
│   │   │   ├── ReactPackageProvider.h
│   │   │   ├── ReactPackageProvider.idl
│   │   │   ├── WMDatabaseBridge.cpp
│   │   │   ├── WMDatabaseBridge.h
│   │   │   ├── WatermelonDB.def
│   │   │   ├── WatermelonDB.vcxproj
│   │   │   ├── WatermelonDB.vcxproj.filters
│   │   │   ├── pch.cpp
│   │   │   └── pch.h
│   │   └── WatermelonDB.sln
│   ├── windowsE2E/
│   │   ├── .gitignore
│   │   ├── README.md
│   │   ├── babel.config.js
│   │   ├── custom-transformer.js
│   │   ├── jest.config.js
│   │   ├── package.json
│   │   ├── test/
│   │   │   └── watermelon.test.ts
│   │   └── tsconfig.json
│   └── windowsTest/
│       ├── .gitignore
│       ├── ExperimentalFeatures.props
│       ├── NuGet.Config
│       ├── WatermelonTester/
│       │   ├── .gitignore
│       │   ├── App.cpp
│       │   ├── App.h
│       │   ├── App.idl
│       │   ├── App.xaml
│       │   ├── AutolinkedNativeModules.g.cpp
│       │   ├── AutolinkedNativeModules.g.h
│       │   ├── AutolinkedNativeModules.g.props
│       │   ├── AutolinkedNativeModules.g.targets
│       │   ├── MainPage.cpp
│       │   ├── MainPage.h
│       │   ├── MainPage.idl
│       │   ├── MainPage.xaml
│       │   ├── Package.appxmanifest
│       │   ├── PropertySheet.props
│       │   ├── ReactPackageProvider.cpp
│       │   ├── ReactPackageProvider.h
│       │   ├── WatermelonTester.filters
│       │   ├── WatermelonTester.vcxproj
│       │   ├── pch.cpp
│       │   └── pch.h
│       └── WatermelonTester.sln
├── package.json
├── prettier.config.js
├── react-native.config.js
├── scripts/
│   ├── any-android-device
│   ├── ccache-clang
│   ├── emulator.mjs
│   ├── emulatorWithJavaCheck
│   ├── make.mjs
│   ├── pkg.cjs
│   ├── release.mjs
│   ├── replace-docs-path.mjs
│   ├── retryEmuAndTest
│   ├── test-ios
│   └── update-docusaurus
├── src/
│   ├── Collection/
│   │   ├── RecordCache.d.ts
│   │   ├── RecordCache.js
│   │   ├── index.d.ts
│   │   ├── index.js
│   │   └── test.js
│   ├── Database/
│   │   ├── CollectionMap/
│   │   │   ├── index.d.ts
│   │   │   ├── index.js
│   │   │   └── test.js
│   │   ├── LocalStorage/
│   │   │   ├── index.d.ts
│   │   │   ├── index.js
│   │   │   └── test.js
│   │   ├── WorkQueue.d.ts
│   │   ├── WorkQueue.js
│   │   ├── index.d.ts
│   │   ├── index.js
│   │   └── test.js
│   ├── DatabaseProvider/
│   │   ├── index.d.ts
│   │   └── index.js
│   ├── Model/
│   │   ├── helpers.d.ts
│   │   ├── helpers.js
│   │   ├── index.d.ts
│   │   ├── index.js
│   │   └── test.js
│   ├── Query/
│   │   ├── helpers.d.ts
│   │   ├── helpers.js
│   │   ├── index.d.ts
│   │   ├── index.js
│   │   └── test.js
│   ├── QueryDescription/
│   │   ├── __tests__/
│   │   │   ├── queryWithoutDeleted.test.js
│   │   │   └── test.js
│   │   ├── helpers.d.ts
│   │   ├── helpers.js
│   │   ├── index.d.ts
│   │   ├── index.js
│   │   ├── operators.d.ts
│   │   ├── operators.js
│   │   ├── type.d.ts
│   │   └── type.js
│   ├── RawRecord/
│   │   ├── __tests__/
│   │   │   ├── helpers.js
│   │   │   └── test.js
│   │   ├── index.d.ts
│   │   └── index.js
│   ├── Relation/
│   │   ├── helpers.d.ts
│   │   ├── helpers.js
│   │   ├── index.d.ts
│   │   ├── index.js
│   │   └── test.js
│   ├── Schema/
│   │   ├── index.d.ts
│   │   ├── index.js
│   │   ├── migrations/
│   │   │   ├── getSyncChanges/
│   │   │   │   ├── index.d.ts
│   │   │   │   ├── index.js
│   │   │   │   └── test.js
│   │   │   ├── index.d.ts
│   │   │   ├── index.js
│   │   │   ├── stepsForMigration.d.ts
│   │   │   ├── stepsForMigration.js
│   │   │   └── test.js
│   │   └── test.js
│   ├── __playground__/
│   │   └── index.js
│   ├── __tests__/
│   │   ├── databaseTests.js
│   │   ├── emptyMock/
│   │   │   └── index.js
│   │   ├── integrationTests.js
│   │   ├── setUpIntegrationTestEnv.js
│   │   ├── setup.js
│   │   ├── testModels.js
│   │   └── utils/
│   │       ├── expectToRejectWithMessage/
│   │       │   └── index.js
│   │       ├── index.js
│   │       ├── makeScheduler.js
│   │       └── naughtyStrings.js
│   ├── __typetests__/
│   │   ├── README.md
│   │   └── query.js
│   ├── adapters/
│   │   ├── __tests__/
│   │   │   ├── commonTests.js
│   │   │   └── helpers.js
│   │   ├── common.js
│   │   ├── compat.d.ts
│   │   ├── compat.js
│   │   ├── error.js
│   │   ├── lokijs/
│   │   │   ├── common.d.ts
│   │   │   ├── common.js
│   │   │   ├── dispatcher.d.ts
│   │   │   ├── dispatcher.js
│   │   │   ├── index.d.ts
│   │   │   ├── index.js
│   │   │   ├── test.js
│   │   │   ├── type.d.ts
│   │   │   ├── type.js
│   │   │   └── worker/
│   │   │       ├── DatabaseBridge.js
│   │   │       ├── DatabaseDriver.js
│   │   │       ├── cloneMessage/
│   │   │       │   ├── index.js
│   │   │       │   └── test.js
│   │   │       ├── encodeQuery/
│   │   │       │   ├── index.js
│   │   │       │   └── test.js
│   │   │       ├── executeQuery.js
│   │   │       ├── loki.worker.js
│   │   │       ├── lokiExtensions.js
│   │   │       ├── performJoins/
│   │   │       │   ├── index.js
│   │   │       │   └── test.js
│   │   │       └── synchronousWorker.js
│   │   ├── sqlite/
│   │   │   ├── devtools.js
│   │   │   ├── encodeBatch/
│   │   │   │   ├── index.js
│   │   │   │   └── test.js
│   │   │   ├── encodeQuery/
│   │   │   │   ├── index.js
│   │   │   │   └── test.js
│   │   │   ├── encodeSchema/
│   │   │   │   ├── index.js
│   │   │   │   └── test.js
│   │   │   ├── encodeValue/
│   │   │   │   ├── index.js
│   │   │   │   └── test.js
│   │   │   ├── index.d.ts
│   │   │   ├── index.js
│   │   │   ├── integrationTest.js
│   │   │   ├── makeDispatcher/
│   │   │   │   ├── decodeQueryResult/
│   │   │   │   │   ├── index.js
│   │   │   │   │   └── test.js
│   │   │   │   ├── index.js
│   │   │   │   └── index.native.js
│   │   │   ├── sqlite-node/
│   │   │   │   ├── Database.js
│   │   │   │   ├── DatabaseBridge.js
│   │   │   │   ├── DatabaseDriver.js
│   │   │   │   └── __tests__/
│   │   │   │       └── DatabaseDriver.test.js
│   │   │   ├── test.js
│   │   │   ├── type.d.ts
│   │   │   └── type.js
│   │   ├── type.d.ts
│   │   └── type.js
│   ├── decorators/
│   │   ├── action/
│   │   │   ├── index.d.ts
│   │   │   ├── index.js
│   │   │   └── test.js
│   │   ├── children/
│   │   │   ├── index.d.ts
│   │   │   ├── index.js
│   │   │   └── test.js
│   │   ├── common.d.ts
│   │   ├── common.js
│   │   ├── date/
│   │   │   ├── index.d.ts
│   │   │   ├── index.js
│   │   │   └── test.js
│   │   ├── experimentalFailsafe/
│   │   │   ├── index.d.ts
│   │   │   └── index.js
│   │   ├── field/
│   │   │   ├── index.d.ts
│   │   │   ├── index.js
│   │   │   └── test.js
│   │   ├── immutableRelation/
│   │   │   ├── index.d.ts
│   │   │   ├── index.js
│   │   │   └── test.js
│   │   ├── index.d.ts
│   │   ├── index.js
│   │   ├── json/
│   │   │   ├── index.d.ts
│   │   │   ├── index.js
│   │   │   └── test.js
│   │   ├── lazy/
│   │   │   ├── index.d.ts
│   │   │   ├── index.js
│   │   │   └── test.js
│   │   ├── nochange/
│   │   │   ├── index.d.ts
│   │   │   ├── index.js
│   │   │   └── test.js
│   │   ├── readonly/
│   │   │   ├── index.d.ts
│   │   │   ├── index.js
│   │   │   └── test.js
│   │   ├── relation/
│   │   │   ├── index.d.ts
│   │   │   ├── index.js
│   │   │   └── test.js
│   │   └── text/
│   │       ├── index.d.ts
│   │       ├── index.js
│   │       └── test.js
│   ├── diagnostics/
│   │   ├── censorRaw.js
│   │   ├── diagnoseDatabaseStructure/
│   │   │   ├── impl.js
│   │   │   └── index.js
│   │   ├── diagnoseSyncConsistency/
│   │   │   ├── impl.js
│   │   │   └── index.js
│   │   └── index.js
│   ├── hooks/
│   │   ├── index.d.ts
│   │   └── index.js
│   ├── index.d.ts
│   ├── index.integrationTests.native.js
│   ├── index.js
│   ├── observation/
│   │   ├── encodeMatcher/
│   │   │   ├── canEncode.js
│   │   │   ├── index.js
│   │   │   ├── operators.js
│   │   │   └── test.js
│   │   ├── subscribeToCount/
│   │   │   ├── index.d.ts
│   │   │   ├── index.js
│   │   │   └── test.js
│   │   ├── subscribeToQuery.d.ts
│   │   ├── subscribeToQuery.js
│   │   ├── subscribeToQueryReloading/
│   │   │   ├── index.d.ts
│   │   │   ├── index.js
│   │   │   └── test.js
│   │   ├── subscribeToQueryWithColumns/
│   │   │   ├── index.js
│   │   │   └── test.js
│   │   ├── subscribeToSimpleQuery/
│   │   │   ├── index.js
│   │   │   ├── processChangeSet.js
│   │   │   └── test.js
│   │   └── test.js
│   ├── react/
│   │   ├── DatabaseContext.d.ts
│   │   ├── DatabaseContext.js
│   │   ├── DatabaseProvider.d.ts
│   │   ├── DatabaseProvider.js
│   │   ├── DatabaseProvider.test.js
│   │   ├── WithObservablesComponent.js
│   │   ├── compose.d.ts
│   │   ├── compose.js
│   │   ├── helpers.js
│   │   ├── index.d.ts
│   │   ├── index.js
│   │   ├── useDatabase.d.ts
│   │   ├── useDatabase.js
│   │   ├── useDatabase.test.js
│   │   ├── withDatabase.d.ts
│   │   ├── withDatabase.js
│   │   ├── withHooks.js
│   │   └── withObservables/
│   │       ├── garbageCollector.js
│   │       ├── index.d.ts
│   │       ├── index.js
│   │       └── withObservables.test.js
│   ├── sync/
│   │   ├── SyncLogger/
│   │   │   ├── index.d.ts
│   │   │   ├── index.js
│   │   │   └── test.js
│   │   ├── debugPrintChanges/
│   │   │   ├── index.d.ts
│   │   │   └── index.js
│   │   ├── helpers.d.ts
│   │   ├── helpers.js
│   │   ├── helpers.test.js
│   │   ├── impl/
│   │   │   ├── __tests__/
│   │   │   │   ├── applyRemote.test.js
│   │   │   │   ├── fetchLocal.test.js
│   │   │   │   ├── helpers.js
│   │   │   │   ├── helpers.test.js
│   │   │   │   ├── markAsSynced.test.js
│   │   │   │   ├── synchronize-abort.test.js
│   │   │   │   ├── synchronize-benchmark.test.js
│   │   │   │   ├── synchronize-migration.test.js
│   │   │   │   ├── synchronize-partialRejections.test.js
│   │   │   │   ├── synchronize-replacement.test.js
│   │   │   │   ├── synchronize-turbo.test.js
│   │   │   │   └── synchronize.test.js
│   │   │   ├── applyRemote.d.ts
│   │   │   ├── applyRemote.js
│   │   │   ├── fetchLocal.d.ts
│   │   │   ├── fetchLocal.js
│   │   │   ├── helpers.d.ts
│   │   │   ├── helpers.js
│   │   │   ├── index.d.ts
│   │   │   ├── index.js
│   │   │   ├── markAsSynced.d.ts
│   │   │   ├── markAsSynced.js
│   │   │   ├── synchronize.d.ts
│   │   │   └── synchronize.js
│   │   ├── index.d.ts
│   │   └── index.js
│   ├── types.d.ts
│   ├── types.js
│   └── utils/
│       ├── common/
│       │   ├── connectionTag/
│       │   │   ├── index.d.ts
│       │   │   └── index.js
│       │   ├── deepFreeze/
│       │   │   ├── index.d.ts
│       │   │   ├── index.js
│       │   │   └── test.js
│       │   ├── deprecated/
│       │   │   ├── index.d.ts
│       │   │   └── index.js
│       │   ├── devMeasureTime/
│       │   │   ├── index.d.ts
│       │   │   └── index.js
│       │   ├── diagnosticError/
│       │   │   ├── index.d.ts
│       │   │   └── index.js
│       │   ├── ensureSync/
│       │   │   ├── index.d.ts
│       │   │   ├── index.js
│       │   │   └── test.js
│       │   ├── index.d.ts
│       │   ├── index.js
│       │   ├── invariant/
│       │   │   ├── index.d.ts
│       │   │   └── index.js
│       │   ├── isRN/
│       │   │   ├── index.d.ts
│       │   │   ├── index.js
│       │   │   └── index.native.js
│       │   ├── logError/
│       │   │   ├── index.d.ts
│       │   │   └── index.js
│       │   ├── logger/
│       │   │   ├── index.d.ts
│       │   │   └── index.js
│       │   ├── makeDecorator/
│       │   │   ├── index.d.ts
│       │   │   └── index.js
│       │   ├── memory/
│       │   │   ├── index.d.ts
│       │   │   └── index.js
│       │   └── randomId/
│       │       ├── fallback.js
│       │       ├── index.d.ts
│       │       ├── index.js
│       │       ├── randomId.js
│       │       ├── randomId.native.js
│       │       ├── randomId_v2.native.js
│       │       └── test.js
│       ├── fp/
│       │   ├── Result/
│       │   │   ├── index.d.ts
│       │   │   └── index.js
│       │   ├── allPass/
│       │   │   ├── index.d.ts
│       │   │   ├── index.js
│       │   │   └── test.js
│       │   ├── allPromises/
│       │   │   ├── index.d.ts
│       │   │   └── index.js
│       │   ├── allPromisesObj/
│       │   │   ├── index.d.ts
│       │   │   ├── index.js
│       │   │   └── test.js
│       │   ├── anyPass/
│       │   │   ├── index.d.ts
│       │   │   ├── index.js
│       │   │   └── test.js
│       │   ├── areRecordsEqual/
│       │   │   ├── index.d.ts
│       │   │   ├── index.js
│       │   │   └── test.js
│       │   ├── arrayDifference/
│       │   │   ├── index.d.ts
│       │   │   ├── index.js
│       │   │   └── test.js
│       │   ├── arrayOrSpread/
│       │   │   ├── index.d.ts
│       │   │   ├── index.js
│       │   │   └── test.js
│       │   ├── checkName/
│       │   │   ├── index.d.ts
│       │   │   ├── index.js
│       │   │   └── test.js
│       │   ├── filterObj/
│       │   │   ├── index.d.ts
│       │   │   ├── index.js
│       │   │   └── test.js
│       │   ├── forEachAsync/
│       │   │   ├── index.js
│       │   │   └── test.js
│       │   ├── fromPairs/
│       │   │   ├── index.d.ts
│       │   │   └── index.js
│       │   ├── groupBy/
│       │   │   ├── index.d.ts
│       │   │   ├── index.js
│       │   │   └── test.js
│       │   ├── identicalArrays/
│       │   │   ├── index.d.ts
│       │   │   ├── index.js
│       │   │   └── test.js
│       │   ├── identity/
│       │   │   ├── index.d.ts
│       │   │   └── index.js
│       │   ├── index.d.ts
│       │   ├── index.js
│       │   ├── isObj/
│       │   │   ├── index.d.ts
│       │   │   ├── index.js
│       │   │   └── test.js
│       │   ├── keys/
│       │   │   ├── index.d.ts
│       │   │   ├── index.js
│       │   │   └── test.js
│       │   ├── likeToRegexp/
│       │   │   ├── index.d.ts
│       │   │   └── index.js
│       │   ├── mapObj/
│       │   │   ├── index.d.ts
│       │   │   ├── index.js
│       │   │   └── test.js
│       │   ├── noop/
│       │   │   ├── index.d.ts
│       │   │   └── index.js
│       │   ├── pipe/
│       │   │   ├── index.d.ts
│       │   │   ├── index.js
│       │   │   └── test.js
│       │   ├── sortBy/
│       │   │   ├── index.d.ts
│       │   │   ├── index.js
│       │   │   └── test.js
│       │   ├── splitEvery/
│       │   │   ├── index.d.ts
│       │   │   ├── index.js
│       │   │   └── test.js
│       │   ├── toPairs/
│       │   │   ├── index.d.ts
│       │   │   └── index.js
│       │   ├── unique/
│       │   │   ├── index.d.ts
│       │   │   ├── index.js
│       │   │   └── test.js
│       │   ├── unnest/
│       │   │   ├── index.d.ts
│       │   │   └── index.js
│       │   └── values/
│       │       ├── index.d.ts
│       │       ├── index.js
│       │       └── test.js
│       ├── rx/
│       │   ├── __wmelonRxShim/
│       │   │   ├── index.d.ts
│       │   │   └── index.js
│       │   ├── __wmelonRxShimESM2015/
│       │   │   ├── index.d.ts
│       │   │   └── index.js
│       │   ├── cacheWhileConnected/
│       │   │   ├── index.d.ts
│       │   │   └── index.js
│       │   ├── doOnDispose/
│       │   │   ├── index.d.ts
│       │   │   └── index.js
│       │   ├── doOnSubscribe/
│       │   │   ├── index.d.ts
│       │   │   └── index.js
│       │   ├── index.d.ts
│       │   ├── index.js
│       │   └── publishReplayLatestWhileConnected/
│       │       ├── index.d.ts
│       │       └── index.js
│       └── subscriptions/
│           ├── SharedSubscribable/
│           │   ├── index.d.ts
│           │   ├── index.js
│           │   └── test.js
│           ├── index.d.ts
│           ├── index.js
│           ├── type.d.ts
│           └── type.js
├── tsconfig.json
└── tslint.json

================================================
FILE CONTENTS
================================================

================================================
FILE: .eslintignore
================================================
node_modules/
dist/
flow-typed/
dev/
; FIXME: Temporary, should be deleted after #1477 is merged
**/*.ts


================================================
FILE: .eslintrc.js
================================================
const config = {
  env: {
    es6: true,
    // configure globals
    jest: true,
    browser: true,
    commonjs: true,
    node: true,
  },
  plugins: ['import', '@typescript-eslint'],
  extends: [
    'eslint:recommended',
    'plugin:react/recommended',
    'plugin:react-hooks/recommended',
    'plugin:flowtype/recommended',
    'prettier',
    'plugin:jest/recommended',
  ],
  parser: '@babel/eslint-parser',
  ignorePatterns: 'examples/typescript/**/*.ts',
  settings: {
    flowtype: {
      onlyFilesWithFlowAnnotation: true,
    },
  },
  rules: {
    'no-console': ['error'],
    'no-unused-vars': [
      'error',
      {
        argsIgnorePattern: '^_',
      },
    ],
    'import/no-cycle': 'error',
    'jest/no-large-snapshots': 'warn',
    'jest/no-disabled-tests': 'off',
    'jest/expect-expect': 'off',
  },
  overrides: [
    {
      files: ['src/**/*.js'],
      excludedFiles: ['*integrationTest.js', '*test.js', '**/__tests__/**', '*test.*.js'],
      rules: {
        'flowtype/require-valid-file-annotation': ['error', 'always'],
      },
    },
    {
      files: ['src/**/*.ts', 'examples/typescript/*.ts'],
      parser: '@typescript-eslint/parser',
      rules: {
        'flowtype/no-types-missing-file-annotation': 'off',
      },
    },
  ],
}

module.exports = config


================================================
FILE: .flowconfig
================================================
[ignore]
<PROJECT_ROOT>/.cache
<PROJECT_ROOT>/dist
<PROJECT_ROOT>/dev
<PROJECT_ROOT>/examples
<PROJECT_ROOT>/react-native-copy
<PROJECT_ROOT>/src/**/*.ts
.*/node_modules/react\-native/.*
.*/node_modules/@react\-native/.*
.*/node_modules/fbjs/**
.*/node_modules/resolve/test/resolver/**
.*/node_modules/metro\-config/.*
.*/node_modules/metro\-config/.*
.*/node_modules/hermes\-estree/.*
.*/node_modules/metro/.*

[libs]
flow-typed/

[options]
server.max_workers=8
emoji=true
module.ignore_non_literal_requires=true
module.file_ext=.js
exact_by_default=false

# fixes Flow on ARM
sharedmemory.heap_size=4000000000

[version]
>=0.140.0


================================================
FILE: .gitattributes
================================================
native/iosTests/Pods/* linguist-generated=true
*.pbxproj -text


================================================
FILE: .github/stale.yml
================================================
daysUntilStale: 270
daysUntilClose: 60


================================================
FILE: .github/workflows/ci.yml
================================================
name: CI

on:
  pull_request:
  push:
    branches: master

jobs:
  ci-check:
    runs-on: ubuntu-22.04
    name: JavaScript tests
    strategy:
      matrix:
        node-version: ['18.x', '20.x', '22.x', '23.x']
    steps:
      - uses: actions/checkout@v3
      - name: Set Node.js version
        uses: actions/setup-node@v3
        with:
          node-version: ${{ matrix.node-version }}
      - uses: actions/cache@v3
        with:
          path: 'node_modules'
          key: ${{ runner.os }}-node-${{ matrix.node-version }}-modules-${{ hashFiles('**/yarn.lock') }}
      - run: yarn
      - run: yarn ci:check
      - name: Gradle Wrapper Validation
        uses: gradle/wrapper-validation-action@v1.0.6
      - name: Check docs build
        run: cd docs-website && yarn install && cd .. && yarn docs:build
  ios:
    runs-on: macos-15
    name: iOS tests
    steps:
      - uses: actions/checkout@v3
      - name: Set Node.js version
        uses: actions/setup-node@v3
        with:
          node-version: 22.x
      - name: Set Xcode version
        uses: maxim-lobanov/setup-xcode@v1.2.1
        with:
          xcode-version: 16.2
      - name: ccache
        uses: hendrikmuhs/ccache-action@v1
      - name: cache node_modules
        uses: actions/cache@v3
        with:
          path: 'node_modules'
          key: ${{ runner.os }}-modules-${{ hashFiles('**/yarn.lock') }}
      - run: yarn
      - name: cache Pods
        uses: actions/cache@v3
        id: pods-cache
        with:
          path: native/iosTest/Pods
          key: ${{ runner.os }}-pods-cache-${{ hashFiles('**/Podfile.lock') }}
      - run: bundle install
      - name: 'pod install'
        if: true # steps.pods-cache.outputs.cache-hit != 'true'
        run: yarn cocoapods
      - run: yarn test:ios
  android:
    runs-on: ubuntu-24.04
    name: Android tests
    steps:
      - uses: actions/checkout@v4
      - name: Enable KVM
        run: |
          echo 'KERNEL=="kvm", GROUP="kvm", MODE="0666", OPTIONS+="static_node=kvm"' | sudo tee /etc/udev/rules.d/99-kvm4all.rules
          sudo udevadm control --reload-rules
          sudo udevadm trigger --name-match=kvm
      - uses: actions/setup-java@v4
        with:
          distribution: 'adopt'
          java-version: '17'
      - name: Set Node.js version
        uses: actions/setup-node@v4
        with:
          node-version: 22.x
      - uses: actions/cache@v4
        with:
          path: 'node_modules'
          key: ${{ runner.os }}-modules-${{ hashFiles('**/yarn.lock') }}
      - run: yarn
      - run: yarn dev:native &
      - uses: gradle/actions/setup-gradle@v3
      # See: https://github.com/android/compose-samples/actions/runs/27015993/workflow for ideas for caching
      - name: run tests
        uses: reactivecircus/android-emulator-runner@v2.33.0
        with:
          api-level: 29
          working-directory: ./native/androidTest
          script: ./gradlew connectedAndroidTest
      - run: yarn ktlint
  windows:
    # FIXME: Windows port is unmaintained. If you're interested in sponsoring continued maintenance,
    # please email me!
    if: false
    runs-on: windows-2022
    name: Windows tests
    steps:
      - uses: actions/checkout@v3
      - name: Set Node.js version
        uses: actions/setup-node@v3
        with:
          node-version: 22.x
      - uses: actions/cache@v3
        with:
          path: 'node_modules'
          key: ${{ runner.os }}-modules-${{ hashFiles('**/yarn.lock') }}
      - run: yarn --network-timeout 100000
      # FIXME: concurrently seems broken on windows
      # - run: yarn ci
      - run: yarn test
      - run: yarn eslint
      - run: yarn flow
      # FIXME: TS broken on Windows?
      # - run: yarn test:typescript
      # Build WatermelonTester and run in background
      - run: yarn test:windows
      # Give it some time to bundle
      - run: sleep 90
      # Start E2E runner to capture integration test results
      - run: cd native/windowsE2E && yarn
      - run: yarn test:windows:ci


================================================
FILE: .gitignore
================================================
.DS_Store

.cache/
node_modules/
.tmp/

npm-debug.log
yarn-error.log

dist/
dev/

*.tgz
coverage/

.vscode
.idea

docs-build/

**/.metro-health-check*

# windows
msbuild.binlog

# Yarn
.yarn/*
!.yarn/patches
!.yarn/plugins
!.yarn/releases
!.yarn/sdks
!.yarn/versions


================================================
FILE: .imgbotconfig
================================================
{
    "ignoredFiles": [
      "docs/*"
    ]
}


================================================
FILE: CHANGELOG-Unreleased.md
================================================
### Highlights

### BREAKING CHANGES

### Deprecations

### New features

### Fixes

- [LokiJS] Multitab sync issue fix
- [Android] Added linker flag for building with 16kB page alignment
- [TS] make catchError visible to typescript

### Performance

### Changes

- Updated better-sqlite3 to 11.9.1

### Internal

- Updated internal dependencies
- Updated documentation scripts


================================================
FILE: CHANGELOG.md
================================================
# Changelog

All notable changes to this project will be documented in this file.

Contributors: Please add your changes to CHANGELOG-Unreleased.md

## 0.28 - 2025-04-07

### BREAKING CHANGES

- [iOS] Podspec deployment target was bumped from iOS 11 to iOS 12
- [Android] Installation of Android JSI adapter has changed. To migrate, remove `getJSIModulePackage()` override in your `MainApplication.{java,kt}`, and add `new WatermelonDBJSIPackage()` to `getPackages()` override instead. See Installation docs for details.

### New features

- Added `Database#experimentalIsVerbose` option
- Support for React Native 0.74+

### Fixes

- [ts] Improved LocalStorage type definition
- [ts] Add missing .d.ts for experimentalFailsafe decorator
- [migrations] `unsafeExecuteSql` migration is now validate to ensure it ends with a semicolon (#1811)

### Changes

- Minimum supported Node.js version is now 18.x
- Improved Model diagnostic errors now always contain `table#id` of offending record
- Update `better-sqlite3` to 11.x
- Update sqlite (used by Android in JSI mode) to 3.46.0
- [docs] Improved Android installation docs
- [docs] Removed examples from the codebase as they were unmaintained

### Internal

- Update internal dependencies

## 0.27.1 - 2023-10-15

Fix missing Changelog for 0.27 release

## 0.27 - 2023-08-29

### Highlights

**Removed legacy Swift and Kotlin React Native Modules**

Following the addition of new Native Modules in 0.26, we're removing the old implementations. We expect this to simplify installation process and remove a ton of compatibility and configuration issues due to Kotlin version mismatchs and the CocoaPods-Swift issues when using `use_frameworks!` or Expo.

**Experimental React Native Windows support**

WatermelonDB now has _experimental_ support for React Native Windows. See Installation docs for details.

**Introducing Watermelon React**

All React/React Native helpers for Watermelon are now available from a new `@nozbe/watermelodb/react` folder:

- `DatabaseProvider`, `useDatabase`, `withDatabase`
- NEW: `withObservables` - `@nozbe/with-observables` as a separate package is deprecated, and is now bundled with WatermelonDB
- NEW: HOC helpers: `compose`, `withHooks`
- NEW: `<WithObservables />` component, a component version of `withObservables` HOC. Useful when a value being observed is localized to a small part of a larger component, because you can effortlessly narrow down which parts of the component are re-rendered when the value changes without having to extract a new component.

Imports from previous `@nozbe/watermelondb/DatabaseProvider` and `@nozbe/watermelondb/hooks` folders are deprecated and will be removed in a future version.

**Introducing Watermelon Diagnostics**

All debug/dev/diagnostics tools for Watermelon are now available from a new `@nozbe/watermelondb/diagnostics` folder:

- NEW: `censorRaw` - takes a `RawRecord/DirtyRaw` and censors its string values, while preserving IDs, _status, _changed, and numeric/boolean values. Helpful when viewing database contents in context that could expose private user information
- NEW: `diagnoseDatabaseStructure` - analyzes database to find inconsistencies, such as orphaned records (`belongs_to` relations on model that point to records that don't exist) or broken LokiJS database. Use this to find bugs in your data model.
- NEW: `diagnoseSyncConsistency` - compares local database with the server version (contents of first/full sync) to find inconsistencies, missing and excess records. Use this to find bugs in your backend sync implementation.

### BREAKING CHANGES

- `@nozbe/with-observables` is no longer a WatermelonDB dependency. Change your imports to `import { withObservables } from '@nozbe/watermelondb/react'`

Changes unlikely to cause issues:

- [iOS] If `import WatermelonDB` is used in your Swift app (for Turbo sync), remove it and replace with `#import <WatermelonDB/WatermelonDB.h>` in the bridging header
- [iOS] If you use `_watermelonDBLoggingHook`, remove it. No replacement is provided at this time, feel free to contribute if you need this
- [iOS] If you use `-DENABLE_JSLOCK_PERFORMANCE_HACK`, remove it. JSLockPerfHack has been non-functional for some time already, and has now been removed. Please file an issue if you relied on it.

### Deprecations

- Imports from `@nozbe/watermelondb/DatabaseProvider` and `@nozbe/watermelondb/hooks`. Change to `@nozbe/watermelondb/react`

### New features

- New `@experimentalFailsafe` decorator you can apply before `@relation/@immutableRelation` so that if relation points to a record that does not exist, `.fetch()/.observe()` yield `undefined` instead of throwing an error

### Fixes

- [Flow/TS] Improved typing of DatabaseContext
- Fixed `Cannot read property 'getRandomIds' of null`. This error occured if native modules were not correctly installed, however the location of the error caused a lot of confusion.

## 0.26 - 2023-04-28

### Highlights

**New Native Modules**

We're transitioning SQLite adapters for React Native **from Kotlin and Swift to Java and Objective-C**.

This is only a small part of WatermelonDB, yet is responsible for a disproportionate amount of issues
raised, such as Kotlin version conflicts, Expo build failures, CocoaPods use_frameworks! issues. It
makes library installation and updates more complicated for users. It complicates maintenance.
Swift doesn't play nicely with either React Native's legacy Native Module system, nor can it interact
cleanly with C++ (JSI/New Architecture) without going through Objective-C++.

In other words, in the context of a React Native library, the benefit of these modern, nicer to use
languages is far outweighed by the downsides. That's why we (@radex & @rozpierog) decided to rewrite
the iOS and Android implementations to Objective-C and Java respectively.

0.26 is a transition release, and it contains both implementations. If you find a regression caused
by the new bridge, pass `{disableNewBridge: true}` to `new SQLiteAdapter()` **and file an issue**.
We plan to remove the old implementation in 0.27 or 0.28 release.

**New documentation**

We have a brand new documentation page, built with Docusaurus (contributed by @ErickLuizA).

We plan to expand guides, add typing to examples, and add a proper API reference, but we need your
help to do this! See: https://github.com/Nozbe/WatermelonDB/issues/1481

### BREAKING CHANGES

- [iOS] You should remove import of WatermelonDB's `SupportingFiles/Bridging.h` from your app project's `Bridging.h`.
  If this removal causes build issues, please file an issue.
- [iOS] In your Podfile, replace previous WatermelonDB's pod imports with this:

  ```rb
  # Uncomment this line if you're not using auto-linking
  # pod 'WatermelonDB', path: '../node_modules/@nozbe/watermelondb'
  # WatermelonDB dependency
  pod 'simdjson', path: '../node_modules/@nozbe/simdjson', modular_headers: true
  ```
- Removed functions deprecated for 2+ years:
  - `Collection.unsafeFetchRecordsWithSQL()`. Use `.query(Q.unsafeSqlQuery('select * from...')).fetch()` instead.
  - `Database.action()`. Use `Database.write()` instead.
  - `.subAction()`. Use `.callWriter()` instead.
  - `@action` decorator. Use `@writer` instead.

### Deprecations

### New features

- [Android] Added `experimentalUnsafeNativeReuse` option to SQLiteAdapter. See `src/adapters/sqlite/type.js` for more details
- You can now pass an array to `Q.and(conditions)`, `Q.or(conditions)`, `collection.query(conditions)`, `query.extend(conditions)` in addition to spreading multiple arguments
- Added JSDoc comments to many APIs

### Fixes

- Improved resiliency to "Maximum call stack size exceeded" errors
- [JSI] Improved reliability when reloading RCTBridge
- [iOS] Fix "range of supported deployment targets" Xcode warning
- `randomId` uses better randum number generator
- Fixed "no such index" when using non-standard schemas and >1k bulk updates
- Fixes and changes included in `@nozbe/with-observables@1.5.0`
- [Flow] `query.batch([model, falsy])` no longer raises an error

### Performance

- Warning is now given if a large number of arguments is passed to `Q.and, Q.or, Collection.query, Database.batch` instead of a single array
- `randomId()` is now 2x faster on Chrome, 10x faster on Safari, 2x faster on iOS (Hermes)

### Changes

- `randomId`: now also generates upper-case letters
- Simplified CocoaPods/iOS integration
- Docs improvements: SQLite versions, Flow declarations, Installation
- Improved diagnostic warnings and errors: JSI, Writer/Reader
- Remove old diagnostic warnings no longer relevant: `multiple Q.on()s`, `Database`, `LokiJSAdapter`, `SQLiteAdapter`
- Updated `flow-bin` to 0.200. This shouldn't have an impact on you, but could fix or break Flow if you don't have WatermelonDB set to `[declarations]` mode
- Updated `@babel/runtime` to 7.20.13
- Updated `rxjs` to 7.8.0
- Updated `sqlite` (SQLite used on Android in JSI mode) to 3.40.1
- Updated `simdjson` to 3.1.0

### Internal

- Cleaned up QueryDescription, ios folder structure, JSI implementation by splitting them into smaller parts.
- [Android] [jsi] Simplify CMakeLists
- Improve release script

## 0.25.5 - 2023-02-01

- Fix Android auto-linking

## 0.25.4 - 2023-01-31

- [Sync] Improve memory consumption (less likely to get "Maximum callstack exceeded" error)
- [TypeScript] Fix type of `DirtyRaw` to `{ [key: string]: any }` (from `Object`)

## 0.25.3 - 2023-01-30

- Fixed TypeError regression

## 0.25.2 - 2023-01-30

### Fixes

- Fix TypeScript issues (@paulrostorp feat. @enahum)
- Fix compilation on Kotlin 1.7
- Fix regression in Sync that could cause `Record ID xxx#yyy was sent over the bridge, but it's not cached` error

### Internal

- Update internal dependencies
- Fix Android CI
- Improve TypeScript CI

## 0.25.1 - 2023-01-23

- Fix React Native 0.71+ Android broken build

## 0.25 - 2023-01-20

### Highlights

- Fix broken build on React Native 0.71+
- [Expo] Fixes Expo SDK 44+ build errors (@Kudo)
- [JSI] Fix an issue that sometimes led to crashing app upon database close

### BREAKING CHANGES

- [Query] `Q.where(xxx, undefined)` will now throw an error. This is a bug fix, since comparing to
  undefined was never allowed and would either error out or produce a wrong result in some cases.
  However, it could technically break an app that relied on existing buggy behavior
- [JSI+Swift] If you use `watermelondbProvideSyncJson()` native iOS API, you might need to add `import WatermelonDB`

### New features

- [adapters] Adapter objects can now be distinguished by checking their `static adapterType`
- [Query] New `Q.includes('foo')` query for case-sensitive exact string includes comparison
- [adapters] Adapter objects now returns `dbName`
- [Sync] Replacement Sync - a new advanced sync feature. Server can now send a full dataset (same as
  during initial sync) and indicate with `{ experimentalStrategy: 'replacement' }` that instead of applying a diff,
  local database should be replaced with the dataset sent. Local records not present in the changeset
  will be deleted. However, unlike clearing database and logging in again, unpushed local changes
  (to records that are kept after replacement) are preserved. This is useful for recovering from a
  corrupted local database, or as a hack to deal with very large state changes such that server doesn't
  know how to efficiently send incremental changes and wants to send a full dataset instead. See docs
  for more details.
- [Sync] Added `onWillApplyRemoteChanges` callback

### Performance

- [LokiJS] Updated Loki with some performance improvements
- [iOS] JSLockPerfHack now works on iOS 15
- [Sync] Improved performance of processing large pulls
- Improved `@json` decorator, now with optional `{ memo: true }` parameter

### Changes

- [Docs] Added additional Android JSI installation step

### Fixes

- [TypeScript] Improve typings: add unsafeExecute method, localStorage property to Database
- [android] Fixed compilation on some setups due to a missing `<cassert>` import
- [sync] Fixed marking changes as synced for users that don't keep globally unique (only per-table unique) IDs
- Fix `Model.experimentalMarkAsDeleted/experimentalDestroyPermanently()` throwing an error in some cases
- Fixes included in updated `withObservables`

## 0.24 - 2021-10-28

### BREAKING CHANGES

- `Q.experimentalSortBy`, `Q.experimentalSkip`, `Q.experimentalTake` have been renamed to `Q.sortBy`, `Q.skip`, `Q.take` respectively
- **RxJS has been updated to 7.3.0**. If you're not importing from `rxjs` in your app, this doesn't apply to you. If you are, read RxJS 7 breaking changes: https://rxjs.dev/deprecations/breaking-changes

### New features

- **LocalStorage**. `database.localStorage` is now available
- **sortBy, skip, take** are now available in LokiJSAdapter as well
- **Disposable records**. Read-only records that cannot be saved in the database, updated, or deleted and only exist for as long as you keep a reference to them in memory can now be created using `collection.disposableFromDirtyRaw()`. This is useful when you're adding online-only features to an otherwise offline-first app.
- [Sync] `experimentalRejectedIds` parameter now available in push response to allow partial rejection of an otherwise successful sync

### Fixes

- Fixes an issue when using Headless JS on Android with JSI mode enabled - pass `usesExclusiveLocking: true` to SQLiteAdapter to enable
- Fixes Typescript annotations for Collection and adapters/sqlite

## 0.23 - 2021-07-22

This is a big release to WatermelonDB with new advanced features, great performance improvements, and important fixes to JSI on Android.

Please don't get scared off the long list of breaking changes - they are all either simple Find&Replace renames or changes to internals you probably don't use. It shouldn't take you more than 15 minutes to upgrade to 0.23.

### BREAKING CHANGES

- **iOS Installation change**. You need to add this line to your Podfile: `pod 'simdjson', path: '../node_modules/@nozbe/simdjson'`
- Deprecated `new Database({ actionsEnabled: false })` options is now removed. Actions are always enabled.
- Deprecated `new SQLiteAdapter({ synchronous: true })` option is now removed. Use `{ jsi: true }` instead.
- Deprecated `Q.unsafeLokiFilter` is now removed. Use `Q.unsafeLokiTransform((raws, loki) => raws.filter(raw => ...))` instead.
- Deprecated `Query.hasJoins` is now removed
- Changes to `LokiJSAdapter` constructor options:
  - `indexedDBSerializer` -> `extraIncrementalIDBOptions: { serializeChunk, deserializeChunk }`
  - `onIndexedDBFetchStart` -> `extraIncrementalIDBOptions: { onFetchStart }`
  - `onIndexedDBVersionChange` -> `extraIncrementalIDBOptions: { onversionchange }`
  - `autosave: false` -> `extraLokiOptions: { autosave: false }`
- Changes to Internal APIs. These were never meant to be public, and so are unlikely to affect you:
  - `Model._isCommited`, `._hasPendingUpdate`, `._hasPendingDelete` have been removed and changed to `Model._pendingState`
  - `Collection.unsafeClearCache()` is no longer exposed
- Values passed to `adapter.setLocal()` are now validated to be strings. This is technically a bug fix, since local storage was always documented to only accept strings, however applications may have relied on this lack of validation. Adding this validation was necessary to achieve consistent behavior between SQLiteAdapter and LokiJSAdapter
- `unsafeSql` passed to `appSchema` will now also be called when dropping and later recreating all database indices on large batches. A second argument was added so you can distinguish between these cases. See Schema docs for more details.
- **Changes to sync change tracking**. The behavior of `record._raw._changed` and `record._raw._status` (a.k.a. `record.syncStatus`) has changed. This is unlikely to be a breaking change to you, unless you're writing your own sync engine or rely on these low-level details.
  - Previously, \_changed was always empty when \_status=created. Now, \_changed is not populated during initial creation of a record, but a later update will add changed fields to \_changed. This change was necessary to fix a long-standing Sync bug.

### Deprecations

- `database.action(() => {})` is now deprecated. Use `db.write(() => {})` instead (or `db.read(() => {})` if you only need consistency but are not writing any changes to DB)
- `@action` is now deprecated. Use `@writer` or `@reader` instead
- `.subAction()` is now deprecated. Use `.callReader()` or `.callWriter()` instead
- `Collection.unsafeFetchRecordsWithSQL()` is now deprecated. Use `collection.query(Q.unsafeSqlQuery("select * from...")).fetch()` instead.

### New features

- `db.write(writer => { ... writer.batch() })` - you can now call batch on the interface passed to a writer block
- **Fetching record IDs and unsafe raws.** You can now optimize fetching of queries that only require IDs, not full cached records:
  - `await query.fetchIds()` will return an array of record ids
  - `await query.unsafeFetchRaw()` will return an array of unsanitized, unsafe raw objects (use alongside `Q.unsafeSqlQuery` to exclude unnecessary or include extra columns)
  - advanced `adapter.queryIds()`, `adapter.unsafeQueryRaw` are also available
- **Raw SQL queries**. New syntax for running unsafe raw SQL queries:
  - `collection.query(Q.unsafeSqlQuery("select * from tasks where foo = ?", ['bar'])).fetch()`
  - You can now also run `.fetchCount()`, `.fetchIds()` on SQL queries
  - You can now safely pass values for SQL placeholders by passing an array
  - You can also observe an unsafe raw SQL query -- with some caveats! refer to documentation for more details
- **Unsafe raw execute**. You can now execute arbitrary SQL queries (SQLiteAdapter) or access Loki object directly (LokiJSAdapter) using `adapter.unsafeExecute` -- see docs for more details
- **Turbo Login**. You can now speed up the initial (login) sync by up to 5.3x with Turbo Login. See Sync docs for more details.
- New diagnostic tool - **debugPrintChanges**. See Sync documentation for more details

### Performance

- The order of Q. clauses in a query is now preserved - previously, the clauses could get rearranged and produce a suboptimal query
- [SQLite] `adapter.batch()` with large numbers of created/updated/deleted records is now between 16-48% faster
- [LokiJS] Querying and finding is now faster - unnecessary data copy is skipped
- [jsi] 15-30% faster querying on JSC (iOS) when the number of returned records is large
- [jsi] up to 52% faster batch creation (yes, that's on top of the improvement listed above!)
- Fixed a performance bug that caused observed items on a list observer with `.observeWithColumns()` to be unnecessarily re-rendered just before they were removed from the list

### Changes

- All Watermelon console logs are prepended with a 🍉 tag
- Extra protections against improper use of writers/readers (formerly actions) have been added
- Queries with multiple top-level `Q.on('table', ...)` now produce a warning. Use `Q.on('table', [condition1, condition2, ...])` syntax instead.
- [jsi] WAL mode is now used

### Fixes

- [jsi] Fix a race condition where commands sent to the database right after instantiating SQLiteAdapter would fail
- [jsi] Fix incorrect error reporting on some sqlite errors
- [jsi] Fix issue where app would crash on Android/Hermes on reload
- [jsi] Fix IO errors on Android
- [sync] Fixed a long-standing bug that would cause records that are created before a sync and updated during sync's push to lose their most recent changes on a subsequent sync

### Internal

- Internal changes to SQLiteAdapter:
  - .batch is no longer available on iOS implementation
  - .batch/.batchJSON internal format has changed
  - .getDeletedRecords, destroyDeletedRecords, setLocal, removeLocal is no longer available
- encoded SQLiteAdapter schema has changed
- LokiJSAdapter has had many internal changes

## 0.22 - 2021-05-07

### BREAKING CHANGES

- [SQLite] `experimentalUseJSI: true` option has been renamed to `jsi: true`

### Deprecations

- [LokiJS] `Q.unsafeLokiFilter` is now deprecated and will be removed in a future version.
  Use `Q.unsafeLokiTransform((raws, loki) => raws.filter(raw => ...))` instead.

### New features

- [SQLite] [JSI] `jsi: true` now works on Android - see docs for installation info

### Performance

- Removed dependency on rambdax and made the util library smaller
- Faster withObservables

### Changes

- Synchronization: `pushChanges` is optional, will not calculate local changes if not specified.
- withObservables is now a dependency of WatermelonDB for simpler installation and consistent updates. You can (and generally should) delete `@nozbe/with-observables` from your app's package.json
- [Docs] Add advanced tutorial to share database across iOS targets - @thiagobrez
- [SQLite] Allowed callbacks (within the migrationEvents object) to be passed so as to track the migration events status ( onStart, onSuccess, onError ) - @avinashlng1080
- [SQLite] Added a dev-only `Query._sql()` method for quickly extracting SQL from Queries for debugging purposes

### Fixes

- Non-react statics hoisting in `withDatabase()`
- Fixed incorrect reference to `process`, which can break apps in some environments (e.g. webpack5)
- [SQLite] [JSI] Fixed JSI mode when running on Hermes
- Fixed a race condition when using standard fetch methods alongside `Collection.unsafeFetchRecordsWithSQL` - @jspizziri
- withObservables shouldn't cause any RxJS issues anymore as it no longer imports RxJS
- [Typescript] Added `onSetUpError` and `onIndexedDBFetchStart` fields to `LokiAdapterOptions`; fixes TS error - @3DDario
- [Typescript] Removed duplicated identifiers `useWebWorker` and `useIncrementalIndexedDB` in `LokiAdapterOptions` - @3DDario
- [Typescript] Fix default export in logger util

## 0.21 - 2021-03-24

### BREAKING CHANGES

- [LokiJS] `useWebWorker` and `useIncrementalIndexedDB` options are now required (previously, skipping them would only trigger a warning)

### New features

- [Model] `Model.update` method now returns updated record
- [adapters] `onSetUpError: Error => void` option is added to both `SQLiteAdapter` and `LokiJSAdapter`. Supply this option to catch initialization errors and offer the user to reload or log out
- [LokiJS] new `extraLokiOptions` and `extraIncrementalIDBOptions` options
- [Android] Autolinking is now supported.
  - If You upgrade to `<= v0.21.0` **AND** are on a version of React Native which supports Autolinking, you will need to remove the config manually linking WatermelonDB.
  - You can resolve this issue by **REMOVING** the lines of config from your project which are _added_ in the `Manual Install ONLY` section of the [Android Install docs](https://nozbe.github.io/WatermelonDB/Installation.html#android-react-native).

### Performance

- [LokiJS] Improved performance of launching the app

### Changes

- [LokiJS] `useWebWorker: true` and `useIncrementalIndexedDB: false` options are now deprecated. If you rely on these features, please file an issue!
- [Sync] Optional `log` passed to sync now has more helpful diagnostic information
- [Sync] Open-sourced a simple SyncLogger you can optionally use. See docs for more info.
- [SQLiteAdapter] `synchronous:true` option is now deprecated and will be replaced with `experimentalUseJSI: true` in the future. Please test if your app compiles and works well with `experimentalUseJSI: true`, and if not - file an issue!
- [LokiJS] Changed default autosave interval from 250 to 500ms
- [Typescript] Add `experimentalNestedJoin` definition and `unsafeSqlExpr` clause

### Fixes

- [LokiJS] Fixed a case where IndexedDB could get corrupted over time
- [Resilience] Added extra diagnostics for when you encounter the `Record ID aa#bb was sent over the bridge, but it's not cached` error and a recovery path (LokiJSAdapter-only). Please file an issue if you encounter this issue!
- [Typescript] Fixed type on OnFunction to accept `and` in join
- [Typescript] Fixed type `database#batch(records)`'s argument `records` to accept mixed types

### Internal

- Added an experimental mode where a broken database state is detected, further mutations prevented, and the user notified

## 0.20 - 2020-10-05

### BREAKING CHANGES

This release has unintentionally broken RxJS for some apps using `with-observables`. If you have this issue, please update `@nozbe/with-observables` to the latest version.

### New features

- [Sync] Conflict resolution can now be customized. See docs for more details
- [Android] Autolinking is now supported
- [LokiJS] Adapter autosave option is now configurable

### Changes

- Interal RxJS imports have been refactor such that rxjs-compat should never be used now
- [Performance] Tweak Babel config to produce smaller code
- [Performance] LokiJS-based apps will now take up to 30% less time to load the database (id and unique indicies are generated lazily)

### Fixes

- [iOS] Fixed crash on database reset in apps linked against iOS 14 SDK
- [LokiJS] Fix `Q.like` being broken for multi-line strings on web
- Fixed warn "import cycle" from DialogProvider (#786) by @gmonte.
- Fixed cache date as instance of Date (#828) by @djorkaeffalexandre.

## 0.19 - 2020-08-17

### New features

- [iOS] Added CocoaPods support - @leninlin
- [NodeJS] Introducing a new SQLite Adapter based integration to NodeJS. This requires a
  peer dependency on [better-sqlite3](https://github.com/JoshuaWise/better-sqlite3)
  and should work with the same configuration as iOS/Android - @sidferreira
- [Android] `exerimentalUseJSI` option has been enabled on Android. However, it requires some app-specific setup which is not yet documented - stay tuned for upcoming releases
- [Schema] [Migrations] You can now pass `unsafeSql` parameters to schema builder and migration steps to modify SQL generated to set up the database or perform migrations. There's also new `unsafeExecuteSql` migration step. Please use this only if you know what you're doing — you shouldn't need this in 99% of cases. See Schema and Migrations docs for more details
- [LokiJS] [Performance] Added experimental `onIndexedDBFetchStart` and `indexedDBSerializer` options to `LokiJSAdapter`. These can be used to improve app launch time. See `src/adapters/lokijs/index.js` for more details.

### Changes

- [Performance] findAndObserve is now able to emit a value synchronously. By extension, this makes Relations put into withObservables able to render the child component in one shot. Avoiding the extra unnecessary render cycles avoids a lot of DOM and React commit-phase work, which can speed up loading some views by 30%
- [Performance] LokiJS is now faster (refactored encodeQuery, skipped unnecessary clone operations)

## 0.18 - 2020-06-30

Another WatermelonDB release after just a week? Yup! And it's jam-packed full of features!

### New features

- [Query] `Q.on` queries are now far more flexible. Previously, they could only be placed at the top
  level of a query. See Docs for more details. Now, you can:

  - Pass multiple conditions on the related query, like so:

    ```js
    collection.query(Q.on('projects', [Q.where('foo', 'bar'), Q.where('bar', 'baz')]))
    ```

  - You can place `Q.on` deeper inside the query (nested inside `Q.and()`, `Q.or()`). However, you
    must explicitly list all tables you're joining on at the beginning of a query, using:
    `Q.experimentalJoinTables(['join_table1', 'join_table2'])`.
  - You can nest `Q.on` conditions inside `Q.on`, e.g. to make a condition on a grandchild.
    To do so, it's required to pass `Q.experimentalNestedJoin('parent_table', 'grandparent_table')` at the beginning
    of a query

- [Query] `Q.unsafeSqlExpr()` and `Q.unsafeLokiExpr()` are introduced to allow adding bits of queries
  that are not supported by the WatermelonDB query language without having to use `unsafeFetchRecordsWithSQL()`.
  See docs for more details
- [Query] `Q.unsafeLokiFilter((rawRecord, loki) => boolean)` can now be used as an escape hatch to make
  queries with LokiJSAdapter that are not otherwise possible (e.g. multi-table column comparisons).
  See docs for more details

### Changes

- [Performance] [LokiJS] Improved performance of queries containing query comparisons on LokiJSAdapter
- [Docs] Added Contributing guide for Query language improvements
- [Deprecation] `Query.hasJoins` is deprecated
- [DX] Queries with bad associations now show more helpful error message
- [Query] Counting queries that contain `Q.experimentalTake` / `Q.experimentalSkip` is currently broken - previously it would return incorrect results, but
  now it will throw an error to avoid confusion. Please contribute to fix the root cause!

### Fixes

- [Typescript] Fixed types of Relation

### Internal

- `QueryDescription` structure has been changed.

## 0.17.1 - 2020-06-24

- Fixed broken iOS build - @mlecoq

## 0.17 - 2020-06-22

### New features

- [Sync] Introducing Migration Syncs - this allows fully consistent synchronization when migrating
  between schema versions. Previously, there was no mechanism to incrementally fetch all remote changes in
  new tables and columns after a migration - so local copy was likely inconsistent, requiring a re-login.
  After adopting migration syncs, Watermelon Sync will request from backend all missing information.
  See Sync docs for more details.
- [iOS] Introducing a new native SQLite database integration, rewritten from scratch in C++, based
  on React Native's JSI (JavaScript Interface). It is to be considered experimental, however
  we intend to make it the default (and eventually, the only) implementation. In a later release,
  Android version will be introduced.

       The new adapter is up to 3x faster than the previously fastest `synchronous: true` option,
       however this speedup is only achieved with some unpublished React Native patches.

       To try out JSI, add `experimentalUseJSI: true` to `SQLiteAdapter` constructor.

- [Query] Added `Q.experimentalSortBy(sortColumn, sortOrder)`, `Q.experimentalTake(count)`,
  `Q.experimentalSkip(count)` methods (only availble with SQLiteAdapter) - @Kenneth-KT
- `Database.batch()` can now be called with a single array of models
- [DX] `Database.get(tableName)` is now a shortcut for `Database.collections.get(tableName)`
- [DX] Query is now thenable - you can now use `await query` and `await query.count` instead of `await query.fetch()` and `await query.fetchCount()`
- [DX] Relation is now thenable - you can now use `await relation` instead of `await relation.fetch()`
- [DX] Exposed `collection.db` and `model.db` as shortcuts to get to their Database object

### Changes

- [Hardening] Column and table names starting with `__`, Object property names (e.g. `constructor`), and some reserved keywords are now forbidden
- [DX] [Hardening] QueryDescription builder methods do tighter type checks, catching more bugs, and
  preventing users from unwisely passing unsanitized user data into Query builder methods
- [DX] [Hardening] Adapters check early if table names are valid
- [DX] Collection.find reports an error more quickly if an obviously invalid ID is passed
- [DX] Intializing Database with invalid model classes will now show a helpful error
- [DX] DatabaseProvider shows a more helpful error if used improperly
- [Sync] Sync no longer fails if pullChanges returns collections that don't exist on the frontend - shows a warning instead. This is to make building backwards-compatible backends less error-prone
- [Sync] [Docs] Sync documentation has been rewritten, and is now closer in detail to a formal specification
- [Hardening] database.collections.get() better validates passed value
- [Hardening] Prevents unsafe strings from being passed as column name/table name arguments in QueryDescription

### Fixes

- [Sync] Fixed `RangeError: Maximum call stack size exceeded` when syncing large amounts of data - @leninlin
- [iOS] Fixed a bug that could cause a database operation to fail with an (6) SQLITE_LOCKED error
- [iOS] Fixed 'jsi/jsi.h' file not found when building at the consumer level. Added path `$(SRCROOT)/../../../../../ios/Pods/Headers/Public/React-jsi` to Header Search Paths (issue #691) - @victorbutler
- [Native] SQLite keywords used as table or column names no longer crash
- Fixed potential issues when subscribing to database, collection, model, queries passing a subscriber function with the same identity more than once

### Internal

- Fixed broken adapter tests

## 0.15.1, 0.16.1-fix, 0.16.2 - 2020-06-03

This is a security patch for a vulnerability that could cause maliciously crafted record IDs to
cause all or some of user's data to be deleted. More information available via GitHub security advisory

## 0.16.1 - 2020-05-18

### Changes

- `Database.unsafeResetDatabase()` is now less unsafe — more application bugs are being caught

### Fixes

- [iOS] Fix build in apps using Flipper
- [Typescript] Added type definition for `setGenerator`.
- [Typescript] Fixed types of decorators.
- [Typescript] Add Tests to test Types.
- Fixed typo in learn-to-use docs.
- [Typescript] Fixed types of changes.

### Internal

- [SQLite] Infrastruture for a future JSI adapter has been added

## 0.16 - 2020-03-06

### ⚠️ Breaking

- `experimentalUseIncrementalIndexedDB` has been renamed to `useIncrementalIndexedDB`

#### Low breakage risk

- [adapters] Adapter API has changed from returning Promise to taking callbacks as the last argument. This won't affect you unless you call on adapter methods directly. `database.adapter` returns a new `DatabaseAdapterCompat` which has the same shape as old adapter API. You can use `database.adapter.underlyingAdapter` to get back `SQLiteAdapter` / `LokiJSAdapter`
- [Collection] `Collection.fetchQuery` and `Collection.fetchCount` are removed. Please use `Query.fetch()` and `Query.fetchCount()`.

### New features

- [SQLiteAdapter] [iOS] Add new `synchronous` option to adapter: `new SQLiteAdapter({ ..., synchronous: true })`.
  When enabled, database operations will block JavaScript thread. Adapter actions will resolve in the
  next microtask, which simplifies building flicker-free interfaces. Adapter will fall back to async
  operation when synchronous adapter is not available (e.g. when doing remote debugging)
- [LokiJS] Added new `onQuotaExceededError?: (error: Error) => void` option to `LokiJSAdapter` constructor.
  This is called when underlying IndexedDB encountered a quota exceeded error (ran out of allotted disk space for app)
  This means that app can't save more data or that it will fall back to using in-memory database only
  Note that this only works when `useWebWorker: false`

### Changes

- [Performance] Watermelon internals have been rewritten not to rely on Promises and allow some fetch/observe calls to resolve synchronously. Do not rely on this -- external API is still based on Rx and Promises and may resolve either asynchronously or synchronously depending on capabilities. This is meant as a internal performance optimization only for the time being.
- [LokiJS] [Performance] Improved worker queue implementation for performance
- [observation] Refactored observer implementations for performance

### Fixes

- Fixed a possible cause for "Record ID xxx#yyy was sent over the bridge, but it's not cached" error
- [LokiJS] Fixed an issue preventing database from saving when using `experimentalUseIncrementalIndexedDB`
- Fixed a potential issue when using `database.unsafeResetDatabase()`
- [iOS] Fixed issue with clearing database under experimental synchronous mode

### New features (Experimental)

- [Model] Added experimental `model.experimentalSubscribe((isDeleted) => { ... })` method as a vanilla JS alternative to Rx based `model.observe()`. Unlike the latter, it does not notify the subscriber immediately upon subscription.
- [Collection] Added internal `collection.experimentalSubscribe((changeSet) => { ... })` method as a vanilla JS alternative to Rx based `collection.changes` (you probably shouldn't be using this API anyway)
- [Database] Added experimental `database.experimentalSubscribe(['table1', 'table2'], () => { ... })` method as a vanilla JS alternative to Rx-based `database.withChangesForTables()`. Unlike the latter, `experimentalSubscribe` notifies the subscriber only once after a batch that makes a change in multiple collections subscribed to. It also doesn't notify the subscriber immediately upon subscription, and doesn't send details about the changes, only a signal.
- Added `experimentalDisableObserveCountThrottling()` to `@nozbe/watermelondb/observation/observeCount` that globally disables count observation throttling. We think that throttling on WatermelonDB level is not a good feature and will be removed in a future release - and will be better implemented on app level if necessary
- [Query] Added experimental `query.experimentalSubscribe(records => { ... })`, `query.experimentalSubscribeWithColumns(['col1', 'col2'], records => { ... })`, and `query.experimentalSubscribeToCount(count => { ... })` methods

## 0.15 - 2019-11-08

### Highlights

This is a **massive** new update to WatermelonDB! 🍉

- **Up to 23x faster sync**. You heard that right. We've made big improvements to performance.
  In our tests, with a massive sync (first login, 45MB of data / 65K records) we got a speed up of:

  - 5.7s -> 1.2s on web (5x)
  - 142s -> 6s on iOS (23x)

  Expect more improvements in the coming releases!

- **Improved LokiJS adapter**. Option to disable web workers, important Safari 13 fix, better performance,
  and now works in Private Modes. We recommend adding `useWebWorker: false, experimentalUseIncrementalIndexedDB: true` options to the `LokiJSAdapter` constructor to take advantage of the improvements, but please read further changelog to understand the implications of this.
- **Raw SQL queries** now available on iOS and Android thanks to the community
- **Improved TypeScript support** — thanks to the community

### ⚠️ Breaking

- Deprecated `bool` schema column type is removed -- please change to `boolean`
- Experimental `experimentalSetOnlyMarkAsChangedIfDiffers(false)` API is now removed

### New featuers

- [Collection] Add `Collection.unsafeFetchRecordsWithSQL()` method. You can use it to fetch record using
  raw SQL queries on iOS and Android. Please be careful to avoid SQL injection and other pitfalls of
  raw queries
- [LokiJS] Introduces new `new LokiJSAdapter({ ..., experimentalUseIncrementalIndexedDB: true })` option.
  When enabled, database will be saved to browser's IndexedDB using a new adapter that only saves the
  changed records, instead of the entire database.

  **This works around a serious bug in Safari 13** (https://bugs.webkit.org/show_bug.cgi?id=202137) that causes large
  databases to quickly balloon to gigabytes of temporary trash

  This also improves performance of incremental saves, although initial page load or very, very large saves
  might be slightly slower.

  This is intended to become the new default option, but it's not backwards compatible (if enabled, old database
  will be lost). **You're welcome to contribute an automatic migration code.**

  Note that this option is still experimental, and might change in breaking ways at any time.

- [LokiJS] Introduces new `new LokiJSAdapter({ ..., useWebWorker: false })` option. Before, web workers
  were always used with `LokiJSAdapter`. Although web workers may have some performance benefits, disabling them
  may lead to lower memory consumption, lower latency, and easier debugging. YMMV.
- [LokiJS] Added `onIndexedDBVersionChange` option to `LokiJSAdapter`. This is a callback that's called
  when internal IDB version changed (most likely the database was deleted in another browser tab).
  Pass a callback to force log out in this copy of the app as well. Note that this only works when
  using incrementalIDB and not using web workers
- [Model] Add `Model._dangerouslySetRawWithoutMarkingColumnChange()` method. You probably shouldn't use it,
  but if you know what you're doing and want to live-update records from server without marking record as updated,
  this is useful
- [Collection] Add `Collection.prepareCreateFromDirtyRaw()`
- @json decorator sanitizer functions take an optional second argument, with a reference to the model

### Fixes

- Pinned required `rambdax` version to 2.15.0 to avoid console logging bug. In a future release we will switch to our own fork of `rambdax` to avoid future breakages like this.

### Improvements

- [Performance] Make large batches a lot faster (1.3s shaved off on a 65K insert sample)
- [Performance] [iOS] Make large batch inserts an order of magnitude faster
- [Performance] [iOS] Make encoding very large queries (with thousands of parameters) 20x faster
- [Performance] [LokiJS] Make batch inserts faster (1.5s shaved off on a 65K insert sample)
- [Performance] [LokiJS] Various performance improvements
- [Performance] [Sync] Make Sync faster
- [Performance] Make observation faster
- [Performance] [Android] Make batches faster
- Fix app glitches and performance issues caused by race conditions in `Query.observeWithColumns()`
- [LokiJS] Persistence adapter will now be automatically selected based on availability. By default,
  IndexedDB is used. But now, if unavailable (e.g. in private mode), ephemeral memory adapter will be used.
- Disabled console logs regarding new observations (it never actually counted all observations) and
  time to query/count/batch (the measures were wildly inaccurate because of asynchronicity - actual
  times are much lower)
- [withObservables] Improved performance and debuggability (update withObservables package separately)
- Improved debuggability of Watermelon -- shortened Rx stacks and added function names to aid in understanding
  call stacks and profiles
- [adapters] The adapters interface has changed. `query()` and `count()` methods now receive a `SerializedQuery`, and `batch()` now takes `TableName<any>` and `RawRecord` or `RecordId` instead of `Model`.
- [Typescript] Typing improvements
  - Added 3 missing properties `collections`, `database` and `asModel` in Model type definition.
  - Removed optional flag on `actionsEnabled` in the Database constructor options since its mandatory since 0.13.0.
  - fixed several further typing issues in Model, Relation and lazy decorator
- Changed how async functions are transpiled in the library. This could break on really old Android phones
  but shouldn't matter if you use latest version of React Native. Please report an issue if you see a problem.
- Avoid `database` prop drilling in the web demo

## 0.14.1 - 2019-08-31

Hotfix for rambdax crash

- [Schema] Handle invalid table schema argument in appSchema
- [withObservables] Added TypeScript support ([changelog](https://github.com/Nozbe/withObservables/blob/master/CHANGELOG.md))
- [Electron] avoid `Uncaught ReferenceError: global is not defined` in electron runtime ([#453](https://github.com/Nozbe/WatermelonDB/issues/453))
- [rambdax] Replaces `contains` with `includes` due to `contains` deprecation https://github.com/selfrefactor/rambda/commit/1dc1368f81e9f398664c9d95c2efbc48b5cdff9b#diff-04c6e90faac2675aa89e2176d2eec7d8R2209

## 0.14.0 - 2019-08-02

### New features

- [Query] Added support for `notLike` queries 🎉
- [Actions] You can now batch delete record with all descendants using experimental functions `experimentalMarkAsDeleted` or `experimentalDestroyPermanently`

## 0.13.0 - 2019-07-18

### ⚠️ Breaking

- [Database] It is now mandatory to pass `actionsEnabled:` option to Database constructor.
  It is recommended that you enable this option:

  ```js
  const database = new Database({
    adapter: ...,
    modelClasses: [...],
    actionsEnabled: true
  })
  ```

  See `docs/Actions.md` for more details about Actions. You can also pass `false` to maintain
  backward compatibility, but this option **will be removed** in a later version

- [Adapters] `migrationsExperimental` prop of `SQLiteAdapter` and `LokiJSAdapter` has been renamed
  to `migrations`.

### New features

- [Actions] You can now batch deletes by using `prepareMarkAsDeleted` or `prepareDestroyPermanently`
- [Sync] Performance: `synchronize()` no longer calls your `pushChanges()` function if there are no
  local changes to push. This is meant to save unnecessary network bandwidth. ⚠️ Note that this
  could be a breaking change if you rely on it always being called
- [Sync] When setting new values to fields on a record, the field (and record) will no longer be
  marked as changed if the field's value is the same. This is meant to improve performance and avoid
  unnecessary code in the app. ⚠️ Note that this could be a breaking change if you rely on the old
  behavior. For now you can import `experimentalSetOnlyMarkAsChangedIfDiffers` from
  `@nozbe/watermelondb/Model/index` and call if with `(false)` to bring the old behavior back, but
  this will be removed in the later version -- create a new issue explaining why you need this
- [Sync] Small perf improvements

### Improvements

- [Typescript] Improved types for SQLite and LokiJS adapters, migrations, models, the database and the logger.

## 0.12.3 - 2019-05-06

### Changes

- [Database] You can now update the random id schema by importing
  `import { setGenerator } from '@nozbe/watermelondb/utils/common/randomId'` and then calling `setGenerator(newGenenerator)`.
  This allows WatermelonDB to create specific IDs for example if your backend uses UUIDs.
- [Typescript] Type improvements to SQLiteAdapter and Database
- [Tests] remove cleanup for react-hooks-testing-library@0.5.0 compatibility

## 0.12.2 - 2019-04-19

### Fixes

- [TypeScript] 'Cannot use 'in' operator to search for 'initializer'; decorator fix

### Changes

- [Database] You can now pass falsy values to `Database.batch(...)` (false, null, undefined). This is
  useful in keeping code clean when doing operations conditionally. (Also works with `model.batch(...)`)
- [Decorators]. You can now use `@action` on methods of any object that has a `database: Database`
  property, and `@field @children @date @relation @immutableRelation @json @text @nochange` decorators on
  any object with a `asModel: Model` property.
- [Sync] Adds a temporary/experimental `_unsafeBatchPerCollection: true` flag to `synchronize()`. This
  causes server changes to be committed to database in multiple batches, and not one. This is NOT preferred
  for reliability and performance reasons, but it works around a memory issue that might cause your app
  to crash on very large syncs (>20,000 records). Use this only if necessary. Note that this option
  might be removed at any time if a better solution is found.

## 0.12.1 - 2019-04-01

### ⚠️ Hotfix

- [iOS] Fix runtime crash when built with Xcode 10.2 (Swift 5 runtime).

  **⚠️ Note**: You need to upgrade to React Native 0.59.3 for this to work. If you can't upgrade
  React Native yet, either stick to Xcode 10.1 or manually apply this patch:
  https://github.com/Nozbe/WatermelonDB/pull/302/commits/aa4e08ad0fa55f434da2a94407c51fc5ff18e506

### Changes

- [Sync] Adds basic sync logging capability to Sync. Pass an empty object to `synchronize()` to populate it with diagnostic information:
  ```js
  const log = {}
  await synchronize({ database, log, ...})
  console.log(log.startedAt)
  ```
  See Sync documentation for more details.

## 0.12.0 - 2019-03-18

### Added

- [Hooks] new `useDatabase` hook for consuming the Database Context:
  ```js
  import { useDatabase } from '@nozbe/watermelondb/hooks'
  const Component = () => {
    const database = useDatabase()
  }
  ```
- [TypeScript] added `.d.ts` files. Please note: TypeScript definitions are currently incomplete and should be used as a guide only. **PRs for improvements would be greatly appreciated!**

### Performance

- Improved UI performance by consolidating multiple observation emissions into a single per-collection batch emission when doing batch changes

## 0.11.0 - 2019-03-12

### Breaking

- ⚠️ Potentially BREAKING fix: a `@date` field now returns a Jan 1, 1970 date instead of `null` if the field's raw value is `0`.
  This is considered a bug fix, since it's unexpected to receive a `null` from a getter of a field whose column schema doesn't say `isOptional: true`.
  However, if you relied on this behavior, this might be a breaking change.
- ⚠️ BREAKING: `Database.unsafeResetDatabase()` now requires that you run it inside an Action

### Bug fixes

- [Sync] Fixed an issue where synchronization would continue running despite `unsafeResetDatabase` being called
- [Android] fix compile error for kotlin 1.3+

### Other changes

- Actions are now aborted when `unsafeResetDatabase()` is called, making reseting database a little bit safer
- Updated demo dependencies
- LokiJS is now a dependency of WatermelonDB (although it's only required for use on the web)
- [Android] removed unused test class
- [Android] updated ktlint to `0.30.0`

## 0.10.1 - 2019-02-12

### Changes

- [Android] Changed `compile` to `implementation` in Library Gradle file
  - ⚠️ might break build if you are using Android Gradle Plugin <3.X
- Updated `peerDependency` `react-native` to `0.57.0`
- [Sync] Added `hasUnsyncedChanges()` helper method
- [Sync] Improved documentation for backends that can't distinguish between `created` and `updated` records
- [Sync] Improved diagnostics / protection against edge cases
- [iOS] Add missing `header search path` to support **ejected** expo project.
- [Android] Fix crash on android < 5.0
- [iOS] `SQLiteAdapter`'s `dbName` path now allows you to pass an absolute path to a file, instead of a name
- [Web] Add adaptive layout for demo example with smooth scrolling for iOS

## 0.10.0 - 2019-01-18

### Breaking

- **BREAKING:** Table column `last_modified` is no longer automatically added to all database tables. If
  you don't use this column (e.g. in your custom sync code), you don't have to do anything.
  If you do, manually add this column to all table definitions in your Schema:
  ```
  { name: 'last_modified', type: 'number', isOptional: true }
  ```
  **Don't** bump schema version or write a migration for this.

### New

- **Actions API**.

  This was actually released in 0.8.0 but is now documented.
  With Actions enabled, all create/update/delete/batch calls must be wrapped in an Action.

  To use Actions, call `await database.action(async () => { /* perform writes here */ }`, and in
  Model instance methods, you can just decorate the whole method with `@action`.

  This is necessary for Watermelon Sync, and also to enable greater safety and consistency.

  To enable actions, add `actionsEnabled: true` to `new Database({ ... })`. In a future release this
  will be enabled by default, and later, made mandatory.

  See documentation for more details.

- **Watermelon Sync Adapter** (Experimental)

  Added `synchronize()` function that allows you to easily add full synchronization capabilities to
  your Watermelon app. You only need to provide two fetch calls to your remote server that conforms
  to Watermelon synchronization protocol, and all the client-side processing (applying remote changes,
  resolving conflicts, finding local changes, and marking them as synced) is done by Watermelon.

  See documentation for more details.

- **Support caching for non-global IDs at Native level**

## 0.9.0 - 2018-11-23

### New

- Added `Q.like` - you can now make queries similar to SQL `LIKE`

## 0.8.0 - 2018-11-16

### New

- Added `DatabaseProvider` and `withDatabase` Higher-Order Component to reduce prop drilling
- Added experimental Actions API. This will be documented in a future release.

### Fixes

- Fixes crash on older Android React Native targets without `jsc-android` installed

## 0.7.0 - 2018-10-31

### Deprecations

- [Schema] Column type 'bool' is deprecated — change to 'boolean'

### New

- Added support for Schema Migrations. See documentation for more details.
- Added fundaments for integration of Danger with Jest

### Changes

- Fixed "dependency cycle" warning
- [SQLite] Fixed rare cases where database could be left in an unusable state (added missing transaction)
- [Flow] Fixes `oneOf()` typing and some other variance errors
- [React Native] App should launch a little faster, because schema is only compiled on demand now
- Fixed typos in README.md
- Updated Flow to 0.85

## 0.6.2 - 2018-10-04

### Deprecations

- The `@nozbe/watermelondb/babel/cjs` / `@nozbe/watermelondb/babel/esm` Babel plugin that ships with Watermelon is deprecated and no longer necessary. Delete it from your Babel config as it will be removed in a future update

### Refactoring

- Removed dependency on `async` (Web Worker should be ~30KB smaller)
- Refactored `Collection` and `simpleObserver` for getting changes in an array and also adds CollectionChangeTypes for differentiation between different changes
- Updated dependencies
- Simplified build system by using relative imports
- Simplified build package by outputting CJS-only files

## 0.6.1 - 2018-09-20

### Added

- Added iOS and Android integration tests and lint checks to TravisCI

### Changed

- Changed Flow setup for apps using Watermelon - see docs/Advanced/Flow.md
- Improved documentation, and demo code
- Updated dependencies

### Fixed

- Add quotes to all names in sql queries to allow keywords as table or column names
- Fixed running model tests in apps with Watermelon in the loop
- Fixed Flow when using Watermelon in apps

## 0.6.0 - 2018-09-05

Initial release of WatermelonDB


================================================
FILE: CONTRIBUTING.md
================================================
<img src="https://github.com/Nozbe/WatermelonDB/raw/master/assets/needyou.jpg" alt="We need you" width="220" />

**WatermelonDB is an open-source project and it needs your help to thrive!**

If there's a missing feature, a bug, or other improvement you'd like, we encourage you to contribute! Feel free to open an issue to get some guidance and see [Contributing guide](./CONTRIBUTING.md) for details about project setup, testing, etc.

If you're just getting started, see [good first issues](https://github.com/Nozbe/WatermelonDB/issues?q=is%3Aopen+is%3Aissue+label%3A%22good+first+issue%22) that are easy to contribute to. If you make a non-trivial contribution, email me, and I'll send you a nice 🍉 sticker!

If you make or are considering making an app using WatermelonDB, please let us know!

<br />


## Before you send a pull request

1. Did you add or changed some functionality?

   Add (or modify) tests!
2. Check if the automated tests pass
   ```bash
   yarn ci:check
   ```
3. Format the files you changed
   ```bash
   yarn prettier
   ```
4. Mark your changes in CHANGELOG

   Put a one-line description of your change under Added/Changed section. See [Keep a Changelog](https://keepachangelog.com/en/1.0.0/).

## Running Watermelon in development

### Download source and dependencies

```bash
git clone https://github.com/Nozbe/WatermelonDB.git
cd WatermelonDB
yarn
```

### Developing Watermelon alongside your app

To work on Watermelon code in the sandbox of your app:

```bash
yarn dev
```

This will create a `dev/` folder in Watermelon and observe changes to source files (only JavaScript files) and recompile them as needed.

Then in your app:

```bash
cd node_modules/@nozbe
rm -fr watermelondb
ln -s path-to-watermelondb/dev watermelondb
```

**This will work in Webpack but not in Metro** (React Native). Metro doesn't follow symlinks. Instead, you can compile WatermelonDB directly to your project:

```bash
DEV_PATH="/path/to/your/app/node_modules/@nozbe/watermelondb" yarn dev
```

### Running tests

This runs Jest, ESLint and Flow:

```bash
yarn ci:check
```

You can also run them separately:

```bash
yarn test
yarn eslint
yarn flow
```

### Editing files

We recommend VS Code with ESLint, Flow, and Prettier (with prettier-eslint enabled) plugins for best development experience. (To see lint/type issues inline + have automatic reformatting of code)

## Editing native code

In `native/ios` and `native/android` you'll find the native bridge code for React Native.

It's recommended to use the latest stable version of Xcode / Android Studio to work on that code.

### Integration tests

If you change native bridge code or `adapter/sqlite` code, it's recommended to run integration tests that run the entire Watermelon code with SQLite and React Native in the loop:

```bash
yarn test:ios
yarn test:android
```

### Running tests manualy

- For iOS open the `native/iosTest/WatermelonTester.xcworkspace` project and hit Cmd+U.
- For Android open `native/androidTest` in AndroidStudio navigate to `app/src/androidTest/java/com.nozbe.watermelonTest/BridgeTest` and click green arrow near `class BridgeTest`

### Native linting

Make sure the native code you're editing conforms to Watermelon standards:

```bash
yarn ktlint
```

### Native code troubleshooting

1. If `test:ios` fails in terminal:
- Run tests in Xcode first before running from terminal
- Make sure you have the right version of Xcode CLI tools set in Preferences -> Locations
1. Make sure you're on the most recent stable version of Xcode / Android Studio
1. Remove native caches:
- Xcode: `~/Library/Developer/Xcode/DerivedData`:
- Android: `.gradle` and `build` folders in `native/android` and `native/androidTest`
- `node_modules` (because of React Native precompiled third party libraries)




================================================
FILE: Gemfile
================================================
source 'https://rubygems.org'

ruby ">= 2.6.10"

gem 'pry'

# Cocoapods 1.15 introduced a bug which break the build. (RN 0.72) We will remove the upper
# bound in the template on Cocoapods with next React Native release.
gem 'cocoapods', '>= 1.13', '< 1.15'
gem 'activesupport', '>= 6.1.7.5', '< 7.1.0' # temporary?
gem 'xcodeproj', '< 1.26.0'

# NOTE: TEMPORARY, for darwin-arm64 compatibility
gem 'ffi', '>1.14.2'
gem 'ethon', git: 'https://github.com/radex/ethon.git', ref: '301517d087830569985eb3945fa5a6c74866863f'


================================================
FILE: LICENSE
================================================
MIT License

Copyright (c) Nozbe

Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:

The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.

THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
SOFTWARE.


================================================
FILE: README.md
================================================
<p align="center">
  <img src="https://github.com/Nozbe/WatermelonDB/raw/master/assets/logo-horizontal2.png" alt="WatermelonDB" width="539" />
</p>

<h4 align="center">
  A reactive database framework
</h4>

<p align="center">
  Build powerful React and React Native apps that scale from hundreds to tens of thousands of records and remain <em>fast</em> ⚡️
</p>

<p align="center">
  <a href="https://github.com/Nozbe/WatermelonDB/blob/master/LICENSE">
    <img src="https://img.shields.io/badge/License-MIT-blue.svg" alt="MIT License"/>
  </a>

  <a href="https://www.npmjs.com/package/@nozbe/watermelondb">
    <img src="https://img.shields.io/npm/v/@nozbe/watermelondb.svg" alt="npm"/>
  </a>

  <a href="https://gurubase.io/g/watermelondb">
    <img src="https://img.shields.io/badge/Gurubase-Ask%20WatermelonDB%20Guru-006BFF" alt="Gurubase"/>
  </a>
</p>

|   | WatermelonDB |
| - | ------------ |
| ⚡️ | **Launch your app instantly** no matter how much data you have |
| 📈 | **Highly scalable** from hundreds to tens of thousands of records |
| 😎 | **Lazy loaded**. Only load data when you need it |
| 🔄 | **Offline-first.** [Sync](https://watermelondb.dev/docs/Sync/Intro) with your own backend |
| 📱 | **Multiplatform**. iOS, Android, Windows, web, and Node.js |
| ⚛️ | **Optimized for React.** Easily plug data into components |
| 🧰 | **Framework-agnostic.** Use JS API to plug into other UI frameworks |
| ⏱ | **Fast.** And getting faster with every release! |
| ✅ | **Proven.** Powers [Nozbe](https://nozbe.com/teams) since 2017 (and [many others](#who-uses-watermelondb)) |
| ✨ | **Reactive.** (Optional) [RxJS](https://github.com/ReactiveX/rxjs) API |
| 🔗 | **Relational.** Built on rock-solid [SQLite](https://www.sqlite.org) foundation |
| ⚠️ | **Static typing** with [Flow](https://flow.org) or [TypeScript](https://typescriptlang.org) |

## Why Watermelon?

**WatermelonDB** is a new way of dealing with user data in React Native and React web apps.

It's optimized for building **complex applications** in React Native, and the number one goal is **real-world performance**. In simple words, _your app must launch fast_.

For simple apps, using Redux or MobX with a persistence adapter is the easiest way to go. But when you start scaling to thousands or tens of thousands of database records, your app will now be slow to launch (especially on slower Android devices). Loading a full database into JavaScript is expensive!

Watermelon fixes it **by being lazy**. Nothing is loaded until it's requested. And since all querying is performed directly on the rock-solid [SQLite database](https://www.sqlite.org/index.html) on a separate native thread, most queries resolve in an instant.

But unlike using SQLite directly, Watermelon is **fully observable**. So whenever you change a record, all UI that depends on it will automatically re-render. For example, completing a task in a to-do app will re-render the task component, the list (to reorder), and all relevant task counters. [**Learn more**](https://www.youtube.com/watch?v=UlZ1QnFF4Cw).

| <a href="https://www.youtube.com/watch?v=UlZ1QnFF4Cw"><img src="https://github.com/Nozbe/WatermelonDB/raw/master/assets/watermelon-talk-thumbnail.jpg" alt="React Native EU: Next-generation React Databases" width="300" /></a> |
| ---- |
| <p align="center"><a href="https://www.youtube.com/watch?v=UlZ1QnFF4Cw">📺 <strong>Next-generation React databases</strong><br/>(a talk about WatermelonDB)</a></p> |

## Usage

**Quick (over-simplified) example:** an app with posts and comments.

First, you define Models:

```js
class Post extends Model {
  @field('name') name
  @field('body') body
  @children('comments') comments
}

class Comment extends Model {
  @field('body') body
  @field('author') author
}
```

Then, you connect components to the data:

```js
const Comment = ({ comment }) => (
  <View style={styles.commentBox}>
    <Text>{comment.body} — by {comment.author}</Text>
  </View>
)

// This is how you make your app reactive! ✨
const enhance = withObservables(['comment'], ({ comment }) => ({
  comment,
}))
const EnhancedComment = enhance(Comment)
```

And now you can render the whole Post:

```js
const Post = ({ post, comments }) => (
  <View>
    <Text>{post.name}</Text>
    <Text>Comments:</Text>
    {comments.map(comment =>
      <EnhancedComment key={comment.id} comment={comment} />
    )}
  </View>
)

const enhance = withObservables(['post'], ({ post }) => ({
  post,
  comments: post.comments
}))
```

The result is fully reactive! Whenever a post or comment is added, changed, or removed, the right components **will automatically re-render** on screen. Doesn't matter if a change occurred in a totally different part of the app, it all just works out of the box!

### ➡️ **Learn more:** [see full documentation](https://nozbe.github.io/WatermelonDB/)

## Who uses WatermelonDB

  <a href="https://nozbe.com/?c=watermelon">
    <img src="https://github.com/Nozbe/WatermelonDB/raw/master/assets/apps/nozbe.png" alt="Nozbe Teams" width="300" />
  </a>

  <br/>

  <a href="https://capmo.de">
    <img src="https://github.com/Nozbe/WatermelonDB/raw/master/assets/apps/capmo.png" alt="CAPMO" width="300" />
  </a>

  <br/>

  <a href="https://mattermost.com/">
    <img src="https://github.com/Nozbe/WatermelonDB/raw/master/assets/apps/mattermost.png" alt="Mattermost" width="300" />
  </a>

  <br/>

  <a href="https://rocket.chat/">
    <img src="https://github.com/Nozbe/WatermelonDB/raw/master/assets/apps/rocketchat.png" alt="Rocket Chat" width="300" />
  </a>

  <br/>

  <a href="https://steady.health">
    <img src="https://github.com/Nozbe/WatermelonDB/raw/master/assets/apps/steady.png" alt="Steady" width="150"/>
  </a>

  <br/>

  <a href="https://aerobotics.com">
    <img src="https://github.com/Nozbe/WatermelonDB/raw/master/assets/apps/aerobotics.png" alt="Aerobotics" width="300" />
  </a>

  <br/>

  <a href="https://smashappz.com">
    <img src="https://github.com/Nozbe/WatermelonDB/raw/master/assets/apps/smashappz.jpg" alt="Smash Appz" width="300" />
  </a>

  <br/>

  <a href="https://halogo.com.au/">
    <img src="https://github.com/Nozbe/WatermelonDB/raw/master/assets/apps/halogo_logo.png" alt="HaloGo" width="300" />
  </a>

  <br/>

  <a href="https://sportsrecruits.com/">
    <img src="https://github.com/Nozbe/WatermelonDB/raw/master/assets/apps/sportsrecruits-logo.png" alt="SportsRecruits" width="300" />
  </a>

  <br/>

  <a href="https://chatable.io/">
    <img src="https://github.com/Nozbe/WatermelonDB/raw/master/assets/apps/chatable_logo.png" alt="Chatable" width="300" />
  </a>

  <br/>

  <a href="https://todorant.com/">
    <img src="https://github.com/Nozbe/WatermelonDB/raw/master/assets/apps/todorant-logo.png" alt="Todorant" width="300" />
  </a>

  <br/>

  <a href="https://blastworkout.app/">
    <img src="https://github.com/Nozbe/WatermelonDB/raw/master/assets/apps/blastworkout-logo.png" alt="Blast Workout" width="300" />
  </a>

  <br/>

  <a href="https://dayful.app/">
    <img src="https://github.com/Nozbe/WatermelonDB/raw/master/assets/apps/dayful.png" alt="Dayful" width="300" />
  </a>

  <br/>

  <a href="https://learnthewords.app/">
    <img src="https://github.com/Nozbe/WatermelonDB/raw/master/assets/apps/learn-the-words.png" alt="Learn The Words" width="300" />
  </a>

  <br/>

  <a href="https://ezypack.app/">
    <img src="https://github.com/Nozbe/WatermelonDB/raw/master/assets/apps/ezypack.png" alt="ezypack" width="300" />
  </a>

  <br/>

_Does your company or app use 🍉? Open a pull request and add your logo/icon with link here!_

## Contributing

<img src="https://github.com/Nozbe/WatermelonDB/raw/master/assets/needyou.jpg" alt="We need you" width="220" />

**WatermelonDB is an open-source project and it needs your help to thrive!**

If there's a missing feature, a bug, or other improvement you'd like, we encourage you to contribute! Feel free to open an issue to get some guidance and see [Contributing guide](./CONTRIBUTING.md) for details about project setup, testing, etc.

If you're just getting started, see [good first issues](https://github.com/Nozbe/WatermelonDB/issues?q=is%3Aopen+is%3Aissue+label%3A%22good+first+issue%22) that are easy to contribute to. If you make a non-trivial contribution, email me, and I'll send you a nice 🍉 sticker!

If you make or are considering making an app using WatermelonDB, please let us know!

## Author and license

**WatermelonDB** was created by [@Nozbe](https://github.com/Nozbe).

**WatermelonDB's** main author and maintainer is [Radek Pietruszewski](https://github.com/radex) ([website](https://radex.io) ⋅ [𝕏 (Twitter)](https://twitter.com/radexp))

[See all contributors](https://github.com/Nozbe/WatermelonDB/graphs/contributors).

WatermelonDB is available under the MIT license. See the [LICENSE file](https://github.com/Nozbe/WatermelonDB/LICENSE) for more info.


================================================
FILE: SECURITY.md
================================================
# Reporting Security Issues

If you believe you've found a security vulnerability in WatermelonDB, let us know right away.

More details on how to responsibly disclose issues: https://nozbe.com/bug-bounty/

## How WatermelonDB reports security vulnerabilities

If vulnerabilities are found, we'll post security advisories via GitHub once a confirmed patch is available.

We may choose to send a heads-up to a select list of higher-profile projects/organizations to alert them about a vulnerability before the public. Inclusion into this list is entirely at our own discretion. If we do send a heads-up before a public patch, we'll include the least amount of detail possible - only enough to work around an issue.

If we determine that it's in the best interest of all WatermelonDB users, we may choose to advise users to update to a new version of WatermelonDB or apply a workaround without revealing all details about the vulnerability. This may happen if we believe there's a very serious issue that's easy to patch but difficult to discover. If we do so, we will post a detailed explanation after a few weeks.


================================================
FILE: WatermelonDB.podspec
================================================
require "json"

package = JSON.parse(File.read(File.join(__dir__, 'package.json')))

Pod::Spec.new do |s|
  s.name         = "WatermelonDB"
  s.version      = package["version"]
  s.summary      = package["description"]
  s.description  = package["description"]
  s.homepage     = package["homepage"]
  s.license      = package["license"]
  s.author       = { "author" => package["author"] }
  s.platforms    = { :ios => "12.0", :tvos => "12.0" }
  s.source = { :git => "https://github.com/Nozbe/WatermelonDB.git", :tag => "v#{s.version}" }
  s.source_files = "native/ios/**/*.{h,m,mm,swift,c,cpp}", "native/shared/**/*.{h,c,cpp}"
  s.public_header_files = [
    # FIXME: I don't think we should be exporting all headers as public
    # (although that is CocoaPods default behavior)
    # but this is needed for WatermelonDB to work in use_frameworks! mode
    # 'native/ios/**/*.h',
    'native/ios/WatermelonDB/JSIInstaller.h',
    'native/ios/WatermelonDB/WatermelonDB.h',
  ]
  s.pod_target_xcconfig = {
    # FIXME: This is a workaround for broken build in use_frameworks mode
    # I don't think this is a correct fix, but… seems to work?
    # 'OTHER_SWIFT_FLAGS' => '-Xcc -Wno-error=non-modular-include-in-framework-module'
  }
  s.requires_arc = true
  # simdjson is annoyingly slow without compiler optimization, disable for debugging
  s.compiler_flags = '-Os'

  s.dependency "React"

  s.libraries = 'sqlite3'

  # NOTE: This dependency doesn't seem to be needed anymore (tested on RN 0.66, 0.71), file an issue
  # if this causes issues for you
  # s.dependency "React-jsi"

  # NOTE: NPM-vendored @nozbe/simdjson must be used, not the CocoaPods version
  s.dependency "simdjson"
end


================================================
FILE: babel.config.js
================================================
const plugins = [
  [
    '@babel/plugin-transform-runtime',
    {
      helpers: true,
      // regenerator: true,
    },
  ],
  [
    '@babel/plugin-transform-modules-commonjs',
    {
      loose: true, // improves speed & code size; unlikely to be a problem
      strict: false,
      strictMode: true,
      allowTopLevelThis: true,
      // this would improve speed&code size but breaks 3rd party code. can we apply it to our paths only?
      // (same with struct: true)
      // noInterop: true,
    },
  ],
  ['@babel/plugin-proposal-decorators', { legacy: true }],
  '@babel/plugin-transform-flow-strip-types',
  ['@babel/plugin-proposal-class-properties', { loose: true }],
  [
    '@babel/plugin-transform-classes',
    {
      loose: true, // spits out cleaner and faster output
    },
  ],
  '@babel/plugin-syntax-dynamic-import',
  '@babel/plugin-transform-block-scoping',
  '@babel/plugin-proposal-json-strings',
  '@babel/plugin-proposal-unicode-property-regex',
  // See http://incaseofstairs.com/six-speed/ for speed comparison between native and transpiled ES6
  '@babel/plugin-proposal-optional-chaining',
  ['@babel/plugin-proposal-private-methods', { loose: true }],
  '@babel/plugin-transform-template-literals',
  '@babel/plugin-transform-literals',
  '@babel/plugin-transform-function-name',
  '@babel/plugin-transform-arrow-functions',
  '@babel/plugin-proposal-nullish-coalescing-operator',
  '@babel/plugin-transform-shorthand-properties',
  '@babel/plugin-transform-spread',
  [
    '@babel/plugin-proposal-object-rest-spread',
    {
      // use fast Object.assign
      loose: true,
    },
  ],
  '@babel/plugin-transform-react-jsx',
  [
    '@babel/plugin-transform-computed-properties',
    {
      // 2-3x faster, unlikely to be an issue
      loose: true,
    },
  ],
  '@babel/plugin-transform-sticky-regex',
  '@babel/plugin-transform-unicode-regex',
  // TODO: fast-async is faster and cleaner, but causes a weird issue on older Android RN targets without jsc-android
  // '@babel/plugin-transform-async-to-generator',
  [
    // TODO: We can get this faster by tweaking with options, but have to test thoroughly...
    'module:fast-async',
    {
      spec: true,
    },
  ],
]

module.exports = {
  env: {
    development: {
      plugins,
    },
    production: {
      plugins: [
        ...plugins,
        'minify-flip-comparisons',
        'minify-guarded-expressions',
        'minify-dead-code-elimination',
      ],
    },
    test: {
      plugins: [...plugins, '@babel/plugin-syntax-jsx'],
    },
  },
}


================================================
FILE: docs-website/.gitignore
================================================
# Dependencies
/node_modules

# Production
/build

# Generated files
.docusaurus
.cache-loader

# Misc
.DS_Store
.env.local
.env.development.local
.env.test.local
.env.production.local

npm-debug.log*
yarn-debug.log*
yarn-error.log*


================================================
FILE: docs-website/README.md
================================================
# Website

This website is built using [Docusaurus 2](https://docusaurus.io/), a modern static website generator.

### Installation

```
$ yarn
```

### Local Development

```
$ yarn start
```

This command starts a local development server and opens up a browser window. Most changes are reflected live without having to restart the server.

### Build

```
$ yarn build
```

This command generates static content into the `build` directory and can be served using any static contents hosting service.

### Deployment

Using SSH:

```
$ USE_SSH=true yarn deploy
```

Not using SSH:

```
$ GIT_USER=<Your GitHub username> yarn deploy
```

If you are using GitHub pages for hosting, this command is a convenient way to build the website and push to the `gh-pages` branch.


================================================
FILE: docs-website/babel.config.js
================================================
module.exports = {
  presets: [require.resolve('@docusaurus/core/lib/babel/preset')],
};


================================================
FILE: docs-website/blog/2021-08-01-mdx-blog-post.mdx
================================================
---
slug: mdx-blog-post
title: MDX Blog Post
authors: [radex]
tags: [docusaurus]
---

Blog posts support [Docusaurus Markdown features](https://docusaurus.io/docs/markdown-features), such as [MDX](https://mdxjs.com/).

<!--truncate-->

:::tip

Use the power of React to create interactive blog posts.

```js
<button onClick={() => alert('button clicked!')}>Click me!</button>
```

<button onClick={() => alert('button clicked!')}>Click me!</button>

:::


================================================
FILE: docs-website/blog/authors.yml
================================================
radex:
  name: Radek Pietruszewski
  title: Maintainer of WatermelonDB
  url: https://github.com/radex
  image_url: https://avatars.githubusercontent.com/u/183747?v=4


================================================
FILE: docs-website/docs/docs/Advanced/AdvancedFields.md
================================================
# Advanced Fields

## `@json`

If you have a lot of metadata about a record (say, an object with many keys, or an array of values), you can use a `@json` field to contain that information in a single string column (serialized to JSON) instead of adding multiple columns or a relation to another table.

⚠️ This is an advanced feature that comes with downsides — make sure you really need it

First, add a string column to [the schema](../Schema.md):

```js
tableSchema({
  name: 'comments',
  columns: [
    { name: 'reactions', type: 'string' }, // You can add isOptional: true, if appropriate
  ],
})
```

Then in the Model definition:

```js
import { json } from '@nozbe/watermelondb/decorators'

class Comment extends Model {
  // ...
  @json('reactions', sanitizeReactions) reactions
}
```

Now you can set complex JSON values to a field:

```js
comment.update(() => {
  comment.reactions = ['up', 'down', 'down']
})
```

As the second argument, pass a **sanitizer function**. This is a function that receives whatever `JSON.parse()` returns for the serialized JSON, and returns whatever type you expect in your app. In other words, it turns raw, dirty, untrusted data (that might be missing, or malformed by a bug in previous version of the app) into trusted format.

The sanitizer might also receive `null` if the column is nullable, or `undefined` if the field doesn't contain valid JSON.

For example, if you need the field to be an array of strings, you can ensure it like so:

```js
const sanitizeReactions = rawReactions => {
  return Array.isArray(rawReactions) ? rawReactions.map(String) : []
}
```

If you don't want to sanitize JSON, pass an identity function:

```js
const sanitizeReactions = json => json
```

The sanitizer function takes an optional second argument, which is a reference to the model. This is useful is your sanitization logic depends on the other fields in the model.

**Warning about JSON fields**:

JSON fields go against relational, lazy nature of Watermelon, because **you can't query or count by the contents of JSON fields**. If you need or might need in the future to query records by some piece of data, don't use JSON.

Only use JSON fields when you need the flexibility of complex freeform data, or the speed of having metadata without querying another table, and you are sure that you won't need to query by those metadata.

## `@nochange`

For extra protection, you can mark fields as `@nochange` to ensure they can't be modified. Always put `@nochange` before `@field` / `@date` / `@text`

```js
import { field, nochange } from '@nozbe/watermelondb/decorators'

class User extends Model {
  // ...
  @nochange @field('is_owner') isOwner
}
```

`user.isOwner` can only be set in the `collection.create()` block, but will throw an error if you try to set a new value in `user.update()` block.

### `@readonly`

Similar to `@nochange`, you can use the `@readonly` decorator to ensure a field cannot be set at all. Use this for [create/update tracking](./CreateUpdateTracking.md), but it might also be useful if you use Watermelon with a [Sync engine](../Sync/Intro.md) and a field can only be set by the server.

## Custom observable fields

You're in advanced [RxJS](https://github.com/ReactiveX/rxjs) territory now! You have been warned.

Say, you have a Post model that has many Comments. And a Post is considered to be "popular" if it has more than 10 comments.

You can add a "popular" badge to a Post component in two ways.

One is to simply observe how many comments there are [in the component](../Components.md):

```js
const enhance = withObservables(['post'], ({ post }) => ({
  post: post.observe(),
  commentCount: post.comments.observeCount()
}))
```

And in the `render` method, if `props.commentCount > 10`, show the badge.

Another way is to define an observable property on the Model layer, like so:

```js
import { distinctUntilChanged, map as map$ } from 'rxjs/operators'
import { lazy } from '@nozbe/watermelondb/decorators'

class Post extends Model {
  @lazy isPopular = this.comments.observeCount().pipe(
    map$(comments => comments > 10),
    distinctUntilChanged()
  )
}
```

And then you can directly connect this to the component:

```js
const enhance = withObservables(['post'], ({ post }) => ({
  isPopular: post.isPopular,
}))
```

`props.isPopular` will reflect whether or not the Post is popular. Note that this is fully observable, i.e. if the number of comments rises above/falls below the popularity threshold, the component will re-render. Let's break it down:

- `this.comments.observeCount()` - take the Observable number of comments
- `map$(comments => comments > 10)` - transform this into an Observable of boolean (popular or not)
- `distinctUntilChanged()` - this is so that if the comment count changes, but the popularity doesn't (it's still below/above 10), components won't be unnecessarily re-rendered
- `@lazy` - also for performance (we only define this Observable once, so we can re-use it for free)

Let's make this example more complicated. Say the post is **always** popular if it's marked as starred. So if `post.isStarred`, then we don't have to do unnecessary work of fetching comment count:

```js
import { of as of$ } from 'rxjs/observable/of'
import { distinctUntilChanged, map as map$ } from 'rxjs/operators'
import { lazy } from '@nozbe/watermelondb/decorators'

class Post extends Model {
  @lazy isPopular = this.observe().pipe(
    distinctUntilKeyChanged('isStarred'),
    switchMap(post =>
      post.isStarred ?
        of$(true) :
        this.comments.observeCount().pipe(map$(comments => comments > 10))
    ),
    distinctUntilChanged(),
  )
}
```

- `this.observe()` - if the Post changes, it might change its popularity status, so we observe it
- `this.comments.observeCount().pipe(map$(comments => comments > 10))` - this part is the same, but we only observe it if the post is starred
- `switchMap(post => post.isStarred ? of$(true) : ...)` - if the post is starred, we just return an Observable that emits `true` and never changes.
- `distinctUntilKeyChanged('isStarred')` - for performance, so that we don't re-subscribe to comment count Observable if the post changes (only if the `isStarred` field changes)
- `distinctUntilChanged()` - again, don't emit new values, if popularity doesn't change


================================================
FILE: docs-website/docs/docs/Advanced/CreateUpdateTracking.md
================================================
---
title: Automatic create/update tracking
hide_title: true
---

# Create/Update tracking

You can add per-table support for create/update tracking. When you do this, the Model will have information about when it was created, and when it was last updated.

:warning: **Note:** WatermelonDB automatically sets and persists the `created_at`/`updated_at` fields if they are present as _millisecond_ epoch's. If you intend to interact with these properties in any way you should always treat them as such.

### When to use this

**Use create tracking**:

- When you display to the user when a thing (e.g. a Post, Comment, Task) was created
- If you sort created items chronologically (Note that Record IDs are random strings, not auto-incrementing integers, so you need create tracking to sort chronologically)

**Use update tracking**:

- When you display to the user when a thing (e.g. a Post) was modified

**Notes**:
 - you _don't have to_ enable both create and update tracking. You can do either, both, or none.
 - In your model, these fields need to be called createdAt and updatedAt respectively.

### How to do this

**Step 1:** Add to the [schema](../Schema.md):

```js
tableSchema({
  name: 'posts',
  columns: [
    // other columns
    { name: 'created_at', type: 'number' },
    { name: 'updated_at', type: 'number' },
  ]
}),
```

**Step 2:** Add this to the Model definition:

```js
import { date, readonly } from '@nozbe/watermelondb/decorators'

class Post extends Model {
  // ...
  @readonly @date('created_at') createdAt
  @readonly @date('updated_at') updatedAt
}
```

Again, you can add just `created_at` column and field if you don't need update tracking.

### How this behaves

If you have the magic `createdAt` field defined on the Model, the current timestamp will be set when you first call `collection.create()` or `collection.prepareCreate()`. It will never be modified again.

If the magic `updatedAt` field is also defined, then after creation, `model.updatedAt` will have the same value as `model.createdAt`. Then every time you call `model.update()` or `model.prepareUpdate()`, `updatedAt` will be changed to the current timestamp.


================================================
FILE: docs-website/docs/docs/Advanced/Flow.md
================================================
---
title: Flow
hide_title: true
---

# Watermelon ❤️ Flow

Watermelon was developed with [Flow](https://flow.org) in mind.

If you're a Flow user yourself (and we highly recommend it!), here's some things you need to keep in mind:

## Setup

Add this to your `.flowconfig` file so that Flow can see Watermelon's types.

```ini
[declarations]
<PROJECT_ROOT>/node_modules/@nozbe/watermelondb/.*

[options]

module.name_mapper='^@nozbe/watermelondb\(.*\)$' -> '<PROJECT_ROOT>/node_modules/@nozbe/watermelondb/src\1'
```

Note that this won't work if you put the entire `node_modules/` folder under the `[ignore]` section. In that case, change it to only ignore the specific node modules that throw errors in your app, so that Flow can scan Watermelon files.

## Tables and columns

Table and column names are **opaque types** in Flow.

So if you try to use simple strings, like so:

```js
class Comment extends Model {
  static table = 'comments'

  @text('body') body
}
```

You'll get errors, because you're passing `'comments'` (a `string`) where `TableName<Comment>` is expected, and `'body'` (again, a `string`) where `ColumnName` is expected.

When using Watermelon with Flow, you must pre-define all your table and column names in one place, then only use those symbols (and not strings) in all other places.

We recommend defining symbols like this:

```js
// File: model/schema.js
// @flow

import { tableName, columnName, type TableName, appSchema, tableSchema } from '@nozbe/watermelondb'
import type Comment from './Comment.js'

export const Tables = {
  comments: (tableName('comments'): TableName<Comment>),
  // ...
}

export const Columns = {
  comments: {
    body: columnName('body'),
    // ...
  }
}

export const appSchema = appSchema({
  version: 1,
  tables: [
    tableSchema({
      name: Tables.comments,
      columns: [
        { name: Columns.comments.body, type: 'string' },
      ],
    }),
    // ...
  ]
})
```

And then using them like so:

```js
// File: model/Comment.js
// @flow

import { Model } from '@nozbe/watermelondb'
import { text } from '@nozbe/watermelondb/decorators'

import { Tables, Columns } from './schema.js'

const Column = Columns.comments

export default class Comment extends Model {
  static table = Tables.comments

  @text(Column.body) body: string
}
```

### But isn't that a lot of boilerplate?

Yes, it looks more boilerplate'y than the non-Flow examples, however:

- you're protected from typos — strings are defined once
- easier refactoring — you only change column name in one place
- no orphan columns or tables — no way to accidentally refer to a column or table that was removed from the schema
- `TableName` is typed with the model class it refers to, which allows Flow to find other mistakes in your code

In general, we find that untyped string constants lead to bugs, and defining typed constants is a good practice.

### associations

When using Flow, you define model associations like this:

```js
import { Model, associations } from '@nozbe/watermelondb'
import { Tables, Columns } from './schema.js'

const Column = Columns.posts

class Post extends Model {
  static table = Tables.posts
  static associations = associations(
    [Tables.comments, { type: 'has_many', foreignKey: Columns.comments.postId }],
    [Tables.users, { type: 'belongs_to', key: Column.authorId }],
  )
}
```

## Common types

Many types are tagged with the model class the type refers to:

```js
TableName<Post> // a table name referring to posts
Collection<Post> // the Collection for posts
Relation<Comment> // a relation that can fetch a Comment
Relation<?Comment> // a relation that can fetch a Comment or `null`
Query<Comment> // a query that can fetch many Comments
```

Always mark the type of model fields. Remember to include `?` if the underlying table column is optional. Flow can't check if model fields match the schema or if they match the decorator's signature.

```js
@text(Column.body) body: string
@date(Column.createdAt) createdAt: Date
@date(Column.archivedAt) archivedAt: ?Date
```

If you need to refer to an ID of a record, always use the `RecordId` type alias, not `string` (they're the same, but the former is self-documenting).

If you ever access the record's raw data (DON'T do that unless you *really* know what you're doing), use `DirtyRaw` to refer to raw data from external sources (database, server), and `RawRecord` after it was passed through `sanitizedRaw`.


================================================
FILE: docs-website/docs/docs/Advanced/LocalStorage.md
================================================
---
title: LocalStorage
hide_title: true
---

# Local storage

WatermelonDB has a simple key/value store, similar to [localStorage](https://developer.mozilla.org/en-US/docs/Web/API/Window/localStorage):

```js
// setting a value
await database.localStorage.set("user_id", "abcdef")

// retrieving a value
const userId = await database.localStorage.get("user_id") // string or undefined if no value for this key

// removing a value
await database.localStorage.remove("user_id")
```

**When to use it**. For things like the ID of the logged-in user, or the route to the last-viewed screen in the app. You should generally avoid it and stick to standard Watermelon records.

**This is a low-level API**. You can't do things like observe changes of a value over time. If you need that, just use standard WatermelonDB records. You can only store JSON-serializable values

**What to be aware of**. DO NOT let the local storage key be a user-supplied value. Only allow predefined/whitelisted keys. Key names starting with `__` are reserved for WatermelonDB use (e.g. used by Sync to remember time of last sync)

**Why not use localStorage/AsyncStorage?** Because this way, you have only one source of truth — one database that, say, stores the logged-in user ID and the information about all users. So there's a lower risk that the two sets of values get out of sync.


================================================
FILE: docs-website/docs/docs/Advanced/Logging.md
================================================
# Logging

By default, Watermelon ships with basic logging enabled that may be useful for debugging. When the application is started, basic information
about the location and setup of the database will be logged. As each query is executed, timing information will be logged.

## Disabling logging 

Disabling all logging is simple. Before your app starts, typically in your `database.js` file, import the logger and silence it:

```js
import logger from '@nozbe/watermelondb/utils/common/logger';
logger.silence();
```

## Overriding logging behavior

> **Note**: This class is not yet formally documented and its specifications may change. This method is for advanced users only, with
> some tolerance for potential breaking changes in the future.

The logger is a singleton instance of the Logger class, which exposes three methods: `log()`, `warn()`, and `error()`. Advanced users
may monkey-patch the logger methods to change their behavior, such as to route messages to an alternate logger: 

```js
import Cabin from 'cabin';
import logger from '@nozbe/watermelondb/utils/common/logger';

const cabin = new Cabin();
logger.log = (...messages) => cabin.info(...messages);
logger.warn = (...messages) => cabin.error(...messages);
logger.error = (...messages) => cabin.error(...messages);
```


================================================
FILE: docs-website/docs/docs/Advanced/Migrations.md
================================================
# Migrations

**Schema migrations** is the mechanism by which you can add new tables and columns to the database in a backward-compatible way.

Without migrations, if a user of your app upgrades from one version to another, their local database will be cleared at launch, and they will lose all their data.

⚠️ Always use migrations!

## Migrations setup

1. Add a new file for migrations:

   ```js
   // app/model/migrations.js

   import { schemaMigrations } from '@nozbe/watermelondb/Schema/migrations'

   export default schemaMigrations({
     migrations: [
       // We'll add migration definitions here later
     ],
   })
   ```

2. Hook up migrations to the Database adapter setup:

   ```js
   // index.js
   import migrations from 'model/migrations'

   const adapter = new SQLiteAdapter({
     schema: mySchema,
     migrations,
   })
   ```

## Migrations workflow

When you make schema changes when you use migrations, be sure to do this in this specific order, to minimize the likelihood of making an error.

### Step 1: Add a new migration

First, define the migration - that is, define the **change** that occurs between two versions of schema (such as adding a new table, or a new table column).

Don't change the schema file yet!

```js
// app/model/migrations.js

import { schemaMigrations, createTable } from '@nozbe/watermelondb/Schema/migrations'

export default schemaMigrations({
  migrations: [
    {
      // ⚠️ Set this to a number one larger than the current schema version
      toVersion: 2,
      steps: [
        // See "Migrations API" for more details
        createTable({
          name: 'comments',
          columns: [
            { name: 'post_id', type: 'string', isIndexed: true },
            { name: 'body', type: 'string' },
          ],
        }),
      ],
    },
  ],
})
```

Refresh your simulator/browser. You should see this error:

> Migrations can't be newer than schema. Schema is version 1 and migrations cover range from 1 to 2

If so, good, move to the next step!

But you might also see an error like "Missing table name in schema", which means you made an error in defining migrations. See ["Migrations API" below](#migrations-api) for details.

### Step 2: Make matching changes in schema

Now it's time to make the actual changes to the schema file — add the same tables or columns as in your migration definition

⚠️ Please double and triple check that your changes to schema match exactly the change you defined in the migration. Otherwise you risk that the app will work when the user migrates, but will fail if it's a fresh install — or vice versa.

⚠️ Don't change the schema version yet

```js
// model/schema.js

export default appSchema({
  version: 1,
  tables: [
    // This is our new table!
    tableSchema({
      name: 'comments',
      columns: [
        { name: 'post_id', type: 'string', isIndexed: true },
        { name: 'body', type: 'string' },
      ],
    }),
    // ...
  ]
})
```

Refresh the simulator. You should again see the same "Migrations can't be newer than schema" error. If you see a different error, you made a syntax error.

### Step 3: Bump schema version

Now that we made matching changes in the schema (source of truth about tables and columns) and migrations (the change in tables and columns), it's time to commit the change by bumping the version:

```js
// model/schema.js

export default appSchema({
  version: 2,
  tables: [
    // ...
  ]
})
```

If you refresh again, your app should show up without issues — but now you can use the new tables/columns

### Step 4: Test your migrations

Before shipping a new version of the app, please check that your database changes are all compatible:

1. Migrations test: Install the previous version of your app, then update to the version you're about to ship, and make sure it still works
2. Fresh schema install test: Remove the app, and then install the _new_ version of the app, and make sure it works

### Why is this order important

It's simply because React Native simulator (and often React web projects) are configured to automatically refresh when you save a file. You don't want the database to accidentally migrate (upgrade) with changes that have a mistake, or changes you haven't yet completed making. By making migrations first, and bumping version last, you can double check you haven't made a mistake.

## Migrations API

Each migration must migrate to a version one above the previous migration, and have multiple _steps_ (such as adding a new table, or new columns). Larger example:

```js
schemaMigrations({
  migrations: [
    {
      toVersion: 3,
      steps: [
        createTable({
          name: 'comments',
          columns: [
            { name: 'post_id', type: 'string', isIndexed: true },
            { name: 'body', type: 'string' },
          ],
        }),
        addColumns({
          table: 'posts',
          columns: [
            { name: 'subtitle', type: 'string', isOptional: true },
            { name: 'is_pinned', type: 'boolean' },
          ],
        }),
      ],
    },
    {
      toVersion: 2,
      steps: [
        // ...
      ],
    },
  ],
})
```

### Migration steps:

- `createTable({ name: 'table_name', columns: [ ... ] })` - same API as `tableSchema()`
- `addColumns({ table: 'table_name', columns: [ ... ] })` - you can add one or multiple columns to an existing table. The columns table has the same format as in schema definitions
- Other types of migrations (e.g. deleting or renaming tables and columns) are not yet implemented. See [`migrations/index.js`](https://github.com/Nozbe/WatermelonDB/blob/master/src/Schema/migrations/index.js). Please contribute!

## Database reseting and other edge cases

1. When you're **not** using migrations, the database will reset (delete all its contents) whenever you change the schema version.
2. If the migration fails, the database will fail to initialize, and will roll back to previous version. This is unlikely, but could happen if you, for example, create a migration that tries to create the same table twice. The reason why the database will fail instead of reset is to avoid losing user data (also it's less confusing in development). You can notice the problem, fix the migration, and ship it again without data loss.
3. When database in the running app has *newer* database version than the schema version defined in code, the database will reset (clear its contents). This is useful in development.
4. If there's no available migrations path (e.g. user has app with database version 4, but oldest migration is from version 10 to 11), the database will reset.

### Rolling back changes

There's no automatic "rollback" feature in Watermelon. If you make a mistake in migrations during development, roll back in this order:

1. Comment out any changes made to schema.js
2. Comment out any changes made to migrations.js
3. Decrement schema version number (bring back the original number)

After refreshing app, the database should reset to previous state. Now you can correct your mistake and apply changes again (please do it in order described in "Migrations workflow").

### Unsafe SQL migrations

Similar to [Schema](../Schema.md), you can add `unsafeSql` parameter to every migration step to modify or replace SQL generated by WatermelonDB to perform the migration. There is also an `unsafeExecuteSql('some sql;')` step you can use to append extra SQL. Those are ignored with LokiJSAdapter and for the purposes of [migration syncs](../Sync/Intro.md).


================================================
FILE: docs-website/docs/docs/Advanced/Performance.md
================================================
---
title: Performance Tips
hide_title: true
---

# Performance

Performance tips — TODO


================================================
FILE: docs-website/docs/docs/Advanced/ProTips.md
================================================
---
title: Pro Tips
hide_title: true
---

# Various Pro Tips

## Database viewer

[See discussion](https://github.com/Nozbe/WatermelonDB/issues/710)

**Android** - you can use the new [App Inspector](https://medium.com/androiddevelopers/database-inspector-9e91aa265316) in modern versions of Android Studio.

**Via Flipper** You can also use Facebook Flipper [with a plugin](https://github.com/panz3r/react-native-flipper-databases#readme). See [discussion](https://github.com/Nozbe/WatermelonDB/issues/653).

**iOS** - check open database path in iOS System Log (via Console for plugged-in device, or Xcode logs, or [by using `find`](https://github.com/Nozbe/WatermelonDB/issues/710#issuecomment-776255654)), then open it via `sqlite3` in the console, or an external tool like [sqlitebrowser](https://sqlitebrowser.org)

## Which SQLite version am I using?

This usually only matters if you use raw SQL to use new SQLite versions:

- On iOS, we use whatever SQLite version is bundled with the OS. [Here's a table of iOS version - SQLite version matches](https://github.com/yapstudios/YapDatabase/wiki/SQLite-version-(bundled-with-OS))
- On Android in JSI mode, we use SQLite bundled with WatermelonDB. See `@nozbe/sqlite` NPM dependency version to see which SQLite version is bundled.
- On Android NOT in JSI mode, we use the SQLite bundled with the OS

BTW: We're happy to accept contributions so that you can choose custom version or build of SQLite in all modes and on all platforms, but it needs to be opt-in (this adds to build time and binary size and most people don't need this)

## Prepopulating database on native

There's no built-in support for this. One way is to generate a SQLite DB (you can use the the Node SQLite support in 0.19.0-2 pre-release or extract it from an ios/android app), bundle it with the app, and then use a bit of code to check if the DB you're expecting it available, and if not, making a copy of the default DB — before you attempt loading DB from JS side. [See discussion](https://github.com/Nozbe/WatermelonDB/issues/774#issuecomment-667981361)

## Override entity ID generator

You can optionally overide WatermelonDB's id generator with your own custom id generator in order to create specific random id formats (e.g. if UUIDs are used in the backend). In your database index file, pass a function with your custom ID generator to `setGenerator`:

```
// Define a custom ID generator.
function randomString(): string {
  return 'RANDOM STRING';
}
setGenerator(randomString);

// or as anonymous function:
setGenerator(() => 'RANDOM STRING');
```

To get UUIDs specifically, install [uuid](https://github.com/uuidjs/uuid) and then pass their id generator to `setGenerator`:

```
import { v4 as uuidv4 } from 'uuid';

setGenerator(() => uuidv4());
```


================================================
FILE: docs-website/docs/docs/Advanced/SharingDatabaseAcrossTargets.md
================================================
# iOS - Sharing database across targets

In case you have multiple Xcode targets and want to share your WatermelonDB instance across them, there are 2 options to be followed: via JS or via native Swift / Objective-C.

### When to use this

When you want to access the same database data in 2 or more Xcode targets (Notification Service Extension, Share Extension, iMessage stickers, etc).

### How to do this

**Step 1:** Setting up an App Group

Through Xcode, repeat this process for your **main target** and **every other target** that you want to share the database with:
- Click on target name
- Click **Signing and Capabilities**
- Click **+ Capability**
- Select **App Groups**
- Provide your App Group name, usually `group.$(PRODUCT_BUNDLE_IDENTIFIER)` (e.g.: `group.com.example.MyAwesomeApp`)

> Note: the App Group name must be the **exact same** for every target

This tells iOS to share storage directories between your targets, and in this case, also the Watermelon database.

**Step 2**: Setting up `dbName`:

**Option A**: Via JS

> Note: although this method is simpler, it has the disadvantage of breaking Chrome remote debugging

1. Install [rn-fetch-blob](https://github.com/joltup/rn-fetch-blob#installation)

2. In your JS, when creating the database, get the App Group path using `rn-fetch-blob`:

    ```ts
    import { NativeModules, Platform } from 'react-native';
    import { Database } from '@nozbe/watermelondb';
    import SQLiteAdapter from '@nozbe/watermelondb/adapters/sqlite';
    import schema from './schema';
    import RNFetchBlob from 'rn-fetch-blob';

    const getAppGroupPath = (): string => {
      let path = '';

      if (Platform.OS === 'ios') {
        path = `${RNFetchBlob.fs.syncPathAppGroup('group.com.example.MyAwesomeApp')}/`;
      }

      return path;
    }

    const adapter = new SQLiteAdapter({
      dbName: `${getAppGroupPath()}default.db`,
      schema,
    });

    const database = new Database({
      adapter,
      modelClasses: [
        ...
      ],
    });

    export default database;
    ```

**Option B**: Via native Swift / Objective-C

1. Through Xcode, repeat this process for your **main target** and **every other target** that you want to share the database with:
    - Edit `Info.plist`
    - Add a new row with `AppGroup` as key and `group.$(PRODUCT_BUNDLE_IDENTIFIER)` (set up in Step 1) as value.

2. Right-click your project name and click **New Group**.
3. Add a file named `AppGroup.m` and paste the following:
    ```
    #import "React/RCTBridgeModule.h"
    @interface RCT_EXTERN_MODULE(AppGroup, NSObject)
    @end
    ```
4. Add a file named `AppGroup.swift` and paste the following:
    ```
   import Foundation

   @objc(AppGroup)
   class AppGroup: NSObject {

     @objc
     func constantsToExport() -> [AnyHashable : Any]! {
       var path = ""
       if let suiteName = Bundle.main.object(forInfoDictionaryKey: "AppGroup") as? String {
         if let directory = FileManager.default.containerURL(forSecurityApplicationGroupIdentifier: suiteName) {
           path = directory.path
         }
       }

       return ["path": "\(path)/"]
     }
   }
    ```
   This reads your new `Info.plist` row and exports a constant called `path` with your App Group path (shared directory path), to be used in your JS code.

5. In your JS, when creating the database, import the `path` constant from your new `AppGroup` module and prepend to your `dbName`:

    ```ts
    import { NativeModules, Platform } from 'react-native';
    import { Database } from '@nozbe/watermelondb';
    import SQLiteAdapter from '@nozbe/watermelondb/adapters/sqlite';
    import schema from './schema';

    const getAppGroupPath = (): string => {
      let path = '';

      if (Platform.OS === 'ios') {
        path = NativeModules.AppGroup.path;
      }

      return path;
    }

    const adapter = new SQLiteAdapter({
      dbName: `${getAppGroupPath()}default.db`,
      schema,
    });

    const database = new Database({
      adapter,
      modelClasses: [
        ...
      ],
    });

    export default database;
    ```

This way you're telling Watermelon to store your database into the shared directories, you're ready to go!


================================================
FILE: docs-website/docs/docs/CHANGELOG.md
================================================
# Changelog

All notable changes to this project will be documented in this file.

Contributors: Please add your changes to CHANGELOG-Unreleased.md

## 0.28 - 2025-04-07

### BREAKING CHANGES

- [iOS] Podspec deployment target was bumped from iOS 11 to iOS 12
- [Android] Installation of Android JSI adapter has changed. To migrate, remove `getJSIModulePackage()` override in your `MainApplication.{java,kt}`, and add `new WatermelonDBJSIPackage()` to `getPackages()` override instead. See Installation docs for details.

### New features

- Added `Database#experimentalIsVerbose` option
- Support for React Native 0.74+

### Fixes

- [ts] Improved LocalStorage type definition
- [ts] Add missing .d.ts for experimentalFailsafe decorator
- [migrations] `unsafeExecuteSql` migration is now validate to ensure it ends with a semicolon (#1811)

### Changes

- Minimum supported Node.js version is now 18.x
- Improved Model diagnostic errors now always contain `table#id` of offending record
- Update `better-sqlite3` to 11.x
- Update sqlite (used by Android in JSI mode) to 3.46.0
- [docs] Improved Android installation docs
- [docs] Removed examples from the codebase as they were unmaintained

### Internal

- Update internal dependencies

## 0.27.1 - 2023-10-15

Fix missing Changelog for 0.27 release

## 0.27 - 2023-08-29

### Highlights

**Removed legacy Swift and Kotlin React Native Modules**

Following the addition of new Native Modules in 0.26, we're removing the old implementations. We expect this to simplify installation process and remove a ton of compatibility and configuration issues due to Kotlin version mismatchs and the CocoaPods-Swift issues when using `use_frameworks!` or Expo.

**Experimental React Native Windows support**

WatermelonDB now has _experimental_ support for React Native Windows. See Installation docs for details.

**Introducing Watermelon React**

All React/React Native helpers for Watermelon are now available from a new `@nozbe/watermelodb/react` folder:

- `DatabaseProvider`, `useDatabase`, `withDatabase`
- NEW: `withObservables` - `@nozbe/with-observables` as a separate package is deprecated, and is now bundled with WatermelonDB
- NEW: HOC helpers: `compose`, `withHooks`
- NEW: `&lt;WithObservables />` component, a component version of `withObservables` HOC. Useful when a value being observed is localized to a small part of a larger component, because you can effortlessly narrow down which parts of the component are re-rendered when the value changes without having to extract a new component.

Imports from previous `@nozbe/watermelondb/DatabaseProvider` and `@nozbe/watermelondb/hooks` folders are deprecated and will be removed in a future version.

**Introducing Watermelon Diagnostics**

All debug/dev/diagnostics tools for Watermelon are now available from a new `@nozbe/watermelondb/diagnostics` folder:

- NEW: `censorRaw` - takes a `RawRecord/DirtyRaw` and censors its string values, while preserving IDs, _status, _changed, and numeric/boolean values. Helpful when viewing database contents in context that could expose private user information
- NEW: `diagnoseDatabaseStructure` - analyzes database to find inconsistencies, such as orphaned records (`belongs_to` relations on model that point to records that don't exist) or broken LokiJS database. Use this to find bugs in your data model.
- NEW: `diagnoseSyncConsistency` - compares local database with the server version (contents of first/full sync) to find inconsistencies, missing and excess records. Use this to find bugs in your backend sync implementation.

### BREAKING CHANGES

- `@nozbe/with-observables` is no longer a WatermelonDB dependency. Change your imports to `import { withObservables } from '@nozbe/watermelondb/react'`

Changes unlikely to cause issues:

- [iOS] If `import WatermelonDB` is used in your Swift app (for Turbo sync), remove it and replace with `#import &lt;WatermelonDB/WatermelonDB.h>` in the bridging header
- [iOS] If you use `_watermelonDBLoggingHook`, remove it. No replacement is provided at this time, feel free to contribute if you need this
- [iOS] If you use `-DENABLE_JSLOCK_PERFORMANCE_HACK`, remove it. JSLockPerfHack has been non-functional for some time already, and has now been removed. Please file an issue if you relied on it.

### Deprecations

- Imports from `@nozbe/watermelondb/DatabaseProvider` and `@nozbe/watermelondb/hooks`. Change to `@nozbe/watermelondb/react`

### New features

- New `@experimentalFailsafe` decorator you can apply before `@relation/@immutableRelation` so that if relation points to a record that does not exist, `.fetch()/.observe()` yield `undefined` instead of throwing an error

### Fixes

- [Flow/TS] Improved typing of DatabaseContext
- Fixed `Cannot read property 'getRandomIds' of null`. This error occured if native modules were not correctly installed, however the location of the error caused a lot of confusion.

## 0.26 - 2023-04-28

### Highlights

**New Native Modules**

We're transitioning SQLite adapters for React Native **from Kotlin and Swift to Java and Objective-C**.

This is only a small part of WatermelonDB, yet is responsible for a disproportionate amount of issues
raised, such as Kotlin version conflicts, Expo build failures, CocoaPods use_frameworks! issues. It
makes library installation and updates more complicated for users. It complicates maintenance.
Swift doesn't play nicely with either React Native's legacy Native Module system, nor can it interact
cleanly with C++ (JSI/New Architecture) without going through Objective-C++.

In other words, in the context of a React Native library, the benefit of these modern, nicer to use
languages is far outweighed by the downsides. That's why we (@radex & @rozpierog) decided to rewrite
the iOS and Android implementations to Objective-C and Java respectively.

0.26 is a transition release, and it contains both implementations. If you find a regression caused
by the new bridge, pass `{disableNewBridge: true}` to `new SQLiteAdapter()` **and file an issue**.
We plan to remove the old implementation in 0.27 or 0.28 release.

**New documentation**

We have a brand new documentation page, built with Docusaurus (contributed by @ErickLuizA).

We plan to expand guides, add typing to examples, and add a proper API reference, but we need your
help to do this! See: https://github.com/Nozbe/WatermelonDB/issues/1481

### BREAKING CHANGES

- [iOS] You should remove import of WatermelonDB's `SupportingFiles/Bridging.h` from your app project's `Bridging.h`.
  If this removal causes build issues, please file an issue.
- [iOS] In your Podfile, replace previous WatermelonDB's pod imports with this:

  ```rb
  # Uncomment this line if you're not using auto-linking
  # pod 'WatermelonDB', path: '../node_modules/@nozbe/watermelondb'
  # WatermelonDB dependency
  pod 'simdjson', path: '../node_modules/@nozbe/simdjson', modular_headers: true
  ```
- Removed functions deprecated for 2+ years:
  - `Collection.unsafeFetchRecordsWithSQL()`. Use `.query(Q.unsafeSqlQuery('select * from...')).fetch()` instead.
  - `Database.action()`. Use `Database.write()` instead.
  - `.subAction()`. Use `.callWriter()` instead.
  - `@action` decorator. Use `@writer` instead.

### Deprecations

### New features

- [Android] Added `experimentalUnsafeNativeReuse` option to SQLiteAdapter. See `src/adapters/sqlite/type.js` for more details
- You can now pass an array to `Q.and(conditions)`, `Q.or(conditions)`, `collection.query(conditions)`, `query.extend(conditions)` in addition to spreading multiple arguments
- Added JSDoc comments to many APIs

### Fixes

- Improved resiliency to "Maximum call stack size exceeded" errors
- [JSI] Improved reliability when reloading RCTBridge
- [iOS] Fix "range of supported deployment targets" Xcode warning
- `randomId` uses better randum number generator
- Fixed "no such index" when using non-standard schemas and >1k bulk updates
- Fixes and changes included in `@nozbe/with-observables@1.5.0`
- [Flow] `query.batch([model, falsy])` no longer raises an error

### Performance

- Warning is now given if a large number of arguments is passed to `Q.and, Q.or, Collection.query, Database.batch` instead of a single array
- `randomId()` is now 2x faster on Chrome, 10x faster on Safari, 2x faster on iOS (Hermes)

### Changes

- `randomId`: now also generates upper-case letters
- Simplified CocoaPods/iOS integration
- Docs improvements: SQLite versions, Flow declarations, Installation
- Improved diagnostic warnings and errors: JSI, Writer/Reader
- Remove old diagnostic warnings no longer relevant: `multiple Q.on()s`, `Database`, `LokiJSAdapter`, `SQLiteAdapter`
- Updated `flow-bin` to 0.200. This shouldn't have an impact on you, but could fix or break Flow if you don't have WatermelonDB set to `[declarations]` mode
- Updated `@babel/runtime` to 7.20.13
- Updated `rxjs` to 7.8.0
- Updated `sqlite` (SQLite used on Android in JSI mode) to 3.40.1
- Updated `simdjson` to 3.1.0

### Internal

- Cleaned up QueryDescription, ios folder structure, JSI implementation by splitting them into smaller parts.
- [Android] [jsi] Simplify CMakeLists
- Improve release script

## 0.25.5 - 2023-02-01

- Fix Android auto-linking

## 0.25.4 - 2023-01-31

- [Sync] Improve memory consumption (less likely to get "Maximum callstack exceeded" error)
- [TypeScript] Fix type of `DirtyRaw` to `{ [key: string]: any }` (from `Object`)

## 0.25.3 - 2023-01-30

- Fixed TypeError regression

## 0.25.2 - 2023-01-30

### Fixes

- Fix TypeScript issues (@paulrostorp feat. @enahum)
- Fix compilation on Kotlin 1.7
- Fix regression in Sync that could cause `Record ID xxx#yyy was sent over the bridge, but it's not cached` error

### Internal

- Update internal dependencies
- Fix Android CI
- Improve TypeScript CI

## 0.25.1 - 2023-01-23

- Fix React Native 0.71+ Android broken build

## 0.25 - 2023-01-20

### Highlights

- Fix broken build on React Native 0.71+
- [Expo] Fixes Expo SDK 44+ build errors (@Kudo)
- [JSI] Fix an issue that sometimes led to crashing app upon database close

### BREAKING CHANGES

- [Query] `Q.where(xxx, undefined)` will now throw an error. This is a bug fix, since comparing to
  undefined was never allowed and would either error out or produce a wrong result in some cases.
  However, it could technically break an app that relied on existing buggy behavior
- [JSI+Swift] If you use `watermelondbProvideSyncJson()` native iOS API, you might need to add `import WatermelonDB`

### New features

- [adapters] Adapter objects can now be distinguished by checking their `static adapterType`
- [Query] New `Q.includes('foo')` query for case-sensitive exact string includes comparison
- [adapters] Adapter objects now returns `dbName`
- [Sync] Replacement Sync - a new advanced sync feature. Server can now send a full dataset (same as
  during initial sync) and indicate with `{ experimentalStrategy: 'replacement' }` that instead of applying a diff,
  local database should be replaced with the dataset sent. Local records not present in the changeset
  will be deleted. However, unlike clearing database and logging in again, unpushed local changes
  (to records that are kept after replacement) are preserved. This is useful for recovering from a
  corrupted local database, or as a hack to deal with very large state changes such that server doesn't
  know how to efficiently send incremental changes and wants to send a full dataset instead. See docs
  for more details.
- [Sync] Added `onWillApplyRemoteChanges` callback

### Performance

- [LokiJS] Updated Loki with some performance improvements
- [iOS] JSLockPerfHack now works on iOS 15
- [Sync] Improved performance of processing large pulls
- Improved `@json` decorator, now with optional `{ memo: true }` parameter

### Changes

- [Docs] Added additional Android JSI installation step

### Fixes

- [TypeScript] Improve typings: add unsafeExecute method, localStorage property to Database
- [android] Fixed compilation on some setups due to a missing `&lt;cassert>` import
- [sync] Fixed marking changes as synced for users that don't keep globally unique (only per-table unique) IDs
- Fix `Model.experimentalMarkAsDeleted/experimentalDestroyPermanently()` throwing an error in some cases
- Fixes included in updated `withObservables`

## 0.24 - 2021-10-28

### BREAKING CHANGES

- `Q.experimentalSortBy`, `Q.experimentalSkip`, `Q.experimentalTake` have been renamed to `Q.sortBy`, `Q.skip`, `Q.take` respectively
- **RxJS has been updated to 7.3.0**. If you're not importing from `rxjs` in your app, this doesn't apply to you. If you are, read RxJS 7 breaking changes: https://rxjs.dev/deprecations/breaking-changes

### New features

- **LocalStorage**. `database.localStorage` is now available
- **sortBy, skip, take** are now available in LokiJSAdapter as well
- **Disposable records**. Read-only records that cannot be saved in the database, updated, or deleted and only exist for as long as you keep a reference to them in memory can now be created using `collection.disposableFromDirtyRaw()`. This is useful when you're adding online-only features to an otherwise offline-first app.
- [Sync] `experimentalRejectedIds` parameter now available in push response to allow partial rejection of an otherwise successful sync

### Fixes

- Fixes an issue when using Headless JS on Android with JSI mode enabled - pass `usesExclusiveLocking: true` to SQLiteAdapter to enable
- Fixes Typescript annotations for Collection and adapters/sqlite

## 0.23 - 2021-07-22

This is a big release to WatermelonDB with new advanced features, great performance improvements, and important fixes to JSI on Android.

Please don't get scared off the long list of breaking changes - they are all either simple Find&Replace renames or changes to internals you probably don't use. It shouldn't take you more than 15 minutes to upgrade to 0.23.

### BREAKING CHANGES

- **iOS Installation change**. You need to add this line to your Podfile: `pod 'simdjson', path: '../node_modules/@nozbe/simdjson'`
- Deprecated `new Database({ actionsEnabled: false })` options is now removed. Actions are always enabled.
- Deprecated `new SQLiteAdapter({ synchronous: true })` option is now removed. Use `{ jsi: true }` instead.
- Deprecated `Q.unsafeLokiFilter` is now removed. Use `Q.unsafeLokiTransform((raws, loki) => raws.filter(raw => ...))` instead.
- Deprecated `Query.hasJoins` is now removed
- Changes to `LokiJSAdapter` constructor options:
  - `indexedDBSerializer` -> `extraIncrementalIDBOptions: { serializeChunk, deserializeChunk }`
  - `onIndexedDBFetchStart` -> `extraIncrementalIDBOptions: { onFetchStart }`
  - `onIndexedDBVersionChange` -> `extraIncrementalIDBOptions: { onversionchange }`
  - `autosave: false` -> `extraLokiOptions: { autosave: false }`
- Changes to Internal APIs. These were never meant to be public, and so are unlikely to affect you:
  - `Model._isCommited`, `._hasPendingUpdate`, `._hasPendingDelete` have been removed and changed to `Model._pendingState`
  - `Collection.unsafeClearCache()` is no longer exposed
- Values passed to `adapter.setLocal()` are now validated to be strings. This is technically a bug fix, since local storage was always documented to only accept strings, however applications may have relied on this lack of validation. Adding this validation was necessary to achieve consistent behavior between SQLiteAdapter and LokiJSAdapter
- `unsafeSql` passed to `appSchema` will now also be called when dropping and later recreating all database indices on large batches. A second argument was added so you can distinguish between these cases. See Schema docs for more details.
- **Changes to sync change tracking**. The behavior of `record._raw._changed` and `record._raw._status` (a.k.a. `record.syncStatus`) has changed. This is unlikely to be a breaking change to you, unless you're writing your own sync engine or rely on these low-level details.
  - Previously, \_changed was always empty when \_status=created. Now, \_changed is not populated during initial creation of a record, but a later update will add changed fields to \_changed. This change was necessary to fix a long-standing Sync bug.

### Deprecations

- `database.action(() => {})` is now deprecated. Use `db.write(() => {})` instead (or `db.read(() => {})` if you only need consistency but are not writing any changes to DB)
- `@action` is now deprecated. Use `@writer` or `@reader` instead
- `.subAction()` is now deprecated. Use `.callReader()` or `.callWriter()` instead
- `Collection.unsafeFetchRecordsWithSQL()` is now deprecated. Use `collection.query(Q.unsafeSqlQuery("select * from...")).fetch()` instead.

### New features

- `db.write(writer => { ... writer.batch() })` - you can now call batch on the interface passed to a writer block
- **Fetching record IDs and unsafe raws.** You can now optimize fetching of queries that only require IDs, not full cached records:
  - `await query.fetchIds()` will return an array of record ids
  - `await query.unsafeFetchRaw()` will return an array of unsanitized, unsafe raw objects (use alongside `Q.unsafeSqlQuery` to exclude unnecessary or include extra columns)
  - advanced `adapter.queryIds()`, `adapter.unsafeQueryRaw` are also available
- **Raw SQL queries**. New syntax for running unsafe raw SQL queries:
  - `collection.query(Q.unsafeSqlQuery("select * from tasks where foo = ?", ['bar'])).fetch()`
  - You can now also run `.fetchCount()`, `.fetchIds()` on SQL queries
  - You can now safely pass values for SQL placeholders by passing an array
  - You can also observe an unsafe raw SQL query -- with some caveats! refer to documentation for more details
- **Unsafe raw execute**. You can now execute arbitrary SQL queries (SQLiteAdapter) or access Loki object directly (LokiJSAdapter) using `adapter.unsafeExecute` -- see docs for more details
- **Turbo Login**. You can now speed up the initial (login) sync by up to 5.3x with Turbo Login. See Sync docs for more details.
- New diagnostic tool - **debugPrintChanges**. See Sync documentation for more details

### Performance

- The order of Q. clauses in a query is now preserved - previously, the clauses could get rearranged and produce a suboptimal query
- [SQLite] `adapter.batch()` with large numbers of created/updated/deleted records is now between 16-48% faster
- [LokiJS] Querying and finding is now faster - unnecessary data copy is skipped
- [jsi] 15-30% faster querying on JSC (iOS) when the number of returned records is large
- [jsi] up to 52% faster batch creation (yes, that's on top of the improvement listed above!)
- Fixed a performance bug that caused observed items on a list observer with `.observeWithColumns()` to be unnecessarily re-rendered just before they were removed from the list

### Changes

- All Watermelon console logs are prepended with a 🍉 tag
- Extra protections against improper use of writers/readers (formerly actions) have been added
- Queries with multiple top-level `Q.on('table', ...)` now produce a warning. Use `Q.on('table', [condition1, condition2, ...])` syntax instead.
- [jsi] WAL mode is now used

### Fixes

- [jsi] Fix a race condition where commands sent to the database right after instantiating SQLiteAdapter would fail
- [jsi] Fix incorrect error reporting on some sqlite errors
- [jsi] Fix issue where app would crash on Android/Hermes on reload
- [jsi] Fix IO errors on Android
- [sync] Fixed a long-standing bug that would cause records that are created before a sync and updated during sync's push to lose their most recent changes on a subsequent sync

### Internal

- Internal changes to SQLiteAdapter:
  - .batch is no longer available on iOS implementation
  - .batch/.batchJSON internal format has changed
  - .getDeletedRecords, destroyDeletedRecords, setLocal, removeLocal is no longer available
- encoded SQLiteAdapter schema has changed
- LokiJSAdapter has had many internal changes

## 0.22 - 2021-05-07

### BREAKING CHANGES

- [SQLite] `experimentalUseJSI: true` option has been renamed to `jsi: true`

### Deprecations

- [LokiJS] `Q.unsafeLokiFilter` is now deprecated and will be removed in a future version.
  Use `Q.unsafeLokiTransform((raws, loki) => raws.filter(raw => ...))` instead.

### New features

- [SQLite] [JSI] `jsi: true` now works on Android - see docs for installation info

### Performance

- Removed dependency on rambdax and made the util library smaller
- Faster withObservables

### Changes

- Synchronization: `pushChanges` is optional, will not calculate local changes if not specified.
- withObservables is now a dependency of WatermelonDB for simpler installation and consistent updates. You can (and generally should) delete `@nozbe/with-observables` from your app's package.json
- [Docs] Add advanced tutorial to share database across iOS targets - @thiagobrez
- [SQLite] Allowed callbacks (within the migrationEvents object) to be passed so as to track the migration events status ( onStart, onSuccess, onError ) - @avinashlng1080
- [SQLite] Added a dev-only `Query._sql()` method for quickly extracting SQL from Queries for debugging purposes

### Fixes

- Non-react statics hoisting in `withDatabase()`
- Fixed incorrect reference to `process`, which can break apps in some environments (e.g. webpack5)
- [SQLite] [JSI] Fixed JSI mode when running on Hermes
- Fixed a race condition when using standard fetch methods alongside `Collection.unsafeFetchRecordsWithSQL` - @jspizziri
- withObservables shouldn't cause any RxJS issues anymore as it no longer imports RxJS
- [Typescript] Added `onSetUpError` and `onIndexedDBFetchStart` fields to `LokiAdapterOptions`; fixes TS error - @3DDario
- [Typescript] Removed duplicated identifiers `useWebWorker` and `useIncrementalIndexedDB` in `LokiAdapterOptions` - @3DDario
- [Typescript] Fix default export in logger util

## 0.21 - 2021-03-24

### BREAKING CHANGES

- [LokiJS] `useWebWorker` and `useIncrementalIndexedDB` options are now required (previously, skipping them would only trigger a warning)

### New features

- [Model] `Model.update` method now returns updated record
- [adapters] `onSetUpError: Error => void` option is added to both `SQLiteAdapter` and `LokiJSAdapter`. Supply this option to catch initialization errors and offer the user to reload or log out
- [LokiJS] new `extraLokiOptions` and `extraIncrementalIDBOptions` options
- [Android] Autolinking is now supported.
  - If You upgrade to `&lt;= v0.21.0` **AND** are on a version of React Native which supports Autolinking, you will need to remove the config manually linking WatermelonDB.
  - You can resolve this issue by **REMOVING** the lines of config from your project which are _added_ in the `Manual Install ONLY` section of the [Android Install docs](https://nozbe.github.io/WatermelonDB/Installation.html#android-react-native).

### Performance

- [LokiJS] Improved performance of launching the app

### Changes

- [LokiJS] `useWebWorker: true` and `useIncrementalIndexedDB: false` options are now deprecated. If you rely on these features, please file an issue!
- [Sync] Optional `log` passed to sync now has more helpful diagnostic information
- [Sync] Open-sourced a simple SyncLogger you can optionally use. See docs for more info.
- [SQLiteAdapter] `synchronous:true` option is now deprecated and will be replaced with `experimentalUseJSI: true` in the future. Please test if your app compiles and works well with `experimentalUseJSI: true`, and if not - file an issue!
- [LokiJS] Changed default autosave interval from 250 to 500ms
- [Typescript] Add `experimentalNestedJoin` definition and `unsafeSqlExpr` clause

### Fixes

- [LokiJS] Fixed a case where IndexedDB could get corrupted over time
- [Resilience] Added extra diagnostics for when you encounter the `Record ID aa#bb was sent over the bridge, but it's not cached` error and a recovery path (LokiJSAdapter-only). Please file an issue if you encounter this issue!
- [Typescript] Fixed type on OnFunction to accept `and` in join
- [Typescript] Fixed type `database#batch(records)`'s argument `records` to accept mixed types

### Internal

- Added an experimental mode where a broken database state is detected, further mutations prevented, and the user notified

## 0.20 - 2020-10-05

### BREAKING CHANGES

This release has unintentionally broken RxJS for some apps using `with-observables`. If you have this issue, please update `@nozbe/with-observables` to the latest version.

### New features

- [Sync] Conflict resolution can now be customized. See docs for more details
- [Android] Autolinking is now supported
- [LokiJS] Adapter autosave option is now configurable

### Changes

- Interal RxJS imports have been refactor such that rxjs-compat should never be used now
- [Performance] Tweak Babel config to produce smaller code
- [Performance] LokiJS-based apps will now take up to 30% less time to load the database (id and unique indicies are generated lazily)

### Fixes

- [iOS] Fixed crash on database reset in apps linked against iOS 14 SDK
- [LokiJS] Fix `Q.like` being broken for multi-line strings on web
- Fixed warn "import cycle" from DialogProvider (#786) by @gmonte.
- Fixed cache date as instance of Date (#828) by @djorkaeffalexandre.

## 0.19 - 2020-08-17

### New features

- [iOS] Added CocoaPods support - @leninlin
- [NodeJS] Introducing a new SQLite Adapter based integration to NodeJS. This requires a
  peer dependency on [better-sqlite3](https://github.com/JoshuaWise/better-sqlite3)
  and should work with the same configuration as iOS/Android - @sidferreira
- [Android] `exerimentalUseJSI` option has been enabled on Android. However, it requires some app-specific setup which is not yet documented - stay tuned for upcoming releases
- [Schema] [Migrations] You can now pass `unsafeSql` parameters to schema builder and migration steps to modify SQL generated to set up the database or perform migrations. There's also new `unsafeExecuteSql` migration step. Please use this only if you know what you're doing — you shouldn't need this in 99% of cases. See Schema and Migrations docs for more details
- [LokiJS] [Performance] Added experimental `onIndexedDBFetchStart` and `indexedDBSerializer` options to `LokiJSAdapter`. These can be used to improve app launch time. See `src/adapters/lokijs/index.js` for more details.

### Changes

- [Performance] findAndObserve is now able to emit a value synchronously. By extension, this makes Relations put into withObservables able to render the child component in one shot. Avoiding the extra unnecessary render cycles avoids a lot of DOM and React commit-phase work, which can speed up loading some views by 30%
- [Performance] LokiJS is now faster (refactored encodeQuery, skipped unnecessary clone operations)

## 0.18 - 2020-06-30

Another WatermelonDB release after just a week? Yup! And it's jam-packed full of features!

### New features

- [Query] `Q.on` queries are now far more flexible. Previously, they could only be placed at the top
  level of a query. See Docs for more details. Now, you can:

  - Pass multiple conditions on the related query, like so:

    ```js
    collection.query(Q.on('projects', [Q.where('foo', 'bar'), Q.where('bar', 'baz')]))
    ```

  - You can place `Q.on` deeper inside the query (nested inside `Q.and()`, `Q.or()`). However, you
    must explicitly list all tables you're joining on at the beginning of a query, using:
    `Q.experimentalJoinTables(['join_table1', 'join_table2'])`.
  - You can nest `Q.on` conditions inside `Q.on`, e.g. to make a condition on a grandchild.
    To do so, it's required to pass `Q.experimentalNestedJoin('parent_table', 'grandparent_table')` at the beginning
    of a query

- [Query] `Q.unsafeSqlExpr()` and `Q.unsafeLokiExpr()` are introduced to allow adding bits of queries
  that are not supported by the WatermelonDB query language without having to use `unsafeFetchRecordsWithSQL()`.
  See docs for more details
- [Query] `Q.unsafeLokiFilter((rawRecord, loki) => boolean)` can now be used as an escape hatch to make
  queries with LokiJSAdapter that are not otherwise possible (e.g. multi-table column comparisons).
  See docs for more details

### Changes

- [Performance] [LokiJS] Improved performance of queries containing query comparisons on LokiJSAdapter
- [Docs] Added Contributing guide for Query language improvements
- [Deprecation] `Query.hasJoins` is deprecated
- [DX] Queries with bad associations now show more helpful error message
- [Query] Counting queries that contain `Q.experimentalTake` / `Q.experimentalSkip` is currently broken - previously it would return incorrect results, but
  now it will throw an error to avoid confusion. Please contribute to fix the root cause!

### Fixes

- [Typescript] Fixed types of Relation

### Internal

- `QueryDescription` structure has been changed.

## 0.17.1 - 2020-06-24

- Fixed broken iOS build - @mlecoq

## 0.17 - 2020-06-22

### New features

- [Sync] Introducing Migration Syncs - this allows fully consistent synchronization when migrating
  between schema versions. Previously, there was no mechanism to incrementally fetch all remote changes in
  new tables and columns after a migration - so local copy was likely inconsistent, requiring a re-login.
  After adopting migration syncs, Watermelon Sync will request from backend all missing information.
  See Sync docs for more details.
- [iOS] Introducing a new native SQLite database integration, rewritten from scratch in C++, based
  on React Native's JSI (JavaScript Interface). It is to be considered experimental, however
  we intend to make it the default (and eventually, the only) implementation. In a later release,
  Android version will be introduced.

       The new adapter is up to 3x faster than the previously fastest `synchronous: true` option,
       however this speedup is only achieved with some unpublished React Native patches.

       To try out JSI, add `experimentalUseJSI: true` to `SQLiteAdapter` constructor.

- [Query] Added `Q.experimentalSortBy(sortColumn, sortOrder)`, `Q.experimentalTake(count)`,
  `Q.experimentalSkip(count)` methods (only availble with SQLiteAdapter) - @Kenneth-KT
- `Database.batch()` can now be called with a single array of models
- [DX] `Database.get(tableName)` is now a shortcut for `Database.collections.get(tableName)`
- [DX] Query is now thenable - you can now use `await query` and `await query.count` instead of `await query.fetch()` and `await query.fetchCount()`
- [DX] Relation is now thenable - you can now use `await relation` instead of `await relation.fetch()`
- [DX] Exposed `collection.db` and `model.db` as shortcuts to get to their Database object

### Changes

- [Hardening] Column and table names starting with `__`, Object property names (e.g. `constructor`), and some reserved keywords are now forbidden
- [DX] [Hardening] QueryDescription builder methods do tighter type checks, catching more bugs, and
  preventing users from unwisely passing unsanitized user data into Query builder methods
- [DX] [Hardening] Adapters check early if table names are valid
- [DX] Collection.find reports an error more quickly if an obviously invalid ID is passed
- [DX] Intializing Database with invalid model classes will now show a helpful error
- [DX] DatabaseProvider shows a more helpful error if used improperly
- [Sync] Sync no longer fails if pullChanges returns collections that don't exist on the frontend - shows a warning instead. This is to make building backwards-compatible backends less error-prone
- [Sync] [Docs] Sync documentation has been rewritten, and is now closer in detail to a formal specification
- [Hardening] database.collections.get() better validates passed value
- [Hardening] Prevents unsafe strings from being passed as column name/table name arguments in QueryDescription

### Fixes

- [Sync] Fixed `RangeError: Maximum call stack size exceeded` when syncing large amounts of data - @leninlin
- [iOS] Fixed a bug that could cause a database operation to fail with an (6) SQLITE_LOCKED error
- [iOS] Fixed 'jsi/jsi.h' file not found when building at the consumer level. Added path `$(SRCROOT)/../../../../../ios/Pods/Headers/Public/React-jsi` to Header Search Paths (issue #691) - @victorbutler
- [Native] SQLite keywords used as table or column names no longer crash
- Fixed potential issues when subscribing to database, collection, model, queries passing a subscriber function with the same identity more than once

### Internal

- Fixed broken adapter tests

## 0.15.1, 0.16.1-fix, 0.16.2 - 2020-06-03

This is a security patch for a vulnerability that could cause maliciously crafted record IDs to
cause all or some of user's data to be deleted. More information available via GitHub security advisory

## 0.16.1 - 2020-05-18

### Changes

- `Database.unsafeResetDatabase()` is now less unsafe — more application bugs are being caught

### Fixes

- [iOS] Fix build in apps using Flipper
- [Typescript] Added type definition for `setGenerator`.
- [Typescript] Fixed types of decorators.
- [Typescript] Add Tests to test Types.
- Fixed typo in learn-to-use docs.
- [Typescript] Fixed types of changes.

### Internal

- [SQLite] Infrastruture for a future JSI adapter has been added

## 0.16 - 2020-03-06

### ⚠️ Breaking

- `experimentalUseIncrementalIndexedDB` has been renamed to `useIncrementalIndexedDB`

#### Low breakage risk

- [adapters] Adapter API has changed from returning Promise to taking callbacks as the last argument. This won't affect you unless you call on adapter methods directly. `database.adapter` returns a new `DatabaseAdapterCompat` which has the same shape as old adapter API. You can use `database.adapter.underlyingAdapter` to get back `SQLiteAdapter` / `LokiJSAdapter`
- [Collection] `Collection.fetchQuery` and `Collection.fetchCount` are removed. Please use `Query.fetch()` and `Query.fetchCount()`.

### New features

- [SQLiteAdapter] [iOS] Add new `synchronous` option to adapter: `new SQLiteAdapter({ ..., synchronous: true })`.
  When enabled, database operations will block JavaScript thread. Adapter actions will resolve in the
  next microtask, which simplifies building flicker-free interfaces. Adapter will fall back to async
  operation when synchronous adapter is not available (e.g. when doing remote debugging)
- [LokiJS] Added new `onQuotaExceededError?: (error: Error) => void` option to `LokiJSAdapter` constructor.
  This is called when underlying IndexedDB encountered a quota exceeded error (ran out of allotted disk space for app)
  This means that app can't save more data or that it will fall back to using in-memory database only
  Note that this only works when `useWebWorker: false`

### Changes

- [Performance] Watermelon internals have been rewritten not to rely on Promises and allow some fetch/observe calls to resolve synchronously. Do not rely on this -- external API is still based on Rx and Promises and may resolve either asynchronously or synchronously depending on capabilities. This is meant as a internal performance optimization only for the time being.
- [LokiJS] [Performance] Improved worker queue implementation for performance
- [observation] Refactored observer implementations for performance

### Fixes

- Fixed a possible cause for "Record ID xxx#yyy was sent over the bridge, but it's not cached" error
- [LokiJS] Fixed an issue preventing database from saving when using `experimentalUseIncrementalIndexedDB`
- Fixed a potential issue when using `database.unsafeResetDatabase()`
- [iOS] Fixed issue with clearing database under experimental synchronous mode

### New features (Experimental)

- [Model] Added experimental `model.experimentalSubscribe((isDeleted) => { ... })` method as a vanilla JS alternative to Rx based `model.observe()`. Unlike the latter, it does not notify the subscriber immediately upon subscription.
- [Collection] Added internal `collection.experimentalSubscribe((changeSet) => { ... })` method as a vanilla JS alternative to Rx based `collection.changes` (you probably shouldn't be using this API anyway)
- [Database] Added experimental `database.experimentalSubscribe(['table1', 'table2'], () => { ... })` method as a vanilla JS alternative to Rx-based `database.withChangesForTables()`. Unlike the latter, `experimentalSubscribe` notifies the subscriber only once after a batch that makes a change in multiple collections subscribed to. It also doesn't notify the subscriber immediately upon subscription, and doesn't send details about the changes, only a signal.
- Added `experimentalDisableObserveCountThrottling()` to `@nozbe/watermelondb/observation/observeCount` that globally disables count observation throttling. We think that throttling on WatermelonDB level is not a good feature and will be removed in a future release - and will be better implemented on app level if necessary
- [Query] Added experimental `query.experimentalSubscribe(records => { ... })`, `query.experimentalSubscribeWithColumns(['col1', 'col2'], records => { ... })`, and `query.experimentalSubscribeToCount(count => { ... })` methods

## 0.15 - 2019-11-08

### Highlights

This is a **massive** new update to WatermelonDB! 🍉

- **Up to 23x faster sync**. You heard that right. We've made big improvements to performance.
  In our tests, with a massive sync (first login, 45MB of data / 65K records) we got a speed up of:

  - 5.7s -> 1.2s on web (5x)
  - 142s -> 6s on iOS (23x)

  Expect more improvements in the coming releases!

- **Improved LokiJS adapter**. Option to disable web workers, important Safari 13 fix, better performance,
  and now works in Private Modes. We recommend adding `useWebWorker: false, experimentalUseIncrementalIndexedDB: true` options to the `LokiJSAdapter` constructor to take advantage of the improvements, but please read further changelog to understand the implications of this.
- **Raw SQL queries** now available on iOS and Android thanks to the community
- **Improved TypeScript support** — thanks to the community

### ⚠️ Breaking

- Deprecated `bool` schema column type is removed -- please change to `boolean`
- Experimental `experimentalSetOnlyMarkAsChangedIfDiffers(false)` API is now removed

### New featuers

- [Collection] Add `Collection.unsafeFetchRecordsWithSQL()` method. You can use it to fetch record using
  raw SQL queries on iOS and Android. Please be careful to avoid SQL injection and other pitfalls of
  raw queries
- [LokiJS] Introduces new `new LokiJSAdapter({ ..., experimentalUseIncrementalIndexedDB: true })` option.
  When enabled, database will be saved to browser's IndexedDB using a new adapter that only saves the
  changed records, instead of the entire database.

  **This works around a serious bug in Safari 13** (https://bugs.webkit.org/show_bug.cgi?id=202137) that causes large
  databases to quickly balloon to gigabytes of temporary trash

  This also improves performance of incremental saves, although initial page load or very, very large saves
  might be slightly slower.

  This is intended to become the new default option, but it's not backwards compatible (if enabled, old database
  will be lost). **You're welcome to contribute an automatic migration code.**

  Note that this option is still experimental, and might change in breaking ways at any time.

- [LokiJS] Introduces new `new LokiJSAdapter({ ..., useWebWorker: false })` option. Before, web workers
  were always used with `LokiJSAdapter`. Although web workers may have some performance benefits, disabling them
  may lead to lower memory consumption, lower latency, and easier debugging. YMMV.
- [LokiJS] Added `onIndexedDBVersionChange` option to `LokiJSAdapter`. This is a callback that's called
  when internal IDB version changed (most likely the database was deleted in another browser tab).
  Pass a callback to force log out in this copy of the app as well. Note that this only works when
  using incrementalIDB and not using web workers
- [Model] Add `Model._dangerouslySetRawWithoutMarkingColumnChange()` method. You probably shouldn't use it,
  but if you know what you're doing and want to live-update records from server without marking record as updated,
  this is useful
- [Collection] Add `Collection.prepareCreateFromDirtyRaw()`
- @json decorator sanitizer functions take an optional second argument, with a reference to the model

### Fixes

- Pinned required `rambdax` version to 2.15.0 to avoid console logging bug. In a future release we will switch to our own fork of `rambdax` to avoid future breakages like this.

### Improvements

- [Performance] Make large batches a lot faster (1.3s shaved off on a 65K insert sample)
- [Performance] [iOS] Make large batch inserts an order of magnitude faster
- [Performance] [iOS] Make encoding very large queries (with thousands of parameters) 20x faster
- [Performance] [LokiJS] Make batch inserts faster (1.5s shaved off on a 65K insert sample)
- [Performance] [LokiJS] Various performance improvements
- [Performance] [Sync] Make Sync faster
- [Performance] Make observation faster
- [Performance] [Android] Make batches faster
- Fix app glitches and performance issues caused by race conditions in `Query.observeWithColumns()`
- [LokiJS] Persistence adapter will now be automatically selected based on availability. By default,
  IndexedDB is used. But now, if unavailable (e.g. in private mode), ephemeral memory adapter will be used.
- Disabled console logs regarding new observations (it never actually counted all observations) and
  time to query/count/batch (the measures were wildly inaccurate because of asynchronicity - actual
  times are much lower)
- [withObservables] Improved performance and debuggability (update withObservables package separately)
- Improved debuggability of Watermelon -- shortened Rx stacks and added function names to aid in understanding
  call stacks and profiles
- [adapters] The adapters interface has changed. `query()` and `count()` methods now receive a `SerializedQuery`, and `batch()` now takes `TableName&lt;any>` and `RawRecord` or `RecordId` instead of `Model`.
- [Typescript] Typing improvements
  - Added 3 missing properties `collections`, `database` and `asModel` in Model type definition.
  - Removed optional flag on `actionsEnabled` in the Database constructor options since its mandatory since 0.13.0.
  - fixed several further typing issues in Model, Relation and lazy decorator
- Changed how async functions are transpiled in the library. This could break on really old Android phones
  but shouldn't matter if you use latest version of React Native. Please report an issue if you see a problem.
- Avoid `database` prop drilling in the web demo

## 0.14.1 - 2019-08-31

Hotfix for rambdax crash

- [Schema] Handle invalid table schema argument in appSchema
- [withObservables] Added TypeScript support ([changelog](https://github.com/Nozbe/withObservables/blob/master/CHANGELOG.md))
- [Electron] avoid `Uncaught ReferenceError: global is not defined` in electron runtime ([#453](https://github.com/Nozbe/WatermelonDB/issues/453))
- [rambdax] Replaces `contains` with `includes` due to `contains` deprecation https://github.com/selfrefactor/rambda/commit/1dc1368f81e9f398664c9d95c2efbc48b5cdff9b#diff-04c6e90faac2675aa89e2176d2eec7d8R2209

## 0.14.0 - 2019-08-02

### New features

- [Query] Added support for `notLike` queries 🎉
- [Actions] You can now batch delete record with all descendants using experimental functions `experimentalMarkAsDeleted` or `experimentalDestroyPermanently`

## 0.13.0 - 2019-07-18

### ⚠️ Breaking

- [Database] It is now mandatory to pass `actionsEnabled:` option to Database constructor.
  It is recommended that you enable this option:

  ```js
  const database = new Database({
    adapter: ...,
    modelClasses: [...],
    actionsEnabled: true
  })
  ```

  See `docs/Actions.md` for more details about Actions. You can also pass `false` to maintain
  backward compatibility, but this option **will be removed** in a later version

- [Adapters] `migrationsExperimental` prop of `SQLiteAdapter` and `LokiJSAdapter` has been renamed
  to `migrations`.

### New features

- [Actions] You can now batch deletes by using `prepareMarkAsDeleted` or `prepareDestroyPermanently`
- [Sync] Performance: `synchronize()` no longer calls your `pushChanges()` function if there are no
  local changes to push. This is meant to save unnecessary network bandwidth. ⚠️ Note that this
  could be a breaking change if you rely on it always being called
- [Sync] When setting new values to fields on a record, the field (and record) will no longer be
  marked as changed if the field's value is the same. This is meant to improve performance and avoid
  unnecessary code in the app. ⚠️ Note that this could be a breaking change if you rely on the old
  behavior. For now you can import `experimentalSetOnlyMarkAsChangedIfDiffers` from
  `@nozbe/watermelondb/Model/index` and call if with `(false)` to bring the old behavior back, but
  this will be removed in the later version -- create a new issue explaining why you need this
- [Sync] Small perf improvements

### Improvements

- [Typescript] Improved types for SQLite and LokiJS adapters, migrations, models, the database and the logger.

## 0.12.3 - 2019-05-06

### Changes

- [Database] You can now update the random id schema by importing
  `import { setGenerator } from '@nozbe/watermelondb/utils/common/randomId'` and then calling `setGenerator(newGenenerator)`.
  This allows WatermelonDB to create specific IDs for example if your backend uses UUIDs.
- [Typescript] Type improvements to SQLiteAdapter and Database
- [Tests] remove cleanup for react-hooks-testing-library@0.5.0 compatibility

## 0.12.2 - 2019-04-19

### Fixes

- [TypeScript] 'Cannot use 'in' operator to search for 'initializer'; decorator fix

### Changes

- [Database] You can now pass falsy values to `Database.batch(...)` (false, null, undefined). This is
  useful in keeping code clean when doing operations conditionally. (Also works with `model.batch(...)`)
- [Decorators]. You can now use `@action` on methods of any object that has a `database: Database`
  property, and `@field @children @date @relation @immutableRelation @json @text @nochange` decorators on
  any object with a `asModel: Model` property.
- [Sync] Adds a temporary/experimental `_unsafeBatchPerCollection: true` flag to `synchronize()`. This
  causes server changes to be committed to database in multiple batches, and not one. This is NOT preferred
  for reliability and performance reasons, but it works around a memory issue that might cause your app
  to crash on very large syncs (>20,000 records). Use this only if necessary. Note that this option
  might be removed at any time if a better solution is found.

## 0.12.1 - 2019-04-01

### ⚠️ Hotfix

- [iOS] Fix runtime crash when built with Xcode 10.2 (Swift 5 runtime).

  **⚠️ Note**: You need to upgrade to React Native 0.59.3 for this to work. If you can't upgrade
  React Native yet, either stick to Xcode 10.1 or manually apply this patch:
  https://github.com/Nozbe/WatermelonDB/pull/302/commits/aa4e08ad0fa55f434da2a94407c51fc5ff18e506

### Changes

- [Sync] Adds basic sync logging capability to Sync. Pass an empty object to `synchronize()` to populate it with diagnostic information:
  ```js
  const log = {}
  await synchronize({ database, log, ...})
  console.log(log.startedAt)
  ```
  See Sync documentation for more details.

## 0.12.0 - 2019-03-18

### Added

- [Hooks] new `useDatabase` hook for consuming the Database Context:
  ```js
  import { useDatabase } from '@nozbe/watermelondb/hooks'
  const Component = () => {
    const database = useDatabase()
  }
  ```
- [TypeScript] added `.d.ts` files. Please note: TypeScript definitions are currently incomplete and should be used as a guide only. **PRs for improvements would be greatly appreciated!**

### Performance

- Improved UI performance by consolidating multiple observation emissions into a single per-collection batch emission when doing batch changes

## 0.11.0 - 2019-03-12

### Breaking

- ⚠️ Potentially BREAKING fix: a `@date` field now returns a Jan 1, 1970 date instead of `null` if the field's raw value is `0`.
  This is considered a bug fix, since it's unexpected to receive a `null` from a getter of a field whose column schema doesn't say `isOptional: true`.
  However, if you relied on this behavior, this might be a breaking change.
- ⚠️ BREAKING: `Database.unsafeResetDatabase()` now requires that you run it inside an Action

### Bug fixes

- [Sync] Fixed an issue where synchronization would continue running despite `unsafeResetDatabase` being called
- [Android] fix compile error for kotlin 1.3+

### Other changes

- Actions are now aborted when `unsafeResetDatabase()` is called, making reseting database a little bit safer
- Updated demo dependencies
- LokiJS is now a dependency of WatermelonDB (although it's only required for use on the web)
- [Android] removed unused test class
- [Android] updated ktlint to `0.30.0`

## 0.10.1 - 2019-02-12

### Changes

- [Android] Changed `compile` to `implementation` in Library Gradle file
  - ⚠️ might break build if you are using Android Gradle Plugin &lt;3.X
- Updated `peerDependency` `react-native` to `0.57.0`
- [Sync] Added `hasUnsyncedChanges()` helper method
- [Sync] Improved documentation for backends that can't distinguish between `created` and `updated` records
- [Sync] Improved diagnostics / protection against edge cases
- [iOS] Add missing `header search path` to support **ejected** expo project.
- [Android] Fix crash on android &lt; 5.0
- [iOS] `SQLiteAdapter`'s `dbName` path now allows you to pass an absolute path to a file, instead of a name
- [Web] Add adaptive layout for demo example with smooth scrolling for iOS

## 0.10.0 - 2019-01-18

### Breaking

- **BREAKING:** Table column `last_modified` is no longer automatically added to all database tables. If
  you don't use this column (e.g. in your custom sync code), you don't have to do anything.
  If you do, manually add this column to all table definitions in your Schema:
  ```
  { name: 'last_modified', type: 'number', isOptional: true }
  ```
  **Don't** bump schema version or write a migration for this.

### New

- **Actions API**.

  This was actually released in 0.8.0 but is now documented.
  With Actions enabled, all create/update/delete/batch calls must be wrapped in an Action.

  To use Actions, call `await database.action(async () => { /* perform writes here */ }`, and in
  Model instance methods, you can just decorate the whole method with `@action`.

  This is necessary for Watermelon Sync, and also to enable greater safety and consistency.

  To enable actions, add `actionsEnabled: true` to `new Database({ ... })`. In a future release this
  will be enabled by default, and later, made mandatory.

  See documentation for more details.

- **Watermelon Sync Adapter** (Experimental)

  Added `synchronize()` function that allows you to easily add full synchronization capabilities to
  your Watermelon app. You only need to provide two fetch calls to your remote server that conforms
  to Watermelon synchronization protocol, and all the client-side processing (applying remote changes,
  resolving conflicts, finding local changes, and marking them as synced) is done by Watermelon.

  See documentation for more details.

- **Support caching for non-global IDs at Native level**

## 0.9.0 - 2018-11-23

### New

- Added `Q.like` - you can now make queries similar to SQL `LIKE`

## 0.8.0 - 2018-11-16

### New

- Added `DatabaseProvider` and `withDatabase` Higher-Order Component to reduce prop drilling
- Added experimental Actions API. This will be documented in a future release.

### Fixes

- Fixes crash on older Android React Native targets without `jsc-android` installed

## 0.7.0 - 2018-10-31

### Deprecations

- [Schema] Column type 'bool' is deprecated — change to 'boolean'

### New

- Added support for Schema Migrations. See documentation for more details.
- Added fundaments for integration of Danger with Jest

### Changes

- Fixed "dependency cycle" warning
- [SQLite] Fixed rare cases where database could be left in an unusable state (added missing transaction)
- [Flow] Fixes `oneOf()` typing and some other variance errors
- [React Native] App should launch a little faster, because schema is only compiled on demand now
- Fixed typos in README.md
- Updated Flow to 0.85

## 0.6.2 - 2018-10-04

### Deprecations

- The `@nozbe/watermelondb/babel/cjs` / `@nozbe/watermelondb/babel/esm` Babel plugin that ships with Watermelon is deprecated and no longer necessary. Delete it from your Babel config as it will be removed in a future update

### Refactoring

- Removed dependency on `async` (Web Worker should be ~30KB smaller)
- Refactored `Collection` and `simpleObserver` for getting changes in an array and also adds CollectionChangeTypes for differentiation between different changes
- Updated dependencies
- Simplified build system by using relative imports
- Simplified build package by outputting CJS-only files

## 0.6.1 - 2018-09-20

### Added

- Added iOS and Android integration tests and lint checks to TravisCI

### Changed

- Changed Flow setup for apps using Watermelon - see docs/Advanced/Flow.md
- Improved documentation, and demo code
- Updated dependencies

### Fixed

- Add quotes to all names in sql queries to allow keywords as table or column names
- Fixed running model tests in apps with Watermelon in the loop
- Fixed Flow when using Watermelon in apps

## 0.6.0 - 2018-09-05

Initial release of WatermelonDB


================================================
FILE: docs-website/docs/docs/CONTRIBUTING.md
================================================
---
title: Contributing
hide_title: true
---

<img src="https://github.com/Nozbe/WatermelonDB/raw/master/assets/needyou.jpg" alt="We need you" width="220" />

**WatermelonDB is an open-source project and it needs your help to thrive!**

If there's a missing feature, a bug, or other improvement you'd like, we encourage you to contribute! Feel free to open an issue to get some guidance and see [Contributing guide](./CONTRIBUTING.md) for details about project setup, testing, etc.

If you're just getting started, see [good first issues](https://github.com/Nozbe/WatermelonDB/issues?q=is%3Aopen+is%3Aissue+label%3A%22good+first+issue%22) that are easy to contribute to. If you make a non-trivial contribution, email me, and I'll send you a nice 🍉 sticker!

If you make or are considering making an app using WatermelonDB, please let us know!

<br />


## Before you send a pull request

1. Did you add or changed some functionality?

   Add (or modify) tests!
2. Check if the automated tests pass
   ```bash
   yarn ci:check
   ```
3. Format the files you changed
   ```bash
   yarn prettier
   ```
4. Mark your changes in CHANGELOG

   Put a one-line description of your change under Added/Changed section. See [Keep a Changelog](https://keepachangelog.com/en/1.0.0/).

## Running Watermelon in development

### Download source and dependencies

```bash
git clone https://github.com/Nozbe/WatermelonDB.git
cd WatermelonDB
yarn
```

### Developing Watermelon alongside your app

To work on Watermelon code in the sandbox of your app:

```bash
yarn dev
```

This will create a `dev/` folder in Watermelon and observe changes to source files (only JavaScript files) and recompile them as needed.

Then in your app:

```bash
cd node_modules/@nozbe
rm -fr watermelondb
ln -s path-to-watermelondb/dev watermelondb
```

**This will work in Webpack but not in Metro** (React Native). Metro doesn't follow symlinks. Instead, you can compile WatermelonDB directly to your project:

```bash
DEV_PATH="/path/to/your/app/node_modules/@nozbe/watermelondb" yarn dev
```

### Running tests

This runs Jest, ESLint and Flow:

```bash
yarn ci:check
```

You can also run them separately:

```bash
yarn test
yarn eslint
yarn flow
```

### Editing files

We recommend VS Code with ESLint, Flow, and Prettier (with prettier-eslint enabled) plugins for best development experience. (To see lint/type issues inline + have automatic reformatting of code)

## Editing native code

In `native/ios` and `native/android` you'll find the native bridge code for React Native.

It's recommended to use the latest stable version of Xcode / Android Studio to work on that code.

### Integration tests

If you change native bridge code or `adapter/sqlite` code, it's recommended to run integration tests that run the entire Watermelon code with SQLite and React Native in the loop:

```bash
yarn test:ios
yarn test:android
```

### Running tests manualy

- For iOS open the `native/iosTest/WatermelonTester.xcworkspace` project and hit Cmd+U.
- For Android open `native/androidTest` in AndroidStudio navigate to `app/src/androidTest/java/com.nozbe.watermelonTest/BridgeTest` and click green arrow near `class BridgeTest`

### Native linting

Make sure the native code you're editing conforms to Watermelon standards:

```bash
yarn ktlint
```

### Native code troubleshooting

1. If `test:ios` fails in terminal:
- Run tests in Xcode first before running from terminal
- Make sure you have the right version of Xcode CLI tools set in Preferences -> Locations
1. Make sure you're on the most recent stable version of Xcode / Android Studio
1. Remove native caches:
- Xcode: `~/Library/Developer/Xcode/DerivedData`:
- Android: `.gradle` and `build` folders in `native/android` and `native/androidTest`
- `node_modules` (because of React Native precompiled third party libraries)




================================================
FILE: docs-website/docs/docs/CRUD.md
================================================
# Create, Read, Update, Delete

When you have your [Schema](./Schema.md) and [Models](./Model.md) defined, learn how to manipulate them!

## Reading

#### Get a collection

The `Collection` object is how you find, query, and create new records of a given type.

```js
const postsCollection = database.get('posts')
```

Pass the [table name](./Schema.md) as the argument.

#### Find a record (by ID)

```js
const postId = 'abcdefgh'
const post = await database.get('posts').find(postId)
```

`find()` returns a Promise. If the record cannot be found, the Promise will be rejected.

#### Query records

Find a list of records matching given conditions by making a Query and then fetching it:

```js
const allPosts = await database.get('posts').query().fetch()
const numberOfStarredPosts = await database.get('posts').query(
  Q.where('is_starred', true)
).fetchCount()
```

**➡️ Learn more:** [Queries](./Query.md)

## Modifying the database

All modifications to the database (like creating, updating, deleting records) must be done **in a Writer**, either by wrapping your work in `database.write()`:

```js
await database.write(async () => {
  const someComment = await database.get('comments').find(commentId)
  await someComment.update((comment) => {
    comment.isSpam = true
  })
})
```

Or by defining a `@writer` method on a Model:

```js
import { writer } from '@nozbe/watermelondb/decorators'

class Comment extends Model {
  // (...)
  @writer async markAsSpam() {
    await this.update(comment => {
      comment.isSpam = true
    })
  }
}
```

**➡️ Learn more:** [Writers](./Writers.md)

### Create a new record

```js
const newPost = await database.get('posts').create(post => {
  post.title = 'New post'
  post.body = 'Lorem ipsum...'
})
```

`.create()` takes a "builder function". In the example above, the builder will get a `Post` object as an argument. Use this object to set values for [fields you defined](./Model.md).

**Note:** Always `await` the Promise returned by `create` before you access the created record.

**Note:** You can only set fields inside `create()` or `update()` builder functions.

### Update a record

```js
await somePost.update(post => {
  post.title = 'Updated title'
})
```

Like creating, updating takes a builder function, where you can use field setters.

**Note:** Always `await` the Promise returned by `update` before you access the modified record.

### Delete a record

There are two ways of deleting records: syncable (mark as deleted), and permanent.

If you only use Watermelon as a local database, destroy records permanently, if you [synchronize](./Sync/Intro.md), mark as deleted instead.

```js
await somePost.markAsDeleted() // syncable
await somePost.destroyPermanently() // permanent
```

**Note:** Do not access, update, or observe records after they're deleted.

## Advanced

- `Model.observe()` - usually you only use this [when connecting records to components](./Components.md), but you can manually observe a record outside of React components. The returned [RxJS](https://github.com/reactivex/rxjs) `Observable` will emit the record immediately upon subscription, and then every time the record is updated. If the record is deleted, the Observable will complete.
- `Query.observe()`, `Relation.observe()` — analagous to the above, but for [Queries](./Query.md) and [Relations](./Relation.md)
- `Query.observeWithColumns()` - used for [sorted lists](./Components.md)
- `Collection.findAndObserve(id)` — same as using `.find(id)` and then calling `record.observe()`
- `Model.prepareUpdate()`, `Collection.prepareCreate`, `Database.batch` — used for [batch updates](./Writers.md)
- `Database.unsafeResetDatabase()` destroys the whole database - [be sure to see this comment before using it](https://github.com/Nozbe/WatermelonDB/blob/22188ee5b6e3af08e48e8af52d14e0d90db72925/src/Database/index.js#L131)
- To override the `record.id` during the creation, e.g. to sync with a remote database, you can do it by `record._raw` property. Be aware that the `id` must be of type `string`.
    ```js
    await database.get('posts').create(post => {
      post._raw.id = serverId
    })
    ```

### Advanced: Unsafe raw execute

⚠️ Do not use this if you don't know what you're doing...

There is an escape hatch to drop down from WatermelonDB to underlying database level to execute arbitrary commands. Use as a last resort tool:

```js
await database.write(() => {
  // sqlite:
  await database.adapter.unsafeExecute({
    sqls: [
      // [sql_query, [placeholder arguments, ...]]
      ['create table temporary_test (id, foo, bar)', []],
      ['insert into temporary_test (id, foo, bar) values (?, ?, ?)', ['t1', true, 3.14]],
    ]
  })

  // lokijs:
  await database.adapter.unsafeExecute({
    loki: loki => {
      loki.addCollection('temporary_test', { unique: ['id'], indices: [], disableMeta: true })
      loki.getCollection('temporary_test').insert({ id: 't1', foo: true, bar: 3.14 })
    }
  })
})
```

* * *

## Next steps

➡️ Now that you can create and update records, [**connect them to React components**](./Components.md)



================================================
FILE: docs-website/docs/docs/Components.md
================================================
# Connecting Components

After you [define some Models](./Model.md), it's time to connect Watermelon to your app's interface. We're using React in this guide, however WatermelonDB can be used with any UI framework.

**Note:** If you're not familiar with higher-order components, read [React documentation](https://reactjs.org/docs/higher-order-components.html), check out [`recompose`](https://github.com/acdlite/recompose)… or just read the examples below to see it in practice!

## Reactive components

Here's a very simple React component rendering a `Comment` record:

```jsx
const Comment = ({ comment }) => (
  <div>
    <p>{comment.body}</p>
  </div>
)
```

Now we can fetch a comment: `const comment = await commentsCollection.find(id)` and then render it: `<Comment comment={comment} />`. The only problem is that this is **not reactive**. If the Comment is updated or deleted, the component will not re-render to reflect the changes. (Unless an update is forced manually or the parent component re-renders).

Let's enhance the component to make it _observe_ the `Comment` automatically:

```jsx
import { withObservables } from '@nozbe/watermelondb/react'

const enhance = withObservables(['comment'], ({ comment }) => ({
  comment // shortcut syntax for `comment: comment.observe()`
}))
const EnhancedComment = enhance(Comment)
export default EnhancedComment
```

Now, if we render `<EnhancedComment comment={comment} />`, it **will** update every time the comment changes.

### Reactive lists

Let's render the whole `Post` with comments:

```jsx
import { withObservables } from '@nozbe/watermelondb/react'
import EnhancedComment from 'components/Comment'

const Post = ({ post, comments }) => (
  <article>
    <h1>{post.name}</h1>
    <p>{post.body}</p>
    <h2>Comments</h2>
    {comments.map(comment =>
      <EnhancedComment key={comment.id} comment={comment} />
    )}
  </article>
)

const enhance = withObservables(['post'], ({ post }) => ({
  post,
  comments: post.comments, // Shortcut syntax for `post.comments.observe()`
}))

const EnhancedPost = enhance(Post)
export default EnhancedPost
```

Notice a couple of things:

1. We're starting with a simple non-reactive `Post` component
2. Like before, we enhance it by observing the `Post`. If the post name or body changes, it will re-render.
3. To access comments, we fetch them from the database and observe using `post.comments.observe()` and inject a new prop `comments`. (`post.comments` is a Query created using `@children`).

   Note that we can skip `.observe()` and just pass `post.comments` for convenience — `withObservables` will call observe for us
4. By **observing the Query**, the `<Post>` component will re-render if a comment is created or deleted
5. However, observing the comments Query will not re-render `<Post>` if a comment is _updated_ — we render the `<EnhancedComment>` so that _it_ observes the comment and re-renders if necessary.

### Reactive relations

The `<Comment>` component we made previously only renders the body of the comment but doesn't say who posted it.

Assume the `Comment` model has a `@relation('users', 'author_id') author` field. Let's render it:

```jsx
const Comment = ({ comment, author }) => (
  <div>
    <p>{comment.body} — by {author.name}</p>
  </div>
)

const enhance = withObservables(['comment'], ({ comment }) => ({
  comment,
  author: comment.author, // shortcut syntax for `comment.author.observe()`
}))
const EnhancedComment = enhance(Comment)
```

`comment.author` is a [Relation object](./Relation.md), and we can call `.observe()` on it to fetch the `User` and then observe changes to it. If author's name changes, the component will re-render.

**Note** again that we can also pass `Relation` objects directly for convenience, skipping `.observe()`

### Reactive optional relations

Continuing the above example, if the comment has no author, the `comment.author_id` must be null. If `comment.author_id` has a value, the author record it refers to must be stored in the database, otherwise `withObservables` will throw an error that the record was not found.


### Reactive counters

Let's make a `<PostExcerpt>` component to display on a *list* of Posts, with only a brief summary of the contents and only the number of comments it has:

```jsx
const PostExcerpt = ({ post, commentCount }) => (
  <div>
    <h1>{post.name}</h1>
    <p>{getExcerpt(post.body)}</p>
    <span>{commentCount} comments</span>
  </div>
)

const enhance = withObservables(['post'], ({ post }) => ({
  post,
  commentCount: post.comments.observeCount()
}))

const EnhancedPostExcerpt = enhance(PostExcerpt)
```

This is very similar to normal `<Post>`. We take the `Query` for post's comments, but instead of observing the _list_ of comments, we call `observeCount()`. This is far more efficient. And as always, if a new comment is posted, or one is deleted, the component will re-render with the updated count.

## Hey, what about React Hooks?

We get it — HOCs are so 2017, and Hooks are the future! And we agree.

However, Hooks are not compatible with WatermelonDB's asynchronous API. You _could_ use alternative open-source Hooks for Rx Observables, however we don't recommend that. They won't work correctly in all cases and won't be as optimized for performance with WatermelonDB as `withObservables`. In the future, once Concurrent React is fully developed and published, WatermelonDB will have official hooks.

**[See discussion about official `useObservables` Hook](https://github.com/Nozbe/withObservables/issues/16)**

## Understanding `withObservables`

Let's unpack this:

```js
withObservables(['post'], ({ post }) => ({
  post: post.observe(),
  commentCount: post.comments.observeCount()
}))
```

1. Starting from the second argument, `({ post })` are the input props for the component. Here, we receive `post` prop with a `Post` object.
2. These:
    ```js
    ({
      post: post.observe(),
      commentCount: post.comments.observeCount()
    })
    ```
    are the enhanced props we inject. The keys are props' names, and values are `Observable` objects. Here, we override the `post` prop with an observable version, and create a new `commentCount` prop.
3. The first argument: `['post']` is a list of props that trigger observation restart. So if a different `post` is passed, that new post will be observed. If you pass `[]`, the rendered Post will not change. You can pass multiple prop names if any of them should cause observation to re-start. Think of it the same way as the `deps` argument you pass to `useEffect` hook.
4. **Rule of thumb**: If you want to use a prop in the second arg function, pass its name in the first arg array

## Advanced

1. **findAndObserve**. If you have, say, a post ID from your Router (URL in the browser), you can use:
   ```js
   withObservables(['postId'], ({ postId, database }) => ({
     post: database.get('posts').findAndObserve(postId)
   }))
   ```
1. **RxJS transformations**. The values returned by `Model.observe()`, `Query.observe()`, `Relation.observe()` are [RxJS Observables](https://github.com/ReactiveX/rxjs). You can use standard transforms like mapping, filtering, throttling, startWith to change when and how the component is re-rendered.
1. **Custom Observables**. `withObservables` is a general-purpose HOC for Observables, not just Watermelon. You can create new props from any `Observable`.

### Advanced: observing sorted lists

If you have a list that's dynamically sorted (e.g. sort comments by number of likes), use `Query.observeWithColumns` to ensure the list is re-rendered when its order changes:

```jsx
// This is a function that sorts an array of comments according to its `likes` field
// I'm using `ramda` functions for this example, but you can do sorting however you like
const sortComments = sortWith([
  descend(prop('likes'))
])

const CommentList = ({ comments }) => (
  <div>
    {sortComments(comments).map(comment =>
      <EnhancedComment key={comment.id} comment={comment} />
    )}
  </div>
)

const enhance = withObservables(['post'], ({ post }) => ({
  comments: post.comments.observeWithColumns(['likes'])
}))

const EnhancedCommentList = enhance(CommentList)
```

If you inject `post.comments.observe()` into the component, the list will not re-render to change its order, only if comments are added or removed. Instead, use `query.observeWithColumns()` with an array of [**column names**](./Schema.md) you use for sorting to re-render whenever a record on the list has any of those fields changed.

### Advanced: observing 2nd level relations

If you have 2nd level relations, like author's `Contact` info, and want to connect it to a component as well, you cannot simply use `post.author.contact.observe()` in `withObservables`. Remember, `post.author` is not a `User` object, but a `Relation` that has to be asynchronously fetched.

Before accessing and observing the `Contact` relation, you need to resolve the `author` itself. Here is the simplest way to do it:

```js
import { compose } from '@nozbe/watermelondb/react'

const enhance = compose(
  withObservables(['post'], ({ post }) => ({
    post,
    author: post.author,
  })),
  withObservables(['author'], ({ author }) => ({
    contact: author.contact,
  })),
)

const EnhancedPost = enhance(PostComponent);
```

If you're not familiar with function composition, read the `enhance` function from top to bottom:

- first, the PostComponent is enhanced by changing the incoming `post` prop into its observable version, and by adding a new `author` prop that will contain the fetched contents of `post.author`
- then, the enhanced component is enhanced once again, by adding a `contact` prop containing the fetched contents of `author.contact`.

#### Alternative method of observing 2nd level relations

If you are familiar with `rxjs`, another way to achieve the same result is using `switchMap` operator:

```js
import { switchMap } from 'rxjs/operators'

const enhance = withObservables(['post'], ({post}) => ({
  post: post,
  author: post.author,
  contact: post.author.observe().pipe(switchMap(author => author.contact.observe()))
}))

const EnhancedPost = enhance(PostComponent)
```

Now `PostComponent` will have `Post`, `Author` and `Contact` props.

#### 2nd level optional relations

If you have an optional relation between `Post` and `Author`, the enhanced component might receive `null` as `author` prop. As you must always return an observable for the `contact` prop, you can use `rxjs`'s `of` function to create a default or empty `Contact` prop:

```js
import { of as of$ } from 'rxjs'
import { withObservables, compose } from '@nozbe/watermelondb/react'

const enhance = compose(
  withObservables(['post'], ({ post }) => ({
    post,
    author: post.author,
  })),
  withObservables(['author'], ({ author }) => ({
    contact: author ? author.contact.observe() : of$(null),
  })),
)
```

With the `switchMap` approach, you can do:

```js
const enhance = withObservables(['post'], ({post}) => ({
  post: post,
  author: post.author,
  contact: post.author.observe().pipe(
    switchMap(author => author ? author.contact : of$(null))
  )
}))
```

## Database Provider

To prevent prop drilling you can use the Database Provider and the `withDatabase` Higher-Order Component.

```jsx
import { DatabaseProvider } from '@nozbe/watermelondb/react'

// ...

const database = new Database({
  adapter,
  modelClasses: [Blog, Post, Comment],
})

render(
  <DatabaseProvider database={database}>
    <Root />
  </DatabaseProvider>, document.getElementById('application')
)

```

To consume the database in your components you just wrap your component like so:

```jsx
import { withDatabase, compose } from '@nozbe/watermelondb/react'

// ...

export default compose(
  withDatabase,
  withObservables([], ({ database }) => ({
    blogs: database.get('blogs').query(),
  })),
)(BlogList)

```

The database prop in the `withObservables` Higher-Order Component is provided by the database provider.

### `useDatabase`

You can also consume `Database` object using React Hooks syntax:

```js
import { useDatabase } from '@nozbe/watermelondb/react'

const Component = () => {
   const database = useDatabase()
}
```

* * *

## Next steps

➡️ Next, learn more about [**custom Queries**](./Query.md)


================================================
FILE: docs-website/docs/docs/Implementation/Architecture.md
================================================
# Architecture

## Base objects

`Database` is the root object of Watermelon. It owns:

- a `DatabaseAdapter`
- a map of `Collection`s

`DatabaseAdapter` connects Watermelon's reactive world to low-level imperative world of databases. See [Adapters](./DatabaseAdapters.md).

`Collection` manages all records of a given kind:

- it has a cache of records already fetched from the database (`RecordCache`)
- it has the public API to `find`, `query` and `create` existing records
- it implements fetch/update/delete operations on records

`Model` is an instance of a collection record. A model _class_ describes a _kind_ of a record. `Model` is the base class for your concrete models (e.g. `Post`, `Comment`, `Task`):

- it describes the specific instance - `id` + all custom fields and actions
- it has public API to `update`, `markAsDeleted` and `destroyPermanently`
- implements record-level observation `observe()`
- static fields describe base information about a model (`table`, `associations`) - See [Defining models](../Model.md)

As a general rule, `Model` manages the state of a specific instance, and `Collection` of the entire collection of records. So for example, `model.markAsDeleted()` changes the local state of called record, but then delegates to its collection to notify collection observers and actually remove from the database

`Query` is a helper object that gives us a nice API to perform queries (`query.observe()`, `query.fetchCount()`):

- created via `collection.query()`
- encapsulates a `QueryDescription` structure which actually describes the query conditions
- fetch/observe methods actually delegate to `Collection` to perform database operations
- caches `Observable`s created by `observe/observeCount` methods so they can be reused and shared

## Helper functions

Watermelon's objects and classes are meant to be as minimal as possible — only manage their own state and be an API for your app. Most logic should be stateless, and implemented as pure functions:

`QueryDescription` is a structure (object) describing the query, built using `Q.*` helper functions

`encodeMatcher()`, `simpleObserver()`, `reloadingObserver()`, `fieldObserver()` implement query observation logic.

Model decorators transform simple class properties into Watermelon-aware record fields.

Much of Adapters' logic is implemented as pure functions too. See [Adapters](./DatabaseAdapters.md).


================================================
FILE: docs-website/docs/docs/Implementation/DatabaseAdapters.md
================================================
# Database Adapters

In this guide, you'll learn how to add support for new databases and new platforms to WatermelonDB.

## Introduction

WatermelonDB is designed to be database-agnostic. It's a frontend JavaScript database framework, but its high-level abstractions can be plugged in to any underlying database, platform, or UI framework. We call the translation layer between underlying databases and high-level WatermelonDB APIs **database adapters**.

## Currently supported databases

### SQLite

Supported frameworks:

- React Native:
  - Operating systems:
    - iOS
    - Android
  - Implementations:
    - JSI adapter
    - New NativeModule (added in 0.26)
    - Legacy NativeModule (deprecated in 0.26)
- NodeJS
  - via `better-sqlite3` - contributed by Sid Ferreira

### LokiJS

Supported frameworks:

- Web
  - Storage: IndexedDB
- NodeJS
  - Storage: in-memory only

Why [LokiJS](http://techfort.github.io/LokiJS/)? WebSQL would be a perfect fit for Watermelon, but sadly is a dead API, so we must use IndexedDB, but its querying capabilities make it unsuitable as a serious database. LokiJS implements a very fast in-memory querying API, using IndexedDB as storage.

## Contribute these adapters!

Please contribute to WatermelonDB. We'd love to support these platforms and databases:

- [React Native for Windows and macOS](https://microsoft.github.io/react-native-windows/)
- [Realm database](https://github.com/realm/realm-cpp)
- SQLite for web ([sql.js](https://github.com/sql-js/sql.js/) or [absurd-sql](https://github.com/jlongster/absurd-sql))
- LokiJS NodeJS storage option
- SQLite for [Electron](https://www.electronjs.org), Tauri, etc.
- SQLite for [Capacitor](https://capacitorjs.com)

## Adding new React Native operating systems

Thanks to our cross-platform JSI (C++) SQLite adapter, it takes very little code to add support for new React Native platforms (like macOS or Windows).

All you have to do is this:

- Compile `.cpp` files in `native/shared` folder
- Link library with `sqlite3`
  - Use system-provided sqlite3 if possible (we do that on iOS)
  - If not, we ship sqlite source code via NPM `@nozbe/sqlite` package. Just add `node_modules/@nozbe/sqlite/**` to search paths and compile `node_modules/@nozbe/sqlite/*/sqlite3.c`
- Provide implementation for `native/shared/DatabasePlatform.h`
  - Please note that most of these functions can remain unimplemented (empty) for basic operation - e.g. you can skip logging, memory, turbo json support
- Provide a React Native hook that calls `Database::install(jsi::Runtime *)`

Check out `native/android-jsi` and `native/ios` for two implementation examples. You might be able to reuse some code from these, e.g. platform support stubs or `CMakeLists.txt`.

## Adding new frameworks to SQLite adapter

Let's say you want to add support for a new JS+native framework, like Electron, Tauri, NativeScript or Capacitor.

This takes more work, but ultimately, given that (iOS, Android, JS, C++, Objective-C, Java) are supported already (just for React Native and Node), you only need to develop the glue code necessary to bridge the gap between `src/adapters/sqlite` JS code, and the native but non-React-Native-specific bits. You'll need some familiarity with the platform you're trying to support, but little WatermelonDB/React Native/C++ familiary will be needed to get this done.

### JS-side glue

The general SQLite implementation is in `src/adapters/sqlite/index.js`. It forwards database calls to `this._dispatcher`. The dispatcher is the JS-side bridge/glue code.

See `src/adapters/sqlite/makeDispatcher` to see concrete dispatchers and add your own, depending on the platform's convention of calling native code. For example:

- `makeDispatcher/index.js` (Node JS) just imports more JS code, since native=JS in this case
- `makeDispatcher/index.native.js` (React Native) calls `require('react-native').NativeModules`

### Native-side glue

Depending on the capabilities of the framework you want to support, there's a few ways to go about this:

**The easy (JS-only) way**. If your framework has existing SQLite bindings in JavaScript **that work synchronously** (similar to [better-sqlite3](https://github.com/WiseLibs/better-sqlite3) in Node), you can reuse code in `src/adapters/sqlite/sqlite-node`

**The Java/Objective-C way**. If your framework targets iOS, macOS, or Android, and you're terrified of C++, you can reuse the React Native NativeModule implementation.

  - Look at `native/ios/WatermelonDB/objc/WMDatabase.{h,m}` and `WMDatabaseDriver.{h,m}` for the iOS implementation. These files contain SQLite, WatermelonDB, and iOS-specific logic, but without React Native details. You need to provide an equivalent of `WMDatabaseBridge` (the React Native glue between `WMDatabaseDriver` and JS) for your framework
  - For Android, look at `native/android/src/main/java/com/nozbe/watermelondb/WMDatabase.java` and `WMDatabaseDriver.java`

**The C++ way**. The best way is to refactor the React Native C++ JSI module to split off React Native-specific logic and leave a framework-independent core. Doing this way ensures that your port will receive support for new operating systems, and all the new features, as the core React Native module will focus on the C++ implementation in the long term. Contact @radex for guidance about this.

## Adding new databases

If you want to contribute support to new underlying databases (i.e. not SQL or LokiJS-based), this is a rough sketch of what's required:

- A new `FoodbAdapter` that conforms to `DatabaseAdapter` (`src/adapters/type.js`). You can initially skip some method 
Download .txt
gitextract_rzrk799j/

├── .eslintignore
├── .eslintrc.js
├── .flowconfig
├── .gitattributes
├── .github/
│   ├── stale.yml
│   └── workflows/
│       └── ci.yml
├── .gitignore
├── .imgbotconfig
├── CHANGELOG-Unreleased.md
├── CHANGELOG.md
├── CONTRIBUTING.md
├── Gemfile
├── LICENSE
├── README.md
├── SECURITY.md
├── WatermelonDB.podspec
├── babel.config.js
├── docs-website/
│   ├── .gitignore
│   ├── README.md
│   ├── babel.config.js
│   ├── blog/
│   │   ├── 2021-08-01-mdx-blog-post.mdx
│   │   └── authors.yml
│   ├── docs/
│   │   └── docs/
│   │       ├── Advanced/
│   │       │   ├── AdvancedFields.md
│   │       │   ├── CreateUpdateTracking.md
│   │       │   ├── Flow.md
│   │       │   ├── LocalStorage.md
│   │       │   ├── Logging.md
│   │       │   ├── Migrations.md
│   │       │   ├── Performance.md
│   │       │   ├── ProTips.md
│   │       │   └── SharingDatabaseAcrossTargets.md
│   │       ├── CHANGELOG.md
│   │       ├── CONTRIBUTING.md
│   │       ├── CRUD.md
│   │       ├── Components.md
│   │       ├── Implementation/
│   │       │   ├── Architecture.md
│   │       │   ├── DatabaseAdapters.md
│   │       │   ├── Publishing.md
│   │       │   └── SyncImpl.md
│   │       ├── Installation.mdx
│   │       ├── Model.md
│   │       ├── Query.md
│   │       ├── README.md
│   │       ├── Relation.md
│   │       ├── Roadmap.md
│   │       ├── Schema.md
│   │       ├── Setup.md
│   │       ├── Sync/
│   │       │   ├── Backend.md
│   │       │   ├── Contribute.md
│   │       │   ├── FAQ.md
│   │       │   ├── Frontend.md
│   │       │   ├── Intro.md
│   │       │   ├── Limitations.md
│   │       │   └── Troubleshoot.md
│   │       └── Writers.md
│   ├── docusaurus.config.js
│   ├── package.json
│   ├── sidebars.js
│   ├── src/
│   │   ├── components/
│   │   │   └── HomepageFeatures/
│   │   │       ├── index.js
│   │   │       └── styles.module.css
│   │   ├── css/
│   │   │   └── custom.css
│   │   └── pages/
│   │       ├── index.js
│   │       └── index.module.css
│   └── static/
│       ├── .nojekyll
│       └── CNAME
├── examples/
│   └── typescript/
│       ├── AppSchema.ts
│       ├── __typetests__/
│       │   ├── README.md
│       │   ├── index.ts
│       │   ├── query.ts
│       │   └── withObservables.tsx
│       ├── package.json
│       ├── ts-example.ts
│       └── tsconfig.json
├── flow-typed/
│   ├── custom/
│   │   ├── lokijs.js
│   │   └── react-native.js
│   └── npm/
│       └── rxjs_v6.x.js
├── jest.config.js
├── metro.config.js
├── native/
│   ├── .clang-format
│   ├── .gitignore
│   ├── android/
│   │   ├── .gitignore
│   │   ├── build.gradle
│   │   ├── gradle.properties
│   │   └── src/
│   │       └── main/
│   │           ├── AndroidManifest.xml
│   │           └── java/
│   │               └── com/
│   │                   └── nozbe/
│   │                       └── watermelondb/
│   │                           ├── Connection.java
│   │                           ├── DatabaseUtils.java
│   │                           ├── MigrationNeededError.java
│   │                           ├── Queries.java
│   │                           ├── SchemaNeededError.java
│   │                           ├── WMDatabase.java
│   │                           ├── WMDatabaseBridge.java
│   │                           ├── WMDatabaseDriver.java
│   │                           ├── WatermelonDBPackage.java
│   │                           └── utils/
│   │                               ├── MigrationSet.java
│   │                               ├── Pair.java
│   │                               └── Schema.java
│   ├── android-jsi/
│   │   ├── .gitignore
│   │   ├── build.gradle
│   │   └── src/
│   │       └── main/
│   │           ├── AndroidManifest.xml
│   │           ├── cpp/
│   │           │   ├── CMakeLists.txt
│   │           │   ├── DatabasePlatformAndroid.cpp
│   │           │   ├── DatabasePlatformAndroid.h
│   │           │   └── JSIInstaller.cpp
│   │           └── java/
│   │               └── com/
│   │                   └── nozbe/
│   │                       └── watermelondb/
│   │                           ├── WatermelonDBJSIModule.java
│   │                           └── jsi/
│   │                               ├── JSIInstaller.java
│   │                               ├── WatermelonDBJSIPackage.java
│   │                               └── WatermelonJSI.java
│   ├── androidTest/
│   │   ├── .gitignore
│   │   ├── app/
│   │   │   ├── BUCK
│   │   │   ├── DemoKeystore.keystore
│   │   │   ├── build.gradle
│   │   │   ├── proguard-rules.pro
│   │   │   └── src/
│   │   │       ├── androidTest/
│   │   │       │   └── java/
│   │   │       │       └── com/
│   │   │       │           └── nozbe/
│   │   │       │               └── watermelonTest/
│   │   │       │                   └── BridgeTest.kt
│   │   │       └── main/
│   │   │           ├── AndroidManifest.xml
│   │   │           ├── java/
│   │   │           │   └── com/
│   │   │           │       └── nozbe/
│   │   │           │           └── watermelonTest/
│   │   │           │               ├── BridgeTestReporter.kt
│   │   │           │               ├── MainActivity.kt
│   │   │           │               ├── MainApplication.kt
│   │   │           │               └── NativeModulesPackage.kt
│   │   │           └── res/
│   │   │               └── values/
│   │   │                   └── strings.xml
│   │   ├── build.gradle
│   │   ├── gradle/
│   │   │   └── wrapper/
│   │   │       ├── gradle-wrapper.jar
│   │   │       └── gradle-wrapper.properties
│   │   ├── gradle.properties
│   │   ├── gradlew
│   │   ├── gradlew.bat
│   │   ├── keystores/
│   │   │   ├── BUCK
│   │   │   └── debug.keystore.properties
│   │   └── settings.gradle
│   ├── ios/
│   │   └── WatermelonDB/
│   │       ├── DatabasePlatformIOS.mm
│   │       ├── FMDB/
│   │       │   ├── LICENSE.txt
│   │       │   ├── README.markdown
│   │       │   └── src/
│   │       │       └── fmdb/
│   │       │           ├── FMDB.h
│   │       │           ├── FMDatabase.h
│   │       │           ├── FMDatabase.m
│   │       │           ├── FMDatabaseAdditions.h
│   │       │           ├── FMDatabaseAdditions.m
│   │       │           ├── FMDatabasePool.h
│   │       │           ├── FMDatabasePool.m
│   │       │           ├── FMDatabaseQueue.h
│   │       │           ├── FMDatabaseQueue.m
│   │       │           ├── FMResultSet.h
│   │       │           └── FMResultSet.m
│   │       ├── JSIInstaller.h
│   │       ├── JSIInstaller.mm
│   │       ├── WatermelonDB.h
│   │       └── objc/
│   │           ├── WMDatabase.h
│   │           ├── WMDatabase.m
│   │           ├── WMDatabaseBridge.h
│   │           ├── WMDatabaseBridge.m
│   │           ├── WMDatabaseDriver.h
│   │           └── WMDatabaseDriver.m
│   ├── iosTest/
│   │   ├── .xcode.env
│   │   ├── Podfile
│   │   ├── Pods/
│   │   │   ├── DoubleConversion/
│   │   │   │   ├── LICENSE
│   │   │   │   ├── README
│   │   │   │   └── double-conversion/
│   │   │   │       ├── bignum-dtoa.cc
│   │   │   │       ├── bignum-dtoa.h
│   │   │   │       ├── bignum.cc
│   │   │   │       ├── bignum.h
│   │   │   │       ├── cached-powers.cc
│   │   │   │       ├── cached-powers.h
│   │   │   │       ├── diy-fp.cc
│   │   │   │       ├── diy-fp.h
│   │   │   │       ├── double-conversion.cc
│   │   │   │       ├── double-conversion.h
│   │   │   │       ├── fast-dtoa.cc
│   │   │   │       ├── fast-dtoa.h
│   │   │   │       ├── fixed-dtoa.cc
│   │   │   │       ├── fixed-dtoa.h
│   │   │   │       ├── ieee.h
│   │   │   │       ├── strtod.cc
│   │   │   │       ├── strtod.h
│   │   │   │       └── utils.h
│   │   │   ├── Local Podspecs/
│   │   │   │   ├── DoubleConversion.podspec.json
│   │   │   │   ├── FBLazyVector.podspec.json
│   │   │   │   ├── RCT-Folly.podspec.json
│   │   │   │   ├── RCTDeprecation.podspec.json
│   │   │   │   ├── RCTRequired.podspec.json
│   │   │   │   ├── RCTTypeSafety.podspec.json
│   │   │   │   ├── React-Codegen.podspec.json
│   │   │   │   ├── React-Core.podspec.json
│   │   │   │   ├── React-CoreModules.podspec.json
│   │   │   │   ├── React-Fabric.podspec.json
│   │   │   │   ├── React-FabricImage.podspec.json
│   │   │   │   ├── React-ImageManager.podspec.json
│   │   │   │   ├── React-Mapbuffer.podspec.json
│   │   │   │   ├── React-NativeModulesApple.podspec.json
│   │   │   │   ├── React-RCTActionSheet.podspec.json
│   │   │   │   ├── React-RCTAnimation.podspec.json
│   │   │   │   ├── React-RCTAppDelegate.podspec.json
│   │   │   │   ├── React-RCTBlob.podspec.json
│   │   │   │   ├── React-RCTFabric.podspec.json
│   │   │   │   ├── React-RCTImage.podspec.json
│   │   │   │   ├── React-RCTLinking.podspec.json
│   │   │   │   ├── React-RCTNetwork.podspec.json
│   │   │   │   ├── React-RCTSettings.podspec.json
│   │   │   │   ├── React-RCTText.podspec.json
│   │   │   │   ├── React-RCTVibration.podspec.json
│   │   │   │   ├── React-RuntimeApple.podspec.json
│   │   │   │   ├── React-RuntimeCore.podspec.json
│   │   │   │   ├── React-RuntimeHermes.podspec.json
│   │   │   │   ├── React-callinvoker.podspec.json
│   │   │   │   ├── React-cxxreact.podspec.json
│   │   │   │   ├── React-debug.podspec.json
│   │   │   │   ├── React-featureflags.podspec.json
│   │   │   │   ├── React-graphics.podspec.json
│   │   │   │   ├── React-hermes.podspec.json
│   │   │   │   ├── React-jserrorhandler.podspec.json
│   │   │   │   ├── React-jsi.podspec.json
│   │   │   │   ├── React-jsiexecutor.podspec.json
│   │   │   │   ├── React-jsinspector.podspec.json
│   │   │   │   ├── React-jsitracing.podspec.json
│   │   │   │   ├── React-logger.podspec.json
│   │   │   │   ├── React-nativeconfig.podspec.json
│   │   │   │   ├── React-perflogger.podspec.json
│   │   │   │   ├── React-rendererdebug.podspec.json
│   │   │   │   ├── React-rncore.podspec.json
│   │   │   │   ├── React-runtimeexecutor.podspec.json
│   │   │   │   ├── React-runtimescheduler.podspec.json
│   │   │   │   ├── React-utils.podspec.json
│   │   │   │   ├── React.podspec.json
│   │   │   │   ├── ReactCommon.podspec.json
│   │   │   │   ├── WatermelonDB.podspec.json
│   │   │   │   ├── Yoga.podspec.json
│   │   │   │   ├── boost.podspec.json
│   │   │   │   ├── fmt.podspec.json
│   │   │   │   ├── glog.podspec.json
│   │   │   │   ├── hermes-engine.podspec.json
│   │   │   │   └── simdjson.podspec.json
│   │   │   ├── Pods.xcodeproj/
│   │   │   │   └── project.pbxproj
│   │   │   ├── SocketRocket/
│   │   │   │   ├── LICENSE
│   │   │   │   ├── LICENSE-examples
│   │   │   │   ├── README.md
│   │   │   │   └── SocketRocket/
│   │   │   │       ├── Internal/
│   │   │   │       │   ├── Delegate/
│   │   │   │       │   │   ├── SRDelegateController.h
│   │   │   │       │   │   └── SRDelegateController.m
│   │   │   │       │   ├── IOConsumer/
│   │   │   │       │   │   ├── SRIOConsumer.h
│   │   │   │       │   │   ├── SRIOConsumer.m
│   │   │   │       │   │   ├── SRIOConsumerPool.h
│   │   │   │       │   │   └── SRIOConsumerPool.m
│   │   │   │       │   ├── NSRunLoop+SRWebSocketPrivate.h
│   │   │   │       │   ├── NSURLRequest+SRWebSocketPrivate.h
│   │   │   │       │   ├── Proxy/
│   │   │   │       │   │   ├── SRProxyConnect.h
│   │   │   │       │   │   └── SRProxyConnect.m
│   │   │   │       │   ├── RunLoop/
│   │   │   │       │   │   ├── SRRunLoopThread.h
│   │   │   │       │   │   └── SRRunLoopThread.m
│   │   │   │       │   ├── SRConstants.h
│   │   │   │       │   ├── SRConstants.m
│   │   │   │       │   ├── Security/
│   │   │   │       │   │   ├── SRPinningSecurityPolicy.h
│   │   │   │       │   │   └── SRPinningSecurityPolicy.m
│   │   │   │       │   └── Utilities/
│   │   │   │       │       ├── SRError.h
│   │   │   │       │       ├── SRError.m
│   │   │   │       │       ├── SRHTTPConnectMessage.h
│   │   │   │       │       ├── SRHTTPConnectMessage.m
│   │   │   │       │       ├── SRHash.h
│   │   │   │       │       ├── SRHash.m
│   │   │   │       │       ├── SRLog.h
│   │   │   │       │       ├── SRLog.m
│   │   │   │       │       ├── SRMutex.h
│   │   │   │       │       ├── SRMutex.m
│   │   │   │       │       ├── SRRandom.h
│   │   │   │       │       ├── SRRandom.m
│   │   │   │       │       ├── SRSIMDHelpers.h
│   │   │   │       │       ├── SRSIMDHelpers.m
│   │   │   │       │       ├── SRURLUtilities.h
│   │   │   │       │       └── SRURLUtilities.m
│   │   │   │       ├── NSRunLoop+SRWebSocket.h
│   │   │   │       ├── NSRunLoop+SRWebSocket.m
│   │   │   │       ├── NSURLRequest+SRWebSocket.h
│   │   │   │       ├── NSURLRequest+SRWebSocket.m
│   │   │   │       ├── SRSecurityPolicy.h
│   │   │   │       ├── SRSecurityPolicy.m
│   │   │   │       ├── SRWebSocket.h
│   │   │   │       ├── SRWebSocket.m
│   │   │   │       └── SocketRocket.h
│   │   │   ├── Target Support Files/
│   │   │   │   ├── DoubleConversion/
│   │   │   │   │   ├── DoubleConversion-dummy.m
│   │   │   │   │   ├── DoubleConversion-prefix.pch
│   │   │   │   │   ├── DoubleConversion-umbrella.h
│   │   │   │   │   ├── DoubleConversion.debug.xcconfig
│   │   │   │   │   ├── DoubleConversion.modulemap
│   │   │   │   │   └── DoubleConversion.release.xcconfig
│   │   │   │   ├── FBLazyVector/
│   │   │   │   │   ├── FBLazyVector.debug.xcconfig
│   │   │   │   │   └── FBLazyVector.release.xcconfig
│   │   │   │   ├── Pods-WatermelonTester/
│   │   │   │   │   ├── Pods-WatermelonTester-acknowledgements.markdown
│   │   │   │   │   ├── Pods-WatermelonTester-acknowledgements.plist
│   │   │   │   │   ├── Pods-WatermelonTester-dummy.m
│   │   │   │   │   ├── Pods-WatermelonTester-frameworks-Debug-input-files.xcfilelist
│   │   │   │   │   ├── Pods-WatermelonTester-frameworks-Debug-output-files.xcfilelist
│   │   │   │   │   ├── Pods-WatermelonTester-frameworks-Release-input-files.xcfilelist
│   │   │   │   │   ├── Pods-WatermelonTester-frameworks-Release-output-files.xcfilelist
│   │   │   │   │   ├── Pods-WatermelonTester-frameworks.sh
│   │   │   │   │   ├── Pods-WatermelonTester-resources-Debug-input-files.xcfilelist
│   │   │   │   │   ├── Pods-WatermelonTester-resources-Debug-output-files.xcfilelist
│   │   │   │   │   ├── Pods-WatermelonTester-resources-Release-input-files.xcfilelist
│   │   │   │   │   ├── Pods-WatermelonTester-resources-Release-output-files.xcfilelist
│   │   │   │   │   ├── Pods-WatermelonTester-resources.sh
│   │   │   │   │   ├── Pods-WatermelonTester.debug.xcconfig
│   │   │   │   │   └── Pods-WatermelonTester.release.xcconfig
│   │   │   │   ├── Pods-WatermelonTester-WatermelonTesterTests/
│   │   │   │   │   ├── Pods-WatermelonTester-WatermelonTesterTests-acknowledgements.markdown
│   │   │   │   │   ├── Pods-WatermelonTester-WatermelonTesterTests-acknowledgements.plist
│   │   │   │   │   ├── Pods-WatermelonTester-WatermelonTesterTests-dummy.m
│   │   │   │   │   ├── Pods-WatermelonTester-WatermelonTesterTests-frameworks-Debug-input-files.xcfilelist
│   │   │   │   │   ├── Pods-WatermelonTester-WatermelonTesterTests-frameworks-Debug-output-files.xcfilelist
│   │   │   │   │   ├── Pods-WatermelonTester-WatermelonTesterTests-frameworks-Release-input-files.xcfilelist
│   │   │   │   │   ├── Pods-WatermelonTester-WatermelonTesterTests-frameworks-Release-output-files.xcfilelist
│   │   │   │   │   ├── Pods-WatermelonTester-WatermelonTesterTests-frameworks.sh
│   │   │   │   │   ├── Pods-WatermelonTester-WatermelonTesterTests-resources-Debug-input-files.xcfilelist
│   │   │   │   │   ├── Pods-WatermelonTester-WatermelonTesterTests-resources-Debug-output-files.xcfilelist
│   │   │   │   │   ├── Pods-WatermelonTester-WatermelonTesterTests-resources-Release-input-files.xcfilelist
│   │   │   │   │   ├── Pods-WatermelonTester-WatermelonTesterTests-resources-Release-output-files.xcfilelist
│   │   │   │   │   ├── Pods-WatermelonTester-WatermelonTesterTests-resources.sh
│   │   │   │   │   ├── Pods-WatermelonTester-WatermelonTesterTests.debug.xcconfig
│   │   │   │   │   └── Pods-WatermelonTester-WatermelonTesterTests.release.xcconfig
│   │   │   │   ├── RCT-Folly/
│   │   │   │   │   ├── RCT-Folly-dummy.m
│   │   │   │   │   ├── RCT-Folly-prefix.pch
│   │   │   │   │   ├── RCT-Folly-umbrella.h
│   │   │   │   │   ├── RCT-Folly.debug.xcconfig
│   │   │   │   │   ├── RCT-Folly.modulemap
│   │   │   │   │   └── RCT-Folly.release.xcconfig
│   │   │   │   ├── RCTDeprecation/
│   │   │   │   │   ├── RCTDeprecation-dummy.m
│   │   │   │   │   ├── RCTDeprecation-prefix.pch
│   │   │   │   │   ├── RCTDeprecation-umbrella.h
│   │   │   │   │   ├── RCTDeprecation.debug.xcconfig
│   │   │   │   │   ├── RCTDeprecation.modulemap
│   │   │   │   │   └── RCTDeprecation.release.xcconfig
│   │   │   │   ├── RCTRequired/
│   │   │   │   │   ├── RCTRequired.debug.xcconfig
│   │   │   │   │   └── RCTRequired.release.xcconfig
│   │   │   │   ├── RCTTypeSafety/
│   │   │   │   │   ├── RCTTypeSafety-dummy.m
│   │   │   │   │   ├── RCTTypeSafety-prefix.pch
│   │   │   │   │   ├── RCTTypeSafety-umbrella.h
│   │   │   │   │   ├── RCTTypeSafety.debug.xcconfig
│   │   │   │   │   ├── RCTTypeSafety.modulemap
│   │   │   │   │   └── RCTTypeSafety.release.xcconfig
│   │   │   │   ├── React/
│   │   │   │   │   ├── React.debug.xcconfig
│   │   │   │   │   └── React.release.xcconfig
│   │   │   │   ├── React-Codegen/
│   │   │   │   │   ├── React-Codegen-dummy.m
│   │   │   │   │   ├── React-Codegen-prefix.pch
│   │   │   │   │   ├── React-Codegen-umbrella.h
│   │   │   │   │   ├── React-Codegen.debug.xcconfig
│   │   │   │   │   ├── React-Codegen.modulemap
│   │   │   │   │   └── React-Codegen.release.xcconfig
│   │   │   │   ├── React-Core/
│   │   │   │   │   ├── React-Core-dummy.m
│   │   │   │   │   ├── React-Core-prefix.pch
│   │   │   │   │   ├── React-Core-umbrella.h
│   │   │   │   │   ├── React-Core.debug.xcconfig
│   │   │   │   │   ├── React-Core.modulemap
│   │   │   │   │   ├── React-Core.release.xcconfig
│   │   │   │   │   └── ResourceBundle-RCTI18nStrings-React-Core-Info.plist
│   │   │   │   ├── React-CoreModules/
│   │   │   │   │   ├── React-CoreModules-dummy.m
│   │   │   │   │   ├── React-CoreModules-prefix.pch
│   │   │   │   │   ├── React-CoreModules.debug.xcconfig
│   │   │   │   │   └── React-CoreModules.release.xcconfig
│   │   │   │   ├── React-Fabric/
│   │   │   │   │   ├── React-Fabric-dummy.m
│   │   │   │   │   ├── React-Fabric-prefix.pch
│   │   │   │   │   ├── React-Fabric-umbrella.h
│   │   │   │   │   ├── React-Fabric.debug.xcconfig
│   │   │   │   │   ├── React-Fabric.modulemap
│   │   │   │   │   └── React-Fabric.release.xcconfig
│   │   │   │   ├── React-FabricImage/
│   │   │   │   │   ├── React-FabricImage-dummy.m
│   │   │   │   │   ├── React-FabricImage-prefix.pch
│   │   │   │   │   ├── React-FabricImage.debug.xcconfig
│   │   │   │   │   └── React-FabricImage.release.xcconfig
│   │   │   │   ├── React-ImageManager/
│   │   │   │   │   ├── React-ImageManager-dummy.m
│   │   │   │   │   ├── React-ImageManager-prefix.pch
│   │   │   │   │   ├── React-ImageManager-umbrella.h
│   │   │   │   │   ├── React-ImageManager.debug.xcconfig
│   │   │   │   │   ├── React-ImageManager.modulemap
│   │   │   │   │   └── React-ImageManager.release.xcconfig
│   │   │   │   ├── React-Mapbuffer/
│   │   │   │   │   ├── React-Mapbuffer-dummy.m
│   │   │   │   │   ├── React-Mapbuffer-prefix.pch
│   │   │   │   │   ├── React-Mapbuffer.debug.xcconfig
│   │   │   │   │   └── React-Mapbuffer.release.xcconfig
│   │   │   │   ├── React-NativeModulesApple/
│   │   │   │   │   ├── React-NativeModulesApple-dummy.m
│   │   │   │   │   ├── React-NativeModulesApple-prefix.pch
│   │   │   │   │   ├── React-NativeModulesApple-umbrella.h
│   │   │   │   │   ├── React-NativeModulesApple.debug.xcconfig
│   │   │   │   │   ├── React-NativeModulesApple.modulemap
│   │   │   │   │   └── React-NativeModulesApple.release.xcconfig
│   │   │   │   ├── React-RCTActionSheet/
│   │   │   │   │   ├── React-RCTActionSheet.debug.xcconfig
│   │   │   │   │   └── React-RCTActionSheet.release.xcconfig
│   │   │   │   ├── React-RCTAnimation/
│   │   │   │   │   ├── React-RCTAnimation-dummy.m
│   │   │   │   │   ├── React-RCTAnimation-prefix.pch
│   │   │   │   │   ├── React-RCTAnimation.debug.xcconfig
│   │   │   │   │   └── React-RCTAnimation.release.xcconfig
│   │   │   │   ├── React-RCTAppDelegate/
│   │   │   │   │   ├── React-RCTAppDelegate-dummy.m
│   │   │   │   │   ├── React-RCTAppDelegate-prefix.pch
│   │   │   │   │   ├── React-RCTAppDelegate-umbrella.h
│   │   │   │   │   ├── React-RCTAppDelegate.debug.xcconfig
│   │   │   │   │   ├── React-RCTAppDelegate.modulemap
│   │   │   │   │   └── React-RCTAppDelegate.release.xcconfig
│   │   │   │   ├── React-RCTBlob/
│   │   │   │   │   ├── React-RCTBlob-dummy.m
│   │   │   │   │   ├── React-RCTBlob-prefix.pch
│   │   │   │   │   ├── React-RCTBlob.debug.xcconfig
│   │   │   │   │   └── React-RCTBlob.release.xcconfig
│   │   │   │   ├── React-RCTFabric/
│   │   │   │   │   ├── React-RCTFabric-dummy.m
│   │   │   │   │   ├── React-RCTFabric-prefix.pch
│   │   │   │   │   ├── React-RCTFabric-umbrella.h
│   │   │   │   │   ├── React-RCTFabric.debug.xcconfig
│   │   │   │   │   ├── React-RCTFabric.modulemap
│   │   │   │   │   └── React-RCTFabric.release.xcconfig
│   │   │   │   ├── React-RCTImage/
│   │   │   │   │   ├── React-RCTImage-dummy.m
│   │   │   │   │   ├── React-RCTImage-prefix.pch
│   │   │   │   │   ├── React-RCTImage.debug.xcconfig
│   │   │   │   │   └── React-RCTImage.release.xcconfig
│   │   │   │   ├── React-RCTLinking/
│   │   │   │   │   ├── React-RCTLinking-dummy.m
│   │   │   │   │   ├── React-RCTLinking-prefix.pch
│   │   │   │   │   ├── React-RCTLinking.debug.xcconfig
│   │   │   │   │   └── React-RCTLinking.release.xcconfig
│   │   │   │   ├── React-RCTNetwork/
│   │   │   │   │   ├── React-RCTNetwork-dummy.m
│   │   │   │   │   ├── React-RCTNetwork-prefix.pch
│   │   │   │   │   ├── React-RCTNetwork.debug.xcconfig
│   │   │   │   │   └── React-RCTNetwork.release.xcconfig
│   │   │   │   ├── React-RCTSettings/
│   │   │   │   │   ├── React-RCTSettings-dummy.m
│   │   │   │   │   ├── React-RCTSettings-prefix.pch
│   │   │   │   │   ├── React-RCTSettings.debug.xcconfig
│   │   │   │   │   └── React-RCTSettings.release.xcconfig
│   │   │   │   ├── React-RCTText/
│   │   │   │   │   ├── React-RCTText-dummy.m
│   │   │   │   │   ├── React-RCTText-prefix.pch
│   │   │   │   │   ├── React-RCTText.debug.xcconfig
│   │   │   │   │   └── React-RCTText.release.xcconfig
│   │   │   │   ├── React-RCTVibration/
│   │   │   │   │   ├── React-RCTVibration-dummy.m
│   │   │   │   │   ├── React-RCTVibration-prefix.pch
│   │   │   │   │   ├── React-RCTVibration.debug.xcconfig
│   │   │   │   │   └── React-RCTVibration.release.xcconfig
│   │   │   │   ├── React-RuntimeApple/
│   │   │   │   │   ├── React-RuntimeApple-dummy.m
│   │   │   │   │   ├── React-RuntimeApple-prefix.pch
│   │   │   │   │   ├── React-RuntimeApple.debug.xcconfig
│   │   │   │   │   └── React-RuntimeApple.release.xcconfig
│   │   │   │   ├── React-RuntimeCore/
│   │   │   │   │   ├── React-RuntimeCore-dummy.m
│   │   │   │   │   ├── React-RuntimeCore-prefix.pch
│   │   │   │   │   ├── React-RuntimeCore.debug.xcconfig
│   │   │   │   │   └── React-RuntimeCore.release.xcconfig
│   │   │   │   ├── React-RuntimeHermes/
│   │   │   │   │   ├── React-RuntimeHermes-dummy.m
│   │   │   │   │   ├── React-RuntimeHermes-prefix.pch
│   │   │   │   │   ├── React-RuntimeHermes.debug.xcconfig
│   │   │   │   │   └── React-RuntimeHermes.release.xcconfig
│   │   │   │   ├── React-callinvoker/
│   │   │   │   │   ├── React-callinvoker.debug.xcconfig
│   │   │   │   │   └── React-callinvoker.release.xcconfig
│   │   │   │   ├── React-cxxreact/
│   │   │   │   │   ├── React-cxxreact-dummy.m
│   │   │   │   │   ├── React-cxxreact-prefix.pch
│   │   │   │   │   ├── React-cxxreact.debug.xcconfig
│   │   │   │   │   └── React-cxxreact.release.xcconfig
│   │   │   │   ├── React-debug/
│   │   │   │   │   ├── React-debug-dummy.m
│   │   │   │   │   ├── React-debug-prefix.pch
│   │   │   │   │   ├── React-debug-umbrella.h
│   │   │   │   │   ├── React-debug.debug.xcconfig
│   │   │   │   │   ├── React-debug.modulemap
│   │   │   │   │   └── React-debug.release.xcconfig
│   │   │   │   ├── React-featureflags/
│   │   │   │   │   ├── React-featureflags-dummy.m
│   │   │   │   │   ├── React-featureflags-prefix.pch
│   │   │   │   │   ├── React-featureflags-umbrella.h
│   │   │   │   │   ├── React-featureflags.debug.xcconfig
│   │   │   │   │   ├── React-featureflags.modulemap
│   │   │   │   │   └── React-featureflags.release.xcconfig
│   │   │   │   ├── React-graphics/
│   │   │   │   │   ├── React-graphics-dummy.m
│   │   │   │   │   ├── React-graphics-prefix.pch
│   │   │   │   │   ├── React-graphics-umbrella.h
│   │   │   │   │   ├── React-graphics.debug.xcconfig
│   │   │   │   │   ├── React-graphics.modulemap
│   │   │   │   │   └── React-graphics.release.xcconfig
│   │   │   │   ├── React-hermes/
│   │   │   │   │   ├── React-hermes-dummy.m
│   │   │   │   │   ├── React-hermes-prefix.pch
│   │   │   │   │   ├── React-hermes.debug.xcconfig
│   │   │   │   │   └── React-hermes.release.xcconfig
│   │   │   │   ├── React-jserrorhandler/
│   │   │   │   │   ├── React-jserrorhandler-dummy.m
│   │   │   │   │   ├── React-jserrorhandler-prefix.pch
│   │   │   │   │   ├── React-jserrorhandler.debug.xcconfig
│   │   │   │   │   └── React-jserrorhandler.release.xcconfig
│   │   │   │   ├── React-jsi/
│   │   │   │   │   ├── React-jsi-dummy.m
│   │   │   │   │   ├── React-jsi-prefix.pch
│   │   │   │   │   ├── React-jsi-umbrella.h
│   │   │   │   │   ├── React-jsi.debug.xcconfig
│   │   │   │   │   ├── React-jsi.modulemap
│   │   │   │   │   └── React-jsi.release.xcconfig
│   │   │   │   ├── React-jsiexecutor/
│   │   │   │   │   ├── React-jsiexecutor-dummy.m
│   │   │   │   │   ├── React-jsiexecutor-prefix.pch
│   │   │   │   │   ├── React-jsiexecutor.debug.xcconfig
│   │   │   │   │   └── React-jsiexecutor.release.xcconfig
│   │   │   │   ├── React-jsinspector/
│   │   │   │   │   ├── React-jsinspector-dummy.m
│   │   │   │   │   ├── React-jsinspector-prefix.pch
│   │   │   │   │   ├── React-jsinspector-umbrella.h
│   │   │   │   │   ├── React-jsinspector.debug.xcconfig
│   │   │   │   │   ├── React-jsinspector.modulemap
│   │   │   │   │   └── React-jsinspector.release.xcconfig
│   │   │   │   ├── React-jsitracing/
│   │   │   │   │   ├── React-jsitracing.debug.xcconfig
│   │   │   │   │   └── React-jsitracing.release.xcconfig
│   │   │   │   ├── React-logger/
│   │   │   │   │   ├── React-logger-dummy.m
│   │   │   │   │   ├── React-logger-prefix.pch
│   │   │   │   │   ├── React-logger.debug.xcconfig
│   │   │   │   │   └── React-logger.release.xcconfig
│   │   │   │   ├── React-nativeconfig/
│   │   │   │   │   ├── React-nativeconfig-dummy.m
│   │   │   │   │   ├── React-nativeconfig-prefix.pch
│   │   │   │   │   ├── React-nativeconfig.debug.xcconfig
│   │   │   │   │   └── React-nativeconfig.release.xcconfig
│   │   │   │   ├── React-perflogger/
│   │   │   │   │   ├── React-perflogger-dummy.m
│   │   │   │   │   ├── React-perflogger-prefix.pch
│   │   │   │   │   ├── React-perflogger.debug.xcconfig
│   │   │   │   │   └── React-perflogger.release.xcconfig
│   │   │   │   ├── React-rendererdebug/
│   │   │   │   │   ├── React-rendererdebug-dummy.m
│   │   │   │   │   ├── React-rendererdebug-prefix.pch
│   │   │   │   │   ├── React-rendererdebug-umbrella.h
│   │   │   │   │   ├── React-rendererdebug.debug.xcconfig
│   │   │   │   │   ├── React-rendererdebug.modulemap
│   │   │   │   │   └── React-rendererdebug.release.xcconfig
│   │   │   │   ├── React-rncore/
│   │   │   │   │   ├── React-rncore.debug.xcconfig
│   │   │   │   │   └── React-rncore.release.xcconfig
│   │   │   │   ├── React-runtimeexecutor/
│   │   │   │   │   ├── React-runtimeexecutor.debug.xcconfig
│   │   │   │   │   └── React-runtimeexecutor.release.xcconfig
│   │   │   │   ├── React-runtimescheduler/
│   │   │   │   │   ├── React-runtimescheduler-dummy.m
│   │   │   │   │   ├── React-runtimescheduler-prefix.pch
│   │   │   │   │   ├── React-runtimescheduler.debug.xcconfig
│   │   │   │   │   └── React-runtimescheduler.release.xcconfig
│   │   │   │   ├── React-utils/
│   │   │   │   │   ├── React-utils-dummy.m
│   │   │   │   │   ├── React-utils-prefix.pch
│   │   │   │   │   ├── React-utils-umbrella.h
│   │   │   │   │   ├── React-utils.debug.xcconfig
│   │   │   │   │   ├── React-utils.modulemap
│   │   │   │   │   └── React-utils.release.xcconfig
│   │   │   │   ├── ReactCommon/
│   │   │   │   │   ├── ReactCommon-dummy.m
│   │   │   │   │   ├── ReactCommon-prefix.pch
│   │   │   │   │   ├── ReactCommon-umbrella.h
│   │   │   │   │   ├── ReactCommon.debug.xcconfig
│   │   │   │   │   ├── ReactCommon.modulemap
│   │   │   │   │   └── ReactCommon.release.xcconfig
│   │   │   │   ├── SocketRocket/
│   │   │   │   │   ├── SocketRocket-dummy.m
│   │   │   │   │   ├── SocketRocket-prefix.pch
│   │   │   │   │   ├── SocketRocket.debug.xcconfig
│   │   │   │   │   └── SocketRocket.release.xcconfig
│   │   │   │   ├── WatermelonDB/
│   │   │   │   │   ├── WatermelonDB-dummy.m
│   │   │   │   │   ├── WatermelonDB-prefix.pch
│   │   │   │   │   ├── WatermelonDB.debug.xcconfig
│   │   │   │   │   └── WatermelonDB.release.xcconfig
│   │   │   │   ├── Yoga/
│   │   │   │   │   ├── Yoga-dummy.m
│   │   │   │   │   ├── Yoga-prefix.pch
│   │   │   │   │   ├── Yoga-umbrella.h
│   │   │   │   │   ├── Yoga.debug.xcconfig
│   │   │   │   │   ├── Yoga.modulemap
│   │   │   │   │   └── Yoga.release.xcconfig
│   │   │   │   ├── boost/
│   │   │   │   │   ├── boost.debug.xcconfig
│   │   │   │   │   └── boost.release.xcconfig
│   │   │   │   ├── fmt/
│   │   │   │   │   ├── fmt-dummy.m
│   │   │   │   │   ├── fmt-prefix.pch
│   │   │   │   │   ├── fmt.debug.xcconfig
│   │   │   │   │   └── fmt.release.xcconfig
│   │   │   │   ├── glog/
│   │   │   │   │   ├── glog-dummy.m
│   │   │   │   │   ├── glog-prefix.pch
│   │   │   │   │   ├── glog-umbrella.h
│   │   │   │   │   ├── glog.debug.xcconfig
│   │   │   │   │   ├── glog.modulemap
│   │   │   │   │   └── glog.release.xcconfig
│   │   │   │   ├── hermes-engine/
│   │   │   │   │   ├── hermes-engine-xcframeworks-input-files.xcfilelist
│   │   │   │   │   ├── hermes-engine-xcframeworks-output-files.xcfilelist
│   │   │   │   │   ├── hermes-engine-xcframeworks.sh
│   │   │   │   │   ├── hermes-engine.debug.xcconfig
│   │   │   │   │   └── hermes-engine.release.xcconfig
│   │   │   │   └── simdjson/
│   │   │   │       ├── simdjson-dummy.m
│   │   │   │       ├── simdjson-prefix.pch
│   │   │   │       ├── simdjson-umbrella.h
│   │   │   │       ├── simdjson.debug.xcconfig
│   │   │   │       ├── simdjson.modulemap
│   │   │   │       └── simdjson.release.xcconfig
│   │   │   ├── fmt/
│   │   │   │   ├── LICENSE.rst
│   │   │   │   ├── README.rst
│   │   │   │   ├── include/
│   │   │   │   │   └── fmt/
│   │   │   │   │       ├── args.h
│   │   │   │   │       ├── chrono.h
│   │   │   │   │       ├── color.h
│   │   │   │   │       ├── compile.h
│   │   │   │   │       ├── core.h
│   │   │   │   │       ├── format-inl.h
│   │   │   │   │       ├── format.h
│   │   │   │   │       ├── os.h
│   │   │   │   │       ├── ostream.h
│   │   │   │   │       ├── printf.h
│   │   │   │   │       ├── ranges.h
│   │   │   │   │       ├── std.h
│   │   │   │   │       └── xchar.h
│   │   │   │   └── src/
│   │   │   │       └── format.cc
│   │   │   └── glog/
│   │   │       ├── COPYING
│   │   │       ├── README
│   │   │       ├── README.windows
│   │   │       └── src/
│   │   │           ├── base/
│   │   │           │   ├── commandlineflags.h
│   │   │           │   ├── googleinit.h
│   │   │           │   └── mutex.h
│   │   │           ├── config.h
│   │   │           ├── config.h.cmake.in
│   │   │           ├── config.h.in
│   │   │           ├── config_for_unittests.h
│   │   │           ├── demangle.cc
│   │   │           ├── demangle.h
│   │   │           ├── glog/
│   │   │           │   ├── log_severity.h
│   │   │           │   ├── logging.h
│   │   │           │   ├── logging.h.in
│   │   │           │   ├── raw_logging.h
│   │   │           │   ├── raw_logging.h.in
│   │   │           │   ├── stl_logging.h
│   │   │           │   ├── stl_logging.h.in
│   │   │           │   ├── vlog_is_on.h
│   │   │           │   └── vlog_is_on.h.in
│   │   │           ├── googletest.h
│   │   │           ├── logging.cc
│   │   │           ├── mock-log.h
│   │   │           ├── raw_logging.cc
│   │   │           ├── signalhandler.cc
│   │   │           ├── stacktrace.h
│   │   │           ├── stacktrace_generic-inl.h
│   │   │           ├── stacktrace_libunwind-inl.h
│   │   │           ├── stacktrace_powerpc-inl.h
│   │   │           ├── stacktrace_x86-inl.h
│   │   │           ├── stacktrace_x86_64-inl.h
│   │   │           ├── symbolize.cc
│   │   │           ├── symbolize.h
│   │   │           ├── utilities.cc
│   │   │           ├── utilities.h
│   │   │           └── vlog_is_on.cc
│   │   ├── PrivacyInfo.xcprivacy
│   │   ├── WatermelonTester/
│   │   │   ├── AppDelegate.swift
│   │   │   ├── Base.lproj/
│   │   │   │   └── LaunchScreen.xib
│   │   │   ├── BridgeTestReporter.m
│   │   │   ├── BridgeTestReporter.swift
│   │   │   ├── Images.xcassets/
│   │   │   │   ├── AppIcon.appiconset/
│   │   │   │   │   └── Contents.json
│   │   │   │   └── Contents.json
│   │   │   ├── Info.plist
│   │   │   └── WatermelonTester-Bridging-Header.h
│   │   ├── WatermelonTester.xcodeproj/
│   │   │   ├── project.pbxproj
│   │   │   └── xcshareddata/
│   │   │       └── xcschemes/
│   │   │           └── WatermelonTester.xcscheme
│   │   ├── WatermelonTester.xcworkspace/
│   │   │   ├── contents.xcworkspacedata
│   │   │   └── xcshareddata/
│   │   │       └── IDEWorkspaceChecks.plist
│   │   └── WatermelonTesterTests/
│   │       ├── BridgeTests.swift
│   │       ├── Info.plist
│   │       ├── Tests.swift
│   │       └── WatermelonTesterTests-Bridging-Header.h
│   ├── metro-transformer.js
│   ├── shared/
│   │   ├── Database-batch.cpp
│   │   ├── Database-jsi.cpp
│   │   ├── Database-query.cpp
│   │   ├── Database-sqlite.cpp
│   │   ├── Database-turboSync.cpp
│   │   ├── Database.cpp
│   │   ├── Database.h
│   │   ├── DatabaseBridge.cpp
│   │   ├── DatabasePlatform.h
│   │   ├── JSIHelpers.h
│   │   ├── Sqlite.cpp
│   │   └── Sqlite.h
│   ├── windows/
│   │   ├── .gitignore
│   │   ├── ExperimentalFeatures.props
│   │   ├── NuGet.Config
│   │   ├── WatermelonDB/
│   │   │   ├── DatabasePlatformWindows.cpp
│   │   │   ├── PropertySheet.props
│   │   │   ├── ReactPackageProvider.cpp
│   │   │   ├── ReactPackageProvider.h
│   │   │   ├── ReactPackageProvider.idl
│   │   │   ├── WMDatabaseBridge.cpp
│   │   │   ├── WMDatabaseBridge.h
│   │   │   ├── WatermelonDB.def
│   │   │   ├── WatermelonDB.vcxproj
│   │   │   ├── WatermelonDB.vcxproj.filters
│   │   │   ├── pch.cpp
│   │   │   └── pch.h
│   │   └── WatermelonDB.sln
│   ├── windowsE2E/
│   │   ├── .gitignore
│   │   ├── README.md
│   │   ├── babel.config.js
│   │   ├── custom-transformer.js
│   │   ├── jest.config.js
│   │   ├── package.json
│   │   ├── test/
│   │   │   └── watermelon.test.ts
│   │   └── tsconfig.json
│   └── windowsTest/
│       ├── .gitignore
│       ├── ExperimentalFeatures.props
│       ├── NuGet.Config
│       ├── WatermelonTester/
│       │   ├── .gitignore
│       │   ├── App.cpp
│       │   ├── App.h
│       │   ├── App.idl
│       │   ├── App.xaml
│       │   ├── AutolinkedNativeModules.g.cpp
│       │   ├── AutolinkedNativeModules.g.h
│       │   ├── AutolinkedNativeModules.g.props
│       │   ├── AutolinkedNativeModules.g.targets
│       │   ├── MainPage.cpp
│       │   ├── MainPage.h
│       │   ├── MainPage.idl
│       │   ├── MainPage.xaml
│       │   ├── Package.appxmanifest
│       │   ├── PropertySheet.props
│       │   ├── ReactPackageProvider.cpp
│       │   ├── ReactPackageProvider.h
│       │   ├── WatermelonTester.filters
│       │   ├── WatermelonTester.vcxproj
│       │   ├── pch.cpp
│       │   └── pch.h
│       └── WatermelonTester.sln
├── package.json
├── prettier.config.js
├── react-native.config.js
├── scripts/
│   ├── any-android-device
│   ├── ccache-clang
│   ├── emulator.mjs
│   ├── emulatorWithJavaCheck
│   ├── make.mjs
│   ├── pkg.cjs
│   ├── release.mjs
│   ├── replace-docs-path.mjs
│   ├── retryEmuAndTest
│   ├── test-ios
│   └── update-docusaurus
├── src/
│   ├── Collection/
│   │   ├── RecordCache.d.ts
│   │   ├── RecordCache.js
│   │   ├── index.d.ts
│   │   ├── index.js
│   │   └── test.js
│   ├── Database/
│   │   ├── CollectionMap/
│   │   │   ├── index.d.ts
│   │   │   ├── index.js
│   │   │   └── test.js
│   │   ├── LocalStorage/
│   │   │   ├── index.d.ts
│   │   │   ├── index.js
│   │   │   └── test.js
│   │   ├── WorkQueue.d.ts
│   │   ├── WorkQueue.js
│   │   ├── index.d.ts
│   │   ├── index.js
│   │   └── test.js
│   ├── DatabaseProvider/
│   │   ├── index.d.ts
│   │   └── index.js
│   ├── Model/
│   │   ├── helpers.d.ts
│   │   ├── helpers.js
│   │   ├── index.d.ts
│   │   ├── index.js
│   │   └── test.js
│   ├── Query/
│   │   ├── helpers.d.ts
│   │   ├── helpers.js
│   │   ├── index.d.ts
│   │   ├── index.js
│   │   └── test.js
│   ├── QueryDescription/
│   │   ├── __tests__/
│   │   │   ├── queryWithoutDeleted.test.js
│   │   │   └── test.js
│   │   ├── helpers.d.ts
│   │   ├── helpers.js
│   │   ├── index.d.ts
│   │   ├── index.js
│   │   ├── operators.d.ts
│   │   ├── operators.js
│   │   ├── type.d.ts
│   │   └── type.js
│   ├── RawRecord/
│   │   ├── __tests__/
│   │   │   ├── helpers.js
│   │   │   └── test.js
│   │   ├── index.d.ts
│   │   └── index.js
│   ├── Relation/
│   │   ├── helpers.d.ts
│   │   ├── helpers.js
│   │   ├── index.d.ts
│   │   ├── index.js
│   │   └── test.js
│   ├── Schema/
│   │   ├── index.d.ts
│   │   ├── index.js
│   │   ├── migrations/
│   │   │   ├── getSyncChanges/
│   │   │   │   ├── index.d.ts
│   │   │   │   ├── index.js
│   │   │   │   └── test.js
│   │   │   ├── index.d.ts
│   │   │   ├── index.js
│   │   │   ├── stepsForMigration.d.ts
│   │   │   ├── stepsForMigration.js
│   │   │   └── test.js
│   │   └── test.js
│   ├── __playground__/
│   │   └── index.js
│   ├── __tests__/
│   │   ├── databaseTests.js
│   │   ├── emptyMock/
│   │   │   └── index.js
│   │   ├── integrationTests.js
│   │   ├── setUpIntegrationTestEnv.js
│   │   ├── setup.js
│   │   ├── testModels.js
│   │   └── utils/
│   │       ├── expectToRejectWithMessage/
│   │       │   └── index.js
│   │       ├── index.js
│   │       ├── makeScheduler.js
│   │       └── naughtyStrings.js
│   ├── __typetests__/
│   │   ├── README.md
│   │   └── query.js
│   ├── adapters/
│   │   ├── __tests__/
│   │   │   ├── commonTests.js
│   │   │   └── helpers.js
│   │   ├── common.js
│   │   ├── compat.d.ts
│   │   ├── compat.js
│   │   ├── error.js
│   │   ├── lokijs/
│   │   │   ├── common.d.ts
│   │   │   ├── common.js
│   │   │   ├── dispatcher.d.ts
│   │   │   ├── dispatcher.js
│   │   │   ├── index.d.ts
│   │   │   ├── index.js
│   │   │   ├── test.js
│   │   │   ├── type.d.ts
│   │   │   ├── type.js
│   │   │   └── worker/
│   │   │       ├── DatabaseBridge.js
│   │   │       ├── DatabaseDriver.js
│   │   │       ├── cloneMessage/
│   │   │       │   ├── index.js
│   │   │       │   └── test.js
│   │   │       ├── encodeQuery/
│   │   │       │   ├── index.js
│   │   │       │   └── test.js
│   │   │       ├── executeQuery.js
│   │   │       ├── loki.worker.js
│   │   │       ├── lokiExtensions.js
│   │   │       ├── performJoins/
│   │   │       │   ├── index.js
│   │   │       │   └── test.js
│   │   │       └── synchronousWorker.js
│   │   ├── sqlite/
│   │   │   ├── devtools.js
│   │   │   ├── encodeBatch/
│   │   │   │   ├── index.js
│   │   │   │   └── test.js
│   │   │   ├── encodeQuery/
│   │   │   │   ├── index.js
│   │   │   │   └── test.js
│   │   │   ├── encodeSchema/
│   │   │   │   ├── index.js
│   │   │   │   └── test.js
│   │   │   ├── encodeValue/
│   │   │   │   ├── index.js
│   │   │   │   └── test.js
│   │   │   ├── index.d.ts
│   │   │   ├── index.js
│   │   │   ├── integrationTest.js
│   │   │   ├── makeDispatcher/
│   │   │   │   ├── decodeQueryResult/
│   │   │   │   │   ├── index.js
│   │   │   │   │   └── test.js
│   │   │   │   ├── index.js
│   │   │   │   └── index.native.js
│   │   │   ├── sqlite-node/
│   │   │   │   ├── Database.js
│   │   │   │   ├── DatabaseBridge.js
│   │   │   │   ├── DatabaseDriver.js
│   │   │   │   └── __tests__/
│   │   │   │       └── DatabaseDriver.test.js
│   │   │   ├── test.js
│   │   │   ├── type.d.ts
│   │   │   └── type.js
│   │   ├── type.d.ts
│   │   └── type.js
│   ├── decorators/
│   │   ├── action/
│   │   │   ├── index.d.ts
│   │   │   ├── index.js
│   │   │   └── test.js
│   │   ├── children/
│   │   │   ├── index.d.ts
│   │   │   ├── index.js
│   │   │   └── test.js
│   │   ├── common.d.ts
│   │   ├── common.js
│   │   ├── date/
│   │   │   ├── index.d.ts
│   │   │   ├── index.js
│   │   │   └── test.js
│   │   ├── experimentalFailsafe/
│   │   │   ├── index.d.ts
│   │   │   └── index.js
│   │   ├── field/
│   │   │   ├── index.d.ts
│   │   │   ├── index.js
│   │   │   └── test.js
│   │   ├── immutableRelation/
│   │   │   ├── index.d.ts
│   │   │   ├── index.js
│   │   │   └── test.js
│   │   ├── index.d.ts
│   │   ├── index.js
│   │   ├── json/
│   │   │   ├── index.d.ts
│   │   │   ├── index.js
│   │   │   └── test.js
│   │   ├── lazy/
│   │   │   ├── index.d.ts
│   │   │   ├── index.js
│   │   │   └── test.js
│   │   ├── nochange/
│   │   │   ├── index.d.ts
│   │   │   ├── index.js
│   │   │   └── test.js
│   │   ├── readonly/
│   │   │   ├── index.d.ts
│   │   │   ├── index.js
│   │   │   └── test.js
│   │   ├── relation/
│   │   │   ├── index.d.ts
│   │   │   ├── index.js
│   │   │   └── test.js
│   │   └── text/
│   │       ├── index.d.ts
│   │       ├── index.js
│   │       └── test.js
│   ├── diagnostics/
│   │   ├── censorRaw.js
│   │   ├── diagnoseDatabaseStructure/
│   │   │   ├── impl.js
│   │   │   └── index.js
│   │   ├── diagnoseSyncConsistency/
│   │   │   ├── impl.js
│   │   │   └── index.js
│   │   └── index.js
│   ├── hooks/
│   │   ├── index.d.ts
│   │   └── index.js
│   ├── index.d.ts
│   ├── index.integrationTests.native.js
│   ├── index.js
│   ├── observation/
│   │   ├── encodeMatcher/
│   │   │   ├── canEncode.js
│   │   │   ├── index.js
│   │   │   ├── operators.js
│   │   │   └── test.js
│   │   ├── subscribeToCount/
│   │   │   ├── index.d.ts
│   │   │   ├── index.js
│   │   │   └── test.js
│   │   ├── subscribeToQuery.d.ts
│   │   ├── subscribeToQuery.js
│   │   ├── subscribeToQueryReloading/
│   │   │   ├── index.d.ts
│   │   │   ├── index.js
│   │   │   └── test.js
│   │   ├── subscribeToQueryWithColumns/
│   │   │   ├── index.js
│   │   │   └── test.js
│   │   ├── subscribeToSimpleQuery/
│   │   │   ├── index.js
│   │   │   ├── processChangeSet.js
│   │   │   └── test.js
│   │   └── test.js
│   ├── react/
│   │   ├── DatabaseContext.d.ts
│   │   ├── DatabaseContext.js
│   │   ├── DatabaseProvider.d.ts
│   │   ├── DatabaseProvider.js
│   │   ├── DatabaseProvider.test.js
│   │   ├── WithObservablesComponent.js
│   │   ├── compose.d.ts
│   │   ├── compose.js
│   │   ├── helpers.js
│   │   ├── index.d.ts
│   │   ├── index.js
│   │   ├── useDatabase.d.ts
│   │   ├── useDatabase.js
│   │   ├── useDatabase.test.js
│   │   ├── withDatabase.d.ts
│   │   ├── withDatabase.js
│   │   ├── withHooks.js
│   │   └── withObservables/
│   │       ├── garbageCollector.js
│   │       ├── index.d.ts
│   │       ├── index.js
│   │       └── withObservables.test.js
│   ├── sync/
│   │   ├── SyncLogger/
│   │   │   ├── index.d.ts
│   │   │   ├── index.js
│   │   │   └── test.js
│   │   ├── debugPrintChanges/
│   │   │   ├── index.d.ts
│   │   │   └── index.js
│   │   ├── helpers.d.ts
│   │   ├── helpers.js
│   │   ├── helpers.test.js
│   │   ├── impl/
│   │   │   ├── __tests__/
│   │   │   │   ├── applyRemote.test.js
│   │   │   │   ├── fetchLocal.test.js
│   │   │   │   ├── helpers.js
│   │   │   │   ├── helpers.test.js
│   │   │   │   ├── markAsSynced.test.js
│   │   │   │   ├── synchronize-abort.test.js
│   │   │   │   ├── synchronize-benchmark.test.js
│   │   │   │   ├── synchronize-migration.test.js
│   │   │   │   ├── synchronize-partialRejections.test.js
│   │   │   │   ├── synchronize-replacement.test.js
│   │   │   │   ├── synchronize-turbo.test.js
│   │   │   │   └── synchronize.test.js
│   │   │   ├── applyRemote.d.ts
│   │   │   ├── applyRemote.js
│   │   │   ├── fetchLocal.d.ts
│   │   │   ├── fetchLocal.js
│   │   │   ├── helpers.d.ts
│   │   │   ├── helpers.js
│   │   │   ├── index.d.ts
│   │   │   ├── index.js
│   │   │   ├── markAsSynced.d.ts
│   │   │   ├── markAsSynced.js
│   │   │   ├── synchronize.d.ts
│   │   │   └── synchronize.js
│   │   ├── index.d.ts
│   │   └── index.js
│   ├── types.d.ts
│   ├── types.js
│   └── utils/
│       ├── common/
│       │   ├── connectionTag/
│       │   │   ├── index.d.ts
│       │   │   └── index.js
│       │   ├── deepFreeze/
│       │   │   ├── index.d.ts
│       │   │   ├── index.js
│       │   │   └── test.js
│       │   ├── deprecated/
│       │   │   ├── index.d.ts
│       │   │   └── index.js
│       │   ├── devMeasureTime/
│       │   │   ├── index.d.ts
│       │   │   └── index.js
│       │   ├── diagnosticError/
│       │   │   ├── index.d.ts
│       │   │   └── index.js
│       │   ├── ensureSync/
│       │   │   ├── index.d.ts
│       │   │   ├── index.js
│       │   │   └── test.js
│       │   ├── index.d.ts
│       │   ├── index.js
│       │   ├── invariant/
│       │   │   ├── index.d.ts
│       │   │   └── index.js
│       │   ├── isRN/
│       │   │   ├── index.d.ts
│       │   │   ├── index.js
│       │   │   └── index.native.js
│       │   ├── logError/
│       │   │   ├── index.d.ts
│       │   │   └── index.js
│       │   ├── logger/
│       │   │   ├── index.d.ts
│       │   │   └── index.js
│       │   ├── makeDecorator/
│       │   │   ├── index.d.ts
│       │   │   └── index.js
│       │   ├── memory/
│       │   │   ├── index.d.ts
│       │   │   └── index.js
│       │   └── randomId/
│       │       ├── fallback.js
│       │       ├── index.d.ts
│       │       ├── index.js
│       │       ├── randomId.js
│       │       ├── randomId.native.js
│       │       ├── randomId_v2.native.js
│       │       └── test.js
│       ├── fp/
│       │   ├── Result/
│       │   │   ├── index.d.ts
│       │   │   └── index.js
│       │   ├── allPass/
│       │   │   ├── index.d.ts
│       │   │   ├── index.js
│       │   │   └── test.js
│       │   ├── allPromises/
│       │   │   ├── index.d.ts
│       │   │   └── index.js
│       │   ├── allPromisesObj/
│       │   │   ├── index.d.ts
│       │   │   ├── index.js
│       │   │   └── test.js
│       │   ├── anyPass/
│       │   │   ├── index.d.ts
│       │   │   ├── index.js
│       │   │   └── test.js
│       │   ├── areRecordsEqual/
│       │   │   ├── index.d.ts
│       │   │   ├── index.js
│       │   │   └── test.js
│       │   ├── arrayDifference/
│       │   │   ├── index.d.ts
│       │   │   ├── index.js
│       │   │   └── test.js
│       │   ├── arrayOrSpread/
│       │   │   ├── index.d.ts
│       │   │   ├── index.js
│       │   │   └── test.js
│       │   ├── checkName/
│       │   │   ├── index.d.ts
│       │   │   ├── index.js
│       │   │   └── test.js
│       │   ├── filterObj/
│       │   │   ├── index.d.ts
│       │   │   ├── index.js
│       │   │   └── test.js
│       │   ├── forEachAsync/
│       │   │   ├── index.js
│       │   │   └── test.js
│       │   ├── fromPairs/
│       │   │   ├── index.d.ts
│       │   │   └── index.js
│       │   ├── groupBy/
│       │   │   ├── index.d.ts
│       │   │   ├── index.js
│       │   │   └── test.js
│       │   ├── identicalArrays/
│       │   │   ├── index.d.ts
│       │   │   ├── index.js
│       │   │   └── test.js
│       │   ├── identity/
│       │   │   ├── index.d.ts
│       │   │   └── index.js
│       │   ├── index.d.ts
│       │   ├── index.js
│       │   ├── isObj/
│       │   │   ├── index.d.ts
│       │   │   ├── index.js
│       │   │   └── test.js
│       │   ├── keys/
│       │   │   ├── index.d.ts
│       │   │   ├── index.js
│       │   │   └── test.js
│       │   ├── likeToRegexp/
│       │   │   ├── index.d.ts
│       │   │   └── index.js
│       │   ├── mapObj/
│       │   │   ├── index.d.ts
│       │   │   ├── index.js
│       │   │   └── test.js
│       │   ├── noop/
│       │   │   ├── index.d.ts
│       │   │   └── index.js
│       │   ├── pipe/
│       │   │   ├── index.d.ts
│       │   │   ├── index.js
│       │   │   └── test.js
│       │   ├── sortBy/
│       │   │   ├── index.d.ts
│       │   │   ├── index.js
│       │   │   └── test.js
│       │   ├── splitEvery/
│       │   │   ├── index.d.ts
│       │   │   ├── index.js
│       │   │   └── test.js
│       │   ├── toPairs/
│       │   │   ├── index.d.ts
│       │   │   └── index.js
│       │   ├── unique/
│       │   │   ├── index.d.ts
│       │   │   ├── index.js
│       │   │   └── test.js
│       │   ├── unnest/
│       │   │   ├── index.d.ts
│       │   │   └── index.js
│       │   └── values/
│       │       ├── index.d.ts
│       │       ├── index.js
│       │       └── test.js
│       ├── rx/
│       │   ├── __wmelonRxShim/
│       │   │   ├── index.d.ts
│       │   │   └── index.js
│       │   ├── __wmelonRxShimESM2015/
│       │   │   ├── index.d.ts
│       │   │   └── index.js
│       │   ├── cacheWhileConnected/
│       │   │   ├── index.d.ts
│       │   │   └── index.js
│       │   ├── doOnDispose/
│       │   │   ├── index.d.ts
│       │   │   └── index.js
│       │   ├── doOnSubscribe/
│       │   │   ├── index.d.ts
│       │   │   └── index.js
│       │   ├── index.d.ts
│       │   ├── index.js
│       │   └── publishReplayLatestWhileConnected/
│       │       ├── index.d.ts
│       │       └── index.js
│       └── subscriptions/
│           ├── SharedSubscribable/
│           │   ├── index.d.ts
│           │   ├── index.js
│           │   └── test.js
│           ├── index.d.ts
│           ├── index.js
│           ├── type.d.ts
│           └── type.js
├── tsconfig.json
└── tslint.json
Download .txt
SYMBOL INDEX (1296 symbols across 254 files)

FILE: docs-website/src/components/HomepageFeatures/index.js
  function Feature (line 35) | function Feature({
  function HomepageFeatures (line 53) | function HomepageFeatures() {

FILE: docs-website/src/pages/index.js
  function HomepageHeader (line 11) | function HomepageHeader() {
  function Home (line 28) | function Home() {

FILE: examples/typescript/__typetests__/withObservables.tsx
  class Blog (line 8) | class Blog extends Model {
  constant TABLE_NAME (line 12) | const TABLE_NAME = 'table'
  type ChildProps (line 32) | interface ChildProps extends ExtractedObservables<ReturnType<typeof getO...
  class Child (line 35) | class Child extends React.PureComponent<ChildProps> {
    method render (line 39) | render() {

FILE: examples/typescript/ts-example.ts
  type TableName (line 13) | enum TableName {
  class Blog (line 18) | class Blog extends Model {
    method moderateAll (line 32) | async moderateAll() {
  class Post (line 37) | class Post extends Model {
  function randomString (line 52) | function randomString(): string {
  method pullChanges (line 88) | async pullChanges({ lastPulledAt, schemaVersion, migration }) {
  method pushChanges (line 101) | async pushChanges({ changes, lastPulledAt }) {

FILE: native/android-jsi/src/main/cpp/DatabasePlatformAndroid.cpp
  type watermelondb (line 13) | namespace watermelondb {
    type platform (line 14) | namespace platform {
      function consoleLog (line 16) | void consoleLog(std::string message) {
      function consoleError (line 20) | void consoleError(std::string message) {
      function isVerboseLogEnabled (line 26) | bool isVerboseLogEnabled() {
      function sqliteLogCallback (line 33) | static void sqliteLogCallback(void *data, int err, const char *messa...
      function initializeSqlite (line 50) | void initializeSqlite() {
      function configureJNI (line 75) | void configureJNI(JNIEnv *env) {
      function resolveDatabasePath (line 95) | std::string resolveDatabasePath(std::string path) {
      function deleteDatabaseFile (line 129) | void deleteDatabaseFile(std::string path, bool warnIfDoesNotExist) {
      function onMemoryAlert (line 133) | void onMemoryAlert(std::function<void(void)> callback) {
      type ProvidedSyncJson (line 138) | struct ProvidedSyncJson {
      function provideJson (line 147) | void provideJson(int id, jbyteArray array) {
      function getSyncJson (line 171) | std::string_view getSyncJson(int id) {
      function deleteSyncJson (line 184) | void deleteSyncJson(int id) {
      function destroy (line 205) | void destroy() {
      function onDestroy (line 212) | void onDestroy(std::function<void()> callback) {

FILE: native/android-jsi/src/main/cpp/DatabasePlatformAndroid.h
  function namespace (line 5) | namespace watermelondb {

FILE: native/android-jsi/src/main/cpp/JSIInstaller.cpp
  function JNIEXPORT (line 10) | JNIEXPORT void JNICALL Java_com_nozbe_watermelondb_jsi_JSIInstaller_inst...
  function JNIEXPORT (line 17) | JNIEXPORT void JNICALL Java_com_nozbe_watermelondb_jsi_JSIInstaller_prov...
  function JNIEXPORT (line 21) | JNIEXPORT void JNICALL Java_com_nozbe_watermelondb_jsi_JSIInstaller_dest...

FILE: native/android-jsi/src/main/java/com/nozbe/watermelondb/WatermelonDBJSIModule.java
  class WatermelonDBJSIModule (line 14) | @ReactModule(name = WatermelonDBJSIModule.NAME)
    method WatermelonDBJSIModule (line 19) | public WatermelonDBJSIModule(ReactApplicationContext reactContext) {
    method getName (line 24) | @NonNull
    method install (line 30) | @ReactMethod(isBlockingSynchronousMethod = true)

FILE: native/android-jsi/src/main/java/com/nozbe/watermelondb/jsi/JSIInstaller.java
  class JSIInstaller (line 4) | class JSIInstaller {
    method install (line 5) | static void install(Context context, long javaScriptContextHolder) {
    method _resolveDatabasePath (line 16) | static String _resolveDatabasePath(String dbName) {
    method installBinding (line 21) | private native void installBinding(long javaScriptContextHolder);
    method provideSyncJson (line 23) | static native void provideSyncJson(int id, byte[] json);
    method destroy (line 25) | static native void destroy();

FILE: native/android-jsi/src/main/java/com/nozbe/watermelondb/jsi/WatermelonDBJSIPackage.java
  class WatermelonDBJSIPackage (line 13) | public class WatermelonDBJSIPackage implements ReactPackage {
    method createNativeModules (line 15) | @NonNull
    method createViewManagers (line 23) | @NonNull

FILE: native/android-jsi/src/main/java/com/nozbe/watermelondb/jsi/WatermelonJSI.java
  class WatermelonJSI (line 6) | public class WatermelonJSI {
    method onTrimMemory (line 7) | public static void onTrimMemory(int level) {
    method provideSyncJson (line 11) | public static void provideSyncJson(int id, byte[] json) {
    method onCatalystInstanceDestroy (line 15) | public static void onCatalystInstanceDestroy() {

FILE: native/android/src/main/java/com/nozbe/watermelondb/Connection.java
  class Connection (line 5) | public abstract class Connection {
    class Connected (line 6) | public static class Connected extends Connection {
      method Connected (line 8) | public Connected(WMDatabaseDriver driver) {
    class Waiting (line 13) | public static class Waiting extends Connection {
      method Waiting (line 15) | public Waiting(ArrayList<Runnable> queueInWaiting) {
    method getQueue (line 20) | public ArrayList<Runnable> getQueue() {

FILE: native/android/src/main/java/com/nozbe/watermelondb/DatabaseUtils.java
  class DatabaseUtils (line 7) | public class DatabaseUtils {
    method cursorToMap (line 8) | public static WritableMap cursorToMap(Cursor cursor) {
    method arrayContains (line 31) | public static <T> boolean arrayContains(final T[] array, final T value) {

FILE: native/android/src/main/java/com/nozbe/watermelondb/MigrationNeededError.java
  class MigrationNeededError (line 3) | public class MigrationNeededError extends RuntimeException {
    method MigrationNeededError (line 6) | public MigrationNeededError(int databaseVersion) {

FILE: native/android/src/main/java/com/nozbe/watermelondb/Queries.java
  class Queries (line 3) | public class Queries {
    method dropTable (line 6) | public static String dropTable(String table) {

FILE: native/android/src/main/java/com/nozbe/watermelondb/SchemaNeededError.java
  class SchemaNeededError (line 3) | public class SchemaNeededError extends RuntimeException {

FILE: native/android/src/main/java/com/nozbe/watermelondb/WMDatabase.java
  class WMDatabase (line 14) | public class WMDatabase {
    method WMDatabase (line 17) | private WMDatabase(SQLiteDatabase db) {
    method getInstance (line 23) | public static WMDatabase getInstance(String name, Context context) {
    method getInstance (line 27) | public static WMDatabase getInstance(String name, Context context, int...
    method buildDatabase (line 40) | public static WMDatabase buildDatabase(String name, Context context, i...
    method createSQLiteDatabase (line 45) | private static SQLiteDatabase createSQLiteDatabase(String name, Contex...
    method setUserVersion (line 57) | public void setUserVersion(int version) {
    method getUserVersion (line 61) | public int getUserVersion() {
    method unsafeExecuteStatements (line 65) | public void unsafeExecuteStatements(String statements) {
    method execute (line 77) | public void execute(String query, Object[] args) {
    method execute (line 81) | public void execute(String query) {
    method delete (line 85) | public void delete(String query, Object[] args) {
    method rawQuery (line 89) | public Cursor rawQuery(String sql, Object[] args) {
    method rawQuery (line 118) | public Cursor rawQuery(String sql) {
    method count (line 122) | public int count(String query, Object[] args) {
    method count (line 134) | public int count(String query) {
    method getFromLocalStorage (line 138) | public String getFromLocalStorage(String key) {
    method getAllTables (line 149) | private ArrayList<String> getAllTables() {
    method unsafeDestroyEverything (line 163) | public void unsafeDestroyEverything() {
    type TransactionFunction (line 175) | interface TransactionFunction {
      method applyTransactionFunction (line 176) | void applyTransactionFunction();
    method transaction (line 179) | public void transaction(TransactionFunction function) {
    method isOpen (line 189) | public Boolean isOpen() {
    method close (line 193) | public void close() {

FILE: native/android/src/main/java/com/nozbe/watermelondb/WMDatabaseBridge.java
  class WMDatabaseBridge (line 26) | public class WMDatabaseBridge extends ReactContextBaseJavaModule {
    method WMDatabaseBridge (line 29) | public WMDatabaseBridge(ReactApplicationContext reactContext) {
    method getName (line 37) | @NonNull
    method initialize (line 45) | @ReactMethod
    method setUpWithSchema (line 69) | @ReactMethod
    method setUpWithMigrations (line 74) | @ReactMethod
    method find (line 84) | @ReactMethod
    method query (line 89) | @ReactMethod
    method queryIds (line 94) | @ReactMethod
    method unsafeQueryRaw (line 99) | @ReactMethod
    method count (line 104) | @ReactMethod
    method batch (line 109) | @ReactMethod
    method unsafeResetDatabase (line 117) | @ReactMethod
    method getLocal (line 125) | @ReactMethod
    method unsafeGetLocalSynchronously (line 130) | @ReactMethod(isBlockingSynchronousMethod = true)
    method getQueue (line 155) | private List<Runnable> getQueue(int connectionTag) {
    type ParamFunction (line 170) | interface ParamFunction {
      method applyParamFunction (line 171) | Object applyParamFunction(WMDatabaseDriver arg);
    method withDriver (line 174) | private void withDriver(final int tag, final Promise promise, final Pa...
    method connectDriver (line 196) | private void connectDriver(int connectionTag, WMDatabaseDriver driver,...
    method disconnectDriver (line 206) | private void disconnectDriver(int connectionTag) {
    method provideSyncJson (line 216) | @ReactMethod
    method getRandomBytes (line 230) | @ReactMethod(isBlockingSynchronousMethod = true)
    method invalidate (line 247) | @Override
    method onCatalystInstanceDestroy (line 265) | @Deprecated

FILE: native/android/src/main/java/com/nozbe/watermelondb/WMDatabaseDriver.java
  class WMDatabaseDriver (line 22) | public class WMDatabaseDriver {
    method WMDatabaseDriver (line 28) | public WMDatabaseDriver(Context context, String dbName) {
    method WMDatabaseDriver (line 32) | public WMDatabaseDriver(Context context, String dbName, int schemaVers...
    method WMDatabaseDriver (line 46) | public WMDatabaseDriver(Context context, String dbName, Schema schema,...
    method WMDatabaseDriver (line 51) | public WMDatabaseDriver(Context context, String dbName, MigrationSet m...
    method WMDatabaseDriver (line 56) | public WMDatabaseDriver(Context context, String dbName, boolean unsafe...
    method find (line 71) | public Object find(String table, String id) {
    method cachedQuery (line 87) | public WritableArray cachedQuery(String table, String query, Object[] ...
    method queryIds (line 106) | public WritableArray queryIds(String query, Object[] args) {
    method unsafeQueryRaw (line 119) | public WritableArray unsafeQueryRaw(String query, Object[] args) {
    method count (line 131) | public int count(String query, Object[] args) {
    method getLocal (line 135) | public String getLocal(String key) {
    method batch (line 139) | public void batch(ReadableArray operations) {
    method markAsCached (line 182) | private void markAsCached(String table, String id) {
    method isCached (line 192) | private boolean isCached(String table, String id) {
    method removeFromCache (line 197) | private void removeFromCache(String table, String id) {
    method close (line 205) | public void close() {
    method migrate (line 209) | private void migrate(MigrationSet migrations) {
    method unsafeResetDatabase (line 221) | public void unsafeResetDatabase(Schema schema) {
    class SchemaCompatibility (line 233) | private static class SchemaCompatibility {
      class Compatible (line 234) | static class Compatible extends SchemaCompatibility {
      class NeedsSetup (line 237) | static class NeedsSetup extends SchemaCompatibility {
      class NeedsMigration (line 240) | static class NeedsMigration extends SchemaCompatibility {
        method NeedsMigration (line 243) | NeedsMigration(int fromVersion) {
    method isCompatible (line 249) | private SchemaCompatibility isCompatible(int schemaVersion) {

FILE: native/android/src/main/java/com/nozbe/watermelondb/WatermelonDBPackage.java
  class WatermelonDBPackage (line 12) | public class WatermelonDBPackage implements ReactPackage {
    method createNativeModules (line 13) | @NonNull
    method createViewManagers (line 21) | @NonNull

FILE: native/android/src/main/java/com/nozbe/watermelondb/utils/MigrationSet.java
  class MigrationSet (line 3) | public class MigrationSet {
    method MigrationSet (line 8) | public MigrationSet(int from, int to, String sql) {

FILE: native/android/src/main/java/com/nozbe/watermelondb/utils/Pair.java
  class Pair (line 3) | public class Pair<K,V> {
    method Pair (line 7) | private Pair(K key, V value) {
    method create (line 12) | public static <K,V> Pair<K,V> create(K key, V value) {

FILE: native/android/src/main/java/com/nozbe/watermelondb/utils/Schema.java
  class Schema (line 3) | public class Schema {
    method Schema (line 7) | public Schema(int version, String sql) {

FILE: native/iosTest/Pods/DoubleConversion/double-conversion/bignum-dtoa.cc
  type double_conversion (line 35) | namespace double_conversion {
    function NormalizedExponent (line 37) | static int NormalizedExponent(uint64_t significand, int exponent) {
    function BignumDtoa (line 89) | void BignumDtoa(double v, BignumDtoaMode mode, int requested_digits,
    function GenerateShortestDigits (line 185) | static void GenerateShortestDigits(Bignum* numerator, Bignum* denomina...
    function GenerateCountedDigits (line 283) | static void GenerateCountedDigits(int count, int* decimal_point,
    function BignumToFixed (line 326) | static void BignumToFixed(int requested_digits, int* decimal_point,
    function EstimatePower (line 385) | static int EstimatePower(int exponent) {
    function InitialScaledStartValuesPositiveExponent (line 417) | static void InitialScaledStartValuesPositiveExponent(
    function InitialScaledStartValuesNegativeExponentPositivePower (line 450) | static void InitialScaledStartValuesNegativeExponentPositivePower(
    function InitialScaledStartValuesNegativeExponentNegativePower (line 484) | static void InitialScaledStartValuesNegativeExponentNegativePower(
    function InitialScaledStartValues (line 568) | static void InitialScaledStartValues(uint64_t significand,
    function FixupMultiply10 (line 612) | static void FixupMultiply10(int estimated_power, bool is_even,

FILE: native/iosTest/Pods/DoubleConversion/double-conversion/bignum-dtoa.h
  function namespace (line 33) | namespace double_conversion {

FILE: native/iosTest/Pods/DoubleConversion/double-conversion/bignum.cc
  type double_conversion (line 31) | namespace double_conversion {
    function BitSize (line 42) | static int BitSize(S value) {
    function ReadUInt64 (line 89) | static uint64_t ReadUInt64(Vector<const char> buffer,
    function HexCharValue (line 123) | static int HexCharValue(char c) {
    function SizeInHexChars (line 553) | static int SizeInHexChars(S number) {
    function HexCharOfValue (line 564) | static char HexCharOfValue(int value) {

FILE: native/iosTest/Pods/DoubleConversion/double-conversion/bignum.h
  function namespace (line 33) | namespace double_conversion {

FILE: native/iosTest/Pods/DoubleConversion/double-conversion/cached-powers.cc
  type double_conversion (line 36) | namespace double_conversion {
    type CachedPower (line 38) | struct CachedPower {

FILE: native/iosTest/Pods/DoubleConversion/double-conversion/cached-powers.h
  function namespace (line 33) | namespace double_conversion {

FILE: native/iosTest/Pods/DoubleConversion/double-conversion/diy-fp.cc
  type double_conversion (line 32) | namespace double_conversion {

FILE: native/iosTest/Pods/DoubleConversion/double-conversion/diy-fp.h
  function namespace (line 33) | namespace double_conversion {

FILE: native/iosTest/Pods/DoubleConversion/double-conversion/double-conversion.cc
  type double_conversion (line 40) | namespace double_conversion {
    function DoubleToStringConverter (line 42) | const DoubleToStringConverter& DoubleToStringConverter::EcmaScriptConv...
    function BignumDtoaMode (line 341) | static BignumDtoaMode DtoaToBignumDtoaMode(
    function ConsumeSubString (line 419) | static bool ConsumeSubString(const char** current,
    function AdvanceToNonspace (line 443) | static inline bool AdvanceToNonspace(const char** current, const char*...
    function isDigit (line 452) | static bool isDigit(int x, int radix) {
    function SignedZero (line 459) | static double SignedZero(bool sign) {
    function IsDecimalDigitForRadix (line 470) | static bool IsDecimalDigitForRadix(int c, int radix) {
    function IsCharacterDigitForRadix (line 481) | static bool IsCharacterDigitForRadix(int c, int radix, char a_characte...
    function RadixStringToIeee (line 488) | static double RadixStringToIeee(const char* current,

FILE: native/iosTest/Pods/DoubleConversion/double-conversion/double-conversion.h
  function namespace (line 33) | namespace double_conversion {
  function class (line 381) | class StringToDoubleConverter {
  function StringToFloat (line 512) | float StringToFloat(const char* buffer,

FILE: native/iosTest/Pods/DoubleConversion/double-conversion/fast-dtoa.cc
  type double_conversion (line 34) | namespace double_conversion {
    function RoundWeed (line 61) | static bool RoundWeed(Vector<char> buffer,
    function RoundWeedCounted (line 181) | static bool RoundWeedCounted(Vector<char> buffer,
    function BiggestPowerTen (line 240) | static void BiggestPowerTen(uint32_t number,
    function DigitGen (line 300) | static bool DigitGen(DiyFp low,
    function DigitGenCounted (line 428) | static bool DigitGenCounted(DiyFp w,
    function Grisu3 (line 519) | static bool Grisu3(double v,
    function Grisu3Counted (line 591) | static bool Grisu3Counted(double v,
    function FastDtoa (line 635) | bool FastDtoa(double v,

FILE: native/iosTest/Pods/DoubleConversion/double-conversion/fast-dtoa.h
  function namespace (line 33) | namespace double_conversion {

FILE: native/iosTest/Pods/DoubleConversion/double-conversion/fixed-dtoa.cc
  type double_conversion (line 33) | namespace double_conversion {
    class UInt128 (line 37) | class UInt128 {
      method UInt128 (line 39) | UInt128() : high_bits_(0), low_bits_(0) { }
      method UInt128 (line 40) | UInt128(uint64_t high, uint64_t low) : high_bits_(high), low_bits_(l...
      method Multiply (line 42) | void Multiply(uint32_t multiplicand) {
      method Shift (line 59) | void Shift(int shift_amount) {
      method DivModPowerOf2 (line 82) | int DivModPowerOf2(int power) {
      method IsZero (line 97) | bool IsZero() const {
      method BitAt (line 101) | int BitAt(int position) {
    function FillDigits32FixedLength (line 120) | static void FillDigits32FixedLength(uint32_t number, int requested_len...
    function FillDigits32 (line 130) | static void FillDigits32(uint32_t number, Vector<char> buffer, int* le...
    function FillDigits64FixedLength (line 153) | static void FillDigits64FixedLength(uint64_t number,
    function FillDigits64 (line 168) | static void FillDigits64(uint64_t number, Vector<char> buffer, int* le...
    function RoundUp (line 189) | static void RoundUp(Vector<char> buffer, int* length, int* decimal_poi...
    function FillFractionals (line 230) | static void FillFractionals(uint64_t fractionals, int exponent,
    function TrimZeros (line 291) | static void TrimZeros(Vector<char> buffer, int* length, int* decimal_p...
    function FastFixedDtoa (line 309) | bool FastFixedDtoa(double v,

FILE: native/iosTest/Pods/DoubleConversion/double-conversion/fixed-dtoa.h
  function namespace (line 33) | namespace double_conversion {

FILE: native/iosTest/Pods/DoubleConversion/double-conversion/ieee.h
  function namespace (line 33) | namespace double_conversion {
  function IsDenormal (line 131) | bool IsDenormal() const {
  function IsNan (line 143) | bool IsNan() const {
  function DiyFp (line 162) | DiyFp UpperBoundary() const {
  function SignificandSizeForOrderOfMagnitude (line 208) | static int SignificandSizeForOrderOfMagnitude(int order) {
  function Infinity (line 216) | static double Infinity() {
  function NaN (line 220) | static double NaN() {
  function DiyFpToUint64 (line 233) | static uint64_t DiyFpToUint64(DiyFp diy_fp) {
  function class (line 263) | class Single {
  function IsDenormal (line 309) | bool IsDenormal() const {
  function IsNan (line 321) | bool IsNan() const {
  function NormalizedBoundaries (line 342) | void NormalizedBoundaries(DiyFp* out_m_minus, DiyFp* out_m_plus) const {
  function DiyFp (line 360) | DiyFp UpperBoundary() const {
  function Infinity (line 380) | static float Infinity() {
  function NaN (line 384) | static float NaN() {

FILE: native/iosTest/Pods/DoubleConversion/double-conversion/strtod.cc
  type double_conversion (line 36) | namespace double_conversion {
    function TrimLeadingZeros (line 91) | static Vector<const char> TrimLeadingZeros(Vector<const char> buffer) {
    function TrimTrailingZeros (line 101) | static Vector<const char> TrimTrailingZeros(Vector<const char> buffer) {
    function CutToMaxSignificantDigits (line 111) | static void CutToMaxSignificantDigits(Vector<const char> buffer,
    function TrimAndCut (line 133) | static void TrimAndCut(Vector<const char> buffer, int exponent,
    function ReadUint64 (line 158) | static uint64_t ReadUint64(Vector<const char> buffer,
    function ReadDiyFp (line 176) | static void ReadDiyFp(Vector<const char> buffer,
    function DoubleStrtod (line 197) | static bool DoubleStrtod(Vector<const char> trimmed,
    function DiyFp (line 251) | static DiyFp AdjustmentPowerOfTen(int exponent) {
    function DiyFpStrtod (line 274) | static bool DiyFpStrtod(Vector<const char> buffer,
    function CompareBufferWithDiyFp (line 392) | static int CompareBufferWithDiyFp(Vector<const char> buffer,
    function ComputeGuess (line 423) | static bool ComputeGuess(Vector<const char> trimmed, int exponent,
    function Strtod (line 448) | double Strtod(Vector<const char> buffer, int exponent) {
    function Strtof (line 474) | float Strtof(Vector<const char> buffer, int exponent) {

FILE: native/iosTest/Pods/DoubleConversion/double-conversion/strtod.h
  function namespace (line 33) | namespace double_conversion {

FILE: native/iosTest/Pods/DoubleConversion/double-conversion/utils.h
  type __int64 (line 93) | typedef __int64 int64_t;
  function namespace (line 139) | namespace double_conversion {

FILE: native/iosTest/Pods/SocketRocket/SocketRocket/Internal/Delegate/SRDelegateController.h
  type SRDelegateAvailableMethods (line 18) | struct SRDelegateAvailableMethods {
  type SRDelegateAvailableMethods (line 32) | struct SRDelegateAvailableMethods {
  type SRDelegateAvailableMethods (line 46) | typedef struct SRDelegateAvailableMethods SRDelegateAvailableMethods;

FILE: native/iosTest/Pods/SocketRocket/SocketRocket/Internal/IOConsumer/SRIOConsumer.h
  function interface (line 21) | interface SRIOConsumer : NSObject {

FILE: native/iosTest/Pods/fmt/include/fmt/args.h
  function FMT_BEGIN_NAMESPACE (line 17) | FMT_BEGIN_NAMESPACE
  function get_types (line 113) | unsigned long long get_types() const {
  function pop_one (line 135) | auto pop_one = [](std::vector<basic_format_arg<Context>>* data) {
  function clear (line 212) | void clear() {
  function reserve (line 224) | void reserve(size_t new_cap, size_t new_cap_named) {

FILE: native/iosTest/Pods/fmt/include/fmt/chrono.h
  function namespace (line 51) | namespace safe_duration_cast {
  type Factor (line 242) | struct Factor
  function min1 (line 272) | constexpr auto min1 = std::numeric_limits<IntermediateRep>::lowest() /
  function namespace (line 303) | namespace detail {
  function std (line 487) | inline std::tm localtime(
  function std (line 497) | inline std::tm gmtime(std::time_t time) {
  function std (line 532) | inline std::tm gmtime(
  function FMT_BEGIN_DETAIL_NAMESPACE (line 537) | FMT_BEGIN_DETAIL_NAMESPACE
  function numeric_system (line 596) | enum class numeric_system {

FILE: native/iosTest/Pods/fmt/include/fmt/color.h
  type class (line 16) | enum class
  function terminal_color (line 160) | enum class terminal_color : uint8_t {
  function T (line 643) | auto styled(const T& value, text_style ts)

FILE: native/iosTest/Pods/fmt/include/fmt/compile.h
  function FMT_BEGIN_NAMESPACE (line 13) | FMT_BEGIN_NAMESPACE
  function Args (line 148) | [[maybe_unused]] const Args&... rest) {
  function OutputIt (line 179) | OutputIt format(OutputIt out, const Args&...) const {
  function OutputIt (line 198) | OutputIt format(OutputIt out, const Args&...) const {
  function OutputIt (line 222) | OutputIt format(OutputIt out, const Args&... args) const {
  function try_format_argument (line 236) | static bool try_format_argument(
  function OutputIt (line 250) | OutputIt format(OutputIt out, const Args&... args) const {
  function FMT_INLINE (line 268) | FMT_INLINE OutputIt format(OutputIt out,
  function OutputIt (line 286) | OutputIt format(OutputIt out, const Args&... args) const {
  type unknown_format (line 300) | struct unknown_format {}
  function on_error (line 364) | constexpr void on_error(const char* message) {
  function FMT_INLINE (line 520) | FMT_INLINE OutputIt format_to(OutputIt out, const CompiledFormat& cf,
  function OutputIt (line 554) | OutputIt format_to(OutputIt out, const S&, Args&&... args) {
  function namespace (line 599) | inline namespace literals {

FILE: native/iosTest/Pods/fmt/include/fmt/core.h
  function const_check (line 325) | struct monostate {
  function T (line 392) | auto convert_for_visit(T value) -> T {
  function int128_opt (line 399) | enum class int128_opt {}
  function uint128_opt (line 400) | enum class uint128_opt {}
  function FMT_END_DETAIL_NAMESPACE (line 421) | FMT_END_DETAIL_NAMESPACE
  function operator (line 480) | constexpr auto operator[](size_t pos) const noexcept -> const Char& {
  function FMT_CONSTEXPR (line 484) | FMT_CONSTEXPR void remove_prefix(size_t n) noexcept {
  function FMT_CONSTEXPR_CHAR_TRAITS (line 490) | FMT_CONSTEXPR_CHAR_TRAITS auto compare(basic_string_view other) const ->...
  function true_type (line 524) | struct is_char<char> : std::true_type {}
  function FMT_BEGIN_DETAIL_NAMESPACE (line 526) | FMT_BEGIN_DETAIL_NAMESPACE
  function Char (line 536) | auto to_string_view(const Char* s) -> basic_string_view<Char> {
  function Char (line 540) | auto to_string_view(const std::basic_string<Char, Traits, Alloc>& s)
  function type (line 575) | enum class type {
  function type (line 743) | constexpr auto arg_type(int id) const -> type { return types_[id]; }
  function FMT_CONSTEXPR (line 745) | FMT_CONSTEXPR auto next_arg_id() -> int {
  function FMT_CONSTEXPR (line 757) | FMT_CONSTEXPR void check_dynamic_spec(int arg_id) {
  function Container (line 829) | auto get_container(std::back_insert_iterator<Container> it)
  function FMT_CONSTEXPR (line 880) | FMT_CONSTEXPR void set(T* buf_data, size_t buf_capacity) noexcept {
  function size (line 898) | auto begin() const noexcept -> const T* { return ptr_; }
  function FMT_CONSTEXPR (line 908) | FMT_CONSTEXPR auto data() noexcept -> T* { return ptr_; }
  function clear (line 914) | void clear() { size_ = 0; }
  function FMT_CONSTEXPR20 (line 918) | FMT_CONSTEXPR20 void try_resize(size_t count) {
  function FMT_CONSTEXPR20 (line 927) | FMT_CONSTEXPR20 void try_reserve(size_t new_capacity) {
  function FMT_CONSTEXPR20 (line 931) | FMT_CONSTEXPR20 void push_back(const T& value) {
  function count (line 948) | struct buffer_traits {
  function override (line 978) | grow(size_t) override {
  function flush (line 982) | void flush() {
  function override (line 1012) | grow(size_t) override {
  function flush (line 1016) | void flush() {
  function override (line 1050) | grow(size_t) override {}
  function override (line 1092) | grow(size_t) override {
  type view (line 1136) | struct view {}
  type arg_data (line 1164) | struct arg_data<T, Char, NUM_ARGS, 0> {
  type is_named_arg (line 1179) | struct is_named_arg
  type is_statically_named_arg (line 1180) | struct is_statically_named_arg
  type is_named_arg (line 1183) | struct is_named_arg<named_arg<Char, T>> : std::true_type {}
  function init_named_args (line 1201) | void init_named_args(std::nullptr_t, int, int,
  type unformattable (line 1218) | struct unformattable {}
  function unformattable (line 1219) | struct unformattable_char : unformattable {}
  function unformattable (line 1220) | struct unformattable_const : unformattable {}
  function unformattable (line 1221) | struct unformattable_pointer : unformattable {}
  function FMT_INLINE (line 1263) | constexpr FMT_INLINE value() : no_value() {}
  function FMT_INLINE (line 1284) | FMT_INLINE value(const named_arg_info<char_type>* args, size_t size)
  function format_custom_arg (line 1307) | void format_custom_arg(void* arg,
  function FMT_CONSTEXPR (line 1348) | FMT_CONSTEXPR FMT_INLINE auto map(signed char val) -> int { return val; }
  function FMT_CONSTEXPR (line 1349) | FMT_CONSTEXPR FMT_INLINE auto map(unsigned char val) -> unsigned {
  function FMT_CONSTEXPR (line 1356) | FMT_CONSTEXPR FMT_INLINE auto map(int val) -> int { return val; }
  function long_type (line 1358) | auto map(long val) -> long_type { return val; }
  function ulong_type (line 1359) | auto map(unsigned long val) -> ulong_type {
  function FMT_CONSTEXPR (line 1367) | FMT_CONSTEXPR FMT_INLINE auto map(int128_opt val) -> int128_opt {
  function FMT_CONSTEXPR (line 1370) | FMT_CONSTEXPR FMT_INLINE auto map(uint128_opt val) -> uint128_opt {
  function FMT_CONSTEXPR (line 1373) | FMT_CONSTEXPR FMT_INLINE auto map(bool val) -> bool { return val; }
  function FMT_CONSTEXPR (line 1394) | FMT_CONSTEXPR FMT_INLINE auto map(long double val) -> long double {
  function unformattable_char (line 1414) | auto map(const T&) -> unformattable_char {
  function buffer (line 1547) | auto get_buffer(appender out) -> detail::buffer<char>& {
  function base (line 1553) | appender(base it) noexcept : base(it) {}
  function operator (line 1556) | auto operator++() noexcept -> appender& { return *this; }
  type detail (line 1582) | struct detail
  function custom_ (line 1590) | custom_(custom) {}
  function format (line 1592) | void format(typename Context::parse_context_type& parse_ctx,
  type is_contiguous_back_insert_iterator (line 1707) | struct is_contiguous_back_insert_iterator<appender> : std::true_type {}
  function FMT_CONSTEXPR (line 1817) | FMT_CONSTEXPR auto arg(basic_string_view<char_type> name) -> format_arg {
  function FMT_CONSTEXPR (line 1820) | FMT_CONSTEXPR auto arg_id(basic_string_view<char_type> name) -> int {
  function FMT_CONSTEXPR (line 1827) | FMT_CONSTEXPR auto error_handler() -> detail::error_handler { return {}; }
  function FMT_CONSTEXPR (line 1838) | FMT_CONSTEXPR auto locale() -> detail::locale_ref { return loc_; }
  function FMT_CONSTEXPR (line 1976) | FMT_CONSTEXPR auto type(int index) const -> detail::type {
  function FMT_INLINE (line 1982) | constexpr FMT_INLINE basic_format_args(unsigned long long desc,
  function namespace (line 2073) | namespace align {
  type width_adapter (line 2446) | struct width_adapter {
  function FMT_CONSTEXPR (line 2454) | FMT_CONSTEXPR void on_error(const char* message) {
  type precision_adapter (line 2480) | struct precision_adapter {
  function FMT_CONSTEXPR (line 2488) | FMT_CONSTEXPR void on_error(const char* message) {
  type id_adapter (line 2636) | struct id_adapter {
  function FMT_CONSTEXPR (line 2645) | FMT_CONSTEXPR void on_error(const char* message) {
  function adapter (line 2657) | auto adapter = id_adapter{handler, 0};
  function float_format (line 2772) | enum class float_format : unsigned char {
  function FMT_CONSTEXPR (line 2864) | FMT_CONSTEXPR void require_numeric_argument() {
  function FMT_CONSTEXPR (line 2878) | FMT_CONSTEXPR void on_sign(sign_t s) {
  function FMT_CONSTEXPR (line 2888) | FMT_CONSTEXPR void on_hash() {
  function FMT_CONSTEXPR (line 2893) | FMT_CONSTEXPR void on_localized() {
  function FMT_CONSTEXPR (line 2898) | FMT_CONSTEXPR void on_zero() {
  function FMT_CONSTEXPR (line 2903) | FMT_CONSTEXPR void end_precision() {
  function FMT_CONSTEXPR (line 2960) | FMT_CONSTEXPR void on_text(const Char*, const Char*) {}
  function FMT_CONSTEXPR (line 2963) | FMT_CONSTEXPR auto on_arg_id(int id) -> int {
  function FMT_CONSTEXPR (line 2966) | FMT_CONSTEXPR auto on_arg_id(basic_string_view<Char> id) -> int {
  function FMT_CONSTEXPR (line 2978) | FMT_CONSTEXPR void on_replacement_field(int, const Char*) {}
  function FMT_CONSTEXPR (line 2987) | FMT_CONSTEXPR void on_error(const char* message) {
  function check_format_string (line 2994) | void check_format_string(const S&) {
  function vprint_mojibake (line 3020) | inline void vprint_mojibake(std::FILE*, string_view, format_args) {}
  function set_debug_format (line 3107) | void set_debug_format() {
  function FMT_INLINE (line 3148) | FMT_INLINE basic_format_string(const S& s) : str_(s) {
  function string_view (line 3173) | inline auto runtime(string_view s) -> string_view { return s; }
  function basic_runtime (line 3187) | inline auto runtime(string_view s) -> basic_runtime<char> { return {{s}}; }

FILE: native/iosTest/Pods/fmt/include/fmt/format-inl.h
  function FMT_BEGIN_NAMESPACE (line 31) | FMT_BEGIN_NAMESPACE
  function FMT_FUNC (line 124) | FMT_FUNC std::system_error vsystem_error(int error_code, string_view for...
  function FMT_CONSTEXPR (line 137) | FMT_CONSTEXPR inline uint32_t rotr(uint32_t n, uint32_t r) noexcept {
  function FMT_CONSTEXPR (line 141) | FMT_CONSTEXPR inline uint64_t rotr(uint64_t n, uint32_t r) noexcept {
  function uint128_fallback (line 147) | inline uint128_fallback umul128(uint64_t x, uint64_t y) noexcept {
  function umul128_upper64 (line 178) | inline uint64_t umul128_upper64(uint64_t x, uint64_t y) noexcept {
  function uint128_fallback (line 191) | inline uint128_fallback umul192_upper128(uint64_t x,
  function umul96_upper64 (line 200) | inline uint64_t umul96_upper64(uint32_t x, uint64_t y) noexcept {
  function uint128_fallback (line 206) | inline uint128_fallback umul192_lower128(uint64_t x,
  function umul96_lower64 (line 215) | inline uint64_t umul96_lower64(uint32_t x, uint64_t y) noexcept {
  function floor_log10_pow2 (line 221) | inline int floor_log10_pow2(int e) noexcept {
  function floor_log2_pow10 (line 228) | inline int floor_log2_pow10(int e) noexcept {
  function floor_log10_pow2_minus_log10_4_over_3 (line 232) | inline int floor_log10_pow2_minus_log10_4_over_3(int e) noexcept {
  function divide_by_10_to_kappa_plus_1 (line 280) | inline uint32_t divide_by_10_to_kappa_plus_1(uint32_t n) noexcept {
  function divide_by_10_to_kappa_plus_1 (line 285) | inline uint64_t divide_by_10_to_kappa_plus_1(uint64_t n) noexcept {
  type cache_accessor (line 293) | struct cache_accessor
  function get_cached_power (line 297) | static uint64_t get_cached_power(int k) noexcept {
  type compute_mul_result (line 330) | struct compute_mul_result {
  type compute_mul_parity_result (line 334) | struct compute_mul_parity_result {
  function compute_mul_result (line 339) | static compute_mul_result compute_mul(
  function compute_delta (line 346) | static uint32_t compute_delta(const cache_entry_type& cache,
  function compute_mul_parity_result (line 351) | static compute_mul_parity_result compute_mul_parity(
  type cache_accessor (line 384) | struct cache_accessor
  function uint128_fallback (line 388) | static uint128_fallback get_cached_power(int k) noexcept {

FILE: native/iosTest/Pods/fmt/include/fmt/format.h
  function FMT_BEGIN_NAMESPACE (line 83) | FMT_BEGIN_NAMESPACE
  function FMT_BEGIN_NAMESPACE (line 173) | FMT_BEGIN_NAMESPACE
  function FMT_BEGIN_NAMESPACE (line 242) | FMT_BEGIN_NAMESPACE
  function To (line 297) | auto bit_cast(const From& from) -> To {
  type bytes (line 315) | struct bytes {
  function class (line 322) | class uint128_fallback {
  function low (line 333) | constexpr uint64_t low() const noexcept { return lo_; }
  function FMT_CONSTEXPR (line 380) | FMT_CONSTEXPR auto operator>>(int shift) const -> uint128_fallback {
  function FMT_CONSTEXPR (line 385) | FMT_CONSTEXPR auto operator<<(int shift) const -> uint128_fallback {
  function FMT_CONSTEXPR (line 390) | FMT_CONSTEXPR auto operator>>=(int shift) -> uint128_fallback& {
  function To (line 450) | auto bit_cast(const From& from) -> To {
  function FMT_INLINE (line 466) | FMT_INLINE void assume(bool condition) {
  function Char (line 480) | auto get_data(std::basic_string<Char>& s) -> Char* {
  type char8_type (line 577) | enum char8_type : unsigned char {}
  function FMT_NOINLINE (line 581) | FMT_NOINLINE auto copy_str_noinline(InputIt begin, InputIt end,
  function FMT_CONSTEXPR (line 603) | FMT_CONSTEXPR inline auto utf8_decode(const char* s, uint32_t* c, int* e)
  function for_each_codepoint (line 644) | void for_each_codepoint(string_view s, F f) {
  function FMT_CONSTEXPR (line 680) | FMT_CONSTEXPR inline size_t compute_width(string_view s) {
  function FMT_MODULE_EXPORT_BEGIN (line 790) | FMT_MODULE_EXPORT_BEGIN
  function FMT_CONSTEXPR20 (line 897) | FMT_CONSTEXPR20 void resize(size_t count) { this->try_resize(count); }
  function reserve (line 900) | void reserve(size_t new_capacity) { this->try_reserve(new_capacity); }
  function namespace (line 940) | namespace detail {
  function FMT_API (line 949) | FMT_API format_error : public std::runtime_error {
  function namespace (line 961) | namespace detail_exported {
  function FMT_BEGIN_DETAIL_NAMESPACE (line 987) | FMT_BEGIN_DETAIL_NAMESPACE
  function true_type (line 990) | struct is_integral<int128_opt> : std::true_type {}
  function true_type (line 991) | struct is_integral<uint128_t> : std::true_type {}
  function Char (line 1043) | Char sign(Sign s) {
  function FMT_CONSTEXPR (line 1065) | FMT_CONSTEXPR inline auto count_digits(uint128_opt n) -> int {
  function FMT_CONSTEXPR20 (line 1093) | FMT_CONSTEXPR20 inline auto count_digits(uint64_t n) -> int {
  function FMT_INLINE (line 1122) | FMT_INLINE auto do_count_digits(uint32_t n) -> int {
  function FMT_CONSTEXPR20 (line 1145) | FMT_CONSTEXPR20 inline auto count_digits(uint32_t n) -> int {
  function wchar_t (line 1173) | inline auto thousands_sep(locale_ref loc) -> thousands_sep_result<wchar_...
  function Char (line 1179) | auto decimal_point(locale_ref loc) -> Char {
  function wchar_t (line 1182) | inline auto decimal_point(locale_ref loc) -> wchar_t {
  function copy2 (line 1196) | void copy2(Char* dst, const char* src) {
  function class (line 1274) | class utf8_to_utf16 {
  function has_implicit_bit (line 1340) | bool has_implicit_bit() {
  function num_significand_bits (line 1347) | int num_significand_bits() {
  function FMT_CONSTEXPR (line 1457) | FMT_CONSTEXPR inline uint64_t multiply(uint64_t lhs, uint64_t rhs) {
  function basic_data (line 1544) | struct data : basic_data<> {}
  function FMT_CONSTEXPR (line 1548) | FMT_CONSTEXPR inline fp get_cached_power(int min_exponent,
  function T (line 1632) | auto convert_float(T value) -> convert_float_result<T> {
  function FMT_CONSTEXPR (line 1637) | FMT_CONSTEXPR auto fill(OutputIt it, size_t n,
  function write (line 1693) | auto write = [=](reserve_iterator<OutputIt> it) {
  function OutputIt (line 1873) | auto write(OutputIt out, Char value,
  function FMT_CONSTEXPR (line 1887) | FMT_CONSTEXPR write_int_data(int num_digits, unsigned prefix,
  function FMT_INLINE (line 1908) | FMT_INLINE auto write_int(OutputIt out, int num_digits,
  type next_state (line 1935) | struct next_state {
  function next (line 1942) | int next(next_state& state) const {
  function explicit (line 1959) | explicit digit_grouping(thousands_sep_result<Char> sep) : sep_(sep) {}
  function count_separators (line 1963) | int count_separators(int num_digits) const {
  function FMT_INLINE (line 2049) | FMT_INLINE auto write_int(OutputIt out, write_int_arg<T> arg,
  function FMT_NOINLINE (line 2110) | FMT_NOINLINE auto write_int_noinline(
  function FMT_INLINE (line 2119) | FMT_INLINE auto write(OutputIt out, T value,
  function FMT_INLINE (line 2130) | FMT_INLINE auto write(OutputIt out, T value,
  function class (line 2138) | class counting_iterator {
  type big_decimal_fp (line 2256) | struct big_decimal_fp {
  function write (line 2400) | auto write = [=](iterator it) {
  function count_separators (line 2471) | constexpr int count_separators(int) const { return 0; }
  function Out (line 2474) | Out apply(Out out, basic_string_view<C>) const {
  function isnan (line 2493) | bool isnan(T value) {
  function isfinite (line 2506) | bool isfinite(T value) {
  function isfinite (line 2513) | bool isfinite(T value) {
  function signbit (line 2520) | bool signbit(T value) {
  function round_direction (line 2532) | enum class round_direction { unknown, up, down };
  function FMT_INLINE (line 2615) | FMT_INLINE FMT_CONSTEXPR20 auto grisu_gen_digits(fp value, uint64_t error,
  function class (line 2707) | class bigint {
  function compare (line 2841) | int compare(const bigint& lhs, const bigint& rhs) {
  function add_compare (line 2858) | int add_compare(const bigint& lhs1, const bigint& lhs2,
  function FMT_CONSTEXPR20 (line 2884) | FMT_CONSTEXPR20 void assign_pow10(int exp) {
  function FMT_CONSTEXPR20 (line 2903) | FMT_CONSTEXPR20 void square() {
  function FMT_CONSTEXPR20 (line 2933) | FMT_CONSTEXPR20 void align(const bigint& other) {
  function FMT_CONSTEXPR20 (line 2946) | FMT_CONSTEXPR20 int divmod_assign(const bigint& divisor) {
  type dragon (line 2961) | enum dragon {
  function gen_digits_handler (line 3149) | gen_digits_handler handler{buf.data(), 0, precision, -cached_exp10, fixed};
  function OutputIt (line 3187) | auto write(OutputIt out, T value,
  function FMT_INLINE (line 3393) | FMT_INLINE auto operator()(T value) -> iterator {
  function const (line 3407) | void operator()(
  function handler_ (line 3422) | handler_(eh) {}
  function handler_ (line 3442) | handler_(eh) {}
  function FMT_CONSTEXPR (line 3485) | FMT_CONSTEXPR auto get_arg(auto_id) -> format_arg {
  function FMT_CONSTEXPR (line 3494) | FMT_CONSTEXPR auto get_arg(basic_string_view<Char> arg_id) -> format_arg {
  function on_dynamic_width (line 3505) | void on_dynamic_width(Id arg_id) {
  function on_dynamic_precision (line 3510) | void on_dynamic_precision(Id arg_id) {
  function on_error (line 3515) | void on_error(const char* message) { context_.on_error(message); }
  function value (line 3553) | statically_named_arg(const T& v) : value(v) {}
  function FMT_API (line 3648) | FMT_API void report_system_error(int error_code, const char* message) no...
  function explicit (line 3675) | explicit format_int(long value) : str_(format_signed(value)) {}
  function explicit (line 3676) | explicit format_int(long long value) : str_(format_signed(value)) {}
  function explicit (line 3677) | explicit format_int(unsigned value) : str_(format_unsigned(value)) {}
  function explicit (line 3678) | explicit format_int(unsigned long value) : str_(format_unsigned(value)) {}
  function explicit (line 3679) | explicit format_int(unsigned long long value)
  function data (line 3691) | auto data() const -> const char* { return str_; }
  function error_handler (line 3764) | struct null_handler : detail::error_handler {
  function Enum (line 3830) | auto underlying(Enum e) noexcept -> underlying_t<Enum> {
  function namespace (line 3834) | namespace enums {
  function class (line 3841) | class bytes {
  function bytes (line 3850) | struct formatter<bytes> {
  function T (line 3944) | auto map(const T& value) -> const T& {
  function decltype (line 3948) | auto map(const T& value) -> decltype(mapper().map(value)) {
  function string (line 4029) | auto to_string(const T& value) -> std::string {
  function string (line 4036) | inline auto to_string(T value) -> std::string {
  function error_handler (line 4082) | struct format_handler : error_handler {
  function string (line 4176) | auto vformat(const Locale& loc, string_view fmt, format_args args)

FILE: native/iosTest/Pods/fmt/include/fmt/os.h
  function Char (line 117) | const Char* c_str() const { return data_; }
  function FMT_API (line 142) | FMT_API const std::error_category& system_category() noexcept;
  function system_error (line 201) | system_error windows_error(int error_code, string_view message,
  function std (line 210) | inline const std::error_category& system_category() noexcept {
  function class (line 224) | class buffered_file {
  function class (line 282) | class FMT_API file {
  function ostream_params (line 375) | struct ostream_params {
  function oflag (line 395) | ostream_params(int new_oflag) : oflag(new_oflag) {}
  function FMT_END_DETAIL_NAMESPACE (line 400) | FMT_END_DETAIL_NAMESPACE
  function ostream (line 411) | void grow(size_t) override;
  function flush (line 430) | void flush() {
  function close (line 439) | void close() {
  function ostream (line 470) | ostream output_file(cstring_view path, T... params) {

FILE: native/iosTest/Pods/fmt/include/fmt/ostream.h
  function namespace (line 26) | namespace detail {
  type file_access_tag (line 63) | struct file_access_tag {}
  function friend (line 67) | friend auto get_file(BufType& obj) -> FILE* { return obj.*FileMemberPtr; }
  function write_ostream_unicode (line 80) | inline bool write_ostream_unicode(std::ostream& os, fmt::string_view dat...
  function write_ostream_unicode (line 102) | inline bool write_ostream_unicode(std::wostream&,
  function T (line 177) | streamed(const T& value) -> detail::streamed_view<T> {
  function namespace (line 181) | namespace detail {
  function vprint_directly (line 190) | inline void vprint_directly(std::ostream& os, string_view format_str,
  function FMT_MODULE_EXPORT (line 227) | FMT_MODULE_EXPORT

FILE: native/iosTest/Pods/fmt/include/fmt/printf.h
  function advance_to (line 48) | void advance_to(OutputIt it) { out_ = it; }
  function format_arg (line 52) | format_arg arg(int id) const { return args_.get(id); }
  function FMT_CONSTEXPR (line 54) | FMT_CONSTEXPR void on_error(const char* message) {
  function FMT_BEGIN_DETAIL_NAMESPACE (line 59) | FMT_BEGIN_DETAIL_NAMESPACE
  type int_checker (line 71) | struct int_checker
  function fits_in_int (line 72) | bool fits_in_int(T value) {
  function fits_in_int (line 76) | static bool fits_in_int(int) { return true; }
  function class (line 79) | class printf_precision_handler {
  function class (line 96) | class is_zero_int {
  function bool (line 111) | struct make_unsigned_or_bool<bool> { using type = bool; }
  function arg_ (line 174) | arg_(arg) {}
  function Char (line 189) | Char* operator()(T) { return nullptr; }
  function Char (line 190) | const Char* operator()(const Char* s) { return s; }
  function OutputIt (line 243) | OutputIt operator()(monostate value) { return base::operator()(value); }
  function OutputIt (line 273) | OutputIt operator()(const char* value) {
  function OutputIt (line 279) | OutputIt operator()(const wchar_t* value) {
  function OutputIt (line 284) | OutputIt operator()(basic_string_view<Char> value) {
  function OutputIt (line 289) | OutputIt operator()(const void* value) {
  function OutputIt (line 294) | OutputIt operator()(typename basic_format_arg<context_type>::handle hand...
  function get_arg (line 378) | auto get_arg = [&](int arg_index) {

FILE: native/iosTest/Pods/fmt/include/fmt/ranges.h
  function FMT_BEGIN_NAMESPACE (line 21) | FMT_BEGIN_NAMESPACE
  function namespace (line 383) | namespace detail {
  function FMT_CONSTEXPR (line 545) | FMT_CONSTEXPR range_default_formatter() { init(range_format_constant<K>(...

FILE: native/iosTest/Pods/fmt/include/fmt/std.h
  function FMT_BEGIN_NAMESPACE (line 31) | FMT_BEGIN_NAMESPACE
  function namespace (line 97) | namespace detail {

FILE: native/iosTest/Pods/fmt/include/fmt/xchar.h
  function FMT_BEGIN_NAMESPACE (line 15) | FMT_BEGIN_NAMESPACE
  function wstring_view (line 32) | inline auto runtime(wstring_view s) -> wstring_view { return s; }
  function wchar_t (line 36) | inline auto runtime(wstring_view s) -> basic_runtime<wchar_t> { return {...
  function true_type (line 39) | struct is_char<wchar_t> : std::true_type {}
  function true_type (line 40) | struct is_char<detail::char8_type> : std::true_type {}
  function true_type (line 41) | struct is_char<char16_t> : std::true_type {}
  function true_type (line 42) | struct is_char<char32_t> : std::true_type {}
  function namespace (line 50) | inline namespace literals {
  function vprint (line 199) | inline void vprint(std::FILE* f, wstring_view fmt, wformat_args args) {
  function vprint (line 207) | inline void vprint(wstring_view fmt, wformat_args args) {
  function wstring (line 223) | auto to_wstring(const T& value) -> std::wstring {

FILE: native/iosTest/Pods/fmt/src/format.cc
  function FMT_BEGIN_NAMESPACE (line 10) | FMT_BEGIN_NAMESPACE

FILE: native/iosTest/Pods/glog/src/base/googleinit.h
  function class (line 36) | class GoogleInitializer {

FILE: native/iosTest/Pods/glog/src/base/mutex.h
  type MutexType (line 108) | typedef int MutexType;
  type CRITICAL_SECTION (line 130) | typedef CRITICAL_SECTION MutexType;
  type pthread_rwlock_t (line 142) | typedef pthread_rwlock_t MutexType;
  type pthread_mutex_t (line 145) | typedef pthread_mutex_t MutexType;
  function namespace (line 157) | namespace MUTEX_NAMESPACE {

FILE: native/iosTest/Pods/glog/src/demangle.cc
  function _START_GOOGLE_NAMESPACE_ (line 40) | _START_GOOGLE_NAMESPACE_
  function StrLen (line 158) | static size_t StrLen(const char *str) {
  function AtLeastNumCharsRemaining (line 168) | static bool AtLeastNumCharsRemaining(const char *str, int n) {
  function StrPrefix (line 178) | static bool StrPrefix(const char *str, const char *prefix) {
  function InitState (line 187) | static void InitState(State *state, const char *mangled,
  function ParseOneCharToken (line 203) | static bool ParseOneCharToken(State *state, const char one_char_token) {
  function ParseTwoCharToken (line 214) | static bool ParseTwoCharToken(State *state, const char *two_char_token) {
  function ParseCharClass (line 225) | static bool ParseCharClass(State *state, const char *char_class) {
  function Optional (line 237) | static bool Optional(bool) {
  function OneOrMore (line 243) | static bool OneOrMore(ParseFunc parse_func, State *state) {
  function ZeroOrMore (line 256) | static bool ZeroOrMore(ParseFunc parse_func, State *state) {
  function Append (line 265) | static void Append(State *state, const char * const str, const int lengt...
  function IsLower (line 282) | static bool IsLower(char c) {
  function IsAlpha (line 286) | static bool IsAlpha(char c) {
  function IsDigit (line 290) | static bool IsDigit(char c) {
  function IsFunctionCloneSuffix (line 298) | static bool IsFunctionCloneSuffix(const char *str) {
  function MaybeAppendWithLength (line 322) | static void MaybeAppendWithLength(State *state, const char * const str,
  function MaybeAppend (line 341) | static bool MaybeAppend(State *state, const char * const str) {
  function EnterNestedName (line 350) | static bool EnterNestedName(State *state) {
  function LeaveNestedName (line 356) | static bool LeaveNestedName(State *state, short prev_value) {
  function DisableAppend (line 362) | static bool DisableAppend(State *state) {
  function RestoreAppend (line 368) | static bool RestoreAppend(State *state, bool prev_value) {
  function MaybeIncreaseNestLevel (line 374) | static void MaybeIncreaseNestLevel(State *state) {
  function MaybeAppendSeparator (line 381) | static void MaybeAppendSeparator(State *state) {
  function MaybeCancelLastSeparator (line 388) | static void MaybeCancelLastSeparator(State *state) {
  function IdentifierIsAnonymousNamespace (line 398) | static bool IdentifierIsAnonymousNamespace(State *state, int length) {
  function ParseMangledName (line 474) | static bool ParseMangledName(State *state) {
  function ParseEncoding (line 481) | static bool ParseEncoding(State *state) {
  function ParseName (line 498) | static bool ParseName(State *state) {
  function ParseUnscopedName (line 519) | static bool ParseUnscopedName(State *state) {
  function ParseUnscopedTemplateName (line 536) | static bool ParseUnscopedTemplateName(State *state) {
  function ParseNestedName (line 542) | static bool ParseNestedName(State *state) {
  function ParsePrefix (line 567) | static bool ParsePrefix(State *state) {
  function ParseUnqualifiedName (line 592) | static bool ParseUnqualifiedName(State *state) {
  function ParseSourceName (line 600) | static bool ParseSourceName(State *state) {
  function ParseLocalSourceName (line 615) | static bool ParseLocalSourceName(State *state) {
  function ParseNumber (line 628) | static bool ParseNumber(State *state, int *number_out) {
  function ParseFloatNumber (line 654) | static bool ParseFloatNumber(State *state) {
  function ParseSeqId (line 670) | static bool ParseSeqId(State *state) {
  function ParseIdentifier (line 685) | static bool ParseIdentifier(State *state, int length) {
  function ParseOperatorName (line 702) | static bool ParseOperatorName(State *state) {
  function ParseSpecialName (line 765) | static bool ParseSpecialName(State *state) {
  function ParseCallOffset (line 828) | static bool ParseCallOffset(State *state) {
  function ParseNVOffset (line 846) | static bool ParseNVOffset(State *state) {
  function ParseVOffset (line 851) | static bool ParseVOffset(State *state) {
  function ParseCtorDtorName (line 863) | static bool ParseCtorDtorName(State *state) {
  function ParseType (line 906) | static bool ParseType(State *state) {
  function ParseCVQualifiers (line 962) | static bool ParseCVQualifiers(State *state) {
  function ParseBuiltinType (line 972) | static bool ParseBuiltinType(State *state) {
  function ParseFunctionType (line 991) | static bool ParseFunctionType(State *state) {
  function ParseBareFunctionType (line 1003) | static bool ParseBareFunctionType(State *state) {
  function ParseClassEnumType (line 1016) | static bool ParseClassEnumType(State *state) {
  function ParseArrayType (line 1022) | static bool ParseArrayType(State *state) {
  function ParsePointerToMemberType (line 1039) | static bool ParsePointerToMemberType(State *state) {
  function ParseTemplateParam (line 1051) | static bool ParseTemplateParam(State *state) {
  function ParseTemplateTemplateParam (line 1070) | static bool ParseTemplateTemplateParam(State *state) {
  function ParseTemplateArgs (line 1076) | static bool ParseTemplateArgs(State *state) {
  function ParseTemplateArg (line 1094) | static bool ParseTemplateArg(State *state) {
  function ParseExpression (line 1126) | static bool ParseExpression(State *state) {
  function ParseExprPrimary (line 1178) | static bool ParseExprPrimary(State *state) {
  function ParseLocalName (line 1212) | static bool ParseLocalName(State *state) {
  function ParseDiscriminator (line 1230) | static bool ParseDiscriminator(State *state) {
  function ParseSubstitution (line 1242) | static bool ParseSubstitution(State *state) {
  function ParseTopLevelMangledName (line 1277) | static bool ParseTopLevelMangledName(State *state) {
  function Demangle (line 1298) | bool Demangle(const char *mangled, char *out, int out_size) {

FILE: native/iosTest/Pods/glog/src/glog/log_severity.h
  type LogSeverity (line 45) | typedef int LogSeverity;

FILE: native/iosTest/Pods/glog/src/glog/logging.h
  function namespace (line 89) | namespace google {
  function namespace (line 509) | namespace google {
  function MakeCheckOpValueString (line 637) | void MakeCheckOpValueString(std::ostream* os, const T& v) {
  function namespace (line 655) | namespace base {
  function string (line 691) | string* MakeCheckOpString(const T1& v1, const T2& v2, const char* exprte...
  function namespace (line 927) | namespace glog_internal_namespace_ {
  type PRIVATE_Counter (line 959) | enum PRIVATE_Counter {COUNTER}
  function namespace (line 1105) | namespace base_logging {
  function set_ctr (line 1171) | void set_ctr(int ctr) { ctr_ = ctr; }
  function LogStream (line 1172) | LogStream* self() const { return self_; }
  function preserved_errno (line 1253) | int preserved_errno() const;
  function LogAtLevel (line 1302) | inline void LogAtLevel(int const severity, std::string const &msg) {
  function class (line 1378) | class GOOGLE_GLOG_DLL_DECL LogMessageVoidify {
  function class (line 1418) | class GOOGLE_GLOG_DLL_DECL LogSink {
  function namespace (line 1539) | namespace base {

FILE: native/iosTest/Pods/glog/src/glog/raw_logging.h
  function namespace (line 41) | namespace google {

FILE: native/iosTest/Pods/glog/src/glog/stl_logging.h
  function namespace (line 86) | namespace google {
  function OUTPUT_FOUR_ARG_CONTAINER (line 131) | OUTPUT_FOUR_ARG_CONTAINER(std::map)
  function namespace (line 178) | namespace google {
  function namespace (line 218) | namespace std { using ::operator<<; }

FILE: native/iosTest/Pods/glog/src/googletest.h
  function string (line 74) | static inline string GetTempDir() {
  function _START_GOOGLE_NAMESPACE_ (line 111) | _START_GOOGLE_NAMESPACE_
  function RUN_ALL_TESTS (line 184) | static inline int RUN_ALL_TESTS() {
  function CalledAbort (line 201) | static inline void CalledAbort() {
  function class (line 238) | class BenchmarkRegisterer {
  function RunSpecifiedBenchmarks (line 245) | static inline void RunSpecifiedBenchmarks() {
  function class (line 269) | class CapturedStream {
  function Capture (line 285) | void Capture() {
  function StopCapture (line 304) | void StopCapture() {
  function CaptureTestOutput (line 323) | static inline void CaptureTestOutput(int fd, const string & filename) {
  function CaptureTestStderr (line 328) | static inline void CaptureTestStderr() {
  function GetFileSize (line 332) | static inline size_t GetFileSize(FILE * file) {
  function string (line 337) | static inline string ReadEntireFile(FILE * file) {
  function string (line 360) | static inline string GetCapturedTestOutput(int fd) {
  function string (line 380) | static inline string GetCapturedTestStderr() {
  function IsLoggingPrefix (line 385) | static inline bool IsLoggingPrefix(const string& s) {
  function string (line 399) | static inline string MungeLine(const string& line) {
  function StringReplace (line 431) | static inline void StringReplace(string* str,
  function string (line 440) | static inline string Munge(const string& filename) {
  function WriteToFile (line 464) | static inline void WriteToFile(const string& body, const string& file) {
  function MungeAndDiffTestStderr (line 470) | static inline bool MungeAndDiffTestStderr(const string& golden_filename) {
  type FlagSaver (line 500) | struct FlagSaver {
  function class (line 519) | class Thread {
  function SleepForMilliseconds (line 565) | static inline void SleepForMilliseconds(int t) {
  function _END_GOOGLE_NAMESPACE_ (line 577) | _END_GOOGLE_NAMESPACE_
  function delete (line 590) | void operator delete(void* p) throw() {

FILE: native/iosTest/Pods/glog/src/logging.cc
  function BoolFromEnv (line 98) | static bool BoolFromEnv(const char *varname, bool defval) {
  function _START_GOOGLE_NAMESPACE_ (line 117) | _START_GOOGLE_NAMESPACE_
  function pread (line 194) | static ssize_t pread(int fd, void* buf, size_t count, off_t offset) {
  function pwrite (line 210) | static ssize_t pwrite(int fd, void* buf, size_t count, off_t offset) {
  function GetHostName (line 225) | static void GetHostName(string* hostname) {
  function TerminalSupportsColor (line 248) | static bool TerminalSupportsColor() {
  function GLogColor (line 280) | static GLogColor SeverityToColor(LogSeverity severity) {
  function WORD (line 304) | WORD GetColorAttribute(GLogColor color) {
  function int32 (line 329) | static int32 MaxLogSize() {
  type LogMessage::LogMessageData (line 337) | struct LogMessage::LogMessageData  {
    type ::tm (line 353) | struct ::tm
  class LogFileObject (line 400) | class LogFileObject : public base::Logger {
    method uint32 (line 420) | virtual uint32 LogSize() {
  class LogDestination (line 453) | class LogDestination {
    type ::tm (line 517) | struct ::tm
  function string (line 559) | const string& LogDestination::hostname() {
  function ColoredWriteToStderr (line 677) | static void ColoredWriteToStderr(LogSeverity severity,
  function WriteToStderr (line 714) | static void WriteToStderr(const char* message, size_t len) {
  type ::tm (line 784) | struct ::tm
  function LogDestination (line 813) | inline LogDestination* LogDestination::log_destination(LogSeverity sever...
    type ::tm (line 517) | struct ::tm
  type ::tm (line 991) | struct ::tm
  function ostream (line 1278) | ostream& LogMessage::stream() {
  function ReprintFatalMessage (line 1342) | void ReprintFatalMessage() {
  function EXCLUSIVE_LOCKS_REQUIRED (line 1354) | EXCLUSIVE_LOCKS_REQUIRED(log_mutex) {
  function logging_fail (line 1468) | static void logging_fail() {
  function InstallFailureFunction (line 1483) | void InstallFailureFunction(void (*fail_func)()) {
  function EXCLUSIVE_LOCKS_REQUIRED (line 1492) | EXCLUSIVE_LOCKS_REQUIRED(log_mutex) {
  function EXCLUSIVE_LOCKS_REQUIRED (line 1505) | EXCLUSIVE_LOCKS_REQUIRED(log_mutex) {
  function EXCLUSIVE_LOCKS_REQUIRED (line 1511) | EXCLUSIVE_LOCKS_REQUIRED(log_mutex) {
  function EXCLUSIVE_LOCKS_REQUIRED (line 1524) | EXCLUSIVE_LOCKS_REQUIRED(log_mutex) {
  function int64 (line 1570) | int64 LogMessage::num_messages(int severity) {
  function ostream (line 1577) | ostream& operator<<(ostream &os, const PRIVATE_Counter&) {
  function FlushLogFiles (line 1602) | void FlushLogFiles(LogSeverity min_severity) {
  function FlushLogFilesUnsafe (line 1606) | void FlushLogFilesUnsafe(LogSeverity min_severity) {
  function SetLogDestination (line 1610) | void SetLogDestination(LogSeverity severity, const char* base_filename) {
  function SetLogSymlink (line 1614) | void SetLogSymlink(LogSeverity severity, const char* symlink_basename) {
  function string (line 1625) | string LogSink::ToString(LogSeverity severity, const char* file, int line,
  function AddLogSink (line 1654) | void AddLogSink(LogSink *destination) {
  function RemoveLogSink (line 1658) | void RemoveLogSink(LogSink *destination) {
  function SetLogFilenameExtension (line 1662) | void SetLogFilenameExtension(const char* ext) {
  function SetStderrLogging (line 1666) | void SetStderrLogging(LogSeverity min_severity) {
  function SetEmailLogging (line 1670) | void SetEmailLogging(LogSeverity min_severity, const char* addresses) {
  function LogToStderr (line 1674) | void LogToStderr() {
  type base (line 1678) | namespace base {
    type internal (line 1679) | namespace internal {
      function GetExitOnDFatal (line 1681) | bool GetExitOnDFatal() {
      function SetExitOnDFatal (line 1696) | void SetExitOnDFatal(bool value) {
    function ostream (line 2038) | ostream* CheckOpMessageBuilder::ForVar2() {
    function string (line 2043) | string* CheckOpMessageBuilder::NewString() {
  function SendEmailInternal (line 1707) | static bool SendEmailInternal(const char*dest, const char *subject,
  function SendEmail (line 1747) | bool SendEmail(const char*dest, const char *subject, const char*body){
  function GetTempDirectories (line 1751) | static void GetTempDirectories(vector<string>* list) {
  function TestOnly_ClearLoggingDirectoriesList (line 1825) | void TestOnly_ClearLoggingDirectoriesList() {
  function GetExistingTempDirectories (line 1832) | void GetExistingTempDirectories(vector<string>* list) {
  function TruncateLogFile (line 1846) | void TruncateLogFile(const char *path, int64 limit, int64 keep) {
  function TruncateStdoutStderr (line 1924) | void TruncateStdoutStderr() {
  function posix_strerror_r (line 1956) | int posix_strerror_r(int err, char *buf, size_t len) {
  function string (line 2006) | string StrError(int err) {
  type base (line 2027) | namespace base {
    type internal (line 1679) | namespace internal {
      function GetExitOnDFatal (line 1681) | bool GetExitOnDFatal() {
      function SetExitOnDFatal (line 1696) | void SetExitOnDFatal(bool value) {
    function ostream (line 2038) | ostream* CheckOpMessageBuilder::ForVar2() {
    function string (line 2043) | string* CheckOpMessageBuilder::NewString() {
  function MakeCheckOpValueString (line 2051) | void MakeCheckOpValueString(std::ostream* os, const char& v) {
  function MakeCheckOpValueString (line 2060) | void MakeCheckOpValueString(std::ostream* os, const signed char& v) {
  function MakeCheckOpValueString (line 2069) | void MakeCheckOpValueString(std::ostream* os, const unsigned char& v) {
  function InitGoogleLogging (line 2077) | void InitGoogleLogging(const char* argv0) {
  function ShutdownGoogleLogging (line 2081) | void ShutdownGoogleLogging() {

FILE: native/iosTest/Pods/glog/src/mock-log.h
  function _START_GOOGLE_NAMESPACE_ (line 47) | _START_GOOGLE_NAMESPACE_

FILE: native/iosTest/Pods/glog/src/raw_logging.cc
  function RawLog__SetLastTime (line 77) | void RawLog__SetLastTime(const struct ::tm& t, int usecs) {
  function DoRawLog (line 90) | static bool DoRawLog(char** buf, int* size, const char* format, ...) {
  function VADoRawLog (line 102) | inline static bool VADoRawLog(char** buf, int* size,
  function RawLog__ (line 116) | void RawLog__(LogSeverity severity, const char* file, int line,

FILE: native/iosTest/Pods/glog/src/signalhandler.cc
  class MinimalFormatter (line 86) | class MinimalFormatter {
    method MinimalFormatter (line 88) | MinimalFormatter(char *buffer, int size)
    method num_bytes_written (line 95) | int num_bytes_written() const { return cursor_ - buffer_; }
    method AppendString (line 98) | void AppendString(const char* str) {
    method AppendUint64 (line 109) | void AppendUint64(uint64 number, int radix) {
    method AppendHexWithPadding (line 127) | void AppendHexWithPadding(uint64 number, int width) {
  function WriteToStderr (line 147) | void WriteToStderr(const char* data, int size) {
  function DumpTimeInfo (line 158) | void DumpTimeInfo() {
  function DumpSignalInfo (line 172) | void DumpSignalInfo(int signal_number, siginfo_t *siginfo) {
  function DumpStackFrameInfo (line 217) | void DumpStackFrameInfo(const char* prefix, void* pc) {
  function InvokeDefaultSignalHandler (line 242) | void InvokeDefaultSignalHandler(int signal_number) {
  function FailureSignalHandler (line 259) | void FailureSignalHandler(int signal_number,
  type glog_internal_namespace_ (line 338) | namespace glog_internal_namespace_ {
    function IsFailureSignalHandlerInstalled (line 340) | bool IsFailureSignalHandlerInstalled() {
  function InstallFailureSignalHandler (line 354) | void InstallFailureSignalHandler() {
  function InstallFailureWriter (line 369) | void InstallFailureWriter(void (*writer)(const char* data, int size)) {

FILE: native/iosTest/Pods/glog/src/stacktrace_generic-inl.h
  function _START_GOOGLE_NAMESPACE_ (line 38) | _START_GOOGLE_NAMESPACE_

FILE: native/iosTest/Pods/glog/src/stacktrace_libunwind-inl.h
  function GetStackTrace (line 55) | int GetStackTrace(void** result, int max_depth, int skip_count) {

FILE: native/iosTest/Pods/glog/src/stacktrace_powerpc-inl.h
  function _START_GOOGLE_NAMESPACE_ (line 42) | _START_GOOGLE_NAMESPACE_
  function StacktracePowerPCDummyFunction (line 74) | void StacktracePowerPCDummyFunction() { __asm__ volatile(""); }
  function GetStackTrace (line 77) | int GetStackTrace(void** result, int max_depth, int skip_count) {

FILE: native/iosTest/Pods/glog/src/stacktrace_x86-inl.h
  function _START_GOOGLE_NAMESPACE_ (line 44) | _START_GOOGLE_NAMESPACE_
  function GetStackTrace (line 94) | int GetStackTrace(void** result, int max_depth, int skip_count) {

FILE: native/iosTest/Pods/glog/src/stacktrace_x86_64-inl.h
  function _START_GOOGLE_NAMESPACE_ (line 40) | _START_GOOGLE_NAMESPACE_
  function _Unwind_Reason_Code (line 51) | static _Unwind_Reason_Code nop_backtrace(struct _Unwind_Context *uc, voi...
  function class (line 60) | class StackTraceInit {
  function _Unwind_Reason_Code (line 71) | static _Unwind_Reason_Code GetOneFrame(struct _Unwind_Context *uc, void ...
  function GetStackTrace (line 87) | int GetStackTrace(void** result, int max_depth, int skip_count) {

FILE: native/iosTest/Pods/glog/src/symbolize.cc
  function _START_GOOGLE_NAMESPACE_ (line 64) | _START_GOOGLE_NAMESPACE_
  function InstallSymbolizeCallback (line 79) | void InstallSymbolizeCallback(SymbolizeCallback callback) {
  function InstallSymbolizeOpenObjectFileCallback (line 85) | void InstallSymbolizeOpenObjectFileCallback(
  function ATTRIBUTE_NOINLINE (line 94) | static ATTRIBUTE_NOINLINE void DemangleInplace(char *out, int out_size) {
  function _START_GOOGLE_NAMESPACE_ (line 135) | _START_GOOGLE_NAMESPACE_
  function ReadFromOffset (line 163) | static ssize_t ReadFromOffset(const int fd, void *buf,
  function ReadFromOffsetExact (line 176) | static bool ReadFromOffsetExact(const int fd, void *buf,
  function FileGetElfType (line 183) | static int FileGetElfType(const int fd) {
  function ATTRIBUTE_NOINLINE (line 199) | static ATTRIBUTE_NOINLINE bool
  function GetSectionHeaderByName (line 229) | bool GetSectionHeaderByName(int fd, const char *name, size_t name_len,
  function ATTRIBUTE_NOINLINE (line 277) | static ATTRIBUTE_NOINLINE bool
  function GetSymbolFromObjectFile (line 328) | static bool GetSymbolFromObjectFile(const int fd, uint64_t pc,
  type FileDescriptor (line 397) | struct FileDescriptor {
    method FileDescriptor (line 399) | explicit FileDescriptor(int fd) : fd_(fd) {}
    method get (line 405) | int get() { return fd_; }
  class LineReader (line 417) | class LineReader {
    method LineReader (line 419) | explicit LineReader(int fd, char *buf, int buf_len) : fd_(fd),
    method ReadLine (line 428) | bool ReadLine(const char **bol, const char **eol) {
    method BufferIsEmpty (line 484) | bool BufferIsEmpty() {
    method HasCompleteLine (line 488) | bool HasCompleteLine() {
  function ATTRIBUTE_NOINLINE (line 527) | static ATTRIBUTE_NOINLINE int
  function SafeAppendString (line 720) | void SafeAppendString(const char* source, char* dest, int dest_size) {
  function SafeAppendHexNumber (line 733) | void SafeAppendHexNumber(uint64_t value, char* dest, int dest_size) {
  function ATTRIBUTE_NOINLINE (line 747) | static ATTRIBUTE_NOINLINE bool SymbolizeAndDemangle(void *pc, char *out,
  function _START_GOOGLE_NAMESPACE_ (line 822) | _START_GOOGLE_NAMESPACE_
  function _START_GOOGLE_NAMESPACE_ (line 844) | _START_GOOGLE_NAMESPACE_
  function _START_GOOGLE_NAMESPACE_ (line 859) | _START_GOOGLE_NAMESPACE_

FILE: native/iosTest/Pods/glog/src/utilities.cc
  function DebugWriteToStderr (line 80) | static void DebugWriteToStderr(const char* data, void *) {
  function DebugWriteToString (line 87) | void DebugWriteToString(const char* data, void *arg) {
  function DumpPCAndSymbol (line 93) | static void DumpPCAndSymbol(DebugWriter *writerfn, void *arg, void *pc,
  function DumpPC (line 110) | static void DumpPC(DebugWriter *writerfn, void *arg, void *pc,
  function DumpStackTrace (line 119) | static void DumpStackTrace(int skip_count, DebugWriter *writerfn, void *...
  function DumpStackTraceAndExit (line 136) | static void DumpStackTraceAndExit() {
  function _START_GOOGLE_NAMESPACE_ (line 159) | _START_GOOGLE_NAMESPACE_

FILE: native/iosTest/Pods/glog/src/utilities.h
  type WallTime (line 158) | typedef double WallTime;
  function T (line 177) | T sync_val_compare_and_swap(T* ptr, T oldval, T newval) {

FILE: native/iosTest/Pods/glog/src/vlog_is_on.cc
  function _START_GOOGLE_NAMESPACE_ (line 61) | _START_GOOGLE_NAMESPACE_
  type VModuleInfo (line 111) | struct VModuleInfo {
  function VLOG2Initializer (line 128) | static void VLOG2Initializer() {
  function SetVLOGLevel (line 161) | int SetVLOGLevel(const char* module_pattern, int log_level) {
  function InitVLOG3__ (line 197) | bool InitVLOG3__(int32** site_flag, int32* site_default,

FILE: native/shared/Database-batch.cpp
  type watermelondb (line 3) | namespace watermelondb {

FILE: native/shared/Database-jsi.cpp
  type watermelondb (line 3) | namespace watermelondb {

FILE: native/shared/Database-query.cpp
  type watermelondb (line 4) | namespace watermelondb {

FILE: native/shared/Database-sqlite.cpp
  type watermelondb (line 6) | namespace watermelondb {
    function sqlite3_stmt (line 11) | sqlite3_stmt* Database::prepareQuery(std::string sql) {
    function SqliteStatement (line 112) | SqliteStatement Database::executeQuery(std::string sql, jsi::Array &ar...

FILE: native/shared/Database-turboSync.cpp
  type watermelondb (line 3) | namespace watermelondb {
    type ColumnType (line 8) | enum ColumnType { string, number, boolean }
    type ColumnSchema (line 9) | struct ColumnSchema {
    function ColumnType (line 16) | ColumnType columnTypeFromStr(std::string &type) {
    function decodeTableSchema (line 30) | std::pair<TableSchemaArray, TableSchema> decodeTableSchema(jsi::Runtim...
    function insertSqlFor (line 52) | std::string insertSqlFor(jsi::Runtime &rt, std::string tableName, Tabl...

FILE: native/shared/Database.cpp
  type watermelondb (line 3) | namespace watermelondb {

FILE: native/shared/Database.h
  function namespace (line 24) | namespace watermelondb {

FILE: native/shared/DatabaseBridge.cpp
  type watermelondb (line 5) | namespace watermelondb {

FILE: native/shared/DatabasePlatform.h
  function namespace (line 7) | namespace watermelondb {

FILE: native/shared/JSIHelpers.h
  function namespace (line 3) | namespace watermelondb {

FILE: native/shared/Sqlite.cpp
  type watermelondb (line 5) | namespace watermelondb {
    function resolveDatabasePath (line 10) | std::string resolveDatabasePath(std::string path) {

FILE: native/shared/Sqlite.h
  function namespace (line 6) | namespace watermelondb {

FILE: native/windows/WatermelonDB/DatabasePlatformWindows.cpp
  type watermelondb (line 11) | namespace watermelondb {
    type platform (line 12) | namespace platform {
      function consoleLog (line 14) | void consoleLog(std::string message) {
      function consoleError (line 19) | void consoleError(std::string message) {
      function initializeSqlite (line 26) | void initializeSqlite() {
      function resolveDatabasePath (line 45) | std::string resolveDatabasePath(std::string path) {
      function deleteDatabaseFile (line 51) | void deleteDatabaseFile(std::string path, bool warnIfDoesNotExist) {
      function onMemoryAlert (line 55) | void onMemoryAlert(std::function<void(void)> callback) {
      function getSyncJson (line 59) | std::string_view getSyncJson(int id) {
      function deleteSyncJson (line 63) | void deleteSyncJson(int id) {
      function onDestroy (line 67) | void onDestroy(std::function<void(void)> callback) {

FILE: native/windows/WatermelonDB/ReactPackageProvider.cpp
  type winrt::WatermelonDB::implementation (line 13) | namespace winrt::WatermelonDB::implementation

FILE: native/windows/WatermelonDB/ReactPackageProvider.h
  function namespace (line 6) | namespace winrt::WatermelonDB::implementation
  function namespace (line 16) | namespace winrt::WatermelonDB::factory_implementation

FILE: native/windows/WatermelonDB/WMDatabaseBridge.h
  function namespace (line 15) | namespace winrt::WatermelonDB

FILE: native/windowsE2E/custom-transformer.js
  method process (line 14) | process(src /*: string */, file /*: string */) /*: {code: string, ...} */ {

FILE: native/windowsTest/WatermelonTester/App.cpp
  type winrt::WatermelonTester::implementation (line 14) | namespace winrt::WatermelonTester::implementation

FILE: native/windowsTest/WatermelonTester/App.h
  function namespace (line 9) | namespace winrt::WatermelonTester::implementation

FILE: native/windowsTest/WatermelonTester/AutolinkedNativeModules.g.cpp
  type winrt::Microsoft::ReactNative (line 6) | namespace winrt::Microsoft::ReactNative
    function RegisterAutolinkedNativeModulePackages (line 9) | void RegisterAutolinkedNativeModulePackages(winrt::Windows::Foundation...

FILE: native/windowsTest/WatermelonTester/AutolinkedNativeModules.g.h
  function namespace (line 5) | namespace winrt::Microsoft::ReactNative

FILE: native/windowsTest/WatermelonTester/MainPage.cpp
  type winrt::WatermelonTester::implementation (line 12) | namespace winrt::WatermelonTester::implementation

FILE: native/windowsTest/WatermelonTester/MainPage.h
  function namespace (line 5) | namespace winrt::WatermelonTester::implementation
  function namespace (line 13) | namespace winrt::WatermelonTester::factory_implementation

FILE: native/windowsTest/WatermelonTester/ReactPackageProvider.cpp
  type winrt::WatermelonTester::implementation (line 7) | namespace winrt::WatermelonTester::implementation

FILE: native/windowsTest/WatermelonTester/ReactPackageProvider.h
  function namespace (line 5) | namespace winrt::WatermelonTester::implementation

FILE: scripts/make.mjs
  constant SRC_MODULES (line 36) | const SRC_MODULES = 'src'
  constant CJS_MODULES (line 37) | const CJS_MODULES = 'cjs'
  constant SOURCE_PATH (line 39) | const SOURCE_PATH = resolvePath('src')
  constant DIST_PATH (line 40) | const DIST_PATH = resolvePath('dist')
  constant DEV_PATH (line 41) | const DEV_PATH = process.env.DEV_PATH || resolvePath('dev')
  constant DIR_PATH (line 43) | const DIR_PATH = isDevelopment ? DEV_PATH : DIST_PATH
  constant DO_NOT_BUILD_PATHS (line 45) | const DO_NOT_BUILD_PATHS = [

FILE: scripts/replace-docs-path.mjs
  function main (line 9) | async function main() {

FILE: src/Collection/RecordCache.d.ts
  type Instantiator (line 8) | type Instantiator<T> = (_: RawRecord) => T
  class RecordCache (line 10) | class RecordCache<Record extends Model> {

FILE: src/Collection/index.d.ts
  type CollectionChangeType (line 17) | type CollectionChangeType = 'created' | 'updated' | 'destroyed'
  type CollectionChange (line 18) | type CollectionChange<Record extends Model> = { record: Record; type: Co...
  type CollectionChangeSet (line 19) | type CollectionChangeSet<T extends Model> = CollectionChange<T>[]
  class Collection (line 21) | class Collection<Record extends Model> {

FILE: src/Collection/index.js
  method if (line 264) | if (type === 'updated') {

FILE: src/Database/CollectionMap/index.d.ts
  class CollectionMap (line 6) | class CollectionMap {

FILE: src/Database/CollectionMap/index.js
  class CollectionMap (line 10) | class CollectionMap {

FILE: src/Database/CollectionMap/test.js
  class ModelWithMissingTable (line 41) | class ModelWithMissingTable extends Model {}
  class ModelWithUnrecognizedTableName (line 46) | class ModelWithUnrecognizedTableName extends Model {

FILE: src/Database/LocalStorage/index.d.ts
  type LocalStorageKey (line 3) | type LocalStorageKey<ValueType> = string
  class LocalStorage (line 7) | class LocalStorage {

FILE: src/Database/LocalStorage/index.js
  method constructor (line 14) | constructor(database: Database): void {

FILE: src/Database/LocalStorage/test.js
  method getLocal (line 9) | getLocal(key) {
  method setLocal (line 12) | setLocal(key, value) {
  method removeLocal (line 15) | removeLocal(key) {

FILE: src/Database/WorkQueue.d.ts
  type ReaderInterface (line 5) | interface ReaderInterface {
  type WriterInterface (line 9) | interface WriterInterface extends ReaderInterface {
  type WorkQueueItem (line 14) | type WorkQueueItem<T> = {
  class WorkQueue (line 22) | class WorkQueue {

FILE: src/Database/index.d.ts
  type DatabaseProps (line 18) | type DatabaseProps = $Exact<{
  class Database (line 25) | class Database {

FILE: src/Database/index.js
  function setExperimentalAllowsFatalError (line 30) | function setExperimentalAllowsFatalError(): void {
  class Database (line 34) | class Database {
    method constructor (line 55) | constructor(options: DatabaseProps): void {
    method if (line 80) | if (!this._localStorage) {

FILE: src/Model/helpers.d.ts
  type TimestampsObj (line 4) | type TimestampsObj = $Exact<{ created_at?: number; updated_at?: number }>

FILE: src/Model/index.d.ts
  type RecordId (line 12) | type RecordId = string
  type SyncStatus (line 15) | type SyncStatus = 'synced' | 'created' | 'updated' | 'deleted' | 'dispos...
  type BelongsToAssociation (line 17) | type BelongsToAssociation = $RE<{ type: 'belongs_to'; key: ColumnName }>
  type HasManyAssociation (line 18) | type HasManyAssociation = $RE<{ type: 'has_many'; foreignKey: ColumnName }>
  type AssociationInfo (line 19) | type AssociationInfo = BelongsToAssociation | HasManyAssociation
  type Associations (line 20) | type Associations = { [tableName: TableName<any>]: AssociationInfo }
  class Model (line 24) | class Model {

FILE: src/Model/index.js
  function associations (line 41) | function associations(
  method if (line 73) | if (!this.__changes) {

FILE: src/Model/test.js
  class MockModel (line 48) | class MockModel extends Model {
  class MockModelCreated (line 58) | class MockModelCreated extends Model {
  class MockModelUpdated (line 66) | class MockModelUpdated extends Model {
  class MockModelCreatedUpdated (line 74) | class MockModelCreatedUpdated extends Model {

FILE: src/Query/index.d.ts
  type QueryAssociation (line 12) | type QueryAssociation = $Exact<{
  type SerializedQuery (line 18) | type SerializedQuery = $Exact<{
  type QueryCountProxy (line 24) | interface QueryCountProxy {
  class Query (line 31) | class Query<Record extends Model> {

FILE: src/Query/test.js
  class MockTask (line 10) | class MockTask extends Model {
  class MockProject (line 20) | class MockProject extends Model {

FILE: src/QueryDescription/helpers.js
  function queryWithoutDeleted (line 110) | function queryWithoutDeleted(query: QueryDescription): QueryDescription {

FILE: src/QueryDescription/operators.d.ts
  type _OnFunctionColumnValue (line 125) | type _OnFunctionColumnValue = (
  type _OnFunctionColumnComparison (line 130) | type _OnFunctionColumnComparison = (
  type _OnFunctionWhere (line 135) | type _OnFunctionWhere = (tableName: TableName<any>, where: Where) => On
  type _OnFunctionWhereList (line 136) | type _OnFunctionWhereList = (tableName: TableName<any>, where: Where[]) ...
  type OnFunction (line 138) | type OnFunction = _OnFunctionColumnValue &

FILE: src/QueryDescription/operators.js
  function oneOf (line 107) | function oneOf(values: NonNullValues): Comparison {
  function notIn (line 118) | function notIn(values: NonNullValues): Comparison {
  function between (line 126) | function between(left: number, right: number): Comparison {
  function like (line 135) | function like(value: string): Comparison {
  function notLike (line 140) | function notLike(value: string): Comparison {
  function sanitizeLikeString (line 147) | function sanitizeLikeString(value: string): string {
  function includes (line 152) | function includes(value: string): Comparison {
  function column (line 157) | function column(name: ColumnName): ColumnDescription {
  method if (line 163) | if (arg === null || typeof arg !== 'object') {

FILE: src/QueryDescription/type.d.ts
  type NonNullValue (line 5) | type NonNullValue = number | string | boolean
  type NonNullValues (line 6) | type NonNullValues = number[] | string[] | boolean[]
  type Value (line 7) | type Value = NonNullValue | null
  type CompoundValue (line 8) | type CompoundValue = Value | Value[]
  type Operator (line 10) | type Operator =
  type ColumnDescription (line 25) | type ColumnDescription = $RE<{ column: ColumnName; type?: symbol }>
  type ComparisonRight (line 26) | type ComparisonRight =
  type Comparison (line 30) | type Comparison = $RE<{ operator: Operator; right: ComparisonRight; type...
  type WhereDescription (line 32) | type WhereDescription = $RE<{
  type SqlExpr (line 38) | type SqlExpr = $RE<{ type: 'sql'; expr: string }>
  type LokiExpr (line 39) | type LokiExpr = $RE<{ type: 'loki'; expr: any }>
  type Where (line 42) | type Where = WhereDescription | And | Or | On | SqlExpr | LokiExpr
  type And (line 43) | type And = $RE<{ type: 'and'; conditions: Where[] }>
  type Or (line 44) | type Or = $RE<{ type: 'or'; conditions: Where[] }>
  type On (line 45) | type On = $RE<{
  type SortOrder (line 50) | type SortOrder = 'asc' | 'desc'
  type SortBy (line 53) | type SortBy = $RE<{
  type Take (line 58) | type Take = $RE<{
  type Skip (line 62) | type Skip = $RE<{
  type JoinTables (line 66) | type JoinTables = $RE<{
  type NestedJoinTable (line 70) | type NestedJoinTable = $RE<{
  type LokiTransformFunction (line 75) | type LokiTransformFunction = (rawLokiRecords: any[], loki: any) => any[]
  type LokiTransform (line 76) | type LokiTransform = $RE<{
  type SqlQuery (line 80) | type SqlQuery = $RE<{
  type Clause (line 85) | type Clause =
  type NestedJoinTableDef (line 95) | type NestedJoinTableDef = $RE<{ from: TableName<any>; to: TableName<any> }>
  type QueryDescription (line 96) | type QueryDescription = $RE<{

FILE: src/RawRecord/index.d.ts
  type DirtyRaw (line 7) | type DirtyRaw = { [key: string]: any }
  type _RawRecord (line 10) | type _RawRecord = {
  type RawRecord (line 21) | type RawRecord = _RawRecord
  type NullValue (line 35) | type NullValue = null | '' | 0 | false

FILE: src/RawRecord/index.js
  function isValidNumber (line 30) | function isValidNumber(value: any): boolean {
  function _setRaw (line 35) | function _setRaw(raw: Object, key: string, value: any, columnSchema: Col...
  function isValidStatus (line 65) | function isValidStatus(value: any): boolean {

FILE: src/Relation/index.d.ts
  type ExtractRecordIdNonOptional (line 8) | type ExtractRecordIdNonOptional = <T extends Model = Model>(value: T) =>...
  type ExtractRecordIdOptional (line 9) | type ExtractRecordIdOptional = <T extends Model = Model>(value: T) => Re...
  type ExtractRecordId (line 10) | type ExtractRecordId = ExtractRecordIdNonOptional & ExtractRecordIdOptional
  type Options (line 12) | type Options = $Exact<{
  class Relation (line 18) | class Relation<T extends Model> {

FILE: src/Relation/index.js
  method if (line 57) | if (this._isImmutable) {

FILE: src/Schema/index.d.ts
  type TableName (line 7) | type TableName<T extends Model> = string
  type ColumnName (line 8) | type ColumnName = string
  type ColumnType (line 10) | type ColumnType = 'string' | 'number' | 'boolean'
  type ColumnSchema (line 11) | type ColumnSchema = $RE<{
  type ColumnMap (line 18) | type ColumnMap = { [name: ColumnName]: ColumnSchema }
  type TableSchemaSpec (line 20) | type TableSchemaSpec = $Exact<{
  type TableSchema (line 26) | type TableSchema = $RE<{
  type TableMap (line 34) | type TableMap = { [name: TableName<any>]: TableSchema }
  type SchemaVersion (line 36) | type SchemaVersion = number
  type AppSchemaUnsafeSqlKind (line 38) | type AppSchemaUnsafeSqlKind = 'setup' | 'create_indices' | 'drop_indices'
  type AppSchemaSpec (line 40) | type AppSchemaSpec = $Exact<{
  type AppSchema (line 46) | type AppSchema = $RE<{

FILE: src/Schema/index.js
  function columnName (line 78) | function columnName(name: string): ColumnName {
  function appSchema (line 85) | function appSchema({ version, tables: tableList, unsafeSql }: AppSchemaS...
  function validateColumnSchema (line 112) | function validateColumnSchema(column: ColumnSchema): void {

FILE: src/Schema/migrations/getSyncChanges/index.d.ts
  type MigrationSyncChanges (line 8) | type MigrationSyncChanges = $Exact<{

FILE: src/Schema/migrations/getSyncChanges/index.js
  function getSyncChanges (line 20) | function getSyncChanges(

FILE: src/Schema/migrations/index.d.ts
  type CreateTableMigrationStep (line 4) | type CreateTableMigrationStep = $RE<{
  type AddColumnsMigrationStep (line 9) | type AddColumnsMigrationStep = $RE<{
  type SqlMigrationStep (line 16) | type SqlMigrationStep = $RE<{
  type MigrationStep (line 21) | type MigrationStep = CreateTableMigrationStep | AddColumnsMigrationStep ...
  type Migration (line 23) | type Migration = $RE<{
  type SchemaMigrationsSpec (line 28) | type SchemaMigrationsSpec = $RE<{
  type SchemaMigrations (line 32) | type SchemaMigrations = $RE<{

FILE: src/Schema/migrations/index.js
  function createTable (line 139) | function createTable(tableSchemaSpec: TableSchemaSpec): CreateTableMigra...
  method if (line 153) | if (process.env.NODE_ENV !== 'production') {

FILE: src/__playground__/index.js
  function runPlayground (line 9) | async function runPlayground() {}

FILE: src/__tests__/emptyMock/index.js
  method read (line 3) | read() {}

FILE: src/__tests__/testModels.js
  class MockProject (line 41) | class MockProject extends Model {
  class MockProjectSection (line 53) | class MockProjectSection extends Model {
  class MockTask (line 64) | class MockTask extends Model {
  class MockComment (line 88) | class MockComment extends Model {

FILE: src/__tests__/utils/makeScheduler.js
  class WatermelonTestScheduler (line 4) | class WatermelonTestScheduler extends TestScheduler {
    method cold (line 5) | cold(marbles, values, error) {
    method hot (line 9) | hot(marbles, values, error) {
  function makeScheduler (line 14) | function makeScheduler() {

FILE: src/adapters/__tests__/commonTests.js
  class BadModel (line 32) | class BadModel extends Model {
  function queryable (line 747) | function queryable(promise) {

FILE: src/adapters/__tests__/helpers.js
  class MockTask (line 10) | class MockTask extends Model {
  class MockProject (line 18) | class MockProject extends Model {
  class MockTeam (line 26) | class MockTeam extends Model {
  class MockOrganization (line 34) | class MockOrganization extends Model {
  class MockTagAssignment (line 39) | class MockTagAssignment extends Model {
  class MockSyncTestRecord (line 46) | class MockSyncTestRecord extends Model {

FILE: src/adapters/common.js
  method if (line 16) | if (process.env.NODE_ENV !== 'production') {
  function validateTable (line 42) | function validateTable(tableName: TableName<any>, schema: AppSchema): vo...
  function sanitizeFindResult (line 50) | function sanitizeFindResult(
  function sanitizeQueryResult (line 59) | function sanitizeQueryResult(
  method if (line 69) | if (result.error) {

FILE: src/adapters/compat.d.ts
  class DatabaseAdapterCompat (line 14) | class DatabaseAdapterCompat {

FILE: src/adapters/compat.js
  method constructor (line 20) | constructor(adapter: DatabaseAdapter): void {
  method schema (line 24) | get schema(): AppSchema {

FILE: src/adapters/error.js
  class ErrorAdapter (line 11) | class ErrorAdapter {
    method constructor (line 12) | constructor(): void {
    method underlyingAdapter (line 32) | get underlyingAdapter(): void {
    method schema (line 36) | get schema(): void {
    method migrations (line 40) | get migrations(): void {

FILE: src/adapters/lokijs/common.d.ts
  type WorkerExecutorType (line 6) | type WorkerExecutorType =
  type WorkerExecutorPayload (line 23) | type WorkerExecutorPayload = any[]
  type WorkerResponseData (line 25) | type WorkerResponseData = CachedQueryResult | CachedFindResult | number ...
  type CloneMethod (line 27) | type CloneMethod = 'shallowCloneDeepObjects' | 'immutable' | 'deep'
  type WorkerAction (line 29) | type WorkerAction = $Exact<{
  type WorkerResponse (line 37) | type WorkerResponse = $Exact<{

FILE: src/adapters/lokijs/dispatcher.d.ts
  type WorkerAction (line 9) | type WorkerAction = {
  type WorkerActions (line 13) | type WorkerActions = WorkerAction[]
  class LokiDispatcher (line 15) | class LokiDispatcher {

FILE: src/adapters/lokijs/dispatcher.js
  method constructor (line 40) | constructor(useWebWorker: boolean): void {
  method call (line 57) | call<T>(

FILE: src/adapters/lokijs/index.d.ts
  type LokiAdapterOptions (line 21) | type LokiAdapterOptions = $Exact<{
  class LokiJSAdapter (line 74) | class LokiJSAdapter implements DatabaseAdapter {

FILE: src/adapters/lokijs/type.d.ts
  type Loki (line 1) | type Loki = any
  type LokiCollection (line 2) | type LokiCollection = any
  type LokiResultset (line 3) | type LokiResultset = any
  type LokiMemoryAdapter (line 4) | type LokiMemoryAdapter = any

FILE: src/adapters/lokijs/worker/DatabaseDriver.js
  constant SCHEMA_VERSION_KEY (line 30) | const SCHEMA_VERSION_KEY = '_loki_schema_version'
  function setExperimentalAllowsFatalError (line 34) | function setExperimentalAllowsFatalError(): void {
  method if (line 101) | if (this.isCached(table, id)) {
  method if (line 222) | if (process.env.NODE_ENV !== 'production') {
  method if (line 453) | if (this._isBroken) {
  method if (line 461) | if (!experimentalAllowsFatalError) {

FILE: src/adapters/lokijs/worker/cloneMessage/index.js
  function shallowCloneDeepObjects (line 4) | function shallowCloneDeepObjects(value: any): any {
  function cloneMessage (line 18) | function cloneMessage(data: any): any {

FILE: src/adapters/lokijs/worker/encodeQuery/index.js
  function encodeQuery (line 219) | function encodeQuery(query: SerializedQuery): LokiQuery {

FILE: src/adapters/lokijs/worker/encodeQuery/test.js
  class MockTask (line 8) | class MockTask extends Model {
  class MockProject (line 17) | class MockProject extends Model {

FILE: src/adapters/lokijs/worker/executeQuery.js
  function performJoin (line 13) | function performJoin(join: LokiJoin, loki: Loki): DirtyRaw[] {
  function performQuery (line 22) | function performQuery(query: SerializedQuery, loki: Loki): LokiResultset {
  function executeQuery (line 48) | function executeQuery(query: SerializedQuery, loki: Loki): DirtyRaw[] {
  function executeCount (line 59) | function executeCount(query: SerializedQuery, loki: Loki): number {

FILE: src/adapters/lokijs/worker/lokiExtensions.js
  function getLokiAdapter (line 46) | async function getLokiAdapter(options: LokiAdapterOptions): mixed {
  function newLoki (line 74) | async function newLoki(options: LokiAdapterOptions): Loki {
  function deleteDatabase (line 96) | async function deleteDatabase(loki: Loki): Promise<void> {
  function lokiFatalError (line 118) | function lokiFatalError(loki: Loki): void {

FILE: src/adapters/lokijs/worker/performJoins/test.js
  class MockTask (line 9) | class MockTask extends Model {
  class MockProject (line 18) | class MockProject extends Model {

FILE: src/adapters/lokijs/worker/synchronousWorker.js
  class SynchronousWorker (line 7) | class SynchronousWorker {
    method constructor (line 14) | constructor(): void {
    method postMessage (line 26) | postMessage(data: any): void {

FILE: src/adapters/sqlite/encodeBatch/index.js
  function encodeInsertSql (line 10) | function encodeInsertSql(schema: TableSchema): SQL {
  function encodeInsertArgs (line 21) | function encodeInsertArgs(tableSchema: TableSchema, raw: RawRecord): SQL...
  function encodeUpdateSql (line 36) | function encodeUpdateSql(schema: TableSchema): SQL {
  function encodeUpdateArgs (line 42) | function encodeUpdateArgs(tableSchema: TableSchema, raw: RawRecord): SQL...
  constant REMOVE_FROM_CACHE (line 63) | const REMOVE_FROM_CACHE = -1
  constant IGNORE_CACHE (line 64) | const IGNORE_CACHE = 0
  constant ADD_TO_CACHE (line 65) | const ADD_TO_CACHE = 1
  function groupOperations (line 67) | function groupOperations(operations: BatchOperation[]): GroupedBatchOper...
  function withRecreatedIndices (line 93) | function withRecreatedIndices(
  function encodeBatch (line 108) | function encodeBatch(

FILE: src/adapters/sqlite/encodeQuery/test.js
  class MockTask (line 9) | class MockTask extends Model {
  class MockProject (line 18) | class MockProject extends Model {

FILE: src/adapters/sqlite/encodeValue/index.js
  function encodeValue (line 12) | function encodeValue(value: Value): string {

FILE: src/adapters/sqlite/index.d.ts
  class SQLiteAdapter (line 29) | class SQLiteAdapter implements DatabaseAdapter {

FILE: src/adapters/sqlite/index.js
  constant IGNORE_CACHE (line 46) | const IGNORE_CACHE = 0
  method if (line 124) | if (process.env.NODE_ENV === 'test') {
  method validateTable (line 223) | validateTable(query.table, this.schema)
  method if (line 299) | if (this._dispatcherType !== 'jsi') {
  method if (line 321) | if (this._dispatcherType !== 'jsi') {
  method if (line 343) | if (process.env.NODE_ENV !== 'production') {

FILE: src/adapters/sqlite/makeDispatcher/decodeQueryResult/index.js
  function decodeQueryResult (line 9) | function decodeQueryResult(compressedRecords: any[]): any[] {

FILE: src/adapters/sqlite/makeDispatcher/index.js
  class SqliteNodeDispatcher (line 15) | class SqliteNodeDispatcher implements SqliteDispatcher {
    method constructor (line 18) | constructor(tag: ConnectionTag): void {

FILE: src/adapters/sqlite/makeDispatcher/index.native.js
  method constructor (line 22) | constructor(
  method Error (line 93) | Error(

FILE: src/adapters/sqlite/sqlite-node/DatabaseBridge.js
  class DatabaseBridge (line 11) | class DatabaseBridge {
  method if (line 211) | if (this.connections[tag]) {
  method if (line 217) | if (reject) {

FILE: src/adapters/sqlite/sqlite-node/DatabaseDriver.js
  function fixArgs (line 5) | function fixArgs(args: any[]): any[] {
  class MigrationNeededError (line 16) | class MigrationNeededError extends Error {
    method constructor (line 21) | constructor(databaseVersion: number): void {
  class SchemaNeededError (line 29) | class SchemaNeededError extends Error {
    method constructor (line 32) | constructor(): void {
  function getPath (line 39) | function getPath(dbName: string): string {
  class DatabaseDriver (line 58) | class DatabaseDriver {
    method initialize (line 65) | initialize(dbName: string, schemaVersion: number): void {
    method setUpWithSchema (line 70) | setUpWithSchema(dbName: string, schema: string, schemaVersion: number)...
    method setUpWithMigrations (line 76) | setUpWithMigrations(dbName: string, migrations: Migrations): void {
    method init (line 82) | init(dbName: string): void {
    method find (line 94) | find(table: string, id: string): any | null | string {
    method cachedQuery (line 110) | cachedQuery(table: string, query: string, args: any[]): any[] {
    method queryIds (line 122) | queryIds(query: string, args: any[]): string[] {
    method unsafeQueryRaw (line 126) | unsafeQueryRaw(query: string, args: any[]): any[] {
    method count (line 130) | count(query: string, args: any[]): number {
    method batch (line 134) | batch(operations: any[]): void {
    method getLocal (line 163) | getLocal(key: string): any | null {
    method hasCachedTable (line 177) | hasCachedTable(table: string): any {
    method isCached (line 182) | isCached(table: string, id: string): boolean {
    method markAsCached (line 189) | markAsCached(table: string, id: string): void {
    method removeFromCache (line 196) | removeFromCache(table: string, id: string): void {
    method isCompatible (line 204) | isCompatible(schemaVersion: number): void {
    method unsafeResetDatabase (line 215) | unsafeResetDatabase(schema: { sql: string, version: number }): void {
    method migrate (line 225) | migrate(migrations: Migrations): void {

FILE: src/adapters/sqlite/test.js
  function removeIfExists (line 8) | function removeIfExists(file, dbName) {

FILE: src/adapters/sqlite/type.d.ts
  type SQL (line 6) | type SQL = string
  type SQLiteArg (line 7) | type SQLiteArg = string | boolean | number | null
  type SQLiteQuery (line 8) | type SQLiteQuery = [SQL, SQLiteArg[]]
  type MigrationEvents (line 10) | type MigrationEvents = {
  type SQLiteAdapterOptions (line 16) | type SQLiteAdapterOptions = $Exact<{
  type DispatcherType (line 33) | type DispatcherType = 'asynchronous' | 'jsi'
  type SqliteDispatcherMethod (line 35) | type SqliteDispatcherMethod =
  type SqliteDispatcher (line 51) | interface SqliteDispatcher {

FILE: src/adapters/type.d.ts
  type CachedFindResult (line 12) | type CachedFindResult = RecordId | RawRecord | undefined
  type CachedQueryResult (line 13) | type CachedQueryResult = Array<RecordId | RawRecord>
  type BatchOperationType (line 14) | type BatchOperationType = 'create' | 'update' | 'markAsDeleted' | 'destr...
  type BatchOperation (line 15) | type BatchOperation =
  type UnsafeExecuteOperations (line 21) | type UnsafeExecuteOperations =
  type DatabaseAdapter (line 26) | interface DatabaseAdapter {

FILE: src/decorators/action/index.js
  function writer (line 7) | function writer(target: Object, key: string, descriptor: Descriptor): De...

FILE: src/decorators/action/test.js
  class MockTaskExtended (line 4) | class MockTaskExtended extends MockTask {
    method returnArgs (line 5) | @reader
    method nested (line 10) | @writer
  class TestClass (line 41) | class TestClass {
    method test (line 44) | @reader async test() {

FILE: src/decorators/children/test.js
  class MockParent (line 10) | class MockParent extends Model {
  class MockChild (line 20) | class MockChild extends Model {
  class ParentProxy (line 61) | class ParentProxy {

FILE: src/decorators/common.js
  function ensureDecoratorUsedProperly (line 8) | function ensureDecoratorUsedProperly(

FILE: src/decorators/date/test.js
  class MockModel (line 11) | class MockModel extends Model {

FILE: src/decorators/field/test.js
  class ModelProxy (line 25) | class ModelProxy {
  method someGetter (line 62) | @field('getter')
  method method (line 71) | @field('method')

FILE: src/decorators/json/index.d.ts
  type Sanitizer (line 4) | type Sanitizer = (source: any, model?: Model) => any
  type Options (line 6) | type Options = {

FILE: src/decorators/json/test.js
  class MockModel (line 28) | class MockModel extends Model {
  class MockModel2 (line 35) | class MockModel2 extends Model {
  class MockModel3 (line 42) | class MockModel3 extends Model {

FILE: src/decorators/lazy/index.js
  function lazy (line 15) | function lazy(target: Object, key: string, descriptor: Descriptor): Desc...

FILE: src/decorators/lazy/test.js
  class X (line 11) | class X {

FILE: src/decorators/nochange/test.js
  class MockModel (line 10) | class MockModel extends Model {

FILE: src/decorators/readonly/test.js
  class Mock (line 11) | class Mock extends Model {
  class Mock (line 23) | class Mock extends Model {

FILE: src/decorators/relation/index.js
  method ensureDecoratorUsedProperly (line 36) | ensureDecoratorUsedProperly(relationIdColumn, target, key, descriptor)

FILE: src/decorators/relation/test.js
  class PrimaryProxy (line 18) | class PrimaryProxy {

FILE: src/decorators/text/test.js
  class MockModel (line 14) | class MockModel extends Model {

FILE: src/diagnostics/diagnoseSyncConsistency/impl.js
  class InconsistentSyncError (line 36) | class InconsistentSyncError extends Error {}
  function diagnoseSyncConsistencyImpl (line 38) | async function diagnoseSyncConsistencyImpl(
  function diagnoseSyncConsistency (line 264) | async function diagnoseSyncConsistency(

FILE: src/observation/encodeMatcher/canEncode.js
  function canEncodeMatcher (line 7) | function canEncodeMatcher(query: QueryDescription): boolean {

FILE: src/observation/subscribeToCount/index.js
  function experimentalDisableObserveCountThrottling (line 13) | function experimentalDisableObserveCountThrottling(): void {
  method if (line 37) | if (isThrottled && !isThrottlingDisabled) {

FILE: src/observation/subscribeToQueryReloading/index.js
  function reloadingObserverFetch (line 25) | function reloadingObserverFetch(): void {

FILE: src/observation/subscribeToQueryWithColumns/test.js
  function fullObservationTest (line 23) | async function fullObservationTest(mockDb, query, asyncSource) {

FILE: src/observation/test.js
  function updatesListBeforeModelTest (line 24) | async function updatesListBeforeModelTest(mockDb, subscribe) {

FILE: src/react/DatabaseContext.d.ts
  type DatabaseContext (line 4) | type DatabaseContext = Context<Database>
  type DatabaseConsumer (line 6) | type DatabaseConsumer = ReactConsumer<any>
  type Provider (line 7) | type Provider = ReactProvider<any>

FILE: src/react/DatabaseProvider.d.ts
  type Props (line 4) | type Props = {

FILE: src/react/DatabaseProvider.js
  function DatabaseProvider (line 15) | function DatabaseProvider({ children, database }: Props): React$Element<...

FILE: src/react/DatabaseProvider.test.js
  function MockComponent (line 10) | function MockComponent() {

FILE: src/react/useDatabase.js
  function useDatabase (line 8) | function useDatabase(): Database {

FILE: src/react/withDatabase.d.ts
  type WithDatabaseProps (line 5) | type WithDatabaseProps<T> = T & {
  type GetProps (line 9) | type GetProps<C> = C extends React.ComponentType<infer P & { database?: ...

FILE: src/react/withHooks.js
  method return (line 11) | return (BaseComponent) => {

FILE: src/react/withObservables/index.d.ts
  type ObservableConvertible (line 5) | interface ObservableConvertible<T> {
  type ExtractObservableType (line 9) | type ExtractObservableType<T> =
  type ExtractedObservables (line 12) | type ExtractedObservables<T> = {
  type Matching (line 28) | type Matching<InjectedProps, DecorationTargetProps> = {
  type GetProps (line 37) | type GetProps<C> = C extends ComponentType<infer P> ? P : never
  type Shared (line 49) | type Shared<InjectedProps, DecorationTargetProps> = {
  type ConnectedComponent (line 58) | type ConnectedComponent<C extends ComponentType<any>, P> = NamedExoticCo...
  type InferableComponentEnhancer (line 68) | type InferableComponentEnhancer<TInjectedProps, TNeedsProps> = <
  type Omit (line 77) | type Omit<T, K extends keyof T> = Pick<T, Exclude<keyof T, K>>
  type ObservableifyProps (line 78) | type ObservableifyProps<T, O extends keyof T, C extends keyof T = never>...

FILE: src/react/withObservables/index.js
  method if (line 72) | if (left[i] !== right[i]) {
  method super (line 364) | super(props, BaseComponent, getObservables, triggerProps)

FILE: src/react/withObservables/withObservables.test.js
  class A (line 6) | class A extends React.PureComponent {
    method render (line 8) | render() {

FILE: src/sync/SyncLogger/index.d.ts
  class SyncLogger (line 3) | class SyncLogger {

FILE: src/sync/SyncLogger/index.js
  method formattedLogs (line 42) | get formattedLogs(): string {

FILE: src/sync/debugPrintChanges/index.js
  function debugPrintChanges (line 19) | function debugPrintChanges(changes: null, isPush: boolean): void {

FILE: src/sync/helpers.js
  function addToRawSet (line 6) | function addToRawSet(rawSet: string, value: string): string {
  function setRawColumnChange (line 14) | function setRawColumnChange(rawRecord: RawRecord, columnName: ColumnName...

FILE: src/sync/impl/helpers.js
  function resolveConflict (line 14) | function resolveConflict(local: RawRecord, remote: DirtyRaw): DirtyRaw {
  function replaceRaw (line 40) | function replaceRaw(record: Model, dirtyRaw: DirtyRaw): void {
  method if (line 84) | if (!requiresUpdate(collection, localRaw, remoteDirtyRaw)) {

FILE: src/sync/impl/index.d.ts
  type MigrationInfo (line 23) | type MigrationInfo = $Exact<{

FILE: src/sync/impl/markAsSynced.js
  function markLocalChangesAsSynced (line 50) | function markLocalChangesAsSynced(

FILE: src/sync/impl/synchronize.js
  function synchronize (line 17) | async function synchronize({

FILE: src/sync/index.d.ts
  type Timestamp (line 9) | type Timestamp = number
  type SyncTableChangeSet (line 11) | type SyncTableChangeSet = $Exact<{
  type SyncDatabaseChangeSet (line 16) | type SyncDatabaseChangeSet = { [tableName: TableName<any>]: SyncTableCha...
  type SyncLocalChanges (line 18) | type SyncLocalChanges = $Exact<{ changes: SyncDatabaseChangeSet; affecte...
  type SyncPullArgs (line 20) | type SyncPullArgs = $Exact<{
  type SyncPullResult (line 25) | type SyncPullResult =
  type SyncRejectedIds (line 30) | type SyncRejectedIds = { [tableName: TableName<any>]: RecordId[] }
  type SyncPushArgs (line 32) | type SyncPushArgs = $Exact<{ changes: SyncDatabaseChangeSet; lastPulledA...
  type SyncPushResult (line 34) | type SyncPushResult = $Exact<{ experimentalRejectedIds?: SyncRejectedIds }>
  type SyncConflict (line 36) | type SyncConflict = $Exact<{ local: DirtyRaw; remote: DirtyRaw; resolved...
  type SyncLog (line 37) | type SyncLog = {
  type SyncConflictResolver (line 52) | type SyncConflictResolver = (
  type SyncArgs (line 59) | type SyncArgs = $Exact<{

FILE: src/types.d.ts
  type $Shape (line 1) | type $Shape<T> = T
  type $NonMaybeType (line 3) | type $NonMaybeType<T> = T
  type $ObjMap (line 5) | type $ObjMap<O, T> = { [K in keyof O]: T }
  type $Exact (line 7) | type $Exact<Type> = Type
  type $RE (line 9) | type $RE<Type> = Readonly<$Exact<Type>>
  type $Keys (line 11) | type $Keys<Type> = { k: keyof Type }
  type Array (line 13) | type Array<Type> = Type[]
  type $Call (line 16) | type $Call<F, T> = any
  type $ReadOnlyArray (line 18) | type $ReadOnlyArray<T> = T[]
  type Class (line 20) | type Class<T> = new (...args: any[]) => T

FILE: src/utils/common/connectionTag/index.d.ts
  type ConnectionTag (line 3) | type ConnectionTag = number

FILE: src/utils/common/connectionTag/index.js
  function connectionTag (line 7) | function connectionTag(): ConnectionTag {

FILE: src/utils/common/deprecated/index.js
  function deprecated (line 7) | function deprecated(name: string, deprecationInfo: string): void {

FILE: src/utils/common/diagnosticError/index.d.ts
  type DiagnosticErrorFunction (line 1) | type DiagnosticErrorFunction = (_: string) => Error

FILE: src/utils/common/diagnosticError/index.js
  function useCustomDiagnosticErrorFunction (line 8) | function useCustomDiagnosticErrorFunction(
  function diagnosticError (line 14) | function diagnosticError(errorMessage: string): Error {

FILE: src/utils/common/invariant/index.js
  method if (line 8) | if (!condition) {

FILE: src/utils/common/logError/index.js
  function logError (line 10) | function logError(errorMessage: string): void {

FILE: src/utils/common/logger/index.d.ts
  class Logger (line 1) | class Logger {

FILE: src/utils/common/logger/index.js
  class Logger (line 9) | class Logger {
    method debug (line 12) | debug(...messages: any[]): void {
    method log (line 16) | log(...messages: any[]): void {
    method warn (line 20) | warn(...messages: any[]): void {
    method error (line 24) | error(...messages: any[]): void {
    method silence (line 28) | silence(): void {

FILE: src/utils/common/makeDecorator/index.d.ts
  type Descriptor (line 1) | type Descriptor = Object
  type RawDecorator (line 2) | type RawDecorator = (target: Object, key: string, descriptor: Descriptor...
  type Decorator (line 3) | type Decorator = (...any: any[]) => Descriptor | RawDecorator

FILE: src/utils/common/makeDecorator/index.js
  method if (line 12) | if (args.length < 3) {

FILE: src/utils/common/memory/index.d.ts
  type Callback (line 1) | type Callback = () => void

FILE: src/utils/common/memory/index.js
  function onLowMemory (line 6) | function onLowMemory(callback: Callback): void {
  function _triggerOnLowMemory (line 11) | function _triggerOnLowMemory(): void {

FILE: src/utils/common/randomId/fallback.js
  function fallbackRandomId (line 5) | function fallbackRandomId(): string {

FILE: src/utils/common/randomId/randomId.js
  function cryptoRandomId (line 10) | function cryptoRandomId(): string {

FILE: src/utils/common/randomId/randomId.native.js
  function nativeRandomId_v1 (line 15) | function nativeRandomId_v1(): string {

FILE: src/utils/common/randomId/randomId_v2.native.js
  function nativeRandomId_v2 (line 9) | function nativeRandomId_v2(): string {

FILE: src/utils/fp/Result/index.d.ts
  type Result (line 5) | type Result<T> = $Exact<{ value: T }> | $Exact<{ error: Error }>
  type ResultCallback (line 7) | type ResultCallback<T> = (r: Result<T>) => void

FILE: src/utils/fp/allPromisesObj/index.d.ts
  type UnpackPromise (line 6) | type UnpackPromise = <T>(promise: Promise<T>) => T

FILE: src/utils/fp/arrayDifference/index.d.ts
  type ArrayDiff (line 5) | type ArrayDiff<T> = $Exact<{ added: T[]; removed: T[] }>

FILE: src/utils/fp/arrayOrSpread/index.d.ts
  type _SpreadFn (line 1) | type _SpreadFn<Arg, Return> = (...args: Arg[]) => Return
  type _ArrayFn (line 2) | type _ArrayFn<Arg, Return> = (args: Arg[]) => Return
  type ArrayOrSpreadFn (line 5) | type ArrayOrSpreadFn<Arg, Return> = _SpreadFn<Arg, Return> & _ArrayFn<Ar...

FILE: src/utils/fp/filterObj/index.d.ts
  type FilterObj2 (line 3) | type FilterObj2 = <T, Key, Obj = { [Key: string]: T }, Fn = (_: T, __: K...
  type FilterObjCur (line 7) | type FilterObjCur = <T, Key, Obj = { [Key: string]: T }, Fn = (_: T, __:...
  type FilterObj (line 11) | type FilterObj = FilterObj2 & FilterObjCur

FILE: src/utils/fp/filterObj/index.js
  function filterObj (line 14) | function filterObj(predicate: (any, any, any) => any, obj: {}): any {

FILE: src/utils/fp/fromPairs/index.d.ts
  type KeyValueIn (line 3) | type KeyValueIn<O = any> = { [k: string]: O }
  type KeyValueOut (line 4) | type KeyValueOut<O = any> = [string, O][]

FILE: src/utils/fp/fromPairs/index.js
  function fromPairs (line 4) | function fromPairs(pairs) {

FILE: src/utils/fp/groupBy/index.js
  method return (line 6) | return (list) => {

FILE: src/utils/fp/identicalArrays/index.js
  function identicalArrays (line 3) | function identicalArrays<T, V: T[]>(left: V, right: V): boolean {

FILE: src/utils/fp/isObj/test.js
  class A (line 7) | class A {}

FILE: src/utils/fp/likeToRegexp/index.js
  function likeToRegexp (line 3) | function likeToRegexp(likeQuery: string): RegExp {

FILE: src/utils/fp/mapObj/index.d.ts
  type MapObj2 (line 3) | type MapObj2 = <T, Key, Obj = { [key: string]: T }, U = any, Fn = (_: T,...
  type MapObjCur (line 7) | type MapObjCur = <T, Key, Obj = { [key: string]: T }, U = any, Fn = (_: ...
  type MapObj (line 10) | type MapObj = MapObj2 & MapObjCur

FILE: src/utils/fp/mapObj/index.js
  function mapObj (line 14) | function mapObj(fn: (any, string, any) => any, obj: {}): any {

FILE: src/utils/fp/noop/index.js
  function noop (line 4) | function noop(): void {}

FILE: src/utils/fp/pipe/index.d.ts
  type Pipe (line 1) | type Pipe = (<A, B, C, D, E, F, G>(

FILE: src/utils/fp/pipe/index.js
  function pipe (line 23) | function pipe(...fns: ((any) => any)[]): (any) => any {

FILE: src/utils/fp/sortBy/index.js
  function sortBy (line 3) | function sortBy<T, U>(sorter: (T) => U, list: T[]): T[] {

FILE: src/utils/fp/toPairs/index.d.ts
  type KeyValueOut (line 3) | type KeyValueOut<O = any> = { [k: string]: O }
  type KeyValueIn (line 4) | type KeyValueIn<O = any> = [string, O][]

FILE: src/utils/fp/toPairs/index.js
  function toPairs (line 4) | function toPairs(obj) {

FILE: src/utils/fp/unnest/index.js
  function unnest (line 4) | function unnest(arr) {

FILE: src/utils/subscriptions/SharedSubscribable/index.d.ts
  class SharedSubscribable (line 3) | class SharedSubscribable<T> {

FILE: src/utils/subscriptions/type.d.ts
  type Unsubscribe (line 1) | type Unsubscribe = () => void
Condensed preview — 1087 files, each showing path, character count, and a content snippet. Download the .json file or copy for the full structured content (6,167K chars).
[
  {
    "path": ".eslintignore",
    "chars": 105,
    "preview": "node_modules/\ndist/\nflow-typed/\ndev/\n; FIXME: Temporary, should be deleted after #1477 is merged\n**/*.ts\n"
  },
  {
    "path": ".eslintrc.js",
    "chars": 1305,
    "preview": "const config = {\n  env: {\n    es6: true,\n    // configure globals\n    jest: true,\n    browser: true,\n    commonjs: true,"
  },
  {
    "path": ".flowconfig",
    "chars": 633,
    "preview": "[ignore]\n<PROJECT_ROOT>/.cache\n<PROJECT_ROOT>/dist\n<PROJECT_ROOT>/dev\n<PROJECT_ROOT>/examples\n<PROJECT_ROOT>/react-nativ"
  },
  {
    "path": ".gitattributes",
    "chars": 63,
    "preview": "native/iosTests/Pods/* linguist-generated=true\n*.pbxproj -text\n"
  },
  {
    "path": ".github/stale.yml",
    "chars": 39,
    "preview": "daysUntilStale: 270\ndaysUntilClose: 60\n"
  },
  {
    "path": ".github/workflows/ci.yml",
    "chars": 4036,
    "preview": "name: CI\n\non:\n  pull_request:\n  push:\n    branches: master\n\njobs:\n  ci-check:\n    runs-on: ubuntu-22.04\n    name: JavaSc"
  },
  {
    "path": ".gitignore",
    "chars": 267,
    "preview": ".DS_Store\n\n.cache/\nnode_modules/\n.tmp/\n\nnpm-debug.log\nyarn-error.log\n\ndist/\ndev/\n\n*.tgz\ncoverage/\n\n.vscode\n.idea\n\ndocs-b"
  },
  {
    "path": ".imgbotconfig",
    "chars": 47,
    "preview": "{\n    \"ignoredFiles\": [\n      \"docs/*\"\n    ]\n}\n"
  },
  {
    "path": "CHANGELOG-Unreleased.md",
    "chars": 378,
    "preview": "### Highlights\n\n### BREAKING CHANGES\n\n### Deprecations\n\n### New features\n\n### Fixes\n\n- [LokiJS] Multitab sync issue fix\n"
  },
  {
    "path": "CHANGELOG.md",
    "chars": 53626,
    "preview": "# Changelog\n\nAll notable changes to this project will be documented in this file.\n\nContributors: Please add your changes"
  },
  {
    "path": "CONTRIBUTING.md",
    "chars": 3800,
    "preview": "<img src=\"https://github.com/Nozbe/WatermelonDB/raw/master/assets/needyou.jpg\" alt=\"We need you\" width=\"220\" />\n\n**Water"
  },
  {
    "path": "Gemfile",
    "chars": 520,
    "preview": "source 'https://rubygems.org'\n\nruby \">= 2.6.10\"\n\ngem 'pry'\n\n# Cocoapods 1.15 introduced a bug which break the build. (RN"
  },
  {
    "path": "LICENSE",
    "chars": 1057,
    "preview": "MIT License\n\nCopyright (c) Nozbe\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this s"
  },
  {
    "path": "README.md",
    "chars": 8901,
    "preview": "<p align=\"center\">\n  <img src=\"https://github.com/Nozbe/WatermelonDB/raw/master/assets/logo-horizontal2.png\" alt=\"Waterm"
  },
  {
    "path": "SECURITY.md",
    "chars": 1114,
    "preview": "# Reporting Security Issues\n\nIf you believe you've found a security vulnerability in WatermelonDB, let us know right awa"
  },
  {
    "path": "WatermelonDB.podspec",
    "chars": 1698,
    "preview": "require \"json\"\n\npackage = JSON.parse(File.read(File.join(__dir__, 'package.json')))\n\nPod::Spec.new do |s|\n  s.name      "
  },
  {
    "path": "babel.config.js",
    "chars": 2554,
    "preview": "const plugins = [\n  [\n    '@babel/plugin-transform-runtime',\n    {\n      helpers: true,\n      // regenerator: true,\n    "
  },
  {
    "path": "docs-website/.gitignore",
    "chars": 233,
    "preview": "# Dependencies\n/node_modules\n\n# Production\n/build\n\n# Generated files\n.docusaurus\n.cache-loader\n\n# Misc\n.DS_Store\n.env.lo"
  },
  {
    "path": "docs-website/README.md",
    "chars": 770,
    "preview": "# Website\n\nThis website is built using [Docusaurus 2](https://docusaurus.io/), a modern static website generator.\n\n### I"
  },
  {
    "path": "docs-website/babel.config.js",
    "chars": 89,
    "preview": "module.exports = {\n  presets: [require.resolve('@docusaurus/core/lib/babel/preset')],\n};\n"
  },
  {
    "path": "docs-website/blog/2021-08-01-mdx-blog-post.mdx",
    "chars": 454,
    "preview": "---\nslug: mdx-blog-post\ntitle: MDX Blog Post\nauthors: [radex]\ntags: [docusaurus]\n---\n\nBlog posts support [Docusaurus Mar"
  },
  {
    "path": "docs-website/blog/authors.yml",
    "chars": 167,
    "preview": "radex:\n  name: Radek Pietruszewski\n  title: Maintainer of WatermelonDB\n  url: https://github.com/radex\n  image_url: http"
  },
  {
    "path": "docs-website/docs/docs/Advanced/AdvancedFields.md",
    "chars": 6324,
    "preview": "# Advanced Fields\n\n## `@json`\n\nIf you have a lot of metadata about a record (say, an object with many keys, or an array "
  },
  {
    "path": "docs-website/docs/docs/Advanced/CreateUpdateTracking.md",
    "chars": 2163,
    "preview": "---\ntitle: Automatic create/update tracking\nhide_title: true\n---\n\n# Create/Update tracking\n\nYou can add per-table suppor"
  },
  {
    "path": "docs-website/docs/docs/Advanced/Flow.md",
    "chars": 4447,
    "preview": "---\ntitle: Flow\nhide_title: true\n---\n\n# Watermelon ❤️ Flow\n\nWatermelon was developed with [Flow](https://flow.org) in mi"
  },
  {
    "path": "docs-website/docs/docs/Advanced/LocalStorage.md",
    "chars": 1362,
    "preview": "---\ntitle: LocalStorage\nhide_title: true\n---\n\n# Local storage\n\nWatermelonDB has a simple key/value store, similar to [lo"
  },
  {
    "path": "docs-website/docs/docs/Advanced/Logging.md",
    "chars": 1295,
    "preview": "# Logging\n\nBy default, Watermelon ships with basic logging enabled that may be useful for debugging. When the applicatio"
  },
  {
    "path": "docs-website/docs/docs/Advanced/Migrations.md",
    "chars": 7526,
    "preview": "# Migrations\n\n**Schema migrations** is the mechanism by which you can add new tables and columns to the database in a ba"
  },
  {
    "path": "docs-website/docs/docs/Advanced/Performance.md",
    "chars": 89,
    "preview": "---\ntitle: Performance Tips\nhide_title: true\n---\n\n# Performance\n\nPerformance tips — TODO\n"
  },
  {
    "path": "docs-website/docs/docs/Advanced/ProTips.md",
    "chars": 2792,
    "preview": "---\ntitle: Pro Tips\nhide_title: true\n---\n\n# Various Pro Tips\n\n## Database viewer\n\n[See discussion](https://github.com/No"
  },
  {
    "path": "docs-website/docs/docs/Advanced/SharingDatabaseAcrossTargets.md",
    "chars": 4215,
    "preview": "# iOS - Sharing database across targets\n\nIn case you have multiple Xcode targets and want to share your WatermelonDB ins"
  },
  {
    "path": "docs-website/docs/docs/CHANGELOG.md",
    "chars": 53647,
    "preview": "# Changelog\n\nAll notable changes to this project will be documented in this file.\n\nContributors: Please add your changes"
  },
  {
    "path": "docs-website/docs/docs/CONTRIBUTING.md",
    "chars": 3846,
    "preview": "---\ntitle: Contributing\nhide_title: true\n---\n\n<img src=\"https://github.com/Nozbe/WatermelonDB/raw/master/assets/needyou."
  },
  {
    "path": "docs-website/docs/docs/CRUD.md",
    "chars": 5104,
    "preview": "# Create, Read, Update, Delete\n\nWhen you have your [Schema](./Schema.md) and [Models](./Model.md) defined, learn how to "
  },
  {
    "path": "docs-website/docs/docs/Components.md",
    "chars": 12297,
    "preview": "# Connecting Components\n\nAfter you [define some Models](./Model.md), it's time to connect Watermelon to your app's inter"
  },
  {
    "path": "docs-website/docs/docs/Implementation/Architecture.md",
    "chars": 2405,
    "preview": "# Architecture\n\n## Base objects\n\n`Database` is the root object of Watermelon. It owns:\n\n- a `DatabaseAdapter`\n- a map of"
  },
  {
    "path": "docs-website/docs/docs/Implementation/DatabaseAdapters.md",
    "chars": 6018,
    "preview": "# Database Adapters\n\nIn this guide, you'll learn how to add support for new databases and new platforms to WatermelonDB."
  },
  {
    "path": "docs-website/docs/docs/Implementation/Publishing.md",
    "chars": 650,
    "preview": "# Publishing WatermelonDB\n\n### Step 1: Run all automated tests\n\n```bash\nyarn ci:check && yarn test:ios && yarn test:andr"
  },
  {
    "path": "docs-website/docs/docs/Implementation/SyncImpl.md",
    "chars": 8073,
    "preview": "---\ntitle: Sync implementation\nhide_title: true\n---\n\n# Sync implementation details\n\nIf you're looking for a guide to imp"
  },
  {
    "path": "docs-website/docs/docs/Installation.mdx",
    "chars": 11051,
    "preview": "import Tabs from '@theme/Tabs';\nimport TabItem from '@theme/TabItem';\n\n# Installation\n\nFirst, add Watermelon to your pro"
  },
  {
    "path": "docs-website/docs/docs/Model.md",
    "chars": 6176,
    "preview": "# Model\n\nA **Model** class represents a type of thing in your app. For example, `Post`, `Comment`, `User`.\n\nBefore defin"
  },
  {
    "path": "docs-website/docs/docs/Query.md",
    "chars": 19257,
    "preview": "---\ntitle: Querying\nhide_title: true\n---\n\n# Query API\n\n**Querying** is how you find records that match certain condition"
  },
  {
    "path": "docs-website/docs/docs/README.md",
    "chars": 8787,
    "preview": "---\ntitle: Check out the README\nhide_title: true\n---\n\n<p align=\"center\">\n  <img src=\"https://github.com/Nozbe/Watermelon"
  },
  {
    "path": "docs-website/docs/docs/Relation.md",
    "chars": 4738,
    "preview": "# Relations\n\nA `Relation` object represents one record pointing to another — such as the author (`User`) of a `Comment`,"
  },
  {
    "path": "docs-website/docs/docs/Roadmap.md",
    "chars": 609,
    "preview": "---\ntitle: Roadmap\nhide_title: true\n---\n# WatermelonDB Roadmap\n\nDespite being called 0.xx, WatermelonDB is essentially f"
  },
  {
    "path": "docs-website/docs/docs/Schema.md",
    "chars": 5416,
    "preview": "# Schema\n\nWhen using WatermelonDB, you're dealing with **Models** and **Collections**. However, underneath Watermelon si"
  },
  {
    "path": "docs-website/docs/docs/Setup.md",
    "chars": 3454,
    "preview": "---\ntitle: 'Setup'\nhide_title: true\n---\n\n# Set up your app for WatermelonDB\n\nMake sure you [installed Watermelon](./Inst"
  },
  {
    "path": "docs-website/docs/docs/Sync/Backend.md",
    "chars": 12606,
    "preview": "---\ntitle: Backend\nhide_title: true\n---\n\n## Implementing your Sync backend\n\n### Understanding `changes` objects\n\nSynchro"
  },
  {
    "path": "docs-website/docs/docs/Sync/Contribute.md",
    "chars": 539,
    "preview": "\n1. If you implement Watermelon sync but found this guide confusing, please contribute improvements!\n2. Please help out "
  },
  {
    "path": "docs-website/docs/docs/Sync/FAQ.md",
    "chars": 1905,
    "preview": "---\ntitle: FAQ\nhide_title: true\n---\n\n# Frequently Asked Questions\n\n### Sync primitives and implementing your own sync en"
  },
  {
    "path": "docs-website/docs/docs/Sync/Frontend.md",
    "chars": 17155,
    "preview": "---\ntitle: Frontend\nhide_title: true\n---\n\n## Implementing sync in frontend\n\n## Using `synchronize()` in your app\n\nTo syn"
  },
  {
    "path": "docs-website/docs/docs/Sync/Intro.md",
    "chars": 998,
    "preview": "---\ntitle: Intro\nhide_title: true\n---\n\n# Synchronization\n\nWatermelonDB has been designed from scratch to be able to seam"
  },
  {
    "path": "docs-website/docs/docs/Sync/Limitations.md",
    "chars": 999,
    "preview": "\n1. If a record being pushed changes remotely between pull and push, push will just fail. It would be better if it faile"
  },
  {
    "path": "docs-website/docs/docs/Sync/Troubleshoot.md",
    "chars": 495,
    "preview": "\n**⚠️ Note about a React Native / UglifyES bug**. When you import Watermelon Sync, your app might fail to compile in rel"
  },
  {
    "path": "docs-website/docs/docs/Writers.md",
    "chars": 8998,
    "preview": "---\ntitle: Writers, Readers, Batching\nhide_title: true\n---\n\n# Writers, Readers, and batching\n\nThink of this guide as a p"
  },
  {
    "path": "docs-website/docusaurus.config.js",
    "chars": 4673,
    "preview": "// @ts-check\n// Note: type annotations allow type checking and IDEs autocompletion\n\nconst { themes } = require('prism-re"
  },
  {
    "path": "docs-website/package.json",
    "chars": 1030,
    "preview": "{\n  \"name\": \"docs-website\",\n  \"version\": \"0.28.0\",\n  \"private\": true,\n  \"scripts\": {\n    \"docusaurus\": \"docusaurus\",\n   "
  },
  {
    "path": "docs-website/sidebars.js",
    "chars": 1487,
    "preview": "/**\n * Creating a sidebar enables you to:\n - create an ordered group of docs\n - render a sidebar for each doc of that gr"
  },
  {
    "path": "docs-website/src/components/HomepageFeatures/index.js",
    "chars": 1440,
    "preview": "import clsx from 'clsx'\nimport React from 'react'\nimport styles from './styles.module.css'\n\nconst FeatureList = [\n  {\n  "
  },
  {
    "path": "docs-website/src/components/HomepageFeatures/styles.module.css",
    "chars": 138,
    "preview": ".features {\n  display: flex;\n  align-items: center;\n  padding: 2rem 0;\n  width: 100%;\n}\n\n.featureSvg {\n  height: 200px;\n"
  },
  {
    "path": "docs-website/src/css/custom.css",
    "chars": 998,
    "preview": "/**\n * Any CSS included here will be global. The classic template\n * bundles Infima by default. Infima is a CSS framewor"
  },
  {
    "path": "docs-website/src/pages/index.js",
    "chars": 1240,
    "preview": "import Link from '@docusaurus/Link'\nimport useDocusaurusContext from '@docusaurus/useDocusaurusContext'\nimport HomepageF"
  },
  {
    "path": "docs-website/src/pages/index.module.css",
    "chars": 365,
    "preview": "/**\n * CSS files with the .module.css suffix will be treated as CSS modules\n * and scoped locally.\n */\n\n.heroBanner {\n  "
  },
  {
    "path": "docs-website/static/.nojekyll",
    "chars": 0,
    "preview": ""
  },
  {
    "path": "docs-website/static/CNAME",
    "chars": 16,
    "preview": "watermelondb.dev"
  },
  {
    "path": "examples/typescript/AppSchema.ts",
    "chars": 555,
    "preview": "import { appSchema, tableSchema } from \"@nozbe/watermelondb\"\nimport { TableName } from \"./ts-example\"\n\nexport const AppS"
  },
  {
    "path": "examples/typescript/__typetests__/README.md",
    "chars": 159,
    "preview": "Files here are not meant to be executed, only type-checked.\n\nNote: You MUST add imports to new files from index.ts\n\nMirr"
  },
  {
    "path": "examples/typescript/__typetests__/index.ts",
    "chars": 44,
    "preview": "import './query'\nimport './withObservables'\n"
  },
  {
    "path": "examples/typescript/__typetests__/query.ts",
    "chars": 738,
    "preview": "import { Collection, Q, type ColumnName, type TableName } from '@nozbe/watermelondb'\n\nconst collection: Collection<any> "
  },
  {
    "path": "examples/typescript/__typetests__/withObservables.tsx",
    "chars": 1455,
    "preview": "import * as React from 'react'\nimport { withObservables, ExtractedObservables } from '@nozbe/watermelondb/src/react'\nimp"
  },
  {
    "path": "examples/typescript/package.json",
    "chars": 279,
    "preview": "{\n  \"name\": \"typescript-example\",\n  \"version\": \"1.0.0\",\n  \"license\": \"MIT\",\n  \"scripts\": {\n    \"test\": \"tsc --noEmit\"\n  "
  },
  {
    "path": "examples/typescript/ts-example.ts",
    "chars": 2803,
    "preview": "// tslint:disable: max-classes-per-file\nimport { Database, Model, Q, Query, Relation } from '@nozbe/watermelondb'\nimport"
  },
  {
    "path": "examples/typescript/tsconfig.json",
    "chars": 463,
    "preview": "{\n  \"compilerOptions\": {\n    \"lib\": [\"ES2016\", \"DOM\"],\n    \"emitDecoratorMetadata\": true,\n    \"experimentalDecorators\": "
  },
  {
    "path": "flow-typed/custom/lokijs.js",
    "chars": 144,
    "preview": "declare module 'lokijs' {\n  declare module.exports: any;\n}\n\ndeclare module 'lokijs/src/loki-indexed-adapter' {\n  declare"
  },
  {
    "path": "flow-typed/custom/react-native.js",
    "chars": 65,
    "preview": "declare module 'react-native' {\n  declare module.exports: any;\n}\n"
  },
  {
    "path": "flow-typed/npm/rxjs_v6.x.js",
    "chars": 48698,
    "preview": "type rxjs$PartialObserver<-T> =\n  | {\n  +next: (value: T) => mixed,\n  +error?: (error: any) => mixed,\n  +complete?: () ="
  },
  {
    "path": "jest.config.js",
    "chars": 636,
    "preview": "module.exports = {\n  verbose: true,\n  bail: true,\n  moduleNameMapper: {},\n  setupFilesAfterEnv: ['<rootDir>/src/__tests_"
  },
  {
    "path": "metro.config.js",
    "chars": 2526,
    "preview": "const { getDefaultConfig, mergeConfig } = require('@react-native/metro-config')\nconst exclusionList = require('metro-con"
  },
  {
    "path": "native/.clang-format",
    "chars": 1420,
    "preview": "AccessModifierOffset: 0\nAlignEscapedNewlinesLeft: true\nAlignTrailingComments: false\nAllowAllParametersOfDeclarationOnNex"
  },
  {
    "path": "native/.gitignore",
    "chars": 1035,
    "preview": "# Xcode\n#\nbuild/\n*.pbxuser\n!default.pbxuser\n*.mode1v3\n!default.mode1v3\n*.mode2v3\n!default.mode2v3\n*.perspectivev3\n!defau"
  },
  {
    "path": "native/android/.gitignore",
    "chars": 129,
    "preview": "*.iml\n.gradle\n/local.properties\n/.idea/workspace.xml\n/.idea/libraries\n.DS_Store\n/build\n/captures\n.externalNativeBuild\n\nt"
  },
  {
    "path": "native/android/build.gradle",
    "chars": 1244,
    "preview": "\nbuildscript {\n    ext.getExtOrDefault = {name ->\n        return rootProject.ext.has(name) ? rootProject.ext.get(name) :"
  },
  {
    "path": "native/android/gradle.properties",
    "chars": 224,
    "preview": "ReactNativeWatermelonDB_kotlinVersion=1.3.50\nReactNativeWatermelonDB_compileSdkVersion=31\nReactNativeWatermelonDB_buildT"
  },
  {
    "path": "native/android/src/main/AndroidManifest.xml",
    "chars": 52,
    "preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<manifest />\n"
  },
  {
    "path": "native/android/src/main/java/com/nozbe/watermelondb/Connection.java",
    "chars": 798,
    "preview": "package com.nozbe.watermelondb;\n\nimport java.util.ArrayList;\n\npublic abstract class Connection {\n    public static class"
  },
  {
    "path": "native/android/src/main/java/com/nozbe/watermelondb/DatabaseUtils.java",
    "chars": 1558,
    "preview": "package com.nozbe.watermelondb;\n\nimport android.database.Cursor;\nimport com.facebook.react.bridge.Arguments;\nimport com."
  },
  {
    "path": "native/android/src/main/java/com/nozbe/watermelondb/MigrationNeededError.java",
    "chars": 238,
    "preview": "package com.nozbe.watermelondb;\n\npublic class MigrationNeededError extends RuntimeException {\n    public int databaseVer"
  },
  {
    "path": "native/android/src/main/java/com/nozbe/watermelondb/Queries.java",
    "chars": 370,
    "preview": "package com.nozbe.watermelondb;\n\npublic class Queries {\n    public static final String select_local_storage = \"select va"
  },
  {
    "path": "native/android/src/main/java/com/nozbe/watermelondb/SchemaNeededError.java",
    "chars": 93,
    "preview": "package com.nozbe.watermelondb;\n\npublic class SchemaNeededError extends RuntimeException {\n}\n"
  },
  {
    "path": "native/android/src/main/java/com/nozbe/watermelondb/WMDatabase.java",
    "chars": 7082,
    "preview": "package com.nozbe.watermelondb;\n\nimport android.content.Context;\nimport android.database.Cursor;\nimport android.database"
  },
  {
    "path": "native/android/src/main/java/com/nozbe/watermelondb/WMDatabaseBridge.java",
    "chars": 11220,
    "preview": "package com.nozbe.watermelondb;\n\nimport android.content.Context;\nimport android.os.Trace;\nimport androidx.annotation.Non"
  },
  {
    "path": "native/android/src/main/java/com/nozbe/watermelondb/WMDatabaseDriver.java",
    "chars": 9618,
    "preview": "package com.nozbe.watermelondb;\n\nimport android.content.Context;\nimport android.database.Cursor;\nimport android.database"
  },
  {
    "path": "native/android/src/main/java/com/nozbe/watermelondb/WatermelonDBPackage.java",
    "chars": 855,
    "preview": "package com.nozbe.watermelondb;\n\nimport androidx.annotation.NonNull;\nimport com.facebook.react.ReactPackage;\nimport com."
  },
  {
    "path": "native/android/src/main/java/com/nozbe/watermelondb/utils/MigrationSet.java",
    "chars": 267,
    "preview": "package com.nozbe.watermelondb.utils;\n\npublic class MigrationSet {\n    public int from;\n    public int to;\n    public St"
  },
  {
    "path": "native/android/src/main/java/com/nozbe/watermelondb/utils/Pair.java",
    "chars": 299,
    "preview": "package com.nozbe.watermelondb.utils;\n\npublic class Pair<K,V> {\n    public K first;\n    public V second;\n\n    private Pa"
  },
  {
    "path": "native/android/src/main/java/com/nozbe/watermelondb/utils/Schema.java",
    "chars": 218,
    "preview": "package com.nozbe.watermelondb.utils;\n\npublic class Schema {\n    public int version;\n    public String sql;\n\n    public "
  },
  {
    "path": "native/android-jsi/.gitignore",
    "chars": 134,
    "preview": "*.iml\n.gradle\n/local.properties\n/.idea/workspace.xml\n/.idea/libraries\n.DS_Store\n/build\n/captures\n.externalNativeBuild\n.c"
  },
  {
    "path": "native/android-jsi/build.gradle",
    "chars": 2711,
    "preview": "apply plugin: 'com.android.library'\n\n\ndef DEFAULT_COMPILE_SDK_VERSION = 28\ndef DEFAULT_BUILD_TOOLS_VERSION = \"28.0.3\"\nde"
  },
  {
    "path": "native/android-jsi/src/main/AndroidManifest.xml",
    "chars": 52,
    "preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<manifest />\n"
  },
  {
    "path": "native/android-jsi/src/main/cpp/CMakeLists.txt",
    "chars": 3894,
    "preview": "PROJECT(watermelondb-jsi C CXX)\ncmake_minimum_required(VERSION 3.4.1)\n\n# inspired by https://github.com/ericlewis/react-"
  },
  {
    "path": "native/android-jsi/src/main/cpp/DatabasePlatformAndroid.cpp",
    "chars": 7532,
    "preview": "#include <android/log.h>\n#include <mutex>\n#include <unordered_map>\n#include <sqlite3.h>\n#include <cassert>\n\n#include \"Da"
  },
  {
    "path": "native/android-jsi/src/main/cpp/DatabasePlatformAndroid.h",
    "chars": 224,
    "preview": "#pragma once\n\n#include <jni.h>\n\nnamespace watermelondb {\nnamespace platform {\n\nvoid configureJNI(JNIEnv *env);\nvoid prov"
  },
  {
    "path": "native/android-jsi/src/main/cpp/JSIInstaller.cpp",
    "chars": 815,
    "preview": "\n#include <jni.h>\n#include <jsi/jsi.h>\n\n#include \"Database.h\"\n#include \"DatabasePlatformAndroid.h\"\n\nusing namespace face"
  },
  {
    "path": "native/android-jsi/src/main/java/com/nozbe/watermelondb/WatermelonDBJSIModule.java",
    "chars": 1366,
    "preview": "package com.nozbe.watermelondb.jsi;\n\nimport android.util.Log;\n\nimport androidx.annotation.NonNull;\nimport androidx.annot"
  },
  {
    "path": "native/android-jsi/src/main/java/com/nozbe/watermelondb/jsi/JSIInstaller.java",
    "chars": 1101,
    "preview": "package com.nozbe.watermelondb.jsi;\n\nimport android.content.Context;\nclass JSIInstaller {\n    static void install(Contex"
  },
  {
    "path": "native/android-jsi/src/main/java/com/nozbe/watermelondb/jsi/WatermelonDBJSIPackage.java",
    "chars": 869,
    "preview": "package com.nozbe.watermelondb.jsi;\n\nimport androidx.annotation.NonNull;\nimport com.facebook.react.ReactPackage;\nimport "
  },
  {
    "path": "native/android-jsi/src/main/java/com/nozbe/watermelondb/jsi/WatermelonJSI.java",
    "chars": 438,
    "preview": "package com.nozbe.watermelondb.jsi;\n\nimport android.app.Application;\n\n// Public interface to JSI-based Watermelon\npublic"
  },
  {
    "path": "native/androidTest/.gitignore",
    "chars": 99,
    "preview": "*.iml\n/.gradle\n/local.properties\n/.idea\n.DS_Store\n/build\n/captures\n.externalNativeBuild\n\ntestPath*\n"
  },
  {
    "path": "native/androidTest/app/BUCK",
    "chars": 1594,
    "preview": "# To learn about Buck see [Docs](https://buckbuild.com/).\n# To run your application with Buck:\n# - install Buck\n# - `npm"
  },
  {
    "path": "native/androidTest/app/build.gradle",
    "chars": 7360,
    "preview": "apply plugin: \"com.android.application\"\napply plugin: \"com.facebook.react\"\napply plugin: 'kotlin-android'\n\nimport com.an"
  },
  {
    "path": "native/androidTest/app/proguard-rules.pro",
    "chars": 2833,
    "preview": "# Add project specific ProGuard rules here.\n# By default, the flags in this file are appended to flags specified\n# in /u"
  },
  {
    "path": "native/androidTest/app/src/androidTest/java/com/nozbe/watermelonTest/BridgeTest.kt",
    "chars": 1206,
    "preview": "package com.nozbe.watermelonTest\n\nimport android.util.Log\nimport androidx.test.core.app.launchActivity\nimport org.junit."
  },
  {
    "path": "native/androidTest/app/src/main/AndroidManifest.xml",
    "chars": 885,
    "preview": "<manifest xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    xmlns:tools=\"http://schemas.android.com/tools\">"
  },
  {
    "path": "native/androidTest/app/src/main/java/com/nozbe/watermelonTest/BridgeTestReporter.kt",
    "chars": 1660,
    "preview": "package com.nozbe.watermelonTest\n\nimport com.facebook.react.bridge.ReactApplicationContext\nimport com.facebook.react.bri"
  },
  {
    "path": "native/androidTest/app/src/main/java/com/nozbe/watermelonTest/MainActivity.kt",
    "chars": 702,
    "preview": "package com.nozbe.watermelonTest\n\nimport com.facebook.react.ReactActivity\nimport com.facebook.react.ReactActivityDelegat"
  },
  {
    "path": "native/androidTest/app/src/main/java/com/nozbe/watermelonTest/MainApplication.kt",
    "chars": 1194,
    "preview": "package com.nozbe.watermelonTest\n\nimport android.app.Application\nimport com.facebook.react.ReactApplication\nimport com.f"
  },
  {
    "path": "native/androidTest/app/src/main/java/com/nozbe/watermelonTest/NativeModulesPackage.kt",
    "chars": 542,
    "preview": "package com.nozbe.watermelonTest\n\nimport com.facebook.react.ReactPackage\nimport com.facebook.react.bridge.NativeModule\ni"
  },
  {
    "path": "native/androidTest/app/src/main/res/values/strings.xml",
    "chars": 79,
    "preview": "<resources>\n    <string name=\"app_name\">Watermelon Tests</string>\n</resources>\n"
  },
  {
    "path": "native/androidTest/build.gradle",
    "chars": 2452,
    "preview": "// import org.apache.tools.ant.taskdefs.condition.Os\n\n// Top-level build file where you can add configuration options co"
  },
  {
    "path": "native/androidTest/gradle/wrapper/gradle-wrapper.properties",
    "chars": 250,
    "preview": "distributionBase=GRADLE_USER_HOME\ndistributionPath=wrapper/dists\ndistributionUrl=https\\://services.gradle.org/distributi"
  },
  {
    "path": "native/androidTest/gradle.properties",
    "chars": 1863,
    "preview": "# Project-wide Gradle settings.\n\n# IDE (e.g. Android Studio) users:\n# Gradle settings configured through the IDE *will o"
  },
  {
    "path": "native/androidTest/gradlew",
    "chars": 8669,
    "preview": "#!/bin/sh\n\n#\n# Copyright © 2015-2021 the original authors.\n#\n# Licensed under the Apache License, Version 2.0 (the \"Lice"
  },
  {
    "path": "native/androidTest/gradlew.bat",
    "chars": 2918,
    "preview": "@rem\r\n@rem Copyright 2015 the original author or authors.\r\n@rem\r\n@rem Licensed under the Apache License, Version 2.0 (th"
  },
  {
    "path": "native/androidTest/keystores/BUCK",
    "chars": 152,
    "preview": "keystore(\n    name = \"debug\",\n    properties = \"debug.keystore.properties\",\n    store = \"debug.keystore\",\n    visibility"
  },
  {
    "path": "native/androidTest/keystores/debug.keystore.properties",
    "chars": 105,
    "preview": "key.store=debug.keystore\nkey.alias=androiddebugkey\nkey.store.password=android\nkey.alias.password=android\n"
  },
  {
    "path": "native/androidTest/settings.gradle",
    "chars": 367,
    "preview": "rootProject.name = 'watermelonTest'\ninclude ':watermelondb'\nproject(':watermelondb').projectDir = new File(rootProject.p"
  },
  {
    "path": "native/ios/WatermelonDB/DatabasePlatformIOS.mm",
    "chars": 3822,
    "preview": "#include \"DatabasePlatform.h\"\n#import <Foundation/Foundation.h>\n#import <React/RCTBridge.h>\n#include <mutex>\n\nnamespace "
  },
  {
    "path": "native/ios/WatermelonDB/FMDB/LICENSE.txt",
    "chars": 1399,
    "preview": "If you are using FMDB in your project, I'd love to hear about it.  Let Gus know\nby sending an email to gus@flyingmeat.co"
  },
  {
    "path": "native/ios/WatermelonDB/FMDB/README.markdown",
    "chars": 26524,
    "preview": "# FMDB v2.7\n<!--[![Platform](https://img.shields.io/cocoapods/p/FMDB.svg?style=flat)](http://cocoadocs.org/docsets/Alamo"
  },
  {
    "path": "native/ios/WatermelonDB/FMDB/src/fmdb/FMDB.h",
    "chars": 273,
    "preview": "#import <Foundation/Foundation.h>\n\nFOUNDATION_EXPORT double FMDBVersionNumber;\nFOUNDATION_EXPORT const unsigned char FMD"
  },
  {
    "path": "native/ios/WatermelonDB/FMDB/src/fmdb/FMDatabase.h",
    "chars": 56714,
    "preview": "#import <Foundation/Foundation.h>\n#import \"FMResultSet.h\"\n#import \"FMDatabasePool.h\"\n\nNS_ASSUME_NONNULL_BEGIN\n\n#if ! __h"
  },
  {
    "path": "native/ios/WatermelonDB/FMDB/src/fmdb/FMDatabase.m",
    "chars": 50911,
    "preview": "#import \"FMDatabase.h\"\n#import <unistd.h>\n#import <objc/runtime.h>\n\n#if FMDB_SQLITE_STANDALONE\n#import <sqlite3/sqlite3."
  },
  {
    "path": "native/ios/WatermelonDB/FMDB/src/fmdb/FMDatabaseAdditions.h",
    "chars": 6599,
    "preview": "//\n//  FMDatabaseAdditions.h\n//  fmdb\n//\n//  Created by August Mueller on 10/30/05.\n//  Copyright 2005 Flying Meat Inc.."
  },
  {
    "path": "native/ios/WatermelonDB/FMDB/src/fmdb/FMDatabaseAdditions.m",
    "chars": 7627,
    "preview": "//\n//  FMDatabaseAdditions.m\n//  fmdb\n//\n//  Created by August Mueller on 10/30/05.\n//  Copyright 2005 Flying Meat Inc.."
  },
  {
    "path": "native/ios/WatermelonDB/FMDB/src/fmdb/FMDatabasePool.h",
    "chars": 8268,
    "preview": "//\n//  FMDatabasePool.h\n//  fmdb\n//\n//  Created by August Mueller on 6/22/11.\n//  Copyright 2011 Flying Meat Inc. All ri"
  },
  {
    "path": "native/ios/WatermelonDB/FMDB/src/fmdb/FMDatabasePool.m",
    "chars": 9437,
    "preview": "//\n//  FMDatabasePool.m\n//  fmdb\n//\n//  Created by August Mueller on 6/22/11.\n//  Copyright 2011 Flying Meat Inc. All ri"
  },
  {
    "path": "native/ios/WatermelonDB/FMDB/src/fmdb/FMDatabaseQueue.h",
    "chars": 10661,
    "preview": "//\n//  FMDatabaseQueue.h\n//  fmdb\n//\n//  Created by August Mueller on 6/22/11.\n//  Copyright 2011 Flying Meat Inc. All r"
  },
  {
    "path": "native/ios/WatermelonDB/FMDB/src/fmdb/FMDatabaseQueue.m",
    "chars": 9554,
    "preview": "//\n//  FMDatabaseQueue.m\n//  fmdb\n//\n//  Created by August Mueller on 6/22/11.\n//  Copyright 2011 Flying Meat Inc. All r"
  },
  {
    "path": "native/ios/WatermelonDB/FMDB/src/fmdb/FMResultSet.h",
    "chars": 12573,
    "preview": "#import <Foundation/Foundation.h>\n\nNS_ASSUME_NONNULL_BEGIN\n\n#ifndef __has_feature      // Optional.\n#define __has_featur"
  },
  {
    "path": "native/ios/WatermelonDB/FMDB/src/fmdb/FMResultSet.m",
    "chars": 13060,
    "preview": "#import \"FMResultSet.h\"\n#import \"FMDatabase.h\"\n#import <unistd.h>\n\n#if FMDB_SQLITE_STANDALONE\n#import <sqlite3/sqlite3.h"
  },
  {
    "path": "native/ios/WatermelonDB/JSIInstaller.h",
    "chars": 259,
    "preview": "#pragma once\n\n#import <React/RCTBridge+Private.h>\n\n#ifdef __cplusplus\nextern \"C\"\n{\n#endif\n\nvoid installWatermelonJSI(RCT"
  },
  {
    "path": "native/ios/WatermelonDB/JSIInstaller.mm",
    "chars": 308,
    "preview": "#import \"JSIInstaller.h\"\n#import \"Database.h\"\n\nextern \"C\" void installWatermelonJSI(RCTCxxBridge *bridge) {\n    if (brid"
  },
  {
    "path": "native/ios/WatermelonDB/WatermelonDB.h",
    "chars": 41,
    "preview": "#pragma once\n\n#import \"./JSIInstaller.h\"\n"
  },
  {
    "path": "native/ios/WatermelonDB/objc/WMDatabase.h",
    "chars": 918,
    "preview": "#import \"FMDB.h\"\n\nNS_ASSUME_NONNULL_BEGIN\n\n@interface WMDatabase : NSObject\n\n@property (readwrite, strong, nonatomic) FM"
  },
  {
    "path": "native/ios/WatermelonDB/objc/WMDatabase.m",
    "chars": 5792,
    "preview": "#import \"WMDatabase.h\"\n#import <sqlite3.h>\n\n@implementation WMDatabase {\n    NSString *_path;\n}\n\n- (instancetype) initWi"
  },
  {
    "path": "native/ios/WatermelonDB/objc/WMDatabaseBridge.h",
    "chars": 98,
    "preview": "#import <React/RCTBridgeModule.h>\n\n@interface WMDatabaseBridge : NSObject <RCTBridgeModule>\n\n@end\n"
  },
  {
    "path": "native/ios/WatermelonDB/objc/WMDatabaseBridge.m",
    "chars": 8863,
    "preview": "#import \"WMDatabaseBridge.h\"\n#import \"WMDatabaseDriver.h\"\n#import \"JSIInstaller.h\"\n\n@implementation WMDatabaseBridge {\n "
  },
  {
    "path": "native/ios/WatermelonDB/objc/WMDatabaseDriver.h",
    "chars": 1631,
    "preview": "#import \"WMDatabase.h\"\n\nNS_ASSUME_NONNULL_BEGIN\n\ntypedef NS_ENUM(NSInteger, WMDatabaseCompatibility) {\n    WMDatabaseCom"
  },
  {
    "path": "native/ios/WatermelonDB/objc/WMDatabaseDriver.m",
    "chars": 7878,
    "preview": "#import \"WMDatabaseDriver.h\"\n\n@implementation WMDatabaseDriver\n\n#pragma mark - Initialization\n\n- (instancetype) initWith"
  },
  {
    "path": "native/iosTest/.xcode.env",
    "chars": 482,
    "preview": "# This `.xcode.env` file is versioned and is used to source the environment\n# used when running script phases inside Xco"
  },
  {
    "path": "native/iosTest/Podfile",
    "chars": 2791,
    "preview": "# source 'https://github.com/CocoaPods/Specs.git'\nworkspace 'WatermelonTester.xcworkspace'\n\nrequire_relative '../../node"
  },
  {
    "path": "native/iosTest/Pods/DoubleConversion/LICENSE",
    "chars": 1527,
    "preview": "Copyright 2006-2011, the V8 project authors. All rights reserved.\nRedistribution and use in source and binary forms, wit"
  },
  {
    "path": "native/iosTest/Pods/DoubleConversion/README",
    "chars": 1489,
    "preview": "http://code.google.com/p/double-conversion\n\nThis project (double-conversion) provides binary-decimal and decimal-binary\n"
  },
  {
    "path": "native/iosTest/Pods/DoubleConversion/double-conversion/bignum-dtoa.cc",
    "chars": 27312,
    "preview": "// Copyright 2010 the V8 project authors. All rights reserved.\n// Redistribution and use in source and binary forms, wit"
  },
  {
    "path": "native/iosTest/Pods/DoubleConversion/double-conversion/bignum-dtoa.h",
    "chars": 4300,
    "preview": "// Copyright 2010 the V8 project authors. All rights reserved.\n// Redistribution and use in source and binary forms, wit"
  },
  {
    "path": "native/iosTest/Pods/DoubleConversion/double-conversion/bignum.cc",
    "chars": 23075,
    "preview": "// Copyright 2010 the V8 project authors. All rights reserved.\n// Redistribution and use in source and binary forms, wit"
  },
  {
    "path": "native/iosTest/Pods/DoubleConversion/double-conversion/bignum.h",
    "chars": 5513,
    "preview": "// Copyright 2010 the V8 project authors. All rights reserved.\n// Redistribution and use in source and binary forms, wit"
  },
  {
    "path": "native/iosTest/Pods/DoubleConversion/double-conversion/cached-powers.cc",
    "chars": 8489,
    "preview": "// Copyright 2006-2008 the V8 project authors. All rights reserved.\n// Redistribution and use in source and binary forms"
  },
  {
    "path": "native/iosTest/Pods/DoubleConversion/double-conversion/cached-powers.h",
    "chars": 3027,
    "preview": "// Copyright 2010 the V8 project authors. All rights reserved.\n// Redistribution and use in source and binary forms, wit"
  },
  {
    "path": "native/iosTest/Pods/DoubleConversion/double-conversion/diy-fp.cc",
    "chars": 2474,
    "preview": "// Copyright 2010 the V8 project authors. All rights reserved.\n// Redistribution and use in source and binary forms, wit"
  },
  {
    "path": "native/iosTest/Pods/DoubleConversion/double-conversion/diy-fp.h",
    "chars": 3964,
    "preview": "// Copyright 2010 the V8 project authors. All rights reserved.\n// Redistribution and use in source and binary forms, wit"
  },
  {
    "path": "native/iosTest/Pods/DoubleConversion/double-conversion/double-conversion.cc",
    "chars": 30281,
    "preview": "// Copyright 2010 the V8 project authors. All rights reserved.\n// Redistribution and use in source and binary forms, wit"
  },
  {
    "path": "native/iosTest/Pods/DoubleConversion/double-conversion/double-conversion.h",
    "chars": 26197,
    "preview": "// Copyright 2012 the V8 project authors. All rights reserved.\n// Redistribution and use in source and binary forms, wit"
  },
  {
    "path": "native/iosTest/Pods/DoubleConversion/double-conversion/fast-dtoa.cc",
    "chars": 31124,
    "preview": "// Copyright 2012 the V8 project authors. All rights reserved.\n// Redistribution and use in source and binary forms, wit"
  },
  {
    "path": "native/iosTest/Pods/DoubleConversion/double-conversion/fast-dtoa.h",
    "chars": 4064,
    "preview": "// Copyright 2010 the V8 project authors. All rights reserved.\n// Redistribution and use in source and binary forms, wit"
  },
  {
    "path": "native/iosTest/Pods/DoubleConversion/double-conversion/fixed-dtoa.cc",
    "chars": 15102,
    "preview": "// Copyright 2010 the V8 project authors. All rights reserved.\n// Redistribution and use in source and binary forms, wit"
  },
  {
    "path": "native/iosTest/Pods/DoubleConversion/double-conversion/fixed-dtoa.h",
    "chars": 2770,
    "preview": "// Copyright 2010 the V8 project authors. All rights reserved.\n// Redistribution and use in source and binary forms, wit"
  },
  {
    "path": "native/iosTest/Pods/DoubleConversion/double-conversion/ieee.h",
    "chars": 13526,
    "preview": "// Copyright 2012 the V8 project authors. All rights reserved.\n// Redistribution and use in source and binary forms, wit"
  },
  {
    "path": "native/iosTest/Pods/DoubleConversion/double-conversion/strtod.cc",
    "chars": 21038,
    "preview": "// Copyright 2010 the V8 project authors. All rights reserved.\n// Redistribution and use in source and binary forms, wit"
  },
  {
    "path": "native/iosTest/Pods/DoubleConversion/double-conversion/strtod.h",
    "chars": 2209,
    "preview": "// Copyright 2010 the V8 project authors. All rights reserved.\n// Redistribution and use in source and binary forms, wit"
  },
  {
    "path": "native/iosTest/Pods/DoubleConversion/double-conversion/utils.h",
    "chars": 11211,
    "preview": "// Copyright 2010 the V8 project authors. All rights reserved.\n// Redistribution and use in source and binary forms, wit"
  },
  {
    "path": "native/iosTest/Pods/Local Podspecs/DoubleConversion.podspec.json",
    "chars": 787,
    "preview": "{\n  \"name\": \"DoubleConversion\",\n  \"version\": \"1.1.6\",\n  \"license\": {\n    \"type\": \"MIT\"\n  },\n  \"homepage\": \"https://githu"
  },
  {
    "path": "native/iosTest/Pods/Local Podspecs/FBLazyVector.podspec.json",
    "chars": 400,
    "preview": "{\n  \"name\": \"FBLazyVector\",\n  \"version\": \"0.74.6\",\n  \"summary\": \"-\",\n  \"homepage\": \"https://reactnative.dev/\",\n  \"licens"
  },
  {
    "path": "native/iosTest/Pods/Local Podspecs/RCT-Folly.podspec.json",
    "chars": 3500,
    "preview": "{\n  \"name\": \"RCT-Folly\",\n  \"version\": \"2024.01.01.00\",\n  \"license\": {\n    \"type\": \"Apache License, Version 2.0\"\n  },\n  \""
  },
  {
    "path": "native/iosTest/Pods/Local Podspecs/RCTDeprecation.podspec.json",
    "chars": 700,
    "preview": "{\n  \"name\": \"RCTDeprecation\",\n  \"version\": \"0.74.6\",\n  \"authors\": \"Meta Platforms, Inc. and its affiliates\",\n  \"license\""
  },
  {
    "path": "native/iosTest/Pods/Local Podspecs/RCTRequired.podspec.json",
    "chars": 398,
    "preview": "{\n  \"name\": \"RCTRequired\",\n  \"version\": \"0.74.6\",\n  \"summary\": \"-\",\n  \"homepage\": \"https://reactnative.dev/\",\n  \"license"
  },
  {
    "path": "native/iosTest/Pods/Local Podspecs/RCTTypeSafety.podspec.json",
    "chars": 736,
    "preview": "{\n  \"name\": \"RCTTypeSafety\",\n  \"version\": \"0.74.6\",\n  \"summary\": \"-\",\n  \"homepage\": \"https://reactnative.dev/\",\n  \"licen"
  },
  {
    "path": "native/iosTest/Pods/Local Podspecs/React-Codegen.podspec.json",
    "chars": 2587,
    "preview": "{\n  \"name\": \"React-Codegen\",\n  \"version\": \"0.74.6\",\n  \"summary\": \"Temp pod for generated files for React Native\",\n  \"hom"
  },
  {
    "path": "native/iosTest/Pods/Local Podspecs/React-Core.podspec.json",
    "chars": 5088,
    "preview": "{\n  \"name\": \"React-Core\",\n  \"version\": \"0.74.6\",\n  \"summary\": \"The core of React Native.\",\n  \"homepage\": \"https://reactn"
  },
  {
    "path": "native/iosTest/Pods/Local Podspecs/React-CoreModules.podspec.json",
    "chars": 1990,
    "preview": "{\n  \"name\": \"React-CoreModules\",\n  \"version\": \"0.74.6\",\n  \"summary\": \"-\",\n  \"homepage\": \"https://reactnative.dev/\",\n  \"l"
  },
  {
    "path": "native/iosTest/Pods/Local Podspecs/React-Fabric.podspec.json",
    "chars": 15374,
    "preview": "{\n  \"name\": \"React-Fabric\",\n  \"version\": \"0.74.6\",\n  \"summary\": \"Fabric for React Native.\",\n  \"homepage\": \"https://react"
  },
  {
    "path": "native/iosTest/Pods/Local Podspecs/React-FabricImage.podspec.json",
    "chars": 2360,
    "preview": "{\n  \"name\": \"React-FabricImage\",\n  \"version\": \"0.74.6\",\n  \"summary\": \"Image Component for Fabric for React Native.\",\n  \""
  },
  {
    "path": "native/iosTest/Pods/Local Podspecs/React-ImageManager.podspec.json",
    "chars": 1776,
    "preview": "{\n  \"name\": \"React-ImageManager\",\n  \"version\": \"0.74.6\",\n  \"summary\": \"Fabric for React Native.\",\n  \"homepage\": \"https:/"
  },
  {
    "path": "native/iosTest/Pods/Local Podspecs/React-Mapbuffer.podspec.json",
    "chars": 853,
    "preview": "{\n  \"name\": \"React-Mapbuffer\",\n  \"version\": \"0.74.6\",\n  \"summary\": \"-\",\n  \"homepage\": \"https://reactnative.dev/\",\n  \"lic"
  },
  {
    "path": "native/iosTest/Pods/Local Podspecs/React-NativeModulesApple.podspec.json",
    "chars": 1434,
    "preview": "{\n  \"name\": \"React-NativeModulesApple\",\n  \"module_name\": \"React_NativeModulesApple\",\n  \"header_dir\": \"ReactCommon\",\n  \"v"
  },
  {
    "path": "native/iosTest/Pods/Local Podspecs/React-RCTActionSheet.podspec.json",
    "chars": 691,
    "preview": "{\n  \"name\": \"React-RCTActionSheet\",\n  \"version\": \"0.74.6\",\n  \"summary\": \"An API for displaying iOS action sheets and sha"
  },
  {
    "path": "native/iosTest/Pods/Local Podspecs/React-RCTAnimation.podspec.json",
    "chars": 1696,
    "preview": "{\n  \"name\": \"React-RCTAnimation\",\n  \"version\": \"0.74.6\",\n  \"summary\": \"A native driver for the Animated API.\",\n  \"homepa"
  },
  {
    "path": "native/iosTest/Pods/Local Podspecs/React-RCTAppDelegate.podspec.json",
    "chars": 3757,
    "preview": "{\n  \"name\": \"React-RCTAppDelegate\",\n  \"version\": \"0.74.6\",\n  \"summary\": \"An utility library to simplify common operation"
  },
  {
    "path": "native/iosTest/Pods/Local Podspecs/React-RCTBlob.podspec.json",
    "chars": 1951,
    "preview": "{\n  \"name\": \"React-RCTBlob\",\n  \"version\": \"0.74.6\",\n  \"summary\": \"An API for displaying iOS action sheets and share shee"
  },
  {
    "path": "native/iosTest/Pods/Local Podspecs/React-RCTFabric.podspec.json",
    "chars": 3914,
    "preview": "{\n  \"name\": \"React-RCTFabric\",\n  \"version\": \"0.74.6\",\n  \"summary\": \"RCTFabric for React Native.\",\n  \"homepage\": \"https:/"
  },
  {
    "path": "native/iosTest/Pods/Local Podspecs/React-RCTImage.podspec.json",
    "chars": 1747,
    "preview": "{\n  \"name\": \"React-RCTImage\",\n  \"version\": \"0.74.6\",\n  \"summary\": \"A React component for displaying different types of i"
  },
  {
    "path": "native/iosTest/Pods/Local Podspecs/React-RCTLinking.podspec.json",
    "chars": 1918,
    "preview": "{\n  \"name\": \"React-RCTLinking\",\n  \"version\": \"0.74.6\",\n  \"summary\": \"A general interface to interact with both incoming "
  },
  {
    "path": "native/iosTest/Pods/Local Podspecs/React-RCTNetwork.podspec.json",
    "chars": 1849,
    "preview": "{\n  \"name\": \"React-RCTNetwork\",\n  \"version\": \"0.74.6\",\n  \"summary\": \"The networking library of React Native.\",\n  \"homepa"
  },
  {
    "path": "native/iosTest/Pods/Local Podspecs/React-RCTSettings.podspec.json",
    "chars": 1920,
    "preview": "{\n  \"name\": \"React-RCTSettings\",\n  \"version\": \"0.74.6\",\n  \"summary\": \"A wrapper for NSUserDefaults, a persistent key-val"
  },
  {
    "path": "native/iosTest/Pods/Local Podspecs/React-RCTText.podspec.json",
    "chars": 794,
    "preview": "{\n  \"name\": \"React-RCTText\",\n  \"version\": \"0.74.6\",\n  \"summary\": \"A React component for displaying text.\",\n  \"homepage\":"
  },
  {
    "path": "native/iosTest/Pods/Local Podspecs/React-RCTVibration.podspec.json",
    "chars": 1780,
    "preview": "{\n  \"name\": \"React-RCTVibration\",\n  \"version\": \"0.74.6\",\n  \"summary\": \"An API for controlling the vibration hardware of "
  },
  {
    "path": "native/iosTest/Pods/Local Podspecs/React-RuntimeApple.podspec.json",
    "chars": 1643,
    "preview": "{\n  \"name\": \"React-RuntimeApple\",\n  \"version\": \"0.74.6\",\n  \"summary\": \"The React Native Runtime.\",\n  \"homepage\": \"https:"
  },
  {
    "path": "native/iosTest/Pods/Local Podspecs/React-RuntimeCore.podspec.json",
    "chars": 1429,
    "preview": "{\n  \"name\": \"React-RuntimeCore\",\n  \"version\": \"0.74.6\",\n  \"summary\": \"The React Native Runtime.\",\n  \"homepage\": \"https:/"
  },
  {
    "path": "native/iosTest/Pods/Local Podspecs/React-RuntimeHermes.podspec.json",
    "chars": 1357,
    "preview": "{\n  \"name\": \"React-RuntimeHermes\",\n  \"version\": \"0.74.6\",\n  \"summary\": \"The React Native Runtime.\",\n  \"homepage\": \"https"
  },
  {
    "path": "native/iosTest/Pods/Local Podspecs/React-callinvoker.podspec.json",
    "chars": 397,
    "preview": "{\n  \"name\": \"React-callinvoker\",\n  \"version\": \"0.74.6\",\n  \"summary\": \"-\",\n  \"homepage\": \"https://reactnative.dev/\",\n  \"l"
  }
]

// ... and 887 more files (download for full content)

About this extraction

This page contains the full source code of the Nozbe/WatermelonDB GitHub repository, extracted and formatted as plain text for AI agents and large language models (LLMs). The extraction includes 1087 files (5.6 MB), approximately 1.5M tokens, and a symbol index with 1296 extracted functions, classes, methods, constants, and types. Use this with OpenClaw, Claude, ChatGPT, Cursor, Windsurf, or any other AI tool that accepts text input. You can copy the full output to your clipboard or download it as a .txt file.

Extracted by GitExtract — free GitHub repo to text converter for AI. Built by Nikandr Surkov.

Copied to clipboard!