{"_id":"@gilhrpenner/convex-files-control","_rev":"17-ff4151c8bed652137c29241ec0f78cf7","name":"@gilhrpenner/convex-files-control","dist-tags":{"latest":"0.5.9"},"versions":{"0.1.1":{"name":"@gilhrpenner/convex-files-control","version":"0.1.1","keywords":["convex","component","files","storage","upload","download","access-control"],"license":"Apache-2.0","_id":"@gilhrpenner/convex-files-control@0.1.1","maintainers":[{"name":"gilhrpenner","email":"gilpenner@proton.me"}],"homepage":"https://github.com/gilhrpenner/convex-files-control#readme","bugs":{"url":"https://github.com/gilhrpenner/convex-files-control/issues"},"dist":{"shasum":"836721f7c04c6e44b65ddb276184c7d3330f9c2f","tarball":"https://registry.npmjs.org/@gilhrpenner/convex-files-control/-/convex-files-control-0.1.1.tgz","fileCount":149,"integrity":"sha512-xS7xMI2BmLFw04hfangPKM6qFgOl9CAUeJlJ8DTUapD8MzdQZ+lglfoyohxzeOW0j5Zc4yxTjDOnMf8o0pM8Sg==","signatures":[{"sig":"MEQCIF7Iz5FuUCqudTSIkvn9ZvHtGsHNag872rcDLj7cRJ64AiB7kTbBV0BnatbODxK+Ra7gqELPVbH3zB5omGLX/OBYiw==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":526852},"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"},"./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":"458d2a9797da7a9d7ce31645c8e45c50c5c031a3","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":"rm -rf 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 run build:clean"},"_npmUser":{"name":"gilhrpenner","email":"gilpenner@proton.me"},"repository":{"url":"git+https://github.com/gilhrpenner/convex-files-control.git","type":"git"},"_npmVersion":"11.6.0","description":"A convex files control component for Convex.","directories":{},"_nodeVersion":"24.9.0","dependencies":{"convex-helpers":"^0.1.108","@aws-sdk/client-s3":"^3.958.0","@convex-dev/action-retrier":"^0.3.0","@aws-sdk/s3-request-presigner":"^3.958.0"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"vite":"7.3.0","react":"^19.2.3","convex":"1.31.2","eslint":"9.39.2","vitest":"4.0.16","cpy-cli":"^6.0.0","globals":"^16.5.0","prettier":"3.7.4","react-dom":"^19.2.3","@eslint/js":"9.39.2","pkg-pr-new":"^0.0.62","typescript":"5.9.3","@types/node":"^24.10.4","convex-test":"0.0.41","@types/react":"^19.2.7","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.50.1","@vitest/coverage-v8":"^4.0.16","eslint-plugin-react":"^7.37.5","@vitejs/plugin-react":"^5.1.2","@convex-dev/eslint-plugin":"^1.1.1","eslint-plugin-react-hooks":"^7.0.1","eslint-plugin-react-refresh":"^0.4.26"},"peerDependencies":{"react":"^18.3.1 || ^19.0.0","convex":"^1.29.3"},"_npmOperationalInternal":{"tmp":"tmp/convex-files-control_0.1.1_1766974015946_0.9982975039041677","host":"s3://npm-registry-packages-npm-production"}},"0.2.0":{"name":"@gilhrpenner/convex-files-control","version":"0.2.0","keywords":["convex","component","files","storage","upload","download","access-control"],"license":"Apache-2.0","_id":"@gilhrpenner/convex-files-control@0.2.0","maintainers":[{"name":"gilhrpenner","email":"gilpenner@proton.me"}],"homepage":"https://github.com/gilhrpenner/convex-files-control#readme","bugs":{"url":"https://github.com/gilhrpenner/convex-files-control/issues"},"dist":{"shasum":"526b0249edab8f6559a04639c028f0f9edaf887e","tarball":"https://registry.npmjs.org/@gilhrpenner/convex-files-control/-/convex-files-control-0.2.0.tgz","fileCount":152,"integrity":"sha512-UopJlBYyNCDLjis+faRH3EwvS9WVxRd0YkGe3igHkUmdDwIdkv4HIg8+9DudbtELr2m3I51pPQ8X0ISvXe6ugw==","signatures":[{"sig":"MEYCIQCfFqLQdZfroB1c3JM8RjJNYmw2/axGeIQunGT8Sjm0nAIhAMclPkbyJz7zBKuToEJIkB2JuzhXs8tEUi1V3MGr9oJT","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":577128},"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"},"./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":"40135f61acd74effc480ff6b2f5d27654e0f2b3e","scripts":{"all":"run-p -r 'dev:*' 'test:watch'","dev":"run-p -r 'dev:*'","lint":"eslint src/","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","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":"rm -rf 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","typecheck:all":"tsc --noEmit && tsc -p example && tsc -p example/convex","prepublishOnly":"npm run build:clean"},"_npmUser":{"name":"gilhrpenner","email":"gilpenner@proton.me"},"repository":{"url":"git+https://github.com/gilhrpenner/convex-files-control.git","type":"git"},"_npmVersion":"11.6.2","description":"A convex files control component for Convex.","directories":{},"_nodeVersion":"24.5.0","dependencies":{"convex-helpers":"^0.1.108","@aws-sdk/client-s3":"^3.958.0","@convex-dev/action-retrier":"^0.3.0","@aws-sdk/s3-request-presigner":"^3.958.0"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"vite":"7.3.0","react":"^19.2.3","convex":"1.31.2","eslint":"9.39.2","vitest":"4.0.16","cpy-cli":"^6.0.0","globals":"^16.5.0","prettier":"3.7.4","react-dom":"^19.2.3","@eslint/js":"9.39.2","pkg-pr-new":"^0.0.62","typescript":"5.9.3","@types/node":"^24.10.4","convex-test":"0.0.41","@types/react":"^19.2.7","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.50.1","@vitest/coverage-v8":"^4.0.16","eslint-plugin-react":"^7.37.5","@vitejs/plugin-react":"^5.1.2","@convex-dev/eslint-plugin":"^1.1.1","eslint-plugin-react-hooks":"^7.0.1","eslint-plugin-react-refresh":"^0.4.26"},"peerDependencies":{"react":"^18.3.1 || ^19.0.0","convex":"^1.29.3"},"_npmOperationalInternal":{"tmp":"tmp/convex-files-control_0.2.0_1767030251794_0.9524738313218328","host":"s3://npm-registry-packages-npm-production"}},"0.3.0":{"name":"@gilhrpenner/convex-files-control","version":"0.3.0","keywords":["convex","component","files","storage","upload","download","access-control"],"license":"Apache-2.0","_id":"@gilhrpenner/convex-files-control@0.3.0","maintainers":[{"name":"gilhrpenner","email":"gilpenner@proton.me"}],"homepage":"https://github.com/gilhrpenner/convex-files-control#readme","bugs":{"url":"https://github.com/gilhrpenner/convex-files-control/issues"},"dist":{"shasum":"e2d5eb440e4dfc51a48449f3d5e823f82089efa6","tarball":"https://registry.npmjs.org/@gilhrpenner/convex-files-control/-/convex-files-control-0.3.0.tgz","fileCount":152,"integrity":"sha512-lFwWAOmrt9dLYS7RBF/KOCZlvA7joXDaFAWfoInlKgN8kNP076NcbWXPFCvJMMjCuUl4nDF3CxZ524IBJCS8nA==","signatures":[{"sig":"MEQCIHcOGkrJmzxsZkbRbT3keFvZNB3qhxO4VKUbQZOS8n84AiBptoPoio8rGRlTAW5rC8GK8j/Gdz/Tapx+pnlTL3bXQg==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":577807},"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"},"./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":"a9e6558c6b5fad54dcf33f2ec2e06b32ee5377dd","scripts":{"all":"run-p -r 'dev:*' 'test:watch'","dev":"run-p -r 'dev:*'","lint":"eslint src/","test":"vitest run --typecheck","alpha":"npm version prerelease --preid alpha && npm publish --tag alpha && git push --follow-tags","build":"tsc --project ./tsconfig.build.json","check":"npm run build:clean && npm run typecheck && npm run lint && npm run test","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","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":"rm -rf 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","typecheck:all":"tsc --noEmit && tsc -p example && tsc -p example/convex","prepublishOnly":"npm run build:clean"},"_npmUser":{"name":"gilhrpenner","email":"gilpenner@proton.me"},"repository":{"url":"git+https://github.com/gilhrpenner/convex-files-control.git","type":"git"},"_npmVersion":"11.6.0","description":"A convex files control component for Convex.","directories":{},"_nodeVersion":"24.9.0","dependencies":{"convex-helpers":"^0.1.108","@aws-sdk/client-s3":"^3.958.0","@convex-dev/action-retrier":"^0.3.0","@aws-sdk/s3-request-presigner":"^3.958.0"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"vite":"7.3.0","react":"^19.2.3","convex":"1.31.2","eslint":"9.39.2","vitest":"4.0.16","cpy-cli":"^6.0.0","globals":"^16.5.0","prettier":"3.7.4","react-dom":"^19.2.3","@eslint/js":"9.39.2","pkg-pr-new":"^0.0.62","typescript":"5.9.3","@types/node":"^24.10.4","convex-test":"0.0.41","@types/react":"^19.2.7","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.50.1","@vitest/coverage-v8":"^4.0.16","eslint-plugin-react":"^7.37.5","@vitejs/plugin-react":"^5.1.2","@convex-dev/eslint-plugin":"^1.1.1","eslint-plugin-react-hooks":"^7.0.1","eslint-plugin-react-refresh":"^0.4.26"},"peerDependencies":{"react":"^18.3.1 || ^19.0.0","convex":"^1.29.3"},"_npmOperationalInternal":{"tmp":"tmp/convex-files-control_0.3.0_1767208941122_0.4567906777345061","host":"s3://npm-registry-packages-npm-production"}},"0.4.0":{"name":"@gilhrpenner/convex-files-control","version":"0.4.0","keywords":["convex","component","files","storage","upload","download","access-control"],"license":"Apache-2.0","_id":"@gilhrpenner/convex-files-control@0.4.0","maintainers":[{"name":"gilhrpenner","email":"gilpenner@proton.me"}],"homepage":"https://github.com/gilhrpenner/convex-files-control#readme","bugs":{"url":"https://github.com/gilhrpenner/convex-files-control/issues"},"dist":{"shasum":"d93f67aaffcd8e1f68092914ff0d3f7bcdf6aeb3","tarball":"https://registry.npmjs.org/@gilhrpenner/convex-files-control/-/convex-files-control-0.4.0.tgz","fileCount":152,"integrity":"sha512-gN5PMnxmVbKZ24/SDqQW9qoSBGGXNV8n4UHCA/qB5vu9ddRAJhwkV4PWnxelpgMHebR2sSyZ78I2ErwenGh+5A==","signatures":[{"sig":"MEQCIBw7G1Kawx06KVrWK5YVi0Y+ouk2IvjH0HzbNJ539tL4AiB0jPqZLT9K+kAQ6Jw39clsbrTI3E5wd9QICEWg2MB0eg==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":617029},"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"},"./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":"4ed49f0f4bd89904b9f8af2e590c93909c7055d5","scripts":{"all":"run-p -r 'dev:*' 'test:watch'","dev":"run-p -r 'dev:*'","lint":"eslint src/","test":"vitest run --typecheck","alpha":"npm version prerelease --preid alpha && npm publish --tag alpha && git push --follow-tags","build":"tsc --project ./tsconfig.build.json","check":"npm run build:clean && npm run typecheck && npm run lint && npm run test","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","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":"rm -rf 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","typecheck:all":"tsc --noEmit && tsc -p example && tsc -p example/convex","prepublishOnly":"npm run build:clean"},"_npmUser":{"name":"gilhrpenner","email":"gilpenner@proton.me"},"repository":{"url":"git+https://github.com/gilhrpenner/convex-files-control.git","type":"git"},"_npmVersion":"11.6.0","description":"A convex files control component for Convex.","directories":{},"_nodeVersion":"24.9.0","dependencies":{"convex-helpers":"^0.1.108","@aws-sdk/client-s3":"^3.958.0","@convex-dev/action-retrier":"^0.3.0","@aws-sdk/s3-request-presigner":"^3.958.0"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"vite":"7.3.0","react":"^19.2.3","convex":"1.31.2","eslint":"9.39.2","vitest":"4.0.16","cpy-cli":"^6.0.0","globals":"^16.5.0","prettier":"3.7.4","react-dom":"^19.2.3","@eslint/js":"9.39.2","pkg-pr-new":"^0.0.62","typescript":"5.9.3","@types/node":"^24.10.4","convex-test":"0.0.41","@types/react":"^19.2.7","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.50.1","@vitest/coverage-v8":"^4.0.16","eslint-plugin-react":"^7.37.5","@vitejs/plugin-react":"^5.1.2","@convex-dev/eslint-plugin":"^1.1.1","eslint-plugin-react-hooks":"^7.0.1","eslint-plugin-react-refresh":"^0.4.26"},"peerDependencies":{"react":"^18.3.1 || ^19.0.0","convex":"^1.29.3"},"_npmOperationalInternal":{"tmp":"tmp/convex-files-control_0.4.0_1767303641789_0.6297681973569316","host":"s3://npm-registry-packages-npm-production"}},"0.5.0":{"name":"@gilhrpenner/convex-files-control","version":"0.5.0","keywords":["convex","component","files","storage","upload","download","access-control"],"license":"Apache-2.0","_id":"@gilhrpenner/convex-files-control@0.5.0","maintainers":[{"name":"gilhrpenner","email":"gilpenner@proton.me"}],"homepage":"https://github.com/gilhrpenner/convex-files-control#readme","bugs":{"url":"https://github.com/gilhrpenner/convex-files-control/issues"},"dist":{"shasum":"569cd106afcd77abeeb52c5ac61ca0e2ecfb4dbd","tarball":"https://registry.npmjs.org/@gilhrpenner/convex-files-control/-/convex-files-control-0.5.0.tgz","fileCount":152,"integrity":"sha512-+OnCDZ4kqqxWVq2Py2RZE68jFGDtkjnVSW+Y9qsXzp0d2NWsOnd6EeJheUgFef2nqcOCUeVZjmhvl9wR3bWYfw==","signatures":[{"sig":"MEUCIBRopDyuX3SUM2GqzGhThs8XWETVwq17vcgeUB6YqDjwAiEAh9nowpoiUThl6k1uphIfCc2ThRaLmDmmqHS0JHW9zbo=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":614914},"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"},"./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":"a36098e2592c151ba8f4035e4caa83ec871acfae","scripts":{"all":"run-p -r 'dev:*' 'test:watch'","dev":"run-p -r 'dev:*'","lint":"eslint src/","test":"vitest run --typecheck","alpha":"npm version prerelease --preid alpha && npm publish --tag alpha && git push --follow-tags","build":"tsc --project ./tsconfig.build.json","check":"npm run build:clean && npm run typecheck && npm run lint && npm run test","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","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":"rm -rf 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","typecheck:all":"tsc --noEmit && tsc -p example && tsc -p example/convex","prepublishOnly":"npm run build:clean"},"_npmUser":{"name":"gilhrpenner","email":"gilpenner@proton.me"},"repository":{"url":"git+https://github.com/gilhrpenner/convex-files-control.git","type":"git"},"_npmVersion":"11.6.0","description":"A convex files control component for Convex.","directories":{},"_nodeVersion":"24.9.0","dependencies":{"convex-helpers":"^0.1.108","@aws-sdk/client-s3":"^3.958.0","@convex-dev/action-retrier":"^0.3.0","@aws-sdk/s3-request-presigner":"^3.958.0"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"vite":"7.3.0","react":"^19.2.3","convex":"1.31.2","eslint":"9.39.2","vitest":"4.0.16","cpy-cli":"^6.0.0","globals":"^16.5.0","prettier":"3.7.4","react-dom":"^19.2.3","@eslint/js":"9.39.2","pkg-pr-new":"^0.0.62","typescript":"5.9.3","@types/node":"^24.10.4","convex-test":"0.0.41","@types/react":"^19.2.7","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.50.1","@vitest/coverage-v8":"^4.0.16","eslint-plugin-react":"^7.37.5","@vitejs/plugin-react":"^5.1.2","@convex-dev/eslint-plugin":"^1.1.1","eslint-plugin-react-hooks":"^7.0.1","eslint-plugin-react-refresh":"^0.4.26"},"peerDependencies":{"react":"^18.3.1 || ^19.0.0","convex":"^1.29.3"},"_npmOperationalInternal":{"tmp":"tmp/convex-files-control_0.5.0_1767336414815_0.11284797750709674","host":"s3://npm-registry-packages-npm-production"}},"0.5.1":{"name":"@gilhrpenner/convex-files-control","version":"0.5.1","keywords":["convex","component","files","storage","upload","download","access-control"],"license":"Apache-2.0","_id":"@gilhrpenner/convex-files-control@0.5.1","maintainers":[{"name":"gilhrpenner","email":"gilpenner@proton.me"}],"homepage":"https://github.com/gilhrpenner/convex-files-control#readme","bugs":{"url":"https://github.com/gilhrpenner/convex-files-control/issues"},"dist":{"shasum":"9002856aa2fac2565f098e0fa805bb6b0b693d46","tarball":"https://registry.npmjs.org/@gilhrpenner/convex-files-control/-/convex-files-control-0.5.1.tgz","fileCount":152,"integrity":"sha512-2pgZlgO1mlK4g8fhTFILNPCcte9uypbhwSzVZQcUt9PJExp9kcoQgkNFzvl4EkY1FLHaYIB+dD9RlnaI5wBuyQ==","signatures":[{"sig":"MEYCIQDvBth2fq/ml5SX3iRe7r9cfJbVpV6Grh8Cf2l2bxYKXAIhAPIcb/6pjA8YvPBdQxUnAOIbTXQuVpMT+RrCjEkgb3w1","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":625398},"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"},"./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":"09a68f4acd80db126969ad2d9b1dec402fdaa0f9","scripts":{"all":"run-p -r 'dev:*' 'test:watch'","dev":"run-p -r 'dev:*'","lint":"eslint src/","test":"vitest run --typecheck","alpha":"npm version prerelease --preid alpha && npm publish --tag alpha && git push --follow-tags","build":"tsc --project ./tsconfig.build.json","check":"npm run build:clean && npm run typecheck && npm run lint && npm run test","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","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":"rm -rf 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","typecheck:all":"tsc --noEmit && tsc -p example && tsc -p example/convex","prepublishOnly":"npm run build:clean"},"_npmUser":{"name":"gilhrpenner","email":"gilpenner@proton.me"},"repository":{"url":"git+https://github.com/gilhrpenner/convex-files-control.git","type":"git"},"_npmVersion":"11.6.0","description":"A convex files control component for Convex.","directories":{},"_nodeVersion":"24.9.0","dependencies":{"convex-helpers":"^0.1.108","@aws-sdk/client-s3":"^3.958.0","@convex-dev/action-retrier":"^0.3.0","@aws-sdk/s3-request-presigner":"^3.958.0"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"vite":"7.3.0","react":"^19.2.3","convex":"1.31.2","eslint":"9.39.2","vitest":"4.0.16","cpy-cli":"^6.0.0","globals":"^16.5.0","prettier":"3.7.4","react-dom":"^19.2.3","@eslint/js":"9.39.2","pkg-pr-new":"^0.0.62","typescript":"5.9.3","@types/node":"^24.10.4","convex-test":"0.0.41","@types/react":"^19.2.7","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.50.1","@vitest/coverage-v8":"^4.0.16","eslint-plugin-react":"^7.37.5","@vitejs/plugin-react":"^5.1.2","@convex-dev/eslint-plugin":"^1.1.1","eslint-plugin-react-hooks":"^7.0.1","eslint-plugin-react-refresh":"^0.4.26"},"peerDependencies":{"react":"^18.3.1 || ^19.0.0","convex":"^1.29.3"},"_npmOperationalInternal":{"tmp":"tmp/convex-files-control_0.5.1_1767391549529_0.4824650694164603","host":"s3://npm-registry-packages-npm-production"}},"0.5.2":{"name":"@gilhrpenner/convex-files-control","version":"0.5.2","keywords":["convex","component","files","storage","upload","download","access-control"],"license":"Apache-2.0","_id":"@gilhrpenner/convex-files-control@0.5.2","maintainers":[{"name":"gilhrpenner","email":"gilpenner@proton.me"}],"homepage":"https://github.com/gilhrpenner/convex-files-control#readme","bugs":{"url":"https://github.com/gilhrpenner/convex-files-control/issues"},"dist":{"shasum":"b943d18bfe10c7922110b6e37c2184eb36f1e861","tarball":"https://registry.npmjs.org/@gilhrpenner/convex-files-control/-/convex-files-control-0.5.2.tgz","fileCount":157,"integrity":"sha512-Kkpk+tYGbv5O7TUi/ed5U/LlIS1+F2z81moiQ4veqE4XyUoflPxUS3fZRFFMadHGAoHHrVl56dLvCm6IFJs3ag==","signatures":[{"sig":"MEUCIFrRX1CprM/z9BZu6ESe4GrMxyq/gOEduuYqm6BnvT6qAiEA9DgSUl/rLl/AzzNX1ZV2E9s+B4+JuuSpmM15yWxMvXQ=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":647278},"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"},"./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":"631d314f50d5a872818f02e9f73c6961f75ddfef","scripts":{"all":"run-p -r 'dev:*' 'test:watch'","dev":"run-p -r 'dev:*'","lint":"eslint src/","test":"vitest run --typecheck","alpha":"npm version prerelease --preid alpha && npm publish --tag alpha && git push --follow-tags","build":"tsc --project ./tsconfig.build.json","check":"npm run build:clean && npm run typecheck && npm run lint && npm run test && npm run verify:dist-esm","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","preversion":"npm ci && npm run build:clean && run-p test lint typecheck verify:dist-esm","test:debug":"vitest --inspect-brk --no-file-parallelism","test:watch":"vitest --typecheck --clearScreen false","build:clean":"rm -rf 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","typecheck:all":"tsc --noEmit && tsc -p example && tsc -p example/convex","prepublishOnly":"npm run build:clean && npm run verify:dist-esm","verify:dist-esm":"node ./scripts/check-dist-esm.mjs"},"_npmUser":{"name":"gilhrpenner","email":"gilpenner@proton.me"},"repository":{"url":"git+https://github.com/gilhrpenner/convex-files-control.git","type":"git"},"_npmVersion":"11.6.1","description":"A convex files control component for Convex.","directories":{},"_nodeVersion":"24.11.0","dependencies":{"convex-helpers":"^0.1.114","@aws-sdk/client-s3":"^3.1014.0","@aws-crypto/sha256-js":"^5.2.0","@convex-dev/action-retrier":"^0.3.0","@aws-sdk/s3-request-presigner":"^3.1014.0"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"vite":"7.3.0","react":"^19.2.4","convex":"1.34.0","eslint":"9.39.2","vitest":"4.1.0","cpy-cli":"^6.0.0","globals":"^16.5.0","prettier":"3.8.1","react-dom":"^19.2.4","@eslint/js":"9.39.2","pkg-pr-new":"^0.0.66","typescript":"5.9.3","@types/node":"^24.12.0","convex-test":"0.0.43","@types/react":"^19.2.14","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.5","@types/react-dom":"^19.2.3","typescript-eslint":"8.57.1","@vitest/coverage-v8":"^4.1.0","eslint-plugin-react":"^7.37.5","@vitejs/plugin-react":"^5.2.0","@convex-dev/eslint-plugin":"^1.2.1","eslint-plugin-react-hooks":"^7.0.1","eslint-plugin-react-refresh":"^0.4.26"},"peerDependencies":{"react":"^18.3.1 || ^19.0.0","convex":"^1.29.3"},"_npmOperationalInternal":{"tmp":"tmp/convex-files-control_0.5.2_1777242487874_0.9310749661526527","host":"s3://npm-registry-packages-npm-production"}},"0.5.3":{"name":"@gilhrpenner/convex-files-control","version":"0.5.3","keywords":["convex","component","files","storage","upload","download","access-control"],"license":"Apache-2.0","_id":"@gilhrpenner/convex-files-control@0.5.3","maintainers":[{"name":"gilhrpenner","email":"gilpenner@proton.me"}],"homepage":"https://github.com/gilhrpenner/convex-files-control#readme","bugs":{"url":"https://github.com/gilhrpenner/convex-files-control/issues"},"dist":{"shasum":"184e15f7d74c2c11c2242fb31ec7be1282dc201a","tarball":"https://registry.npmjs.org/@gilhrpenner/convex-files-control/-/convex-files-control-0.5.3.tgz","fileCount":157,"integrity":"sha512-+m0G6/6L4LJ16fRVyPw7O5EochrDLiPNC/LhcIc9ha52CE/K9ruTwguQmOlpNQomoChs69KauictSrm9biikMQ==","signatures":[{"sig":"MEUCICBk6BOFwCulNuw1b0zT0BZmafL/03Ciy1ETKvAY2KWOAiEAz+iq6bmKM0P56uDexaiK1aeL+a51ZZ5lDG5Jo7JbRuk=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":652722},"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"},"./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":"0276ec9a835ca187b42da1344c57c38743981308","scripts":{"all":"run-p -r 'dev:*' 'test:watch'","dev":"run-p -r 'dev:*'","lint":"eslint src/","test":"vitest run --typecheck","alpha":"npm version prerelease --preid alpha && npm publish --tag alpha && git push --follow-tags","build":"tsc --project ./tsconfig.build.json","check":"npm run build:clean && npm run typecheck && npm run lint && npm run test && npm run verify:dist-esm","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","preversion":"npm ci && npm run build:clean && run-p test lint typecheck verify:dist-esm","test:debug":"vitest --inspect-brk --no-file-parallelism","test:watch":"vitest --typecheck --clearScreen false","build:clean":"rm -rf 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","typecheck:all":"tsc --noEmit && tsc -p example && tsc -p example/convex","prepublishOnly":"npm run build:clean && npm run verify:dist-esm","verify:dist-esm":"node ./scripts/check-dist-esm.mjs"},"_npmUser":{"name":"gilhrpenner","email":"gilpenner@proton.me"},"repository":{"url":"git+https://github.com/gilhrpenner/convex-files-control.git","type":"git"},"_npmVersion":"11.6.0","description":"A convex files control component for Convex.","directories":{},"_nodeVersion":"24.9.0","dependencies":{"convex-helpers":"^0.1.114","@aws-sdk/client-s3":"^3.1014.0","@aws-crypto/sha256-js":"^5.2.0","@convex-dev/action-retrier":"^0.3.0","@aws-sdk/s3-request-presigner":"^3.1014.0"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"vite":"7.3.0","react":"^19.2.4","convex":"1.34.0","eslint":"9.39.2","vitest":"4.1.0","cpy-cli":"^6.0.0","globals":"^16.5.0","prettier":"3.8.1","react-dom":"^19.2.4","@eslint/js":"9.39.2","pkg-pr-new":"^0.0.66","typescript":"5.9.3","@types/node":"^24.12.0","convex-test":"0.0.43","@types/react":"^19.2.14","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.5","@types/react-dom":"^19.2.3","typescript-eslint":"8.57.1","@vitest/coverage-v8":"^4.1.0","eslint-plugin-react":"^7.37.5","@vitejs/plugin-react":"^5.2.0","@convex-dev/eslint-plugin":"^1.2.1","eslint-plugin-react-hooks":"^7.0.1","eslint-plugin-react-refresh":"^0.4.26"},"peerDependencies":{"react":"^18.3.1 || ^19.0.0","convex":"^1.29.3"},"_npmOperationalInternal":{"tmp":"tmp/convex-files-control_0.5.3_1777432765515_0.8548665559606861","host":"s3://npm-registry-packages-npm-production"}},"0.5.4":{"name":"@gilhrpenner/convex-files-control","version":"0.5.4","keywords":["convex","component","files","storage","upload","download","access-control"],"license":"Apache-2.0","_id":"@gilhrpenner/convex-files-control@0.5.4","maintainers":[{"name":"gilhrpenner","email":"gilpenner@proton.me"}],"homepage":"https://github.com/gilhrpenner/convex-files-control#readme","bugs":{"url":"https://github.com/gilhrpenner/convex-files-control/issues"},"dist":{"shasum":"e685e898d11ca87cc7ca56aee56626106f9e467a","tarball":"https://registry.npmjs.org/@gilhrpenner/convex-files-control/-/convex-files-control-0.5.4.tgz","fileCount":157,"integrity":"sha512-VNaJAG0I9YFNakB7zOSpl2z/kQ6ZtB+z/OwKexl2MWLT4I5JhcKK6zeNFMor4iKS4t0VM55FNN8uBZOELhVwEA==","signatures":[{"sig":"MEUCIEsjW/JHAWQCkE4F7134C2OwL6o0ndxBcBoj4nrXc2ZPAiEA+CLcBGrmr1Hh7CJ7UgpyAJigh1C1RjxTeDKJYi/myGY=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":652763},"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"},"./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":"11b70429f651ad6ff4b6117e8b9f77506ca4329c","scripts":{"all":"run-p -r 'dev:*' 'test:watch'","dev":"run-p -r 'dev:*'","lint":"eslint src/","test":"vitest run --typecheck","alpha":"npm version prerelease --preid alpha && npm publish --tag alpha && git push --follow-tags","build":"tsc --project ./tsconfig.build.json","check":"npm run build:clean && npm run typecheck && npm run lint && npm run test && npm run verify:dist-esm","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","preversion":"npm ci && npm run build:clean && run-p test lint typecheck verify:dist-esm","test:debug":"vitest --inspect-brk --no-file-parallelism","test:watch":"vitest --typecheck --clearScreen false","build:clean":"rm -rf 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","typecheck:all":"tsc --noEmit && tsc -p example && tsc -p example/convex","prepublishOnly":"npm run build:clean && npm run verify:dist-esm","verify:dist-esm":"node ./scripts/check-dist-esm.mjs"},"_npmUser":{"name":"gilhrpenner","email":"gilpenner@proton.me"},"overrides":{"ws":"8.20.1"},"repository":{"url":"git+https://github.com/gilhrpenner/convex-files-control.git","type":"git"},"_npmVersion":"11.12.1","description":"A convex files control component for Convex.","directories":{},"_nodeVersion":"24.15.0","dependencies":{"convex-helpers":"^0.1.118","@aws-sdk/client-s3":"^3.1053.0","@aws-crypto/sha256-js":"^5.2.0","@convex-dev/action-retrier":"^0.3.0","@aws-sdk/s3-request-presigner":"^3.1053.0"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"vite":"7.3.3","react":"^19.2.6","convex":"1.34.0","eslint":"9.39.2","vitest":"4.1.7","cpy-cli":"^6.0.0","globals":"^16.5.0","prettier":"3.8.3","react-dom":"^19.2.6","@eslint/js":"9.39.2","pkg-pr-new":"^0.0.75","typescript":"5.9.3","@types/node":"^24.12.0","convex-test":"0.0.53","@types/react":"^19.2.15","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.5","@types/react-dom":"^19.2.3","typescript-eslint":"8.57.1","@vitest/coverage-v8":"^4.1.7","eslint-plugin-react":"^7.37.5","@vitejs/plugin-react":"^5.2.0","@convex-dev/eslint-plugin":"^1.2.1","eslint-plugin-react-hooks":"^7.0.1","eslint-plugin-react-refresh":"^0.4.26"},"peerDependencies":{"react":"^18.3.1 || ^19.0.0","convex":"^1.29.3"},"_npmOperationalInternal":{"tmp":"tmp/convex-files-control_0.5.4_1779492783931_0.9103720205236672","host":"s3://npm-registry-packages-npm-production"}},"0.5.5":{"name":"@gilhrpenner/convex-files-control","version":"0.5.5","keywords":["convex","component","files","storage","upload","download","access-control"],"license":"Apache-2.0","_id":"@gilhrpenner/convex-files-control@0.5.5","maintainers":[{"name":"gilhrpenner","email":"gilpenner@proton.me"}],"homepage":"https://github.com/gilhrpenner/convex-files-control#readme","bugs":{"url":"https://github.com/gilhrpenner/convex-files-control/issues"},"dist":{"shasum":"661ab54ae0fa915b21129a0445271d8629b9407c","tarball":"https://registry.npmjs.org/@gilhrpenner/convex-files-control/-/convex-files-control-0.5.5.tgz","fileCount":157,"integrity":"sha512-Orba7uFU7tCbyheQ5TcY910opOremw05FQH+fjfAjyAiqL/oRliZX4yqKEaha3Rr6ezn6IMp1yKq3+OCwf3ryA==","signatures":[{"sig":"MEUCIQDN9PUwfcTHCo6M5itNSQuCIMRtFvED0770pjNKOaGyAwIge8JrOZM0f1iheSJp+5+p8NC4qE4Wet06m5WK4WzIYHQ=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":652767},"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"},"./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":"a661c5c93b4a9e04b1619b35e05f67ccf8c2301b","scripts":{"all":"run-p -r 'dev:*' 'test:watch'","dev":"run-p -r 'dev:*'","lint":"eslint src/","test":"vitest run --typecheck","alpha":"npm version prerelease --preid alpha && npm publish --tag alpha && git push --follow-tags","build":"tsc --project ./tsconfig.build.json","check":"npm run build:clean && npm run typecheck && npm run lint && npm run test && npm run verify:dist-esm","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","preversion":"npm ci && npm run build:clean && run-p test lint typecheck verify:dist-esm","test:debug":"vitest --inspect-brk --no-file-parallelism","test:watch":"vitest --typecheck --clearScreen false","build:clean":"rm -rf 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","typecheck:all":"tsc --noEmit && tsc -p example && tsc -p example/convex","prepublishOnly":"npm run build:clean && npm run verify:dist-esm","verify:dist-esm":"node ./scripts/check-dist-esm.mjs"},"_npmUser":{"name":"gilhrpenner","email":"gilpenner@proton.me"},"overrides":{"ws":"8.20.1"},"repository":{"url":"git+https://github.com/gilhrpenner/convex-files-control.git","type":"git"},"_npmVersion":"11.12.1","description":"A convex files control component for Convex.","directories":{},"_nodeVersion":"24.15.0","dependencies":{"convex-helpers":"^0.1.118","@aws-sdk/client-s3":"^3.1053.0","@aws-crypto/sha256-js":"^5.2.0","@convex-dev/action-retrier":"^0.3.0","@aws-sdk/s3-request-presigner":"^3.1053.0"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"vite":"7.3.3","react":"^19.2.6","convex":"1.40.0","eslint":"9.39.2","vitest":"4.1.7","cpy-cli":"^6.0.0","globals":"^16.5.0","prettier":"3.8.3","react-dom":"^19.2.6","@eslint/js":"9.39.2","pkg-pr-new":"^0.0.75","typescript":"5.9.3","@types/node":"^24.12.0","convex-test":"0.0.53","@types/react":"^19.2.15","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.5","@types/react-dom":"^19.2.3","typescript-eslint":"8.57.1","@vitest/coverage-v8":"^4.1.7","eslint-plugin-react":"^7.37.5","@vitejs/plugin-react":"^5.2.0","@convex-dev/eslint-plugin":"^1.2.1","eslint-plugin-react-hooks":"^7.0.1","eslint-plugin-react-refresh":"^0.4.26"},"peerDependencies":{"react":"^18.3.1 || ^19.0.0","convex":"^1.29.3"},"_npmOperationalInternal":{"tmp":"tmp/convex-files-control_0.5.5_1780432558659_0.9598258419524244","host":"s3://npm-registry-packages-npm-production"}},"0.5.6":{"name":"@gilhrpenner/convex-files-control","version":"0.5.6","keywords":["convex","component","files","storage","upload","download","access-control"],"license":"Apache-2.0","_id":"@gilhrpenner/convex-files-control@0.5.6","maintainers":[{"name":"gilhrpenner","email":"gilpenner@proton.me"}],"homepage":"https://github.com/gilhrpenner/convex-files-control#readme","bugs":{"url":"https://github.com/gilhrpenner/convex-files-control/issues"},"dist":{"shasum":"1f434713224de582b07dd761c0241965d7a25148","tarball":"https://registry.npmjs.org/@gilhrpenner/convex-files-control/-/convex-files-control-0.5.6.tgz","fileCount":158,"integrity":"sha512-Gk5rGK08R55gjj4hspC2ymIQR/9A8c/4zGZYRgSbQbVHOTyjArROlTqk2lNnBO/v2cD1Oo4leJ5cfeRk0KUnLw==","signatures":[{"sig":"MEYCIQCqb6ZxA4GBcsNAVB5lZTmcgvUUFxOKM6FlsEGWhBQwKAIhALQjq4bWnUSo1E64NqwVldTzk+BzQKPtCEMzQYy09zRr","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":653625},"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"},"./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":"c386604b7c9a73a997b9b14cf3dc1d23f85ff82c","scripts":{"all":"run-p -r 'dev:*' 'test:watch'","dev":"run-p -r 'dev:*'","lint":"eslint src/","test":"vitest run --typecheck","alpha":"npm version prerelease --preid alpha && npm publish --tag alpha && git push --follow-tags","build":"tsc --project ./tsconfig.build.json","check":"npm run build:clean && npm run typecheck && npm run lint && npm run test && npm run verify:dist-esm","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","preversion":"npm ci && npm run build:clean && run-p test lint typecheck verify:dist-esm","test:debug":"vitest --inspect-brk --no-file-parallelism","test:watch":"vitest --typecheck --clearScreen false","build:clean":"rm -rf 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","typecheck:all":"tsc --noEmit && tsc -p example && tsc -p example/convex","prepublishOnly":"npm run build:clean && npm run verify:dist-esm","verify:dist-esm":"node ./scripts/check-dist-esm.mjs"},"_npmUser":{"name":"gilhrpenner","email":"gilpenner@proton.me"},"overrides":{"ws":"8.20.1"},"repository":{"url":"git+https://github.com/gilhrpenner/convex-files-control.git","type":"git"},"_npmVersion":"11.13.0","description":"A convex files control component for Convex.","directories":{},"_nodeVersion":"24.16.0","dependencies":{"convex-helpers":"^0.1.118","@aws-sdk/client-s3":"^3.1053.0","@aws-crypto/sha256-js":"^5.2.0","@convex-dev/action-retrier":"^0.3.0","@aws-sdk/s3-request-presigner":"^3.1053.0"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"vite":"8.0.16","react":"^19.2.6","convex":"1.41.0","eslint":"9.39.2","vitest":"4.1.7","cpy-cli":"^6.0.0","globals":"^16.5.0","prettier":"3.8.3","react-dom":"^19.2.6","@eslint/js":"9.39.2","pkg-pr-new":"^0.0.75","typescript":"5.9.3","@types/node":"^24.12.0","convex-test":"0.0.53","@types/react":"^19.2.15","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.5","@types/react-dom":"^19.2.3","typescript-eslint":"8.57.1","@vitest/coverage-v8":"^4.1.7","eslint-plugin-react":"^7.37.5","@vitejs/plugin-react":"^5.2.0","@convex-dev/eslint-plugin":"^1.2.1","eslint-plugin-react-hooks":"^7.0.1","eslint-plugin-react-refresh":"^0.4.26"},"peerDependencies":{"react":"^18.3.1 || ^19.0.0","convex":"^1.29.3"},"_npmOperationalInternal":{"tmp":"tmp/convex-files-control_0.5.6_1781241340386_0.310206608926628","host":"s3://npm-registry-packages-npm-production"}},"0.5.7":{"name":"@gilhrpenner/convex-files-control","version":"0.5.7","keywords":["convex","component","files","storage","upload","download","access-control"],"license":"Apache-2.0","_id":"@gilhrpenner/convex-files-control@0.5.7","maintainers":[{"name":"gilhrpenner","email":"gilpenner@proton.me"}],"homepage":"https://github.com/gilhrpenner/convex-files-control#readme","bugs":{"url":"https://github.com/gilhrpenner/convex-files-control/issues"},"dist":{"shasum":"b37cdd1b7f616ec1093291b6f53c0932cee4fbfc","tarball":"https://registry.npmjs.org/@gilhrpenner/convex-files-control/-/convex-files-control-0.5.7.tgz","fileCount":158,"integrity":"sha512-P0qj658jf8K/lfHOUd2iVbw8gwBijnosBq6CbnErLxZweMKbAcJlTKkIUJKiR8U7+rYL/vVdtCFZheT/2ePD7w==","signatures":[{"sig":"MEUCIQCly95cFsQqKLmVCE5br7b6yepB3EwHNc//QfVS0FiswgIgVNf7NgwN7O/j7190AcGJ6Xtwese8Rd1Zgwj5hgwaWr8=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":657051},"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"},"./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":"749775aca0299c4c445f71f99064c45be000fbe4","scripts":{"all":"run-p -r 'dev:*' 'test:watch'","dev":"run-p -r 'dev:*'","lint":"eslint src/","test":"vitest run --typecheck","alpha":"npm version prerelease --preid alpha && npm publish --tag alpha && git push --follow-tags","build":"tsc --project ./tsconfig.build.json","check":"npm run build:clean && npm run typecheck && npm run lint && npm run test && npm run verify:dist-esm","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","preversion":"npm ci && npm run build:clean && run-p test lint typecheck verify:dist-esm","test:debug":"vitest --inspect-brk --no-file-parallelism","test:watch":"vitest --typecheck --clearScreen false","build:clean":"rm -rf 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","typecheck:all":"tsc --noEmit && tsc -p example && tsc -p example/convex","prepublishOnly":"npm run build:clean && npm run verify:dist-esm","verify:dist-esm":"node ./scripts/check-dist-esm.mjs"},"_npmUser":{"name":"gilhrpenner","email":"gilpenner@proton.me"},"overrides":{"ws":"8.20.1"},"repository":{"url":"git+https://github.com/gilhrpenner/convex-files-control.git","type":"git"},"_npmVersion":"11.13.0","description":"A convex files control component for Convex.","directories":{},"_nodeVersion":"24.16.0","dependencies":{"convex-helpers":"^0.1.118","@aws-sdk/client-s3":"^3.1053.0","@aws-crypto/sha256-js":"^5.2.0","@convex-dev/action-retrier":"^0.3.0","@aws-sdk/s3-request-presigner":"^3.1053.0"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"vite":"8.1.5","react":"^19.2.6","convex":"1.41.0","eslint":"9.39.2","vitest":"4.1.7","cpy-cli":"^6.0.0","globals":"^16.5.0","prettier":"3.8.3","react-dom":"^19.2.6","@eslint/js":"9.39.2","pkg-pr-new":"^0.0.75","typescript":"5.9.3","@types/node":"^24.12.0","convex-test":"0.0.53","@types/react":"^19.2.15","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.5","@types/react-dom":"^19.2.3","typescript-eslint":"8.57.1","@vitest/coverage-v8":"^4.1.7","eslint-plugin-react":"^7.37.5","@vitejs/plugin-react":"^5.2.0","@convex-dev/eslint-plugin":"^1.2.1","eslint-plugin-react-hooks":"^7.0.1","eslint-plugin-react-refresh":"^0.4.26"},"peerDependencies":{"react":"^18.3.1 || ^19.0.0","convex":"^1.29.3"},"_npmOperationalInternal":{"tmp":"tmp/convex-files-control_0.5.7_1785722044314_0.07225070343431717","host":"s3://npm-registry-packages-npm-production"}},"0.5.8":{"name":"@gilhrpenner/convex-files-control","version":"0.5.8","keywords":["convex","component","files","storage","upload","download","access-control"],"license":"Apache-2.0","_id":"@gilhrpenner/convex-files-control@0.5.8","maintainers":[{"name":"gilhrpenner","email":"gilpenner@proton.me"}],"homepage":"https://github.com/gilhrpenner/convex-files-control#readme","bugs":{"url":"https://github.com/gilhrpenner/convex-files-control/issues"},"dist":{"shasum":"33032af7aa33010d5c58f530e922cdd453704eae","tarball":"https://registry.npmjs.org/@gilhrpenner/convex-files-control/-/convex-files-control-0.5.8.tgz","fileCount":158,"integrity":"sha512-COtGjor/5K8d39f+VSe4BxnSPgSnOrkn05CXRxV4U6I4/3kO0c8kCbcQQvezYCySz9FrQ6spuXQVBLNk6aKTzQ==","signatures":[{"sig":"MEQCIDZ8zaLerStEfscszrVVzJCs8az8kUeGQF1voFb0ZOXNAiBnoRY4xCk/82SSmDBledyuKTEvm7RN/HrP0EALM436xA==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":665116},"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"},"./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":"ae4b29085690f9b59b67ee1da122fda4364c8028","scripts":{"all":"run-p -r 'dev:*' 'test:watch'","dev":"run-p -r 'dev:*'","lint":"eslint src/","test":"vitest run --typecheck","alpha":"npm version prerelease --preid alpha && npm publish --tag alpha && git push --follow-tags","build":"tsc --project ./tsconfig.build.json","check":"npm run build:clean && npm run typecheck && npm run lint && npm run test && npm run verify:dist-esm","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","preversion":"npm ci && npm run build:clean && run-p test lint typecheck verify:dist-esm","test:debug":"vitest --inspect-brk --no-file-parallelism","test:watch":"vitest --typecheck --clearScreen false","build:clean":"rm -rf 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","typecheck:all":"tsc --noEmit && tsc -p example && tsc -p example/convex","prepublishOnly":"npm run build:clean && npm run verify:dist-esm","verify:dist-esm":"node ./scripts/check-dist-esm.mjs"},"_npmUser":{"name":"gilhrpenner","email":"gilpenner@proton.me"},"overrides":{"ws":"8.20.1"},"repository":{"url":"git+https://github.com/gilhrpenner/convex-files-control.git","type":"git"},"_npmVersion":"11.13.0","description":"A convex files control component for Convex.","directories":{},"_nodeVersion":"24.16.0","dependencies":{"convex-helpers":"^0.1.118","@aws-sdk/client-s3":"^3.1053.0","@aws-crypto/sha256-js":"^5.2.0","@convex-dev/action-retrier":"^0.3.0","@aws-sdk/s3-request-presigner":"^3.1053.0"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"vite":"8.2.1","react":"^19.2.6","convex":"1.41.0","eslint":"9.39.2","vitest":"4.1.7","cpy-cli":"^6.0.0","globals":"^16.5.0","prettier":"3.8.3","react-dom":"^19.2.6","@eslint/js":"9.39.2","pkg-pr-new":"^0.0.75","typescript":"5.9.3","@types/node":"^24.12.0","convex-test":"0.0.53","@types/react":"^19.2.15","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.5","@types/react-dom":"^19.2.3","typescript-eslint":"8.57.1","@vitest/coverage-v8":"^4.1.7","eslint-plugin-react":"^7.37.5","@vitejs/plugin-react":"^5.2.0","@convex-dev/eslint-plugin":"^1.2.1","eslint-plugin-react-hooks":"^7.0.1","eslint-plugin-react-refresh":"^0.4.26"},"peerDependencies":{"react":"^18.3.1 || ^19.0.0","convex":"^1.29.3"},"_npmOperationalInternal":{"tmp":"tmp/convex-files-control_0.5.8_1787716710399_0.3499287235612758","host":"s3://npm-registry-packages-npm-production"}},"0.5.9":{"_id":"@gilhrpenner/convex-files-control@0.5.9","bugs":{"url":"https://github.com/gilhrpenner/convex-files-control/issues"},"dist":{"shasum":"cb69a25eb5cb992f13fbc65d0c268d7b86b6f5ee","tarball":"https://registry.npmjs.org/@gilhrpenner/convex-files-control/-/convex-files-control-0.5.9.tgz","fileCount":158,"integrity":"sha512-f4M64YHrUlGuWnTp3DjLXNA4GSjqOZ4L0l/5RjCLcwk3bZRAVgbICGkOBqnXwDbA2UG6AaL3c8QEW34SFx3V3g==","signatures":[{"sig":"MEUCIQC4HA1yk9+FfNSg5CKvgH9l/9T+1xRdT3A0VnA/tnBg4QIgA+Zv7Ov2G9otFwHjSbHpzXLXWydlNsh8G3FZ8J5bveQ=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U","sig":"MEYCIQD6IyHHtz2Bi/ALuOgGH/RuCwMV0zM7DaQS9k17qZAlPwIhAM1MOSZKP/fyYiiHszBKW2u2a0w1NlGcwtWAWOtGGDAD"}],"unpackedSize":663769},"name":"@gilhrpenner/convex-files-control","type":"module","_from":"file:/tmp/gilhrpenner-convex-files-control-0.5.9.tgz","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"},"./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"}},"license":"Apache-2.0","scripts":{"all":"run-p -r 'dev:*' 'test:watch'","dev":"run-p -r 'dev:*'","lint":"eslint src/","test":"vitest run --typecheck","alpha":"npm version prerelease --preid alpha && npm publish --tag alpha && git push --follow-tags","build":"tsc --project ./tsconfig.build.json","check":"npm run build:clean && npm run typecheck && npm run lint && npm run test && npm run verify:dist-esm","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","preversion":"npm ci && npm run build:clean && run-p test lint typecheck verify:dist-esm","test:debug":"vitest --inspect-brk --no-file-parallelism","test:watch":"vitest --typecheck --clearScreen false","build:clean":"rm -rf 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","typecheck:all":"tsc --noEmit && tsc -p example && tsc -p example/convex","prepublishOnly":"npm run build:clean && npm run verify:dist-esm","verify:dist-esm":"node ./scripts/check-dist-esm.mjs"},"version":"0.5.9","_npmUser":{"name":"gilhrpenner","email":"gilpenner@proton.me"},"homepage":"https://github.com/gilhrpenner/convex-files-control#readme","keywords":["convex","component","files","storage","upload","download","access-control"],"_resolved":"/tmp/gilhrpenner-convex-files-control-0.5.9.tgz","overrides":{"ws":"8.20.1"},"_integrity":"sha512-f4M64YHrUlGuWnTp3DjLXNA4GSjqOZ4L0l/5RjCLcwk3bZRAVgbICGkOBqnXwDbA2UG6AaL3c8QEW34SFx3V3g==","repository":{"url":"git+https://github.com/gilhrpenner/convex-files-control.git","type":"git"},"_npmVersion":"11.19.0","description":"A convex files control component for Convex.","directories":{},"maintainers":[{"name":"gilhrpenner","email":"gilpenner@proton.me"}],"_nodeVersion":"26.8.1","dependencies":{"convex-helpers":"^0.1.118","@aws-sdk/client-s3":"^3.1053.0","@aws-crypto/sha256-js":"^5.2.0","@convex-dev/action-retrier":"^0.3.0","@aws-sdk/s3-request-presigner":"^3.1053.0"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"vite":"8.2.1","react":"^19.2.6","convex":"1.45.0","eslint":"9.39.2","vitest":"4.1.7","cpy-cli":"^6.0.0","globals":"^16.5.0","prettier":"3.8.3","react-dom":"^19.2.6","@eslint/js":"9.39.2","pkg-pr-new":"^0.0.75","typescript":"5.9.3","@types/node":"^24.12.0","convex-test":"0.0.59","@types/react":"^19.2.15","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.5","@types/react-dom":"^19.2.3","typescript-eslint":"8.57.1","@vitest/coverage-v8":"^4.1.7","eslint-plugin-react":"^7.37.5","@vitejs/plugin-react":"^5.2.0","@convex-dev/eslint-plugin":"^1.2.1","eslint-plugin-react-hooks":"^7.0.1","eslint-plugin-react-refresh":"^0.4.26"},"peerDependencies":{"react":"^18.3.1 || ^19.0.0","convex":"^1.29.3"},"_npmOperationalInternal":{"host":"s3://npm-registry-packages-npm-production","tmp":"tmp/convex-files-control_0.5.9_1790226134843_0.45466785149809485"}}},"time":{"created":"2025-12-29T02:06:55.881Z","modified":"2026-09-24T05:02:15.124Z","0.1.0":"2025-12-26T21:29:56.254Z","0.1.1":"2025-12-29T02:06:56.110Z","0.2.0":"2025-12-29T17:44:11.975Z","0.3.0":"2025-12-31T19:22:21.313Z","0.4.0":"2026-01-01T21:40:41.957Z","0.5.0":"2026-01-02T06:46:54.990Z","0.5.1":"2026-01-02T22:05:49.694Z","0.5.2":"2026-04-26T22:28:08.149Z","0.5.3":"2026-04-29T03:19:25.705Z","0.5.4":"2026-05-22T23:33:04.104Z","0.5.5":"2026-06-02T20:35:58.803Z","0.5.6":"2026-06-12T05:15:40.521Z","0.5.7":"2026-08-03T01:54:04.458Z","0.5.8":"2026-08-26T03:58:30.574Z","0.5.9":"2026-09-24T05:02:14.979Z"},"bugs":{"url":"https://github.com/gilhrpenner/convex-files-control/issues"},"license":"Apache-2.0","homepage":"https://github.com/gilhrpenner/convex-files-control#readme","keywords":["convex","component","files","storage","upload","download","access-control"],"repository":{"url":"git+https://github.com/gilhrpenner/convex-files-control.git","type":"git"},"description":"A convex files control component for Convex.","maintainers":[{"name":"gilhrpenner","email":"gilpenner@proton.me"}],"readme":"# Convex Files Control\n\nA Convex component for secure file uploads, access control, download grants, and\nlifecycle cleanup. Works with Convex storage and Cloudflare R2, and ships with\nan optional HTTP upload/download router plus a React upload hook.\n\n**[Live Demo →](https://convex-files-control-example.pages.dev)**\n\n## Features\n\n- Two-step uploads (presigned URL) with access keys and optional expiration.\n- Optional HTTP upload/download routes with auth hooks.\n- Download grants with max uses, expiration, optional password, and shareable\n  links.\n- Access-key based authorization (user IDs, tenant IDs, etc.).\n- Built-in cleanup for expired uploads, grants, and files.\n- Transfer files between Convex and R2.\n- React hook for presigned or HTTP uploads.\n\n## Install\n\n```bash\nnpm install @gilhrpenner/convex-files-control\n```\n\n## Quick start\n\n### 1) Add the component\n\n```ts\n// convex.config.ts\nimport { defineApp } from \"convex/server\";\nimport convexFilesControl from \"@gilhrpenner/convex-files-control/convex.config\";\n\nconst app = defineApp();\napp.use(convexFilesControl);\n\nexport default app;\n```\n\n### 2) Create wrapper functions in your app\n\nThe component stores access control and download grants. Your app should store\nits own file metadata (name, owner, etc.) and enforce auth. The wrappers below\nmirror the example app in `example/convex/files.ts`.\n\n```ts\n// convex/files.ts\nimport { ConvexError, v } from \"convex/values\";\nimport { mutation } from \"./_generated/server\";\nimport { components } from \"./_generated/api\";\n\nexport const generateUploadUrl = mutation({\n  args: {\n    provider: v.union(v.literal(\"convex\"), v.literal(\"r2\")),\n  },\n  handler: async (ctx, args) => {\n    const identity = await ctx.auth.getUserIdentity();\n    if (!identity) throw new ConvexError(\"Unauthorized\");\n\n    return await ctx.runMutation(\n      components.convexFilesControl.upload.generateUploadUrl,\n      {\n        provider: args.provider,\n        // r2Config: { accountId, accessKeyId, secretAccessKey, bucketName },\n      },\n    );\n  },\n});\n\nexport const finalizeUpload = mutation({\n  args: {\n    uploadToken: v.string(),\n    storageId: v.string(),\n    fileName: v.string(),\n    expiresAt: v.optional(v.union(v.null(), v.number())),\n    metadata: v.optional(\n      v.object({\n        size: v.number(),\n        sha256: v.string(),\n        contentType: v.union(v.string(), v.null()),\n      }),\n    ),\n  },\n  handler: async (ctx, args) => {\n    const identity = await ctx.auth.getUserIdentity();\n    if (!identity) throw new ConvexError(\"Unauthorized\");\n\n    const { fileName, ...componentArgs } = args;\n    const result = await ctx.runMutation(\n      components.convexFilesControl.upload.finalizeUpload,\n      {\n        ...componentArgs,\n        accessKeys: [identity.subject],\n      },\n    );\n\n    // Store your own file record (name, owner, etc.) here.\n    // await ctx.db.insert(\"files\", { ... });\n\n    return result;\n  },\n});\n```\n\n### 3) Optional HTTP routes\n\nIf you want `/files/upload` and `/files/download`, register the router in\n`convex/http.ts`. Access keys are provided by your hook (not via the form).\n\n```ts\n// convex/http.ts\nimport { httpRouter } from \"convex/server\";\nimport { registerRoutes } from \"@gilhrpenner/convex-files-control\";\nimport { components } from \"./_generated/api\";\n\nconst http = httpRouter();\n\nregisterRoutes(http, components.convexFilesControl, {\n  pathPrefix: \"files\",\n  enableUploadRoute: true,\n\n  // Required when enableUploadRoute is true\n  checkUploadRequest: async (ctx) => {\n    const identity = await ctx.auth.getUserIdentity();\n    if (!identity) {\n      return new Response(JSON.stringify({ error: \"Unauthorized\" }), {\n        status: 401,\n        headers: { \"Content-Type\": \"application/json\" },\n      });\n    }\n\n    return { accessKeys: [identity.subject] };\n  },\n\n  // Optional: persist file metadata after a successful HTTP upload\n  onUploadComplete: async (ctx, { result, file, formData }) => {\n    const fileNameFromForm = formData.get(\"fileName\");\n    const fileName =\n      typeof fileNameFromForm === \"string\"\n        ? fileNameFromForm\n        : ((file as File).name ?? \"untitled\");\n    // await ctx.runMutation(api.files.recordUpload, { ...result, fileName });\n  },\n\n  // Optional: provide accessKey for downloads\n  checkDownloadRequest: async (ctx) => {\n    const identity = await ctx.auth.getUserIdentity();\n    if (identity) return { accessKey: identity.subject };\n  },\n});\n\nexport default http;\n```\n\nHTTP upload requires `multipart/form-data` with fields:\n\n- `file` (required)\n- `provider` (optional, \"convex\" | \"r2\")\n- `expiresAt` (optional, timestamp or `null`)\n\nAccess keys are not accepted via the form; they must come from\n`checkUploadRequest`. Additional form fields are available on `onUploadComplete`\nvia `formData`.\n\nUseful route options:\n\n- `pathPrefix` (default: `/files`)\n- `defaultUploadProvider` (`\\\"convex\\\"` or `\\\"r2\\\"`)\n- `enableDownloadRoute` (default: `true`)\n- `requireAccessKey` (force `checkDownloadRequest` to return an access key)\n- `passwordHeader` / `passwordQueryParam` (override or disable password inputs)\n- `cors` (exact browser origins and allowed headers; other browser origins\n  receive `403`)\n\n```ts\nregisterRoutes(http, components.convexFilesControl, {\n  cors: {\n    allowedOrigins: [\"https://app.example.com\"],\n    allowedHeaders: [\"Authorization\", \"Content-Type\"],\n    allowCredentials: false,\n  },\n});\n```\n\nRequests without an `Origin` header continue to work. If `cors` is omitted, the\nexisting permissive CORS behavior remains unchanged.\n\n## Uploading files\n\n### Presigned URL flow\n\n```ts\n// Client-side\nconst { uploadUrl, uploadToken } = await generateUploadUrl({\n  provider: \"convex\",\n});\n\nconst uploadResponse = await fetch(uploadUrl, {\n  method: \"POST\",\n  body: file,\n  headers: { \"Content-Type\": file.type || \"application/octet-stream\" },\n});\n\nconst { storageId } = await uploadResponse.json();\n\nconst result = await finalizeUpload({\n  uploadToken,\n  storageId,\n  fileName: file.name,\n  expiresAt: Date.now() + 60 * 60 * 1000,\n});\n```\n\n### React hook\n\n```tsx\nimport { useUploadFile } from \"@gilhrpenner/convex-files-control/react\";\nimport { api } from \"../convex/_generated/api\";\n\nconst convexSiteUrl = import.meta.env.VITE_CONVEX_URL.replace(\n  \".cloud\",\n  \".site\",\n);\n\nconst { uploadFile } = useUploadFile(api.files, {\n  method: \"presigned\",\n  http: { baseUrl: convexSiteUrl },\n});\n\n// Presigned\nawait uploadFile({ file, provider: \"convex\" });\n\n// HTTP route\nawait uploadFile({\n  file,\n  method: \"http\",\n  provider: \"convex\",\n  http: {\n    baseUrl: convexSiteUrl,\n    // authToken: useAuthToken() from @convex-dev/auth/react\n  },\n});\n```\n\n`uploadFile` accepts:\n\n- `file` (required)\n- `provider` (\"convex\" | \"r2\")\n- `expiresAt` (timestamp or `null`)\n- `method` (\"presigned\" | \"http\")\n\n## Downloading files\n\n### Create a grant + build a URL\n\n```ts\nimport { buildDownloadUrl } from \"@gilhrpenner/convex-files-control\";\n\nconst grant = await ctx.runMutation(\n  components.convexFilesControl.download.createDownloadGrant,\n  {\n    storageId,\n    maxUses: 1,\n    expiresAt: Date.now() + 10 * 60 * 1000,\n    shareableLink: false,\n  },\n);\n\nconst url = buildDownloadUrl({\n  baseUrl: \"https://<your-convex-site>\",\n  downloadToken: grant.downloadToken,\n  filename: \"report.pdf\",\n  // pathPrefix: \"/files\", // Optional if you changed the HTTP route prefix\n});\n```\n\nAccess keys are not placed in the URL. For private grants, supply them via\n`checkDownloadRequest` (HTTP route) or pass `accessKey` when calling\n`consumeDownloadGrantForUrl`.\n\n### Shareable links\n\nSet `shareableLink: true` to allow unauthenticated downloads (no access key\nrequired). This is how the example app generates public links. If you enable\n`requireAccessKey` on the HTTP route, shareable links will still require\n`checkDownloadRequest` to return an access key.\n\n### Password-protected grants\n\n```ts\nconst grant = await ctx.runMutation(\n  components.convexFilesControl.download.createDownloadGrant,\n  { storageId, password: \"secret-passphrase\" },\n);\n```\n\nTo consume a password-protected grant, pass `password` to\n`consumeDownloadGrantForUrl`, or send it to the HTTP route via the\n`x-download-password` header (preferred) or the `password` query param. Query\nparams can leak into logs, so headers or POST flows are safer.\n\n## Access control & queries\n\nAccess keys are normalized (trimmed) and must contain at least one non-empty\nvalue.\n\n- `accessControl.addAccessKey(storageId, accessKey)`\n- `accessControl.removeAccessKey(storageId, accessKey)`\n- `accessControl.updateFileExpiration(storageId, expiresAt)`\n- `queries.hasAccessKey(storageId, accessKey)`\n- `queries.listAccessKeysPage(storageId, paginationOpts)`\n- `queries.listFilesPage(paginationOpts)`\n- `queries.listFilesByAccessKeyPage(accessKey, paginationOpts)`\n- `queries.listDownloadGrantsPage(paginationOpts)`\n- `queries.getFile({ storageId })`\n\nPagination uses `{ numItems: number, cursor: string | null }`.\n\n## Cleanup\n\nUse `cleanUp.cleanupExpired` to delete expired uploads, grants, and files. The\nexample app wraps this in a mutation and runs it in a cron job.\n\n```ts\n// convex/crons.ts\nimport { cronJobs } from \"convex/server\";\nimport { internal } from \"./_generated/api\";\n\nconst crons = cronJobs();\ncrons.hourly(\n  \"cleanup-expired-files\",\n  { minuteUTC: 0 },\n  internal.files.cleanupExpiredFiles,\n  {},\n);\nexport default crons;\n```\n\n## Server-side helper (FilesControl)\n\nIf you prefer a class wrapper around component calls, use `FilesControl`:\n\n```ts\nimport { FilesControl } from \"@gilhrpenner/convex-files-control\";\nimport { components } from \"./_generated/api\";\n\nconst files = new FilesControl(components.convexFilesControl, {\n  // r2: { accountId, accessKeyId, secretAccessKey, bucketName, jurisdiction },\n});\n\nawait files.generateUploadUrl(ctx, { provider: \"convex\" });\n```\n\n`FilesControl.clientApi()` also returns a ready-to-export API surface with\noptional hooks if you want the component to generate your Convex mutations and\nqueries for you.\n\n## R2 configuration\n\nProvide R2 credentials when you use R2 for uploads, downloads, deletes, or\ntransfers. You can pass `r2Config` to the component calls or supply env vars for\nthe HTTP routes:\n\n- `R2_ACCOUNT_ID`\n- `R2_ACCESS_KEY_ID`\n- `R2_SECRET_ACCESS_KEY`\n- `R2_BUCKET_NAME`\n- `R2_JURISDICTION` (optional, for example `eu` or `fedramp`)\n\nSet `R2_JURISDICTION` only when your bucket was created with a Cloudflare R2\njurisdiction. See Cloudflare's\n[data location docs](https://developers.cloudflare.com/r2/reference/data-location/#using-jurisdictions-with-the-s3-api)\nfor the supported jurisdiction values and S3 endpoint format.\n\n## Transfer between providers\n\n```ts\nconst result = await ctx.runAction(\n  components.convexFilesControl.transfer.transferFile,\n  { storageId, targetProvider: \"r2\", r2Config },\n);\n```\n\nThe transfer preserves access keys and download grants, updates the file record,\nand deletes the original storage object.\n\n## Testing helper\n\n```ts\nimport { convexTest } from \"convex-test\";\nimport { register } from \"@gilhrpenner/convex-files-control/test\";\n\nconst t = convexTest(schema, modules);\nregister(t, \"convexFilesControl\");\n```\n\n## Example app\n\n**[Live Demo →](https://convex-files-control-example.pages.dev)**\n\nA full Convex + React + Convex Auth implementation lives in `example/`. It\ndemonstrates:\n\n- presigned and HTTP uploads\n- authenticated downloads and shareable links\n- access key management\n- transfer between Convex and R2\n- scheduled cleanup\n","readmeFilename":"README.md"}