{"_id":"@nativesquare/soma","_rev":"41-ff29f9bc1c14cac75f0df5561b8921f8","name":"@nativesquare/soma","dist-tags":{"latest":"0.18.1"},"versions":{"0.1.0":{"name":"@nativesquare/soma","version":"0.1.0","keywords":["convex","component"],"license":"Apache-2.0","_id":"@nativesquare/soma@0.1.0","maintainers":[{"name":"maxime-ns","email":"maxime.gey@nativesquare.fr"}],"homepage":"https://github.com/NativeSquare/soma#readme","bugs":{"url":"https://github.com/NativeSquare/soma/issues"},"dist":{"shasum":"caea112e44ae0765bfc88e1080784c0a94c936b0","tarball":"https://registry.npmjs.org/@nativesquare/soma/-/soma-0.1.0.tgz","fileCount":194,"integrity":"sha512-ZfucXt9IgG5/jpR50aHXdtQAGdq55VmSpBRFActqxGiv8AVmJyxbT/8mMlQuMbIx9z1KmMrMzh50JmK6FKLxMw==","signatures":[{"sig":"MEYCIQDl4cyHvfdXoKRY9I7gh4BaU/a1sPJHxWXCcfbPByXqJgIhAMN393F4KosTdUmZB2F+MuEA+S/m9WzJCtslgWkhOkLN","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":1238801},"pnpm":{"onlyBuiltDependencies":["esbuild","@tailwindcss/oxide"]},"type":"module","types":"./dist/client/index.d.ts","module":"./dist/client/index.js","exports":{".":{"types":"./dist/client/index.d.ts","default":"./dist/client/index.js"},"./test":"./src/test.ts","./react":{"types":"./dist/react/index.d.ts","default":"./dist/react/index.js"},"./healthkit":{"types":"./dist/healthkit/index.d.ts","default":"./dist/healthkit/index.js"},"./package.json":"./package.json","./convex.config":{"types":"./dist/component/convex.config.d.ts","default":"./dist/component/convex.config.js"},"./convex.config.js":{"types":"./dist/component/convex.config.d.ts","default":"./dist/component/convex.config.js"},"./_generated/component":{"types":"./dist/component/_generated/component.d.ts"},"./_generated/component.js":{"types":"./dist/component/_generated/component.d.ts"}},"gitHead":"f94d868a0062e2f2cba1e79b0bdac636b2c3c83d","scripts":{"all":"run-p -r dev:* test:watch","dev":"run-p -r dev:*","lint":"eslint .","test":"vitest run --typecheck","alpha":"npm version prerelease --preid alpha && npm publish --tag alpha && git push --follow-tags","build":"tsc --project ./tsconfig.build.json","predev":"path-exists .env.local dist || (npm run build && convex dev --once)","release":"npm version patch && npm publish && git push --follow-tags","version":"vim -c 'normal o' -c 'normal o## '$npm_package_version CHANGELOG.md && prettier -w CHANGELOG.md && git add CHANGELOG.md","dev:build":"chokidar \"tsconfig*.json\" \"src/**/*.ts\" -i \"**/*.test.ts\" -c \"npm run build:codegen\" --initial","typecheck":"tsc --noEmit && tsc -p example && tsc -p example/convex","preversion":"npm ci && npm run build:clean && run-p test lint typecheck","test:debug":"vitest --inspect-brk --no-file-parallelism","test:watch":"vitest --typecheck --clearScreen false","build:clean":"npx rimraf dist *.tsbuildinfo && npm run build:codegen","dev:backend":"convex dev --typecheck-components","dev:frontend":"cd example && vite --clearScreen false","build:codegen":"npx convex codegen --component-dir ./src/component && npm run build","test:coverage":"vitest run --coverage --coverage.reporter=text","prepublishOnly":"npm whoami || npm login"},"_npmUser":{"name":"maxime-ns","email":"maxime.gey@nativesquare.fr"},"repository":{"url":"git+https://github.com/NativeSquare/soma.git","type":"git"},"_npmVersion":"11.4.2","description":"A Convex component that normalizes health and fitness data from multiple wearable providers into a single, consistent schema.","directories":{},"_nodeVersion":"23.3.0","_hasShrinkwrap":false,"devDependencies":{"vite":"7.3.1","react":"^19.2.4","convex":"1.31.7","eslint":"9.39.2","vitest":"4.0.18","globals":"^17.3.0","prettier":"3.8.1","react-dom":"^19.2.4","@eslint/js":"9.39.2","pkg-pr-new":"^0.0.63","typescript":"5.9.3","@types/node":"^24.10.11","convex-test":"0.0.41","@types/react":"^19.2.13","chokidar-cli":"3.0.0","npm-run-all2":"8.0.4","path-exists-cli":"2.0.0","@edge-runtime/vm":"^5.0.0","@eslint/eslintrc":"^3.3.3","@types/react-dom":"^19.2.3","typescript-eslint":"8.54.0","eslint-plugin-react":"^7.37.5","@vitejs/plugin-react":"^5.1.3","@convex-dev/eslint-plugin":"^1.1.1","eslint-plugin-react-hooks":"^7.0.1","eslint-plugin-react-refresh":"^0.5.0"},"peerDependencies":{"react":"^18.3.1 || ^19.0.0","convex":"^1.31.7"},"_npmOperationalInternal":{"tmp":"tmp/soma_0.1.0_1771277872411_0.8416399624724116","host":"s3://npm-registry-packages-npm-production"}},"0.1.1":{"name":"@nativesquare/soma","version":"0.1.1","keywords":["convex","component"],"license":"Apache-2.0","_id":"@nativesquare/soma@0.1.1","maintainers":[{"name":"maxime-ns","email":"maxime.gey@nativesquare.fr"}],"homepage":"https://github.com/NativeSquare/soma#readme","bugs":{"url":"https://github.com/NativeSquare/soma/issues"},"dist":{"shasum":"f8f5ea1e9de0fab37e6d2ba67cda65f243d1e0e2","tarball":"https://registry.npmjs.org/@nativesquare/soma/-/soma-0.1.1.tgz","fileCount":194,"integrity":"sha512-hD3OtLOhSuVBrSLZ968ohtehytlL/nst11tHhblQzrbFwFoDJl80YOe38BMaEfm+YXige6DnCebJ8axOPoG1iA==","signatures":[{"sig":"MEQCIEmSNnO3pxxlSsy/Ct+ZqSPb68q4RsO/4P3jVQiHqYjTAiAPM0PteO4AevoFHCMUZB+rNLz0dB7peHx4w+Coo+W0gA==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":1245177},"pnpm":{"onlyBuiltDependencies":["esbuild","@tailwindcss/oxide"]},"type":"module","types":"./dist/client/index.d.ts","module":"./dist/client/index.js","exports":{".":{"types":"./dist/client/index.d.ts","default":"./dist/client/index.js"},"./test":"./src/test.ts","./react":{"types":"./dist/react/index.d.ts","default":"./dist/react/index.js"},"./healthkit":{"types":"./dist/healthkit/index.d.ts","default":"./dist/healthkit/index.js"},"./package.json":"./package.json","./convex.config":{"types":"./dist/component/convex.config.d.ts","default":"./dist/component/convex.config.js"},"./convex.config.js":{"types":"./dist/component/convex.config.d.ts","default":"./dist/component/convex.config.js"},"./_generated/component":{"types":"./dist/component/_generated/component.d.ts"},"./_generated/component.js":{"types":"./dist/component/_generated/component.d.ts"}},"gitHead":"520d8587e944c655c5da7a9d03098ba98bfd0a69","scripts":{"all":"run-p -r dev:* test:watch","dev":"run-p -r dev:*","lint":"eslint .","test":"vitest run --typecheck","alpha":"npm version prerelease --preid alpha && npm publish --tag alpha && git push --follow-tags","build":"tsc --project ./tsconfig.build.json","predev":"path-exists .env.local dist || (npm run build && convex dev --once)","release":"npm version patch && npm publish && git push --follow-tags","version":"vim -c 'normal o' -c 'normal o## '$npm_package_version CHANGELOG.md && prettier -w CHANGELOG.md && git add CHANGELOG.md","dev:build":"chokidar \"tsconfig*.json\" \"src/**/*.ts\" -i \"**/*.test.ts\" -c \"npm run build:codegen\" --initial","typecheck":"tsc --noEmit && tsc -p example && tsc -p example/convex","preversion":"npm ci && npm run build:clean && run-p test lint typecheck","test:debug":"vitest --inspect-brk --no-file-parallelism","test:watch":"vitest --typecheck --clearScreen false","build:clean":"npx rimraf dist *.tsbuildinfo && npm run build:codegen","dev:backend":"convex dev --typecheck-components","dev:frontend":"cd example && vite --clearScreen false","build:codegen":"npx convex codegen --component-dir ./src/component && npm run build","test:coverage":"vitest run --coverage --coverage.reporter=text","prepublishOnly":"npm whoami || npm login"},"_npmUser":{"name":"maxime-ns","email":"maxime.gey@nativesquare.fr"},"repository":{"url":"git+https://github.com/NativeSquare/soma.git","type":"git"},"_npmVersion":"11.4.2","description":"A Convex component that normalizes health and fitness data from multiple wearable providers into a single, consistent schema.","directories":{},"_nodeVersion":"23.3.0","_hasShrinkwrap":false,"devDependencies":{"vite":"7.3.1","react":"^19.2.4","convex":"1.31.7","eslint":"9.39.2","vitest":"4.0.18","globals":"^17.3.0","prettier":"3.8.1","react-dom":"^19.2.4","@eslint/js":"9.39.2","pkg-pr-new":"^0.0.63","typescript":"5.9.3","@types/node":"^24.10.11","convex-test":"0.0.41","@types/react":"^19.2.13","chokidar-cli":"3.0.0","npm-run-all2":"8.0.4","path-exists-cli":"2.0.0","@edge-runtime/vm":"^5.0.0","@eslint/eslintrc":"^3.3.3","@types/react-dom":"^19.2.3","typescript-eslint":"8.54.0","eslint-plugin-react":"^7.37.5","@vitejs/plugin-react":"^5.1.3","@convex-dev/eslint-plugin":"^1.1.1","eslint-plugin-react-hooks":"^7.0.1","eslint-plugin-react-refresh":"^0.5.0"},"peerDependencies":{"react":"^18.3.1 || ^19.0.0","convex":"^1.31.7"},"_npmOperationalInternal":{"tmp":"tmp/soma_0.1.1_1771278182381_0.5420364895816818","host":"s3://npm-registry-packages-npm-production"}},"0.1.2":{"name":"@nativesquare/soma","version":"0.1.2","keywords":["convex","component"],"license":"Apache-2.0","_id":"@nativesquare/soma@0.1.2","maintainers":[{"name":"maxime-ns","email":"maxime.gey@nativesquare.fr"}],"homepage":"https://github.com/NativeSquare/soma#readme","bugs":{"url":"https://github.com/NativeSquare/soma/issues"},"dist":{"shasum":"5200bb24626b369e2e117b31949eeef75b9f9731","tarball":"https://registry.npmjs.org/@nativesquare/soma/-/soma-0.1.2.tgz","fileCount":194,"integrity":"sha512-Lkz4b+6bL1xkYoVOXT8Gq9+nlXoDd7uTqlo7OBdWQ8UY4CJtNzjXzL+4cca6XUozuej5Ul+edYO3mcorxro7Jg==","signatures":[{"sig":"MEYCIQDZQVeyElSX7HHSneHjnqaG8o1qCMvD6jMwWEewlo8wkwIhAJXYEWuuwvD5b6rWLZFbZ7YWC9JlSFnDeaCt+iSiHLt3","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":1433952},"pnpm":{"onlyBuiltDependencies":["esbuild","@tailwindcss/oxide"]},"type":"module","types":"./dist/client/index.d.ts","module":"./dist/client/index.js","exports":{".":{"types":"./dist/client/index.d.ts","default":"./dist/client/index.js"},"./test":"./src/test.ts","./react":{"types":"./dist/react/index.d.ts","default":"./dist/react/index.js"},"./healthkit":{"types":"./dist/healthkit/index.d.ts","default":"./dist/healthkit/index.js"},"./package.json":"./package.json","./convex.config":{"types":"./dist/component/convex.config.d.ts","default":"./dist/component/convex.config.js"},"./convex.config.js":{"types":"./dist/component/convex.config.d.ts","default":"./dist/component/convex.config.js"},"./_generated/component":{"types":"./dist/component/_generated/component.d.ts"},"./_generated/component.js":{"types":"./dist/component/_generated/component.d.ts"}},"gitHead":"58d180ca05ec1260c191648fa431ba3dd80ea0c6","scripts":{"all":"run-p -r dev:* test:watch","dev":"run-p -r dev:*","lint":"eslint .","test":"vitest run --typecheck","alpha":"npm version prerelease --preid alpha && npm publish --tag alpha && git push --follow-tags","build":"tsc --project ./tsconfig.build.json","predev":"path-exists .env.local dist || (npm run build && convex dev --once)","release":"npm version patch && npm publish && git push --follow-tags","version":"vim -c 'normal o' -c 'normal o## '$npm_package_version CHANGELOG.md && prettier -w CHANGELOG.md && git add CHANGELOG.md","dev:build":"chokidar \"tsconfig*.json\" \"src/**/*.ts\" -i \"**/*.test.ts\" -c \"npm run build:codegen\" --initial","typecheck":"tsc --noEmit && tsc -p example && tsc -p example/convex","preversion":"npm ci && npm run build:clean && run-p test lint typecheck","test:debug":"vitest --inspect-brk --no-file-parallelism","test:watch":"vitest --typecheck --clearScreen false","build:clean":"npx rimraf dist *.tsbuildinfo && npm run build:codegen","dev:backend":"convex dev --typecheck-components","dev:frontend":"cd example && vite --clearScreen false","build:codegen":"npx convex codegen --component-dir ./src/component && npm run build","test:coverage":"vitest run --coverage --coverage.reporter=text","prepublishOnly":"npm whoami || npm login"},"_npmUser":{"name":"maxime-ns","email":"maxime.gey@nativesquare.fr"},"repository":{"url":"git+https://github.com/NativeSquare/soma.git","type":"git"},"_npmVersion":"11.4.2","description":"A Convex component that normalizes health and fitness data from multiple wearable providers into a single, consistent schema.","directories":{},"_nodeVersion":"23.3.0","_hasShrinkwrap":false,"devDependencies":{"vite":"7.3.1","react":"^19.2.4","convex":"1.31.7","eslint":"9.39.2","vitest":"4.0.18","globals":"^17.3.0","prettier":"3.8.1","react-dom":"^19.2.4","@eslint/js":"9.39.2","pkg-pr-new":"^0.0.63","typescript":"5.9.3","@types/node":"^24.10.11","convex-test":"0.0.41","@types/react":"^19.2.13","chokidar-cli":"3.0.0","npm-run-all2":"8.0.4","path-exists-cli":"2.0.0","@edge-runtime/vm":"^5.0.0","@eslint/eslintrc":"^3.3.3","@types/react-dom":"^19.2.3","typescript-eslint":"8.54.0","eslint-plugin-react":"^7.37.5","@vitejs/plugin-react":"^5.1.3","@convex-dev/eslint-plugin":"^1.1.1","eslint-plugin-react-hooks":"^7.0.1","eslint-plugin-react-refresh":"^0.5.0"},"peerDependencies":{"react":"^18.3.1 || ^19.0.0","convex":"^1.31.7"},"_npmOperationalInternal":{"tmp":"tmp/soma_0.1.2_1771279730323_0.30691418500071044","host":"s3://npm-registry-packages-npm-production"}},"0.2.0":{"name":"@nativesquare/soma","version":"0.2.0","keywords":["convex","component"],"license":"Apache-2.0","_id":"@nativesquare/soma@0.2.0","maintainers":[{"name":"maxime-ns","email":"maxime.gey@nativesquare.fr"}],"homepage":"https://github.com/NativeSquare/soma#readme","bugs":{"url":"https://github.com/NativeSquare/soma/issues"},"dist":{"shasum":"38bc207f55b8acb3e209c327d8c01f9dcbb26097","tarball":"https://registry.npmjs.org/@nativesquare/soma/-/soma-0.2.0.tgz","fileCount":243,"integrity":"sha512-8+xTyUG5Vlu7+K7o5xMr0dgLHU391M4PW6sEGyrhYfBmSzdZk7jliNuHjjFkQbejJW9A97mIZ64rOEwWknVfJQ==","signatures":[{"sig":"MEUCIBSCVVB9yvb3B8UZx8I71Eh6HWnpyPUjU2wLZ3wJiY0HAiEAzZgxR+mHnCw0rpNMiLQB94eE94GHf7fU3n8KraZiOOk=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":1663227},"pnpm":{"onlyBuiltDependencies":["esbuild","@tailwindcss/oxide"]},"type":"module","types":"./dist/client/index.d.ts","module":"./dist/client/index.js","exports":{".":{"types":"./dist/client/index.d.ts","default":"./dist/client/index.js"},"./test":"./src/test.ts","./react":{"types":"./dist/react/index.d.ts","default":"./dist/react/index.js"},"./strava":{"types":"./dist/strava/index.d.ts","default":"./dist/strava/index.js"},"./healthkit":{"types":"./dist/healthkit/index.d.ts","default":"./dist/healthkit/index.js"},"./package.json":"./package.json","./convex.config":{"types":"./dist/component/convex.config.d.ts","default":"./dist/component/convex.config.js"},"./convex.config.js":{"types":"./dist/component/convex.config.d.ts","default":"./dist/component/convex.config.js"},"./_generated/component":{"types":"./dist/component/_generated/component.d.ts"},"./_generated/component.js":{"types":"./dist/component/_generated/component.d.ts"}},"gitHead":"44cca1a7aaf394545d15e0ac4710373fbca4a354","scripts":{"all":"run-p -r dev:* test:watch","dev":"run-p -r dev:*","lint":"eslint .","test":"vitest run --typecheck","alpha":"npm version prerelease --preid alpha && npm publish --tag alpha && git push --follow-tags","build":"tsc --project ./tsconfig.build.json","predev":"path-exists .env.local dist || (npm run build && convex dev --once)","release":"npm version patch && npm publish && git push --follow-tags","version":"vim -c 'normal o' -c 'normal o## '$npm_package_version CHANGELOG.md && prettier -w CHANGELOG.md && git add CHANGELOG.md","dev:build":"chokidar \"tsconfig*.json\" \"src/**/*.ts\" -i \"**/*.test.ts\" -c \"npm run build:codegen\" --initial","typecheck":"tsc --noEmit && tsc -p example && tsc -p example/convex","preversion":"npm ci && npm run build:clean && run-p test lint typecheck","test:debug":"vitest --inspect-brk --no-file-parallelism","test:watch":"vitest --typecheck --clearScreen false","build:clean":"npx rimraf dist *.tsbuildinfo && npm run build:codegen","dev:backend":"convex dev --typecheck-components","dev:frontend":"cd example && vite --clearScreen false","build:codegen":"npx convex codegen --component-dir ./src/component && npm run build","test:coverage":"vitest run --coverage --coverage.reporter=text","prepublishOnly":"npm whoami || npm login"},"_npmUser":{"name":"maxime-ns","email":"maxime.gey@nativesquare.fr"},"repository":{"url":"git+https://github.com/NativeSquare/soma.git","type":"git"},"_npmVersion":"11.4.2","description":"A Convex component that normalizes health and fitness data from multiple wearable providers into a single, consistent schema.","directories":{},"_nodeVersion":"23.3.0","_hasShrinkwrap":false,"devDependencies":{"vite":"7.3.1","react":"^19.2.4","convex":"1.31.7","eslint":"9.39.2","vitest":"4.0.18","globals":"^17.3.0","prettier":"3.8.1","react-dom":"^19.2.4","@eslint/js":"9.39.2","pkg-pr-new":"^0.0.63","typescript":"5.9.3","@types/node":"^24.10.11","convex-test":"0.0.41","@types/react":"^19.2.13","chokidar-cli":"3.0.0","npm-run-all2":"8.0.4","path-exists-cli":"2.0.0","@edge-runtime/vm":"^5.0.0","@eslint/eslintrc":"^3.3.3","@types/react-dom":"^19.2.3","typescript-eslint":"8.54.0","eslint-plugin-react":"^7.37.5","@vitejs/plugin-react":"^5.1.3","@convex-dev/eslint-plugin":"^1.1.1","eslint-plugin-react-hooks":"^7.0.1","eslint-plugin-react-refresh":"^0.5.0"},"peerDependencies":{"react":"^18.3.1 || ^19.0.0","convex":"^1.31.7"},"_npmOperationalInternal":{"tmp":"tmp/soma_0.2.0_1771289271802_0.10860686888395099","host":"s3://npm-registry-packages-npm-production"}},"0.3.0":{"name":"@nativesquare/soma","version":"0.3.0","keywords":["convex","component"],"license":"Apache-2.0","_id":"@nativesquare/soma@0.3.0","maintainers":[{"name":"maxime-ns","email":"maxime.gey@nativesquare.fr"}],"homepage":"https://github.com/NativeSquare/soma#readme","bugs":{"url":"https://github.com/NativeSquare/soma/issues"},"dist":{"shasum":"29ed8f79f1e23ea1b223289cca4556cbac8c884e","tarball":"https://registry.npmjs.org/@nativesquare/soma/-/soma-0.3.0.tgz","fileCount":248,"integrity":"sha512-+7DX1tQms0O9nabIUj4rWpGjKh2Ku4OEmu4iJZJrNm/Mtp5buer2SgC/Kbn3a6Q+7HBqEk1cXy8jlxSB2BKgqg==","signatures":[{"sig":"MEUCIDWRpYLiVdKI8ProwRMKPScE9Q0/MJSY8WyYaT9A3N8HAiEAy4F5BsfN30n3Qr1TusgsD/L4+NjuFNO/v0AMpKcvQg8=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":2083427},"pnpm":{"onlyBuiltDependencies":["esbuild","@tailwindcss/oxide"]},"type":"module","types":"./dist/client/index.d.ts","module":"./dist/client/index.js","exports":{".":{"types":"./dist/client/index.d.ts","default":"./dist/client/index.js"},"./test":"./src/test.ts","./react":{"types":"./dist/react/index.d.ts","default":"./dist/react/index.js"},"./strava":{"types":"./dist/strava/index.d.ts","default":"./dist/strava/index.js"},"./healthkit":{"types":"./dist/healthkit/index.d.ts","default":"./dist/healthkit/index.js"},"./validators":{"types":"./dist/validators.d.ts","default":"./dist/validators.js"},"./package.json":"./package.json","./convex.config":{"types":"./dist/component/convex.config.d.ts","default":"./dist/component/convex.config.js"},"./convex.config.js":{"types":"./dist/component/convex.config.d.ts","default":"./dist/component/convex.config.js"},"./_generated/component":{"types":"./dist/component/_generated/component.d.ts"},"./_generated/component.js":{"types":"./dist/component/_generated/component.d.ts"}},"gitHead":"894918df2f07cf3fb21416ba3bdb38ef1d52742a","scripts":{"all":"run-p -r dev:* test:watch","dev":"run-p -r dev:*","lint":"eslint .","test":"vitest run --typecheck","alpha":"npm version prerelease --preid alpha && npm publish --tag alpha && git push --follow-tags","build":"tsc --project ./tsconfig.build.json","predev":"path-exists .env.local dist || (npm run build && convex dev --once)","release":"npm version patch && npm publish && git push --follow-tags","version":"vim -c 'normal o' -c 'normal o## '$npm_package_version CHANGELOG.md && prettier -w CHANGELOG.md && git add CHANGELOG.md","dev:build":"chokidar \"tsconfig*.json\" \"src/**/*.ts\" -i \"**/*.test.ts\" -c \"npm run build:codegen\" --initial","typecheck":"tsc --noEmit && tsc -p example && tsc -p example/convex","preversion":"npm ci && npm run build:clean && run-p test lint typecheck","test:debug":"vitest --inspect-brk --no-file-parallelism","test:watch":"vitest --typecheck --clearScreen false","build:clean":"npx rimraf dist *.tsbuildinfo && npm run build:codegen","dev:backend":"convex dev --typecheck-components","dev:frontend":"cd example && vite --clearScreen false","build:codegen":"npx convex codegen --component-dir ./src/component && npm run build","test:coverage":"vitest run --coverage --coverage.reporter=text","prepublishOnly":"npm whoami || npm login"},"_npmUser":{"name":"maxime-ns","email":"maxime.gey@nativesquare.fr"},"repository":{"url":"git+https://github.com/NativeSquare/soma.git","type":"git"},"_npmVersion":"11.4.2","description":"A Convex component that normalizes health and fitness data from multiple wearable providers into a single, consistent schema.","directories":{},"_nodeVersion":"23.3.0","_hasShrinkwrap":false,"devDependencies":{"vite":"7.3.1","react":"^19.2.4","convex":"1.31.7","eslint":"9.39.2","vitest":"4.0.18","globals":"^17.3.0","prettier":"3.8.1","react-dom":"^19.2.4","@eslint/js":"9.39.2","pkg-pr-new":"^0.0.63","typescript":"5.9.3","@types/node":"^24.10.11","convex-test":"0.0.41","@types/react":"^19.2.13","chokidar-cli":"3.0.0","npm-run-all2":"8.0.4","path-exists-cli":"2.0.0","@edge-runtime/vm":"^5.0.0","@eslint/eslintrc":"^3.3.3","@types/react-dom":"^19.2.3","typescript-eslint":"8.54.0","eslint-plugin-react":"^7.37.5","@vitejs/plugin-react":"^5.1.3","@convex-dev/eslint-plugin":"^1.1.1","eslint-plugin-react-hooks":"^7.0.1","eslint-plugin-react-refresh":"^0.5.0"},"peerDependencies":{"react":"^18.3.1 || ^19.0.0","convex":"^1.31.7"},"_npmOperationalInternal":{"tmp":"tmp/soma_0.3.0_1771599625965_0.4992323392776088","host":"s3://npm-registry-packages-npm-production"}},"0.4.0":{"name":"@nativesquare/soma","version":"0.4.0","keywords":["convex","component"],"license":"Apache-2.0","_id":"@nativesquare/soma@0.4.0","maintainers":[{"name":"maxime-ns","email":"maxime.gey@nativesquare.fr"}],"homepage":"https://github.com/NativeSquare/soma#readme","bugs":{"url":"https://github.com/NativeSquare/soma/issues"},"dist":{"shasum":"56e703eca10be62afe051794c9951d5a4b735490","tarball":"https://registry.npmjs.org/@nativesquare/soma/-/soma-0.4.0.tgz","fileCount":317,"integrity":"sha512-w3WnBi+Tsly+EtX7QmZ3fIu0THaN4kA+XoUvSRi3bX4oU3+4rlSYTAQnWVFm1nzlhjtCo8wKgMttND/UqYhjDg==","signatures":[{"sig":"MEYCIQCRO2UoBXjGsfSQvPXAJSC92nz8kBfPtaWqUrofwaJXWwIhAM0BeBX8iZSZ0y6mMbVNwY1jmdc517O0+ar/h6FsxSZw","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":2380708},"pnpm":{"onlyBuiltDependencies":["esbuild","@tailwindcss/oxide"]},"type":"module","types":"./dist/client/index.d.ts","module":"./dist/client/index.js","exports":{".":{"types":"./dist/client/index.d.ts","default":"./dist/client/index.js"},"./test":"./src/test.ts","./react":{"types":"./dist/react/index.d.ts","default":"./dist/react/index.js"},"./garmin":{"types":"./dist/garmin/index.d.ts","default":"./dist/garmin/index.js"},"./strava":{"types":"./dist/strava/index.d.ts","default":"./dist/strava/index.js"},"./healthkit":{"types":"./dist/healthkit/index.d.ts","default":"./dist/healthkit/index.js"},"./validators":{"types":"./dist/validators.d.ts","default":"./dist/validators.js"},"./package.json":"./package.json","./convex.config":{"types":"./dist/component/convex.config.d.ts","default":"./dist/component/convex.config.js"},"./convex.config.js":{"types":"./dist/component/convex.config.d.ts","default":"./dist/component/convex.config.js"},"./_generated/component":{"types":"./dist/component/_generated/component.d.ts"},"./_generated/component.js":{"types":"./dist/component/_generated/component.d.ts"}},"gitHead":"64287c723caeba0259505b6a31db2cb991637c49","scripts":{"all":"run-p -r dev:* test:watch","dev":"run-p -r dev:*","lint":"eslint .","test":"vitest run --typecheck","alpha":"npm version prerelease --preid alpha && npm publish --tag alpha && git push --follow-tags","build":"tsc --project ./tsconfig.build.json","predev":"path-exists .env.local dist || (npm run build && convex dev --once)","release":"npm version patch && npm publish && git push --follow-tags","version":"vim -c 'normal o' -c 'normal o## '$npm_package_version CHANGELOG.md && prettier -w CHANGELOG.md && git add CHANGELOG.md","dev:build":"chokidar \"tsconfig*.json\" \"src/**/*.ts\" -i \"**/*.test.ts\" -c \"npm run build:codegen\" --initial","typecheck":"tsc --noEmit && tsc -p example && tsc -p example/convex","preversion":"npm ci && npm run build:clean && run-p test lint typecheck","test:debug":"vitest --inspect-brk --no-file-parallelism","test:watch":"vitest --typecheck --clearScreen false","build:clean":"npx rimraf dist *.tsbuildinfo && npm run build:codegen","dev:backend":"convex dev --typecheck-components","dev:frontend":"cd example && vite --clearScreen false","build:codegen":"npx convex codegen --component-dir ./src/component && npm run build","test:coverage":"vitest run --coverage --coverage.reporter=text","prepublishOnly":"npm whoami || npm login"},"_npmUser":{"name":"maxime-ns","email":"maxime.gey@nativesquare.fr"},"repository":{"url":"git+https://github.com/NativeSquare/soma.git","type":"git"},"_npmVersion":"11.4.2","description":"A Convex component that normalizes health and fitness data from multiple wearable providers into a single, consistent schema.","directories":{},"_nodeVersion":"23.3.0","_hasShrinkwrap":false,"devDependencies":{"vite":"7.3.1","react":"^19.2.4","convex":"1.31.7","eslint":"9.39.2","vitest":"4.0.18","globals":"^17.3.0","prettier":"3.8.1","react-dom":"^19.2.4","@eslint/js":"9.39.2","pkg-pr-new":"^0.0.63","typescript":"5.9.3","@types/node":"^24.10.11","convex-test":"0.0.41","@types/react":"^19.2.13","chokidar-cli":"3.0.0","npm-run-all2":"8.0.4","path-exists-cli":"2.0.0","@edge-runtime/vm":"^5.0.0","@eslint/eslintrc":"^3.3.3","@types/react-dom":"^19.2.3","typescript-eslint":"8.54.0","eslint-plugin-react":"^7.37.5","@vitejs/plugin-react":"^5.1.3","@convex-dev/eslint-plugin":"^1.1.1","eslint-plugin-react-hooks":"^7.0.1","eslint-plugin-react-refresh":"^0.5.0"},"peerDependencies":{"react":"^18.3.1 || ^19.0.0","convex":"^1.31.7"},"_npmOperationalInternal":{"tmp":"tmp/soma_0.4.0_1772969501674_0.1470925402178278","host":"s3://npm-registry-packages-npm-production"}},"0.5.0":{"name":"@nativesquare/soma","version":"0.5.0","keywords":["convex","component"],"license":"Apache-2.0","_id":"@nativesquare/soma@0.5.0","maintainers":[{"name":"maxime-ns","email":"maxime.gey@nativesquare.fr"}],"homepage":"https://github.com/NativeSquare/soma#readme","bugs":{"url":"https://github.com/NativeSquare/soma/issues"},"dist":{"shasum":"c484b8c2775a7632c0decae4b3ae0ca8a9ef58d4","tarball":"https://registry.npmjs.org/@nativesquare/soma/-/soma-0.5.0.tgz","fileCount":317,"integrity":"sha512-xKwEufa4BLU2iMP+Sgr2KaF+6Y4SDsM0xUgnd/Nboxd7LDm9LEytrgwInteqG2/DwN9Spjd5a95UW0wXPVHdrw==","signatures":[{"sig":"MEYCIQD5pooEjTWQlJrfXJ4bgIIO+Xo82VfXUOcR9TgFZo/gdgIhAMHlmDQeKBELWRClSIlxUh0/6gH7mP/W3/SZHTpjn0WM","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":2428082},"pnpm":{"onlyBuiltDependencies":["esbuild","@tailwindcss/oxide"]},"type":"module","types":"./dist/client/index.d.ts","module":"./dist/client/index.js","exports":{".":{"types":"./dist/client/index.d.ts","default":"./dist/client/index.js"},"./test":"./src/test.ts","./react":{"types":"./dist/react/index.d.ts","default":"./dist/react/index.js"},"./garmin":{"types":"./dist/garmin/index.d.ts","default":"./dist/garmin/index.js"},"./strava":{"types":"./dist/strava/index.d.ts","default":"./dist/strava/index.js"},"./healthkit":{"types":"./dist/healthkit/index.d.ts","default":"./dist/healthkit/index.js"},"./validators":{"types":"./dist/validators.d.ts","default":"./dist/validators.js"},"./package.json":"./package.json","./convex.config":{"types":"./dist/component/convex.config.d.ts","default":"./dist/component/convex.config.js"},"./convex.config.js":{"types":"./dist/component/convex.config.d.ts","default":"./dist/component/convex.config.js"},"./_generated/component":{"types":"./dist/component/_generated/component.d.ts"},"./_generated/component.js":{"types":"./dist/component/_generated/component.d.ts"}},"gitHead":"64287c723caeba0259505b6a31db2cb991637c49","scripts":{"all":"run-p -r dev:* test:watch","dev":"run-p -r dev:*","lint":"eslint .","test":"vitest run --typecheck","alpha":"npm version prerelease --preid alpha && npm publish --tag alpha && git push --follow-tags","build":"tsc --project ./tsconfig.build.json","predev":"path-exists .env.local dist || (npm run build && convex dev --once)","release":"npm version patch && npm publish && git push --follow-tags","version":"vim -c 'normal o' -c 'normal o## '$npm_package_version CHANGELOG.md && prettier -w CHANGELOG.md && git add CHANGELOG.md","dev:build":"chokidar \"tsconfig*.json\" \"src/**/*.ts\" -i \"**/*.test.ts\" -c \"npm run build:codegen\" --initial","typecheck":"tsc --noEmit && tsc -p example && tsc -p example/convex","preversion":"npm ci && npm run build:clean && run-p test lint typecheck","test:debug":"vitest --inspect-brk --no-file-parallelism","test:watch":"vitest --typecheck --clearScreen false","build:clean":"npx rimraf dist *.tsbuildinfo && npm run build:codegen","dev:backend":"convex dev --typecheck-components","dev:frontend":"cd example && vite --clearScreen false","build:codegen":"npx convex codegen --component-dir ./src/component && npm run build","test:coverage":"vitest run --coverage --coverage.reporter=text","prepublishOnly":"npm whoami || npm login"},"_npmUser":{"name":"maxime-ns","email":"maxime.gey@nativesquare.fr"},"repository":{"url":"git+https://github.com/NativeSquare/soma.git","type":"git"},"_npmVersion":"11.4.2","description":"A Convex component that normalizes health and fitness data from multiple wearable providers into a single, consistent schema.","directories":{},"_nodeVersion":"23.3.0","_hasShrinkwrap":false,"devDependencies":{"vite":"7.3.1","react":"^19.2.4","convex":"1.31.7","eslint":"9.39.2","vitest":"4.0.18","globals":"^17.3.0","prettier":"3.8.1","react-dom":"^19.2.4","@eslint/js":"9.39.2","pkg-pr-new":"^0.0.63","typescript":"5.9.3","@types/node":"^24.10.11","convex-test":"0.0.41","@types/react":"^19.2.13","chokidar-cli":"3.0.0","npm-run-all2":"8.0.4","path-exists-cli":"2.0.0","@edge-runtime/vm":"^5.0.0","@eslint/eslintrc":"^3.3.3","@types/react-dom":"^19.2.3","typescript-eslint":"8.54.0","eslint-plugin-react":"^7.37.5","@vitejs/plugin-react":"^5.1.3","@convex-dev/eslint-plugin":"^1.1.1","eslint-plugin-react-hooks":"^7.0.1","eslint-plugin-react-refresh":"^0.5.0"},"peerDependencies":{"react":"^18.3.1 || ^19.0.0","convex":"^1.31.7"},"_npmOperationalInternal":{"tmp":"tmp/soma_0.5.0_1772973472428_0.6166328120570779","host":"s3://npm-registry-packages-npm-production"}},"0.6.0":{"name":"@nativesquare/soma","version":"0.6.0","keywords":["convex","component"],"license":"Apache-2.0","_id":"@nativesquare/soma@0.6.0","maintainers":[{"name":"maxime-ns","email":"maxime.gey@nativesquare.fr"}],"homepage":"https://github.com/NativeSquare/soma#readme","bugs":{"url":"https://github.com/NativeSquare/soma/issues"},"dist":{"shasum":"3d6b910d9e8b83121b3697191a73614e6c0412bb","tarball":"https://registry.npmjs.org/@nativesquare/soma/-/soma-0.6.0.tgz","fileCount":317,"integrity":"sha512-NKWb5FablMwrDWVWcXaMpWwr+v8IhmpE11Z5VXNd9Q3r41GOY1NomwNewOOYBwo3J8WVcs3gD5gFZ9q3+j8t9Q==","signatures":[{"sig":"MEYCIQD56QTfMRIxd2XeIcZzIAVmE+I1VCjs5jfKeSxR+HxrPAIhAIkK6LOKIEuKR6kVbHyPS5vhsmSlDz/bIq2wahB3b+8p","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":2424966},"pnpm":{"onlyBuiltDependencies":["esbuild","@tailwindcss/oxide"]},"type":"module","types":"./dist/client/index.d.ts","module":"./dist/client/index.js","exports":{".":{"types":"./dist/client/index.d.ts","default":"./dist/client/index.js"},"./test":"./src/test.ts","./react":{"types":"./dist/react/index.d.ts","default":"./dist/react/index.js"},"./garmin":{"types":"./dist/garmin/index.d.ts","default":"./dist/garmin/index.js"},"./strava":{"types":"./dist/strava/index.d.ts","default":"./dist/strava/index.js"},"./healthkit":{"types":"./dist/healthkit/index.d.ts","default":"./dist/healthkit/index.js"},"./validators":{"types":"./dist/validators.d.ts","default":"./dist/validators.js"},"./package.json":"./package.json","./convex.config":{"types":"./dist/component/convex.config.d.ts","default":"./dist/component/convex.config.js"},"./convex.config.js":{"types":"./dist/component/convex.config.d.ts","default":"./dist/component/convex.config.js"},"./_generated/component":{"types":"./dist/component/_generated/component.d.ts"},"./_generated/component.js":{"types":"./dist/component/_generated/component.d.ts"}},"gitHead":"6ab1cf47cbab453a0fdfb38b1d654b9215bb06a0","scripts":{"all":"run-p -r dev:* test:watch","dev":"run-p -r dev:*","lint":"eslint .","test":"vitest run --typecheck","alpha":"npm version prerelease --preid alpha && npm publish --tag alpha && git push --follow-tags","build":"tsc --project ./tsconfig.build.json","predev":"path-exists .env.local dist || (npm run build && convex dev --once)","release":"npm version patch && npm publish && git push --follow-tags","version":"vim -c 'normal o' -c 'normal o## '$npm_package_version CHANGELOG.md && prettier -w CHANGELOG.md && git add CHANGELOG.md","dev:build":"chokidar \"tsconfig*.json\" \"src/**/*.ts\" -i \"**/*.test.ts\" -c \"npm run build:codegen\" --initial","typecheck":"tsc --noEmit && tsc -p example && tsc -p example/convex","preversion":"npm ci && npm run build:clean && run-p test lint typecheck","test:debug":"vitest --inspect-brk --no-file-parallelism","test:watch":"vitest --typecheck --clearScreen false","build:clean":"npx rimraf dist *.tsbuildinfo && npm run build:codegen","dev:backend":"convex dev --typecheck-components","dev:frontend":"cd example && vite --clearScreen false","build:codegen":"npx convex codegen --component-dir ./src/component && npm run build","test:coverage":"vitest run --coverage --coverage.reporter=text","prepublishOnly":"npm whoami || npm login"},"_npmUser":{"name":"maxime-ns","email":"maxime.gey@nativesquare.fr"},"repository":{"url":"git+https://github.com/NativeSquare/soma.git","type":"git"},"_npmVersion":"11.4.2","description":"A Convex component that normalizes health and fitness data from multiple wearable providers into a single, consistent schema.","directories":{},"_nodeVersion":"23.3.0","_hasShrinkwrap":false,"devDependencies":{"vite":"7.3.1","react":"^19.2.4","convex":"1.31.7","eslint":"9.39.2","vitest":"4.0.18","globals":"^17.3.0","prettier":"3.8.1","react-dom":"^19.2.4","@eslint/js":"9.39.2","pkg-pr-new":"^0.0.63","typescript":"5.9.3","@types/node":"^24.10.11","convex-test":"0.0.41","@types/react":"^19.2.13","chokidar-cli":"3.0.0","npm-run-all2":"8.0.4","path-exists-cli":"2.0.0","@edge-runtime/vm":"^5.0.0","@eslint/eslintrc":"^3.3.3","@types/react-dom":"^19.2.3","typescript-eslint":"8.54.0","eslint-plugin-react":"^7.37.5","@vitejs/plugin-react":"^5.1.3","@convex-dev/eslint-plugin":"^1.1.1","eslint-plugin-react-hooks":"^7.0.1","eslint-plugin-react-refresh":"^0.5.0"},"peerDependencies":{"react":"^18.3.1 || ^19.0.0","convex":"^1.31.7"},"_npmOperationalInternal":{"tmp":"tmp/soma_0.6.0_1772977665865_0.24775890505805687","host":"s3://npm-registry-packages-npm-production"}},"0.7.0":{"name":"@nativesquare/soma","version":"0.7.0","keywords":["convex","component"],"license":"Apache-2.0","_id":"@nativesquare/soma@0.7.0","maintainers":[{"name":"maxime-ns","email":"maxime.gey@nativesquare.fr"}],"homepage":"https://github.com/NativeSquare/soma#readme","bugs":{"url":"https://github.com/NativeSquare/soma/issues"},"dist":{"shasum":"a6209950dbb42ad69f52779178714c203bd6d25d","tarball":"https://registry.npmjs.org/@nativesquare/soma/-/soma-0.7.0.tgz","fileCount":322,"integrity":"sha512-hK9Eq+6EM96lqGXHtND9RyXSmXPlCjZDdVvCMQl1BEYDamp73c+pb8G5tIFHCSNiui8cL9BmIbaOa+QmsvF3Uw==","signatures":[{"sig":"MEUCIQC5PNzswcnkFKTsFgdfcx9CuBDBFeDSSfloHIiV9JA5SAIgYK8Sgcp5D7XsUoiTgtaKyNP8EdA2Q18SYcOVmwoDsk0=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":2542096},"pnpm":{"onlyBuiltDependencies":["esbuild","@tailwindcss/oxide"]},"type":"module","types":"./dist/client/index.d.ts","module":"./dist/client/index.js","exports":{".":{"types":"./dist/client/index.d.ts","default":"./dist/client/index.js"},"./test":"./src/test.ts","./react":{"types":"./dist/react/index.d.ts","default":"./dist/react/index.js"},"./garmin":{"types":"./dist/garmin/index.d.ts","default":"./dist/garmin/index.js"},"./strava":{"types":"./dist/strava/index.d.ts","default":"./dist/strava/index.js"},"./healthkit":{"types":"./dist/healthkit/index.d.ts","default":"./dist/healthkit/index.js"},"./validators":{"types":"./dist/validators.d.ts","default":"./dist/validators.js"},"./package.json":"./package.json","./convex.config":{"types":"./dist/component/convex.config.d.ts","default":"./dist/component/convex.config.js"},"./convex.config.js":{"types":"./dist/component/convex.config.d.ts","default":"./dist/component/convex.config.js"},"./_generated/component":{"types":"./dist/component/_generated/component.d.ts"},"./_generated/component.js":{"types":"./dist/component/_generated/component.d.ts"}},"gitHead":"8fe396b3f75bc6a73d0e00041bb5940957c3730d","scripts":{"all":"run-p -r dev:* test:watch","dev":"run-p -r dev:*","lint":"eslint .","test":"vitest run --typecheck","alpha":"npm version prerelease --preid alpha && npm publish --tag alpha && git push --follow-tags","build":"tsc --project ./tsconfig.build.json","predev":"path-exists .env.local dist || (npm run build && convex dev --once)","release":"npm version patch && npm publish && git push --follow-tags","version":"vim -c 'normal o' -c 'normal o## '$npm_package_version CHANGELOG.md && prettier -w CHANGELOG.md && git add CHANGELOG.md","dev:build":"chokidar \"tsconfig*.json\" \"src/**/*.ts\" -i \"**/*.test.ts\" -c \"npm run build:codegen\" --initial","typecheck":"tsc --noEmit && tsc -p example && tsc -p example/convex","preversion":"npm ci && npm run build:clean && run-p test lint typecheck","test:debug":"vitest --inspect-brk --no-file-parallelism","test:watch":"vitest --typecheck --clearScreen false","build:clean":"npx rimraf dist *.tsbuildinfo && npm run build:codegen","dev:backend":"convex dev --typecheck-components","dev:frontend":"cd example && vite --clearScreen false","build:codegen":"npx convex codegen --component-dir ./src/component && npm run build","test:coverage":"vitest run --coverage --coverage.reporter=text","prepublishOnly":"npm whoami || npm login"},"_npmUser":{"name":"maxime-ns","email":"maxime.gey@nativesquare.fr"},"repository":{"url":"git+https://github.com/NativeSquare/soma.git","type":"git"},"_npmVersion":"11.4.2","description":"A Convex component that normalizes health and fitness data from multiple wearable providers into a single, consistent schema.","directories":{},"_nodeVersion":"23.3.0","_hasShrinkwrap":false,"devDependencies":{"vite":"7.3.1","react":"^19.2.4","convex":"1.31.7","eslint":"9.39.2","vitest":"4.0.18","globals":"^17.3.0","prettier":"3.8.1","react-dom":"^19.2.4","@eslint/js":"9.39.2","pkg-pr-new":"^0.0.63","typescript":"5.9.3","@types/node":"^24.10.11","convex-test":"0.0.41","@types/react":"^19.2.13","chokidar-cli":"3.0.0","npm-run-all2":"8.0.4","path-exists-cli":"2.0.0","@edge-runtime/vm":"^5.0.0","@eslint/eslintrc":"^3.3.3","@types/react-dom":"^19.2.3","typescript-eslint":"8.54.0","eslint-plugin-react":"^7.37.5","@vitejs/plugin-react":"^5.1.3","@convex-dev/eslint-plugin":"^1.1.1","eslint-plugin-react-hooks":"^7.0.1","eslint-plugin-react-refresh":"^0.5.0"},"peerDependencies":{"react":"^18.3.1 || ^19.0.0","convex":"^1.31.7"},"_npmOperationalInternal":{"tmp":"tmp/soma_0.7.0_1772979992570_0.06056175027249977","host":"s3://npm-registry-packages-npm-production"}},"0.7.1":{"name":"@nativesquare/soma","version":"0.7.1","keywords":["convex","component"],"license":"Apache-2.0","_id":"@nativesquare/soma@0.7.1","maintainers":[{"name":"maxime-ns","email":"maxime.gey@nativesquare.fr"}],"homepage":"https://github.com/NativeSquare/soma#readme","bugs":{"url":"https://github.com/NativeSquare/soma/issues"},"dist":{"shasum":"70075a1202df0b9b357e364dd0a955a97bc0887c","tarball":"https://registry.npmjs.org/@nativesquare/soma/-/soma-0.7.1.tgz","fileCount":322,"integrity":"sha512-S/09YaPvNy+Ahxa7CqyVBxfy5TaZG8UUgYQIs6A6Pqg/YrgwuR8TQW3V3pkLTy0lTMhFDhKwuUOiC0b7udCilA==","signatures":[{"sig":"MEYCIQDbMEOq3TwUzSRjr6B/8uZCkDafmx5bbRiEShr80/sS9wIhAIgYk2Q1qCr5yqG2P9QTLB17kcx24eCSSiEpP01c0B2S","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":2545817},"pnpm":{"onlyBuiltDependencies":["esbuild","@tailwindcss/oxide"]},"type":"module","types":"./dist/client/index.d.ts","module":"./dist/client/index.js","exports":{".":{"types":"./dist/client/index.d.ts","default":"./dist/client/index.js"},"./test":"./src/test.ts","./react":{"types":"./dist/react/index.d.ts","default":"./dist/react/index.js"},"./garmin":{"types":"./dist/garmin/index.d.ts","default":"./dist/garmin/index.js"},"./strava":{"types":"./dist/strava/index.d.ts","default":"./dist/strava/index.js"},"./healthkit":{"types":"./dist/healthkit/index.d.ts","default":"./dist/healthkit/index.js"},"./validators":{"types":"./dist/validators.d.ts","default":"./dist/validators.js"},"./package.json":"./package.json","./convex.config":{"types":"./dist/component/convex.config.d.ts","default":"./dist/component/convex.config.js"},"./convex.config.js":{"types":"./dist/component/convex.config.d.ts","default":"./dist/component/convex.config.js"},"./_generated/component":{"types":"./dist/component/_generated/component.d.ts"},"./_generated/component.js":{"types":"./dist/component/_generated/component.d.ts"}},"gitHead":"addf567544f9e1d6382f56a82a2087bdf70577aa","scripts":{"all":"run-p -r dev:* test:watch","dev":"run-p -r dev:*","lint":"eslint .","test":"vitest run --typecheck","alpha":"npm version prerelease --preid alpha && npm publish --tag alpha && git push --follow-tags","build":"tsc --project ./tsconfig.build.json","predev":"path-exists .env.local dist || (npm run build && convex dev --once)","release":"npm version patch && npm publish && git push --follow-tags","version":"vim -c 'normal o' -c 'normal o## '$npm_package_version CHANGELOG.md && prettier -w CHANGELOG.md && git add CHANGELOG.md","dev:build":"chokidar \"tsconfig*.json\" \"src/**/*.ts\" -i \"**/*.test.ts\" -c \"npm run build:codegen\" --initial","typecheck":"tsc --noEmit && tsc -p example && tsc -p example/convex","preversion":"npm ci && npm run build:clean && run-p test lint typecheck","test:debug":"vitest --inspect-brk --no-file-parallelism","test:watch":"vitest --typecheck --clearScreen false","build:clean":"npx rimraf dist *.tsbuildinfo && npm run build:codegen","dev:backend":"convex dev --typecheck-components","dev:frontend":"cd example && vite --clearScreen false","build:codegen":"npx convex codegen --component-dir ./src/component && npm run build","test:coverage":"vitest run --coverage --coverage.reporter=text","prepublishOnly":"npm whoami || npm login"},"_npmUser":{"name":"maxime-ns","email":"maxime.gey@nativesquare.fr"},"repository":{"url":"git+https://github.com/NativeSquare/soma.git","type":"git"},"_npmVersion":"11.4.2","description":"A Convex component that normalizes health and fitness data from multiple wearable providers into a single, consistent schema.","directories":{},"_nodeVersion":"23.3.0","_hasShrinkwrap":false,"devDependencies":{"vite":"7.3.1","react":"^19.2.4","convex":"1.31.7","eslint":"9.39.2","vitest":"4.0.18","globals":"^17.3.0","prettier":"3.8.1","react-dom":"^19.2.4","@eslint/js":"9.39.2","pkg-pr-new":"^0.0.63","typescript":"5.9.3","@types/node":"^24.10.11","convex-test":"0.0.41","@types/react":"^19.2.13","chokidar-cli":"3.0.0","npm-run-all2":"8.0.4","path-exists-cli":"2.0.0","@edge-runtime/vm":"^5.0.0","@eslint/eslintrc":"^3.3.3","@types/react-dom":"^19.2.3","typescript-eslint":"8.54.0","eslint-plugin-react":"^7.37.5","@vitejs/plugin-react":"^5.1.3","@convex-dev/eslint-plugin":"^1.1.1","eslint-plugin-react-hooks":"^7.0.1","eslint-plugin-react-refresh":"^0.5.0"},"peerDependencies":{"react":"^18.3.1 || ^19.0.0","convex":"^1.31.7"},"_npmOperationalInternal":{"tmp":"tmp/soma_0.7.1_1772994975586_0.6559873655283199","host":"s3://npm-registry-packages-npm-production"}},"0.7.2":{"name":"@nativesquare/soma","version":"0.7.2","keywords":["convex","component"],"license":"Apache-2.0","_id":"@nativesquare/soma@0.7.2","maintainers":[{"name":"maxime-ns","email":"maxime.gey@nativesquare.fr"}],"homepage":"https://github.com/NativeSquare/soma#readme","bugs":{"url":"https://github.com/NativeSquare/soma/issues"},"dist":{"shasum":"519e23b8c87956f172e8986d0972eea5269081bf","tarball":"https://registry.npmjs.org/@nativesquare/soma/-/soma-0.7.2.tgz","fileCount":322,"integrity":"sha512-WJ3xHHPGWSCLj8V7xcHuFZu8Zq/d7zETktKEwZ5zQRTtTiD4AurIgjjRABT/Ost3RS+2WpDgnMZO2InT5RtjPA==","signatures":[{"sig":"MEQCICa3M6ei6EjG6HNwIdWs3OE7IfUYLt5PLW30A6MCgLrlAiA8b3q3aVcXMdm811r4hw41Lc425jWegGF4BE/HM8OQOg==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":2545955},"pnpm":{"onlyBuiltDependencies":["esbuild","@tailwindcss/oxide"]},"type":"module","types":"./dist/client/index.d.ts","module":"./dist/client/index.js","exports":{".":{"types":"./dist/client/index.d.ts","default":"./dist/client/index.js"},"./test":"./src/test.ts","./react":{"types":"./dist/react/index.d.ts","default":"./dist/react/index.js"},"./garmin":{"types":"./dist/garmin/index.d.ts","default":"./dist/garmin/index.js"},"./strava":{"types":"./dist/strava/index.d.ts","default":"./dist/strava/index.js"},"./healthkit":{"types":"./dist/healthkit/index.d.ts","default":"./dist/healthkit/index.js"},"./validators":{"types":"./dist/validators.d.ts","default":"./dist/validators.js"},"./package.json":"./package.json","./convex.config":{"types":"./dist/component/convex.config.d.ts","default":"./dist/component/convex.config.js"},"./convex.config.js":{"types":"./dist/component/convex.config.d.ts","default":"./dist/component/convex.config.js"},"./_generated/component":{"types":"./dist/component/_generated/component.d.ts"},"./_generated/component.js":{"types":"./dist/component/_generated/component.d.ts"}},"gitHead":"7ad48e8b410aa55489acb2be8090d69c4f865830","scripts":{"all":"run-p -r dev:* test:watch","dev":"run-p -r dev:*","lint":"eslint .","test":"vitest run --typecheck","alpha":"npm version prerelease --preid alpha && npm publish --tag alpha && git push --follow-tags","build":"tsc --project ./tsconfig.build.json","predev":"path-exists .env.local dist || (npm run build && convex dev --once)","release":"npm version patch && npm publish && git push --follow-tags","version":"vim -c 'normal o' -c 'normal o## '$npm_package_version CHANGELOG.md && prettier -w CHANGELOG.md && git add CHANGELOG.md","dev:build":"chokidar \"tsconfig*.json\" \"src/**/*.ts\" -i \"**/*.test.ts\" -c \"npm run build:codegen\" --initial","typecheck":"tsc --noEmit && tsc -p example && tsc -p example/convex","preversion":"npm ci && npm run build:clean && run-p test lint typecheck","test:debug":"vitest --inspect-brk --no-file-parallelism","test:watch":"vitest --typecheck --clearScreen false","build:clean":"npx rimraf dist *.tsbuildinfo && npm run build:codegen","dev:backend":"convex dev --typecheck-components","dev:frontend":"cd example && vite --clearScreen false","build:codegen":"npx convex codegen --component-dir ./src/component && npm run build","test:coverage":"vitest run --coverage --coverage.reporter=text","prepublishOnly":"npm whoami || npm login"},"_npmUser":{"name":"maxime-ns","email":"maxime.gey@nativesquare.fr"},"repository":{"url":"git+https://github.com/NativeSquare/soma.git","type":"git"},"_npmVersion":"11.4.2","description":"A Convex component that normalizes health and fitness data from multiple wearable providers into a single, consistent schema.","directories":{},"_nodeVersion":"23.3.0","_hasShrinkwrap":false,"devDependencies":{"vite":"7.3.1","react":"^19.2.4","convex":"1.31.7","eslint":"9.39.2","vitest":"4.0.18","globals":"^17.3.0","prettier":"3.8.1","react-dom":"^19.2.4","@eslint/js":"9.39.2","pkg-pr-new":"^0.0.63","typescript":"5.9.3","@types/node":"^24.10.11","convex-test":"0.0.41","@types/react":"^19.2.13","chokidar-cli":"3.0.0","npm-run-all2":"8.0.4","path-exists-cli":"2.0.0","@edge-runtime/vm":"^5.0.0","@eslint/eslintrc":"^3.3.3","@types/react-dom":"^19.2.3","typescript-eslint":"8.54.0","eslint-plugin-react":"^7.37.5","@vitejs/plugin-react":"^5.1.3","@convex-dev/eslint-plugin":"^1.1.1","eslint-plugin-react-hooks":"^7.0.1","eslint-plugin-react-refresh":"^0.5.0"},"peerDependencies":{"react":"^18.3.1 || ^19.0.0","convex":"^1.31.7"},"_npmOperationalInternal":{"tmp":"tmp/soma_0.7.2_1772995769544_0.7500202468556114","host":"s3://npm-registry-packages-npm-production"}},"0.7.3":{"name":"@nativesquare/soma","version":"0.7.3","keywords":["convex","component"],"license":"Apache-2.0","_id":"@nativesquare/soma@0.7.3","maintainers":[{"name":"maxime-ns","email":"maxime.gey@nativesquare.fr"}],"homepage":"https://github.com/NativeSquare/soma#readme","bugs":{"url":"https://github.com/NativeSquare/soma/issues"},"dist":{"shasum":"aceb12c147f5b5a0744709d258a9b8dab531d8ff","tarball":"https://registry.npmjs.org/@nativesquare/soma/-/soma-0.7.3.tgz","fileCount":322,"integrity":"sha512-9PihudkFejq1MfE4CBiOdWmPr54jF07+uQlmGvRhLtUca/rinjvZFCw5Z3nNv9YJJULhbrM3iT+FhkzwEIeIKQ==","signatures":[{"sig":"MEQCIHNvaBaeVfrCkNFFYEtk3XO3oXyptYXxGJkq0cdaOC+gAiA4Fbew3a4uF/Zge+ESG6boIX41vLXTTek2MK7wfXDAOg==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":2544078},"pnpm":{"onlyBuiltDependencies":["esbuild","@tailwindcss/oxide"]},"type":"module","types":"./dist/client/index.d.ts","module":"./dist/client/index.js","exports":{".":{"types":"./dist/client/index.d.ts","default":"./dist/client/index.js"},"./test":"./src/test.ts","./react":{"types":"./dist/react/index.d.ts","default":"./dist/react/index.js"},"./garmin":{"types":"./dist/garmin/index.d.ts","default":"./dist/garmin/index.js"},"./strava":{"types":"./dist/strava/index.d.ts","default":"./dist/strava/index.js"},"./healthkit":{"types":"./dist/healthkit/index.d.ts","default":"./dist/healthkit/index.js"},"./validators":{"types":"./dist/validators.d.ts","default":"./dist/validators.js"},"./package.json":"./package.json","./convex.config":{"types":"./dist/component/convex.config.d.ts","default":"./dist/component/convex.config.js"},"./convex.config.js":{"types":"./dist/component/convex.config.d.ts","default":"./dist/component/convex.config.js"},"./_generated/component":{"types":"./dist/component/_generated/component.d.ts"},"./_generated/component.js":{"types":"./dist/component/_generated/component.d.ts"}},"gitHead":"39cf96c9c57eb9c81e29510df18952e07eb37fed","scripts":{"all":"run-p -r dev:* test:watch","dev":"run-p -r dev:*","lint":"eslint .","test":"vitest run --typecheck","alpha":"npm version prerelease --preid alpha && npm publish --tag alpha && git push --follow-tags","build":"tsc --project ./tsconfig.build.json","predev":"path-exists .env.local dist || (npm run build && convex dev --once)","release":"npm version patch && npm publish && git push --follow-tags","version":"vim -c 'normal o' -c 'normal o## '$npm_package_version CHANGELOG.md && prettier -w CHANGELOG.md && git add CHANGELOG.md","dev:build":"chokidar \"tsconfig*.json\" \"src/**/*.ts\" -i \"**/*.test.ts\" -c \"npm run build:codegen\" --initial","typecheck":"tsc --noEmit && tsc -p example && tsc -p example/convex","preversion":"npm ci && npm run build:clean && run-p test lint typecheck","test:debug":"vitest --inspect-brk --no-file-parallelism","test:watch":"vitest --typecheck --clearScreen false","build:clean":"npx rimraf dist *.tsbuildinfo && npm run build:codegen","dev:backend":"convex dev --typecheck-components","dev:frontend":"cd example && vite --clearScreen false","build:codegen":"npx convex codegen --component-dir ./src/component && npm run build","test:coverage":"vitest run --coverage --coverage.reporter=text","prepublishOnly":"npm whoami || npm login"},"_npmUser":{"name":"maxime-ns","email":"maxime.gey@nativesquare.fr"},"repository":{"url":"git+https://github.com/NativeSquare/soma.git","type":"git"},"_npmVersion":"11.4.2","description":"A Convex component that normalizes health and fitness data from multiple wearable providers into a single, consistent schema.","directories":{},"_nodeVersion":"23.3.0","_hasShrinkwrap":false,"devDependencies":{"vite":"7.3.1","react":"^19.2.4","convex":"1.31.7","eslint":"9.39.2","vitest":"4.0.18","globals":"^17.3.0","prettier":"3.8.1","react-dom":"^19.2.4","@eslint/js":"9.39.2","pkg-pr-new":"^0.0.63","typescript":"5.9.3","@types/node":"^24.10.11","convex-test":"0.0.41","@types/react":"^19.2.13","chokidar-cli":"3.0.0","npm-run-all2":"8.0.4","path-exists-cli":"2.0.0","@edge-runtime/vm":"^5.0.0","@eslint/eslintrc":"^3.3.3","@types/react-dom":"^19.2.3","typescript-eslint":"8.54.0","eslint-plugin-react":"^7.37.5","@vitejs/plugin-react":"^5.1.3","@convex-dev/eslint-plugin":"^1.1.1","eslint-plugin-react-hooks":"^7.0.1","eslint-plugin-react-refresh":"^0.5.0"},"peerDependencies":{"react":"^18.3.1 || ^19.0.0","convex":"^1.31.7"},"_npmOperationalInternal":{"tmp":"tmp/soma_0.7.3_1772996599044_0.48516636253982304","host":"s3://npm-registry-packages-npm-production"}},"0.8.0":{"name":"@nativesquare/soma","version":"0.8.0","keywords":["convex","component"],"license":"Apache-2.0","_id":"@nativesquare/soma@0.8.0","maintainers":[{"name":"maxime-ns","email":"maxime.gey@nativesquare.fr"}],"homepage":"https://github.com/NativeSquare/soma#readme","bugs":{"url":"https://github.com/NativeSquare/soma/issues"},"dist":{"shasum":"88da4ea89fd3c2b8de2c0353ca93b0d57f809add","tarball":"https://registry.npmjs.org/@nativesquare/soma/-/soma-0.8.0.tgz","fileCount":359,"integrity":"sha512-B73Cvpp6udtjMETCnN1RkVYWuMK2SzDdA6xbwuoPwiq0XxPu8aWIuhL5pHXqf427v0picSJ0o8BhsYMcI6GSzw==","signatures":[{"sig":"MEUCIQDqlLzCvmpp7n6/mg9hRIorf9pYdah5cD8dzTgRMpbaawIgCsTRePno9wxqumXyW1cAc4Ka6I7CZbQNGNHB7Qffl4g=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":3082050},"pnpm":{"onlyBuiltDependencies":["esbuild","@tailwindcss/oxide"]},"type":"module","types":"./dist/client/index.d.ts","module":"./dist/client/index.js","exports":{".":{"types":"./dist/client/index.d.ts","default":"./dist/client/index.js"},"./test":"./src/test.ts","./react":{"types":"./dist/react/index.d.ts","default":"./dist/react/index.js"},"./garmin":{"types":"./dist/garmin/index.d.ts","default":"./dist/garmin/index.js"},"./strava":{"types":"./dist/strava/index.d.ts","default":"./dist/strava/index.js"},"./healthkit":{"types":"./dist/healthkit/index.d.ts","default":"./dist/healthkit/index.js"},"./validators":{"types":"./dist/validators.d.ts","default":"./dist/validators.js"},"./package.json":"./package.json","./convex.config":{"types":"./dist/component/convex.config.d.ts","default":"./dist/component/convex.config.js"},"./convex.config.js":{"types":"./dist/component/convex.config.d.ts","default":"./dist/component/convex.config.js"},"./_generated/component":{"types":"./dist/component/_generated/component.d.ts"},"./_generated/component.js":{"types":"./dist/component/_generated/component.d.ts"}},"gitHead":"fb9bf0e0d5b85ffc3d02ded1171757e414b1e729","scripts":{"all":"run-p -r dev:* test:watch","dev":"run-p -r dev:*","lint":"eslint .","test":"vitest run --typecheck","alpha":"npm version prerelease --preid alpha && npm publish --tag alpha && git push --follow-tags","build":"tsc --project ./tsconfig.build.json","predev":"path-exists .env.local dist || (npm run build && convex dev --once)","release":"npm version patch && npm publish && git push --follow-tags","version":"vim -c 'normal o' -c 'normal o## '$npm_package_version CHANGELOG.md && prettier -w CHANGELOG.md && git add CHANGELOG.md","dev:build":"chokidar \"tsconfig*.json\" \"src/**/*.ts\" -i \"**/*.test.ts\" -c \"npm run build:codegen\" --initial","typecheck":"tsc --noEmit && tsc -p example && tsc -p example/convex","preversion":"npm ci && npm run build:clean && run-p test lint typecheck","test:debug":"vitest --inspect-brk --no-file-parallelism","test:watch":"vitest --typecheck --clearScreen false","build:clean":"npx rimraf dist *.tsbuildinfo && npm run build:codegen","dev:backend":"convex dev --typecheck-components","webhook:all":"tsx scripts/test-garmin-webhooks.ts all _","dev:frontend":"cd example && vite --clearScreen false","webhook:ping":"tsx scripts/test-garmin-webhooks.ts ping","webhook:push":"tsx scripts/test-garmin-webhooks.ts push","build:codegen":"npx convex codegen --component-dir ./src/component && npm run build","test:coverage":"vitest run --coverage --coverage.reporter=text","prepublishOnly":"npm whoami || npm login","generate:garmin":"openapi-typescript src/garmin/spec/wellness-api.json -o src/garmin/wellness-api.d.ts","webhook:backfill":"tsx scripts/test-garmin-webhooks.ts backfill"},"_npmUser":{"name":"maxime-ns","email":"maxime.gey@nativesquare.fr"},"repository":{"url":"git+https://github.com/NativeSquare/soma.git","type":"git"},"_npmVersion":"11.4.2","description":"A Convex component that normalizes health and fitness data from multiple wearable providers into a single, consistent schema.","directories":{},"_nodeVersion":"23.3.0","dependencies":{"openapi-fetch":"^0.17.0"},"_hasShrinkwrap":false,"devDependencies":{"vite":"7.3.1","react":"^19.2.4","convex":"1.31.7","eslint":"9.39.2","vitest":"4.0.18","globals":"^17.3.0","prettier":"3.8.1","react-dom":"^19.2.4","@eslint/js":"9.39.2","pkg-pr-new":"^0.0.63","typescript":"5.9.3","@types/node":"^24.10.11","convex-test":"0.0.41","@types/react":"^19.2.13","chokidar-cli":"3.0.0","npm-run-all2":"8.0.4","path-exists-cli":"2.0.0","@edge-runtime/vm":"^5.0.0","@eslint/eslintrc":"^3.3.3","@types/react-dom":"^19.2.3","typescript-eslint":"8.54.0","openapi-typescript":"^7.13.0","eslint-plugin-react":"^7.37.5","@vitejs/plugin-react":"^5.1.3","@convex-dev/eslint-plugin":"^1.1.1","eslint-plugin-react-hooks":"^7.0.1","eslint-plugin-react-refresh":"^0.5.0"},"peerDependencies":{"react":"^18.3.1 || ^19.0.0","convex":"^1.31.7"},"_npmOperationalInternal":{"tmp":"tmp/soma_0.8.0_1774011968688_0.9096357275835665","host":"s3://npm-registry-packages-npm-production"}},"0.9.0":{"name":"@nativesquare/soma","version":"0.9.0","keywords":["convex","component"],"license":"Apache-2.0","_id":"@nativesquare/soma@0.9.0","maintainers":[{"name":"maxime-ns","email":"maxime.gey@nativesquare.fr"}],"homepage":"https://github.com/NativeSquare/soma#readme","bugs":{"url":"https://github.com/NativeSquare/soma/issues"},"dist":{"shasum":"d9d3122ff8cdc07aaa00a761cc6998cf099271e7","tarball":"https://registry.npmjs.org/@nativesquare/soma/-/soma-0.9.0.tgz","fileCount":564,"integrity":"sha512-GGYkU8EkgUqaMRqyKtcfFORIF9ejobeM6YdbAPJ5jgiz2F8Jdv+prfbYXWZDD7sjE9INM9bpY6vmXn/psq3PcQ==","signatures":[{"sig":"MEYCIQDAHCBntV0mJT25cANzVygC/c+Bp0BGGVhHIbjw1zzZ3wIhAI6sPyjpuEX45BJGPdzZlj+po9cc/4U6SmMd43mnf4I5","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":3751526},"pnpm":{"onlyBuiltDependencies":["esbuild","@tailwindcss/oxide"]},"type":"module","types":"./dist/client/index.d.ts","module":"./dist/client/index.js","exports":{".":{"types":"./dist/client/index.d.ts","default":"./dist/client/index.js"},"./test":"./src/test.ts","./react":{"types":"./dist/react/index.d.ts","default":"./dist/react/index.js"},"./strava":{"types":"./dist/strava/index.d.ts","default":"./dist/strava/index.js"},"./healthkit":{"types":"./dist/healthkit/index.d.ts","default":"./dist/healthkit/index.js"},"./validators":{"types":"./dist/validators.d.ts","default":"./dist/validators.js"},"./package.json":"./package.json","./convex.config":{"types":"./dist/component/convex.config.d.ts","default":"./dist/component/convex.config.js"},"./convex.config.js":{"types":"./dist/component/convex.config.d.ts","default":"./dist/component/convex.config.js"},"./_generated/component":{"types":"./dist/component/_generated/component.d.ts"},"./_generated/component.js":{"types":"./dist/component/_generated/component.d.ts"}},"gitHead":"4d1d61550f529e2778ddcd40b12ef467da0e4470","scripts":{"all":"run-p -r dev:* test:watch","dev":"run-p -r dev:*","lint":"eslint .","test":"vitest run --typecheck","alpha":"npm version prerelease --preid alpha && npm publish --tag alpha && git push --follow-tags","build":"tsc --project ./tsconfig.build.json","predev":"path-exists .env.local dist || (npm run build && convex dev --once)","release":"npm version patch && npm publish && git push --follow-tags","version":"vim -c 'normal o' -c 'normal o## '$npm_package_version CHANGELOG.md && prettier -w CHANGELOG.md && git add CHANGELOG.md","dev:build":"chokidar \"tsconfig*.json\" \"src/**/*.ts\" -i \"**/*.test.ts\" -c \"npm run build:codegen\" --initial","typecheck":"tsc --noEmit && tsc -p example && tsc -p example/convex","preversion":"npm ci && npm run build:clean && run-p test lint typecheck","test:debug":"vitest --inspect-brk --no-file-parallelism","test:watch":"vitest --typecheck --clearScreen false","build:clean":"npx rimraf dist *.tsbuildinfo && npm run build:codegen","dev:backend":"convex dev --typecheck-components","webhook:all":"tsx scripts/test-garmin-webhooks.ts all _","dev:frontend":"cd example && vite --clearScreen false","webhook:ping":"tsx scripts/test-garmin-webhooks.ts ping","webhook:push":"tsx scripts/test-garmin-webhooks.ts push","build:codegen":"npx convex codegen --component-dir ./src/component && npm run build","test:coverage":"vitest run --coverage --coverage.reporter=text","prepublishOnly":"npm whoami || npm login","generate:garmin":"openapi-ts","webhook:backfill":"tsx scripts/test-garmin-webhooks.ts backfill"},"_npmUser":{"name":"maxime-ns","email":"maxime.gey@nativesquare.fr"},"repository":{"url":"git+https://github.com/NativeSquare/soma.git","type":"git"},"_npmVersion":"11.4.2","description":"A Convex component that normalizes health and fitness data from multiple wearable providers into a single, consistent schema.","directories":{},"_nodeVersion":"23.3.0","dependencies":{"zod":"^4.3.6"},"_hasShrinkwrap":false,"devDependencies":{"vite":"7.3.1","react":"^19.2.4","convex":"1.31.7","eslint":"9.39.2","vitest":"4.0.18","globals":"^17.3.0","prettier":"3.8.1","react-dom":"^19.2.4","@eslint/js":"9.39.2","pkg-pr-new":"^0.0.63","typescript":"5.9.3","@types/node":"^24.10.11","convex-test":"0.0.41","@types/react":"^19.2.13","chokidar-cli":"3.0.0","npm-run-all2":"8.0.4","path-exists-cli":"2.0.0","@edge-runtime/vm":"^5.0.0","@eslint/eslintrc":"^3.3.3","@types/react-dom":"^19.2.3","typescript-eslint":"8.54.0","openapi-typescript":"^7.13.0","@hey-api/openapi-ts":"^0.94.5","eslint-plugin-react":"^7.37.5","@vitejs/plugin-react":"^5.1.3","@convex-dev/eslint-plugin":"^1.1.1","eslint-plugin-react-hooks":"^7.0.1","eslint-plugin-react-refresh":"^0.5.0"},"peerDependencies":{"react":"^18.3.1 || ^19.0.0","convex":"^1.31.7"},"_npmOperationalInternal":{"tmp":"tmp/soma_0.9.0_1775216339469_0.5640957708630523","host":"s3://npm-registry-packages-npm-production"}},"0.9.1":{"name":"@nativesquare/soma","version":"0.9.1","keywords":["convex","component"],"license":"Apache-2.0","_id":"@nativesquare/soma@0.9.1","maintainers":[{"name":"maxime-ns","email":"maxime.gey@nativesquare.fr"}],"homepage":"https://github.com/NativeSquare/soma#readme","bugs":{"url":"https://github.com/NativeSquare/soma/issues"},"dist":{"shasum":"1c77233087c55a110c763eaba25fa970ee3c5556","tarball":"https://registry.npmjs.org/@nativesquare/soma/-/soma-0.9.1.tgz","fileCount":640,"integrity":"sha512-EClYn0Bs9XzV6a6BWXzwHr8ukUwenB2ms0wkEFxP/r7GNP2ayIx4a9qUpRQgCBGy4bNHoO0gDEyxE+Lq2otuKQ==","signatures":[{"sig":"MEUCICoYM+p6dmglBbAeZqdT49jB5V1OWgDG6fpJle0gv8ZrAiEA/VoUbl293pRNX+rxOgbwrTerS314ksa4uTg57a3wiGY=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":4118389},"pnpm":{"onlyBuiltDependencies":["esbuild","@tailwindcss/oxide"]},"type":"module","types":"./dist/client/index.d.ts","module":"./dist/client/index.js","exports":{".":{"types":"./dist/client/index.d.ts","default":"./dist/client/index.js"},"./test":"./src/test.ts","./react":{"types":"./dist/react/index.d.ts","default":"./dist/react/index.js"},"./strava":{"types":"./dist/strava/index.d.ts","default":"./dist/strava/index.js"},"./healthkit":{"types":"./dist/healthkit/index.d.ts","default":"./dist/healthkit/index.js"},"./validators":{"types":"./dist/validators.d.ts","default":"./dist/validators.js"},"./package.json":"./package.json","./convex.config":{"types":"./dist/component/convex.config.d.ts","default":"./dist/component/convex.config.js"},"./convex.config.js":{"types":"./dist/component/convex.config.d.ts","default":"./dist/component/convex.config.js"},"./_generated/component":{"types":"./dist/component/_generated/component.d.ts"},"./_generated/component.js":{"types":"./dist/component/_generated/component.d.ts"}},"gitHead":"48ed109d3fbe310804eca5b3657a4e349ecfa721","scripts":{"all":"run-p -r dev:* test:watch","dev":"run-p -r dev:*","lint":"eslint .","test":"vitest run --typecheck","alpha":"npm version prerelease --preid alpha && npm publish --tag alpha && git push --follow-tags","build":"tsc --project ./tsconfig.build.json","predev":"path-exists .env.local dist || (npm run build && convex dev --once)","release":"npm version patch && npm publish && git push --follow-tags","version":"vim -c 'normal o' -c 'normal o## '$npm_package_version CHANGELOG.md && prettier -w CHANGELOG.md && git add CHANGELOG.md","dev:build":"chokidar \"tsconfig*.json\" \"src/**/*.ts\" -i \"**/*.test.ts\" -c \"npm run build:codegen\" --initial","typecheck":"tsc --noEmit && tsc -p example && tsc -p example/convex","preversion":"npm ci && npm run build:clean && run-p test lint typecheck","test:debug":"vitest --inspect-brk --no-file-parallelism","test:watch":"vitest --typecheck --clearScreen false","build:clean":"npx rimraf dist *.tsbuildinfo && npm run build:codegen","dev:backend":"convex dev --typecheck-components","webhook:all":"tsx scripts/test-garmin-webhooks.ts all _","dev:frontend":"cd example && vite --clearScreen false","webhook:ping":"tsx scripts/test-garmin-webhooks.ts ping","webhook:push":"tsx scripts/test-garmin-webhooks.ts push","build:codegen":"npx convex codegen --component-dir ./src/component && npm run build","test:coverage":"vitest run --coverage --coverage.reporter=text","prepublishOnly":"npm whoami || npm login","generate:garmin":"openapi-ts","webhook:backfill":"tsx scripts/test-garmin-webhooks.ts backfill"},"_npmUser":{"name":"maxime-ns","email":"maxime.gey@nativesquare.fr"},"repository":{"url":"git+https://github.com/NativeSquare/soma.git","type":"git"},"_npmVersion":"11.4.2","description":"A Convex component that normalizes health and fitness data from multiple wearable providers into a single, consistent schema.","directories":{},"_nodeVersion":"23.3.0","dependencies":{"zod":"^4.3.6"},"_hasShrinkwrap":false,"devDependencies":{"vite":"7.3.1","react":"^19.2.4","convex":"1.31.7","eslint":"9.39.2","vitest":"4.0.18","globals":"^17.3.0","prettier":"3.8.1","react-dom":"^19.2.4","@eslint/js":"9.39.2","pkg-pr-new":"^0.0.63","typescript":"5.9.3","@types/node":"^24.10.11","convex-test":"0.0.41","@types/react":"^19.2.13","chokidar-cli":"3.0.0","npm-run-all2":"8.0.4","path-exists-cli":"2.0.0","@edge-runtime/vm":"^5.0.0","@eslint/eslintrc":"^3.3.3","@types/react-dom":"^19.2.3","typescript-eslint":"8.54.0","openapi-typescript":"^7.13.0","@hey-api/openapi-ts":"^0.94.5","eslint-plugin-react":"^7.37.5","@vitejs/plugin-react":"^5.1.3","@convex-dev/eslint-plugin":"^1.1.1","eslint-plugin-react-hooks":"^7.0.1","eslint-plugin-react-refresh":"^0.5.0"},"peerDependencies":{"react":"^18.3.1 || ^19.0.0","convex":"^1.31.7"},"_npmOperationalInternal":{"tmp":"tmp/soma_0.9.1_1775217619719_0.7715200280930832","host":"s3://npm-registry-packages-npm-production"}},"0.9.2":{"name":"@nativesquare/soma","version":"0.9.2","keywords":["convex","component"],"license":"Apache-2.0","_id":"@nativesquare/soma@0.9.2","maintainers":[{"name":"maxime-ns","email":"maxime.gey@nativesquare.fr"}],"homepage":"https://github.com/NativeSquare/soma#readme","bugs":{"url":"https://github.com/NativeSquare/soma/issues"},"dist":{"shasum":"63cecc295b829d4ae777874e175217a3d8cd1332","tarball":"https://registry.npmjs.org/@nativesquare/soma/-/soma-0.9.2.tgz","fileCount":640,"integrity":"sha512-XbO8TCtICzd/8jg9oACjWYN3uZ7kdTBTmxAo04gU/ifuYLW2UKO7tCSsT9fw8ZzCBUG3H3IjkNzYC0afnTRiMQ==","signatures":[{"sig":"MEQCIDArU36pQ2eatYL4Cvwv+FoVRT727l1EuXyCTfeFdLd7AiB6C05kJ+iP2Tm9o4if8j3h1anx41dym2WEHVMSx+AMQQ==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":4131736},"pnpm":{"onlyBuiltDependencies":["esbuild","@tailwindcss/oxide"]},"type":"module","types":"./dist/client/index.d.ts","module":"./dist/client/index.js","exports":{".":{"types":"./dist/client/index.d.ts","default":"./dist/client/index.js"},"./test":"./src/test.ts","./react":{"types":"./dist/react/index.d.ts","default":"./dist/react/index.js"},"./strava":{"types":"./dist/strava/index.d.ts","default":"./dist/strava/index.js"},"./healthkit":{"types":"./dist/healthkit/index.d.ts","default":"./dist/healthkit/index.js"},"./validators":{"types":"./dist/validators.d.ts","default":"./dist/validators.js"},"./package.json":"./package.json","./convex.config":{"types":"./dist/component/convex.config.d.ts","default":"./dist/component/convex.config.js"},"./convex.config.js":{"types":"./dist/component/convex.config.d.ts","default":"./dist/component/convex.config.js"},"./_generated/component":{"types":"./dist/component/_generated/component.d.ts"},"./_generated/component.js":{"types":"./dist/component/_generated/component.d.ts"}},"gitHead":"8b0ecb36f4f84f2b89a7464e31cb65a694a87306","scripts":{"all":"run-p -r dev:* test:watch","dev":"run-p -r dev:*","lint":"eslint .","test":"vitest run --typecheck","alpha":"npm version prerelease --preid alpha && npm publish --tag alpha && git push --follow-tags","build":"tsc --project ./tsconfig.build.json","predev":"path-exists .env.local dist || (npm run build && convex dev --once)","release":"npm version patch && npm publish && git push --follow-tags","version":"vim -c 'normal o' -c 'normal o## '$npm_package_version CHANGELOG.md && prettier -w CHANGELOG.md && git add CHANGELOG.md","dev:build":"chokidar \"tsconfig*.json\" \"src/**/*.ts\" -i \"**/*.test.ts\" -c \"npm run build:codegen\" --initial","typecheck":"tsc --noEmit && tsc -p example && tsc -p example/convex","preversion":"npm ci && npm run build:clean && run-p test lint typecheck","test:debug":"vitest --inspect-brk --no-file-parallelism","test:watch":"vitest --typecheck --clearScreen false","build:clean":"npx rimraf dist *.tsbuildinfo && npm run build:codegen","dev:backend":"convex dev --typecheck-components","webhook:all":"tsx scripts/test-garmin-webhooks.ts all _","dev:frontend":"cd example && vite --clearScreen false","webhook:ping":"tsx scripts/test-garmin-webhooks.ts ping","webhook:push":"tsx scripts/test-garmin-webhooks.ts push","build:codegen":"npx convex codegen --component-dir ./src/component && npm run build","test:coverage":"vitest run --coverage --coverage.reporter=text","prepublishOnly":"npm whoami || npm login","generate:garmin":"openapi-ts","webhook:backfill":"tsx scripts/test-garmin-webhooks.ts backfill"},"_npmUser":{"name":"maxime-ns","email":"maxime.gey@nativesquare.fr"},"repository":{"url":"git+https://github.com/NativeSquare/soma.git","type":"git"},"_npmVersion":"11.4.2","description":"A Convex component that normalizes health and fitness data from multiple wearable providers into a single, consistent schema.","directories":{},"_nodeVersion":"23.3.0","dependencies":{"zod":"^4.3.6"},"_hasShrinkwrap":false,"devDependencies":{"vite":"7.3.1","react":"^19.2.4","convex":"1.31.7","eslint":"9.39.2","vitest":"4.0.18","globals":"^17.3.0","prettier":"3.8.1","react-dom":"^19.2.4","@eslint/js":"9.39.2","pkg-pr-new":"^0.0.63","typescript":"5.9.3","@types/node":"^24.10.11","convex-test":"0.0.41","@types/react":"^19.2.13","chokidar-cli":"3.0.0","npm-run-all2":"8.0.4","path-exists-cli":"2.0.0","@edge-runtime/vm":"^5.0.0","@eslint/eslintrc":"^3.3.3","@types/react-dom":"^19.2.3","typescript-eslint":"8.54.0","openapi-typescript":"^7.13.0","@hey-api/openapi-ts":"^0.94.5","eslint-plugin-react":"^7.37.5","@vitejs/plugin-react":"^5.1.3","@convex-dev/eslint-plugin":"^1.1.1","eslint-plugin-react-hooks":"^7.0.1","eslint-plugin-react-refresh":"^0.5.0"},"peerDependencies":{"react":"^18.3.1 || ^19.0.0","convex":"^1.31.7"},"_npmOperationalInternal":{"tmp":"tmp/soma_0.9.2_1775223903567_0.9829028592199334","host":"s3://npm-registry-packages-npm-production"}},"0.9.3":{"name":"@nativesquare/soma","version":"0.9.3","keywords":["convex","component"],"license":"Apache-2.0","_id":"@nativesquare/soma@0.9.3","maintainers":[{"name":"maxime-ns","email":"maxime.gey@nativesquare.fr"}],"homepage":"https://github.com/NativeSquare/soma#readme","bugs":{"url":"https://github.com/NativeSquare/soma/issues"},"dist":{"shasum":"e1038cf20753db1e3a47e1b32f6f8c6addfc11f2","tarball":"https://registry.npmjs.org/@nativesquare/soma/-/soma-0.9.3.tgz","fileCount":640,"integrity":"sha512-5SS/ghjMff22zMILSXEPZKV1+9n8O+tGZ8HJhJNq5n/p+9MvBzEz93p7ckLRGB4cNY2s+dRvImaD4jvs4XNnYg==","signatures":[{"sig":"MEYCIQDRUBIS6C5G4HV9b0oa+IYkn2vypAoPs9ibu3VsnrTCKQIhANO4B03BVkpKAnmgCHHljbZaYz7AGUC5v5jhsYvR6o7U","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":4132946},"pnpm":{"onlyBuiltDependencies":["esbuild","@tailwindcss/oxide"]},"type":"module","types":"./dist/client/index.d.ts","module":"./dist/client/index.js","exports":{".":{"types":"./dist/client/index.d.ts","default":"./dist/client/index.js"},"./test":"./src/test.ts","./react":{"types":"./dist/react/index.d.ts","default":"./dist/react/index.js"},"./strava":{"types":"./dist/strava/index.d.ts","default":"./dist/strava/index.js"},"./healthkit":{"types":"./dist/healthkit/index.d.ts","default":"./dist/healthkit/index.js"},"./validators":{"types":"./dist/validators.d.ts","default":"./dist/validators.js"},"./package.json":"./package.json","./convex.config":{"types":"./dist/component/convex.config.d.ts","default":"./dist/component/convex.config.js"},"./convex.config.js":{"types":"./dist/component/convex.config.d.ts","default":"./dist/component/convex.config.js"},"./_generated/component":{"types":"./dist/component/_generated/component.d.ts"},"./_generated/component.js":{"types":"./dist/component/_generated/component.d.ts"}},"gitHead":"1e3cc59677bee27c3fe4a662c016e59db260e7a4","scripts":{"all":"run-p -r dev:* test:watch","dev":"run-p -r dev:*","lint":"eslint .","test":"vitest run --typecheck","alpha":"npm version prerelease --preid alpha && npm publish --tag alpha && git push --follow-tags","build":"tsc --project ./tsconfig.build.json","predev":"path-exists .env.local dist || (npm run build && convex dev --once)","release":"npm version patch && npm publish && git push --follow-tags","version":"vim -c 'normal o' -c 'normal o## '$npm_package_version CHANGELOG.md && prettier -w CHANGELOG.md && git add CHANGELOG.md","dev:build":"chokidar \"tsconfig*.json\" \"src/**/*.ts\" -i \"**/*.test.ts\" -c \"npm run build:codegen\" --initial","typecheck":"tsc --noEmit && tsc -p example && tsc -p example/convex","preversion":"npm ci && npm run build:clean && run-p test lint typecheck","test:debug":"vitest --inspect-brk --no-file-parallelism","test:watch":"vitest --typecheck --clearScreen false","build:clean":"npx rimraf dist *.tsbuildinfo && npm run build:codegen","dev:backend":"convex dev --typecheck-components","webhook:all":"tsx scripts/test-garmin-webhooks.ts all _","dev:frontend":"cd example && vite --clearScreen false","webhook:ping":"tsx scripts/test-garmin-webhooks.ts ping","webhook:push":"tsx scripts/test-garmin-webhooks.ts push","build:codegen":"npx convex codegen --component-dir ./src/component && npm run build","test:coverage":"vitest run --coverage --coverage.reporter=text","prepublishOnly":"npm whoami || npm login","generate:garmin":"openapi-ts","webhook:backfill":"tsx scripts/test-garmin-webhooks.ts backfill"},"_npmUser":{"name":"maxime-ns","email":"maxime.gey@nativesquare.fr"},"repository":{"url":"git+https://github.com/NativeSquare/soma.git","type":"git"},"_npmVersion":"11.4.2","description":"A Convex component that normalizes health and fitness data from multiple wearable providers into a single, consistent schema.","directories":{},"_nodeVersion":"23.3.0","dependencies":{"zod":"^4.3.6"},"_hasShrinkwrap":false,"devDependencies":{"vite":"7.3.1","react":"^19.2.4","convex":"1.31.7","eslint":"9.39.2","vitest":"4.0.18","globals":"^17.3.0","prettier":"3.8.1","react-dom":"^19.2.4","@eslint/js":"9.39.2","pkg-pr-new":"^0.0.63","typescript":"5.9.3","@types/node":"^24.10.11","convex-test":"0.0.41","@types/react":"^19.2.13","chokidar-cli":"3.0.0","npm-run-all2":"8.0.4","path-exists-cli":"2.0.0","@edge-runtime/vm":"^5.0.0","@eslint/eslintrc":"^3.3.3","@types/react-dom":"^19.2.3","typescript-eslint":"8.54.0","openapi-typescript":"^7.13.0","@hey-api/openapi-ts":"^0.94.5","eslint-plugin-react":"^7.37.5","@vitejs/plugin-react":"^5.1.3","@convex-dev/eslint-plugin":"^1.1.1","eslint-plugin-react-hooks":"^7.0.1","eslint-plugin-react-refresh":"^0.5.0"},"peerDependencies":{"react":"^18.3.1 || ^19.0.0","convex":"^1.31.7"},"_npmOperationalInternal":{"tmp":"tmp/soma_0.9.3_1775225215096_0.6713480226613542","host":"s3://npm-registry-packages-npm-production"}},"0.9.4":{"name":"@nativesquare/soma","version":"0.9.4","keywords":["convex","component"],"license":"Apache-2.0","_id":"@nativesquare/soma@0.9.4","maintainers":[{"name":"maxime-ns","email":"maxime.gey@nativesquare.fr"}],"homepage":"https://github.com/NativeSquare/soma#readme","bugs":{"url":"https://github.com/NativeSquare/soma/issues"},"dist":{"shasum":"c7b6ea3bc81c4307e3a2a17e806cf29a83122855","tarball":"https://registry.npmjs.org/@nativesquare/soma/-/soma-0.9.4.tgz","fileCount":640,"integrity":"sha512-kU+0udqnVa9BUxTORWk7A00BVeBbaI0jgiqKO0l8r+XFZIptGwVCvzqgcMU/2E6eFvRGCLCjJFjaGZglvqtCjg==","signatures":[{"sig":"MEUCIDhylNsq7i6p27BhgoaEMFgK9db6p6ib+DC1u008TyBjAiEA89ajEkNIxRxb+AuM1Cb5EL36loPP1EdN8+EKfMbkAME=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":4135780},"pnpm":{"onlyBuiltDependencies":["esbuild","@tailwindcss/oxide"]},"type":"module","types":"./dist/client/index.d.ts","module":"./dist/client/index.js","exports":{".":{"types":"./dist/client/index.d.ts","default":"./dist/client/index.js"},"./test":"./src/test.ts","./react":{"types":"./dist/react/index.d.ts","default":"./dist/react/index.js"},"./strava":{"types":"./dist/strava/index.d.ts","default":"./dist/strava/index.js"},"./healthkit":{"types":"./dist/healthkit/index.d.ts","default":"./dist/healthkit/index.js"},"./validators":{"types":"./dist/validators.d.ts","default":"./dist/validators.js"},"./package.json":"./package.json","./convex.config":{"types":"./dist/component/convex.config.d.ts","default":"./dist/component/convex.config.js"},"./convex.config.js":{"types":"./dist/component/convex.config.d.ts","default":"./dist/component/convex.config.js"},"./_generated/component":{"types":"./dist/component/_generated/component.d.ts"},"./_generated/component.js":{"types":"./dist/component/_generated/component.d.ts"}},"gitHead":"1e3cc59677bee27c3fe4a662c016e59db260e7a4","scripts":{"all":"run-p -r dev:* test:watch","dev":"run-p -r dev:*","lint":"eslint .","test":"vitest run --typecheck","alpha":"npm version prerelease --preid alpha && npm publish --tag alpha && git push --follow-tags","build":"tsc --project ./tsconfig.build.json","predev":"path-exists .env.local dist || (npm run build && convex dev --once)","release":"npm version patch && npm publish && git push --follow-tags","version":"vim -c 'normal o' -c 'normal o## '$npm_package_version CHANGELOG.md && prettier -w CHANGELOG.md && git add CHANGELOG.md","dev:build":"chokidar \"tsconfig*.json\" \"src/**/*.ts\" -i \"**/*.test.ts\" -c \"npm run build:codegen\" --initial","typecheck":"tsc --noEmit && tsc -p example && tsc -p example/convex","preversion":"npm ci && npm run build:clean && run-p test lint typecheck","test:debug":"vitest --inspect-brk --no-file-parallelism","test:watch":"vitest --typecheck --clearScreen false","build:clean":"npx rimraf dist *.tsbuildinfo && npm run build:codegen","dev:backend":"convex dev --typecheck-components","webhook:all":"tsx scripts/test-garmin-webhooks.ts all _","dev:frontend":"cd example && vite --clearScreen false","webhook:ping":"tsx scripts/test-garmin-webhooks.ts ping","webhook:push":"tsx scripts/test-garmin-webhooks.ts push","build:codegen":"npx convex codegen --component-dir ./src/component && npm run build","test:coverage":"vitest run --coverage --coverage.reporter=text","prepublishOnly":"npm whoami || npm login","generate:garmin":"openapi-ts","webhook:backfill":"tsx scripts/test-garmin-webhooks.ts backfill"},"_npmUser":{"name":"maxime-ns","email":"maxime.gey@nativesquare.fr"},"repository":{"url":"git+https://github.com/NativeSquare/soma.git","type":"git"},"_npmVersion":"11.4.2","description":"A Convex component that normalizes health and fitness data from multiple wearable providers into a single, consistent schema.","directories":{},"_nodeVersion":"23.3.0","dependencies":{"zod":"^4.3.6"},"_hasShrinkwrap":false,"devDependencies":{"vite":"7.3.1","react":"^19.2.4","convex":"1.31.7","eslint":"9.39.2","vitest":"4.0.18","globals":"^17.3.0","prettier":"3.8.1","react-dom":"^19.2.4","@eslint/js":"9.39.2","pkg-pr-new":"^0.0.63","typescript":"5.9.3","@types/node":"^24.10.11","convex-test":"0.0.41","@types/react":"^19.2.13","chokidar-cli":"3.0.0","npm-run-all2":"8.0.4","path-exists-cli":"2.0.0","@edge-runtime/vm":"^5.0.0","@eslint/eslintrc":"^3.3.3","@types/react-dom":"^19.2.3","typescript-eslint":"8.54.0","openapi-typescript":"^7.13.0","@hey-api/openapi-ts":"^0.94.5","eslint-plugin-react":"^7.37.5","@vitejs/plugin-react":"^5.1.3","@convex-dev/eslint-plugin":"^1.1.1","eslint-plugin-react-hooks":"^7.0.1","eslint-plugin-react-refresh":"^0.5.0"},"peerDependencies":{"react":"^18.3.1 || ^19.0.0","convex":"^1.31.7"},"_npmOperationalInternal":{"tmp":"tmp/soma_0.9.4_1775225660082_0.20528034116513627","host":"s3://npm-registry-packages-npm-production"}},"0.10.0":{"name":"@nativesquare/soma","version":"0.10.0","keywords":["convex","component"],"license":"Apache-2.0","_id":"@nativesquare/soma@0.10.0","maintainers":[{"name":"maxime-ns","email":"maxime.gey@nativesquare.fr"}],"homepage":"https://github.com/NativeSquare/soma#readme","bugs":{"url":"https://github.com/NativeSquare/soma/issues"},"dist":{"shasum":"13d65e5c45e9074635e87c348c1ec1a7534e45b4","tarball":"https://registry.npmjs.org/@nativesquare/soma/-/soma-0.10.0.tgz","fileCount":717,"integrity":"sha512-NFimmyBEAxH+0jqVP1EyhW8RT2qNt4IqBfAdDge5DzCzSYIys2zfrkZpSCzcugYx1zBR7D5QA/7RJW6RWx8prA==","signatures":[{"sig":"MEUCIQD7jPbcvrJjTGLJwECUFBHuPuIJ8s4B5B9U+hEefKL9uQIgWKD2FpgP2HDiIU2cvTcsYnRTIi3/QqBOO5GN0fXwFCU=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":4970597},"pnpm":{"onlyBuiltDependencies":["esbuild","@tailwindcss/oxide"]},"type":"module","types":"./dist/client/index.d.ts","module":"./dist/client/index.js","exports":{".":{"types":"./dist/client/index.d.ts","default":"./dist/client/index.js"},"./test":"./src/test.ts","./react":{"types":"./dist/react/index.d.ts","default":"./dist/react/index.js"},"./healthkit":{"types":"./dist/healthkit/index.d.ts","default":"./dist/healthkit/index.js"},"./validators":{"types":"./dist/validators.d.ts","default":"./dist/validators.js"},"./package.json":"./package.json","./convex.config":{"types":"./dist/component/convex.config.d.ts","default":"./dist/component/convex.config.js"},"./strava/client":{"types":"./dist/component/strava/client.d.ts","default":"./dist/component/strava/client.js"},"./convex.config.js":{"types":"./dist/component/convex.config.d.ts","default":"./dist/component/convex.config.js"},"./_generated/component":{"types":"./dist/component/_generated/component.d.ts"},"./_generated/component.js":{"types":"./dist/component/_generated/component.d.ts"}},"gitHead":"fb5ed5778e7e27ab0f09503cb0636f57c74a71bd","scripts":{"all":"run-p -r dev:* test:watch","dev":"run-p -r dev:*","lint":"eslint .","test":"vitest run --typecheck","alpha":"npm version prerelease --preid alpha && npm publish --tag alpha && git push --follow-tags","build":"tsc --project ./tsconfig.build.json","predev":"path-exists .env.local dist || (npm run build && convex dev --once)","release":"npm version patch && npm publish && git push --follow-tags","version":"vim -c 'normal o' -c 'normal o## '$npm_package_version CHANGELOG.md && prettier -w CHANGELOG.md && git add CHANGELOG.md","dev:build":"chokidar \"tsconfig*.json\" \"src/**/*.ts\" -i \"**/*.test.ts\" -c \"npm run build:codegen\" --initial","typecheck":"tsc --noEmit && tsc -p example && tsc -p example/convex","preversion":"npm ci && npm run build:clean && run-p test lint typecheck","test:debug":"vitest --inspect-brk --no-file-parallelism","test:watch":"vitest --typecheck --clearScreen false","build:clean":"npx rimraf dist *.tsbuildinfo && npm run build:codegen","dev:backend":"convex dev --typecheck-components","webhook:all":"tsx scripts/test-garmin-webhooks.ts all _","dev:frontend":"cd example && vite --clearScreen false","webhook:ping":"tsx scripts/test-garmin-webhooks.ts ping","webhook:push":"tsx scripts/test-garmin-webhooks.ts push","build:codegen":"npx convex codegen --component-dir ./src/component && npm run build","test:coverage":"vitest run --coverage --coverage.reporter=text","prepublishOnly":"npm whoami || npm login","generate:garmin":"openapi-ts","generate:strava":"openapi-ts","webhook:backfill":"tsx scripts/test-garmin-webhooks.ts backfill"},"_npmUser":{"name":"maxime-ns","email":"maxime.gey@nativesquare.fr"},"repository":{"url":"git+https://github.com/NativeSquare/soma.git","type":"git"},"_npmVersion":"11.4.2","description":"A Convex component that normalizes health and fitness data from multiple wearable providers into a single, consistent schema.","directories":{},"_nodeVersion":"23.3.0","dependencies":{"zod":"^4.3.6"},"_hasShrinkwrap":false,"devDependencies":{"vite":"7.3.1","react":"^19.2.4","convex":"1.31.7","eslint":"9.39.2","vitest":"4.0.18","globals":"^17.3.0","prettier":"3.8.1","react-dom":"^19.2.4","@eslint/js":"9.39.2","pkg-pr-new":"^0.0.63","typescript":"5.9.3","@types/node":"^24.10.11","convex-test":"0.0.41","@types/react":"^19.2.13","chokidar-cli":"3.0.0","npm-run-all2":"8.0.4","path-exists-cli":"2.0.0","@edge-runtime/vm":"^5.0.0","@eslint/eslintrc":"^3.3.3","@types/react-dom":"^19.2.3","typescript-eslint":"8.54.0","openapi-typescript":"^7.13.0","@hey-api/openapi-ts":"^0.94.5","eslint-plugin-react":"^7.37.5","@vitejs/plugin-react":"^5.1.3","@convex-dev/eslint-plugin":"^1.1.1","eslint-plugin-react-hooks":"^7.0.1","eslint-plugin-react-refresh":"^0.5.0"},"peerDependencies":{"react":"^18.3.1 || ^19.0.0","convex":"^1.31.7"},"_npmOperationalInternal":{"tmp":"tmp/soma_0.10.0_1776246682387_0.7672939619603525","host":"s3://npm-registry-packages-npm-production"}},"0.10.1":{"name":"@nativesquare/soma","version":"0.10.1","keywords":["convex","component"],"license":"Apache-2.0","_id":"@nativesquare/soma@0.10.1","maintainers":[{"name":"maxime-ns","email":"maxime.gey@nativesquare.fr"}],"homepage":"https://github.com/NativeSquare/soma#readme","bugs":{"url":"https://github.com/NativeSquare/soma/issues"},"dist":{"shasum":"cf4f3ddc7ddd408c4a7978ee1e17311ada3a3d84","tarball":"https://registry.npmjs.org/@nativesquare/soma/-/soma-0.10.1.tgz","fileCount":717,"integrity":"sha512-FnbyRC1jl3D0JKpsnPJoTRAoeI8MNNz++VFnfBOwV19wxVd/74oX/zRzBJonWohHYVZZHHhs3Z0p4GmLbRWNWg==","signatures":[{"sig":"MEQCIHtNhgwrnX4ygDlEcUvA9/jY2X9y3WuoXDAxLwEJ9tXvAiB6IMGTjwYULnY72sucwt9zvmu8ehMETsSPx+B7cYVj/g==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":5043413},"pnpm":{"onlyBuiltDependencies":["esbuild","@tailwindcss/oxide"]},"type":"module","types":"./dist/client/index.d.ts","module":"./dist/client/index.js","exports":{".":{"types":"./dist/client/index.d.ts","default":"./dist/client/index.js"},"./test":"./src/test.ts","./react":{"types":"./dist/react/index.d.ts","default":"./dist/react/index.js"},"./healthkit":{"types":"./dist/healthkit/index.d.ts","default":"./dist/healthkit/index.js"},"./validators":{"types":"./dist/validators.d.ts","default":"./dist/validators.js"},"./package.json":"./package.json","./convex.config":{"types":"./dist/component/convex.config.d.ts","default":"./dist/component/convex.config.js"},"./strava/client":{"types":"./dist/component/strava/client.d.ts","default":"./dist/component/strava/client.js"},"./convex.config.js":{"types":"./dist/component/convex.config.d.ts","default":"./dist/component/convex.config.js"},"./_generated/component":{"types":"./dist/component/_generated/component.d.ts"},"./_generated/component.js":{"types":"./dist/component/_generated/component.d.ts"}},"gitHead":"7f156b49e5add0674d676acfadb0b17b2971ec90","scripts":{"all":"run-p -r dev:* test:watch","dev":"run-p -r dev:*","lint":"eslint .","test":"vitest run --typecheck","alpha":"npm version prerelease --preid alpha && npm publish --tag alpha && git push --follow-tags","build":"tsc --project ./tsconfig.build.json","predev":"path-exists .env.local dist || (npm run build && convex dev --once)","release":"npm version patch && npm publish && git push --follow-tags","version":"vim -c 'normal o' -c 'normal o## '$npm_package_version CHANGELOG.md && prettier -w CHANGELOG.md && git add CHANGELOG.md","dev:build":"chokidar \"tsconfig*.json\" \"src/**/*.ts\" -i \"**/*.test.ts\" -c \"npm run build:codegen\" --initial","typecheck":"tsc --noEmit && tsc -p example && tsc -p example/convex","preversion":"npm ci && npm run build:clean && run-p test lint typecheck","test:debug":"vitest --inspect-brk --no-file-parallelism","test:watch":"vitest --typecheck --clearScreen false","build:clean":"npx rimraf dist *.tsbuildinfo && npm run build:codegen","dev:backend":"convex dev --typecheck-components","webhook:all":"tsx scripts/test-garmin-webhooks.ts all _","dev:frontend":"cd example && vite --clearScreen false","webhook:ping":"tsx scripts/test-garmin-webhooks.ts ping","webhook:push":"tsx scripts/test-garmin-webhooks.ts push","build:codegen":"npx convex codegen --component-dir ./src/component && npm run build","test:coverage":"vitest run --coverage --coverage.reporter=text","prepublishOnly":"npm whoami || npm login","generate:garmin":"openapi-ts","generate:strava":"openapi-ts","webhook:backfill":"tsx scripts/test-garmin-webhooks.ts backfill"},"_npmUser":{"name":"maxime-ns","email":"maxime.gey@nativesquare.fr"},"repository":{"url":"git+https://github.com/NativeSquare/soma.git","type":"git"},"_npmVersion":"11.4.2","description":"A Convex component that normalizes health and fitness data from multiple wearable providers into a single, consistent schema.","directories":{},"_nodeVersion":"23.3.0","dependencies":{"zod":"^4.3.6"},"_hasShrinkwrap":false,"devDependencies":{"vite":"7.3.1","react":"^19.2.4","convex":"1.31.7","eslint":"9.39.2","vitest":"4.0.18","globals":"^17.3.0","prettier":"3.8.1","react-dom":"^19.2.4","@eslint/js":"9.39.2","pkg-pr-new":"^0.0.63","typescript":"5.9.3","@types/node":"^24.10.11","convex-test":"0.0.41","@types/react":"^19.2.13","chokidar-cli":"3.0.0","npm-run-all2":"8.0.4","path-exists-cli":"2.0.0","@edge-runtime/vm":"^5.0.0","@eslint/eslintrc":"^3.3.3","@types/react-dom":"^19.2.3","typescript-eslint":"8.54.0","openapi-typescript":"^7.13.0","@hey-api/openapi-ts":"^0.94.5","eslint-plugin-react":"^7.37.5","@vitejs/plugin-react":"^5.1.3","@convex-dev/eslint-plugin":"^1.1.1","eslint-plugin-react-hooks":"^7.0.1","eslint-plugin-react-refresh":"^0.5.0"},"peerDependencies":{"react":"^18.3.1 || ^19.0.0","convex":"^1.31.7"},"_npmOperationalInternal":{"tmp":"tmp/soma_0.10.1_1776340348354_0.9704748529980181","host":"s3://npm-registry-packages-npm-production"}},"0.10.2":{"name":"@nativesquare/soma","version":"0.10.2","keywords":["convex","component"],"license":"Apache-2.0","_id":"@nativesquare/soma@0.10.2","maintainers":[{"name":"maxime-ns","email":"maxime.gey@nativesquare.fr"}],"homepage":"https://github.com/NativeSquare/soma#readme","bugs":{"url":"https://github.com/NativeSquare/soma/issues"},"dist":{"shasum":"19d7d4df23802e653186626e60bc50508516c68b","tarball":"https://registry.npmjs.org/@nativesquare/soma/-/soma-0.10.2.tgz","fileCount":717,"integrity":"sha512-FzvEKN39E6na20ehSzTNv3xMNtw+DJW0kNfOx3bWGTBFMH8b3vMGV45DRXzE3NZ5zSJBERtStVEglcSQ4g/qPw==","signatures":[{"sig":"MEYCIQCY+WwRpFChVFuiQIeYF/+TWuOLgk+19KqS+OpbzMwXNwIhAOwrFvsU192sFOu+qn0lTJzdY2Wh9EAf8ARcg/22UH1E","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":5043413},"pnpm":{"onlyBuiltDependencies":["esbuild","@tailwindcss/oxide"]},"type":"module","types":"./dist/client/index.d.ts","module":"./dist/client/index.js","exports":{".":{"types":"./dist/client/index.d.ts","default":"./dist/client/index.js"},"./test":"./src/test.ts","./react":{"types":"./dist/react/index.d.ts","default":"./dist/react/index.js"},"./healthkit":{"types":"./dist/healthkit/index.d.ts","default":"./dist/healthkit/index.js"},"./validators":{"types":"./dist/validators.d.ts","default":"./dist/validators.js"},"./package.json":"./package.json","./convex.config":{"types":"./dist/component/convex.config.d.ts","default":"./dist/component/convex.config.js"},"./strava/client":{"types":"./dist/component/strava/client.d.ts","default":"./dist/component/strava/client.js"},"./convex.config.js":{"types":"./dist/component/convex.config.d.ts","default":"./dist/component/convex.config.js"},"./_generated/component":{"types":"./dist/component/_generated/component.d.ts"},"./_generated/component.js":{"types":"./dist/component/_generated/component.d.ts"}},"gitHead":"7f156b49e5add0674d676acfadb0b17b2971ec90","scripts":{"all":"run-p -r dev:* test:watch","dev":"run-p -r dev:*","lint":"eslint .","test":"vitest run --typecheck","alpha":"npm version prerelease --preid alpha && npm publish --tag alpha && git push --follow-tags","build":"tsc --project ./tsconfig.build.json","predev":"path-exists .env.local dist || (npm run build && convex dev --once)","release":"npm version patch && npm publish && git push --follow-tags","version":"vim -c 'normal o' -c 'normal o## '$npm_package_version CHANGELOG.md && prettier -w CHANGELOG.md && git add CHANGELOG.md","dev:build":"chokidar \"tsconfig*.json\" \"src/**/*.ts\" -i \"**/*.test.ts\" -c \"npm run build:codegen\" --initial","typecheck":"tsc --noEmit && tsc -p example && tsc -p example/convex","preversion":"npm ci && npm run build:clean && run-p test lint typecheck","test:debug":"vitest --inspect-brk --no-file-parallelism","test:watch":"vitest --typecheck --clearScreen false","build:clean":"npx rimraf dist *.tsbuildinfo && npm run build:codegen","dev:backend":"convex dev --typecheck-components","webhook:all":"tsx scripts/test-garmin-webhooks.ts all _","dev:frontend":"cd example && vite --clearScreen false","webhook:ping":"tsx scripts/test-garmin-webhooks.ts ping","webhook:push":"tsx scripts/test-garmin-webhooks.ts push","build:codegen":"npx convex codegen --component-dir ./src/component && npm run build","test:coverage":"vitest run --coverage --coverage.reporter=text","prepublishOnly":"npm whoami || npm login","generate:garmin":"openapi-ts","generate:strava":"openapi-ts","webhook:backfill":"tsx scripts/test-garmin-webhooks.ts backfill"},"_npmUser":{"name":"maxime-ns","email":"maxime.gey@nativesquare.fr"},"repository":{"url":"git+https://github.com/NativeSquare/soma.git","type":"git"},"_npmVersion":"11.4.2","description":"A Convex component that normalizes health and fitness data from multiple wearable providers into a single, consistent schema.","directories":{},"_nodeVersion":"23.3.0","dependencies":{"zod":"^4.3.6"},"_hasShrinkwrap":false,"devDependencies":{"vite":"7.3.1","react":"^19.2.4","convex":"1.31.7","eslint":"9.39.2","vitest":"4.0.18","globals":"^17.3.0","prettier":"3.8.1","react-dom":"^19.2.4","@eslint/js":"9.39.2","pkg-pr-new":"^0.0.63","typescript":"5.9.3","@types/node":"^24.10.11","convex-test":"0.0.41","@types/react":"^19.2.13","chokidar-cli":"3.0.0","npm-run-all2":"8.0.4","path-exists-cli":"2.0.0","@edge-runtime/vm":"^5.0.0","@eslint/eslintrc":"^3.3.3","@types/react-dom":"^19.2.3","typescript-eslint":"8.54.0","openapi-typescript":"^7.13.0","@hey-api/openapi-ts":"^0.94.5","eslint-plugin-react":"^7.37.5","@vitejs/plugin-react":"^5.1.3","@convex-dev/eslint-plugin":"^1.1.1","eslint-plugin-react-hooks":"^7.0.1","eslint-plugin-react-refresh":"^0.5.0"},"peerDependencies":{"react":"^18.3.1 || ^19.0.0","convex":"^1.31.7"},"_npmOperationalInternal":{"tmp":"tmp/soma_0.10.2_1776341605091_0.13136096538198094","host":"s3://npm-registry-packages-npm-production"}},"0.11.0":{"name":"@nativesquare/soma","version":"0.11.0","keywords":["convex","component"],"license":"Apache-2.0","_id":"@nativesquare/soma@0.11.0","maintainers":[{"name":"maxime-ns","email":"maxime.gey@nativesquare.fr"}],"homepage":"https://github.com/NativeSquare/soma#readme","bugs":{"url":"https://github.com/NativeSquare/soma/issues"},"dist":{"shasum":"9fa9117af8ab343158cefef1322e554ced9c5414","tarball":"https://registry.npmjs.org/@nativesquare/soma/-/soma-0.11.0.tgz","fileCount":717,"integrity":"sha512-lsNwOGBg0Zoa3y+Ns2zUQI7/UdfoQPgr3WXJAoiTTBpsW5l/zmq3f17ALAi7OV+a512S9Ajxrrr8GR4qv/MnMw==","signatures":[{"sig":"MEQCIEiD53cdy9cy05Jm9NjLSqST1/L6mw+SMFuOmPmcWMAOAiBBnf5kk/zgbOzFBOVi2u8H1PK/0Ak5LSXhdR0SSlFwtw==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":5005271},"pnpm":{"onlyBuiltDependencies":["esbuild","@tailwindcss/oxide"]},"type":"module","types":"./dist/client/index.d.ts","module":"./dist/client/index.js","exports":{".":{"types":"./dist/client/index.d.ts","default":"./dist/client/index.js"},"./test":"./src/test.ts","./react":{"types":"./dist/react/index.d.ts","default":"./dist/react/index.js"},"./healthkit":{"types":"./dist/healthkit/index.d.ts","default":"./dist/healthkit/index.js"},"./validators":{"types":"./dist/validators.d.ts","default":"./dist/validators.js"},"./package.json":"./package.json","./convex.config":{"types":"./dist/component/convex.config.d.ts","default":"./dist/component/convex.config.js"},"./strava/client":{"types":"./dist/component/strava/client.d.ts","default":"./dist/component/strava/client.js"},"./convex.config.js":{"types":"./dist/component/convex.config.d.ts","default":"./dist/component/convex.config.js"},"./_generated/component":{"types":"./dist/component/_generated/component.d.ts"},"./_generated/component.js":{"types":"./dist/component/_generated/component.d.ts"}},"gitHead":"7f156b49e5add0674d676acfadb0b17b2971ec90","scripts":{"all":"run-p -r dev:* test:watch","dev":"run-p -r dev:*","lint":"eslint .","test":"vitest run --typecheck","alpha":"npm version prerelease --preid alpha && npm publish --tag alpha && git push --follow-tags","build":"tsc --project ./tsconfig.build.json","predev":"path-exists .env.local dist || (npm run build && convex dev --once)","release":"npm version patch && npm publish && git push --follow-tags","version":"vim -c 'normal o' -c 'normal o## '$npm_package_version CHANGELOG.md && prettier -w CHANGELOG.md && git add CHANGELOG.md","dev:build":"chokidar \"tsconfig*.json\" \"src/**/*.ts\" -i \"**/*.test.ts\" -c \"npm run build:codegen\" --initial","typecheck":"tsc --noEmit && tsc -p example && tsc -p example/convex","preversion":"npm ci && npm run build:clean && run-p test lint typecheck","test:debug":"vitest --inspect-brk --no-file-parallelism","test:watch":"vitest --typecheck --clearScreen false","build:clean":"npx rimraf dist *.tsbuildinfo && npm run build:codegen","dev:backend":"convex dev --typecheck-components","webhook:all":"tsx scripts/test-garmin-webhooks.ts all _","dev:frontend":"cd example && vite --clearScreen false","webhook:ping":"tsx scripts/test-garmin-webhooks.ts ping","webhook:push":"tsx scripts/test-garmin-webhooks.ts push","build:codegen":"npx convex codegen --component-dir ./src/component && npm run build","test:coverage":"vitest run --coverage --coverage.reporter=text","prepublishOnly":"npm whoami || npm login","generate:garmin":"openapi-ts","generate:strava":"openapi-ts","webhook:backfill":"tsx scripts/test-garmin-webhooks.ts backfill"},"_npmUser":{"name":"maxime-ns","email":"maxime.gey@nativesquare.fr"},"repository":{"url":"git+https://github.com/NativeSquare/soma.git","type":"git"},"_npmVersion":"11.4.2","description":"A Convex component that normalizes health and fitness data from multiple wearable providers into a single, consistent schema.","directories":{},"_nodeVersion":"23.3.0","dependencies":{"zod":"^4.3.6"},"_hasShrinkwrap":false,"devDependencies":{"vite":"7.3.1","react":"^19.2.4","convex":"1.31.7","eslint":"9.39.2","vitest":"4.0.18","globals":"^17.3.0","prettier":"3.8.1","react-dom":"^19.2.4","@eslint/js":"9.39.2","pkg-pr-new":"^0.0.63","typescript":"5.9.3","@types/node":"^24.10.11","convex-test":"0.0.41","@types/react":"^19.2.13","chokidar-cli":"3.0.0","npm-run-all2":"8.0.4","path-exists-cli":"2.0.0","@edge-runtime/vm":"^5.0.0","@eslint/eslintrc":"^3.3.3","@types/react-dom":"^19.2.3","typescript-eslint":"8.54.0","openapi-typescript":"^7.13.0","@hey-api/openapi-ts":"^0.94.5","eslint-plugin-react":"^7.37.5","@vitejs/plugin-react":"^5.1.3","@convex-dev/eslint-plugin":"^1.1.1","eslint-plugin-react-hooks":"^7.0.1","eslint-plugin-react-refresh":"^0.5.0"},"peerDependencies":{"react":"^18.3.1 || ^19.0.0","convex":"^1.31.7"},"_npmOperationalInternal":{"tmp":"tmp/soma_0.11.0_1776347187753_0.0645637344855452","host":"s3://npm-registry-packages-npm-production"}},"0.12.0":{"name":"@nativesquare/soma","version":"0.12.0","keywords":["convex","component"],"license":"Apache-2.0","_id":"@nativesquare/soma@0.12.0","maintainers":[{"name":"maxime-ns","email":"maxime.gey@nativesquare.fr"}],"homepage":"https://github.com/NativeSquare/soma#readme","bugs":{"url":"https://github.com/NativeSquare/soma/issues"},"dist":{"shasum":"3b75de81f328538103151fe3c86984cc66f9ffa2","tarball":"https://registry.npmjs.org/@nativesquare/soma/-/soma-0.12.0.tgz","fileCount":727,"integrity":"sha512-PS7QNezb9hkgATFg9QhZ15911CtBh9h0AG9dChroEm24sjYN2tZixW2LixdOoxs9UtERpXvilrkyYyUUhMMLyQ==","signatures":[{"sig":"MEYCIQDyP0LkTrKxuPZGPnYpyM2imQWB14qffogtKavHND++TwIhAO/DAbDdQ97/gbdP2dkcss0TbmzXTLhrJonIeFjwGsnT","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":5014251},"pnpm":{"onlyBuiltDependencies":["esbuild","@tailwindcss/oxide"]},"type":"module","types":"./dist/client/index.d.ts","module":"./dist/client/index.js","exports":{".":{"types":"./dist/client/index.d.ts","default":"./dist/client/index.js"},"./test":"./src/test.ts","./react":{"types":"./dist/react/index.d.ts","default":"./dist/react/index.js"},"./healthkit":{"types":"./dist/healthkit/index.d.ts","default":"./dist/healthkit/index.js"},"./validators":{"types":"./dist/validators.d.ts","default":"./dist/validators.js"},"./package.json":"./package.json","./convex.config":{"types":"./dist/component/convex.config.d.ts","default":"./dist/component/convex.config.js"},"./strava/client":{"types":"./dist/component/strava/client.d.ts","default":"./dist/component/strava/client.js"},"./convex.config.js":{"types":"./dist/component/convex.config.d.ts","default":"./dist/component/convex.config.js"},"./_generated/component":{"types":"./dist/component/_generated/component.d.ts"},"./_generated/component.js":{"types":"./dist/component/_generated/component.d.ts"}},"gitHead":"253ca4b0d30c0e78709292a028f2f7f0505e8ceb","scripts":{"all":"run-p -r dev:* test:watch","dev":"run-p -r dev:*","lint":"eslint .","test":"vitest run --typecheck","alpha":"npm version prerelease --preid alpha && npm publish --tag alpha && git push --follow-tags","build":"tsc --project ./tsconfig.build.json","predev":"path-exists .env.local dist || (npm run build && convex dev --once)","release":"npm version patch && npm publish && git push --follow-tags","version":"vim -c 'normal o' -c 'normal o## '$npm_package_version CHANGELOG.md && prettier -w CHANGELOG.md && git add CHANGELOG.md","dev:build":"chokidar \"tsconfig*.json\" \"src/**/*.ts\" -i \"**/*.test.ts\" -c \"npm run build:codegen\" --initial","typecheck":"tsc --noEmit && tsc -p example && tsc -p example/convex","preversion":"npm ci && npm run build:clean && run-p test lint typecheck","test:debug":"vitest --inspect-brk --no-file-parallelism","test:watch":"vitest --typecheck --clearScreen false","build:clean":"npx rimraf dist *.tsbuildinfo && npm run build:codegen","dev:backend":"convex dev --typecheck-components","webhook:all":"tsx scripts/test-garmin-webhooks.ts all _","dev:frontend":"cd example && vite --clearScreen false","webhook:ping":"tsx scripts/test-garmin-webhooks.ts ping","webhook:push":"tsx scripts/test-garmin-webhooks.ts push","build:codegen":"npx convex codegen --component-dir ./src/component && npm run build","test:coverage":"vitest run --coverage --coverage.reporter=text","prepublishOnly":"npm whoami || npm login","generate:garmin":"openapi-ts","generate:strava":"openapi-ts","webhook:backfill":"tsx scripts/test-garmin-webhooks.ts backfill"},"_npmUser":{"name":"maxime-ns","email":"maxime.gey@nativesquare.fr"},"repository":{"url":"git+https://github.com/NativeSquare/soma.git","type":"git"},"_npmVersion":"11.4.2","description":"A Convex component that normalizes health and fitness data from multiple wearable providers into a single, consistent schema.","directories":{},"_nodeVersion":"23.3.0","dependencies":{"zod":"^4.3.6"},"_hasShrinkwrap":false,"devDependencies":{"vite":"7.3.1","react":"^19.2.4","convex":"1.31.7","eslint":"9.39.2","vitest":"4.0.18","globals":"^17.3.0","prettier":"3.8.1","react-dom":"^19.2.4","@eslint/js":"9.39.2","pkg-pr-new":"^0.0.63","typescript":"5.9.3","@types/node":"^24.10.11","convex-test":"0.0.41","@types/react":"^19.2.13","chokidar-cli":"3.0.0","npm-run-all2":"8.0.4","path-exists-cli":"2.0.0","@edge-runtime/vm":"^5.0.0","@eslint/eslintrc":"^3.3.3","@types/react-dom":"^19.2.3","typescript-eslint":"8.54.0","openapi-typescript":"^7.13.0","@hey-api/openapi-ts":"^0.94.5","eslint-plugin-react":"^7.37.5","@vitejs/plugin-react":"^5.1.3","@convex-dev/eslint-plugin":"^1.1.1","eslint-plugin-react-hooks":"^7.0.1","eslint-plugin-react-refresh":"^0.5.0"},"peerDependencies":{"react":"^18.3.1 || ^19.0.0","convex":"^1.31.7"},"_npmOperationalInternal":{"tmp":"tmp/soma_0.12.0_1776360874420_0.9163010597120438","host":"s3://npm-registry-packages-npm-production"}},"0.13.0":{"name":"@nativesquare/soma","version":"0.13.0","keywords":["convex","component"],"license":"Apache-2.0","_id":"@nativesquare/soma@0.13.0","maintainers":[{"name":"maxime-ns","email":"maxime.gey@nativesquare.fr"}],"homepage":"https://github.com/NativeSquare/soma#readme","bugs":{"url":"https://github.com/NativeSquare/soma/issues"},"dist":{"shasum":"efeb469ea1a82701e5678e31be1aa5c83a90b649","tarball":"https://registry.npmjs.org/@nativesquare/soma/-/soma-0.13.0.tgz","fileCount":727,"integrity":"sha512-wqo96JBN2lrV4wU7x3cqVgL6U/1xWvFK625EkS7OdtBQAQy+aMxbqxJtgQ3kDxtmYmpN+m5YYG9MwXDAOXmAXw==","signatures":[{"sig":"MEYCIQCc9Gj/L/wWVGGOqjH228lCrHjDDwRy+9sesd6MY42FLQIhAKozwOcvlj0B0zz4ntpg1WQTqV6hVGXwOOKxb4g1Lx2Y","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":5039987},"pnpm":{"onlyBuiltDependencies":["esbuild","@tailwindcss/oxide"]},"type":"module","types":"./dist/client/index.d.ts","module":"./dist/client/index.js","exports":{".":{"types":"./dist/client/index.d.ts","default":"./dist/client/index.js"},"./test":"./src/test.ts","./react":{"types":"./dist/react/index.d.ts","default":"./dist/react/index.js"},"./healthkit":{"types":"./dist/healthkit/index.d.ts","default":"./dist/healthkit/index.js"},"./validators":{"types":"./dist/validators.d.ts","default":"./dist/validators.js"},"./package.json":"./package.json","./convex.config":{"types":"./dist/component/convex.config.d.ts","default":"./dist/component/convex.config.js"},"./strava/client":{"types":"./dist/component/strava/client.d.ts","default":"./dist/component/strava/client.js"},"./convex.config.js":{"types":"./dist/component/convex.config.d.ts","default":"./dist/component/convex.config.js"},"./_generated/component":{"types":"./dist/component/_generated/component.d.ts"},"./_generated/component.js":{"types":"./dist/component/_generated/component.d.ts"}},"gitHead":"96f5d7af223e257a47a1e956dc4b4a516aca5d4e","scripts":{"all":"run-p -r dev:* test:watch","dev":"run-p -r dev:*","lint":"eslint .","test":"vitest run --typecheck","alpha":"npm version prerelease --preid alpha && npm publish --tag alpha && git push --follow-tags","build":"tsc --project ./tsconfig.build.json","predev":"path-exists .env.local dist || (npm run build && convex dev --once)","release":"npm version patch && npm publish && git push --follow-tags","version":"vim -c 'normal o' -c 'normal o## '$npm_package_version CHANGELOG.md && prettier -w CHANGELOG.md && git add CHANGELOG.md","dev:build":"chokidar \"tsconfig*.json\" \"src/**/*.ts\" -i \"**/*.test.ts\" -c \"npm run build:codegen\" --initial","typecheck":"tsc --noEmit && tsc -p example && tsc -p example/convex","preversion":"npm ci && npm run build:clean && run-p test lint typecheck","test:debug":"vitest --inspect-brk --no-file-parallelism","test:watch":"vitest --typecheck --clearScreen false","build:clean":"npx rimraf dist *.tsbuildinfo && npm run build:codegen","dev:backend":"convex dev --typecheck-components","webhook:all":"tsx scripts/test-garmin-webhooks.ts all _","dev:frontend":"cd example && vite --clearScreen false","webhook:ping":"tsx scripts/test-garmin-webhooks.ts ping","webhook:push":"tsx scripts/test-garmin-webhooks.ts push","build:codegen":"npx convex codegen --component-dir ./src/component && npm run build","test:coverage":"vitest run --coverage --coverage.reporter=text","prepublishOnly":"npm whoami || npm login","generate:garmin":"openapi-ts","generate:strava":"openapi-ts","webhook:backfill":"tsx scripts/test-garmin-webhooks.ts backfill"},"_npmUser":{"name":"maxime-ns","email":"maxime.gey@nativesquare.fr"},"repository":{"url":"git+https://github.com/NativeSquare/soma.git","type":"git"},"_npmVersion":"11.4.2","description":"A Convex component that normalizes health and fitness data from multiple wearable providers into a single, consistent schema.","directories":{},"_nodeVersion":"23.3.0","dependencies":{"zod":"^4.3.6"},"_hasShrinkwrap":false,"devDependencies":{"vite":"7.3.1","react":"^19.2.4","convex":"1.31.7","eslint":"9.39.2","vitest":"4.0.18","globals":"^17.3.0","prettier":"3.8.1","react-dom":"^19.2.4","@eslint/js":"9.39.2","pkg-pr-new":"^0.0.63","typescript":"5.9.3","@types/node":"^24.10.11","convex-test":"0.0.41","@types/react":"^19.2.13","chokidar-cli":"3.0.0","npm-run-all2":"8.0.4","path-exists-cli":"2.0.0","@edge-runtime/vm":"^5.0.0","@eslint/eslintrc":"^3.3.3","@types/react-dom":"^19.2.3","typescript-eslint":"8.54.0","openapi-typescript":"^7.13.0","@hey-api/openapi-ts":"^0.94.5","eslint-plugin-react":"^7.37.5","@vitejs/plugin-react":"^5.1.3","@convex-dev/eslint-plugin":"^1.1.1","eslint-plugin-react-hooks":"^7.0.1","eslint-plugin-react-refresh":"^0.5.0"},"peerDependencies":{"react":"^18.3.1 || ^19.0.0","convex":"^1.31.7"},"_npmOperationalInternal":{"tmp":"tmp/soma_0.13.0_1776421786728_0.28728043662826375","host":"s3://npm-registry-packages-npm-production"}},"0.13.1":{"name":"@nativesquare/soma","version":"0.13.1","keywords":["convex","component"],"license":"Apache-2.0","_id":"@nativesquare/soma@0.13.1","maintainers":[{"name":"maxime-ns","email":"maxime.gey@nativesquare.fr"}],"homepage":"https://github.com/NativeSquare/soma#readme","bugs":{"url":"https://github.com/NativeSquare/soma/issues"},"dist":{"shasum":"718621af62bbd75127459a07c78247d87bcfc3a4","tarball":"https://registry.npmjs.org/@nativesquare/soma/-/soma-0.13.1.tgz","fileCount":727,"integrity":"sha512-96tRnA+EQHDVsuCzGDsU3rjXHFrx6sYr9Veeec3gyjes+2DR6BxyGDZzfDEKnfAITHQBV41k34pe6WkKUSeySw==","signatures":[{"sig":"MEYCIQDHHDtdhJPPBx8hZjpVxdlPScYIWD0fkV16M/rgqgta1gIhAJF9dXHtb5F0lsCwSUJP8Uy8xQl76vRYQiOKZsrZmQ/1","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":5044734},"pnpm":{"onlyBuiltDependencies":["esbuild","@tailwindcss/oxide"]},"type":"module","types":"./dist/client/index.d.ts","module":"./dist/client/index.js","exports":{".":{"types":"./dist/client/index.d.ts","default":"./dist/client/index.js"},"./test":"./src/test.ts","./react":{"types":"./dist/react/index.d.ts","default":"./dist/react/index.js"},"./healthkit":{"types":"./dist/healthkit/index.d.ts","default":"./dist/healthkit/index.js"},"./validators":{"types":"./dist/validators.d.ts","default":"./dist/validators.js"},"./package.json":"./package.json","./convex.config":{"types":"./dist/component/convex.config.d.ts","default":"./dist/component/convex.config.js"},"./strava/client":{"types":"./dist/component/strava/client.d.ts","default":"./dist/component/strava/client.js"},"./convex.config.js":{"types":"./dist/component/convex.config.d.ts","default":"./dist/component/convex.config.js"},"./_generated/component":{"types":"./dist/component/_generated/component.d.ts"},"./_generated/component.js":{"types":"./dist/component/_generated/component.d.ts"}},"gitHead":"96f5d7af223e257a47a1e956dc4b4a516aca5d4e","scripts":{"all":"run-p -r dev:* test:watch","dev":"run-p -r dev:*","lint":"eslint .","test":"vitest run --typecheck","alpha":"npm version prerelease --preid alpha && npm publish --tag alpha && git push --follow-tags","build":"tsc --project ./tsconfig.build.json","predev":"path-exists .env.local dist || (npm run build && convex dev --once)","release":"npm version patch && npm publish && git push --follow-tags","version":"vim -c 'normal o' -c 'normal o## '$npm_package_version CHANGELOG.md && prettier -w CHANGELOG.md && git add CHANGELOG.md","dev:build":"chokidar \"tsconfig*.json\" \"src/**/*.ts\" -i \"**/*.test.ts\" -c \"npm run build:codegen\" --initial","typecheck":"tsc --noEmit && tsc -p example && tsc -p example/convex","preversion":"npm ci && npm run build:clean && run-p test lint typecheck","test:debug":"vitest --inspect-brk --no-file-parallelism","test:watch":"vitest --typecheck --clearScreen false","build:clean":"npx rimraf dist *.tsbuildinfo && npm run build:codegen","dev:backend":"convex dev --typecheck-components","webhook:all":"tsx scripts/test-garmin-webhooks.ts all _","dev:frontend":"cd example && vite --clearScreen false","webhook:ping":"tsx scripts/test-garmin-webhooks.ts ping","webhook:push":"tsx scripts/test-garmin-webhooks.ts push","build:codegen":"npx convex codegen --component-dir ./src/component && npm run build","test:coverage":"vitest run --coverage --coverage.reporter=text","prepublishOnly":"npm whoami || npm login","generate:garmin":"openapi-ts","generate:strava":"openapi-ts","webhook:backfill":"tsx scripts/test-garmin-webhooks.ts backfill"},"_npmUser":{"name":"maxime-ns","email":"maxime.gey@nativesquare.fr"},"repository":{"url":"git+https://github.com/NativeSquare/soma.git","type":"git"},"_npmVersion":"11.4.2","description":"A Convex component that normalizes health and fitness data from multiple wearable providers into a single, consistent schema.","directories":{},"_nodeVersion":"23.3.0","dependencies":{"zod":"^4.3.6"},"_hasShrinkwrap":false,"devDependencies":{"vite":"7.3.1","react":"^19.2.4","convex":"1.31.7","eslint":"9.39.2","vitest":"4.0.18","globals":"^17.3.0","prettier":"3.8.1","react-dom":"^19.2.4","@eslint/js":"9.39.2","pkg-pr-new":"^0.0.63","typescript":"5.9.3","@types/node":"^24.10.11","convex-test":"0.0.41","@types/react":"^19.2.13","chokidar-cli":"3.0.0","npm-run-all2":"8.0.4","path-exists-cli":"2.0.0","@edge-runtime/vm":"^5.0.0","@eslint/eslintrc":"^3.3.3","@types/react-dom":"^19.2.3","typescript-eslint":"8.54.0","openapi-typescript":"^7.13.0","@hey-api/openapi-ts":"^0.94.5","eslint-plugin-react":"^7.37.5","@vitejs/plugin-react":"^5.1.3","@convex-dev/eslint-plugin":"^1.1.1","eslint-plugin-react-hooks":"^7.0.1","eslint-plugin-react-refresh":"^0.5.0"},"peerDependencies":{"react":"^18.3.1 || ^19.0.0","convex":"^1.31.7"},"_npmOperationalInternal":{"tmp":"tmp/soma_0.13.1_1776426070845_0.21931204045374275","host":"s3://npm-registry-packages-npm-production"}},"0.14.0":{"name":"@nativesquare/soma","version":"0.14.0","keywords":["convex","component"],"license":"Apache-2.0","_id":"@nativesquare/soma@0.14.0","maintainers":[{"name":"maxime-ns","email":"maxime.gey@nativesquare.fr"}],"homepage":"https://github.com/NativeSquare/soma#readme","bugs":{"url":"https://github.com/NativeSquare/soma/issues"},"dist":{"shasum":"fc5bf42c1acee548fb25f511e6b822828d8fa5cd","tarball":"https://registry.npmjs.org/@nativesquare/soma/-/soma-0.14.0.tgz","fileCount":727,"integrity":"sha512-s8+TaWOb6FtT1S6d3inHJYY6W0wKUDiigfTppTKJHCv+vxKXpbI1weME+0gmvyR9NwZdLgf+BXKzXjTtYT3Ehg==","signatures":[{"sig":"MEUCIDaT9gwQYum63rO/li3eonD1w5mqgBFm0fQka/RzLQnaAiEA+G1cxFVPRxYNnV5L2jDYVOxYUu65ut6j/G8d+QHw2qw=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":5082509},"pnpm":{"onlyBuiltDependencies":["esbuild","@tailwindcss/oxide"]},"type":"module","types":"./dist/client/index.d.ts","module":"./dist/client/index.js","exports":{".":{"types":"./dist/client/index.d.ts","default":"./dist/client/index.js"},"./test":"./src/test.ts","./react":{"types":"./dist/react/index.d.ts","default":"./dist/react/index.js"},"./healthkit":{"types":"./dist/healthkit/index.d.ts","default":"./dist/healthkit/index.js"},"./validators":{"types":"./dist/validators.d.ts","default":"./dist/validators.js"},"./package.json":"./package.json","./convex.config":{"types":"./dist/component/convex.config.d.ts","default":"./dist/component/convex.config.js"},"./strava/client":{"types":"./dist/component/strava/client.d.ts","default":"./dist/component/strava/client.js"},"./convex.config.js":{"types":"./dist/component/convex.config.d.ts","default":"./dist/component/convex.config.js"},"./_generated/component":{"types":"./dist/component/_generated/component.d.ts"},"./_generated/component.js":{"types":"./dist/component/_generated/component.d.ts"}},"gitHead":"cc37e8cd3e713dfc5b6ce3d935ec36a051a16dd7","scripts":{"all":"run-p -r dev:* test:watch","dev":"run-p -r dev:*","lint":"eslint .","test":"vitest run --typecheck","alpha":"npm version prerelease --preid alpha && npm publish --tag alpha && git push --follow-tags","build":"tsc --project ./tsconfig.build.json","predev":"path-exists .env.local dist || (npm run build && convex dev --once)","release":"npm version patch && npm publish && git push --follow-tags","version":"vim -c 'normal o' -c 'normal o## '$npm_package_version CHANGELOG.md && prettier -w CHANGELOG.md && git add CHANGELOG.md","dev:build":"chokidar \"tsconfig*.json\" \"src/**/*.ts\" -i \"**/*.test.ts\" -c \"npm run build:codegen\" --initial","typecheck":"tsc --noEmit && tsc -p example && tsc -p example/convex","preversion":"npm ci && npm run build:clean && run-p test lint typecheck","test:debug":"vitest --inspect-brk --no-file-parallelism","test:watch":"vitest --typecheck --clearScreen false","build:clean":"npx rimraf dist *.tsbuildinfo && npm run build:codegen","dev:backend":"convex dev --typecheck-components","webhook:all":"tsx scripts/test-garmin-webhooks.ts all _","dev:frontend":"cd example && vite --clearScreen false","webhook:ping":"tsx scripts/test-garmin-webhooks.ts ping","webhook:push":"tsx scripts/test-garmin-webhooks.ts push","build:codegen":"npx convex codegen --component-dir ./src/component && npm run build","test:coverage":"vitest run --coverage --coverage.reporter=text","prepublishOnly":"npm whoami || npm login","generate:garmin":"openapi-ts","generate:strava":"openapi-ts","webhook:backfill":"tsx scripts/test-garmin-webhooks.ts backfill"},"_npmUser":{"name":"maxime-ns","email":"maxime.gey@nativesquare.fr"},"repository":{"url":"git+https://github.com/NativeSquare/soma.git","type":"git"},"_npmVersion":"11.4.2","description":"A Convex component that normalizes health and fitness data from multiple wearable providers into a single, consistent schema.","directories":{},"_nodeVersion":"23.3.0","dependencies":{"zod":"^4.3.6"},"_hasShrinkwrap":false,"devDependencies":{"vite":"7.3.1","react":"^19.2.4","convex":"1.31.7","eslint":"9.39.2","vitest":"4.0.18","globals":"^17.3.0","prettier":"3.8.1","react-dom":"^19.2.4","@eslint/js":"9.39.2","pkg-pr-new":"^0.0.63","typescript":"5.9.3","@types/node":"^24.10.11","convex-test":"0.0.41","@types/react":"^19.2.13","chokidar-cli":"3.0.0","npm-run-all2":"8.0.4","path-exists-cli":"2.0.0","@edge-runtime/vm":"^5.0.0","@eslint/eslintrc":"^3.3.3","@types/react-dom":"^19.2.3","typescript-eslint":"8.54.0","openapi-typescript":"^7.13.0","@hey-api/openapi-ts":"^0.94.5","eslint-plugin-react":"^7.37.5","@vitejs/plugin-react":"^5.1.3","@convex-dev/eslint-plugin":"^1.1.1","eslint-plugin-react-hooks":"^7.0.1","eslint-plugin-react-refresh":"^0.5.0"},"peerDependencies":{"react":"^18.3.1 || ^19.0.0","convex":"^1.31.7"},"_npmOperationalInternal":{"tmp":"tmp/soma_0.14.0_1776439002317_0.20863314814195366","host":"s3://npm-registry-packages-npm-production"}},"0.14.1":{"name":"@nativesquare/soma","version":"0.14.1","keywords":["convex","component"],"license":"Apache-2.0","_id":"@nativesquare/soma@0.14.1","maintainers":[{"name":"maxime-ns","email":"maxime.gey@nativesquare.fr"}],"homepage":"https://github.com/NativeSquare/soma#readme","bugs":{"url":"https://github.com/NativeSquare/soma/issues"},"dist":{"shasum":"60e7b9b81fb01d4e256a26d4f25497760c085d96","tarball":"https://registry.npmjs.org/@nativesquare/soma/-/soma-0.14.1.tgz","fileCount":727,"integrity":"sha512-bwhD1Z8lgBsxxpBgFTI2zruidtTihgxmg5HrvfC88DfIgocFs8xtBUhrbb8DCp5lOqfxRmpmtZdlQyLk9hfkFQ==","signatures":[{"sig":"MEUCIGpOSUOj3o/CnhuEn+PkXmYFSk2DnIL9BCcv1CPdc6hRAiEAtcROYRwr4psnPctKxL5NW3+WygFAzpsK8qsxI+PDhSo=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":5110045},"pnpm":{"onlyBuiltDependencies":["esbuild","@tailwindcss/oxide"]},"type":"module","types":"./dist/client/index.d.ts","module":"./dist/client/index.js","exports":{".":{"types":"./dist/client/index.d.ts","default":"./dist/client/index.js"},"./test":"./src/test.ts","./react":{"types":"./dist/react/index.d.ts","default":"./dist/react/index.js"},"./healthkit":{"types":"./dist/healthkit/index.d.ts","default":"./dist/healthkit/index.js"},"./validators":{"types":"./dist/validators.d.ts","default":"./dist/validators.js"},"./package.json":"./package.json","./convex.config":{"types":"./dist/component/convex.config.d.ts","default":"./dist/component/convex.config.js"},"./strava/client":{"types":"./dist/component/strava/client.d.ts","default":"./dist/component/strava/client.js"},"./convex.config.js":{"types":"./dist/component/convex.config.d.ts","default":"./dist/component/convex.config.js"},"./_generated/component":{"types":"./dist/component/_generated/component.d.ts"},"./_generated/component.js":{"types":"./dist/component/_generated/component.d.ts"}},"gitHead":"c6d98f044182fb451be0c6309efc84b7bcb2d7e7","scripts":{"all":"run-p -r dev:* test:watch","dev":"run-p -r dev:*","lint":"eslint .","test":"vitest run --typecheck","alpha":"npm version prerelease --preid alpha && npm publish --tag alpha && git push --follow-tags","build":"tsc --project ./tsconfig.build.json","predev":"path-exists .env.local dist || (npm run build && convex dev --once)","release":"npm version patch && npm publish && git push --follow-tags","version":"vim -c 'normal o' -c 'normal o## '$npm_package_version CHANGELOG.md && prettier -w CHANGELOG.md && git add CHANGELOG.md","dev:build":"chokidar \"tsconfig*.json\" \"src/**/*.ts\" -i \"**/*.test.ts\" -c \"npm run build:codegen\" --initial","typecheck":"tsc --noEmit && tsc -p example && tsc -p example/convex","preversion":"npm ci && npm run build:clean && run-p test lint typecheck","test:debug":"vitest --inspect-brk --no-file-parallelism","test:watch":"vitest --typecheck --clearScreen false","build:clean":"npx rimraf dist *.tsbuildinfo && npm run build:codegen","dev:backend":"convex dev --typecheck-components","webhook:all":"tsx scripts/test-garmin-webhooks.ts all _","dev:frontend":"cd example && vite --clearScreen false","webhook:ping":"tsx scripts/test-garmin-webhooks.ts ping","webhook:push":"tsx scripts/test-garmin-webhooks.ts push","build:codegen":"npx convex codegen --component-dir ./src/component && npm run build","test:coverage":"vitest run --coverage --coverage.reporter=text","prepublishOnly":"npm whoami || npm login","generate:garmin":"openapi-ts","generate:strava":"openapi-ts","webhook:backfill":"tsx scripts/test-garmin-webhooks.ts backfill"},"_npmUser":{"name":"maxime-ns","email":"maxime.gey@nativesquare.fr"},"repository":{"url":"git+https://github.com/NativeSquare/soma.git","type":"git"},"_npmVersion":"11.4.2","description":"A Convex component that normalizes health and fitness data from multiple wearable providers into a single, consistent schema.","directories":{},"_nodeVersion":"23.3.0","dependencies":{"zod":"^4.3.6"},"_hasShrinkwrap":false,"devDependencies":{"vite":"7.3.1","react":"^19.2.4","convex":"1.31.7","eslint":"9.39.2","vitest":"4.0.18","globals":"^17.3.0","prettier":"3.8.1","react-dom":"^19.2.4","@eslint/js":"9.39.2","pkg-pr-new":"^0.0.63","typescript":"5.9.3","@types/node":"^24.10.11","convex-test":"0.0.41","@types/react":"^19.2.13","chokidar-cli":"3.0.0","npm-run-all2":"8.0.4","path-exists-cli":"2.0.0","@edge-runtime/vm":"^5.0.0","@eslint/eslintrc":"^3.3.3","@types/react-dom":"^19.2.3","typescript-eslint":"8.54.0","openapi-typescript":"^7.13.0","@hey-api/openapi-ts":"^0.94.5","eslint-plugin-react":"^7.37.5","@vitejs/plugin-react":"^5.1.3","@convex-dev/eslint-plugin":"^1.1.1","eslint-plugin-react-hooks":"^7.0.1","eslint-plugin-react-refresh":"^0.5.0"},"peerDependencies":{"react":"^18.3.1 || ^19.0.0","convex":"^1.31.7"},"_npmOperationalInternal":{"tmp":"tmp/soma_0.14.1_1776442574401_0.5685931191660487","host":"s3://npm-registry-packages-npm-production"}},"0.16.0":{"name":"@nativesquare/soma","version":"0.16.0","keywords":["convex","component"],"license":"Apache-2.0","_id":"@nativesquare/soma@0.16.0","maintainers":[{"name":"maxime-ns","email":"maxime.gey@nativesquare.fr"}],"homepage":"https://github.com/NativeSquare/soma#readme","bugs":{"url":"https://github.com/NativeSquare/soma/issues"},"dist":{"shasum":"7242844e5bfcaf4c3e95606c0274126af0a874c6","tarball":"https://registry.npmjs.org/@nativesquare/soma/-/soma-0.16.0.tgz","fileCount":732,"integrity":"sha512-WcH1RvU3VLpEHSvagk2A/I/p2JqOYi6ov9IhEjvCiz3XG+agkY42rloLEj2hadrhNYKWOhM49LVN3KfJ9tyatA==","signatures":[{"sig":"MEQCIAWdxI0w4/RrYZHfcQW0sOsOWgmGx05J6lRP/f0YmoWmAiB30jhAnW/4okiZGY4iOo0or3zRyfu3iLqAFRBztXY4EA==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":5189131},"pnpm":{"onlyBuiltDependencies":["esbuild","@tailwindcss/oxide"]},"type":"module","types":"./dist/client/index.d.ts","module":"./dist/client/index.js","exports":{".":{"types":"./dist/client/index.d.ts","default":"./dist/client/index.js"},"./test":"./src/test.ts","./react":{"types":"./dist/react/index.d.ts","default":"./dist/react/index.js"},"./healthkit":{"types":"./dist/component/healthkit/index.d.ts","default":"./dist/component/healthkit/index.js"},"./validators":{"types":"./dist/validators.d.ts","default":"./dist/validators.js"},"./package.json":"./package.json","./convex.config":{"types":"./dist/component/convex.config.d.ts","default":"./dist/component/convex.config.js"},"./strava/client":{"types":"./dist/component/strava/client.d.ts","default":"./dist/component/strava/client.js"},"./convex.config.js":{"types":"./dist/component/convex.config.d.ts","default":"./dist/component/convex.config.js"},"./_generated/component":{"types":"./dist/component/_generated/component.d.ts"},"./_generated/component.js":{"types":"./dist/component/_generated/component.d.ts"}},"gitHead":"cd0f0e23092c51036a6c8f41412799280f74c197","scripts":{"all":"run-p -r dev:* test:watch","dev":"run-p -r dev:*","lint":"eslint .","test":"vitest run --typecheck","alpha":"npm version prerelease --preid alpha && npm publish --tag alpha && git push --follow-tags","build":"tsc --project ./tsconfig.build.json","predev":"path-exists .env.local dist || (npm run build && convex dev --once)","release":"npm version patch && npm publish && git push --follow-tags","version":"vim -c 'normal o' -c 'normal o## '$npm_package_version CHANGELOG.md && prettier -w CHANGELOG.md && git add CHANGELOG.md","dev:build":"chokidar \"tsconfig*.json\" \"src/**/*.ts\" -i \"**/*.test.ts\" -c \"npm run build:codegen\" --initial","typecheck":"tsc --noEmit && tsc -p example && tsc -p example/convex","preversion":"npm ci && npm run build:clean && run-p test lint typecheck","test:debug":"vitest --inspect-brk --no-file-parallelism","test:watch":"vitest --typecheck --clearScreen false","build:clean":"npx rimraf dist *.tsbuildinfo && npm run build:codegen","dev:backend":"convex dev --typecheck-components","webhook:all":"tsx scripts/test-garmin-webhooks.ts all _","dev:frontend":"cd example && vite --clearScreen false","webhook:ping":"tsx scripts/test-garmin-webhooks.ts ping","webhook:push":"tsx scripts/test-garmin-webhooks.ts push","build:codegen":"npx convex codegen --component-dir ./src/component && npm run build","test:coverage":"vitest run --coverage --coverage.reporter=text","prepublishOnly":"npm whoami || npm login","generate:garmin":"openapi-ts","generate:strava":"openapi-ts","webhook:backfill":"tsx scripts/test-garmin-webhooks.ts backfill"},"_npmUser":{"name":"maxime-ns","email":"maxime.gey@nativesquare.fr"},"repository":{"url":"git+https://github.com/NativeSquare/soma.git","type":"git"},"_npmVersion":"11.4.2","description":"A Convex component that normalizes health and fitness data from multiple wearable providers into a single, consistent schema.","directories":{},"_nodeVersion":"23.3.0","dependencies":{"zod":"^4.3.6"},"_hasShrinkwrap":false,"devDependencies":{"vite":"7.3.1","react":"^19.2.4","convex":"1.31.7","eslint":"9.39.2","vitest":"4.0.18","globals":"^17.3.0","prettier":"3.8.1","react-dom":"^19.2.4","@eslint/js":"9.39.2","pkg-pr-new":"^0.0.63","typescript":"5.9.3","@types/node":"^24.10.11","convex-test":"0.0.41","@types/react":"^19.2.13","chokidar-cli":"3.0.0","npm-run-all2":"8.0.4","path-exists-cli":"2.0.0","@edge-runtime/vm":"^5.0.0","@eslint/eslintrc":"^3.3.3","@types/react-dom":"^19.2.3","typescript-eslint":"8.54.0","openapi-typescript":"^7.13.0","@hey-api/openapi-ts":"^0.94.5","eslint-plugin-react":"^7.37.5","@vitejs/plugin-react":"^5.1.3","@convex-dev/eslint-plugin":"^1.1.1","eslint-plugin-react-hooks":"^7.0.1","eslint-plugin-react-refresh":"^0.5.0"},"peerDependencies":{"react":"^18.3.1 || ^19.0.0","convex":"^1.31.7"},"_npmOperationalInternal":{"tmp":"tmp/soma_0.16.0_1776517549859_0.14762659521041477","host":"s3://npm-registry-packages-npm-production"}},"0.16.1":{"name":"@nativesquare/soma","version":"0.16.1","keywords":["convex","component"],"license":"Apache-2.0","_id":"@nativesquare/soma@0.16.1","maintainers":[{"name":"maxime-ns","email":"maxime.gey@nativesquare.fr"}],"homepage":"https://github.com/NativeSquare/soma#readme","bugs":{"url":"https://github.com/NativeSquare/soma/issues"},"dist":{"shasum":"2f822460400a66435f7af7768ba2166ab9d1fcc4","tarball":"https://registry.npmjs.org/@nativesquare/soma/-/soma-0.16.1.tgz","fileCount":732,"integrity":"sha512-fShW4rvZ854XwCK7v7APGHxpj4VTVxpg/NQEtY85ybsPQwdfBgKBHvQzSFJbkS1B5bTOaz0cdoeEJYKgOjPCEA==","signatures":[{"sig":"MEYCIQCqGHRozgMJD+mUU3S1NeokiX+TbN7o6tiFAZLp8i8QzwIhAKbc6Uhden9dnMFtvL+XkjcnIT6DeNViUn3lBCLatxRq","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":5189720},"pnpm":{"onlyBuiltDependencies":["esbuild","@tailwindcss/oxide"]},"type":"module","types":"./dist/client/index.d.ts","module":"./dist/client/index.js","exports":{".":{"types":"./dist/client/index.d.ts","default":"./dist/client/index.js"},"./test":"./src/test.ts","./react":{"types":"./dist/react/index.d.ts","default":"./dist/react/index.js"},"./healthkit":{"types":"./dist/component/healthkit/index.d.ts","default":"./dist/component/healthkit/index.js"},"./validators":{"types":"./dist/validators.d.ts","default":"./dist/validators.js"},"./package.json":"./package.json","./convex.config":{"types":"./dist/component/convex.config.d.ts","default":"./dist/component/convex.config.js"},"./strava/client":{"types":"./dist/component/strava/client.d.ts","default":"./dist/component/strava/client.js"},"./convex.config.js":{"types":"./dist/component/convex.config.d.ts","default":"./dist/component/convex.config.js"},"./_generated/component":{"types":"./dist/component/_generated/component.d.ts"},"./_generated/component.js":{"types":"./dist/component/_generated/component.d.ts"}},"gitHead":"30f12599a27f1d115c3a43c0f239526a95619814","scripts":{"all":"run-p -r dev:* test:watch","dev":"run-p -r dev:*","lint":"eslint .","test":"vitest run --typecheck","alpha":"npm version prerelease --preid alpha && npm publish --tag alpha && git push --follow-tags","build":"tsc --project ./tsconfig.build.json","predev":"path-exists .env.local dist || (npm run build && convex dev --once)","release":"npm version patch && npm publish && git push --follow-tags","version":"vim -c 'normal o' -c 'normal o## '$npm_package_version CHANGELOG.md && prettier -w CHANGELOG.md && git add CHANGELOG.md","dev:build":"chokidar \"tsconfig*.json\" \"src/**/*.ts\" -i \"**/*.test.ts\" -c \"npm run build:codegen\" --initial","typecheck":"tsc --noEmit && tsc -p example && tsc -p example/convex","preversion":"npm ci && npm run build:clean && run-p test lint typecheck","test:debug":"vitest --inspect-brk --no-file-parallelism","test:watch":"vitest --typecheck --clearScreen false","build:clean":"npx rimraf dist *.tsbuildinfo && npm run build:codegen","dev:backend":"convex dev --typecheck-components","webhook:all":"tsx scripts/test-garmin-webhooks.ts all _","dev:frontend":"cd example && vite --clearScreen false","webhook:ping":"tsx scripts/test-garmin-webhooks.ts ping","webhook:push":"tsx scripts/test-garmin-webhooks.ts push","build:codegen":"npx convex codegen --component-dir ./src/component && npm run build","test:coverage":"vitest run --coverage --coverage.reporter=text","prepublishOnly":"npm whoami || npm login","generate:garmin":"openapi-ts","generate:strava":"openapi-ts","webhook:backfill":"tsx scripts/test-garmin-webhooks.ts backfill"},"_npmUser":{"name":"maxime-ns","email":"maxime.gey@nativesquare.fr"},"repository":{"url":"git+https://github.com/NativeSquare/soma.git","type":"git"},"_npmVersion":"11.4.2","description":"A Convex component that normalizes health and fitness data from multiple wearable providers into a single, consistent schema.","directories":{},"_nodeVersion":"23.3.0","dependencies":{"zod":"^4.3.6"},"_hasShrinkwrap":false,"devDependencies":{"vite":"7.3.1","react":"^19.2.4","convex":"1.31.7","eslint":"9.39.2","vitest":"4.0.18","globals":"^17.3.0","prettier":"3.8.1","react-dom":"^19.2.4","@eslint/js":"9.39.2","pkg-pr-new":"^0.0.63","typescript":"5.9.3","@types/node":"^24.10.11","convex-test":"0.0.41","@types/react":"^19.2.13","chokidar-cli":"3.0.0","npm-run-all2":"8.0.4","path-exists-cli":"2.0.0","@edge-runtime/vm":"^5.0.0","@eslint/eslintrc":"^3.3.3","@types/react-dom":"^19.2.3","typescript-eslint":"8.54.0","openapi-typescript":"^7.13.0","@hey-api/openapi-ts":"^0.94.5","eslint-plugin-react":"^7.37.5","@vitejs/plugin-react":"^5.1.3","@convex-dev/eslint-plugin":"^1.1.1","eslint-plugin-react-hooks":"^7.0.1","eslint-plugin-react-refresh":"^0.5.0"},"peerDependencies":{"react":"^18.3.1 || ^19.0.0","convex":"^1.31.7"},"_npmOperationalInternal":{"tmp":"tmp/soma_0.16.1_1776587111226_0.684949851905635","host":"s3://npm-registry-packages-npm-production"}},"0.16.2":{"name":"@nativesquare/soma","version":"0.16.2","keywords":["convex","component"],"license":"Apache-2.0","_id":"@nativesquare/soma@0.16.2","maintainers":[{"name":"maxime-ns","email":"maxime.gey@nativesquare.fr"}],"homepage":"https://github.com/NativeSquare/soma#readme","bugs":{"url":"https://github.com/NativeSquare/soma/issues"},"dist":{"shasum":"8137f05ea3f384f74a71fc7823d36e6ad93e0504","tarball":"https://registry.npmjs.org/@nativesquare/soma/-/soma-0.16.2.tgz","fileCount":732,"integrity":"sha512-Ou4osSQMUCdCCMq6Q8KGRe3vF6R+EFPQSB7xnt164lUb4eBobcBdSmvCh0MyXqnuQPQAxtelcrYsWBv+gIDwjA==","signatures":[{"sig":"MEYCIQCR2+OdEFM7JxkYDQzyDcSeftMG1a8tgOHvysRIu4GnhwIhAKzLVzor9Dt0V+kMeblab+vcaMMRReMskvTlAEWoRE9Y","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":5200395},"pnpm":{"onlyBuiltDependencies":["esbuild","@tailwindcss/oxide"]},"type":"module","types":"./dist/client/index.d.ts","module":"./dist/client/index.js","exports":{".":{"types":"./dist/client/index.d.ts","default":"./dist/client/index.js"},"./test":"./src/test.ts","./react":{"types":"./dist/react/index.d.ts","default":"./dist/react/index.js"},"./healthkit":{"types":"./dist/component/healthkit/index.d.ts","default":"./dist/component/healthkit/index.js"},"./validators":{"types":"./dist/validators.d.ts","default":"./dist/validators.js"},"./package.json":"./package.json","./convex.config":{"types":"./dist/component/convex.config.d.ts","default":"./dist/component/convex.config.js"},"./strava/client":{"types":"./dist/component/strava/client.d.ts","default":"./dist/component/strava/client.js"},"./convex.config.js":{"types":"./dist/component/convex.config.d.ts","default":"./dist/component/convex.config.js"},"./_generated/component":{"types":"./dist/component/_generated/component.d.ts"},"./_generated/component.js":{"types":"./dist/component/_generated/component.d.ts"}},"gitHead":"30f12599a27f1d115c3a43c0f239526a95619814","scripts":{"all":"run-p -r dev:* test:watch","dev":"run-p -r dev:*","lint":"eslint .","test":"vitest run --typecheck","alpha":"npm version prerelease --preid alpha && npm publish --tag alpha && git push --follow-tags","build":"tsc --project ./tsconfig.build.json","predev":"path-exists .env.local dist || (npm run build && convex dev --once)","release":"npm version patch && npm publish && git push --follow-tags","version":"vim -c 'normal o' -c 'normal o## '$npm_package_version CHANGELOG.md && prettier -w CHANGELOG.md && git add CHANGELOG.md","dev:build":"chokidar \"tsconfig*.json\" \"src/**/*.ts\" -i \"**/*.test.ts\" -c \"npm run build:codegen\" --initial","typecheck":"tsc --noEmit && tsc -p example && tsc -p example/convex","preversion":"npm ci && npm run build:clean && run-p test lint typecheck","test:debug":"vitest --inspect-brk --no-file-parallelism","test:watch":"vitest --typecheck --clearScreen false","build:clean":"npx rimraf dist *.tsbuildinfo && npm run build:codegen","dev:backend":"convex dev --typecheck-components","webhook:all":"tsx scripts/test-garmin-webhooks.ts all _","dev:frontend":"cd example && vite --clearScreen false","webhook:ping":"tsx scripts/test-garmin-webhooks.ts ping","webhook:push":"tsx scripts/test-garmin-webhooks.ts push","build:codegen":"npx convex codegen --component-dir ./src/component && npm run build","test:coverage":"vitest run --coverage --coverage.reporter=text","prepublishOnly":"npm whoami || npm login","generate:garmin":"openapi-ts","generate:strava":"openapi-ts","webhook:backfill":"tsx scripts/test-garmin-webhooks.ts backfill"},"_npmUser":{"name":"maxime-ns","email":"maxime.gey@nativesquare.fr"},"repository":{"url":"git+https://github.com/NativeSquare/soma.git","type":"git"},"_npmVersion":"11.4.2","description":"A Convex component that normalizes health and fitness data from multiple wearable providers into a single, consistent schema.","directories":{},"_nodeVersion":"23.3.0","dependencies":{"zod":"^4.3.6"},"_hasShrinkwrap":false,"devDependencies":{"vite":"7.3.1","react":"^19.2.4","convex":"1.31.7","eslint":"9.39.2","vitest":"4.0.18","globals":"^17.3.0","prettier":"3.8.1","react-dom":"^19.2.4","@eslint/js":"9.39.2","pkg-pr-new":"^0.0.63","typescript":"5.9.3","@types/node":"^24.10.11","convex-test":"0.0.41","@types/react":"^19.2.13","chokidar-cli":"3.0.0","npm-run-all2":"8.0.4","path-exists-cli":"2.0.0","@edge-runtime/vm":"^5.0.0","@eslint/eslintrc":"^3.3.3","@types/react-dom":"^19.2.3","typescript-eslint":"8.54.0","openapi-typescript":"^7.13.0","@hey-api/openapi-ts":"^0.94.5","eslint-plugin-react":"^7.37.5","@vitejs/plugin-react":"^5.1.3","@convex-dev/eslint-plugin":"^1.1.1","eslint-plugin-react-hooks":"^7.0.1","eslint-plugin-react-refresh":"^0.5.0"},"peerDependencies":{"react":"^18.3.1 || ^19.0.0","convex":"^1.31.7"},"_npmOperationalInternal":{"tmp":"tmp/soma_0.16.2_1776589818404_0.6130874169792531","host":"s3://npm-registry-packages-npm-production"}},"0.16.3":{"name":"@nativesquare/soma","version":"0.16.3","keywords":["convex","component"],"license":"Apache-2.0","_id":"@nativesquare/soma@0.16.3","maintainers":[{"name":"maxime-ns","email":"maxime.gey@nativesquare.fr"}],"homepage":"https://github.com/NativeSquare/soma#readme","bugs":{"url":"https://github.com/NativeSquare/soma/issues"},"dist":{"shasum":"c37543273df8346f19bfe52be6d2a72de7a3f2cc","tarball":"https://registry.npmjs.org/@nativesquare/soma/-/soma-0.16.3.tgz","fileCount":742,"integrity":"sha512-vgSCoimuXEBp8Jiut+HDfVa7RsFj3JER2PwTBpHKOKB4z45t7efIuj8fO4HUshFCcgcU36LOq9JQJLqISBPj8w==","signatures":[{"sig":"MEUCIFIwt5nLbPexJ12/oG+BwMB/ZNoCR0xNa+8+TOkmtz+cAiEA2ynXc0aPX19yqFXtuSRRUEer3uXRksX7kxOHrlFIVSM=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":5363090},"pnpm":{"onlyBuiltDependencies":["esbuild","@tailwindcss/oxide"]},"type":"module","types":"./dist/client/index.d.ts","module":"./dist/client/index.js","exports":{".":{"types":"./dist/client/index.d.ts","default":"./dist/client/index.js"},"./test":"./src/test.ts","./react":{"types":"./dist/react/index.d.ts","default":"./dist/react/index.js"},"./healthkit":{"types":"./dist/component/healthkit/index.d.ts","default":"./dist/component/healthkit/index.js"},"./validators":{"types":"./dist/validators.d.ts","default":"./dist/validators.js"},"./package.json":"./package.json","./convex.config":{"types":"./dist/component/convex.config.d.ts","default":"./dist/component/convex.config.js"},"./strava/client":{"types":"./dist/component/strava/client.d.ts","default":"./dist/component/strava/client.js"},"./convex.config.js":{"types":"./dist/component/convex.config.d.ts","default":"./dist/component/convex.config.js"},"./_generated/component":{"types":"./dist/component/_generated/component.d.ts"},"./_generated/component.js":{"types":"./dist/component/_generated/component.d.ts"}},"gitHead":"d0686fd6ba5e63f6e5d8cc1238b080a8cec7bb47","scripts":{"all":"run-p -r dev:* test:watch","dev":"run-p -r dev:*","lint":"eslint .","test":"vitest run --typecheck","alpha":"npm version prerelease --preid alpha && npm publish --tag alpha && git push --follow-tags","build":"tsc --project ./tsconfig.build.json","predev":"path-exists .env.local dist || (npm run build && convex dev --once)","release":"npm version patch && npm publish && git push --follow-tags","version":"vim -c 'normal o' -c 'normal o## '$npm_package_version CHANGELOG.md && prettier -w CHANGELOG.md && git add CHANGELOG.md","dev:build":"chokidar \"tsconfig*.json\" \"src/**/*.ts\" -i \"**/*.test.ts\" -c \"npm run build:codegen\" --initial","typecheck":"tsc --noEmit && tsc -p example && tsc -p example/convex","preversion":"npm ci && npm run build:clean && run-p test lint typecheck","test:debug":"vitest --inspect-brk --no-file-parallelism","test:watch":"vitest --typecheck --clearScreen false","build:clean":"npx rimraf dist *.tsbuildinfo && npm run build:codegen","dev:backend":"convex dev --typecheck-components","webhook:all":"tsx scripts/test-garmin-webhooks.ts all _","dev:frontend":"cd example && vite --clearScreen false","webhook:ping":"tsx scripts/test-garmin-webhooks.ts ping","webhook:push":"tsx scripts/test-garmin-webhooks.ts push","build:codegen":"npx convex codegen --component-dir ./src/component && npm run build","test:coverage":"vitest run --coverage --coverage.reporter=text","prepublishOnly":"npm whoami || npm login","generate:garmin":"openapi-ts","generate:strava":"openapi-ts","webhook:backfill":"tsx scripts/test-garmin-webhooks.ts backfill"},"_npmUser":{"name":"maxime-ns","email":"maxime.gey@nativesquare.fr"},"repository":{"url":"git+https://github.com/NativeSquare/soma.git","type":"git"},"_npmVersion":"11.4.2","description":"A Convex component that normalizes health and fitness data from multiple wearable providers into a single, consistent schema.","directories":{},"_nodeVersion":"23.3.0","dependencies":{"zod":"^4.3.6"},"_hasShrinkwrap":false,"devDependencies":{"vite":"7.3.1","react":"^19.2.4","convex":"1.31.7","eslint":"9.39.2","vitest":"4.0.18","globals":"^17.3.0","prettier":"3.8.1","react-dom":"^19.2.4","@eslint/js":"9.39.2","pkg-pr-new":"^0.0.63","typescript":"5.9.3","@types/node":"^24.10.11","convex-test":"0.0.41","@types/react":"^19.2.13","chokidar-cli":"3.0.0","npm-run-all2":"8.0.4","path-exists-cli":"2.0.0","@edge-runtime/vm":"^5.0.0","@eslint/eslintrc":"^3.3.3","@types/react-dom":"^19.2.3","typescript-eslint":"8.54.0","openapi-typescript":"^7.13.0","@hey-api/openapi-ts":"^0.94.5","eslint-plugin-react":"^7.37.5","@vitejs/plugin-react":"^5.1.3","@convex-dev/eslint-plugin":"^1.1.1","eslint-plugin-react-hooks":"^7.0.1","eslint-plugin-react-refresh":"^0.5.0"},"peerDependencies":{"react":"^18.3.1 || ^19.0.0","convex":"^1.31.7"},"_npmOperationalInternal":{"tmp":"tmp/soma_0.16.3_1776592161239_0.6989513207080431","host":"s3://npm-registry-packages-npm-production"}},"0.16.4":{"name":"@nativesquare/soma","version":"0.16.4","keywords":["convex","component"],"license":"Apache-2.0","_id":"@nativesquare/soma@0.16.4","maintainers":[{"name":"maxime-ns","email":"maxime.gey@nativesquare.fr"}],"homepage":"https://github.com/NativeSquare/soma#readme","bugs":{"url":"https://github.com/NativeSquare/soma/issues"},"dist":{"shasum":"5920f9270b7126cab17a8c2b26c9352c439bd5d6","tarball":"https://registry.npmjs.org/@nativesquare/soma/-/soma-0.16.4.tgz","fileCount":742,"integrity":"sha512-QL7ytkGYfdLSNeru0TvkjdjQ+A6O3bsElz5LEjFDrAVcBVMn9uTKKtj39ewjXKcb+UznpMCMaCwOA7OcL8u5Hw==","signatures":[{"sig":"MEUCIQDPQhYfiuLM7un9iDjRZ3WpHHo7SA5O8URj/L4k+iqnLQIgZm0bluB0gwDD0ZZ6afAi2nsY5QqPL9JldAtrW9MLz+8=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":5363138},"pnpm":{"onlyBuiltDependencies":["esbuild","@tailwindcss/oxide"]},"type":"module","types":"./dist/client/index.d.ts","module":"./dist/client/index.js","exports":{".":{"types":"./dist/client/index.d.ts","default":"./dist/client/index.js"},"./test":"./src/test.ts","./react":{"types":"./dist/react/index.d.ts","default":"./dist/react/index.js"},"./healthkit":{"types":"./dist/component/healthkit/index.d.ts","default":"./dist/component/healthkit/index.js"},"./validators":{"types":"./dist/validators.d.ts","default":"./dist/validators.js"},"./package.json":"./package.json","./convex.config":{"types":"./dist/component/convex.config.d.ts","default":"./dist/component/convex.config.js"},"./strava/client":{"types":"./dist/component/strava/client.d.ts","default":"./dist/component/strava/client.js"},"./convex.config.js":{"types":"./dist/component/convex.config.d.ts","default":"./dist/component/convex.config.js"},"./_generated/component":{"types":"./dist/component/_generated/component.d.ts"},"./_generated/component.js":{"types":"./dist/component/_generated/component.d.ts"}},"gitHead":"eb9374a011e6f867a0e31c607d920a715f7c3d1a","scripts":{"all":"run-p -r dev:* test:watch","dev":"run-p -r dev:*","lint":"eslint .","test":"vitest run --typecheck","alpha":"npm version prerelease --preid alpha && npm publish --tag alpha && git push --follow-tags","build":"tsc --project ./tsconfig.build.json","predev":"path-exists .env.local dist || (npm run build && convex dev --once)","release":"npm version patch && npm publish && git push --follow-tags","version":"vim -c 'normal o' -c 'normal o## '$npm_package_version CHANGELOG.md && prettier -w CHANGELOG.md && git add CHANGELOG.md","dev:build":"chokidar \"tsconfig*.json\" \"src/**/*.ts\" -i \"**/*.test.ts\" -c \"npm run build:codegen\" --initial","typecheck":"tsc --noEmit && tsc -p example && tsc -p example/convex","preversion":"npm ci && npm run build:clean && run-p test lint typecheck","test:debug":"vitest --inspect-brk --no-file-parallelism","test:watch":"vitest --typecheck --clearScreen false","build:clean":"npx rimraf dist *.tsbuildinfo && npm run build:codegen","dev:backend":"convex dev --typecheck-components","webhook:all":"tsx scripts/test-garmin-webhooks.ts all _","dev:frontend":"cd example && vite --clearScreen false","webhook:ping":"tsx scripts/test-garmin-webhooks.ts ping","webhook:push":"tsx scripts/test-garmin-webhooks.ts push","build:codegen":"npx convex codegen --component-dir ./src/component && npm run build","test:coverage":"vitest run --coverage --coverage.reporter=text","prepublishOnly":"npm whoami || npm login","generate:garmin":"openapi-ts","generate:strava":"openapi-ts","webhook:backfill":"tsx scripts/test-garmin-webhooks.ts backfill"},"_npmUser":{"name":"maxime-ns","email":"maxime.gey@nativesquare.fr"},"repository":{"url":"git+https://github.com/NativeSquare/soma.git","type":"git"},"_npmVersion":"11.4.2","description":"A Convex component that normalizes health and fitness data from multiple wearable providers into a single, consistent schema.","directories":{},"_nodeVersion":"23.3.0","dependencies":{"zod":"^4.3.6"},"_hasShrinkwrap":false,"devDependencies":{"vite":"7.3.1","react":"^19.2.4","convex":"1.31.7","eslint":"9.39.2","vitest":"4.0.18","globals":"^17.3.0","prettier":"3.8.1","react-dom":"^19.2.4","@eslint/js":"9.39.2","pkg-pr-new":"^0.0.63","typescript":"5.9.3","@types/node":"^24.10.11","convex-test":"0.0.41","@types/react":"^19.2.13","chokidar-cli":"3.0.0","npm-run-all2":"8.0.4","path-exists-cli":"2.0.0","@edge-runtime/vm":"^5.0.0","@eslint/eslintrc":"^3.3.3","@types/react-dom":"^19.2.3","typescript-eslint":"8.54.0","openapi-typescript":"^7.13.0","@hey-api/openapi-ts":"^0.94.5","eslint-plugin-react":"^7.37.5","@vitejs/plugin-react":"^5.1.3","@convex-dev/eslint-plugin":"^1.1.1","eslint-plugin-react-hooks":"^7.0.1","eslint-plugin-react-refresh":"^0.5.0"},"peerDependencies":{"react":"^18.3.1 || ^19.0.0","convex":"^1.31.7"},"_npmOperationalInternal":{"tmp":"tmp/soma_0.16.4_1776598370783_0.11520632429576327","host":"s3://npm-registry-packages-npm-production"}},"0.16.5":{"name":"@nativesquare/soma","version":"0.16.5","keywords":["convex","component"],"license":"Apache-2.0","_id":"@nativesquare/soma@0.16.5","maintainers":[{"name":"maxime-ns","email":"maxime.gey@nativesquare.fr"}],"homepage":"https://github.com/NativeSquare/soma#readme","bugs":{"url":"https://github.com/NativeSquare/soma/issues"},"dist":{"shasum":"90905debdd0954b8de1019ea9336de1870ec99db","tarball":"https://registry.npmjs.org/@nativesquare/soma/-/soma-0.16.5.tgz","fileCount":742,"integrity":"sha512-kHkXdXb8p6tx6+e/si5LW8sz9cE9I6/YVZ8K5v472bXhPX/PXXNJvGahBpqXheui2KQSSHoDWRhgi3RfR1qwPw==","signatures":[{"sig":"MEYCIQD2r8KdxHORj7Ki8e3Rb4LqhZxk40LLGghFrvx2rABR8QIhALkIgUJEGi9ZhojCxaYuNarUlxkP65ZEU01zNqGsnCVk","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":5421337},"pnpm":{"onlyBuiltDependencies":["esbuild","@tailwindcss/oxide"]},"type":"module","types":"./dist/client/index.d.ts","module":"./dist/client/index.js","exports":{".":{"types":"./dist/client/index.d.ts","default":"./dist/client/index.js"},"./test":"./src/test.ts","./react":{"types":"./dist/react/index.d.ts","default":"./dist/react/index.js"},"./healthkit":{"types":"./dist/component/healthkit/index.d.ts","default":"./dist/component/healthkit/index.js"},"./validators":{"types":"./dist/validators.d.ts","default":"./dist/validators.js"},"./package.json":"./package.json","./convex.config":{"types":"./dist/component/convex.config.d.ts","default":"./dist/component/convex.config.js"},"./strava/client":{"types":"./dist/component/strava/client.d.ts","default":"./dist/component/strava/client.js"},"./convex.config.js":{"types":"./dist/component/convex.config.d.ts","default":"./dist/component/convex.config.js"},"./_generated/component":{"types":"./dist/component/_generated/component.d.ts"},"./_generated/component.js":{"types":"./dist/component/_generated/component.d.ts"}},"gitHead":"eb9374a011e6f867a0e31c607d920a715f7c3d1a","scripts":{"all":"run-p -r dev:* test:watch","dev":"run-p -r dev:*","lint":"eslint .","test":"vitest run --typecheck","alpha":"npm version prerelease --preid alpha && npm publish --tag alpha && git push --follow-tags","build":"tsc --project ./tsconfig.build.json","predev":"path-exists .env.local dist || (npm run build && convex dev --once)","release":"npm version patch && npm publish && git push --follow-tags","version":"vim -c 'normal o' -c 'normal o## '$npm_package_version CHANGELOG.md && prettier -w CHANGELOG.md && git add CHANGELOG.md","dev:build":"chokidar \"tsconfig*.json\" \"src/**/*.ts\" -i \"**/*.test.ts\" -c \"npm run build:codegen\" --initial","typecheck":"tsc --noEmit && tsc -p example && tsc -p example/convex","preversion":"npm ci && npm run build:clean && run-p test lint typecheck","test:debug":"vitest --inspect-brk --no-file-parallelism","test:watch":"vitest --typecheck --clearScreen false","build:clean":"npx rimraf dist *.tsbuildinfo && npm run build:codegen","dev:backend":"convex dev --typecheck-components","webhook:all":"tsx scripts/test-garmin-webhooks.ts all _","dev:frontend":"cd example && vite --clearScreen false","webhook:ping":"tsx scripts/test-garmin-webhooks.ts ping","webhook:push":"tsx scripts/test-garmin-webhooks.ts push","build:codegen":"npx convex codegen --component-dir ./src/component && npm run build","test:coverage":"vitest run --coverage --coverage.reporter=text","prepublishOnly":"npm whoami || npm login","generate:garmin":"openapi-ts","generate:strava":"openapi-ts","webhook:backfill":"tsx scripts/test-garmin-webhooks.ts backfill"},"_npmUser":{"name":"maxime-ns","email":"maxime.gey@nativesquare.fr"},"repository":{"url":"git+https://github.com/NativeSquare/soma.git","type":"git"},"_npmVersion":"11.4.2","description":"A Convex component that normalizes health and fitness data from multiple wearable providers into a single, consistent schema.","directories":{},"_nodeVersion":"23.3.0","dependencies":{"zod":"^4.3.6"},"_hasShrinkwrap":false,"devDependencies":{"vite":"7.3.1","react":"^19.2.4","convex":"1.31.7","eslint":"9.39.2","vitest":"4.0.18","globals":"^17.3.0","prettier":"3.8.1","react-dom":"^19.2.4","@eslint/js":"9.39.2","pkg-pr-new":"^0.0.63","typescript":"5.9.3","@types/node":"^24.10.11","convex-test":"0.0.41","@types/react":"^19.2.13","chokidar-cli":"3.0.0","npm-run-all2":"8.0.4","path-exists-cli":"2.0.0","@edge-runtime/vm":"^5.0.0","@eslint/eslintrc":"^3.3.3","@types/react-dom":"^19.2.3","typescript-eslint":"8.54.0","openapi-typescript":"^7.13.0","@hey-api/openapi-ts":"^0.94.5","eslint-plugin-react":"^7.37.5","@vitejs/plugin-react":"^5.1.3","@convex-dev/eslint-plugin":"^1.1.1","eslint-plugin-react-hooks":"^7.0.1","eslint-plugin-react-refresh":"^0.5.0"},"peerDependencies":{"react":"^18.3.1 || ^19.0.0","convex":"^1.31.7"},"_npmOperationalInternal":{"tmp":"tmp/soma_0.16.5_1776602399797_0.7335130106714862","host":"s3://npm-registry-packages-npm-production"}},"0.16.6":{"name":"@nativesquare/soma","version":"0.16.6","keywords":["convex","component"],"license":"Apache-2.0","_id":"@nativesquare/soma@0.16.6","maintainers":[{"name":"maxime-ns","email":"maxime.gey@nativesquare.fr"}],"homepage":"https://github.com/NativeSquare/soma#readme","bugs":{"url":"https://github.com/NativeSquare/soma/issues"},"dist":{"shasum":"903efa53bd8f4d7724e182afb69ec4c40773e1b6","tarball":"https://registry.npmjs.org/@nativesquare/soma/-/soma-0.16.6.tgz","fileCount":747,"integrity":"sha512-lV7lQ7wdkwfBlLWxhflVBAIHHxFCjfa/Nak99tD+0dhIIsfTGbqU/2IEdNpR3S8q5QP7OD8B6WR1mE7PnVIVOw==","signatures":[{"sig":"MEYCIQDackgt5QlKa5OC/sVZvWOkhl4GDFkqi+ZXUo1NanRX+gIhAI87NTALoz2wEcunHmO0u7M0uuobIrfOLZjdAUxCPbP9","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":5433219},"pnpm":{"onlyBuiltDependencies":["esbuild","@tailwindcss/oxide"]},"type":"module","types":"./dist/client/index.d.ts","module":"./dist/client/index.js","exports":{".":{"types":"./dist/client/index.d.ts","default":"./dist/client/index.js"},"./test":"./src/test.ts","./react":{"types":"./dist/react/index.d.ts","default":"./dist/react/index.js"},"./healthkit":{"types":"./dist/component/healthkit/index.d.ts","default":"./dist/component/healthkit/index.js"},"./validators":{"types":"./dist/validators.d.ts","default":"./dist/validators.js"},"./package.json":"./package.json","./convex.config":{"types":"./dist/component/convex.config.d.ts","default":"./dist/component/convex.config.js"},"./strava/client":{"types":"./dist/component/strava/client.d.ts","default":"./dist/component/strava/client.js"},"./convex.config.js":{"types":"./dist/component/convex.config.d.ts","default":"./dist/component/convex.config.js"},"./_generated/component":{"types":"./dist/component/_generated/component.d.ts"},"./_generated/component.js":{"types":"./dist/component/_generated/component.d.ts"}},"gitHead":"966b957f06b6e158fb84890362f8d7790de1cae1","scripts":{"all":"run-p -r dev:* test:watch","dev":"run-p -r dev:*","lint":"eslint .","test":"vitest run --typecheck","alpha":"npm version prerelease --preid alpha && npm publish --tag alpha && git push --follow-tags","build":"tsc --project ./tsconfig.build.json","predev":"path-exists .env.local dist || (npm run build && convex dev --once)","release":"npm version patch && npm publish && git push --follow-tags","version":"vim -c 'normal o' -c 'normal o## '$npm_package_version CHANGELOG.md && prettier -w CHANGELOG.md && git add CHANGELOG.md","dev:build":"chokidar \"tsconfig*.json\" \"src/**/*.ts\" -i \"**/*.test.ts\" -c \"npm run build:codegen\" --initial","typecheck":"tsc --noEmit && tsc -p example && tsc -p example/convex","preversion":"npm ci && npm run build:clean && run-p test lint typecheck","test:debug":"vitest --inspect-brk --no-file-parallelism","test:watch":"vitest --typecheck --clearScreen false","build:clean":"npx rimraf dist *.tsbuildinfo && npm run build:codegen","dev:backend":"convex dev --typecheck-components","webhook:all":"tsx scripts/test-garmin-webhooks.ts all _","dev:frontend":"cd example && vite --clearScreen false","webhook:ping":"tsx scripts/test-garmin-webhooks.ts ping","webhook:push":"tsx scripts/test-garmin-webhooks.ts push","build:codegen":"npx convex codegen --component-dir ./src/component && npm run build","test:coverage":"vitest run --coverage --coverage.reporter=text","prepublishOnly":"npm whoami || npm login","generate:garmin":"openapi-ts","generate:strava":"openapi-ts","webhook:backfill":"tsx scripts/test-garmin-webhooks.ts backfill"},"_npmUser":{"name":"maxime-ns","email":"maxime.gey@nativesquare.fr"},"repository":{"url":"git+https://github.com/NativeSquare/soma.git","type":"git"},"_npmVersion":"11.4.2","description":"A Convex component that normalizes health and fitness data from multiple wearable providers into a single, consistent schema.","directories":{},"_nodeVersion":"23.3.0","dependencies":{"zod":"^4.3.6"},"_hasShrinkwrap":false,"devDependencies":{"vite":"7.3.1","react":"^19.2.4","convex":"1.31.7","eslint":"9.39.2","vitest":"4.0.18","globals":"^17.3.0","prettier":"3.8.1","react-dom":"^19.2.4","@eslint/js":"9.39.2","pkg-pr-new":"^0.0.63","typescript":"5.9.3","@types/node":"^24.10.11","convex-test":"0.0.41","@types/react":"^19.2.13","chokidar-cli":"3.0.0","npm-run-all2":"8.0.4","path-exists-cli":"2.0.0","@edge-runtime/vm":"^5.0.0","@eslint/eslintrc":"^3.3.3","@types/react-dom":"^19.2.3","typescript-eslint":"8.54.0","openapi-typescript":"^7.13.0","@hey-api/openapi-ts":"^0.94.5","eslint-plugin-react":"^7.37.5","@vitejs/plugin-react":"^5.1.3","@convex-dev/eslint-plugin":"^1.1.1","eslint-plugin-react-hooks":"^7.0.1","eslint-plugin-react-refresh":"^0.5.0"},"peerDependencies":{"react":"^18.3.1 || ^19.0.0","convex":"^1.31.7"},"_npmOperationalInternal":{"tmp":"tmp/soma_0.16.6_1776619085117_0.7744662262185524","host":"s3://npm-registry-packages-npm-production"}},"0.16.7":{"name":"@nativesquare/soma","version":"0.16.7","keywords":["convex","component"],"license":"Apache-2.0","_id":"@nativesquare/soma@0.16.7","maintainers":[{"name":"maxime-ns","email":"maxime.gey@nativesquare.fr"}],"homepage":"https://github.com/NativeSquare/soma#readme","bugs":{"url":"https://github.com/NativeSquare/soma/issues"},"dist":{"shasum":"a1ae5fccd8a3c964798907e18e819d49bf27dba5","tarball":"https://registry.npmjs.org/@nativesquare/soma/-/soma-0.16.7.tgz","fileCount":747,"integrity":"sha512-EyUqK6HoK/J4dXOkUaQtLWLpKU93a1RzxOzQIV03LNDgEKsLua/IqBFcAveywg1UMKHOOlItzLQlXD3cEA7ViQ==","signatures":[{"sig":"MEUCIQCng0fxkI/ib+KU6YtyjtfBtwp712lNN3xuY8k7KS/GOAIgNzH5geELZ70S/e13gl6fZvQyk7epj7Jbg8DIU/2qWKQ=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":5440316},"pnpm":{"onlyBuiltDependencies":["esbuild","@tailwindcss/oxide"]},"type":"module","types":"./dist/client/index.d.ts","module":"./dist/client/index.js","exports":{".":{"types":"./dist/client/index.d.ts","default":"./dist/client/index.js"},"./test":"./src/test.ts","./react":{"types":"./dist/react/index.d.ts","default":"./dist/react/index.js"},"./healthkit":{"types":"./dist/component/healthkit/index.d.ts","default":"./dist/component/healthkit/index.js"},"./validators":{"types":"./dist/validators.d.ts","default":"./dist/validators.js"},"./package.json":"./package.json","./convex.config":{"types":"./dist/component/convex.config.d.ts","default":"./dist/component/convex.config.js"},"./strava/client":{"types":"./dist/component/strava/client.d.ts","default":"./dist/component/strava/client.js"},"./convex.config.js":{"types":"./dist/component/convex.config.d.ts","default":"./dist/component/convex.config.js"},"./_generated/component":{"types":"./dist/component/_generated/component.d.ts"},"./_generated/component.js":{"types":"./dist/component/_generated/component.d.ts"}},"gitHead":"966b957f06b6e158fb84890362f8d7790de1cae1","scripts":{"all":"run-p -r dev:* test:watch","dev":"run-p -r dev:*","lint":"eslint .","test":"vitest run --typecheck","alpha":"npm version prerelease --preid alpha && npm publish --tag alpha && git push --follow-tags","build":"tsc --project ./tsconfig.build.json","predev":"path-exists .env.local dist || (npm run build && convex dev --once)","release":"npm version patch && npm publish && git push --follow-tags","version":"vim -c 'normal o' -c 'normal o## '$npm_package_version CHANGELOG.md && prettier -w CHANGELOG.md && git add CHANGELOG.md","dev:build":"chokidar \"tsconfig*.json\" \"src/**/*.ts\" -i \"**/*.test.ts\" -c \"npm run build:codegen\" --initial","typecheck":"tsc --noEmit && tsc -p example && tsc -p example/convex","preversion":"npm ci && npm run build:clean && run-p test lint typecheck","test:debug":"vitest --inspect-brk --no-file-parallelism","test:watch":"vitest --typecheck --clearScreen false","build:clean":"npx rimraf dist *.tsbuildinfo && npm run build:codegen","dev:backend":"convex dev --typecheck-components","webhook:all":"tsx scripts/test-garmin-webhooks.ts all _","dev:frontend":"cd example && vite --clearScreen false","webhook:ping":"tsx scripts/test-garmin-webhooks.ts ping","webhook:push":"tsx scripts/test-garmin-webhooks.ts push","build:codegen":"npx convex codegen --component-dir ./src/component && npm run build","test:coverage":"vitest run --coverage --coverage.reporter=text","prepublishOnly":"npm whoami || npm login","generate:garmin":"openapi-ts","generate:strava":"openapi-ts","webhook:backfill":"tsx scripts/test-garmin-webhooks.ts backfill"},"_npmUser":{"name":"maxime-ns","email":"maxime.gey@nativesquare.fr"},"repository":{"url":"git+https://github.com/NativeSquare/soma.git","type":"git"},"_npmVersion":"11.4.2","description":"A Convex component that normalizes health and fitness data from multiple wearable providers into a single, consistent schema.","directories":{},"_nodeVersion":"23.3.0","dependencies":{"zod":"^4.3.6"},"_hasShrinkwrap":false,"devDependencies":{"vite":"7.3.1","react":"^19.2.4","convex":"1.31.7","eslint":"9.39.2","vitest":"4.0.18","globals":"^17.3.0","prettier":"3.8.1","react-dom":"^19.2.4","@eslint/js":"9.39.2","pkg-pr-new":"^0.0.63","typescript":"5.9.3","@types/node":"^24.10.11","convex-test":"0.0.41","@types/react":"^19.2.13","chokidar-cli":"3.0.0","npm-run-all2":"8.0.4","path-exists-cli":"2.0.0","@edge-runtime/vm":"^5.0.0","@eslint/eslintrc":"^3.3.3","@types/react-dom":"^19.2.3","typescript-eslint":"8.54.0","openapi-typescript":"^7.13.0","@hey-api/openapi-ts":"^0.94.5","eslint-plugin-react":"^7.37.5","@vitejs/plugin-react":"^5.1.3","@convex-dev/eslint-plugin":"^1.1.1","eslint-plugin-react-hooks":"^7.0.1","eslint-plugin-react-refresh":"^0.5.0"},"peerDependencies":{"react":"^18.3.1 || ^19.0.0","convex":"^1.31.7"},"_npmOperationalInternal":{"tmp":"tmp/soma_0.16.7_1776694377121_0.6617067056954129","host":"s3://npm-registry-packages-npm-production"}},"0.16.8":{"name":"@nativesquare/soma","version":"0.16.8","keywords":["convex","component"],"license":"Apache-2.0","_id":"@nativesquare/soma@0.16.8","maintainers":[{"name":"maxime-ns","email":"maxime.gey@nativesquare.fr"}],"homepage":"https://github.com/NativeSquare/soma#readme","bugs":{"url":"https://github.com/NativeSquare/soma/issues"},"dist":{"shasum":"78540e79804952d22e91f7e9d3f242b6aec1e1ac","tarball":"https://registry.npmjs.org/@nativesquare/soma/-/soma-0.16.8.tgz","fileCount":747,"integrity":"sha512-hjhfo7veWGbRmBeGf5i5mJ/ZFayzNnMHQknW7zXfZiQHP4bcYIsQKnMmu3r9ahjn3F1xK+KT4g4XmGTxslP5Uw==","signatures":[{"sig":"MEYCIQCnivpVOkIziCfIARvFzRzJ0isJAd9iE5xShiS5oYDWQQIhAOc3k5bL9itYzA6Q5INGvqaxVLrG23FsGQ96uL5OAm9n","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":5442797},"pnpm":{"onlyBuiltDependencies":["esbuild","@tailwindcss/oxide"]},"type":"module","types":"./dist/client/index.d.ts","module":"./dist/client/index.js","exports":{".":{"types":"./dist/client/index.d.ts","default":"./dist/client/index.js"},"./test":"./src/test.ts","./react":{"types":"./dist/react/index.d.ts","default":"./dist/react/index.js"},"./healthkit":{"types":"./dist/component/healthkit/index.d.ts","default":"./dist/component/healthkit/index.js"},"./validators":{"types":"./dist/validators.d.ts","default":"./dist/validators.js"},"./package.json":"./package.json","./convex.config":{"types":"./dist/component/convex.config.d.ts","default":"./dist/component/convex.config.js"},"./strava/client":{"types":"./dist/component/strava/client.d.ts","default":"./dist/component/strava/client.js"},"./convex.config.js":{"types":"./dist/component/convex.config.d.ts","default":"./dist/component/convex.config.js"},"./_generated/component":{"types":"./dist/component/_generated/component.d.ts"},"./_generated/component.js":{"types":"./dist/component/_generated/component.d.ts"}},"gitHead":"62c69c63fd439844324e18e3e587f9a9e5f95c86","scripts":{"all":"run-p -r dev:* test:watch","dev":"run-p -r dev:*","lint":"eslint .","test":"vitest run --typecheck","alpha":"npm version prerelease --preid alpha && npm publish --tag alpha && git push --follow-tags","build":"tsc --project ./tsconfig.build.json","predev":"path-exists .env.local dist || (npm run build && convex dev --once)","release":"npm version patch && npm publish && git push --follow-tags","version":"vim -c 'normal o' -c 'normal o## '$npm_package_version CHANGELOG.md && prettier -w CHANGELOG.md && git add CHANGELOG.md","dev:build":"chokidar \"tsconfig*.json\" \"src/**/*.ts\" -i \"**/*.test.ts\" -c \"npm run build:codegen\" --initial","typecheck":"tsc --noEmit && tsc -p example && tsc -p example/convex","preversion":"npm ci && npm run build:clean && run-p test lint typecheck","test:debug":"vitest --inspect-brk --no-file-parallelism","test:watch":"vitest --typecheck --clearScreen false","build:clean":"npx rimraf dist *.tsbuildinfo && npm run build:codegen","dev:backend":"convex dev --typecheck-components","webhook:all":"tsx scripts/test-garmin-webhooks.ts all _","dev:frontend":"cd example && vite --clearScreen false","webhook:ping":"tsx scripts/test-garmin-webhooks.ts ping","webhook:push":"tsx scripts/test-garmin-webhooks.ts push","build:codegen":"npx convex codegen --component-dir ./src/component && npm run build","test:coverage":"vitest run --coverage --coverage.reporter=text","prepublishOnly":"npm whoami || npm login","generate:garmin":"openapi-ts","generate:strava":"openapi-ts","webhook:backfill":"tsx scripts/test-garmin-webhooks.ts backfill"},"_npmUser":{"name":"maxime-ns","email":"maxime.gey@nativesquare.fr"},"repository":{"url":"git+https://github.com/NativeSquare/soma.git","type":"git"},"_npmVersion":"11.4.2","description":"A Convex component that normalizes health and fitness data from multiple wearable providers into a single, consistent schema.","directories":{},"_nodeVersion":"23.3.0","dependencies":{"zod":"^4.3.6"},"_hasShrinkwrap":false,"devDependencies":{"vite":"7.3.1","react":"^19.2.4","convex":"1.31.7","eslint":"9.39.2","vitest":"4.0.18","globals":"^17.3.0","prettier":"3.8.1","react-dom":"^19.2.4","@eslint/js":"9.39.2","pkg-pr-new":"^0.0.63","typescript":"5.9.3","@types/node":"^24.10.11","convex-test":"0.0.41","@types/react":"^19.2.13","chokidar-cli":"3.0.0","npm-run-all2":"8.0.4","path-exists-cli":"2.0.0","@edge-runtime/vm":"^5.0.0","@eslint/eslintrc":"^3.3.3","@types/react-dom":"^19.2.3","typescript-eslint":"8.54.0","openapi-typescript":"^7.13.0","@hey-api/openapi-ts":"^0.94.5","eslint-plugin-react":"^7.37.5","@vitejs/plugin-react":"^5.1.3","@convex-dev/eslint-plugin":"^1.1.1","eslint-plugin-react-hooks":"^7.0.1","eslint-plugin-react-refresh":"^0.5.0"},"peerDependencies":{"react":"^18.3.1 || ^19.0.0","convex":"^1.31.7"},"_npmOperationalInternal":{"tmp":"tmp/soma_0.16.8_1776695233347_0.9317872919341024","host":"s3://npm-registry-packages-npm-production"}},"0.16.9":{"name":"@nativesquare/soma","version":"0.16.9","keywords":["convex","component"],"license":"Apache-2.0","_id":"@nativesquare/soma@0.16.9","maintainers":[{"name":"maxime-ns","email":"maxime.gey@nativesquare.fr"}],"homepage":"https://github.com/NativeSquare/soma#readme","bugs":{"url":"https://github.com/NativeSquare/soma/issues"},"dist":{"shasum":"a5e53a3f89f7437851c8dfdbf5844c6dbb974cb5","tarball":"https://registry.npmjs.org/@nativesquare/soma/-/soma-0.16.9.tgz","fileCount":747,"integrity":"sha512-nmnPzCD+GvwTWEHAz3zZJlYwtwDGrqD6Plk2xQTOVmxsS1rLo3TBetoNl0zMoq8onLYKIQok0wSc0DCpzJP/mw==","signatures":[{"sig":"MEYCIQDlzdH2Dke35ofA7FOLlubK3dyuIRJMy/7CK5Jd4atF8QIhAM0peXxvHpa8SeXBy8MxL/njDixoFsNjghPOh3ucndk2","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":5442915},"pnpm":{"onlyBuiltDependencies":["esbuild","@tailwindcss/oxide"]},"type":"module","types":"./dist/client/index.d.ts","module":"./dist/client/index.js","exports":{".":{"types":"./dist/client/index.d.ts","default":"./dist/client/index.js"},"./test":"./src/test.ts","./react":{"types":"./dist/react/index.d.ts","default":"./dist/react/index.js"},"./healthkit":{"types":"./dist/component/healthkit/index.d.ts","default":"./dist/component/healthkit/index.js"},"./validators":{"types":"./dist/validators.d.ts","default":"./dist/validators.js"},"./package.json":"./package.json","./convex.config":{"types":"./dist/component/convex.config.d.ts","default":"./dist/component/convex.config.js"},"./strava/client":{"types":"./dist/component/strava/client.d.ts","default":"./dist/component/strava/client.js"},"./convex.config.js":{"types":"./dist/component/convex.config.d.ts","default":"./dist/component/convex.config.js"},"./_generated/component":{"types":"./dist/component/_generated/component.d.ts"},"./_generated/component.js":{"types":"./dist/component/_generated/component.d.ts"}},"gitHead":"62c69c63fd439844324e18e3e587f9a9e5f95c86","scripts":{"all":"run-p -r dev:* test:watch","dev":"run-p -r dev:*","lint":"eslint .","test":"vitest run --typecheck","alpha":"npm version prerelease --preid alpha && npm publish --tag alpha && git push --follow-tags","build":"tsc --project ./tsconfig.build.json","predev":"path-exists .env.local dist || (npm run build && convex dev --once)","release":"npm version patch && npm publish && git push --follow-tags","version":"vim -c 'normal o' -c 'normal o## '$npm_package_version CHANGELOG.md && prettier -w CHANGELOG.md && git add CHANGELOG.md","dev:build":"chokidar \"tsconfig*.json\" \"src/**/*.ts\" -i \"**/*.test.ts\" -c \"npm run build:codegen\" --initial","typecheck":"tsc --noEmit && tsc -p example && tsc -p example/convex","preversion":"npm ci && npm run build:clean && run-p test lint typecheck","test:debug":"vitest --inspect-brk --no-file-parallelism","test:watch":"vitest --typecheck --clearScreen false","build:clean":"npx rimraf dist *.tsbuildinfo && npm run build:codegen","dev:backend":"convex dev --typecheck-components","webhook:all":"tsx scripts/test-garmin-webhooks.ts all _","dev:frontend":"cd example && vite --clearScreen false","webhook:ping":"tsx scripts/test-garmin-webhooks.ts ping","webhook:push":"tsx scripts/test-garmin-webhooks.ts push","build:codegen":"npx convex codegen --component-dir ./src/component && npm run build","test:coverage":"vitest run --coverage --coverage.reporter=text","prepublishOnly":"npm whoami || npm login","generate:garmin":"openapi-ts","generate:strava":"openapi-ts","webhook:backfill":"tsx scripts/test-garmin-webhooks.ts backfill"},"_npmUser":{"name":"maxime-ns","email":"maxime.gey@nativesquare.fr"},"repository":{"url":"git+https://github.com/NativeSquare/soma.git","type":"git"},"_npmVersion":"11.4.2","description":"A Convex component that normalizes health and fitness data from multiple wearable providers into a single, consistent schema.","directories":{},"_nodeVersion":"23.3.0","dependencies":{"zod":"^4.3.6"},"_hasShrinkwrap":false,"devDependencies":{"vite":"7.3.1","react":"^19.2.4","convex":"1.31.7","eslint":"9.39.2","vitest":"4.0.18","globals":"^17.3.0","prettier":"3.8.1","react-dom":"^19.2.4","@eslint/js":"9.39.2","pkg-pr-new":"^0.0.63","typescript":"5.9.3","@types/node":"^24.10.11","convex-test":"0.0.41","@types/react":"^19.2.13","chokidar-cli":"3.0.0","npm-run-all2":"8.0.4","path-exists-cli":"2.0.0","@edge-runtime/vm":"^5.0.0","@eslint/eslintrc":"^3.3.3","@types/react-dom":"^19.2.3","typescript-eslint":"8.54.0","openapi-typescript":"^7.13.0","@hey-api/openapi-ts":"^0.94.5","eslint-plugin-react":"^7.37.5","@vitejs/plugin-react":"^5.1.3","@convex-dev/eslint-plugin":"^1.1.1","eslint-plugin-react-hooks":"^7.0.1","eslint-plugin-react-refresh":"^0.5.0"},"peerDependencies":{"react":"^18.3.1 || ^19.0.0","convex":"^1.31.7"},"_npmOperationalInternal":{"tmp":"tmp/soma_0.16.9_1776698121789_0.8684264567653812","host":"s3://npm-registry-packages-npm-production"}},"0.17.0":{"name":"@nativesquare/soma","version":"0.17.0","keywords":["convex","component"],"license":"Apache-2.0","_id":"@nativesquare/soma@0.17.0","maintainers":[{"name":"maxime-ns","email":"maxime.gey@nativesquare.fr"}],"homepage":"https://github.com/NativeSquare/soma#readme","bugs":{"url":"https://github.com/NativeSquare/soma/issues"},"dist":{"shasum":"a73998fb0ce63583c3129fbcd7415221832ecda1","tarball":"https://registry.npmjs.org/@nativesquare/soma/-/soma-0.17.0.tgz","fileCount":747,"integrity":"sha512-bZb3C6BDH6DPHsyUkAlxJNfbYsefve90ma7n617yMTD4Sj+Ui5/zikf1ef9NDhE5JaisdKLzfDWcjlu3tz9Biw==","signatures":[{"sig":"MEUCIQCX4+N8U4Qih1BM6+JoQ84v1rDDqTPGSyqJsNF1fBRrnAIgbd4db7VkbxTPUA2tAFPIi1lGKM2/vx1BiLuBh2xTJsM=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":5469787},"pnpm":{"onlyBuiltDependencies":["esbuild","@tailwindcss/oxide"]},"type":"module","types":"./dist/client/index.d.ts","module":"./dist/client/index.js","exports":{".":{"types":"./dist/client/index.d.ts","default":"./dist/client/index.js"},"./test":"./src/test.ts","./react":{"types":"./dist/react/index.d.ts","default":"./dist/react/index.js"},"./healthkit":{"types":"./dist/component/healthkit/index.d.ts","default":"./dist/component/healthkit/index.js"},"./validators":{"types":"./dist/validators.d.ts","default":"./dist/validators.js"},"./package.json":"./package.json","./convex.config":{"types":"./dist/component/convex.config.d.ts","default":"./dist/component/convex.config.js"},"./strava/client":{"types":"./dist/component/strava/client.d.ts","default":"./dist/component/strava/client.js"},"./convex.config.js":{"types":"./dist/component/convex.config.d.ts","default":"./dist/component/convex.config.js"},"./_generated/component":{"types":"./dist/component/_generated/component.d.ts"},"./_generated/component.js":{"types":"./dist/component/_generated/component.d.ts"}},"gitHead":"b1b71fb691ea9d2d968fe2ea0a35ac912eb26bae","scripts":{"all":"run-p -r dev:* test:watch","dev":"run-p -r dev:*","lint":"eslint .","test":"vitest run --typecheck","alpha":"npm version prerelease --preid alpha && npm publish --tag alpha && git push --follow-tags","build":"tsc --project ./tsconfig.build.json","predev":"path-exists .env.local dist || (npm run build && convex dev --once)","release":"npm version patch && npm publish && git push --follow-tags","version":"vim -c 'normal o' -c 'normal o## '$npm_package_version CHANGELOG.md && prettier -w CHANGELOG.md && git add CHANGELOG.md","dev:build":"chokidar \"tsconfig*.json\" \"src/**/*.ts\" -i \"**/*.test.ts\" -c \"npm run build:codegen\" --initial","typecheck":"tsc --noEmit && tsc -p example && tsc -p example/convex","preversion":"npm ci && npm run build:clean && run-p test lint typecheck","test:debug":"vitest --inspect-brk --no-file-parallelism","test:watch":"vitest --typecheck --clearScreen false","build:clean":"npx rimraf dist *.tsbuildinfo && npm run build:codegen","dev:backend":"convex dev --typecheck-components","webhook:all":"tsx scripts/test-garmin-webhooks.ts all _","dev:frontend":"cd example && vite --clearScreen false","webhook:ping":"tsx scripts/test-garmin-webhooks.ts ping","webhook:push":"tsx scripts/test-garmin-webhooks.ts push","build:codegen":"npx convex codegen --component-dir ./src/component && npm run build","test:coverage":"vitest run --coverage --coverage.reporter=text","prepublishOnly":"npm whoami || npm login","generate:garmin":"openapi-ts","generate:strava":"openapi-ts","webhook:backfill":"tsx scripts/test-garmin-webhooks.ts backfill"},"_npmUser":{"name":"maxime-ns","email":"maxime.gey@nativesquare.fr"},"repository":{"url":"git+https://github.com/NativeSquare/soma.git","type":"git"},"_npmVersion":"11.4.2","description":"A Convex component that normalizes health and fitness data from multiple wearable providers into a single, consistent schema.","directories":{},"_nodeVersion":"23.3.0","dependencies":{"zod":"^4.3.6"},"_hasShrinkwrap":false,"devDependencies":{"vite":"7.3.1","react":"^19.2.4","convex":"1.31.7","eslint":"9.39.2","vitest":"4.0.18","globals":"^17.3.0","prettier":"3.8.1","react-dom":"^19.2.4","@eslint/js":"9.39.2","pkg-pr-new":"^0.0.63","typescript":"5.9.3","@types/node":"^24.10.11","convex-test":"0.0.41","@types/react":"^19.2.13","chokidar-cli":"3.0.0","npm-run-all2":"8.0.4","path-exists-cli":"2.0.0","@edge-runtime/vm":"^5.0.0","@eslint/eslintrc":"^3.3.3","@types/react-dom":"^19.2.3","typescript-eslint":"8.54.0","openapi-typescript":"^7.13.0","@hey-api/openapi-ts":"^0.94.5","eslint-plugin-react":"^7.37.5","@vitejs/plugin-react":"^5.1.3","@convex-dev/eslint-plugin":"^1.1.1","eslint-plugin-react-hooks":"^7.0.1","eslint-plugin-react-refresh":"^0.5.0"},"peerDependencies":{"react":"^18.3.1 || ^19.0.0","convex":"^1.31.7"},"_npmOperationalInternal":{"tmp":"tmp/soma_0.17.0_1777470607614_0.08979066198263452","host":"s3://npm-registry-packages-npm-production"}},"0.17.1":{"name":"@nativesquare/soma","version":"0.17.1","keywords":["convex","component"],"license":"Apache-2.0","_id":"@nativesquare/soma@0.17.1","maintainers":[{"name":"maxime-ns","email":"maxime.gey@nativesquare.fr"}],"homepage":"https://github.com/NativeSquare/soma#readme","bugs":{"url":"https://github.com/NativeSquare/soma/issues"},"dist":{"shasum":"c34bd5a1ca43ed20d841755719742cfba600482d","tarball":"https://registry.npmjs.org/@nativesquare/soma/-/soma-0.17.1.tgz","fileCount":747,"integrity":"sha512-BlVG5A93GzIpdiGRNgSqGMjmSrV/zV9Vm9gUOuzUknb1wlujt3MIPGUYKFFsu2s44MzEMtaE+rzZaw5J7EXHuA==","signatures":[{"sig":"MEYCIQCbFj2/1fUvQhlDL/zBTF+6vdqul/yPNmLk6yzDAX6KXwIhAILsJOg0iHIALv61RRJhWT0vaQzC6+a0E8dlxh/x6C+s","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":5469787},"pnpm":{"onlyBuiltDependencies":["esbuild","@tailwindcss/oxide"]},"type":"module","types":"./dist/client/index.d.ts","module":"./dist/client/index.js","exports":{".":{"types":"./dist/client/index.d.ts","default":"./dist/client/index.js"},"./test":"./src/test.ts","./react":{"types":"./dist/react/index.d.ts","default":"./dist/react/index.js"},"./healthkit":{"types":"./dist/component/healthkit/index.d.ts","default":"./dist/component/healthkit/index.js"},"./validators":{"types":"./dist/validators.d.ts","default":"./dist/validators.js"},"./package.json":"./package.json","./convex.config":{"types":"./dist/component/convex.config.d.ts","default":"./dist/component/convex.config.js"},"./strava/client":{"types":"./dist/component/strava/client.d.ts","default":"./dist/component/strava/client.js"},"./convex.config.js":{"types":"./dist/component/convex.config.d.ts","default":"./dist/component/convex.config.js"},"./_generated/component":{"types":"./dist/component/_generated/component.d.ts"},"./_generated/component.js":{"types":"./dist/component/_generated/component.d.ts"}},"gitHead":"b1b71fb691ea9d2d968fe2ea0a35ac912eb26bae","scripts":{"all":"run-p -r dev:* test:watch","dev":"run-p -r dev:*","lint":"eslint .","test":"vitest run --typecheck","alpha":"npm version prerelease --preid alpha && npm publish --tag alpha && git push --follow-tags","build":"tsc --project ./tsconfig.build.json","predev":"path-exists .env.local dist || (npm run build && convex dev --once)","release":"npm version patch && npm publish && git push --follow-tags","version":"vim -c 'normal o' -c 'normal o## '$npm_package_version CHANGELOG.md && prettier -w CHANGELOG.md && git add CHANGELOG.md","dev:build":"chokidar \"tsconfig*.json\" \"src/**/*.ts\" -i \"**/*.test.ts\" -c \"npm run build:codegen\" --initial","typecheck":"tsc --noEmit && tsc -p example && tsc -p example/convex","preversion":"npm ci && npm run build:clean && run-p test lint typecheck","test:debug":"vitest --inspect-brk --no-file-parallelism","test:watch":"vitest --typecheck --clearScreen false","build:clean":"npx rimraf dist *.tsbuildinfo && npm run build:codegen","dev:backend":"convex dev --typecheck-components","webhook:all":"tsx scripts/test-garmin-webhooks.ts all _","dev:frontend":"cd example && vite --clearScreen false","webhook:ping":"tsx scripts/test-garmin-webhooks.ts ping","webhook:push":"tsx scripts/test-garmin-webhooks.ts push","build:codegen":"npx convex codegen --component-dir ./src/component && npm run build","test:coverage":"vitest run --coverage --coverage.reporter=text","prepublishOnly":"npm whoami || npm login","generate:garmin":"openapi-ts","generate:strava":"openapi-ts","webhook:backfill":"tsx scripts/test-garmin-webhooks.ts backfill"},"_npmUser":{"name":"maxime-ns","email":"maxime.gey@nativesquare.fr"},"repository":{"url":"git+https://github.com/NativeSquare/soma.git","type":"git"},"_npmVersion":"11.4.2","description":"A Convex component that normalizes health and fitness data from multiple wearable providers into a single, consistent schema.","directories":{},"_nodeVersion":"23.3.0","dependencies":{"zod":"^4.3.6"},"_hasShrinkwrap":false,"devDependencies":{"vite":"7.3.1","react":"^19.2.4","convex":"1.31.7","eslint":"9.39.2","vitest":"4.0.18","globals":"^17.3.0","prettier":"3.8.1","react-dom":"^19.2.4","@eslint/js":"9.39.2","pkg-pr-new":"^0.0.63","typescript":"5.9.3","@types/node":"^24.10.11","convex-test":"0.0.41","@types/react":"^19.2.13","chokidar-cli":"3.0.0","npm-run-all2":"8.0.4","path-exists-cli":"2.0.0","@edge-runtime/vm":"^5.0.0","@eslint/eslintrc":"^3.3.3","@types/react-dom":"^19.2.3","typescript-eslint":"8.54.0","openapi-typescript":"^7.13.0","@hey-api/openapi-ts":"^0.94.5","eslint-plugin-react":"^7.37.5","@vitejs/plugin-react":"^5.1.3","@convex-dev/eslint-plugin":"^1.1.1","eslint-plugin-react-hooks":"^7.0.1","eslint-plugin-react-refresh":"^0.5.0"},"peerDependencies":{"react":"^18.3.1 || ^19.0.0","convex":"^1.31.7"},"_npmOperationalInternal":{"tmp":"tmp/soma_0.17.1_1777473896247_0.09400108365114601","host":"s3://npm-registry-packages-npm-production"}},"0.18.0":{"name":"@nativesquare/soma","version":"0.18.0","keywords":["convex","component"],"license":"Apache-2.0","_id":"@nativesquare/soma@0.18.0","maintainers":[{"name":"maxime-ns","email":"maxime.gey@nativesquare.fr"}],"homepage":"https://github.com/NativeSquare/soma#readme","bugs":{"url":"https://github.com/NativeSquare/soma/issues"},"dist":{"shasum":"859304032ff96bf79a3db5b747de607c1992fa12","tarball":"https://registry.npmjs.org/@nativesquare/soma/-/soma-0.18.0.tgz","fileCount":747,"integrity":"sha512-JwTljMe6yuMeXJSUgzW8FFMC6dN0AHTTvuKpUIDwmUm4Bi4qGdOT46dbU/fwrCqwzEN55p8ZyIF8LQM4IwciyQ==","signatures":[{"sig":"MEQCIGYyiQgDPvo2EahdozqChU9JZ9PSDRc8ZgtnxKhh4eYSAiBtwLkCtpXFLCKoDDFukhXeN5/Ws3lZDNQFbpX14vIVfA==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":5476626},"pnpm":{"onlyBuiltDependencies":["esbuild","@tailwindcss/oxide"]},"type":"module","types":"./dist/client/index.d.ts","module":"./dist/client/index.js","exports":{".":{"types":"./dist/client/index.d.ts","default":"./dist/client/index.js"},"./test":"./src/test.ts","./react":{"types":"./dist/react/index.d.ts","default":"./dist/react/index.js"},"./healthkit":{"types":"./dist/component/healthkit/index.d.ts","default":"./dist/component/healthkit/index.js"},"./validators":{"types":"./dist/validators.d.ts","default":"./dist/validators.js"},"./package.json":"./package.json","./convex.config":{"types":"./dist/component/convex.config.d.ts","default":"./dist/component/convex.config.js"},"./strava/client":{"types":"./dist/component/strava/client.d.ts","default":"./dist/component/strava/client.js"},"./convex.config.js":{"types":"./dist/component/convex.config.d.ts","default":"./dist/component/convex.config.js"},"./_generated/component":{"types":"./dist/component/_generated/component.d.ts"},"./_generated/component.js":{"types":"./dist/component/_generated/component.d.ts"}},"gitHead":"03678c6edc4b0195c5f4de703190fc7824d847ff","scripts":{"all":"run-p -r dev:* test:watch","dev":"run-p -r dev:*","lint":"eslint .","test":"vitest run --typecheck","alpha":"npm version prerelease --preid alpha && npm publish --tag alpha && git push --follow-tags","build":"tsc --project ./tsconfig.build.json","predev":"path-exists .env.local dist || (npm run build && convex dev --once)","release":"npm version patch && npm publish && git push --follow-tags","version":"vim -c 'normal o' -c 'normal o## '$npm_package_version CHANGELOG.md && prettier -w CHANGELOG.md && git add CHANGELOG.md","dev:build":"chokidar \"tsconfig*.json\" \"src/**/*.ts\" -i \"**/*.test.ts\" -c \"npm run build:codegen\" --initial","typecheck":"tsc --noEmit && tsc -p example && tsc -p example/convex","preversion":"npm ci && npm run build:clean && run-p test lint typecheck","test:debug":"vitest --inspect-brk --no-file-parallelism","test:watch":"vitest --typecheck --clearScreen false","build:clean":"npx rimraf dist *.tsbuildinfo && npm run build:codegen","dev:backend":"convex dev --typecheck-components","webhook:all":"tsx scripts/test-garmin-webhooks.ts all _","dev:frontend":"cd example && vite --clearScreen false","webhook:ping":"tsx scripts/test-garmin-webhooks.ts ping","webhook:push":"tsx scripts/test-garmin-webhooks.ts push","build:codegen":"npx convex codegen --component-dir ./src/component && npm run build","test:coverage":"vitest run --coverage --coverage.reporter=text","prepublishOnly":"npm whoami || npm login","generate:garmin":"openapi-ts","generate:strava":"openapi-ts","webhook:backfill":"tsx scripts/test-garmin-webhooks.ts backfill"},"_npmUser":{"name":"maxime-ns","email":"maxime.gey@nativesquare.fr"},"repository":{"url":"git+https://github.com/NativeSquare/soma.git","type":"git"},"_npmVersion":"11.4.2","description":"A Convex component that normalizes health and fitness data from multiple wearable providers into a single, consistent schema.","directories":{},"_nodeVersion":"23.3.0","dependencies":{"zod":"^4.3.6"},"_hasShrinkwrap":false,"devDependencies":{"vite":"7.3.1","react":"^19.2.4","convex":"1.31.7","eslint":"9.39.2","vitest":"4.0.18","globals":"^17.3.0","prettier":"3.8.1","react-dom":"^19.2.4","@eslint/js":"9.39.2","pkg-pr-new":"^0.0.63","typescript":"5.9.3","@types/node":"^24.10.11","convex-test":"0.0.41","@types/react":"^19.2.13","chokidar-cli":"3.0.0","npm-run-all2":"8.0.4","path-exists-cli":"2.0.0","@edge-runtime/vm":"^5.0.0","@eslint/eslintrc":"^3.3.3","@types/react-dom":"^19.2.3","typescript-eslint":"8.54.0","openapi-typescript":"^7.13.0","@hey-api/openapi-ts":"^0.94.5","eslint-plugin-react":"^7.37.5","@vitejs/plugin-react":"^5.1.3","@convex-dev/eslint-plugin":"^1.1.1","eslint-plugin-react-hooks":"^7.0.1","eslint-plugin-react-refresh":"^0.5.0"},"peerDependencies":{"react":"^18.3.1 || ^19.0.0","convex":"^1.31.7"},"_npmOperationalInternal":{"tmp":"tmp/soma_0.18.0_1777905449731_0.4040082648714385","host":"s3://npm-registry-packages-npm-production"}},"0.18.1":{"name":"@nativesquare/soma","description":"A Convex component that normalizes health and fitness data from multiple wearable providers into a single, consistent schema.","repository":{"type":"git","url":"git+https://github.com/NativeSquare/soma.git"},"homepage":"https://github.com/NativeSquare/soma#readme","bugs":{"url":"https://github.com/NativeSquare/soma/issues"},"version":"0.18.1","license":"Apache-2.0","keywords":["convex","component"],"type":"module","scripts":{"dev":"run-p -r dev:*","dev:backend":"convex dev --typecheck-components","dev:frontend":"cd example && vite --clearScreen false","dev:build":"chokidar \"tsconfig*.json\" \"src/**/*.ts\" -i \"**/*.test.ts\" -c \"npm run build:codegen\" --initial","predev":"path-exists .env.local dist || (npm run build && convex dev --once)","build":"tsc --project ./tsconfig.build.json","build:codegen":"npx convex codegen --component-dir ./src/component && npm run build","build:clean":"npx rimraf dist *.tsbuildinfo && npm run build:codegen","generate:garmin":"openapi-ts","generate:strava":"openapi-ts","typecheck":"tsc --noEmit && tsc -p example && tsc -p example/convex","lint":"eslint .","all":"run-p -r dev:* test:watch","test":"vitest run --typecheck","test:watch":"vitest --typecheck --clearScreen false","test:debug":"vitest --inspect-brk --no-file-parallelism","test:coverage":"vitest run --coverage --coverage.reporter=text","webhook:push":"tsx scripts/test-garmin-webhooks.ts push","webhook:ping":"tsx scripts/test-garmin-webhooks.ts ping","webhook:backfill":"tsx scripts/test-garmin-webhooks.ts backfill","webhook:all":"tsx scripts/test-garmin-webhooks.ts all _","preversion":"npm ci && npm run build:clean && run-p test lint typecheck","prepublishOnly":"npm whoami || npm login","alpha":"npm version prerelease --preid alpha && npm publish --tag alpha && git push --follow-tags","release":"npm version patch && npm publish && git push --follow-tags","version":"vim -c 'normal o' -c 'normal o## '$npm_package_version CHANGELOG.md && prettier -w CHANGELOG.md && git add CHANGELOG.md"},"exports":{"./package.json":"./package.json",".":{"types":"./dist/client/index.d.ts","default":"./dist/client/index.js"},"./react":{"types":"./dist/react/index.d.ts","default":"./dist/react/index.js"},"./healthkit":{"types":"./dist/component/healthkit/index.d.ts","default":"./dist/component/healthkit/index.js"},"./strava/client":{"types":"./dist/component/strava/client.d.ts","default":"./dist/component/strava/client.js"},"./validators":{"types":"./dist/validators.d.ts","default":"./dist/validators.js"},"./test":"./src/test.ts","./_generated/component.js":{"types":"./dist/component/_generated/component.d.ts"},"./_generated/component":{"types":"./dist/component/_generated/component.d.ts"},"./convex.config.js":{"types":"./dist/component/convex.config.d.ts","default":"./dist/component/convex.config.js"},"./convex.config":{"types":"./dist/component/convex.config.d.ts","default":"./dist/component/convex.config.js"}},"peerDependencies":{"convex":"^1.31.7","react":"^18.3.1 || ^19.0.0"},"devDependencies":{"@convex-dev/eslint-plugin":"^1.1.1","@edge-runtime/vm":"^5.0.0","@eslint/eslintrc":"^3.3.3","@eslint/js":"9.39.2","@hey-api/openapi-ts":"^0.94.5","@types/node":"^24.10.11","@types/react":"^19.2.13","@types/react-dom":"^19.2.3","@vitejs/plugin-react":"^5.1.3","chokidar-cli":"3.0.0","convex":"1.31.7","convex-test":"0.0.41","eslint":"9.39.2","eslint-plugin-react":"^7.37.5","eslint-plugin-react-hooks":"^7.0.1","eslint-plugin-react-refresh":"^0.5.0","globals":"^17.3.0","npm-run-all2":"8.0.4","openapi-typescript":"^7.13.0","path-exists-cli":"2.0.0","pkg-pr-new":"^0.0.63","prettier":"3.8.1","react":"^19.2.4","react-dom":"^19.2.4","typescript":"5.9.3","typescript-eslint":"8.54.0","vite":"7.3.1","vitest":"4.0.18"},"types":"./dist/client/index.d.ts","module":"./dist/client/index.js","pnpm":{"onlyBuiltDependencies":["esbuild","@tailwindcss/oxide"]},"dependencies":{"zod":"^4.3.6"},"_id":"@nativesquare/soma@0.18.1","gitHead":"80dc7fb5a78393b668cbcbd3bbfd113460aa7b2c","_nodeVersion":"23.3.0","_npmVersion":"11.4.2","dist":{"integrity":"sha512-PdlbP7qRkNAfpPWLN8EVD88UGlhZV+qvAnucbNMa0tiPSIh5RwMEaf1OiWPGY+jvTtkZ/H+BGtn9lZL+r2iJvQ==","shasum":"1c8677af9bd619cfb539f5d4d51ae5d1ca2c97c0","tarball":"https://registry.npmjs.org/@nativesquare/soma/-/soma-0.18.1.tgz","fileCount":747,"unpackedSize":5505819,"signatures":[{"keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U","sig":"MEYCIQCdy8TcxfrY57OEi4aicMkfuphZxk3uX3NDiG1zep+OYwIhAOqWl0O4cfrrmbvY2jBpnj4hMrLYkRLMyedN5hyX3uDr"}]},"_npmUser":{"name":"maxime-ns","email":"maxime.gey@nativesquare.fr"},"directories":{},"maintainers":[{"name":"maxime-ns","email":"maxime.gey@nativesquare.fr"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages-npm-production","tmp":"tmp/soma_0.18.1_1779282765295_0.3200249209202761"},"_hasShrinkwrap":false}},"time":{"created":"2026-02-16T21:37:52.298Z","modified":"2026-05-20T13:12:45.636Z","0.1.0":"2026-02-16T21:37:52.610Z","0.1.1":"2026-02-16T21:43:02.546Z","0.1.2":"2026-02-16T22:08:50.602Z","0.2.0":"2026-02-17T00:47:52.037Z","0.3.0":"2026-02-20T15:00:26.117Z","0.4.0":"2026-03-08T11:31:41.929Z","0.5.0":"2026-03-08T12:37:52.586Z","0.6.0":"2026-03-08T13:47:46.088Z","0.7.0":"2026-03-08T14:26:32.818Z","0.7.1":"2026-03-08T18:36:15.785Z","0.7.2":"2026-03-08T18:49:29.703Z","0.7.3":"2026-03-08T19:03:19.251Z","0.8.0":"2026-03-20T13:06:08.901Z","0.9.0":"2026-04-03T11:38:59.652Z","0.9.1":"2026-04-03T12:00:19.946Z","0.9.2":"2026-04-03T13:45:03.875Z","0.9.3":"2026-04-03T14:06:55.394Z","0.9.4":"2026-04-03T14:14:20.345Z","0.10.0":"2026-04-15T09:51:22.580Z","0.10.1":"2026-04-16T11:52:28.532Z","0.10.2":"2026-04-16T12:13:25.345Z","0.11.0":"2026-04-16T13:46:27.958Z","0.12.0":"2026-04-16T17:34:34.653Z","0.13.0":"2026-04-17T10:29:46.969Z","0.13.1":"2026-04-17T11:41:11.036Z","0.14.0":"2026-04-17T15:16:42.577Z","0.14.1":"2026-04-17T16:16:14.590Z","0.16.0":"2026-04-18T13:05:50.049Z","0.16.1":"2026-04-19T08:25:11.424Z","0.16.2":"2026-04-19T09:10:18.546Z","0.16.3":"2026-04-19T09:49:21.453Z","0.16.4":"2026-04-19T11:32:51.028Z","0.16.5":"2026-04-19T12:40:00.057Z","0.16.6":"2026-04-19T17:18:05.313Z","0.16.7":"2026-04-20T14:12:57.324Z","0.16.8":"2026-04-20T14:27:13.615Z","0.16.9":"2026-04-20T15:15:22.015Z","0.17.0":"2026-04-29T13:50:07.875Z","0.17.1":"2026-04-29T14:44:56.472Z","0.18.0":"2026-05-04T14:37:29.966Z","0.18.1":"2026-05-20T13:12:45.515Z"},"bugs":{"url":"https://github.com/NativeSquare/soma/issues"},"license":"Apache-2.0","homepage":"https://github.com/NativeSquare/soma#readme","keywords":["convex","component"],"repository":{"type":"git","url":"git+https://github.com/NativeSquare/soma.git"},"description":"A Convex component that normalizes health and fitness data from multiple wearable providers into a single, consistent schema.","maintainers":[{"name":"maxime-ns","email":"maxime.gey@nativesquare.fr"}],"readme":"# @nativesquare/soma\r\n\r\nA [Convex component](https://convex.dev/components) that normalizes health and\r\nfitness data from multiple wearable providers into a single, consistent schema.\r\n\r\nSoma gives you a provider-agnostic data store for activities, sleep, body\r\nmetrics, daily summaries, nutrition, menstruation, and athlete profiles — all\r\nstored as reactive Convex documents with automatic deduplication. You handle\r\nauthentication and data fetching from each provider; Soma handles storage,\r\nnormalization, and querying.\r\n\r\n## Installation\r\n\r\n```bash\r\nnpm install @nativesquare/soma\r\n```\r\n\r\n## Quick Start\r\n\r\n### 1. Register the component\r\n\r\nCreate (or update) your `convex/convex.config.ts`:\r\n\r\n```ts\r\n// convex/convex.config.ts\r\nimport { defineApp } from \"convex/server\";\r\nimport soma from \"@nativesquare/soma/convex.config.js\";\r\n\r\nconst app = defineApp();\r\napp.use(soma);\r\n\r\nexport default app;\r\n```\r\n\r\n### 2. Instantiate the client\r\n\r\nIn any Convex function file, create a `Soma` instance:\r\n\r\n```ts\r\nimport { Soma } from \"@nativesquare/soma\";\r\nimport { components } from \"./_generated/api\";\r\n\r\nconst soma = new Soma(components.soma);\r\n```\r\n\r\n### 3. Connect a user to a provider\r\n\r\nAfter your app completes the provider's OAuth flow, register the connection:\r\n\r\n```ts\r\nimport { Soma } from \"@nativesquare/soma\";\r\nimport { components } from \"./_generated/api\";\r\nimport { mutation } from \"./_generated/server\";\r\nimport { v } from \"convex/values\";\r\n\r\nconst soma = new Soma(components.soma);\r\n\r\nexport const connectProvider = mutation({\r\n  args: { userId: v.string(), provider: v.string() },\r\n  returns: v.string(),\r\n  handler: async (ctx, args) => {\r\n    return await soma.connect(ctx, {\r\n      userId: args.userId,\r\n      provider: args.provider, // \"GARMIN\", \"FITBIT\", \"OURA\", etc.\r\n    });\r\n  },\r\n});\r\n```\r\n\r\n### 4. Ingest health data\r\n\r\nUse the ingestion methods to store normalized data. Soma automatically\r\ndeduplicates — re-ingesting the same record updates it rather than creating a\r\nduplicate.\r\n\r\n```ts\r\nexport const ingestWorkout = mutation({\r\n  args: { connectionId: v.string(), userId: v.string(), data: v.any() },\r\n  returns: v.string(),\r\n  handler: async (ctx, args) => {\r\n    return await soma.ingestActivity(ctx, {\r\n      connectionId: args.connectionId,\r\n      userId: args.userId,\r\n      ...args.data,\r\n    });\r\n  },\r\n});\r\n```\r\n\r\n## Connection Management\r\n\r\nConnections link a user in your app to a wearable provider. Each connection is\r\nuniquely identified by a `userId + provider` pair.\r\n\r\n### Connect\r\n\r\n```ts\r\nconst connectionId = await soma.connect(ctx, {\r\n  userId: \"user_123\",\r\n  provider: \"GARMIN\",\r\n});\r\n```\r\n\r\nCreates the connection if it doesn't exist, or re-activates it if it was\r\npreviously disconnected. Idempotent — calling twice is a no-op.\r\n\r\n### Disconnect\r\n\r\n```ts\r\nawait soma.disconnect(ctx, {\r\n  userId: \"user_123\",\r\n  provider: \"GARMIN\",\r\n});\r\n```\r\n\r\nSets the connection to inactive. Does **not** delete any synced data, so\r\nre-connecting later preserves historical records.\r\n\r\n### Query connections\r\n\r\n```ts\r\n// Get all connections for a user (active and inactive)\r\nconst connections = await soma.listConnections(ctx, { userId: \"user_123\" });\r\n\r\n// Check if a specific provider is connected\r\nconst garmin = await soma.getConnectionByProvider(ctx, {\r\n  userId: \"user_123\",\r\n  provider: \"GARMIN\",\r\n});\r\nconst isConnected = garmin?.active === true;\r\n\r\n// Get a connection by its document ID\r\nconst connection = await soma.getConnection(ctx, { connectionId: \"...\" });\r\n```\r\n\r\n### Update a connection\r\n\r\n```ts\r\nawait soma.updateConnection(ctx, {\r\n  connectionId: \"...\",\r\n  active: false,\r\n  lastDataUpdate: new Date().toISOString(),\r\n});\r\n```\r\n\r\n### Delete a connection\r\n\r\n```ts\r\nawait soma.deleteConnection(ctx, { connectionId: \"...\" });\r\n```\r\n\r\nHard deletes the connection record. Synced health data linked to this connection\r\nis **not** cascade-deleted.\r\n\r\n## Data Ingestion\r\n\r\nSoma stores health data across seven normalized tables. Each ingestion method\r\naccepts a `connectionId`, `userId`, and the data fields for that type.\r\n\r\nAll methods except menstruation perform **upsert** — if a matching record already\r\nexists, it is updated rather than duplicated.\r\n\r\n| Method                | Table           | Dedup Key                                              |\r\n| --------------------- | --------------- | ------------------------------------------------------ |\r\n| `ingestActivity`      | `activities`    | `connectionId` + `metadata.summary_id`                 |\r\n| `ingestSleep`         | `sleep`         | `connectionId` + `metadata.summary_id`                 |\r\n| `ingestBody`          | `body`          | `connectionId` + `metadata.start_time` + `end_time`    |\r\n| `ingestDaily`         | `daily`         | `connectionId` + `metadata.start_time` + `end_time`    |\r\n| `ingestNutrition`     | `nutrition`     | `connectionId` + `metadata.start_time` + `end_time`    |\r\n| `ingestMenstruation`  | `menstruation`  | _(append-only — no dedup)_                             |\r\n| `ingestAthlete`       | `athletes`      | `connectionId` _(one per connection)_                  |\r\n\r\n### Example: ingesting from Apple HealthKit\r\n\r\nSoma ships HealthKit transformers that convert native HealthKit objects into\r\nSoma's normalized schema:\r\n\r\n```ts\r\nimport { transformWorkout } from \"@nativesquare/soma/healthkit\";\r\n\r\n// In your React Native app — after reading a workout from HealthKit:\r\nconst data = transformWorkout(hkWorkout);\r\n\r\n// Then send `data` to your Convex mutation:\r\nconst activityId = await soma.ingestActivity(ctx, {\r\n  connectionId,\r\n  userId,\r\n  ...data,\r\n});\r\n```\r\n\r\nAvailable transformers from `@nativesquare/soma/healthkit`:\r\n\r\n| Transformer                  | Input               | Output         |\r\n| ---------------------------- | ------------------- | -------------- |\r\n| `transformWorkout`           | `HKWorkout`         | Activity data  |\r\n| `transformSleep`             | `HKCategorySample`  | Sleep data     |\r\n| `transformBody`              | `HKQuantitySample`  | Body data      |\r\n| `transformDaily`             | `HKQuantitySample`  | Daily data     |\r\n| `transformDailyFromSummary`  | `HKActivitySummary` | Daily data     |\r\n| `transformNutrition`         | `HKQuantitySample`  | Nutrition data |\r\n| `transformMenstruation`      | `HKCategorySample`  | Menstruation   |\r\n| `transformAthlete`           | `HKCharacteristics` | Athlete data   |\r\n\r\nAlso exports enum mapping utilities: `mapActivityType`, `mapSleepLevel`,\r\n`isAsleepCategory`, and `mapMenstruationFlow`.\r\n\r\n## Strava Integration\r\n\r\nSoma includes a built-in Strava integration that handles the full OAuth\r\nlifecycle — authorization URL generation, token exchange, secure token storage,\r\nautomatic token refresh, and data syncing. No manual API calls or token\r\nmanagement required.\r\n\r\nThere are two ways to use the Strava integration:\r\n\r\n- **Managed** — use `soma.connectStrava()`, `soma.syncStrava()`, and\r\n  `soma.disconnectStrava()` which handle everything end-to-end including OAuth\r\n  token storage inside the component.\r\n- **Manual** — use the `StravaClient`, `syncActivities`, and `syncAthlete`\r\n  utilities from `@nativesquare/soma/strava` for full control over the flow\r\n  (e.g., custom token storage, webhook-driven sync).\r\n\r\n### Prerequisites\r\n\r\n1. **Create a Strava API Application** at\r\n   [strava.com/settings/api](https://www.strava.com/settings/api) to obtain your\r\n   Client ID and Client Secret.\r\n\r\n2. **Set environment variables** in the\r\n   [Convex dashboard](https://dashboard.convex.dev):\r\n\r\n   | Variable              | Required | Description                                   |\r\n   | --------------------- | -------- | --------------------------------------------- |\r\n   | `STRAVA_CLIENT_ID`    | Yes      | Your Strava application's Client ID           |\r\n   | `STRAVA_CLIENT_SECRET`| Yes      | Your Strava application's Client Secret       |\r\n   | `STRAVA_BASE_URL`     | No       | Override for testing with a mock server        |\r\n\r\n   Alternatively, pass credentials directly to the `Soma` constructor:\r\n\r\n   ```ts\r\n   const soma = new Soma(components.soma, {\r\n     strava: {\r\n       clientId: \"your-client-id\",\r\n       clientSecret: \"your-client-secret\",\r\n     },\r\n   });\r\n   ```\r\n\r\n### Managed flow (recommended)\r\n\r\nThe managed flow handles OAuth, token storage, and syncing in a single call.\r\n\r\n#### Step 1: Generate the authorization URL\r\n\r\n```ts\r\nimport { Soma } from \"@nativesquare/soma\";\r\nimport { components } from \"./_generated/api\";\r\nimport { query } from \"./_generated/server\";\r\nimport { v } from \"convex/values\";\r\n\r\nconst soma = new Soma(components.soma);\r\n\r\nexport const getStravaAuthUrl = query({\r\n  args: { redirectUri: v.string() },\r\n  handler: async (_ctx, { redirectUri }) => {\r\n    return soma.getStravaAuthUrl({ redirectUri });\r\n  },\r\n});\r\n```\r\n\r\nRedirect the user to this URL. After they authorize, Strava redirects back to\r\nyour `redirectUri` with a `code` query parameter.\r\n\r\n#### Step 2: Handle the OAuth callback\r\n\r\n```ts\r\nimport { action } from \"./_generated/server\";\r\n\r\nexport const handleStravaCallback = action({\r\n  args: { userId: v.string(), code: v.string() },\r\n  handler: async (ctx, { userId, code }) => {\r\n    // Exchanges the code, stores tokens, syncs athlete + activities\r\n    return await soma.connectStrava(ctx, { userId, code });\r\n  },\r\n});\r\n```\r\n\r\n`connectStrava` returns `{ connectionId, synced, errors }` — the number of\r\nactivities synced and any per-activity errors.\r\n\r\n#### Step 3: Incremental sync\r\n\r\n```ts\r\nexport const syncStravaActivities = action({\r\n  args: { userId: v.string() },\r\n  handler: async (ctx, { userId }) => {\r\n    // Auto-refreshes token if expired, then syncs\r\n    return await soma.syncStrava(ctx, { userId, includeStreams: true });\r\n  },\r\n});\r\n```\r\n\r\nPass `after` (Unix epoch seconds) to only sync activities after a given\r\ntimestamp, useful for incremental updates.\r\n\r\n#### Step 4: Disconnect\r\n\r\n```ts\r\nexport const disconnectStrava = action({\r\n  args: { userId: v.string() },\r\n  handler: async (ctx, { userId }) => {\r\n    // Revokes token at Strava, deletes stored tokens, sets connection inactive\r\n    await soma.disconnectStrava(ctx, { userId });\r\n  },\r\n});\r\n```\r\n\r\n#### Step 5: Query Strava data\r\n\r\nOnce connected and synced, use the standard Soma query methods — Strava data is\r\nstored in the same normalized tables as any other provider:\r\n\r\n```ts\r\nexport const getStravaConnection = query({\r\n  args: { userId: v.string() },\r\n  handler: async (ctx, { userId }) => {\r\n    return await soma.getConnectionByProvider(ctx, {\r\n      userId,\r\n      provider: \"STRAVA\",\r\n    });\r\n  },\r\n});\r\n\r\nexport const listStravaActivities = query({\r\n  args: { userId: v.string() },\r\n  handler: async (ctx, { userId }) => {\r\n    return await soma.listActivities(ctx, { userId, order: \"desc\" });\r\n  },\r\n});\r\n\r\nexport const getStravaAthlete = query({\r\n  args: { userId: v.string() },\r\n  handler: async (ctx, { userId }) => {\r\n    const athletes = await soma.listAthletes(ctx, { userId });\r\n    return athletes[0] ?? null;\r\n  },\r\n});\r\n```\r\n\r\n### Manual flow (advanced)\r\n\r\nFor full control over the OAuth flow, token storage, and sync timing, use the\r\nlow-level utilities from `@nativesquare/soma/strava`. This is useful when you\r\nwant to manage tokens yourself, use webhooks for sync triggers, or integrate\r\nwith a custom auth system.\r\n\r\n```ts\r\nimport { Soma } from \"@nativesquare/soma\";\r\nimport {\r\n  StravaClient,\r\n  syncActivities,\r\n  syncAthlete,\r\n} from \"@nativesquare/soma/strava\";\r\nimport { components } from \"./_generated/api\";\r\nimport { internalAction } from \"./_generated/server\";\r\nimport { v } from \"convex/values\";\r\n\r\nconst soma = new Soma(components.soma);\r\n\r\nexport const syncStrava = internalAction({\r\n  args: {\r\n    userId: v.string(),\r\n    connectionId: v.string(),\r\n    accessToken: v.string(),\r\n  },\r\n  handler: async (ctx, { userId, connectionId, accessToken }) => {\r\n    const client = new StravaClient({ accessToken });\r\n\r\n    // Sync the athlete profile\r\n    await syncAthlete({ client, soma, ctx, connectionId, userId });\r\n\r\n    // Sync activities (with streams and lap data)\r\n    const result = await syncActivities({\r\n      client,\r\n      soma,\r\n      ctx,\r\n      connectionId,\r\n      userId,\r\n      includeStreams: true,\r\n      includeLaps: true,\r\n    });\r\n\r\n    // Update the connection timestamp\r\n    await soma.updateConnection(ctx, {\r\n      connectionId,\r\n      lastDataUpdate: new Date().toISOString(),\r\n    });\r\n\r\n    return result; // { synced: number, errors: [...] }\r\n  },\r\n});\r\n```\r\n\r\nYou can also use the transformers and client independently:\r\n\r\n```ts\r\nimport {\r\n  StravaClient,\r\n  transformActivity,\r\n  transformAthlete,\r\n  buildAuthUrl,\r\n  exchangeCode,\r\n  refreshToken,\r\n} from \"@nativesquare/soma/strava\";\r\n```\r\n\r\n### Available Strava exports (`@nativesquare/soma/strava`)\r\n\r\n| Export               | Type        | Description                                      |\r\n| -------------------- | ----------- | ------------------------------------------------ |\r\n| `StravaClient`       | Class       | Typed Strava API client (uses global `fetch`)    |\r\n| `StravaApiError`     | Class       | Error thrown for non-OK Strava API responses     |\r\n| `syncActivities`     | Function    | Sync activities from Strava into Soma            |\r\n| `syncAthlete`        | Function    | Sync athlete profile from Strava into Soma       |\r\n| `transformActivity`  | Function    | Transform Strava activity → Soma schema          |\r\n| `transformAthlete`   | Function    | Transform Strava athlete → Soma schema           |\r\n| `mapSportType`       | Function    | Map Strava sport type → Soma activity type enum  |\r\n| `buildAuthUrl`       | Function    | Build the OAuth authorization URL                |\r\n| `exchangeCode`       | Function    | Exchange OAuth code for tokens                   |\r\n| `refreshToken`       | Function    | Refresh an expired access token                  |\r\n\r\n## Data Queries\r\n\r\nSoma provides query methods for reading back health data with optional\r\ntime-range filtering. Each data table exposes two query variants:\r\n\r\n- **`list{Table}`** — returns all matching records (with optional `limit`)\r\n- **`paginate{Table}`** — cursor-based pagination for large result sets\r\n\r\n### Filtering by time range\r\n\r\nAll queries require a `userId`. Most tables also accept optional `startTime` and\r\n`endTime` arguments (ISO-8601 strings) to filter on `metadata.start_time`:\r\n\r\n```ts\r\n// All activities for a user (newest first by default):\r\nconst all = await soma.listActivities(ctx, { userId: \"user_123\" });\r\n\r\n// Last 7 days:\r\nconst sevenDaysAgo = new Date(Date.now() - 7 * 86_400_000).toISOString();\r\nconst recentActivities = await soma.listActivities(ctx, {\r\n  userId: \"user_123\",\r\n  startTime: sevenDaysAgo,\r\n});\r\n\r\n// Last 28 days of sleep data:\r\nconst twentyEightDaysAgo = new Date(Date.now() - 28 * 86_400_000).toISOString();\r\nconst sleepHistory = await soma.listSleep(ctx, {\r\n  userId: \"user_123\",\r\n  startTime: twentyEightDaysAgo,\r\n});\r\n\r\n// Custom date range:\r\nconst dailySummaries = await soma.listDaily(ctx, {\r\n  userId: \"user_123\",\r\n  startTime: \"2025-01-01T00:00:00.000Z\",\r\n  endTime: \"2025-01-31T23:59:59.999Z\",\r\n  order: \"asc\", // oldest first\r\n});\r\n\r\n// Limit results:\r\nconst lastFiveWorkouts = await soma.listActivities(ctx, {\r\n  userId: \"user_123\",\r\n  limit: 5,\r\n});\r\n```\r\n\r\n### Pagination\r\n\r\nFor large datasets or infinite-scroll UIs, use the paginated variants with\r\nConvex's `paginationOpts`:\r\n\r\n```ts\r\nconst page = await soma.paginateActivities(ctx, {\r\n  userId: \"user_123\",\r\n  startTime: sevenDaysAgo,\r\n  paginationOpts: { numItems: 10, cursor: null }, // null = first page\r\n});\r\n\r\n// page.page          — array of activity documents\r\n// page.isDone        — true if no more results\r\n// page.continueCursor — pass as cursor to load the next page\r\n```\r\n\r\n### Available query methods\r\n\r\n| Method                   | Table          | Time-range filter | Notes                      |\r\n| ------------------------ | -------------- | ----------------- | -------------------------- |\r\n| `listActivities`         | `activities`   | Yes               |                            |\r\n| `paginateActivities`     | `activities`   | Yes               |                            |\r\n| `listSleep`              | `sleep`        | Yes               |                            |\r\n| `paginateSleep`          | `sleep`        | Yes               |                            |\r\n| `listBody`               | `body`         | Yes               |                            |\r\n| `paginateBody`           | `body`         | Yes               |                            |\r\n| `listDaily`              | `daily`        | Yes               |                            |\r\n| `paginateDaily`          | `daily`        | Yes               |                            |\r\n| `listNutrition`          | `nutrition`    | Yes               |                            |\r\n| `paginateNutrition`      | `nutrition`    | Yes               |                            |\r\n| `listMenstruation`       | `menstruation` | Yes               |                            |\r\n| `paginateMenstruation`   | `menstruation` | Yes               |                            |\r\n| `listAthletes`           | `athletes`     | No                | One per connection         |\r\n| `getAthlete`             | `athletes`     | No                | By connectionId            |\r\n\r\n## Schema\r\n\r\nSoma uses [Terra](https://docs.tryterra.co)'s data model as its schema standard,\r\nbut has **no runtime dependency on Terra** — data can come from any source as\r\nlong as it conforms to the validators.\r\n\r\n### Tables\r\n\r\n| Table            | Description                                             |\r\n| ---------------- | ------------------------------------------------------- |\r\n| `connections`    | User ↔ provider links                                  |\r\n| `athletes`       | User profile data from providers                        |\r\n| `activities`     | Workouts and exercise sessions                          |\r\n| `body`           | Body metrics (heart rate, blood pressure, etc.)          |\r\n| `daily`          | Daily activity summaries (steps, calories)              |\r\n| `sleep`          | Sleep session data                                      |\r\n| `menstruation`   | Menstruation and fertility data                         |\r\n| `nutrition`      | Food, drink, macro/micronutrient data                   |\r\n| `plannedWorkouts`| Scheduled/planned workouts                              |\r\n| `providerTokens` | OAuth tokens for cloud-based providers (Strava, etc.)  |\r\n\r\nAll data fields are optional (`v.optional`) unless explicitly required. This\r\naccommodates providers that support different subsets of health data.\r\n\r\n## API Reference\r\n\r\n### Connection Methods\r\n\r\n| Method                                               | Context  | Description                                   |\r\n| ---------------------------------------------------- | -------- | --------------------------------------------- |\r\n| `connect(ctx, { userId, provider })`                 | Mutation | Connect user to provider (idempotent)         |\r\n| `disconnect(ctx, { userId, provider })`              | Mutation | Disconnect user (soft — preserves data)       |\r\n| `getConnection(ctx, { connectionId })`               | Query    | Get connection by document ID                 |\r\n| `getConnectionByProvider(ctx, { userId, provider })` | Query    | Get connection for a user–provider pair       |\r\n| `listConnections(ctx, { userId })`                   | Query    | List all connections for a user               |\r\n| `updateConnection(ctx, { connectionId, ... })`       | Mutation | Update connection fields                      |\r\n| `deleteConnection(ctx, { connectionId })`            | Mutation | Hard-delete connection record                 |\r\n\r\n### Ingestion Methods\r\n\r\n| Method                                         | Context  | Description                     |\r\n| ---------------------------------------------- | -------- | ------------------------------- |\r\n| `ingestActivity(ctx, { connectionId, ... })`   | Mutation | Upsert a workout record         |\r\n| `ingestSleep(ctx, { connectionId, ... })`      | Mutation | Upsert a sleep session          |\r\n| `ingestBody(ctx, { connectionId, ... })`       | Mutation | Upsert body metrics             |\r\n| `ingestDaily(ctx, { connectionId, ... })`      | Mutation | Upsert daily activity summary   |\r\n| `ingestNutrition(ctx, { connectionId, ... })`  | Mutation | Upsert nutrition record         |\r\n| `ingestMenstruation(ctx, { connectionId, ... })`| Mutation | Append menstruation record      |\r\n| `ingestAthlete(ctx, { connectionId, ... })`    | Mutation | Upsert athlete profile          |\r\n\r\n### Data Query Methods\r\n\r\nAll `list*` methods accept `{ userId, startTime?, endTime?, order?, limit? }`.\r\nAll `paginate*` methods accept `{ userId, startTime?, endTime?, paginationOpts }`.\r\n\r\n| Method                                                     | Context | Description                             |\r\n| ---------------------------------------------------------- | ------- | --------------------------------------- |\r\n| `listActivities(ctx, { userId, ... })`                     | Query   | List activities with time-range filter  |\r\n| `paginateActivities(ctx, { userId, ..., paginationOpts })` | Query   | Paginate activities                     |\r\n| `listSleep(ctx, { userId, ... })`                          | Query   | List sleep records                      |\r\n| `paginateSleep(ctx, { userId, ..., paginationOpts })`      | Query   | Paginate sleep records                  |\r\n| `listBody(ctx, { userId, ... })`                           | Query   | List body metrics                       |\r\n| `paginateBody(ctx, { userId, ..., paginationOpts })`       | Query   | Paginate body metrics                   |\r\n| `listDaily(ctx, { userId, ... })`                          | Query   | List daily summaries                    |\r\n| `paginateDaily(ctx, { userId, ..., paginationOpts })`      | Query   | Paginate daily summaries                |\r\n| `listNutrition(ctx, { userId, ... })`                      | Query   | List nutrition records                  |\r\n| `paginateNutrition(ctx, { userId, ..., paginationOpts })`  | Query   | Paginate nutrition records              |\r\n| `listMenstruation(ctx, { userId, ... })`                   | Query   | List menstruation records               |\r\n| `paginateMenstruation(ctx, { userId, ..., paginationOpts })`| Query  | Paginate menstruation records           |\r\n| `listAthletes(ctx, { userId })`                            | Query   | List athlete profiles for a user        |\r\n| `getAthlete(ctx, { connectionId })`                        | Query   | Get athlete profile for a connection    |\r\n\r\n### Strava Methods\r\n\r\nThese methods require Strava credentials to be configured (via environment\r\nvariables or the `Soma` constructor). They handle OAuth, token storage, and data\r\nsyncing end-to-end.\r\n\r\n| Method                                                              | Context | Description                                          |\r\n| ------------------------------------------------------------------- | ------- | ---------------------------------------------------- |\r\n| `getStravaAuthUrl({ redirectUri, scope?, state? })`                 | Pure    | Build the Strava OAuth authorization URL             |\r\n| `connectStrava(ctx, { userId, code, includeStreams? })`             | Action  | Handle OAuth callback: exchange code, store tokens, sync all data |\r\n| `syncStrava(ctx, { userId, includeStreams?, after? })`              | Action  | Incremental sync with auto token refresh             |\r\n| `disconnectStrava(ctx, { userId })`                                 | Action  | Revoke token, delete stored tokens, deactivate connection |\r\n\r\n## Direct Component Access\r\n\r\nFor advanced use cases, you can call component functions directly instead of\r\nusing the `Soma` class:\r\n\r\n```ts\r\nimport { query, mutation } from \"./_generated/server\";\r\nimport { components } from \"./_generated/api\";\r\nimport { v } from \"convex/values\";\r\n\r\n// Query — use ctx.runQuery\r\nexport const listConnections = query({\r\n  args: { userId: v.string() },\r\n  returns: v.any(),\r\n  handler: async (ctx, args) => {\r\n    return await ctx.runQuery(components.soma.public.listConnections, args);\r\n  },\r\n});\r\n\r\n// Mutation — use ctx.runMutation\r\nexport const connect = mutation({\r\n  args: { userId: v.string(), provider: v.string() },\r\n  returns: v.string(),\r\n  handler: async (ctx, args) => {\r\n    return await ctx.runMutation(components.soma.public.connect, args);\r\n  },\r\n});\r\n```\r\n\r\nAll public functions are available under `components.soma.public.*`. Strava\r\nactions are under `components.soma.strava.*`. Use `ctx.runQuery` for queries,\r\n`ctx.runMutation` for mutations, and `ctx.runAction` for actions.\r\n\r\n## Exports\r\n\r\n| Import Path                      | Contents                                                      |\r\n| -------------------------------- | ------------------------------------------------------------- |\r\n| `@nativesquare/soma`             | `Soma` client class                                           |\r\n| `@nativesquare/soma/healthkit`   | Apple HealthKit → Soma transformers & types                   |\r\n| `@nativesquare/soma/strava`      | Strava API client, transformers, OAuth helpers, sync utilities |\r\n| `@nativesquare/soma/react`       | React hooks (coming soon)                                     |\r\n| `@nativesquare/soma/convex.config.js` | Component config for `convex.config.ts`                  |\r\n\r\n## License\r\n\r\n[Apache-2.0](./LICENSE)\r\n","readmeFilename":"README.md"}