{"_id":"expo-lite-data-store","_rev":"30-02df3eec9ac1ed4a4adf239c28425dfa","name":"expo-lite-data-store","dist-tags":{"beta":"2.0.0-beta.5","latest":"4.0.0"},"versions":{"2.0.0-beta.2":{"name":"expo-lite-data-store","version":"2.0.0-beta.2","keywords":["expo","data store","lite","data","storage","react-native"],"author":{"name":"QinIndexCode"},"license":"MIT","_id":"expo-lite-data-store@2.0.0-beta.2","maintainers":[{"name":"qinindexcode","email":"qinindexcode@gmail.com"}],"dist":{"shasum":"55bed4b86382b32cd8849ec7d9f2d3d3dff4a252","tarball":"https://registry.npmjs.org/expo-lite-data-store/-/expo-lite-data-store-2.0.0-beta.2.tgz","fileCount":128,"integrity":"sha512-TxyS+CpMkyNXhtXkuC47SQNcIbE/0wYOGH5HAkd2guVIrgIFLIHGdZHvaBceYL4+Fv2SRBncv5b5wTr68zc6RQ==","signatures":[{"sig":"MEYCIQC97zB1I4yPJFKTsxZT1dW8hS1YF/bbZUMdMHuG7GHLJQIhAKAc66BziDdCmtah8daKsZESkQFvL5S5XM3voGEV/wCO","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":637083},"main":"dist/js/index.js","types":"dist/types/index.d.ts","exports":{".":{"types":"./dist/types/index.d.ts","import":"./dist/js/index.js","require":"./dist/js/index.js"},"./js":{"types":"./dist/types/index.d.ts","import":"./dist/js/index.js","require":"./dist/js/index.js"}},"gitHead":"d8a92d71b32a769c2d82b5ba730a4f8fed97a109","private":false,"_npmUser":{"name":"qinindexcode","email":"qinindexcode@gmail.com"},"_npmVersion":"11.7.0","description":"A lite data store for Expo; \n Detail in https://github.com/QinIndexCode/expo-lite-data-store","directories":{},"_nodeVersion":"24.10.0","dependencies":{"bcryptjs":"^3.0.3","crypto-es":"^3.1.2","expo-crypto":"~15.0.7","expo-file-system":"~18.0.7","expo-secure-store":"~15.0.7"},"_hasShrinkwrap":false,"versionDescription":"Major release with enhanced encryption, improved field-level encryption logic, and various performance optimizations.","_npmOperationalInternal":{"tmp":"tmp/expo-lite-data-store_2.0.0-beta.2_1766367441668_0.9209496976308349","host":"s3://npm-registry-packages-npm-production"}},"2.0.0-beta.3":{"name":"expo-lite-data-store","version":"2.0.0-beta.3","keywords":["expo","data store","lite","data","storage","react-native"],"author":{"name":"QinIndexCode"},"license":"MIT","_id":"expo-lite-data-store@2.0.0-beta.3","maintainers":[{"name":"qinindexcode","email":"qinindexcode@gmail.com"}],"dist":{"shasum":"97fc58cd596254c35810a24cafd2448890fdb895","tarball":"https://registry.npmjs.org/expo-lite-data-store/-/expo-lite-data-store-2.0.0-beta.3.tgz","fileCount":195,"integrity":"sha512-fC50iTtbDRsgUR3Ghc+zsc1DhEF2/YrVRRGUkTNT/iQsyNfHxgHyeyVABQGs6lEpBbxOJefirAcyLro/GCOmAA==","signatures":[{"sig":"MEUCIQDk1On+1lW9ecvtPOwT4AO/bwFE50GAnC/GXA0S4AmEeAIgZQMY4DZMBAo/Tg7+pBd469DR8lWwyiPalrqYNX5WQGA=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":1345486},"main":"dist/cjs/index.js","types":"dist/types/index.d.ts","exports":{".":{"types":"./dist/types/index.d.ts","import":"./dist/js/index.js","require":"./dist/cjs/index.js"},"./js":{"types":"./dist/types/index.d.ts","import":"./dist/js/index.js","require":"./dist/cjs/index.js"},"./cjs":{"types":"./dist/types/index.d.ts","import":"./dist/cjs/index.js","require":"./dist/cjs/index.js"},"./utils/*":{"import":"./dist/js/utils/*","require":"./dist/cjs/utils/*"},"./dist/js/*":{"import":"./dist/js/*","require":"./dist/cjs/*"},"./dist/cjs/*":{"import":"./dist/cjs/*","require":"./dist/cjs/*"}},"gitHead":"7007e9f68409b376e88a75e6f15af3dc7464444e","private":false,"scripts":{"lint":"eslint . --ext .ts,.tsx --ignore-pattern '.tsbuildinfo*'","test":"jest --config jest.simple.config.cjs --testPathIgnorePatterns=crypto-security-assessment --testPathIgnorePatterns=performance-optimization --testPathIgnorePatterns=api.stress","build":"npm run build:all","clean":"rimraf dist","format":"prettier --write . --ignore-path .prettierignore","prepare":"npm run build","build:js":"tsc -p tsconfig.js.json","lint:fix":"eslint . --ext .ts,.tsx --fix --ignore-pattern '.tsbuildinfo*'","test:all":"npm run test:core && npm run test:api && npm run test:utils && npm run test:simple && npm run test:crypto && npm run test:performance","test:api":"jest --config jest.simple.config.cjs --testPathPatterns=api --testPathIgnorePatterns=api.stress","build:all":"rimraf dist && npm run build:js && npm run build:cjs && npm run build:types && del /f /q .tsbuildinfo .tsbuildinfo.esm .tsbuildinfo.cjs 2>nul && npm run lint","build:cjs":"tsc -p tsconfig.cjs.json","test:core":"jest --config jest.simple.config.cjs --testPathIgnorePatterns=crypto-security-assessment --testPathIgnorePatterns=performance-optimization --testMatch=**/src/core/**/__tests__/**/*.test.ts","typecheck":"tsc --noEmit","test:cache":"jest --config jest.simple.config.cjs --testMatch=**/src/core/cache/__tests__/**/*.test.ts","test:utils":"jest --config jest.simple.config.cjs --testMatch=**/src/utils/**/__tests__/**/*.test.ts","test:watch":"jest --config jest.simple.config.cjs --watch --testPathIgnorePatterns=crypto-security-assessment --testPathIgnorePatterns=performance-optimization","build:types":"tsc -p tsconfig.types.json","test:crypto":"jest --config jest.crypto.config.cjs","test:simple":"jest --config jest.simple.config.cjs --testMatch=**/src/__tests__/unit/simple.test.ts","test:stress":"jest --config jest.simple.config.cjs --testMatch=**/api.stress.test.ts","format:check":"prettier --check . --ignore-path .prettierignore","publish:safe":"npm run build && npm run typecheck && npm publish","publish:force":"npm publish --ignore-scripts","test:coverage":"jest --config jest.simple.config.cjs --coverage --testPathIgnorePatterns=crypto-security-assessment,performance-optimization","prepublishOnly":"npm run build:all && npm run typecheck","test:performance":"jest --config jest.performance.config.cjs --passWithNoTests","test:coverage:unit":"jest --config jest.simple.config.cjs --coverage --testPathIgnorePatterns=crypto-security-assessment,performance-optimization --testPathPatterns=src/__tests__/unit/"},"_npmUser":{"name":"qinindexcode","email":"qinindexcode@gmail.com"},"_npmVersion":"11.7.0","description":"A lite data store for Expo; Detail in https://github.com/QinIndexCode/expo-lite-data-store. **Note:** All scripts in this package.json are for development purposes only and may not work in production environments.","directories":{},"_nodeVersion":"24.10.0","dependencies":{"bcryptjs":"^2.4.3","expo-crypto":"~15.0.8","@noble/hashes":"^1.8.0","@noble/ciphers":"^0.6.0","expo-constants":"~18.0.12","expo-file-system":"~18.1.11","expo-secure-store":"~15.0.8","react-native-quick-crypto":"^1.0.7"},"_hasShrinkwrap":false,"readmeFilename":"README.zh-CN.md","devDependencies":{"expo":"~54.0.23","jest":"^29.7.0","jiti":"^2.6.1","react":"19.1.0","eslint":"^9.39.1","rimraf":"^6.1.2","globals":"^16.5.0","ts-jest":"^29.4.5","prettier":"^3.3.3","@eslint/js":"^9.39.1","typescript":"~5.9.2","@types/jest":"^29.5.0","@types/node":"^24.10.1","@types/react":"^19.0.0","react-native":"0.81.5","@types/bcryptjs":"^2.4.6","typescript-eslint":"^8.48.1","eslint-plugin-react":"^7.37.5","eslint-config-prettier":"^9.1.0","eslint-plugin-prettier":"^5.2.1","@typescript-eslint/parser":"^8.48.1","eslint-plugin-react-hooks":"^7.0.1","@typescript-eslint/eslint-plugin":"^8.48.1"},"versionDescription":"Major release with enhanced encryption, improved field-level encryption logic, and various performance optimizations.","_npmOperationalInternal":{"tmp":"tmp/expo-lite-data-store_2.0.0-beta.3_1769861837389_0.8426470777926165","host":"s3://npm-registry-packages-npm-production"}},"2.0.0-beta.5":{"name":"expo-lite-data-store","version":"2.0.0-beta.5","keywords":["expo","data store","lite","data","storage","react-native"],"author":{"name":"QinIndexCode"},"license":"MIT","_id":"expo-lite-data-store@2.0.0-beta.5","maintainers":[{"name":"qinindexcode","email":"qinindexcode@gmail.com"}],"dist":{"shasum":"eedb9be31b40e1ca9b97ff919e36ce77021f502a","tarball":"https://registry.npmjs.org/expo-lite-data-store/-/expo-lite-data-store-2.0.0-beta.5.tgz","fileCount":190,"integrity":"sha512-kWRCuKPxyb5koyE3NFg8q9a5bsdNyYNw1jWoBbz4XLQDbIfAiP0NmwiUhCikflQ30T1MmtVUs7gCTC+JNLXexQ==","signatures":[{"sig":"MEYCIQD7o6xhe/sD0em117+giWsCNYzFYEMgrhUaSo6vhYuPbgIhAMmR/uhr3kAlJepMcbwLnBCHl0iwGndHCuZvxIpY7j8N","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":1304580},"main":"dist/cjs/index.js","types":"dist/types/index.d.ts","exports":{".":{"types":"./dist/types/index.d.ts","import":"./dist/js/index.js","require":"./dist/cjs/index.js"},"./js":{"types":"./dist/types/index.d.ts","import":"./dist/js/index.js","require":"./dist/cjs/index.js"},"./cjs":{"types":"./dist/types/index.d.ts","import":"./dist/cjs/index.js","require":"./dist/cjs/index.js"},"./utils/*":{"import":"./dist/js/utils/*","require":"./dist/cjs/utils/*"},"./dist/js/*":{"import":"./dist/js/*","require":"./dist/cjs/*"},"./dist/cjs/*":{"import":"./dist/cjs/*","require":"./dist/cjs/*"}},"gitHead":"584bda3eb32ff25ba8ad87c7ef0b37b304651b88","private":false,"scripts":{"lint":"eslint . --ext .ts,.tsx --ignore-pattern '.tsbuildinfo*'","test":"jest --config jest.simple.config.cjs --testPathIgnorePatterns=crypto-security-assessment --testPathIgnorePatterns=performance-optimization --testPathIgnorePatterns=api.stress","build":"npm run build:all","clean":"rimraf dist","format":"prettier --write . --ignore-path .prettierignore","prepare":"npm run build","build:js":"tsc -p tsconfig.js.json","lint:fix":"eslint . --ext .ts,.tsx --fix --ignore-pattern '.tsbuildinfo*'","test:all":"npm run test:core && npm run test:api && npm run test:utils && npm run test:simple && npm run test:crypto && npm run test:performance","test:api":"jest --config jest.simple.config.cjs --testPathPatterns=api --testPathIgnorePatterns=api.stress","build:all":"rimraf dist && npm run build:js && npm run build:cjs && npm run build:types && rimraf .tsbuildinfo .tsbuildinfo.esm .tsbuildinfo.cjs && npm run lint","build:cjs":"tsc -p tsconfig.cjs.json","test:core":"jest --config jest.simple.config.cjs --testPathIgnorePatterns=crypto-security-assessment --testPathIgnorePatterns=performance-optimization --testMatch=**/src/core/**/__tests__/**/*.test.ts","typecheck":"tsc --noEmit","test:cache":"jest --config jest.simple.config.cjs --testMatch=**/src/core/cache/__tests__/**/*.test.ts","test:utils":"jest --config jest.simple.config.cjs --testMatch=**/src/utils/**/__tests__/**/*.test.ts","test:watch":"jest --config jest.simple.config.cjs --watch --testPathIgnorePatterns=crypto-security-assessment --testPathIgnorePatterns=performance-optimization","build:types":"tsc -p tsconfig.types.json","test:crypto":"jest --config jest.crypto.config.cjs","test:simple":"jest --config jest.simple.config.cjs --testMatch=**/src/__tests__/unit/simple.test.ts","test:stress":"jest --config jest.simple.config.cjs --testMatch=**/api.stress.test.ts","format:check":"prettier --check . --ignore-path .prettierignore","publish:safe":"npm run build && npm run typecheck && npm publish","publish:force":"npm publish --ignore-scripts","test:coverage":"jest --config jest.simple.config.cjs --coverage --testPathIgnorePatterns=crypto-security-assessment,performance-optimization","prepublishOnly":"npm run build:all && npm run typecheck","test:performance":"jest --config jest.performance.config.cjs --passWithNoTests","test:coverage:unit":"jest --config jest.simple.config.cjs --coverage --testPathIgnorePatterns=crypto-security-assessment,performance-optimization --testPathPatterns=src/__tests__/unit/"},"_npmUser":{"name":"qinindexcode","email":"qinindexcode@gmail.com"},"_npmVersion":"11.10.1","description":"A lite data store for Expo; Detail in https://github.com/QinIndexCode/expo-lite-data-store. **Note:** All scripts in this package.json are for development purposes only and may not work in production environments.","directories":{},"_nodeVersion":"25.6.1","dependencies":{"bcryptjs":"~2.4.3","expo-crypto":"~15.0.8","@noble/hashes":"~1.8.0","@noble/ciphers":"~0.6.0","expo-constants":"~18.0.12","expo-file-system":"~18.1.11","expo-secure-store":"~15.0.8"},"_hasShrinkwrap":false,"readmeFilename":"README.zh-CN.md","peerDependencies":{"expo":">=50.0.0","react":">=18.0.0","react-native":">=0.73.0","react-native-quick-crypto":">=1.0.0"},"versionDescription":"Major release with enhanced encryption, improved field-level encryption logic, and various performance optimizations.","peerDependenciesMeta":{"expo":{"optional":false},"react":{"optional":false},"react-native":{"optional":false},"react-native-quick-crypto":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/expo-lite-data-store_2.0.0-beta.5_1775288708982_0.2283452617853099","host":"s3://npm-registry-packages-npm-production"}},"2.0.0":{"name":"expo-lite-data-store","version":"2.0.0","keywords":["expo","data store","lite","data","storage","react-native"],"author":{"name":"QinIndexCode"},"license":"MIT","_id":"expo-lite-data-store@2.0.0","maintainers":[{"name":"qinindexcode","email":"qinindexcode@gmail.com"}],"homepage":"https://github.com/QinIndexCode/expo-lite-data-store#readme","bugs":{"url":"https://github.com/QinIndexCode/expo-lite-data-store/issues"},"dist":{"shasum":"56e06cac7645d1bb6c5d8f43b3188e2d3cb2c234","tarball":"https://registry.npmjs.org/expo-lite-data-store/-/expo-lite-data-store-2.0.0.tgz","fileCount":212,"integrity":"sha512-4sMUvSOBifh0ue65/GhuIglqGFm8S1uMGbSbSOAjsCQlkkFq9j/ufk6yIDMSf844EYTO+tzHg595faA45bvrSA==","signatures":[{"sig":"MEYCIQCnnnVd81As7sLkXkodF5JSxbhAVzTm/p4yS58bRB4chgIhALH6p3goJ5FoYlqH1+62AuZolVq5f11Ny5XsS5jtAyID","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":1493332},"main":"dist/cjs/index.js","types":"dist/types/index.d.ts","exports":{".":{"types":"./dist/types/index.d.ts","import":"./dist/js/index.js","require":"./dist/cjs/index.js"},"./js":{"types":"./dist/types/index.d.ts","import":"./dist/js/index.js","require":"./dist/cjs/index.js"},"./cjs":{"types":"./dist/types/index.d.ts","import":"./dist/cjs/index.js","require":"./dist/cjs/index.js"},"./utils/*":{"types":"./dist/types/utils/*.d.ts","import":"./dist/js/utils/*.js","require":"./dist/cjs/utils/*.js"},"./dist/js/*":{"import":"./dist/js/*","require":"./dist/cjs/*"},"./dist/cjs/*":{"import":"./dist/cjs/*","require":"./dist/cjs/*"}},"gitHead":"aadd41846e24bfcc2c36d696f96329555f2a4acf","private":false,"scripts":{"lint":"eslint . --ext .ts,.tsx --ignore-pattern '.tsbuildinfo*'","test":"jest --config jest.simple.config.cjs --testPathIgnorePatterns=crypto-security-assessment --testPathIgnorePatterns=performance-optimization --testPathIgnorePatterns=api.stress","build":"npm run build:all","clean":"rimraf dist","format":"prettier --write . --ignore-path .prettierignore","prepare":"npm run build","build:js":"tsc -p tsconfig.js.json","lint:fix":"eslint . --ext .ts,.tsx --fix --ignore-pattern '.tsbuildinfo*'","test:all":"npm run test:core && npm run test:api && npm run test:utils && npm run test:simple && npm run test:crypto && npm run test:performance","test:api":"jest --config jest.simple.config.cjs --testPathPatterns=api --testPathIgnorePatterns=api.stress","build:all":"rimraf dist && npm run build:js && npm run build:cjs && npm run build:types && rimraf .tsbuildinfo .tsbuildinfo.esm .tsbuildinfo.cjs && npm run lint","build:cjs":"tsc -p tsconfig.cjs.json","test:core":"jest --config jest.simple.config.cjs --testPathIgnorePatterns=crypto-security-assessment --testPathIgnorePatterns=performance-optimization --testMatch=**/src/core/**/__tests__/**/*.test.ts","typecheck":"tsc --noEmit","qa:expo-go":"node ./scripts/expo-runtime-qa.cjs --layers=contract,runtime","test:cache":"jest --config jest.simple.config.cjs --testMatch=**/src/core/cache/__tests__/**/*.test.ts","test:utils":"jest --config jest.simple.config.cjs --testMatch=**/src/utils/**/__tests__/**/*.test.ts","test:watch":"jest --config jest.simple.config.cjs --watch --testPathIgnorePatterns=crypto-security-assessment --testPathIgnorePatterns=performance-optimization","build:types":"tsc -p tsconfig.types.json","test:crypto":"jest --config jest.crypto.config.cjs","test:simple":"jest --config jest.simple.config.cjs --testMatch=**/src/__tests__/unit/simple.test.ts","test:stress":"jest --config jest.simple.config.cjs --testMatch=**/api.stress.test.ts","format:check":"prettier --check . --ignore-path .prettierignore","publish:safe":"npm run build && npm run typecheck && npm publish","publish:force":"npm publish --ignore-scripts","test:coverage":"jest --config jest.simple.config.cjs --coverage --testPathIgnorePatterns=crypto-security-assessment,performance-optimization","prepublishOnly":"npm run build:all && npm run typecheck && npm run smoke:expo-consumer","qa:expo-go:full":"node ./scripts/expo-runtime-qa.cjs --layers=contract,runtime,soak --soak-minutes=30","qa:expo-go:mumu":"node ./scripts/mumu-expo-qa.cjs run-qa --repo . --layers contract,runtime --channels single-package,managed-compatible --cleanup-consumers","test:performance":"jest --config jest.performance.config.cjs --passWithNoTests","qa:flagship:native":"node ./scripts/mumu-expo-qa.cjs run-qa --repo . --layers contract,runtime --channels managed-compatible --cleanup-consumers --extra-arg=--profiles=native-quick-crypto","test:coverage:unit":"jest --config jest.simple.config.cjs --coverage --testPathIgnorePatterns=crypto-security-assessment,performance-optimization --testPathPatterns=src/__tests__/unit/","qa:baseline:expo-go":"npm run qa:expo-go:mumu","qa:baseline:release":"npm run qa:baseline:expo-go && npm run qa:baseline:native-flagship","qa:expo-go:contract":"node ./scripts/expo-runtime-qa.cjs --layers=contract","smoke:expo-consumer":"node ./scripts/smoke-expo-consumer.cjs","qa:expo-go:mumu:full":"node ./scripts/mumu-expo-qa.cjs run-qa --repo . --layers contract,runtime,soak --channels single-package,managed-compatible --soak-minutes 30 --cleanup-consumers","qa:baseline:native-flagship":"npm run qa:flagship:native"},"_npmUser":{"name":"qinindexcode","email":"qinindexcode@gmail.com"},"repository":{"url":"git+https://github.com/QinIndexCode/expo-lite-data-store.git","type":"git"},"_npmVersion":"11.10.1","description":"Local structured storage for Expo applications with runtime-tested Expo Go and native support.","directories":{},"_nodeVersion":"25.6.1","dependencies":{"bcryptjs":"~2.4.3","crypto-js":"^4.2.0","@noble/ciphers":"~0.6.0"},"_hasShrinkwrap":false,"devDependencies":{"expo":"~54.0.33","jest":"^29.7.0","jiti":"^2.6.1","react":"19.1.0","eslint":"^9.39.1","rimraf":"^6.1.2","globals":"^16.5.0","ts-jest":"^29.4.5","prettier":"^3.3.3","@eslint/js":"^9.39.1","typescript":"~5.9.2","@types/jest":"^29.5.0","@types/node":"^24.10.1","expo-crypto":"~15.0.8","@types/react":"~19.1.10","react-native":"0.81.5","expo-constants":"~18.0.13","@types/bcryptjs":"^2.4.6","@types/crypto-js":"^4.2.2","expo-file-system":"~19.0.21","babel-preset-expo":"~54.0.7","expo-secure-store":"~15.0.8","typescript-eslint":"^8.48.1","eslint-plugin-react":"^7.37.5","eslint-config-prettier":"^9.1.0","eslint-plugin-prettier":"^5.2.1","@typescript-eslint/parser":"^8.48.1","eslint-plugin-react-hooks":"^7.0.1","@typescript-eslint/eslint-plugin":"^8.48.1","@babel/plugin-transform-modules-commonjs":"^7.27.1"},"peerDependencies":{"expo":">=54 <55","react":">=19.1.0 <20","expo-crypto":"~15.0.8","react-native":">=0.81.0 <0.82","expo-constants":"~18.0.13","expo-file-system":"~19.0.21","expo-secure-store":"~15.0.8","react-native-quick-crypto":">=1.0.0"},"peerDependenciesMeta":{"expo":{"optional":false},"react":{"optional":false},"expo-crypto":{"optional":false},"react-native":{"optional":false},"expo-constants":{"optional":false},"expo-file-system":{"optional":false},"expo-secure-store":{"optional":false},"react-native-quick-crypto":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/expo-lite-data-store_2.0.0_1777346123262_0.8525759654892999","host":"s3://npm-registry-packages-npm-production"}},"2.0.1":{"name":"expo-lite-data-store","version":"2.0.1","keywords":["expo","data store","lite","data","storage","react-native"],"author":{"name":"QinIndexCode"},"license":"MIT","_id":"expo-lite-data-store@2.0.1","maintainers":[{"name":"qinindexcode","email":"qinindexcode@gmail.com"}],"homepage":"https://github.com/QinIndexCode/expo-lite-data-store#readme","bugs":{"url":"https://github.com/QinIndexCode/expo-lite-data-store/issues"},"dist":{"shasum":"8f1c939f52e1d2907328dcbe6d3a43cc52240989","tarball":"https://registry.npmjs.org/expo-lite-data-store/-/expo-lite-data-store-2.0.1.tgz","fileCount":216,"integrity":"sha512-eRKnUoHc1x0UfQJB1aOtDPiVjFmRgGkZhjKqH4J0gnaJzGQv2zDmESPbUmODjfWmqerttHqc6xL36PM7E0DBAw==","signatures":[{"sig":"MEUCIFHiPs63fBTdviHP9WopAfDi7ggEfi698bEBAXFb1KVsAiEA1EwiMQxSvKM9RZFY1fMCIpv66K7We41h9alXdmnukoY=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":1526951},"main":"dist/cjs/index.js","types":"dist/types/index.d.ts","exports":{".":{"types":"./dist/types/index.d.ts","import":"./dist/js/index.js","require":"./dist/cjs/index.js"},"./js":{"types":"./dist/types/index.d.ts","import":"./dist/js/index.js","require":"./dist/cjs/index.js"},"./cjs":{"types":"./dist/types/index.d.ts","import":"./dist/cjs/index.js","require":"./dist/cjs/index.js"},"./utils/*":{"types":"./dist/types/utils/*.d.ts","import":"./dist/js/utils/*.js","require":"./dist/cjs/utils/*.js"},"./dist/js/*":{"import":"./dist/js/*","require":"./dist/cjs/*"},"./dist/cjs/*":{"import":"./dist/cjs/*","require":"./dist/cjs/*"}},"gitHead":"5aeadf48a568649581e024c0703507cd37e56cfb","private":false,"scripts":{"lint":"eslint . --ext .ts,.tsx --ignore-pattern '.tsbuildinfo*'","test":"jest --config jest.simple.config.cjs --testPathIgnorePatterns=crypto-security-assessment --testPathIgnorePatterns=performance-optimization --testPathIgnorePatterns=api.stress","build":"npm run build:all","clean":"rimraf dist","format":"prettier --write . --ignore-path .prettierignore","prepare":"npm run build","build:js":"tsc -p tsconfig.js.json","lint:fix":"eslint . --ext .ts,.tsx --fix --ignore-pattern '.tsbuildinfo*'","test:all":"npm run test:core && npm run test:api && npm run test:stress && npm run test:utils && npm run test:simple && npm run test:crypto && npm run test:performance","test:api":"jest --config jest.simple.config.cjs --testPathPatterns=api --testPathIgnorePatterns=api.stress","build:all":"rimraf dist && npm run build:js && npm run write:esm-package && npm run patch:esm-extensions && npm run build:cjs && npm run build:types && rimraf .tsbuildinfo .tsbuildinfo.esm .tsbuildinfo.cjs && npm run lint","build:cjs":"tsc -p tsconfig.cjs.json","test:core":"jest --config jest.simple.config.cjs --testPathIgnorePatterns=crypto-security-assessment --testPathIgnorePatterns=performance-optimization --testMatch=**/src/core/**/__tests__/**/*.test.ts","typecheck":"tsc --noEmit","audit:prod":"npm audit --omit=dev","qa:expo-go":"node ./scripts/expo-runtime-qa.cjs --layers=contract,runtime","test:cache":"jest --config jest.simple.config.cjs --testMatch=**/src/core/cache/__tests__/**/*.test.ts","test:utils":"jest --config jest.simple.config.cjs --testMatch=**/src/utils/**/__tests__/**/*.test.ts","test:watch":"jest --config jest.simple.config.cjs --watch --testPathIgnorePatterns=crypto-security-assessment --testPathIgnorePatterns=performance-optimization","build:types":"tsc -p tsconfig.types.json","test:crypto":"jest --config jest.crypto.config.cjs","test:simple":"jest --config jest.simple.config.cjs --testMatch=**/src/__tests__/unit/simple.test.ts","test:stress":"jest --config jest.simple.config.cjs --testMatch=**/api.stress.test.ts","format:check":"prettier --check . --ignore-path .prettierignore","publish:safe":"npm run build && npm run typecheck && npm publish","audit:no-high":"npm audit --audit-level=high","publish:force":"npm publish --ignore-scripts","test:coverage":"jest --config jest.simple.config.cjs --coverage --testPathIgnorePatterns=crypto-security-assessment,performance-optimization","prepublishOnly":"npm run audit:prod && npm run audit:no-high && npm run test:all && npm run build:all && npm run typecheck && npm run smoke:expo-consumer","qa:expo-go:full":"node ./scripts/expo-runtime-qa.cjs --layers=contract,runtime,soak --soak-minutes=30","qa:expo-go:mumu":"node ./scripts/mumu-expo-qa.cjs run-qa --repo . --layers contract,runtime --channels single-package,managed-compatible --cleanup-consumers","test:performance":"jest --config jest.performance.config.cjs","write:esm-package":"node ./scripts/write-esm-package.cjs","qa:flagship:native":"node ./scripts/mumu-expo-qa.cjs run-qa --repo . --layers contract,runtime --channels managed-compatible --cleanup-consumers --extra-arg=--profiles=native-quick-crypto","test:coverage:unit":"jest --config jest.simple.config.cjs --coverage --testPathIgnorePatterns=crypto-security-assessment,performance-optimization --testPathPatterns=src/__tests__/unit/","qa:baseline:expo-go":"npm run qa:expo-go:mumu","qa:baseline:release":"npm run qa:baseline:expo-go && npm run qa:baseline:native-flagship","qa:expo-go:contract":"node ./scripts/expo-runtime-qa.cjs --layers=contract","smoke:expo-consumer":"node ./scripts/smoke-expo-consumer.cjs","patch:esm-extensions":"node ./scripts/patch-esm-extensions.cjs","qa:expo-go:mumu:full":"node ./scripts/mumu-expo-qa.cjs run-qa --repo . --layers contract,runtime,soak --channels single-package,managed-compatible --soak-minutes 30 --cleanup-consumers","qa:baseline:native-flagship":"npm run qa:flagship:native"},"_npmUser":{"name":"qinindexcode","email":"qinindexcode@gmail.com"},"repository":{"url":"git+https://github.com/QinIndexCode/expo-lite-data-store.git","type":"git"},"_npmVersion":"11.10.1","description":"Local structured storage for Expo applications with runtime-tested Expo Go and native support.","directories":{},"_nodeVersion":"25.6.1","dependencies":{"bcryptjs":"~2.4.3","crypto-js":"^4.2.0","@noble/ciphers":"~0.6.0"},"_hasShrinkwrap":false,"devDependencies":{"expo":"~56.0.12","jest":"^29.7.0","jiti":"^2.7.0","react":"19.2.3","eslint":"^9.39.4","rimraf":"^6.1.3","globals":"^16.5.0","ts-jest":"^29.4.11","prettier":"^3.8.4","@eslint/js":"^9.39.4","typescript":"~6.0.3","@types/jest":"^29.5.0","@types/node":"^24.13.2","expo-crypto":"~56.0.4","@types/react":"~19.2.14","react-native":"0.85.3","expo-constants":"~56.0.18","@types/bcryptjs":"^2.4.6","@types/crypto-js":"^4.2.2","expo-file-system":"~56.0.8","babel-preset-expo":"~56.0.15","expo-secure-store":"~56.0.4","typescript-eslint":"^8.61.0","eslint-plugin-react":"^7.37.5","eslint-config-prettier":"^9.1.0","eslint-plugin-prettier":"^5.5.6","@typescript-eslint/parser":"^8.61.0","eslint-plugin-react-hooks":"^7.1.1","@typescript-eslint/eslint-plugin":"^8.61.0","@babel/plugin-transform-modules-commonjs":"^7.29.7"},"peerDependencies":{"expo":">=56 <57","react":">=19.2.0 <20","expo-crypto":"~56.0.4","react-native":">=0.85.0 <0.86","expo-constants":"~56.0.18","expo-file-system":"~56.0.8","expo-secure-store":"~56.0.4","react-native-quick-crypto":">=1.0.0"},"peerDependenciesMeta":{"expo":{"optional":false},"react":{"optional":false},"expo-crypto":{"optional":false},"react-native":{"optional":false},"expo-constants":{"optional":false},"expo-file-system":{"optional":false},"expo-secure-store":{"optional":false},"react-native-quick-crypto":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/expo-lite-data-store_2.0.1_1781610002861_0.9821706269564736","host":"s3://npm-registry-packages-npm-production"}},"2.0.2":{"name":"expo-lite-data-store","version":"2.0.2","keywords":["expo","data store","lite","data","storage","react-native"],"author":{"name":"QinIndexCode"},"license":"MIT","_id":"expo-lite-data-store@2.0.2","maintainers":[{"name":"qinindexcode","email":"qinindexcode@gmail.com"}],"homepage":"https://github.com/QinIndexCode/expo-lite-data-store#readme","bugs":{"url":"https://github.com/QinIndexCode/expo-lite-data-store/issues"},"dist":{"shasum":"e86d55b97c188617f90159981dd5e7dd43b753b9","tarball":"https://registry.npmjs.org/expo-lite-data-store/-/expo-lite-data-store-2.0.2.tgz","fileCount":219,"integrity":"sha512-IGEvAoC6Sm/J2/3S8VQRMF6Tfz5KBubFfICJv/LMNyHdWnMPuHnE1xDMlYOWLuswaJ+KO/tODW+RK12DRrCwtQ==","signatures":[{"sig":"MEQCIDYS1XYXuxYdqtixPY9273y9sGi8ZLG0uoTBAuQ+7P2qAiBXBXfPzSxPDHTugtrYSq224xdq7uNR+wyUwLf0Vrd5YQ==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/expo-lite-data-store@2.0.2","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":1588389},"main":"dist/cjs/index.js","types":"dist/types/index.d.ts","exports":{".":{"types":"./dist/types/index.d.ts","import":"./dist/js/index.js","require":"./dist/cjs/index.js"},"./js":{"types":"./dist/types/index.d.ts","import":"./dist/js/index.js","require":"./dist/cjs/index.js"},"./cjs":{"types":"./dist/types/index.d.ts","import":"./dist/cjs/index.js","require":"./dist/cjs/index.js"},"./utils/*":{"types":"./dist/types/utils/*.d.ts","import":"./dist/js/utils/*.js","require":"./dist/cjs/utils/*.js"},"./dist/js/*":{"import":"./dist/js/*","require":"./dist/cjs/*"},"./dist/cjs/*":{"import":"./dist/cjs/*","require":"./dist/cjs/*"}},"gitHead":"9509a151ed1fa70044fdc6b8cc9f6e840ca40825","private":false,"scripts":{"lint":"eslint . --ext .ts,.tsx --ignore-pattern '.tsbuildinfo*'","test":"jest --config jest.simple.config.cjs --testPathIgnorePatterns=crypto-security-assessment --testPathIgnorePatterns=performance-optimization --testPathIgnorePatterns=api.stress","build":"npm run build:all","clean":"rimraf dist","format":"prettier --write . --ignore-path .prettierignore","prepare":"npm run build","build:js":"tsc -p tsconfig.js.json","lint:fix":"eslint . --ext .ts,.tsx --fix --ignore-pattern '.tsbuildinfo*'","test:all":"npm run test:core && npm run test:api && npm run test:stress && npm run test:utils && npm run test:simple && npm run test:crypto && npm run test:performance","test:api":"jest --config jest.simple.config.cjs --testPathPatterns=api --testPathIgnorePatterns=api.stress","build:all":"rimraf dist && npm run build:js && npm run write:esm-package && npm run patch:esm-extensions && npm run build:cjs && npm run build:types && rimraf .tsbuildinfo .tsbuildinfo.esm .tsbuildinfo.cjs && npm run lint","build:cjs":"tsc -p tsconfig.cjs.json","test:core":"jest --config jest.simple.config.cjs --testPathIgnorePatterns=crypto-security-assessment --testPathIgnorePatterns=performance-optimization --testMatch=**/src/core/**/__tests__/**/*.test.ts","typecheck":"tsc --noEmit","audit:prod":"npm audit --omit=dev","qa:expo-go":"node ./scripts/expo-runtime-qa.cjs --layers=contract,runtime","test:cache":"jest --config jest.simple.config.cjs --testMatch=**/src/core/cache/__tests__/**/*.test.ts","test:utils":"jest --config jest.simple.config.cjs --testMatch=**/src/utils/**/__tests__/**/*.test.ts","test:watch":"jest --config jest.simple.config.cjs --watch --testPathIgnorePatterns=crypto-security-assessment --testPathIgnorePatterns=performance-optimization","build:types":"tsc -p tsconfig.types.json","test:crypto":"jest --config jest.crypto.config.cjs","test:simple":"jest --config jest.simple.config.cjs --testMatch=**/src/__tests__/unit/simple.test.ts","test:stress":"jest --config jest.simple.config.cjs --testMatch=**/api.stress.test.ts","format:check":"prettier --check . --ignore-path .prettierignore","publish:safe":"npm run build && npm run typecheck && npm publish","audit:no-high":"npm audit --audit-level=high","publish:force":"npm publish --ignore-scripts","test:coverage":"jest --config jest.simple.config.cjs --coverage --testPathIgnorePatterns=crypto-security-assessment,performance-optimization","prepublishOnly":"npm run audit:prod && npm run audit:no-high && npm run typecheck && npm run build:all && npm run test:all && npm run smoke:expo-consumer","qa:expo-go:full":"node ./scripts/expo-runtime-qa.cjs --layers=contract,runtime,soak --soak-minutes=30","qa:expo-go:mumu":"node ./scripts/mumu-expo-qa.cjs run-qa --repo . --layers contract,runtime --channels single-package,managed-compatible --cleanup-consumers","test:performance":"jest --config jest.performance.config.cjs","write:esm-package":"node ./scripts/write-esm-package.cjs","qa:flagship:native":"node ./scripts/mumu-expo-qa.cjs run-qa --repo . --layers contract,runtime --channels managed-compatible --cleanup-consumers --extra-arg=--profiles=native-quick-crypto","test:coverage:unit":"jest --config jest.simple.config.cjs --coverage --testPathIgnorePatterns=crypto-security-assessment,performance-optimization --testPathPatterns=src/__tests__/unit/","qa:baseline:expo-go":"npm run qa:expo-go:mumu","qa:baseline:release":"npm run qa:baseline:expo-go && npm run qa:baseline:native-flagship","qa:expo-go:contract":"node ./scripts/expo-runtime-qa.cjs --layers=contract","smoke:expo-consumer":"node ./scripts/smoke-expo-consumer.cjs","patch:esm-extensions":"node ./scripts/patch-esm-extensions.cjs","qa:expo-go:mumu:full":"node ./scripts/mumu-expo-qa.cjs run-qa --repo . --layers contract,runtime,soak --channels single-package,managed-compatible --soak-minutes 30 --cleanup-consumers","qa:baseline:native-flagship":"npm run qa:flagship:native"},"_npmUser":{"name":"qinindexcode","email":"qinindexcode@gmail.com"},"overrides":{"xcode":{"uuid":"11.1.1"},"js-yaml":"4.2.0"},"repository":{"url":"git+https://github.com/QinIndexCode/expo-lite-data-store.git","type":"git"},"_npmVersion":"10.8.2","description":"Local structured storage for Expo applications with runtime-tested Expo Go and native support.","directories":{},"_nodeVersion":"20.20.2","dependencies":{"bcryptjs":"~2.4.3","crypto-js":"^4.2.0","@noble/ciphers":"~0.6.0"},"_hasShrinkwrap":false,"devDependencies":{"expo":"~56.0.12","jest":"^29.7.0","jiti":"^2.7.0","react":"19.2.3","eslint":"^9.39.4","rimraf":"^6.1.3","globals":"^17.6.0","ts-jest":"^29.4.11","prettier":"^3.8.4","@eslint/js":"^9.39.4","typescript":"~6.0.3","@types/jest":"^29.5.0","@types/node":"^24.13.2","expo-crypto":"~56.0.4","@types/react":"~19.2.14","react-native":"0.85.3","expo-constants":"~56.0.18","@types/bcryptjs":"^2.4.6","@types/crypto-js":"^4.2.2","expo-file-system":"~56.0.8","babel-preset-expo":"~56.0.15","expo-secure-store":"~56.0.4","typescript-eslint":"^8.61.0","eslint-plugin-react":"^7.37.5","eslint-config-prettier":"^9.1.0","eslint-plugin-prettier":"^5.5.6","@typescript-eslint/parser":"^8.61.0","eslint-plugin-react-hooks":"^7.1.1","@typescript-eslint/eslint-plugin":"^8.61.0","@babel/plugin-transform-modules-commonjs":"^7.29.7"},"peerDependencies":{"expo":">=56 <57","react":">=19.2.0 <20","expo-crypto":"~56.0.4","react-native":">=0.85.0 <0.86","expo-constants":"~56.0.18","expo-file-system":"~56.0.8","expo-secure-store":"~56.0.4","react-native-quick-crypto":">=1.0.0"},"peerDependenciesMeta":{"expo":{"optional":false},"react":{"optional":false},"expo-crypto":{"optional":false},"react-native":{"optional":false},"expo-constants":{"optional":false},"expo-file-system":{"optional":false},"expo-secure-store":{"optional":false},"react-native-quick-crypto":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/expo-lite-data-store_2.0.2_1784091806866_0.9263722561197534","host":"s3://npm-registry-packages-npm-production"}},"3.0.0":{"name":"expo-lite-data-store","version":"3.0.0","keywords":["expo","data store","lite","data","storage","react-native"],"author":{"name":"QinIndexCode"},"license":"MIT","_id":"expo-lite-data-store@3.0.0","maintainers":[{"name":"qinindexcode","email":"qinindexcode@gmail.com"}],"homepage":"https://github.com/QinIndexCode/expo-lite-data-store#readme","bugs":{"url":"https://github.com/QinIndexCode/expo-lite-data-store/issues"},"dist":{"shasum":"926004bd73454bcb7f279b32de680fa687bd1d6b","tarball":"https://registry.npmjs.org/expo-lite-data-store/-/expo-lite-data-store-3.0.0.tgz","fileCount":222,"integrity":"sha512-imjhZBQyAOLD2hFC98xg1h0RbKez5tNoD7mzOAkR1meEBu9bUKP94lqEk+UUubtKYRPD1u/QLIQs4dvYLVMGkQ==","signatures":[{"sig":"MEQCIBjgQuEqnGCNKQwm4BvUKsU0YKlo4m/+2O6I753byxN3AiAxo4zYiso42n4+9CACsuojHYLjMl0WXRmN5H5u6IOUJA==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/expo-lite-data-store@3.0.0","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":1671512},"main":"dist/cjs/index.js","types":"dist/types/index.d.ts","exports":{".":{"types":"./dist/types/index.d.ts","import":"./dist/js/index.js","require":"./dist/cjs/index.js"},"./js":{"types":"./dist/types/index.d.ts","import":"./dist/js/index.js","require":"./dist/cjs/index.js"},"./cjs":{"types":"./dist/types/index.d.ts","import":"./dist/cjs/index.js","require":"./dist/cjs/index.js"},"./utils/*":{"types":"./dist/types/utils/*.d.ts","import":"./dist/js/utils/*.js","require":"./dist/cjs/utils/*.js"}},"gitHead":"33565c7924972f9528de27b183972315bdad6a71","private":false,"scripts":{"lint":"eslint . --ext .ts,.tsx --ignore-pattern '.tsbuildinfo*'","test":"jest --config jest.simple.config.cjs --testPathIgnorePatterns=crypto-security-assessment --testPathIgnorePatterns=performance-optimization --testPathIgnorePatterns=api.stress","build":"npm run build:all","clean":"rimraf dist","format":"prettier --write . --ignore-path .prettierignore","prepare":"npm run build","build:js":"tsc -p tsconfig.js.json","lint:fix":"eslint . --ext .ts,.tsx --fix --ignore-pattern '.tsbuildinfo*'","test:all":"npm run test:core && npm run test:api && npm run test:stress && npm run test:utils && npm run test:simple && npm run test:crypto && npm run test:performance","test:api":"jest --config jest.simple.config.cjs --testPathPatterns=api --testPathIgnorePatterns=api.stress","build:all":"rimraf dist && npm run build:js && npm run write:esm-package && npm run patch:esm-extensions && npm run build:cjs && npm run build:types && rimraf .tsbuildinfo .tsbuildinfo.esm .tsbuildinfo.cjs && npm run lint","build:cjs":"tsc -p tsconfig.cjs.json","test:core":"jest --config jest.simple.config.cjs --testPathIgnorePatterns=crypto-security-assessment --testPathIgnorePatterns=performance-optimization --testMatch=**/src/core/**/__tests__/**/*.test.ts","typecheck":"tsc --noEmit","audit:prod":"npm audit --omit=dev","qa:expo-go":"node ./scripts/expo-runtime-qa.cjs --layers=contract,runtime","test:cache":"jest --config jest.simple.config.cjs --testMatch=**/src/core/cache/__tests__/**/*.test.ts","test:utils":"jest --config jest.simple.config.cjs --testMatch=**/src/utils/**/__tests__/**/*.test.ts","test:watch":"jest --config jest.simple.config.cjs --watch --testPathIgnorePatterns=crypto-security-assessment --testPathIgnorePatterns=performance-optimization","build:types":"tsc -p tsconfig.types.json","test:crypto":"jest --config jest.crypto.config.cjs","test:simple":"jest --config jest.simple.config.cjs --testMatch=**/src/__tests__/unit/simple.test.ts","test:stress":"jest --config jest.simple.config.cjs --testMatch=**/api.stress.test.ts","format:check":"prettier --check . --ignore-path .prettierignore","publish:safe":"npm run build && npm run typecheck && npm publish","audit:no-high":"npm audit --audit-level=high","publish:force":"npm publish","test:coverage":"jest --config jest.simple.config.cjs --coverage --testPathIgnorePatterns=crypto-security-assessment,performance-optimization","prepublishOnly":"npm run audit:prod && npm run audit:no-high && npm run typecheck && npm run build:all && npm run test:all && npm run smoke:expo-consumer","qa:expo-go:full":"node ./scripts/expo-runtime-qa.cjs --layers=contract,runtime,soak --soak-minutes=30","qa:expo-go:mumu":"node ./scripts/mumu-expo-qa.cjs run-qa --repo . --layers contract,runtime --channels single-package,managed-compatible --cleanup-consumers","test:performance":"jest --config jest.performance.config.cjs","write:esm-package":"node ./scripts/write-esm-package.cjs","qa:flagship:native":"node ./scripts/mumu-expo-qa.cjs run-qa --repo . --layers contract,runtime --channels managed-compatible --cleanup-consumers --extra-arg=--profiles=native-quick-crypto","test:coverage:unit":"jest --config jest.simple.config.cjs --coverage --testPathIgnorePatterns=crypto-security-assessment,performance-optimization --testPathPatterns=src/__tests__/unit/","qa:baseline:expo-go":"npm run qa:expo-go:mumu","qa:baseline:release":"npm run qa:baseline:expo-go && npm run qa:baseline:native-flagship","qa:expo-go:contract":"node ./scripts/expo-runtime-qa.cjs --layers=contract","smoke:expo-consumer":"node ./scripts/smoke-expo-consumer.cjs","patch:esm-extensions":"node ./scripts/patch-esm-extensions.cjs","qa:expo-go:mumu:full":"node ./scripts/mumu-expo-qa.cjs run-qa --repo . --layers contract,runtime,soak --channels single-package,managed-compatible --soak-minutes 30 --cleanup-consumers","qa:baseline:native-flagship":"npm run qa:flagship:native"},"_npmUser":{"name":"qinindexcode","email":"qinindexcode@gmail.com"},"overrides":{"xcode":{"uuid":"11.1.1"},"js-yaml":"4.2.0"},"repository":{"url":"git+https://github.com/QinIndexCode/expo-lite-data-store.git","type":"git"},"_npmVersion":"10.8.2","description":"Local structured storage for Expo applications with runtime-tested Expo Go and native support.","directories":{},"_nodeVersion":"20.20.2","dependencies":{"bcryptjs":"~2.4.3","crypto-js":"^4.2.0","@noble/ciphers":"~0.6.0"},"_hasShrinkwrap":false,"devDependencies":{"expo":"~56.0.12","jest":"^29.7.0","jiti":"^2.7.0","react":"19.2.3","eslint":"^9.39.4","rimraf":"^6.1.3","globals":"^17.6.0","ts-jest":"^29.4.11","prettier":"^3.8.4","@eslint/js":"^9.39.4","typescript":"~6.0.3","@types/jest":"^29.5.0","@types/node":"^24.13.2","expo-crypto":"~56.0.4","@types/react":"~19.2.14","react-native":"0.85.3","expo-constants":"~56.0.18","@types/bcryptjs":"^2.4.6","@types/crypto-js":"^4.2.2","expo-file-system":"~56.0.8","babel-preset-expo":"~56.0.15","expo-secure-store":"~56.0.4","typescript-eslint":"^8.61.0","eslint-plugin-react":"^7.37.5","eslint-config-prettier":"^9.1.0","eslint-plugin-prettier":"^5.5.6","@typescript-eslint/parser":"^8.61.0","eslint-plugin-react-hooks":"^7.1.1","@typescript-eslint/eslint-plugin":"^8.61.0","@babel/plugin-transform-modules-commonjs":"^7.29.7"},"peerDependencies":{"expo":">=56 <57","react":">=19.2.0 <20","expo-crypto":"~56.0.4","react-native":">=0.85.0 <0.86","expo-constants":"~56.0.18","expo-file-system":"~56.0.8","expo-secure-store":"~56.0.4","react-native-quick-crypto":">=1.0.0"},"peerDependenciesMeta":{"expo":{"optional":false},"react":{"optional":false},"expo-crypto":{"optional":false},"react-native":{"optional":false},"expo-constants":{"optional":false},"expo-file-system":{"optional":false},"expo-secure-store":{"optional":false},"react-native-quick-crypto":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/expo-lite-data-store_3.0.0_1784351123173_0.27319176851915583","host":"s3://npm-registry-packages-npm-production"}},"3.0.1":{"name":"expo-lite-data-store","version":"3.0.1","keywords":["expo","data store","lite","data","storage","react-native"],"author":{"name":"QinIndexCode"},"license":"MIT","_id":"expo-lite-data-store@3.0.1","maintainers":[{"name":"qinindexcode","email":"qinindexcode@gmail.com"}],"homepage":"https://github.com/QinIndexCode/expo-lite-data-store#readme","bugs":{"url":"https://github.com/QinIndexCode/expo-lite-data-store/issues"},"dist":{"shasum":"a897a2f67836153937840a7f1769d2d9e8f6ed54","tarball":"https://registry.npmjs.org/expo-lite-data-store/-/expo-lite-data-store-3.0.1.tgz","fileCount":213,"integrity":"sha512-6SavaYorJB/QhyiFHv4sE2N9rLCvVuy8U9ALaVMfzVIDUmNlzrqBdfQtvV8jcOmNO5rvq66/7soeIAlejS0pqQ==","signatures":[{"sig":"MEYCIQDzE2b1hsahJCDQnSp7ersHceqhlWvThAfmmT/CowHucQIhALNoo20VF9rTgwFB5f35K4XZ/4YMN8BktF6lYAO0Ii5y","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/expo-lite-data-store@3.0.1","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":1863681},"main":"dist/cjs/index.js","types":"dist/types/index.d.ts","exports":{".":{"types":"./dist/types/index.d.ts","import":"./dist/js/index.js","require":"./dist/cjs/index.js"},"./js":{"types":"./dist/types/index.d.ts","import":"./dist/js/index.js","require":"./dist/cjs/index.js"},"./cjs":{"types":"./dist/types/index.d.ts","import":"./dist/cjs/index.js","require":"./dist/cjs/index.js"},"./utils/*":{"types":"./dist/types/utils/*.d.ts","import":"./dist/js/utils/*.js","require":"./dist/cjs/utils/*.js"}},"gitHead":"4a040ba64c93442278d823e71c2c96f7b04a334c","private":false,"scripts":{"lint":"eslint . --ext .ts,.tsx --ignore-pattern '.tsbuildinfo*'","test":"jest --config jest.simple.config.cjs --testPathIgnorePatterns=crypto-security-assessment --testPathIgnorePatterns=performance-optimization --testPathIgnorePatterns=api.stress --testPathIgnorePatterns=benchmark","build":"npm run build:all","clean":"rimraf dist coverage artifacts .tsbuildinfo .tsbuildinfo.esm .tsbuildinfo.cjs","format":"prettier --write --ignore-unknown --ignore-path .prettierignore .","prepare":"npm run build","build:js":"tsc -p tsconfig.js.json","lint:fix":"eslint . --ext .ts,.tsx --fix --ignore-pattern '.tsbuildinfo*'","test:all":"npm run test && npm run test:stress && npm run test:crypto && npm run test:performance","test:api":"jest --config jest.simple.config.cjs --testPathPatterns=api --testPathIgnorePatterns=api.stress","build:all":"rimraf dist && npm run build:js && npm run write:esm-package && npm run patch:esm-extensions && npm run build:cjs && npm run build:types && rimraf .tsbuildinfo .tsbuildinfo.esm .tsbuildinfo.cjs && npm run lint","build:cjs":"tsc -p tsconfig.cjs.json","test:core":"jest --config jest.simple.config.cjs --testPathIgnorePatterns=crypto-security-assessment --testPathIgnorePatterns=performance-optimization --testMatch=**/src/core/**/__tests__/**/*.test.ts","typecheck":"tsc --noEmit --incremental false && tsc -p tsconfig.mocks.json --incremental false","audit:prod":"npm audit --omit=dev","qa:expo-go":"node ./scripts/expo-runtime-qa.cjs --layers=contract,runtime","test:cache":"jest --config jest.simple.config.cjs --testMatch=**/src/core/cache/__tests__/**/*.test.ts","test:utils":"jest --config jest.simple.config.cjs --testMatch=**/src/utils/**/__tests__/**/*.test.ts","test:watch":"jest --config jest.simple.config.cjs --watch --testPathIgnorePatterns=crypto-security-assessment --testPathIgnorePatterns=performance-optimization --testPathIgnorePatterns=api.stress --testPathIgnorePatterns=benchmark","build:types":"tsc -p tsconfig.types.json","test:crypto":"jest --config jest.crypto.config.cjs","test:stress":"jest --config jest.simple.config.cjs --testMatch=**/api.stress.test.ts","format:check":"prettier --check --ignore-unknown --ignore-path .prettierignore .","audit:no-high":"npm audit --audit-level=high","test:coverage":"jest --config jest.simple.config.cjs --coverage --testPathIgnorePatterns=crypto-security-assessment,performance-optimization","prepublishOnly":"npm run format:check && npm run audit:prod && npm run typecheck && npm run build:all && npm run test:all && npm run smoke:expo-consumer","clean:artifacts":"rimraf artifacts","qa:expo-go:full":"node ./scripts/expo-runtime-qa.cjs --layers=contract,runtime,soak --soak-minutes=30","qa:expo-go:mumu":"node ./scripts/mumu-expo-qa.cjs run-qa --repo . --layers contract,runtime --channels single-package,managed-compatible --cleanup-consumers","test:performance":"jest --config jest.performance.config.cjs","write:esm-package":"node ./scripts/write-esm-package.cjs","qa:flagship:native":"node ./scripts/mumu-expo-qa.cjs run-qa --repo . --layers contract,runtime --channels managed-compatible --cleanup-consumers --extra-arg=--profiles=native-quick-crypto","test:coverage:unit":"jest --config jest.simple.config.cjs --coverage --testPathIgnorePatterns=crypto-security-assessment,performance-optimization --testPathPatterns=src/__tests__/unit/","qa:baseline:expo-go":"npm run qa:expo-go:mumu","qa:baseline:release":"npm run qa:baseline:expo-go && npm run qa:baseline:native-flagship","qa:expo-go:contract":"node ./scripts/expo-runtime-qa.cjs --layers=contract","smoke:expo-consumer":"node ./scripts/smoke-expo-consumer.cjs","patch:esm-extensions":"node ./scripts/patch-esm-extensions.cjs","qa:expo-go:mumu:full":"node ./scripts/mumu-expo-qa.cjs run-qa --repo . --layers contract,runtime,soak --channels single-package,managed-compatible --soak-minutes 30 --cleanup-consumers","qa:baseline:native-flagship":"npm run qa:flagship:native"},"_npmUser":{"name":"qinindexcode","email":"qinindexcode@gmail.com"},"overrides":{"xcode":{"uuid":"11.1.1"},"nanoid":"3.3.18","js-yaml":"4.3.1","postcss":"8.5.26","shell-quote":"1.9.0","brace-expansion":"5.0.9"},"repository":{"url":"git+https://github.com/QinIndexCode/expo-lite-data-store.git","type":"git"},"_npmVersion":"10.8.2","description":"Local structured storage for Expo applications with runtime-tested Expo Go and native support.","directories":{},"_nodeVersion":"20.20.2","dependencies":{"bcryptjs":"~2.4.3","@noble/hashes":"^1.8.0","@noble/ciphers":"~0.6.0"},"_hasShrinkwrap":false,"devDependencies":{"expo":"~56.0.12","jest":"^29.7.0","jiti":"^2.7.0","react":"19.2.3","eslint":"^9.39.4","rimraf":"^6.1.3","globals":"^17.6.0","ts-jest":"^29.4.11","prettier":"^3.8.4","@eslint/js":"^9.39.4","typescript":"~6.0.3","@types/jest":"^29.5.0","@types/node":"^24.13.2","expo-crypto":"~56.0.4","expo-sqlite":"~56.0.5","@types/react":"~19.2.14","react-native":"0.85.3","expo-constants":"~56.0.18","@types/bcryptjs":"^2.4.6","expo-file-system":"~56.0.8","babel-preset-expo":"~56.0.15","expo-secure-store":"~56.0.4","typescript-eslint":"^8.61.0","eslint-plugin-react":"^7.37.5","eslint-config-prettier":"^9.1.0","eslint-plugin-prettier":"^5.5.6","@typescript-eslint/parser":"^8.61.0","eslint-plugin-react-hooks":"^7.1.1","@typescript-eslint/eslint-plugin":"^8.61.0","@babel/plugin-transform-modules-commonjs":"^7.29.7"},"peerDependencies":{"expo":">=56 <57","react":">=19.2.0 <20","expo-crypto":"~56.0.4","react-native":">=0.85.0 <0.86","expo-constants":"~56.0.18","expo-file-system":"~56.0.8","expo-secure-store":"~56.0.4","react-native-quick-crypto":">=1.0.0"},"peerDependenciesMeta":{"expo":{"optional":false},"react":{"optional":false},"expo-crypto":{"optional":false},"react-native":{"optional":false},"expo-constants":{"optional":false},"expo-file-system":{"optional":false},"expo-secure-store":{"optional":false},"react-native-quick-crypto":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/expo-lite-data-store_3.0.1_1786316697957_0.8941142012681071","host":"s3://npm-registry-packages-npm-production"}},"3.1.0":{"name":"expo-lite-data-store","version":"3.1.0","keywords":["expo","data store","lite","data","storage","react-native"],"author":{"name":"QinIndexCode"},"license":"MIT","_id":"expo-lite-data-store@3.1.0","maintainers":[{"name":"qinindexcode","email":"qinindexcode@gmail.com"}],"homepage":"https://github.com/QinIndexCode/expo-lite-data-store#readme","bugs":{"url":"https://github.com/QinIndexCode/expo-lite-data-store/issues"},"dist":{"shasum":"b0d47d27cf0e4e2cce8d5b2ee23a645fa7c650d2","tarball":"https://registry.npmjs.org/expo-lite-data-store/-/expo-lite-data-store-3.1.0.tgz","fileCount":213,"integrity":"sha512-Dn6IEGN6ndS5HtgDaSs6irfby+QzJOW9k4ksfAgTeWTTZTq+/e9n4GcQuMLlPPJkpfZMFGjbYtvGxp7usN8xPg==","signatures":[{"sig":"MEUCIEBZBDs5/KmWEqBzXoJ8/y4oW/BYR07HNPiYy9rzTog2AiEAmoVU5AyhR7e0E9JSA5jMyRaYRcDlREma7b0/4LPTiHQ=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/expo-lite-data-store@3.1.0","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":1885228},"main":"dist/cjs/index.js","types":"dist/types/index.d.ts","exports":{".":{"types":"./dist/types/index.d.ts","import":"./dist/js/index.js","require":"./dist/cjs/index.js"},"./js":{"types":"./dist/types/index.d.ts","import":"./dist/js/index.js","require":"./dist/cjs/index.js"},"./cjs":{"types":"./dist/types/index.d.ts","import":"./dist/cjs/index.js","require":"./dist/cjs/index.js"},"./utils/*":{"types":"./dist/types/utils/*.d.ts","import":"./dist/js/utils/*.js","require":"./dist/cjs/utils/*.js"}},"gitHead":"548e5b573e210c9c755b2ea34999726b07a020d7","private":false,"scripts":{"lint":"eslint . --ext .ts,.tsx --ignore-pattern '.tsbuildinfo*'","test":"jest --config jest.simple.config.cjs --testPathIgnorePatterns=crypto-security-assessment --testPathIgnorePatterns=performance-optimization --testPathIgnorePatterns=api.stress --testPathIgnorePatterns=benchmark","build":"npm run build:all","clean":"rimraf dist coverage artifacts .tsbuildinfo .tsbuildinfo.esm .tsbuildinfo.cjs","format":"prettier --write --ignore-unknown --ignore-path .prettierignore .","prepare":"npm run build","build:js":"tsc -p tsconfig.js.json","lint:fix":"eslint . --ext .ts,.tsx --fix --ignore-pattern '.tsbuildinfo*'","test:all":"npm run test && npm run test:stress && npm run test:crypto && npm run test:performance","test:api":"jest --config jest.simple.config.cjs --testPathPatterns=api --testPathIgnorePatterns=api.stress","build:all":"rimraf dist && npm run build:js && npm run write:esm-package && npm run patch:esm-extensions && npm run build:cjs && npm run build:types && rimraf .tsbuildinfo .tsbuildinfo.esm .tsbuildinfo.cjs && npm run lint","build:cjs":"tsc -p tsconfig.cjs.json","test:core":"jest --config jest.simple.config.cjs --testPathIgnorePatterns=crypto-security-assessment --testPathIgnorePatterns=performance-optimization --testMatch=**/src/core/**/__tests__/**/*.test.ts","typecheck":"tsc --noEmit --incremental false && tsc -p tsconfig.mocks.json --incremental false","audit:prod":"npm audit --omit=dev","qa:expo-go":"node ./scripts/expo-runtime-qa.cjs --layers=contract,runtime","test:cache":"jest --config jest.simple.config.cjs --testMatch=**/src/core/cache/__tests__/**/*.test.ts","test:utils":"jest --config jest.simple.config.cjs --testMatch=**/src/utils/**/__tests__/**/*.test.ts","test:watch":"jest --config jest.simple.config.cjs --watch --testPathIgnorePatterns=crypto-security-assessment --testPathIgnorePatterns=performance-optimization --testPathIgnorePatterns=api.stress --testPathIgnorePatterns=benchmark","build:types":"tsc -p tsconfig.types.json","test:crypto":"jest --config jest.crypto.config.cjs","test:stress":"jest --config jest.simple.config.cjs --testMatch=**/api.stress.test.ts","format:check":"prettier --check --ignore-unknown --ignore-path .prettierignore .","audit:no-high":"npm audit --audit-level=high","test:coverage":"jest --config jest.simple.config.cjs --coverage --testPathIgnorePatterns=crypto-security-assessment,performance-optimization","prepublishOnly":"npm run format:check && npm run audit:prod && npm run typecheck && npm run build:all && npm run test:all && npm run smoke:expo-consumer","clean:artifacts":"rimraf artifacts","qa:expo-go:full":"node ./scripts/expo-runtime-qa.cjs --layers=contract,runtime,soak --soak-minutes=30","qa:expo-go:mumu":"node ./scripts/mumu-expo-qa.cjs run-qa --repo . --layers contract,runtime --channels single-package,managed-compatible --cleanup-consumers","test:performance":"jest --config jest.performance.config.cjs","write:esm-package":"node ./scripts/write-esm-package.cjs","qa:flagship:native":"node ./scripts/mumu-expo-qa.cjs run-qa --repo . --layers contract,runtime --channels managed-compatible --cleanup-consumers --extra-arg=--profiles=native-quick-crypto","test:coverage:unit":"jest --config jest.simple.config.cjs --coverage --testPathIgnorePatterns=crypto-security-assessment,performance-optimization --testPathPatterns=src/__tests__/unit/","qa:baseline:expo-go":"npm run qa:expo-go:mumu","qa:baseline:release":"npm run qa:baseline:expo-go && npm run qa:baseline:native-flagship","qa:expo-go:contract":"node ./scripts/expo-runtime-qa.cjs --layers=contract","smoke:expo-consumer":"node ./scripts/smoke-expo-consumer.cjs","patch:esm-extensions":"node ./scripts/patch-esm-extensions.cjs","qa:expo-go:mumu:full":"node ./scripts/mumu-expo-qa.cjs run-qa --repo . --layers contract,runtime,soak --channels single-package,managed-compatible --soak-minutes 30 --cleanup-consumers","qa:baseline:native-flagship":"npm run qa:flagship:native"},"_npmUser":{"name":"qinindexcode","email":"qinindexcode@gmail.com"},"overrides":{"xcode":{"uuid":"11.1.1"},"nanoid":"3.3.18","js-yaml":"4.3.1","postcss":"8.5.26","shell-quote":"1.9.0","brace-expansion":"5.0.9"},"repository":{"url":"git+https://github.com/QinIndexCode/expo-lite-data-store.git","type":"git"},"_npmVersion":"10.8.2","description":"Local structured storage for Expo applications with runtime-tested Expo Go and native support.","directories":{},"_nodeVersion":"20.20.2","dependencies":{"bcryptjs":"~2.4.3","@noble/hashes":"^1.8.0","@noble/ciphers":"~0.6.0"},"_hasShrinkwrap":false,"devDependencies":{"expo":"~56.0.12","jest":"^29.7.0","jiti":"^2.7.0","react":"19.2.3","eslint":"^9.39.4","rimraf":"^6.1.3","globals":"^17.6.0","ts-jest":"^29.4.11","prettier":"^3.8.4","@eslint/js":"^9.39.4","typescript":"~6.0.3","@types/jest":"^29.5.0","@types/node":"^24.13.2","expo-crypto":"~56.0.4","expo-sqlite":"~56.0.5","@types/react":"~19.2.14","react-native":"0.85.3","expo-constants":"~56.0.18","@types/bcryptjs":"^2.4.6","expo-file-system":"~56.0.8","babel-preset-expo":"~56.0.15","expo-secure-store":"~56.0.4","typescript-eslint":"^8.61.0","eslint-plugin-react":"^7.37.5","eslint-config-prettier":"^9.1.0","eslint-plugin-prettier":"^5.5.6","@typescript-eslint/parser":"^8.61.0","eslint-plugin-react-hooks":"^7.1.1","@typescript-eslint/eslint-plugin":"^8.61.0","@babel/plugin-transform-modules-commonjs":"^7.29.7"},"peerDependencies":{"expo":">=56 <57","react":">=19.2.0 <20","expo-crypto":"~56.0.4","react-native":">=0.85.0 <0.86","expo-constants":"~56.0.18","expo-file-system":"~56.0.8","expo-secure-store":"~56.0.4","react-native-quick-crypto":">=1.0.0"},"peerDependenciesMeta":{"expo":{"optional":false},"react":{"optional":false},"expo-crypto":{"optional":false},"react-native":{"optional":false},"expo-constants":{"optional":false},"expo-file-system":{"optional":false},"expo-secure-store":{"optional":false},"react-native-quick-crypto":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/expo-lite-data-store_3.1.0_1788695218575_0.6469024919463457","host":"s3://npm-registry-packages-npm-production"}},"3.1.1":{"name":"expo-lite-data-store","version":"3.1.1","keywords":["expo","data store","lite","data","storage","react-native"],"author":{"name":"QinIndexCode"},"license":"MIT","_id":"expo-lite-data-store@3.1.1","maintainers":[{"name":"qinindexcode","email":"qinindexcode@gmail.com"}],"homepage":"https://github.com/QinIndexCode/expo-lite-data-store#readme","bugs":{"url":"https://github.com/QinIndexCode/expo-lite-data-store/issues"},"dist":{"shasum":"4e4cd095bde31a6d076445ac282ddc202824d27e","tarball":"https://registry.npmjs.org/expo-lite-data-store/-/expo-lite-data-store-3.1.1.tgz","fileCount":219,"integrity":"sha512-MRBRiCk3i2gc2pUY2bBnvEOVysPQDdc5J2dq8n4TVmvBhqFzU2pM8aNYm3xXaP606KSE3MDBkbT6LgsYN1AMnQ==","signatures":[{"sig":"MEUCIAzBJSwcA7N2xoNi6VG2Tj/ZfE1wEeA1MUQf/DC2K+e4AiEAgRNXNLxm8gobItMvxVTq1LyKa/Pric/IwFcro1gix8g=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"sig":"MEUCIQCodFuSo31ulvnd72L+RFRYb+udcgSEIZcy1AkjlUq06AIgOLrqufaTpp1yjLGs47/Zx+qgskYKK09MVdpvZ/QYg00=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/expo-lite-data-store@3.1.1","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":2022266},"main":"dist/cjs/index.js","types":"dist/types/index.d.ts","exports":{".":{"types":"./dist/types/index.d.ts","import":"./dist/js/index.js","require":"./dist/cjs/index.js"},"./js":{"types":"./dist/types/index.d.ts","import":"./dist/js/index.js","require":"./dist/cjs/index.js"},"./cjs":{"types":"./dist/types/index.d.ts","import":"./dist/cjs/index.js","require":"./dist/cjs/index.js"},"./utils/*":{"types":"./dist/types/utils/*.d.ts","import":"./dist/js/utils/*.js","require":"./dist/cjs/utils/*.js"}},"gitHead":"f07d39bb8015e33c1097c73291c49407d9c267be","private":false,"scripts":{"lint":"eslint . --ext .ts,.tsx --ignore-pattern '.tsbuildinfo*'","test":"jest --config jest.simple.config.cjs --testPathIgnorePatterns=crypto-security-assessment --testPathIgnorePatterns=performance-optimization --testPathIgnorePatterns=api.stress --testPathIgnorePatterns=benchmark","build":"npm run build:all","clean":"rimraf dist coverage artifacts .tsbuildinfo .tsbuildinfo.esm .tsbuildinfo.cjs","format":"prettier --write --ignore-unknown --ignore-path .prettierignore .","prepare":"npm run build","build:js":"tsc -p tsconfig.js.json","lint:fix":"eslint . --ext .ts,.tsx --fix --ignore-pattern '.tsbuildinfo*'","test:all":"npm run test && npm run test:stress && npm run test:crypto && npm run test:performance","test:api":"jest --config jest.simple.config.cjs --testPathPatterns=api --testPathIgnorePatterns=api.stress","build:all":"rimraf dist && npm run build:js && npm run write:esm-package && npm run patch:esm-extensions && npm run build:cjs && npm run build:types && rimraf .tsbuildinfo .tsbuildinfo.esm .tsbuildinfo.cjs && npm run lint","build:cjs":"tsc -p tsconfig.cjs.json","test:core":"jest --config jest.simple.config.cjs --testPathIgnorePatterns=crypto-security-assessment --testPathIgnorePatterns=performance-optimization --testMatch=**/src/core/**/__tests__/**/*.test.ts","typecheck":"tsc --noEmit --incremental false && tsc -p tsconfig.mocks.json --incremental false","audit:prod":"npm audit --omit=dev","qa:expo-go":"node ./scripts/expo-runtime-qa.cjs --layers=contract,runtime","test:cache":"jest --config jest.simple.config.cjs --testMatch=**/src/core/cache/__tests__/**/*.test.ts","test:utils":"jest --config jest.simple.config.cjs --testMatch=**/src/utils/**/__tests__/**/*.test.ts","test:watch":"jest --config jest.simple.config.cjs --watch --testPathIgnorePatterns=crypto-security-assessment --testPathIgnorePatterns=performance-optimization --testPathIgnorePatterns=api.stress --testPathIgnorePatterns=benchmark","build:types":"tsc -p tsconfig.types.json","test:crypto":"jest --config jest.crypto.config.cjs","test:stress":"jest --config jest.simple.config.cjs --testMatch=**/api.stress.test.ts","format:check":"prettier --check --ignore-unknown --ignore-path .prettierignore .","audit:no-high":"npm audit --audit-level=high","test:coverage":"jest --config jest.simple.config.cjs --coverage --testPathIgnorePatterns=crypto-security-assessment,performance-optimization","prepublishOnly":"npm run format:check && npm run audit:prod && npm run typecheck && npm run build:all && npm run test:all && npm run smoke:expo-consumer","clean:artifacts":"rimraf artifacts","qa:expo-go:full":"node ./scripts/expo-runtime-qa.cjs --layers=contract,runtime,soak --soak-minutes=30","qa:expo-go:mumu":"node ./scripts/mumu-expo-qa.cjs run-qa --repo . --layers contract,runtime --channels single-package,managed-compatible --cleanup-consumers","test:performance":"jest --config jest.performance.config.cjs","write:esm-package":"node ./scripts/write-esm-package.cjs","qa:flagship:native":"node ./scripts/mumu-expo-qa.cjs run-qa --repo . --layers contract,runtime --channels managed-compatible --cleanup-consumers --extra-arg=--profiles=native-quick-crypto","test:coverage:unit":"jest --config jest.simple.config.cjs --coverage --testPathIgnorePatterns=crypto-security-assessment,performance-optimization --testPathPatterns=src/__tests__/unit/","qa:baseline:expo-go":"npm run qa:expo-go:mumu","qa:baseline:release":"npm run qa:baseline:expo-go && npm run qa:baseline:native-flagship","qa:expo-go:contract":"node ./scripts/expo-runtime-qa.cjs --layers=contract","smoke:expo-consumer":"node ./scripts/smoke-expo-consumer.cjs","patch:esm-extensions":"node ./scripts/patch-esm-extensions.cjs","qa:expo-go:mumu:full":"node ./scripts/mumu-expo-qa.cjs run-qa --repo . --layers contract,runtime,soak --channels single-package,managed-compatible --soak-minutes 30 --cleanup-consumers","qa:baseline:native-flagship":"npm run qa:flagship:native"},"_npmUser":{"name":"qinindexcode","email":"qinindexcode@gmail.com"},"overrides":{"xcode":{"uuid":"11.1.1"},"nanoid":"3.3.18","js-yaml":"4.3.1","postcss":"8.5.26","shell-quote":"1.9.0","brace-expansion":"5.0.9"},"repository":{"url":"git+https://github.com/QinIndexCode/expo-lite-data-store.git","type":"git"},"_npmVersion":"10.9.8","description":"Local structured storage for Expo applications with runtime-tested Expo Go and native support.","directories":{},"_nodeVersion":"22.23.2","dependencies":{"bcryptjs":"~2.4.3","@noble/hashes":"^1.8.0","@noble/ciphers":"~0.6.0"},"_hasShrinkwrap":false,"devDependencies":{"expo":"~56.0.12","jest":"^29.7.0","jiti":"^2.7.0","react":"19.2.3","eslint":"^9.39.5","rimraf":"^6.1.3","globals":"^17.6.0","ts-jest":"^29.4.11","prettier":"^3.8.4","@eslint/js":"^9.39.4","typescript":"~6.0.3","@types/jest":"^29.5.0","@types/node":"^24.13.2","expo-crypto":"~56.0.4","expo-sqlite":"~56.0.5","@types/react":"~19.2.14","react-native":"0.85.3","expo-constants":"~56.0.18","@types/bcryptjs":"^2.4.6","expo-file-system":"~56.0.8","babel-preset-expo":"~56.0.15","expo-secure-store":"~56.0.4","typescript-eslint":"^8.61.0","eslint-plugin-react":"^7.37.5","eslint-config-prettier":"^9.1.0","eslint-plugin-prettier":"^5.5.6","@typescript-eslint/parser":"^8.61.0","eslint-plugin-react-hooks":"^7.1.1","@typescript-eslint/eslint-plugin":"^8.61.0","@babel/plugin-transform-modules-commonjs":"^7.29.7"},"peerDependencies":{"expo":">=56 <57","react":">=19.2.0 <20","expo-crypto":"~56.0.4","expo-sqlite":">=56.0.0 <57","react-native":">=0.85.0 <0.86","expo-constants":"~56.0.18","expo-file-system":"~56.0.8","expo-secure-store":"~56.0.4","react-native-quick-crypto":">=1.0.0"},"peerDependenciesMeta":{"expo":{"optional":false},"react":{"optional":false},"expo-crypto":{"optional":false},"expo-sqlite":{"optional":true},"react-native":{"optional":false},"expo-constants":{"optional":false},"expo-file-system":{"optional":false},"expo-secure-store":{"optional":false},"react-native-quick-crypto":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/expo-lite-data-store_3.1.1_1789796270459_0.061603628933627474","host":"s3://npm-registry-packages-npm-production"}},"4.0.0":{"_id":"expo-lite-data-store@4.0.0","bugs":{"url":"https://github.com/QinIndexCode/expo-lite-data-store/issues"},"dist":{"shasum":"b15d37f644a63b4fcbdf2e95506400e947e3c367","tarball":"https://registry.npmjs.org/expo-lite-data-store/-/expo-lite-data-store-4.0.0.tgz","fileCount":198,"integrity":"sha512-5YukSf8IjHrWI0nM8Evxv9WnylXxe4VX4CLogtrLNLeMnY+PaIIxascknDTG3k9ciEJbmQDjDiJj7bC/2oHz8w==","signatures":[{"sig":"MEUCIGCXIYwRiMZqX6w6waFKgjWaOcxpcX2NbWBksb+jc/PcAiEAlhtnVer+yZ3KAvRdS4U39qF+tQ2oz4A+aZ54wVq+6YE=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U","sig":"MEQCIF85+vW+JnZEzdXdMgHOamJJmiJV829y7svInz2j2JSZAiBPD+OIKUynuT/ed3tGBrhMO46u/NXhof/JG+0KrdZRdw=="}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/expo-lite-data-store@4.0.0","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":2117574},"main":"dist/cjs/index.js","name":"expo-lite-data-store","types":"dist/types/index.d.ts","author":{"name":"QinIndexCode"},"exports":{".":{"types":"./dist/types/index.d.ts","import":"./dist/js/index.js","require":"./dist/cjs/index.js"},"./js":{"types":"./dist/types/index.d.ts","import":"./dist/js/index.js","require":"./dist/cjs/index.js"},"./cjs":{"types":"./dist/types/index.d.ts","import":"./dist/cjs/index.js","require":"./dist/cjs/index.js"},"./utils/*":{"types":"./dist/types/utils/*.d.ts","import":"./dist/js/utils/*.js","require":"./dist/cjs/utils/*.js"}},"gitHead":"d6ea605ca373daf2f9ad8cb73b912ca935893f62","license":"MIT","private":false,"scripts":{"lint":"eslint . --ext .ts,.tsx --ignore-pattern '.tsbuildinfo*'","test":"jest --config jest.simple.config.cjs --testPathIgnorePatterns=crypto-security-assessment --testPathIgnorePatterns=performance-optimization --testPathIgnorePatterns=api.stress --testPathIgnorePatterns=benchmark","build":"npm run build:all","clean":"rimraf dist coverage artifacts .tsbuildinfo .tsbuildinfo.esm .tsbuildinfo.cjs","format":"prettier --write --ignore-unknown --ignore-path .prettierignore .","prepare":"npm run build","build:js":"tsc -p tsconfig.js.json","lint:fix":"eslint . --ext .ts,.tsx --fix --ignore-pattern '.tsbuildinfo*'","test:all":"npm run test && npm run test:stress && npm run test:crypto && npm run test:performance","test:api":"jest --config jest.simple.config.cjs --testPathPatterns=api --testPathIgnorePatterns=api.stress","build:all":"rimraf dist && npm run build:js && npm run write:esm-package && npm run patch:esm-extensions && npm run build:cjs && npm run build:types && rimraf .tsbuildinfo .tsbuildinfo.esm .tsbuildinfo.cjs && npm run lint","build:cjs":"tsc -p tsconfig.cjs.json","test:core":"jest --config jest.simple.config.cjs --testPathIgnorePatterns=crypto-security-assessment --testPathIgnorePatterns=performance-optimization --testMatch=**/src/core/**/__tests__/**/*.test.ts","typecheck":"tsc --noEmit --incremental false && tsc -p tsconfig.mocks.json --incremental false","audit:prod":"npm audit --omit=dev","qa:expo-go":"node ./scripts/expo-runtime-qa.cjs --layers=contract,runtime","test:cache":"jest --config jest.simple.config.cjs --testMatch=**/src/core/cache/__tests__/**/*.test.ts","test:utils":"jest --config jest.simple.config.cjs --testMatch=**/src/utils/**/__tests__/**/*.test.ts","test:watch":"jest --config jest.simple.config.cjs --watch --testPathIgnorePatterns=crypto-security-assessment --testPathIgnorePatterns=performance-optimization --testPathIgnorePatterns=api.stress --testPathIgnorePatterns=benchmark","build:types":"tsc -p tsconfig.types.json","test:crypto":"jest --config jest.crypto.config.cjs","test:stress":"jest --config jest.simple.config.cjs --testMatch=**/api.stress.test.ts","format:check":"prettier --check --ignore-unknown --ignore-path .prettierignore .","audit:no-high":"npm audit --audit-level=high","test:coverage":"jest --config jest.simple.config.cjs --coverage --testPathIgnorePatterns=crypto-security-assessment,performance-optimization","prepublishOnly":"npm run format:check && npm run audit:prod && npm run typecheck && npm run build:all && npm run test:all && npm run smoke:expo-consumer","clean:artifacts":"rimraf artifacts","qa:expo-go:full":"node ./scripts/expo-runtime-qa.cjs --layers=contract,runtime,soak --soak-minutes=30","qa:expo-go:mumu":"node ./scripts/mumu-expo-qa.cjs run-qa --repo . --layers contract,runtime --channels single-package,managed-compatible --cleanup-consumers","test:performance":"jest --config jest.performance.config.cjs","write:esm-package":"node ./scripts/write-esm-package.cjs","qa:flagship:native":"node ./scripts/mumu-expo-qa.cjs run-qa --repo . --layers contract,runtime --channels managed-compatible --cleanup-consumers --extra-arg=--profiles=native-quick-crypto","test:coverage:unit":"jest --config jest.simple.config.cjs --coverage --testPathIgnorePatterns=crypto-security-assessment,performance-optimization --testPathPatterns=src/__tests__/unit/","qa:baseline:expo-go":"npm run qa:expo-go:mumu","qa:baseline:release":"npm run qa:baseline:expo-go && npm run qa:baseline:native-flagship","qa:expo-go:contract":"node ./scripts/expo-runtime-qa.cjs --layers=contract","smoke:expo-consumer":"node ./scripts/smoke-expo-consumer.cjs","patch:esm-extensions":"node ./scripts/patch-esm-extensions.cjs","qa:expo-go:mumu:full":"node ./scripts/mumu-expo-qa.cjs run-qa --repo . --layers contract,runtime,soak --channels single-package,managed-compatible --soak-minutes 30 --cleanup-consumers","qa:baseline:native-flagship":"npm run qa:flagship:native"},"version":"4.0.0","_npmUser":{"name":"qinindexcode","email":"qinindexcode@gmail.com"},"homepage":"https://github.com/QinIndexCode/expo-lite-data-store#readme","keywords":["expo","data store","lite","data","storage","react-native"],"overrides":{"xcode":{"uuid":"11.1.1"},"nanoid":"3.3.18","js-yaml":"4.3.2","postcss":"8.5.26","shell-quote":"1.9.0","brace-expansion":"5.0.9"},"repository":{"url":"git+https://github.com/QinIndexCode/expo-lite-data-store.git","type":"git"},"_npmVersion":"10.9.8","description":"Local structured storage for Expo applications with runtime-tested Expo Go and native support.","directories":{},"maintainers":[{"name":"qinindexcode","email":"qinindexcode@gmail.com"}],"_nodeVersion":"22.23.2","dependencies":{"bcryptjs":"~2.4.3","@noble/hashes":"^1.8.0","@noble/ciphers":"~0.6.0"},"_hasShrinkwrap":false,"devDependencies":{"expo":"~56.0.12","jest":"^29.7.0","jiti":"^2.7.0","react":"19.2.3","eslint":"^9.39.5","rimraf":"^6.1.3","globals":"^17.6.0","ts-jest":"^29.4.11","prettier":"^3.8.4","@eslint/js":"^9.39.4","typescript":"~6.0.3","@types/jest":"^29.5.0","@types/node":"^24.13.2","expo-crypto":"~56.0.4","expo-sqlite":"~56.0.5","@types/react":"~19.2.14","react-native":"0.85.3","expo-constants":"~56.0.18","@types/bcryptjs":"^2.4.6","expo-file-system":"~56.0.8","babel-preset-expo":"~56.0.15","expo-secure-store":"~56.0.4","typescript-eslint":"^8.61.0","eslint-plugin-react":"^7.37.5","eslint-plugin-import":"^2.32.0","eslint-config-prettier":"^9.1.0","eslint-plugin-prettier":"^5.5.6","@typescript-eslint/parser":"^8.61.0","eslint-plugin-react-hooks":"^7.1.1","@typescript-eslint/eslint-plugin":"^8.61.0","@babel/plugin-transform-modules-commonjs":"^7.29.7"},"peerDependencies":{"expo":">=56 <57","react":">=19.2.0 <20","expo-crypto":"~56.0.4","expo-sqlite":">=56.0.0 <57","react-native":">=0.85.0 <0.86","expo-constants":"~56.0.18","expo-file-system":"~56.0.8","expo-secure-store":"~56.0.4","react-native-quick-crypto":">=1.0.0"},"peerDependenciesMeta":{"expo":{"optional":false},"react":{"optional":false},"expo-crypto":{"optional":false},"expo-sqlite":{"optional":true},"react-native":{"optional":false},"expo-constants":{"optional":false},"expo-file-system":{"optional":false},"expo-secure-store":{"optional":false},"react-native-quick-crypto":{"optional":true}},"_npmOperationalInternal":{"host":"s3://npm-registry-packages-npm-production","tmp":"tmp/expo-lite-data-store_4.0.0_1790655445203_0.42879099154396694"}}},"time":{"created":"2025-12-22T01:37:21.667Z","modified":"2026-09-29T04:17:25.624Z","1.0.1":"2025-12-07T09:03:08.337Z","1.0.0":"2025-12-08T10:04:16.730Z","1.0.2":"2025-12-10T02:36:07.512Z","1.0.3":"2025-12-12T16:45:44.488Z","1.0.4":"2025-12-12T18:37:39.289Z","1.0.5":"2025-12-12T19:07:48.447Z","1.0.6":"2025-12-12T19:48:50.014Z","1.0.7":"2025-12-12T20:23:07.308Z","1.0.8":"2025-12-14T09:31:56.156Z","1.0.9":"2025-12-14T17:00:36.123Z","2.0.0-beta.2":"2025-12-22T01:37:21.869Z","2.0.0-beta.3":"2026-01-31T12:17:17.628Z","2.0.0-beta.5":"2026-04-04T07:45:09.244Z","2.0.0":"2026-04-28T03:15:23.412Z","2.0.1":"2026-06-16T11:40:02.994Z","2.0.2":"2026-07-15T05:03:27.037Z","3.0.0":"2026-07-18T05:05:23.316Z","3.0.1":"2026-08-09T23:04:58.103Z","3.1.0":"2026-09-06T11:46:58.704Z","3.1.1":"2026-09-19T05:37:50.546Z","4.0.0":"2026-09-29T04:17:25.300Z"},"bugs":{"url":"https://github.com/QinIndexCode/expo-lite-data-store/issues"},"author":{"name":"QinIndexCode"},"license":"MIT","homepage":"https://github.com/QinIndexCode/expo-lite-data-store#readme","keywords":["expo","data store","lite","data","storage","react-native"],"repository":{"url":"git+https://github.com/QinIndexCode/expo-lite-data-store.git","type":"git"},"description":"Local structured storage for Expo applications with runtime-tested Expo Go and native support.","maintainers":[{"name":"qinindexcode","email":"qinindexcode@gmail.com"}],"readme":"# 🍃 expo-lite-data-store\n\n面向 Expo 应用的本地结构化存储库，已针对 Expo SDK 56 下的 Expo Go、managed app 和原生开发构建完成运行时验证。\n\n[README 入口](./README.md) | [English](./README.en.md) | [API 参考](./docs/API.zh-CN.md) | [运行时 QA 指南](./docs/EXPO_RUNTIME_QA.zh-CN.md) | [CI/CD 运维](./docs/CI_CD.zh-CN.md) | [变更日志](./docs/CHANGELOG.zh-CN.md)\n\n## 概览\n\n`expo-lite-data-store` 适合这样一类 Expo 项目：希望把数据稳定地保存在本地设备上，需要比零散 JSON 文件更清晰的结构化操作能力，但又不想为了本地存储直接引入一整套远程数据库方案。\n\n本库当前围绕以下运行时约束设计：\n\n- 延迟初始化，导入包本身不会立刻触发存储访问或 Expo 原生模块加载；\n- 明确的 Expo 安装契约，不把宿主应用必需的 Expo 原生模块偷偷打进库本身；\n- 可插拔双存储引擎：支持默认的 `'file-system'` 文件存储，以及可选的 `'sqlite'` 原生高性能存储引擎；\n- 原生 SQL 与表达式索引下推：在 SQLite 引擎下，过滤、排序与分页直接编译为 SQLite 原生 JSON1 语句执行，辅以 `json_extract` 原生表达式索引，消除反序列化瓶颈；\n- 字段级按需解密：加密表支持仅解密分页切片后的结果集，大幅削减 CPU 开销与内存占用；\n- 双向平滑在线迁移：通过 `migrateEngine` 在 `'file-system'` 与 `'sqlite'` 之间零数据丢失无缝切换底层存储；\n- 完整索引生命周期：`createTable({ indexes })` 与 `createIndex` 真正构建并持久化索引声明，唯一约束与查询加速跨重启保留；\n- 跨引擎查询一致性：数字键路径、数组 `$in`/`$nin`、`null` 语义与字符串排序（Unicode 码点序）在两引擎结果一致，下推不适用时自动回退内存过滤；\n- 同时支持明文存储和加密存储；\n- 对 Expo Go 下可支持的能力范围给出明确边界；\n- 在原生开发构建或独立应用中支持可选的原生加密加速；\n- 支持从历史 beta 根目录迁移到稳定的 `lite-data-store` 根目录。\n\n> **v3 迁移：**`plainStorage` 和 `expo-lite-data-store/dist/js/...` 等包内深层导入不再属于公开 API。请改从 `expo-lite-data-store` 根入口导入 `db` facade 或命名 API。对以 `encrypted: true` 创建的表，后续调用也必须显式传入 `encrypted: true`；明文表面访问会被拒绝。\n\n## 支持矩阵\n\n| 运行面                       | 状态                             |\n| ---------------------------- | -------------------------------- |\n| Expo SDK                     | `56.x`                           |\n| React                        | `19.2.x`                         |\n| React Native                 | `0.85.x`                         |\n| Managed App                  | 支持                             |\n| Expo Go                      | 支持本文档定义的运行契约         |\n| Native Dev Client / 独立应用 | 支持，且推荐用于原生加密性能验证 |\n\n## 安装\n\n本库不支持把 `npm install expo-lite-data-store` 当作唯一安装步骤。\n\n对 Expo SDK 56 而言，唯一受支持的基础安装命令是：\n\n```bash\nnpx expo install expo-lite-data-store expo-file-system expo-constants expo-crypto expo-secure-store\n```\n\n即使包管理器显示安装完成，也应将“只执行 `npm install expo-lite-data-store`”视为不完整安装。\n\n`react-native-quick-crypto` 是可选 peer 依赖。只有当应用需要在原生开发构建或独立应用中启用原生旗舰加密提供者时，才需要额外安装：\n\n```bash\nnpx expo install react-native-quick-crypto\n```\n\n### 为什么 Expo 运行时包保持在 `peerDependencies`\n\n发布包只包含编译后的 JavaScript 与类型声明。Expo 运行时模块被刻意保留为 peer 依赖，因为它们本质上属于消费应用自己的原生依赖树。\n\n这样做可以避免以下问题：\n\n- 宿主应用与库内部使用的 Expo 原生模块版本不一致；\n- npm 安装成功，但运行时仍然找不到 Expo 原生模块；\n- Expo Go、开发构建和独立应用之间出现原生依赖假设漂移。\n\n### 安装契约\n\n| 契约                                                                                                  | 状态     | 说明                                                    |\n| ----------------------------------------------------------------------------------------------------- | -------- | ------------------------------------------------------- |\n| `npx expo install expo-lite-data-store expo-file-system expo-constants expo-crypto expo-secure-store` | 正式支持 | Expo SDK 56 下的 managed-compatible 安装契约            |\n| 在上一条基础上额外安装 `expo-sqlite`                                                                  | 正式支持 | 用于启用 SQLite 高性能存储引擎与原生 SQL/JSON1 索引下推 |\n| 在上一条基础上额外安装 `react-native-quick-crypto`                                                    | 正式支持 | 用于 native dev client 或独立应用中的原生旗舰加密验证   |\n| 仅执行 `npm install expo-lite-data-store`                                                             | 不支持   | 可能导致 Expo peer 依赖缺失或版本未对齐                 |\n\n### 必需运行时包\n\n| 包名                | 用途                                                   |\n| ------------------- | ------------------------------------------------------ |\n| `expo-file-system`  | 负责表文件、chunk 文件、元数据文件和目录管理           |\n| `expo-constants`    | 负责从 `app.json` 读取运行时配置，并识别 Expo 运行环境 |\n| `expo-crypto`       | 负责随机数、哈希和 Expo 兼容的加密辅助流程             |\n| `expo-secure-store` | 负责安全存储派生后的主密钥材料                         |\n\n`expo-modules-core` 也会作为 Expo 原生模块桥接层被内部使用，但它由宿主 Expo 运行时提供，不作为单独的 consumer 安装契约项暴露给使用者。\n\n### 运行时缺包提示\n\n如果宿主 Expo 应用缺少必需运行时包，库会抛出 `StorageError`，错误码为 `EXPO_MODULE_MISSING`。\n\n错误详情会指出当前缺失的模块，错误建议会回到唯一受支持的安装命令：\n\n```bash\nnpx expo install expo-lite-data-store expo-file-system expo-constants expo-crypto expo-secure-store\n```\n\n这类错误应被视为消费应用安装契约失败，而不是可忽略的运行时警告。\n\n## 快速开始\n\n### 1. 安装正式支持的依赖组合\n\n```bash\nnpx expo install expo-lite-data-store expo-file-system expo-constants expo-crypto expo-secure-store\n```\n\n### 2. 可选：在 `app.json` 中定义运行时配置\n\n```json\n{\n  \"expo\": {\n    \"extra\": {\n      \"liteStore\": {\n        \"chunkSize\": 8388608,\n        \"storageFolder\": \"my-app-store\",\n        \"performance\": {\n          \"maxConcurrentOperations\": 8\n        },\n        \"autoSync\": {\n          \"enabled\": true,\n          \"interval\": 15000,\n          \"minItems\": 1,\n          \"batchSize\": 100\n        }\n      }\n    }\n  }\n}\n```\n\n> `autoSync` 仅对默认的 `file-system` 引擎生效：它通过进程内定时器在应用运行期间定期刷出脏缓存条目。`sqlite` 引擎直接落盘、不使用该定时器；进程挂起期间也不会执行同步。\n\n### 3. 创建表并写入记录\n\n```ts\nimport { db } from 'expo-lite-data-store';\n\nawait db.init();\n\nawait db.createTable('users', {\n  columns: {\n    id: 'string',\n    name: 'string',\n    email: 'string',\n    age: 'number',\n    active: 'boolean',\n  },\n  mode: 'single',\n});\n\nawait db.insert('users', [\n  { id: '1', name: 'Alice', email: 'alice@example.com', age: 28, active: true },\n  { id: '2', name: 'Bob', email: 'bob@example.com', age: 31, active: false },\n]);\n\nconst activeUsers = await db.findMany('users', {\n  where: { active: true },\n  sortBy: 'age',\n  order: 'asc',\n});\n```\n\n`db.init()` 是可选且幂等的。所有公开 API 在第一次真实调用时都会走同一套延迟初始化路径。\n\n## 使用说明\n\n### 如何选择存储模式\n\n以下场景更适合 `mode: 'single'`：\n\n- 表规模较小；\n- 更新通常会整体替换表内容；\n- 你更关心简单性，而不是极大文件的处理能力。\n\n以下场景更适合 `mode: 'chunked'`：\n\n- 表可能增长为较大的本地数据集；\n- 你预期会频繁追加或覆盖大批量记录；\n- 希望在超过阈值时让运行时自动切分为多个 chunk 文件。\n\n建表时若传入 `initialData`，其序列化大小估算值只有在超过 `chunkSize` 一半时才会自动选择 chunked 模式；默认 `chunkSize` 为 5 MiB，因此默认门槛是超过 2.5 MiB。后续写入不会隐式把单文件表迁移为 chunked；需要转换时请显式设置 `mode: 'chunked'` 或调用 `migrateToChunked()`。\n\nchunked 覆盖写使用有界 v2 日志：日志只记录旧计数和 chunk 状态，不复制旧记录；已有 chunk 会移入 `<table>.overwrite-backup/`，并以 `.ready` 标记区分完整备份。删除 overwrite 日志是提交点；若提交后的备份清理失败，后续访问会先校验当前表，再删除残留备份。chunked 追加写也使用恢复日志，并在失败时移除已写出的部分 chunk。运行时会先解决待处理的追加日志、再解决待处理的覆盖写；追加写会先提交元数据、再移除恢复日志；读取遇到不完整 chunk 集合时会明确报错，而不是静默返回部分数据。single-to-chunked 迁移会先发布并校验新 chunk 集合，再切换元数据 mode；mode 切换是提交点，之后清理旧单文件工件失败不会回滚已经提交的模式。\n\n单文件表采用可恢复发布。v2 commit marker 会绑定表名，并记录前后两代 storage commit token、SHA-256 hash 和物理记录数。恢复时直接读取磁盘上的持久化元数据快照，不信任适配器内的缓存 token。canonical v1 marker 只为兼容而保留；临时 marker 仅在它是 v2 `committed`、表名和目标 token 与持久化元数据一致、hash/count 与主文件一致时才可采信，任何不匹配都会 fail-closed 并保留证据。非 marker 恢复场景中，主文件缺失或损坏时也只能从有效的数据备份恢复。\n\n文件处理器会通过跨实例共享的进程内 FIFO 队列，串行处理同一物理表路径上的操作；锁等待上限为 30 秒。若可恢复 mutation 超过截止时间，运行时不会放弃仍不可取消的底层文件操作，而是等待其结束、回滚后再释放路径锁。该协调不提供跨进程锁语义。在该路径队列之上，adapter 还通过按表 write lock 串行化同一张表的读-改-写操作（`update`、`remove`、`bulkWrite` 以及事务 commit/rollback 的写入），并发写入会排队执行，不会交错导致更新丢失。\n\n元数据 flush 使用另一条按元数据文件键控的进程级 FIFO，锁等待上限同样为 30 秒。每次 flush 都会重新读取最新磁盘快照；update/delete 必须匹配预期 `createdAt` 代际，create 则要求表名仍然缺失，因此陈旧 mutation 不能修改或覆盖同名新代际。共享 mutation epoch 会让其他 adapter 刷新元数据、存储表示、读取缓存 namespace 与索引；稳定读取会按最新 mode 重试。失败或超时的 mutation 会保留，等待显式重试。元数据主文件缺失时，初始化只会恢复结构有效的 backup；主文件存在但损坏时绝不回退到可能陈旧的 backup。发布与恢复都必须成功移除旧 backup 才算完成。该机制仍只协调当前进程，不是跨进程元数据锁。\n\n### 列定义\n\n`createTable()` 接受 `columns` 配置。当前运行时接受以下列类型：\n\n- `string`\n- `number`\n- `boolean`\n- `date`\n- `blob`\n\n列定义主要用于表元数据和写入验证，公开 API 里的记录本质上仍然是普通 JavaScript 对象。\n\n记录不强制要求包含 `id` 或 `_id`。这些字段适合作为业务标识，也能在存在索引时帮助加速；但基于 `where` 的更新、删除、批量操作和事务路径会按查询引擎实际命中的行来处理，所以没有 id 的记录也会被安全地逐行匹配。内存索引优先使用字符串或有限数值形式的 `id`，仅在 `id` 不稳定时回退到 `_id`。只要索引覆盖的任一行没有稳定标识符，该索引就不会参与查询加速，查询会回退到全表扫描。增量写入只暂存受影响 bucket 的 delta，并在物理存储成功后发布。\n\n### 写入数据\n\n当你希望追加新记录时，使用 `insert()`：\n\n```ts\nawait db.insert('events', { id: 'evt-1', type: 'login' });\n```\n\n当你希望逻辑上替换整张表的内容时，使用 `overwrite()`：\n\n```ts\nawait db.overwrite('cache', [{ id: 'cfg', version: 2, payload: { theme: 'dark' } }]);\n```\n\n当前运行时返回的 `WriteResult` 结构如下：\n\n```ts\ntype WriteResult = {\n  written: number;\n  totalAfterWrite: number;\n  chunked: boolean;\n  chunks?: number;\n};\n```\n\n在当前实现里：\n\n- `written` 表示本次操作写入或影响的记录数；\n- `totalAfterWrite` 表示操作完成后表中的总记录数；\n- `chunked` 表示当前表是否处于 chunked 模式。\n\n### 读取和查询\n\n当你的语义是“直接拿到表里当前存储的内容”时，使用 `read()`：\n\n```ts\nconst rows = await db.read('users');\n```\n\n`read()` 是原始表读取，不负责应用过滤条件、排序或分页。即使你在 options 中传了这些字段，顶层公开 API 也会忽略它们。\n\n当你需要真正的查询语义时，使用 `findOne()` 或 `findMany()`：\n\n```ts\nconst expensiveElectronics = await db.findMany('products', {\n  where: {\n    $and: [{ category: 'Electronics' }, { price: { $gt: 100 } }],\n  },\n  sortBy: 'price',\n  order: 'desc',\n  limit: 20,\n});\n```\n\n`skip` 和 `limit` 必须是非负安全整数。`limit: 0` 返回空页；负数、小数、非有限数或超出安全整数范围的值会抛出 `RangeError`，不会交给数组切片静默换算。该输入校验错误会以原始 `RangeError` 交给调用方，不会再包装成 `StorageError`。\n\n所有受支持的排序算法在升序和降序下都会保持 `null`、`undefined` 的相对顺序，并把它们放在结果末尾。\n\n当前支持的查询操作符如下：\n\n| 操作符  | 含义                                |\n| ------- | ----------------------------------- |\n| `$and`  | 对多个条件做逻辑与                  |\n| `$or`   | 对多个条件做逻辑或                  |\n| `$eq`   | 精确相等                            |\n| `$ne`   | 不相等                              |\n| `$gt`   | 大于                                |\n| `$gte`  | 大于等于                            |\n| `$lt`   | 小于                                |\n| `$lte`  | 小于等于                            |\n| `$in`   | 值或数组成员出现在候选集合中        |\n| `$nin`  | 值或数组成员不在候选集合中          |\n| `$like` | 使用 `%` 和 `_` 的 SQL 风格模糊匹配 |\n\n### 更新记录\n\n`update()` 会把更新数据应用到所有命中 `where` 的记录上。\n\n简单字段更新：\n\n```ts\nawait db.update('users', { active: false }, { where: { id: '2' } });\n```\n\n基于操作符的更新：\n\n```ts\nawait db.update('accounts', { $inc: { balance: -200 } }, { where: { id: 'acct-1' } });\n```\n\n当前支持的更新操作符如下：\n\n| 操作符      | 含义                         |\n| ----------- | ---------------------------- |\n| `$inc`      | 数值递增或递减               |\n| `$set`      | 显式设置字段值               |\n| `$unset`    | 删除字段                     |\n| `$push`     | 向数组字段追加一个值         |\n| `$pull`     | 从数组字段移除匹配值         |\n| `$addToSet` | 仅当数组中不存在该值时再追加 |\n\n### 批量操作\n\n`bulkWrite()` 接收按顺序执行的 `insert`、`update`、`delete` 操作数组：\n\n```ts\nawait db.bulkWrite('users', [\n  { type: 'insert', data: { id: '3', name: 'Carol' } },\n  { type: 'update', data: { $set: { active: true } }, where: { id: '2' } },\n  { type: 'delete', where: { active: false } },\n]);\n```\n\n当业务流程希望用一次高层调用描述一组有顺序要求的本地变更时，这个 API 很适合。\n\n### 存储引擎与 SQLite 原生加速\n\n库支持两种可插拔底层存储引擎，默认为 `'file-system'`。当需要承载更大规模数据并追求极限查询性能时，可切换至 `'sqlite'`：\n\n- **可选依赖与按需加载**：`expo-sqlite` 为可选 peer 依赖。使用默认的 `'file-system'` 引擎时无需安装 `expo-sqlite`；仅在显式配置 `engine: 'sqlite'` 时按需安装即可。\n- **性能飞跃**：在 SQLite 引擎下，`findMany`、`findOne`、`update`、`delete` 的查询条件、排序与分页直接编译为底层 SQL 语句执行（基于 SQLite JSON1 扩展），避免全表反序列化，基准测试下查询耗时缩短 **10x+**。\n- **按需分页解密**：字段级加密表结合 SQLite 下推时，仅对最终分页切片的数据调用批量解密，极大降低内存占用与 CPU 开销。\n\n#### 启用 SQLite 引擎\n\n安装可选依赖：\n\n```bash\nnpx expo install expo-sqlite\n```\n\n在 `app.json` 中配置或通过运行时 API 指定：\n\n```ts\nimport { db, init } from 'expo-lite-data-store';\n\nawait init({ engine: 'sqlite' });\n```\n\n#### 表达式索引管理\n\n```ts\nimport { db, createIndex, dropIndex } from 'expo-lite-data-store';\n\n// 创建字段索引（SQLite 下生成原生 json_extract 表达式索引）\nawait createIndex('users', 'email', { unique: true });\n\n// 删除索引\nawait dropIndex('users', 'email');\n```\n\n在建表时也可以通过 `indexes` 声明：\n\n```ts\nawait db.createTable('products', {\n  indexes: ['category', { field: 'sku', unique: true }],\n});\n```\n\n声明在建表时即校验——字段名为空会以 `TABLE_INDEX_INVALID` 失败，`unique` 冲突会让建表整体回滚而不是留下半成品表。`file-system` 引擎下，索引声明会持久化到表元数据并在启动时自动重建，因此唯一约束与查询加速能跨重启保留；对非空表调用 `createIndex` 会立即基于现有数据构建索引。声明仅在 `createTable` 真正创建表时生效——对已存在的表再次调用会忽略声明，不会触发回滚或删除表中已有数据。\n\n#### 双向平滑数据迁移\n\n支持在 `'file-system'` 与 `'sqlite'` 之间进行在线、零数据丢失的双向全库迁移：\n\n```ts\nimport { migrateEngine } from 'expo-lite-data-store';\n\nconst result = await migrateEngine('sqlite', {\n  cleanSource: true, // 迁移并严格校验通过后，自动清空源引擎数据\n  progressCallback: ({ table, copied, total }) => {\n    console.log(`Migrating ${table}: ${copied}/${total}`);\n  },\n});\n\nconsole.log(\n  `Migrated ${result.totalRecords} records across ${result.migratedTables.length} tables in ${result.durationMs}ms`\n);\n```\n\n### 删除表\n\n`deleteTable()` 会先提交元数据删除，再清理物理文件。若元数据提交失败，运行时会恢复原元数据，且不会触碰物理数据。提交成功后，元数据缺失就是权威删除状态，残留文件不能让表复活；若工件清理失败，该表仍保持逻辑不存在，再次调用 `deleteTable()` 会重试清理。同名重建会先清除全部孤立单文件、chunk、journal、marker 和 backup 工件。\n\n### 事务\n\n事务是显式且有状态的：\n\n```ts\nawait db.beginTransaction();\n\ntry {\n  await db.update('accounts', { $inc: { balance: -200 } }, { where: { id: 'acct-1' } });\n  await db.update('accounts', { $inc: { balance: 200 } }, { where: { id: 'acct-2' } });\n} catch (error) {\n  await db.rollback();\n  throw error;\n}\n\n// commit 失败时会在内部恢复快照，然后重新抛出错误。\nawait db.commit();\n```\n\n当前事务行为需要注意：\n\n- 同一适配器表面一次只能有一个活动事务；\n- 在未结束前再次调用 `beginTransaction()` 会抛出 `TRANSACTION_IN_PROGRESS`；\n- 没有活动事务时调用 `commit()` 或 `rollback()` 会抛出 `NO_TRANSACTION_IN_PROGRESS`；\n- 事务 owner 通过 `read()`、`countTable()`、`findOne()` 和 `findMany()` 具备 read-your-writes 可见性；过滤、排序和分页基于暂存视图执行，`remove()` 返回该视图中实际命中的记录数；\n- 排队的可序列化记录输入、对象形式的查询值和事务查询结果与调用方后续的对象修改相隔离；\n- 在活动事务 owner 的匹配存储表面上，公开的 schema 操作 `createTable()`、`deleteTable()` 和 `migrateToChunked()` 会以 `TRANSACTION_OPERATION_NOT_SUPPORTED` 被拒绝，因为它们会立即持久化元数据或文件；其他 adapter 或安全表面会先由既有事务 guard 拒绝；\n- 显式回滚只丢弃排队写入，不会重写表文件；若提交执行到一半失败，已有表会恢复，事务中新建的表会被移除；\n- commit 执行和 commit 失败后的快照恢复使用模块私有 symbol capability 进行直接写；公开 options 中伪造 `directWrite` 不能绕过事务暂存；\n- 活动事务期间 AutoSync 会保留脏缓存项，只有事务结束后的后续定时同步才会写入；\n- 事务是进程内协调能力，不是跨进程或应用崩溃后仍可恢复的 ACID 实现。\n\n### 计数与校验\n\n当你需要快速读取当前记录数时，使用 `countTable()`：\n\n```ts\nconst total = await db.countTable('users');\n```\n\n当你需要排查元数据是否漂移时，使用 `verifyCountTable()`：\n\n```ts\nconst result = await db.verifyCountTable('users');\n// { metadata: number, actual: number, match: boolean }\n```\n\n`verifyCountTable()` 会比 `countTable()` 慢，因为它会把元数据计数与真实磁盘数据做比对，并在检测到不一致时进行修复。\n\n## 配置说明\n\n### 配置优先级\n\n当前运行时从低到高按以下顺序合并配置：\n\n1. `defaultConfig` 内建默认值\n2. 受支持的 `LITE_STORE_*` 环境变量\n3. 一个 Expo 运行时配置来源\n4. 通过 `configManager.setConfig()`、`configManager.updateConfig()`、`configManager.set()` 注入的程序化配置\n\n运行时配置层不会合并每一种宿主来源。在 Expo、React Native 或测试运行时中，它会按以下顺序选择第一个可用来源：`global.__expoConfig.extra.liteStore`、`expo-constants`（`getConfig()`、`expoConfig`、`manifest` 或 `extra`）、`global.expo.extra.liteStore`，最后才回退到 `global.liteStoreConfig`。\n\n### 常用运行时配置项\n\n| Key                                    | 默认值            | 作用                                                                                                                                                |\n| -------------------------------------- | ----------------- | --------------------------------------------------------------------------------------------------------------------------------------------------- |\n| `engine`                               | `file-system`     | 存储引擎：`'file-system'`、`'sqlite'` 或 `'auto'`（可加载 `expo-sqlite` 时选 `sqlite`，否则回退 `file-system`）；显式指定会覆盖迁移持久化的引擎标记 |\n| `chunkSize`                            | `5242880`         | 分片目标大小；初始数据自动选 chunked 的门槛为其一半                                                                                                 |\n| `storageFolder`                        | `lite-data-store` | Expo 文件系统下的根目录名                                                                                                                           |\n| `sortMethods`                          | `default`         | 默认排序策略提示                                                                                                                                    |\n| `timeout`                              | `10000`           | 单文件/分片 I/O 等操作的超时时间（每次调用时读取）；30 秒读守卫与文件锁等待为固定保护值、不随该配置                                                 |\n| `encryption.algorithm`                 | `auto`            | 首选加密算法模式                                                                                                                                    |\n| `encryption.keyIterations`             | `600000`          | PBKDF2 目标迭代次数，Expo Go 下会自动下调                                                                                                           |\n| `performance.maxConcurrentOperations`  | `5`               | 写入侧最大并发数                                                                                                                                    |\n| `cache.maxSize`                        | `1000`            | 缓存项预算；仅 `file-system` 引擎生效，`sqlite` 引擎下被忽略（不告警）                                                                              |\n| `monitoring.enablePerformanceTracking` | `false`           | 是否开启性能采样；存储侧读写样本仅 `file-system` 引擎记录（encrypt/decrypt 加密耗时样本两引擎均记录），`sqlite` 引擎初始化时一次性告警              |\n| `monitoring.enableHealthChecks`        | `true`            | 是否开启健康检查                                                                                                                                    |\n| `autoSync.enabled`                     | `false`           | `file-system` 引擎的自动同步定时器开关；需要定期刷出脏缓存时显式开启；`sqlite` 引擎下忽略并在初始化时一次性告警                                     |\n| `autoSync.interval`                    | `30000`           | 自动同步间隔，单位毫秒                                                                                                                              |\n| `autoSync.minItems`                    | `1`               | 触发自动同步前的最小排队项数                                                                                                                        |\n| `autoSync.batchSize`                   | `100`             | 每次自动同步中每张表最多处理的脏缓存条目数                                                                                                          |\n\n`autoSync.*` 配置的是一个进程内定时器，它只存在于 `file-system` 引擎的写后脏缓存链路中；`sqlite` 引擎直接落盘，这些配置项对其没有影响。定时器只在应用运行期间触发，不是操作系统级别的后台任务。\n\n`cache.*` 仅在 `file-system` 引擎下生效：`sqlite` 引擎不创建写后缓存。`monitoring.enablePerformanceTracking` 的存储侧读写样本也仅由 `file-system` 引擎记录——`sqlite` 引擎不记录存储侧性能样本，但 encrypt/decrypt 等加密耗时样本在两个引擎下都会记录。在 `sqlite` 引擎下开启 `autoSync.enabled` 或 `monitoring.enablePerformanceTracking`，初始化时会输出一条带 `[SQLiteStorageAdapter]` 前缀的一次性告警，而不是静默忽略；`cache.*` 与默认开启的 `monitoring.enableHealthChecks` 不告警（后者是 `performanceMonitor` 的运行开关，与存储引擎无关），只在文档中说明。\n\n`storageFolder` 只能是单一目录名，不能包含路径分隔符、编码后的分隔符或路径穿越名称。请在首次存储操作前完成配置；适配器运行期间修改该值会被明确拒绝，避免不同根目录间混用元数据和缓存状态。\n\n### 当前支持的环境变量\n\n| 环境变量                                           | 对应配置                              |\n| -------------------------------------------------- | ------------------------------------- |\n| `LITE_STORE_CHUNK_SIZE`                            | `chunkSize`                           |\n| `LITE_STORE_STORAGE_FOLDER`                        | `storageFolder`                       |\n| `LITE_STORE_SORT_METHODS`                          | `sortMethods`                         |\n| `LITE_STORE_TIMEOUT`                               | `timeout`                             |\n| `LITE_STORE_ENCRYPTION_KEY_ITERATIONS`             | `encryption.keyIterations`            |\n| `LITE_STORE_PERFORMANCE_MAX_CONCURRENT_OPERATIONS` | `performance.maxConcurrentOperations` |\n| `LITE_STORE_PERFORMANCE_MEMORY_WARNING_THRESHOLD`  | `performance.memoryWarningThreshold`  |\n| `LITE_STORE_CACHE_MAX_SIZE`                        | `cache.maxSize`                       |\n| `LITE_STORE_CACHE_DEFAULT_EXPIRY`                  | `cache.defaultExpiry`                 |\n| `LITE_STORE_AUTO_SYNC_ENABLED`                     | `autoSync.enabled`                    |\n| `LITE_STORE_AUTO_SYNC_INTERVAL`                    | `autoSync.interval`                   |\n\nLogger 控制项独立于 `configManager`。`EXPO_LITE_DATA_STORE_LOG_LEVEL` 支持 `silent`、`error`、`warn`、`info`、`debug`，非测试环境默认 `warn`。测试默认静默，避免大规模测试撑满本地磁盘或 CI 日志；设置 `EXPO_LITE_DATA_STORE_TEST_LOGS=1` 可开启测试 `debug` 输出。\n\n### 程序化配置\n\n```ts\nimport { configManager } from 'expo-lite-data-store';\n\nconfigManager.updateConfig({\n  storageFolder: 'my-app-store',\n  chunkSize: 8 * 1024 * 1024,\n  performance: {\n    maxConcurrentOperations: 8,\n  },\n  autoSync: {\n    enabled: true,\n    interval: 15000,\n  },\n});\n```\n\n当前公开的配置管理器能力包括：\n\n- `configManager.getConfig()`\n- `configManager.setConfig(partialConfig)`\n- `configManager.updateConfig(partialConfig)`\n- `configManager.resetConfig()`\n- `configManager.get(path)`\n- `configManager.set(path, value)`\n\n## 加密与安全边界\n\n### 明文与加密表面\n\n默认情况下，库使用明文存储适配器。若某次调用需要走加密存储表面，可以在 options 中传入 `encrypted: true`：\n\n```ts\nawait db.createTable('profiles', {\n  encrypted: true,\n  encryptedFields: ['email', 'phone'],\n});\n```\n\n当前可选的安全策略包括：\n\n- 通过 `encryptedFields` 做字段级加密；\n- 通过 `encryptFullTable: true` 做整表加密；\n- 通过 `requireAuthOnAccess: true` 表达严格的逐次访问认证意图。\n\n即使省略 `encrypted: true`，非空 `encryptedFields` 也会选择加密 facade。若加密写入在事务中隐式建表，解析后的字段列表会传入 commit，确保持久化策略与加密负载一致。隐式建表时，写入请求携带的字段列表会被持久化为表策略；对既有的明文表或策略不同的表发起这样的写入会以 `MIGRATION_FAILED` 失败，不会静默落盘明文。写路径（`insert`/`overwrite`/`update`/`bulkWrite`）单独传入空数组 `encryptedFields: []`、且没有 `encrypted: true` 等其它加密选项时会被拒绝（错误码 `FILE_CONTENT_INVALID`）：空数组的动态全字段语义属于 `createTable`，写路径请配合 `encrypted: true` 使用。\n\n一次加密写入若隐式创建了未知表，会持久化所选加密策略。该策略不是每次调用都能切换的开关：对既有加密表改变 `encrypted`、`encryptFullTable`、`encryptedFields` 或 `requireAuthOnAccess` 都需要由应用控制的数据迁移。运行时会以 `MIGRATION_FAILED` fail-closed，而不会静默用不同策略重写数据。\n\n对新建字段级加密表，只有 `encryptAllFields: true` 与 `encryptedFields: []` 的精确组合表示动态全字段加密，之后记录形态中新增的字段也会被加密。早期 v3 元数据没有该 marker；空列表或字段缺失仍按历史全局配置回退。整表加密在物理层只保存一条 envelope，其逻辑行数与同一 storage generation 一并提交；事务快照也会同时恢复两者。可选的解密缓存只在绑定当前精确 ciphertext 时才可命中，cache timeout 为 0 时完全禁用。\n\n### Expo Go 边界\n\n常规加密存储在 Expo Go 中可用。\n\n`requireAuthOnAccess: true` 采用严格语义；当当前运行时无法真正强制“每次访问都认证”时，库会直接抛出 `AUTH_ON_ACCESS_UNSUPPORTED`。\n\n严格访问使用独立的密钥作用域，不能把已有常规加密表原地升级。应由应用显式迁移数据：在旧密钥仍可用时通过常规加密表面读取数据，写入并验证一个新建的严格认证表，再退役旧表和旧密钥。库绝不会静默复用常规主密钥来满足严格访问。\n\n这意味着：\n\n- Expo Go 适合验证明文存储、chunked 存储和常规加密存储；\n- Expo Go 不适合验证生物识别或严格逐次访问认证保证；\n- 依赖 `react-native-quick-crypto` 的原生性能验证应在 native dev client 或独立应用中完成。\n\n### 既有设备数据\n\n稳定 3.x 运行时会继续兼容较早 beta 版本产生的设备端数据格式，包括：\n\n- 元数据文件；\n- 明文表文件；\n- chunked 表布局；\n- 历史 beta 产生的加密负载格式。\n\n字段批量解密会逐条识别 legacy CTR 与当前 GCM payload，按 provider 分组解密后恢复原始顺序。因此升级后的同一存储批次即使混合两种格式，也能保持可读。\n\n上述兼容不代表会把常规加密数据转换为严格访问数据或任何其他加密策略。若未经过应用控制的数据迁移就为已有加密表启用 `requireAuthOnAccess`、切换字段级/整表级加密或修改 `encryptedFields`，操作会以 `MIGRATION_FAILED` 失败。若适配器本身未按严格访问创建却请求严格访问，会以 `PERMISSION_DENIED` 失败；运行时绝不会替换为较弱的密钥。\n\n当稳定默认根目录 `lite-data-store` 尚不存在，而旧目录 `expo-lite-data` 存在时，运行时会自动尝试兼容迁移。\n\n## 性能与监控\n\n库导出了 `performanceMonitor`，供高级使用者和维护者做本地性能观察。普通 CRUD 场景不需要先接入它，但当你需要分析本地操作表现时，它是现成入口。\n\n当前可用的监控能力包括：\n\n- `configure()`\n- `getMetrics()`\n- `getOperationStats()`\n- `getGroupStats()`\n- `getOverallStats()`\n- `getThresholds()`\n- `getSampleRate()`\n- `performHealthCheck()`\n- `clear()`\n- `setEnabled()`\n- `isEnabled()`\n\n如果你的目标只是拿到发布级运行时证据，优先使用仓库自带的 QA baseline，而不是从零实现一套自定义监控流程。\n\n## 故障排查\n\n### 安装了包但抛出 `EXPO_MODULE_MISSING`\n\n大概率是消费应用只安装了 tarball 名称，而没有按文档安装完整的 Expo 运行时依赖。请重新执行：\n\n```bash\nnpx expo install expo-lite-data-store expo-file-system expo-constants expo-crypto expo-secure-store\n```\n\n### `requireAuthOnAccess` 在 Expo Go 中失败\n\n这是预期行为。Expo Go 不支持 `requireAuthOnAccess: true` 所要求的严格认证契约。请在 native dev client 或独立应用中验证该路径。\n\n### Expo Go 下加密操作感觉更慢\n\n这同样符合预期。运行时会为了可用性在 Expo Go 中主动降低 PBKDF2 迭代次数。若需要更高的原生加密性能验证，请使用安装了 `react-native-quick-crypto` 的原生构建。\n\n## 发布验证\n\n仓库提供了明确的发布基线 QA 命令：\n\n```bash\nnpm run qa:baseline:expo-go\nnpm run qa:baseline:native-flagship\n```\n\n如需连续执行两条基线：\n\n```bash\nnpm run qa:baseline:release\n```\n\n这些命令会在 `artifacts/expo-runtime-qa/` 下生成工件目录。发布判断应以生成的 `summary.json` 为准，而不是瞬时截图或手动复制的界面结果。\n\n## 文档入口\n\n- API 参考： [docs/API.zh-CN.md](./docs/API.zh-CN.md)\n- 英文 API 参考： [docs/API.en.md](./docs/API.en.md)\n- 运行时 QA 流程、lane 定义、verdict 语义与工件结构： [docs/EXPO_RUNTIME_QA.zh-CN.md](./docs/EXPO_RUNTIME_QA.zh-CN.md)\n- CI/CD 触发条件、npm 凭据、发布步骤与失败恢复： [docs/CI_CD.zh-CN.md](./docs/CI_CD.zh-CN.md)\n- 变更日志： [docs/CHANGELOG.zh-CN.md](./docs/CHANGELOG.zh-CN.md)\n- 英文变更日志： [docs/CHANGELOG.en.md](./docs/CHANGELOG.en.md)\n- 架构说明： [docs/ARCHITECTURE.zh-CN.md](./docs/ARCHITECTURE.zh-CN.md)\n- 贡献指南： [CONTRIBUTING.zh-CN.md](./CONTRIBUTING.zh-CN.md)\n- 安全策略： [SECURITY.zh-CN.md](./SECURITY.zh-CN.md)\n- README 入口页： [README.md](./README.md)\n- 英文开发者文档： [README.en.md](./README.en.md)\n\n## 许可证\n\n[MIT](./LICENSE.txt)\n","readmeFilename":"README.zh-CN.md"}