{"_id":"@abdssamie/convex-checkpoints","_rev":"5-110b1f928ddeebb1f562cb7aa202b424","name":"@abdssamie/convex-checkpoints","dist-tags":{"latest":"0.1.9"},"versions":{"0.1.1":{"name":"@abdssamie/convex-checkpoints","version":"0.1.1","keywords":["convex","component","events","checkpoints"],"license":"Apache-2.0","_id":"@abdssamie/convex-checkpoints@0.1.1","maintainers":[{"name":"abdessamie","email":"abdessamie.elmoubarki@gmail.com"}],"homepage":"https://github.com/abdssamie/convex-checkpoints#readme","bugs":{"url":"https://github.com/abdssamie/convex-checkpoints/issues"},"dist":{"shasum":"803100fe241e50e1d6133a3c94df862b54655a3e","tarball":"https://registry.npmjs.org/@abdssamie/convex-checkpoints/-/convex-checkpoints-0.1.1.tgz","fileCount":59,"integrity":"sha512-3X8N2EDGJgNr4Fi40cnyqcm+bsQXptezHVnX8fo3jKwJOvoS1X7r5jkXKiRjwlGUDysxpjiU4vk2aG8OGqlypg==","signatures":[{"sig":"MEUCIEEHRToH+aN2KTro5OwJcCVQ4vlONudAaC4jcJz4k0w8AiEA5psdAlS63FTEZAqYwryd+7ioosagqFzWNeTjUKRhlE0=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":103697},"type":"module","_from":"file:abdssamie-convex-checkpoints-0.1.1.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","./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"}},"scripts":{"dev":"convex dev --start 'npm run dev:build'","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":"convex init && npm run build:codegen","release":"npm version patch && npm publish && git push --follow-tags","version":"(npm whoami || npm login) && 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 && npm run test && npm run lint && npm run 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:frontend":"cd example && vite","build:codegen":"npx convex codegen --component-dir ./src/component && npm run build","test:coverage":"vitest run --coverage --coverage.reporter=text"},"_npmUser":{"name":"abdessamie","email":"abdessamie.elmoubarki@gmail.com"},"_resolved":"/tmp/f797771726a543ad9d34252b316a006d/abdssamie-convex-checkpoints-0.1.1.tgz","_integrity":"sha512-3X8N2EDGJgNr4Fi40cnyqcm+bsQXptezHVnX8fo3jKwJOvoS1X7r5jkXKiRjwlGUDysxpjiU4vk2aG8OGqlypg==","repository":{"url":"git+https://github.com/abdssamie/convex-checkpoints.git","type":"git"},"_npmVersion":"11.12.1","description":"A Convex component for event-driven user checkpoints.","directories":{},"_nodeVersion":"24.15.0","_hasShrinkwrap":false,"devDependencies":{"vite":"8.0.9","react":"^19.2.5","convex":"1.36.1","eslint":"9.39.4","vitest":"4.1.4","globals":"^17.5.0","prettier":"3.8.3","react-dom":"^19.2.5","@eslint/js":"9.39.4","pkg-pr-new":"^0.0.66","typescript":"6.0.3","@types/node":"^24.12.2","convex-test":"0.0.49","@types/react":"^19.2.14","chokidar-cli":"3.0.0","@edge-runtime/vm":"^5.0.0","@eslint/eslintrc":"^3.3.5","@types/react-dom":"^19.2.3","typescript-eslint":"8.58.2","eslint-plugin-react":"^7.37.5","@vitejs/plugin-react":"^5.2.0","@convex-dev/eslint-plugin":"^1.2.2","eslint-plugin-react-hooks":"^7.1.1","eslint-plugin-react-refresh":"^0.5.2"},"peerDependencies":{"convex":"^1.36.1"},"_npmOperationalInternal":{"tmp":"tmp/convex-checkpoints_0.1.1_1779206478487_0.8513714201448739","host":"s3://npm-registry-packages-npm-production"}},"0.1.2":{"name":"@abdssamie/convex-checkpoints","version":"0.1.2","keywords":["convex","component","events","checkpoints"],"license":"Apache-2.0","_id":"@abdssamie/convex-checkpoints@0.1.2","maintainers":[{"name":"abdessamie","email":"abdessamie.elmoubarki@gmail.com"}],"homepage":"https://github.com/abdssamie/convex-checkpoints#readme","bugs":{"url":"https://github.com/abdssamie/convex-checkpoints/issues"},"dist":{"shasum":"0aa919c8bef2b8d44fa989db0b9160e2f52fbaf9","tarball":"https://registry.npmjs.org/@abdssamie/convex-checkpoints/-/convex-checkpoints-0.1.2.tgz","fileCount":59,"integrity":"sha512-3YF94DPjDAC9s3d7F9aKZoALjDij/n21Xk+ZI659T/KoPcj6HrXOBTovmquwDZ1Wj7jusI3FBNOUq8u4EC9dxw==","signatures":[{"sig":"MEYCIQDusFE5WPFsyh0O7Cwer0bm2v0HsDAvGBGEUfp1uS/PfwIhAPqqiJfYoJ457gcOgJiCMS50FYC4Z+tnlp8x7zNL2U3J","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":107407},"type":"module","_from":"file:abdssamie-convex-checkpoints-0.1.2.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","./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"}},"scripts":{"dev":"convex dev --start 'npm run dev:build'","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":"convex init && npm run build:codegen","release":"npm version patch && npm publish && git push --follow-tags","version":"(npm whoami || npm login) && 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 && npm run test && npm run lint && npm run 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:frontend":"cd example && vite","build:codegen":"npx convex codegen --component-dir ./src/component && npm run build","test:coverage":"vitest run --coverage --coverage.reporter=text"},"_npmUser":{"name":"abdessamie","email":"abdessamie.elmoubarki@gmail.com"},"_resolved":"/tmp/5d122c0a6d23b6bdcf9d30043ad86e82/abdssamie-convex-checkpoints-0.1.2.tgz","_integrity":"sha512-3YF94DPjDAC9s3d7F9aKZoALjDij/n21Xk+ZI659T/KoPcj6HrXOBTovmquwDZ1Wj7jusI3FBNOUq8u4EC9dxw==","repository":{"url":"git+https://github.com/abdssamie/convex-checkpoints.git","type":"git"},"_npmVersion":"11.12.1","description":"A Convex component for event-driven user checkpoints.","directories":{},"_nodeVersion":"24.15.0","_hasShrinkwrap":false,"devDependencies":{"vite":"8.0.9","react":"^19.2.5","convex":"1.36.1","eslint":"9.39.4","vitest":"4.1.4","globals":"^17.5.0","prettier":"3.8.3","react-dom":"^19.2.5","@eslint/js":"9.39.4","pkg-pr-new":"^0.0.66","typescript":"6.0.3","@types/node":"^24.12.2","convex-test":"0.0.49","@types/react":"^19.2.14","chokidar-cli":"3.0.0","@edge-runtime/vm":"^5.0.0","@eslint/eslintrc":"^3.3.5","@types/react-dom":"^19.2.3","typescript-eslint":"8.58.2","eslint-plugin-react":"^7.37.5","@vitejs/plugin-react":"^5.2.0","@convex-dev/eslint-plugin":"^1.2.2","eslint-plugin-react-hooks":"^7.1.1","eslint-plugin-react-refresh":"^0.5.2"},"peerDependencies":{"convex":"^1.36.1"},"_npmOperationalInternal":{"tmp":"tmp/convex-checkpoints_0.1.2_1779216642558_0.1436432406744126","host":"s3://npm-registry-packages-npm-production"}},"0.1.7":{"name":"@abdssamie/convex-checkpoints","version":"0.1.7","keywords":["convex","component","events","checkpoints"],"license":"Apache-2.0","_id":"@abdssamie/convex-checkpoints@0.1.7","maintainers":[{"name":"abdessamie","email":"abdessamie.elmoubarki@gmail.com"}],"homepage":"https://github.com/abdssamie/convex-checkpoints#readme","bugs":{"url":"https://github.com/abdssamie/convex-checkpoints/issues"},"dist":{"shasum":"a379f5508d769518d2def2ee706333a0a9024fc5","tarball":"https://registry.npmjs.org/@abdssamie/convex-checkpoints/-/convex-checkpoints-0.1.7.tgz","fileCount":59,"integrity":"sha512-Afa8GmgdGiLD6vGtOakkdFgEqcbPgvHGtsBgK2n+dkfqY9S1bzVo8XwB23ziOKlUjEhIINEr5SgUEqNLlHY+Xg==","signatures":[{"sig":"MEYCIQDlJxO4y4D7TyBplaEXFgrYrpgi3MUtDJjW0X2B0OP4mQIhAOOQq+RzAcONr1dQHemTem7HZS5hk1gVG/eDpgfT1vGt","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@abdssamie%2fconvex-checkpoints@0.1.7","provenance":{"predicateType":"https://slsa.dev/provenance/v0.2"}},"unpackedSize":106595},"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","./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":"9f602597bb8a17bd0477fdeea068c4424d54f56e","scripts":{"dev":"convex dev --start 'npm run dev:build'","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":"convex init && npm run build:codegen","release":"npm version patch && npm publish && git push --follow-tags","version":"(npm whoami || npm login) && 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 && npm run test && npm run lint && npm run 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:frontend":"cd example && vite","build:codegen":"npx convex codegen --component-dir ./src/component && npm run build","test:coverage":"vitest run --coverage --coverage.reporter=text"},"_npmUser":{"name":"GitLab CI/CD","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"gitlab","oidcConfigId":"oidc:fc83d467-07d9-4609-a9bb-2784cecdad5e"}},"repository":{"url":"git+https://gitlab.com/Abdssamie/convex-checkpoints.git","type":"git"},"_npmVersion":"11.12.1","description":"A Convex component for event-driven user checkpoints.","directories":{},"_nodeVersion":"24.15.0","_hasShrinkwrap":false,"devDependencies":{"vite":"8.0.9","react":"^19.2.5","convex":"1.36.1","eslint":"9.39.4","vitest":"4.1.4","globals":"^17.5.0","prettier":"3.8.3","react-dom":"^19.2.5","@eslint/js":"9.39.4","pkg-pr-new":"^0.0.66","typescript":"6.0.3","@types/node":"^24.12.2","convex-test":"0.0.49","@types/react":"^19.2.14","chokidar-cli":"3.0.0","@edge-runtime/vm":"^5.0.0","@eslint/eslintrc":"^3.3.5","@types/react-dom":"^19.2.3","typescript-eslint":"8.58.2","eslint-plugin-react":"^7.37.5","@vitejs/plugin-react":"^5.2.0","@convex-dev/eslint-plugin":"^1.2.2","eslint-plugin-react-hooks":"^7.1.1","eslint-plugin-react-refresh":"^0.5.2"},"peerDependencies":{"convex":"^1.36.1"},"_npmOperationalInternal":{"tmp":"tmp/convex-checkpoints_0.1.7_1779280253636_0.3790750992520626","host":"s3://npm-registry-packages-npm-production"}},"0.1.8":{"name":"@abdssamie/convex-checkpoints","version":"0.1.8","keywords":["convex","component","events","checkpoints"],"license":"Apache-2.0","_id":"@abdssamie/convex-checkpoints@0.1.8","maintainers":[{"name":"abdessamie","email":"abdessamie.elmoubarki@gmail.com"}],"homepage":"https://github.com/abdssamie/convex-checkpoints#readme","bugs":{"url":"https://github.com/abdssamie/convex-checkpoints/issues"},"dist":{"shasum":"fe0fe3fdf1aaef836fc7fcf2c29d1f02f40724cd","tarball":"https://registry.npmjs.org/@abdssamie/convex-checkpoints/-/convex-checkpoints-0.1.8.tgz","fileCount":53,"integrity":"sha512-yHmoyH+gnjR//ZvBzFsheKK8NwemIuDCMQ1ytUuwypcWettnsFSYaIKotUnm1OFoRa0mLTHdCdnQOnlPEdU+tw==","signatures":[{"sig":"MEUCICNl0AoalhzdXwVfJGFT8A215arr0APV53azrBxvBGykAiEA12LzDoP5vJbl9F/g4aBXOMJ9G8aEB0X9iLPCqRmwQBI=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@abdssamie%2fconvex-checkpoints@0.1.8","provenance":{"predicateType":"https://slsa.dev/provenance/v0.2"}},"unpackedSize":111437},"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","./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":"7b07a25f75f26b4194a8a41d0df23c17a0882757","scripts":{"dev":"convex dev --start 'npm run dev:build'","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":"convex init && npm run build:codegen","release":"npm version patch && npm publish && git push --follow-tags","version":"(npm whoami || npm login) && 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 && npm run test && npm run lint && npm run 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:frontend":"cd example && vite","build:codegen":"npx convex codegen --component-dir ./src/component && npm run build","test:coverage":"vitest run --coverage --coverage.reporter=text"},"_npmUser":{"name":"GitLab CI/CD","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"gitlab","oidcConfigId":"oidc:fc83d467-07d9-4609-a9bb-2784cecdad5e"}},"repository":{"url":"git+https://gitlab.com/Abdssamie/convex-checkpoints.git","type":"git"},"_npmVersion":"11.12.1","description":"A Convex component for event-driven user checkpoints.","directories":{},"_nodeVersion":"24.15.0","_hasShrinkwrap":false,"devDependencies":{"vite":"8.0.9","react":"^19.2.5","convex":"1.39.1","eslint":"9.39.4","vitest":"4.1.4","globals":"^17.5.0","prettier":"3.8.3","wrangler":"^4.93.0","react-dom":"^19.2.5","@eslint/js":"9.39.4","pkg-pr-new":"^0.0.66","typescript":"6.0.3","@types/node":"^24.12.2","convex-test":"0.0.49","@types/react":"^19.2.14","chokidar-cli":"3.0.0","@edge-runtime/vm":"^5.0.0","@eslint/eslintrc":"^3.3.5","@types/react-dom":"^19.2.3","typescript-eslint":"8.58.2","eslint-plugin-react":"^7.37.5","@vitejs/plugin-react":"^5.2.0","@convex-dev/eslint-plugin":"^1.2.2","eslint-plugin-react-hooks":"^7.1.1","eslint-plugin-react-refresh":"^0.5.2"},"peerDependencies":{"convex":"^1.36.1"},"_npmOperationalInternal":{"tmp":"tmp/convex-checkpoints_0.1.8_1779374331564_0.5747532752175502","host":"s3://npm-registry-packages-npm-production"}},"0.1.9":{"name":"@abdssamie/convex-checkpoints","description":"A Convex component for event-driven user checkpoints.","repository":{"type":"git","url":"git+https://gitlab.com/Abdssamie/convex-checkpoints.git"},"homepage":"https://github.com/abdssamie/convex-checkpoints#readme","bugs":{"url":"https://github.com/abdssamie/convex-checkpoints/issues"},"version":"0.1.9","license":"Apache-2.0","keywords":["convex","component","events","checkpoints"],"type":"module","scripts":{"dev":"convex dev --start 'npm run dev:build'","dev:frontend":"cd example && vite","dev:build":"chokidar 'tsconfig*.json' 'src/**/*.ts' -i '**/*.test.ts' -c 'npm run build:codegen' --initial","predev":"convex init && npm run build:codegen","build":"tsc --project ./tsconfig.build.json","build:codegen":"npx convex codegen --component-dir ./src/component && npm run build","build:clean":"rm -rf dist *.tsbuildinfo && npm run build:codegen","typecheck":"tsc --noEmit && tsc -p example && tsc -p example/convex","lint":"eslint .","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","deploy:frontend":"cd example && npx vite build --mode production && npx wrangler pages deploy --commit-dirty=true","deploy:frontend:preview":"cd example && npx vite build --mode production && npx wrangler pages deploy --branch preview --commit-dirty=true","preversion":"npm ci && npm run build:clean && npm run test && npm run lint && npm run typecheck","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":"(npm whoami || npm login) && 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"},"./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.36.1"},"devDependencies":{"@convex-dev/eslint-plugin":"^1.2.2","@edge-runtime/vm":"^5.0.0","@eslint/eslintrc":"^3.3.5","@eslint/js":"9.39.4","@types/node":"^24.12.2","@types/react":"^19.2.14","@types/react-dom":"^19.2.3","@vitejs/plugin-react":"^5.2.0","chokidar-cli":"3.0.0","convex":"1.39.1","convex-test":"0.0.49","eslint":"9.39.4","eslint-plugin-react":"^7.37.5","eslint-plugin-react-hooks":"^7.1.1","eslint-plugin-react-refresh":"^0.5.2","globals":"^17.5.0","pkg-pr-new":"^0.0.66","prettier":"3.8.3","react":"^19.2.5","react-dom":"^19.2.5","typescript":"6.0.3","typescript-eslint":"8.58.2","vite":"8.0.9","vitest":"4.1.4","wrangler":"^4.93.0"},"types":"./dist/client/index.d.ts","module":"./dist/client/index.js","pnpm":{"onlyBuiltDependencies":["esbuild","@tailwindcss/oxide"]},"gitHead":"b89aa8e8c7f7dc877d285f7fc06716ff0851f628","_id":"@abdssamie/convex-checkpoints@0.1.9","_nodeVersion":"24.15.0","_npmVersion":"11.12.1","dist":{"integrity":"sha512-r4tdSZ4wXr8/iJNrrHS/59q1uElJVyLAe33yvXcs0E0C0gclvGoJjWdUIl4WMN8M0CbJ+6jt9pozLE5/3N6yRQ==","shasum":"278448565bf0c57cbf11c37894d8b504e7b0ecb2","tarball":"https://registry.npmjs.org/@abdssamie/convex-checkpoints/-/convex-checkpoints-0.1.9.tgz","fileCount":53,"unpackedSize":121257,"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@abdssamie%2fconvex-checkpoints@0.1.9","provenance":{"predicateType":"https://slsa.dev/provenance/v0.2"}},"signatures":[{"keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U","sig":"MEUCIQCmC6HaYQsZ8qrtnRI1FGhlb4DHAcnlR8L6eMuqCzw/cAIgPO1IcoikBAftT8aJiC04tSsEqgs1f/jnwvnE2oAbeT4="}]},"_npmUser":{"name":"GitLab CI/CD","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"gitlab","oidcConfigId":"oidc:fc83d467-07d9-4609-a9bb-2784cecdad5e"}},"directories":{},"maintainers":[{"name":"abdessamie","email":"abdessamie.elmoubarki@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages-npm-production","tmp":"tmp/convex-checkpoints_0.1.9_1779381089507_0.26885839695538594"},"_hasShrinkwrap":false}},"time":{"created":"2026-05-19T16:01:18.361Z","modified":"2026-05-21T16:31:30.057Z","0.1.1":"2026-05-19T16:01:18.652Z","0.1.2":"2026-05-19T18:50:42.727Z","0.1.7":"2026-05-20T12:30:53.796Z","0.1.8":"2026-05-21T14:38:51.704Z","0.1.9":"2026-05-21T16:31:29.705Z"},"bugs":{"url":"https://github.com/abdssamie/convex-checkpoints/issues"},"license":"Apache-2.0","homepage":"https://github.com/abdssamie/convex-checkpoints#readme","keywords":["convex","component","events","checkpoints"],"repository":{"type":"git","url":"git+https://gitlab.com/Abdssamie/convex-checkpoints.git"},"description":"A Convex component for event-driven user checkpoints.","maintainers":[{"name":"abdessamie","email":"abdessamie.elmoubarki@gmail.com"}],"readme":"# Convex Checkpoints\n\nConvex Checkpoints lets an app define milestone rules for user activity and run\na host-owned callback when a rule is completed.\n\nIt fits cases like:\n\n- send a welcome email 30 minutes after signup\n- grant credits after a user creates 5 posts\n- unlock a badge after profile completion\n\nThe component owns rule configuration and per-user factor progress. Your app\nowns auth, app data, and the callback that performs side effects.\n\n## Installation\n\nInstall the component in your app's `convex/convex.config.ts`:\n\n```ts\n// convex/convex.config.ts\nimport { defineApp } from \"convex/server\";\nimport convexCheckpoints from \"@abdssamie/convex-checkpoints/convex.config.js\";\n\nconst app = defineApp();\napp.use(convexCheckpoints);\n\nexport default app;\n```\n\n## Usage\n\nRules live in the component. Actions live in your app. The component only\ntracks progress and tells your callback when a rule is completed.\n\n### Configure checkpoints\n\nCreate a small app module, usually `convex/checkpoints.ts`.\n\n```ts\n// convex/checkpoints.ts\nimport { components, internal } from \"./_generated/api.js\";\nimport { internalMutation, mutation } from \"./_generated/server.js\";\nimport { v } from \"convex/values\";\nimport { ConvexCheckpoints } from \"@abdssamie/convex-checkpoints\";\n\n// 1. Create one helper for the installed component.\n// `onComplete` points at your app-owned callback below.\nexport const checkpoints = new ConvexCheckpoints(components.convexCheckpoints, {\n  onComplete: internal.checkpoints.onCheckpointComplete,\n});\n\n// 2. Register rules that describe completed checkpoints.\n// - factor: the activity you track, such as \"signup\" or \"create_post\"\n// - threshold: the value that completes the rule\n// - actionName: the app action your callback should run\nexport const configureRules = mutation({\n  args: {},\n  returns: v.null(),\n  handler: async (ctx) => {\n    await checkpoints.registerRule(ctx, {\n      name: \"welcome-after-signup\",\n      factor: \"signup\",\n      threshold: 1,\n      actionName: \"send_welcome_email\",\n    });\n\n    await checkpoints.registerRule(ctx, {\n      name: \"credits-after-five-posts\",\n      factor: \"create_post\",\n      threshold: 5,\n      actionName: \"add_credits\",\n    });\n\n    return null;\n  },\n});\n\n// 3. Handle completed rules in your app.\n// This is a normal Convex function, so it can write tables, call internal\n// mutations, or schedule later work.\nexport const onCheckpointComplete = internalMutation({\n  args: {\n    userId: v.string(),\n    factor: v.string(),\n    ruleName: v.string(),\n    actionName: v.string(),\n    value: v.number(),\n    threshold: v.number(),\n    completedAt: v.number(),\n    occurredAt: v.optional(v.number()),\n    payload: v.optional(v.any()),\n  },\n  returns: v.null(),\n  handler: async (ctx, args) => {\n    switch (args.actionName) {\n      case \"send_welcome_email\":\n        await ctx.scheduler.runAfter(30 * 60 * 1000, internal.emails.sendWelcome, {\n          userId: args.userId,\n        });\n        break;\n      case \"add_credits\":\n        await ctx.runMutation(internal.credits.add, {\n          userId: args.userId,\n          amount: 100,\n        });\n        break;\n    }\n    return null;\n  },\n});\n\n// Optional query helpers for dashboards, debug views, and admin tools.\nexport const { listRules, getProgress, listProgressForUser } =\n  checkpoints.api();\n```\n\n### Track activity from app mutations\n\nCall `trackEvent` after the app's real business write succeeds. In this example,\ncreating a post increments the user's `\"create_post\"` factor. When the value\nreaches `5`, the `\"credits-after-five-posts\"` rule completes and the callback\nruns with `actionName: \"add_credits\"`.\n\n```ts\n// convex/posts.ts\nimport { mutation } from \"./_generated/server.js\";\nimport { checkpoints } from \"./checkpoints.js\";\nimport { v } from \"convex/values\";\n\nexport const createPost = mutation({\n  args: { body: v.string() },\n  handler: async (ctx, args) => {\n    const userId = await requireUserId(ctx);\n\n    // 4. First perform the real app write.\n    const postId = await ctx.db.insert(\"posts\", {\n      body: args.body,\n      userId,\n    });\n\n    // Then track the factor that may complete one or more rules.\n    await checkpoints.trackEvent(ctx, {\n      userId,\n      factor: \"create_post\",\n      payload: { postId },\n    });\n\n    return postId;\n  },\n});\n```\n\nWhen progress crosses a rule threshold, the wrapper schedules `onComplete`\nimmediately. If an action should happen later, schedule that timing in your\nhandler with Convex's `ctx.scheduler.runAfter` or `ctx.scheduler.runAt`, as the\nwelcome email example does.\n\nThe component does not store callback references; the app-side wrapper schedules\nthe typed function reference directly.\n\n## HTTP\n\nPrefer mutation wrappers for app-driven events. They run inside your app's\nConvex functions, so you can authenticate the user, validate input, write app\ndata, and track progress in one place.\n\nHTTP ingestion is for server-to-server entry points such as webhooks or trusted\nbackend jobs. Treat it as a public endpoint: anyone who can reach the URL can\ntry to submit an event unless you verify the request.\n\nThe HTTP helper exposes the same `trackEvent` flow through routes. Use it when\nan external system needs to report a factor without calling your Convex\nmutations directly.\n\n```ts\n// convex/http.ts\nimport { checkpoints } from \"./checkpoints.js\";\n\nexport default checkpoints.http(\"/checkpoints\", {\n  token: process.env.CHECKPOINTS_SECRET,\n});\n```\n\nThis registers both `POST /checkpoints` and factor-specific routes such as\n`POST /checkpoints/create_post`. The factor-specific route uses the path segment\nas the factor, so the request body only needs the user and payload fields.\n\n```sh\ncurl -X POST \"$CONVEX_SITE_URL/checkpoints/create_post\" \\\n  -H \"Content-Type: application/json\" \\\n  -H \"Authorization: Bearer $CHECKPOINTS_SECRET\" \\\n  -d '{\"userId\":\"user1\",\"postId\":\"post1\"}'\n```\n\nRequests must include `Authorization: Bearer <token>` when `token` is set.\nKeep `CHECKPOINTS_SECRET` in server-side environment variables only.\n\n## Tests\n\nWhen using `convex-test`, register the component with the test instance:\n\n```ts\nimport { convexTest } from \"convex-test\";\nimport component from \"@abdssamie/convex-checkpoints/test\";\nimport schema from \"./schema.js\";\n\nconst modules = import.meta.glob(\"./**/*.*s\");\nconst t = convexTest(schema, modules);\ncomponent.register(t);\n```\n","readmeFilename":"README.md"}