{"_id":"@bender-tools/react-discriminated-union-context","_rev":"8-05ad4033326edf5e9ab49299c70806ff","name":"@bender-tools/react-discriminated-union-context","dist-tags":{"latest":"1.3.4"},"versions":{"1.0.0":{"name":"@bender-tools/react-discriminated-union-context","version":"1.0.0","keywords":["react","typescript","discriminated-union","context","type-safe","state-management"],"author":{"name":"Justin Bender","email":"jrkbender@gmail.com"},"license":"MIT","_id":"@bender-tools/react-discriminated-union-context@1.0.0","maintainers":[{"name":"justbender","email":"jrkbender@gmail.com"}],"homepage":"https://github.com/ScriptAlchemist/react-discriminated-union-context#readme","bugs":{"url":"https://github.com/ScriptAlchemist/react-discriminated-union-context/issues"},"dist":{"shasum":"07ccab6585e7399f04389559f9b51323a19d2856","tarball":"https://registry.npmjs.org/@bender-tools/react-discriminated-union-context/-/react-discriminated-union-context-1.0.0.tgz","fileCount":7,"integrity":"sha512-kgm3TpS1Qb7pHZhmMB2yD23MjYBmw/Q6U0m/0EHuEYprdu0ppYLe15tO7dBNj1TZmWWFOxXuIdEYw6F1eOTHVw==","signatures":[{"sig":"MEYCIQC3WiOCMD7O4947KzvIedZg5R1Cf2NfkuXzvIKWpIffNgIhAOHM75YOR+6K84aUgE7VW1JYt5cGh6z5lBDFQNcUiVei","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":10577},"main":"./dist/index.js","type":"module","types":"./dist/index.d.ts","module":"./dist/index.js","engines":{"node":">=18.0.0"},"exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js"}},"gitHead":"f8404e149b3f6424152ed2fa9c9a938ed0a1088e","scripts":{"build":"tsc","clean":"rm -rf dist","typecheck":"tsc --noEmit","prepublishOnly":"npm run clean && npm run build"},"_npmUser":{"name":"justbender","email":"jrkbender@gmail.com"},"repository":{"url":"git+https://github.com/ScriptAlchemist/react-discriminated-union-context.git","type":"git"},"_npmVersion":"10.8.2","description":"A TypeScript library for creating type-safe discriminated union contexts in React","directories":{},"_nodeVersion":"20.19.4","_hasShrinkwrap":false,"devDependencies":{"react":"^18.2.0","typescript":"^5.3.0","@types/react":"^18.2.0"},"peerDependencies":{"react":">=18.0.0"},"_npmOperationalInternal":{"tmp":"tmp/react-discriminated-union-context_1.0.0_1765303053989_0.296638047338581","host":"s3://npm-registry-packages-npm-production"}},"1.0.1":{"name":"@bender-tools/react-discriminated-union-context","version":"1.0.1","keywords":["react","typescript","discriminated-union","context","type-safe","state-management"],"author":{"name":"Justin Bender","email":"jrkbender@gmail.com"},"license":"MIT","_id":"@bender-tools/react-discriminated-union-context@1.0.1","maintainers":[{"name":"justbender","email":"jrkbender@gmail.com"}],"homepage":"https://github.com/ScriptAlchemist/react-discriminated-union-context#readme","bugs":{"url":"https://github.com/ScriptAlchemist/react-discriminated-union-context/issues"},"dist":{"shasum":"9725a246ef5924dbf491d89c41b724ba7e0403ae","tarball":"https://registry.npmjs.org/@bender-tools/react-discriminated-union-context/-/react-discriminated-union-context-1.0.1.tgz","fileCount":7,"integrity":"sha512-/FjLgEZf1NFQHHfN01jqN2FG+pmuggrAvuWHROZ/uOAXrqTlcwDa4C9UMnzsM6Zy+o04JgrbSOS/0aF4zCMFNQ==","signatures":[{"sig":"MEUCIQDrOhOZx/5znLDieqfaNI9tvTv1+WqFGFdrQKmleNqykQIgVTKMkBLTV8nxaj/1eFK4Uijh6mlZfu51PAGhp+5n56c=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":10577},"main":"./dist/index.js","type":"module","types":"./dist/index.d.ts","module":"./dist/index.js","engines":{"node":">=18.0.0"},"exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js"}},"gitHead":"2e82d4f986b5425977d7c29379deb18ce172f8f7","scripts":{"build":"tsc","clean":"rm -rf dist","typecheck":"tsc --noEmit","prepublishOnly":"npm run clean && npm run build"},"_npmUser":{"name":"justbender","email":"jrkbender@gmail.com"},"repository":{"url":"git+https://github.com/ScriptAlchemist/react-discriminated-union-context.git","type":"git"},"_npmVersion":"10.8.2","description":"A TypeScript library for creating type-safe discriminated union contexts in React","directories":{},"_nodeVersion":"20.19.4","_hasShrinkwrap":false,"devDependencies":{"react":"^18.2.0","typescript":"^5.3.0","@types/react":"^18.2.0"},"peerDependencies":{"react":">=18.0.0"},"_npmOperationalInternal":{"tmp":"tmp/react-discriminated-union-context_1.0.1_1765303266968_0.1627768939404899","host":"s3://npm-registry-packages-npm-production"}},"1.0.2":{"name":"@bender-tools/react-discriminated-union-context","version":"1.0.2","keywords":["react","typescript","discriminated-union","context","type-safe","state-management"],"author":{"name":"Justin Bender","email":"jrkbender@gmail.com"},"license":"MIT","_id":"@bender-tools/react-discriminated-union-context@1.0.2","maintainers":[{"name":"justbender","email":"jrkbender@gmail.com"}],"homepage":"https://github.com/ScriptAlchemist/react-discriminated-union-context#readme","bugs":{"url":"https://github.com/ScriptAlchemist/react-discriminated-union-context/issues"},"dist":{"shasum":"fde6dce4d149b5207ab8c902f01722773f9aa37b","tarball":"https://registry.npmjs.org/@bender-tools/react-discriminated-union-context/-/react-discriminated-union-context-1.0.2.tgz","fileCount":7,"integrity":"sha512-BR+DiQm9T1IDW532djuEE9868F29tA36N/Dqbk7gM1kbzyZHDFQoHrNZL6LhVRLHYs6nYuTFQ0G7ykFTwfQjkA==","signatures":[{"sig":"MEYCIQDc7ywA14+RW0dPPzjT7tPoL5f356bYr5n6RUAe9bWf9AIhAPozDBKjJzAI3Wzt6NznNY4JuzN7k3VtcrC85x+vuSJ8","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":10577},"main":"./dist/index.js","type":"module","types":"./dist/index.d.ts","module":"./dist/index.js","engines":{"node":">=18.0.0"},"exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js"}},"gitHead":"ea9779adce5a7379f8d38e6f955c115f9fbd0d6a","scripts":{"build":"tsc","clean":"rm -rf dist","typecheck":"tsc --noEmit","prepublishOnly":"npm run clean && npm run build"},"_npmUser":{"name":"justbender","email":"jrkbender@gmail.com"},"repository":{"url":"git+https://github.com/ScriptAlchemist/react-discriminated-union-context.git","type":"git"},"_npmVersion":"10.8.2","description":"A TypeScript library for creating type-safe discriminated union contexts in React","directories":{},"_nodeVersion":"20.19.4","_hasShrinkwrap":false,"devDependencies":{"react":"^18.2.0","typescript":"^5.3.0","@types/react":"^18.2.0"},"peerDependencies":{"react":">=18.0.0"},"_npmOperationalInternal":{"tmp":"tmp/react-discriminated-union-context_1.0.2_1765303512210_0.6956595738252138","host":"s3://npm-registry-packages-npm-production"}},"1.0.5":{"name":"@bender-tools/react-discriminated-union-context","version":"1.0.5","keywords":["react","typescript","discriminated-union","context","type-safe","state-management"],"author":{"name":"Justin Bender","email":"jrkbender@gmail.com"},"license":"MIT","_id":"@bender-tools/react-discriminated-union-context@1.0.5","maintainers":[{"name":"justbender","email":"jrkbender@gmail.com"}],"homepage":"https://github.com/ScriptAlchemist/react-discriminated-union-context#readme","bugs":{"url":"https://github.com/ScriptAlchemist/react-discriminated-union-context/issues"},"dist":{"shasum":"1ba0eab3976e61d707d7194dd5a37caa35d46177","tarball":"https://registry.npmjs.org/@bender-tools/react-discriminated-union-context/-/react-discriminated-union-context-1.0.5.tgz","fileCount":7,"integrity":"sha512-VxGOSKcKR7jfNZinBzJ2cYXpr+ZxEHu+Lkg1Gbuj4RmuIH8rm8oyiE79HnPVMehpqksUlzioA0KgoxeU+/aGoQ==","signatures":[{"sig":"MEYCIQCuI7XuJS0UA/ttwnLJAusfLS+yqEa6wGMUWhWOJS41awIhAOu3rcWpjcw4SF9EAKQXo7vYTfwfohFXHIyqKtCnflbO","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@bender-tools%2freact-discriminated-union-context@1.0.5","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":10578},"main":"./dist/index.js","type":"module","types":"./dist/index.d.ts","module":"./dist/index.js","engines":{"node":">=18.0.0"},"exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js"}},"gitHead":"8d188b4c5f0662de65fac236cbebbe3d78fe150c","scripts":{"build":"tsc","clean":"rm -rf dist","typecheck":"tsc --noEmit","prepublishOnly":"npm run clean && npm run build"},"_npmUser":{"name":"justbender","email":"jrkbender@gmail.com"},"repository":{"url":"git+https://github.com/ScriptAlchemist/react-discriminated-union-context.git","type":"git"},"_npmVersion":"10.8.2","description":"A TypeScript library for creating type-safe discriminated union contexts in React","directories":{},"_nodeVersion":"20.19.6","_hasShrinkwrap":false,"devDependencies":{"react":"^18.2.0","typescript":"^5.3.0","@types/react":"^18.2.0"},"peerDependencies":{"react":">=18.0.0"},"_npmOperationalInternal":{"tmp":"tmp/react-discriminated-union-context_1.0.5_1765304945821_0.8403257703450511","host":"s3://npm-registry-packages-npm-production"}},"1.0.8":{"name":"@bender-tools/react-discriminated-union-context","version":"1.0.8","keywords":["react","typescript","discriminated-union","context","type-safe","state-management"],"author":{"name":"Justin Bender","email":"jrkbender@gmail.com"},"license":"MIT","_id":"@bender-tools/react-discriminated-union-context@1.0.8","maintainers":[{"name":"justbender","email":"jrkbender@gmail.com"}],"homepage":"https://github.com/ScriptAlchemist/react-discriminated-union-context#readme","bugs":{"url":"https://github.com/ScriptAlchemist/react-discriminated-union-context/issues"},"dist":{"shasum":"65750ae97d7585cd8371729cbc08023cf5c8b847","tarball":"https://registry.npmjs.org/@bender-tools/react-discriminated-union-context/-/react-discriminated-union-context-1.0.8.tgz","fileCount":7,"integrity":"sha512-5RNl8YmgH4M/11Vh+NyIu+DjCTewnI51MaB+DdhV4Qiq0rify6D+R4mXowuZ7m+7D0ZqkRGekYa3eQKVNDUCqw==","signatures":[{"sig":"MEYCIQDE/nVgKWL1aEM/0cJLrF3/EQN8OMQsjWnMQpn2HsoFNgIhANz+tSLFGCbqCVg9UQfyh3x/f2NCY6YeRKH3dPwiO8eK","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@bender-tools%2freact-discriminated-union-context@1.0.8","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":12679},"main":"./dist/index.js","type":"module","types":"./dist/index.d.ts","module":"./dist/index.js","engines":{"node":">=18.0.0"},"exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js"}},"gitHead":"fc1abd3bd4a711b9876193b31bb66eddfedb6635","scripts":{"build":"tsc","clean":"rm -rf dist","typecheck":"tsc --noEmit","prepublishOnly":"npm run clean && npm run build"},"_npmUser":{"name":"justbender","email":"jrkbender@gmail.com"},"repository":{"url":"git+https://github.com/ScriptAlchemist/react-discriminated-union-context.git","type":"git"},"_npmVersion":"10.8.2","description":"A TypeScript library for creating type-safe discriminated union contexts in React","directories":{},"_nodeVersion":"20.19.6","_hasShrinkwrap":false,"devDependencies":{"react":"^18.2.0","typescript":"^5.3.0","@types/react":"^18.2.0"},"peerDependencies":{"react":">=18.0.0"},"_npmOperationalInternal":{"tmp":"tmp/react-discriminated-union-context_1.0.8_1765305546512_0.3946387953370196","host":"s3://npm-registry-packages-npm-production"}},"1.1.8":{"name":"@bender-tools/react-discriminated-union-context","version":"1.1.8","keywords":["react","typescript","discriminated-union","context","type-safe","state-management"],"author":{"name":"Justin Bender","email":"jrkbender@gmail.com"},"license":"MIT","_id":"@bender-tools/react-discriminated-union-context@1.1.8","maintainers":[{"name":"justbender","email":"jrkbender@gmail.com"}],"homepage":"https://github.com/ScriptAlchemist/react-discriminated-union-context#readme","bugs":{"url":"https://github.com/ScriptAlchemist/react-discriminated-union-context/issues"},"dist":{"shasum":"f711ed4fc979a396405b0d719138cf00e3c5da4e","tarball":"https://registry.npmjs.org/@bender-tools/react-discriminated-union-context/-/react-discriminated-union-context-1.1.8.tgz","fileCount":7,"integrity":"sha512-3Xw9xEd+o0FqNfcne9Mz6ZTp7knbVn5BFiKc0+/301K24PnEcyxfo3l+60pE+EVjCiY+1RZMxpomWr9KzU9P8Q==","signatures":[{"sig":"MEQCID5SVnQ8vhhxUGT001Uho85WuROrbPwykUuO862ggXW2AiBxJWTRrpEk+IOESLe0TKT6A0noRRU7bOCN+/XXw3kN+w==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@bender-tools%2freact-discriminated-union-context@1.1.8","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":16533},"main":"./dist/index.js","type":"module","types":"./dist/index.d.ts","module":"./dist/index.js","engines":{"node":">=18.0.0"},"exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js"}},"gitHead":"571024557ad42de72f1a212c1c84e63cbcb27da2","scripts":{"build":"tsc","clean":"rm -rf dist","typecheck":"tsc --noEmit","prepublishOnly":"npm run clean && npm run build"},"_npmUser":{"name":"justbender","email":"jrkbender@gmail.com"},"repository":{"url":"git+https://github.com/ScriptAlchemist/react-discriminated-union-context.git","type":"git"},"_npmVersion":"10.8.2","description":"A TypeScript library for creating type-safe discriminated union contexts in React","directories":{},"_nodeVersion":"20.19.6","_hasShrinkwrap":false,"devDependencies":{"react":"^18.2.0","typescript":"^5.3.0","@types/react":"^18.2.0"},"peerDependencies":{"react":">=18.0.0"},"_npmOperationalInternal":{"tmp":"tmp/react-discriminated-union-context_1.1.8_1765309737613_0.5906627813203429","host":"s3://npm-registry-packages-npm-production"}},"1.2.0":{"name":"@bender-tools/react-discriminated-union-context","version":"1.2.0","keywords":["react","typescript","discriminated-union","context","type-safe","state-management"],"author":{"name":"Justin Bender","email":"jrkbender@gmail.com"},"license":"MIT","_id":"@bender-tools/react-discriminated-union-context@1.2.0","maintainers":[{"name":"justbender","email":"jrkbender@gmail.com"}],"homepage":"https://github.com/ScriptAlchemist/react-discriminated-union-context#readme","bugs":{"url":"https://github.com/ScriptAlchemist/react-discriminated-union-context/issues"},"dist":{"shasum":"aec465699bfd8c262914e0dcb3b92c760c6202df","tarball":"https://registry.npmjs.org/@bender-tools/react-discriminated-union-context/-/react-discriminated-union-context-1.2.0.tgz","fileCount":7,"integrity":"sha512-4/eqdUbUxkUc2v325pumA2furSGYduYcsIWbNtsyI7V4N/Z3gtH74D3RqJOyF39v78SpfHn/LM3PXiqok4WKTQ==","signatures":[{"sig":"MEUCIQDK2GbSwI64LK9H/GOYksaimSajwu/2PKbQeywa/h6PTgIgF2+HvhHmIaOwBwyf5OOCCukAU/c1e3hzSqGNImbnjNQ=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@bender-tools%2freact-discriminated-union-context@1.2.0","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":16701},"main":"./dist/index.js","type":"module","types":"./dist/index.d.ts","module":"./dist/index.js","engines":{"node":">=18.0.0"},"exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js"}},"gitHead":"41509c10d4a1ceff1183e6a38f659dd24e27e753","scripts":{"build":"tsc","clean":"rm -rf dist","typecheck":"tsc --noEmit","prepublishOnly":"npm run clean && npm run build"},"_npmUser":{"name":"justbender","email":"jrkbender@gmail.com"},"repository":{"url":"git+https://github.com/ScriptAlchemist/react-discriminated-union-context.git","type":"git"},"_npmVersion":"10.8.2","description":"A TypeScript library for creating type-safe discriminated union contexts in React","directories":{},"_nodeVersion":"20.19.6","_hasShrinkwrap":false,"devDependencies":{"react":"^18.2.0","typescript":"^5.3.0","@types/react":"^18.2.0"},"peerDependencies":{"react":">=18.0.0"},"_npmOperationalInternal":{"tmp":"tmp/react-discriminated-union-context_1.2.0_1765313086248_0.13276296322479686","host":"s3://npm-registry-packages-npm-production"}},"1.3.4":{"name":"@bender-tools/react-discriminated-union-context","repository":{"type":"git","url":"git+https://github.com/ScriptAlchemist/react-discriminated-union-context.git"},"author":{"name":"Justin Bender","email":"jrkbender@gmail.com"},"version":"1.3.4","description":"A TypeScript library for creating type-safe discriminated union contexts in React","type":"module","main":"./dist/index.js","module":"./dist/index.js","types":"./dist/index.d.ts","exports":{".":{"import":"./dist/index.js","types":"./dist/index.d.ts"}},"scripts":{"build":"tsc","clean":"rm -rf dist","prepublishOnly":"npm run clean && npm run build","typecheck":"tsc --noEmit","typecheck:test":"tsc --noEmit -p tsconfig.test.json","test":"node --import tsx --import ./src/__tests__/setup.ts --test src/__tests__/*.test.tsx","test:ci":"node --import tsx --import ./src/__tests__/setup.ts --test --test-reporter spec src/__tests__/*.test.tsx"},"keywords":["react","typescript","discriminated-union","context","type-safe","state-management"],"license":"MIT","peerDependencies":{"react":">=18.0.0"},"devDependencies":{"@testing-library/react":"^14.3.1","@types/jsdom":"^27.0.0","@types/node":"^20.0.0","@types/react":"^18.2.0","jsdom":"^27.3.0","react":"^18.2.0","react-dom":"^18.3.1","tsx":"^4.7.0","typescript":"^5.3.0"},"engines":{"node":">=18.0.0"},"gitHead":"c5bec8f4c91901317c6d8a0fa4717f9fde023fc4","_id":"@bender-tools/react-discriminated-union-context@1.3.4","bugs":{"url":"https://github.com/ScriptAlchemist/react-discriminated-union-context/issues"},"homepage":"https://github.com/ScriptAlchemist/react-discriminated-union-context#readme","_nodeVersion":"20.19.6","_npmVersion":"11.7.0","dist":{"integrity":"sha512-uLi26/VDUEYCaEqfRjRHor6r7S6RyiKxPBzORAhm9DKjNp2D2/orF/XcEw3PsfDSRL8tGCvpww+0C4p4N/nY1A==","shasum":"554342070099e5c0eaafb5d1c656254eac2d8892","tarball":"https://registry.npmjs.org/@bender-tools/react-discriminated-union-context/-/react-discriminated-union-context-1.3.4.tgz","fileCount":7,"unpackedSize":24406,"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@bender-tools%2freact-discriminated-union-context@1.3.4","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"signatures":[{"keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U","sig":"MEUCIA05hIwTAeQDS2CuC0bNfs5tm3w3Djt9PqP8xdThWoWzAiEArSzZCF3iIPqqq1nA2/PSD39exmEsGaw07QdXWi5oALM="}]},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:b3954ca6-c3d2-4297-a6ed-171e326d07b9"}},"directories":{},"maintainers":[{"name":"justbender","email":"jrkbender@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages-npm-production","tmp":"tmp/react-discriminated-union-context_1.3.4_1765414673044_0.5309108466559789"},"_hasShrinkwrap":false}},"time":{"created":"2025-12-09T17:57:33.916Z","modified":"2025-12-11T00:57:53.564Z","1.0.0":"2025-12-09T17:57:34.134Z","1.0.1":"2025-12-09T18:01:07.172Z","1.0.2":"2025-12-09T18:05:12.333Z","1.0.5":"2025-12-09T18:29:05.970Z","1.0.8":"2025-12-09T18:39:06.661Z","1.1.8":"2025-12-09T19:48:57.744Z","1.2.0":"2025-12-09T20:44:46.401Z","1.3.4":"2025-12-11T00:57:53.176Z"},"bugs":{"url":"https://github.com/ScriptAlchemist/react-discriminated-union-context/issues"},"author":{"name":"Justin Bender","email":"jrkbender@gmail.com"},"license":"MIT","homepage":"https://github.com/ScriptAlchemist/react-discriminated-union-context#readme","keywords":["react","typescript","discriminated-union","context","type-safe","state-management"],"repository":{"type":"git","url":"git+https://github.com/ScriptAlchemist/react-discriminated-union-context.git"},"description":"A TypeScript library for creating type-safe discriminated union contexts in React","maintainers":[{"name":"justbender","email":"jrkbender@gmail.com"}],"readme":"# @bender-tools/react-discriminated-union-context\n\nA TypeScript library for creating type-safe React contexts with discriminated unions. This library provides full type narrowing support when accessing context values based on their discriminant.\n\n## Installation\n\n```bash\nnpm install @bender-tools/react-discriminated-union-context\n```\n\n## Features\n\n- 🔒 **Type-safe**: Full TypeScript support with automatic type narrowing\n- 🎯 **Discriminated Unions**: Perfect for state machines and multi-state contexts\n- ⚡ **Lightweight**: Zero dependencies (besides React peer dependency)\n- 📦 **ESM Only**: Modern ES modules support\n\n## Usage\n\n### Basic Example\n\n```tsx\nimport { createDiscriminatedContext } from \"@bender-tools/react-discriminated-union-context\";\n\n// Define your discriminated union type\ntype AuthState =\n  | { status: \"idle\" }\n  | { status: \"loading\" }\n  | { status: \"authenticated\"; user: { name: string; email: string } }\n  | { status: \"error\"; error: string };\n\n// Create the context with the discriminant key\nconst { Context: AuthContext, useContext: useAuthContext } =\n  createDiscriminatedContext<AuthState, \"status\">(\"status\");\n\n// Use in a provider\nfunction AuthProvider({ children }: { children: React.ReactNode }) {\n  const [auth, setAuth] = useState<AuthState>({ status: \"idle\" });\n\n  return (\n    <AuthContext.Provider value={auth}>{children}</AuthContext.Provider>\n  );\n}\n\n// Use in components - type is automatically narrowed!\nfunction UserProfile() {\n  // When you pass the expected discriminant value, the type is narrowed\n  const auth = useAuthContext(\"authenticated\");\n  // auth is typed as: { status: 'authenticated'; user: { name: string; email: string } }\n\n  return <div>Welcome, {auth.user.name}!</div>;\n}\n\n// Use 'default' to get the full union type without narrowing\nfunction AuthStatus() {\n  const auth = useAuthContext(\"default\");\n  // auth is typed as: AuthState (the full union)\n\n  switch (auth.status) {\n    case \"idle\":\n      return <div>Not started</div>;\n    case \"loading\":\n      return <div>Loading...</div>;\n    case \"authenticated\":\n      return <div>Logged in as {auth.user.name}</div>;\n    case \"error\":\n      return <div>Error: {auth.error}</div>;\n  }\n}\n\n// With 'default', you can also destructure properties from any union member\nfunction AuthStatusWithDestructuring() {\n  const auth = useAuthContext(\"default\");\n  // Destructure all possible properties - hover over 'user' or 'error'\n  // to see hints like: `Use useContext(\"authenticated\") to access \"user\"`\n  const { status, user, error } = auth;\n\n  // Note: 'user' and 'error' may be undefined depending on current state\n  return (\n    <div>\n      <p>Status: {status}</p>\n      {status === \"authenticated\" && user && <p>User: {user.name}</p>}\n      {status === \"error\" && error && <p>Error: {error}</p>}\n    </div>\n  );\n}\n```\n\n### Runtime Validation\n\nWhen you specify an expected discriminant value, the hook will throw an error at runtime if the actual value doesn't match:\n\n```tsx\nfunction UserProfile() {\n  // This will throw if auth.status !== 'authenticated'\n  const auth = useAuthContext(\"authenticated\");\n\n  return <div>Welcome, {auth.user.name}!</div>;\n}\n```\n\nThis is useful for components that should only render in specific states, catching bugs early in development.\n\n## API\n\n### `createDiscriminatedContext<TUnion, TDiscriminant>(discriminantKey)`\n\nCreates a discriminated context with type-safe narrowing support.\n\n#### Parameters\n\n- `discriminantKey`: The key used as the discriminant in your union type\n\n#### Returns\n\n- `Context`: The React Context object (for use with `Context.Provider`)\n- `useContext`: A hook to consume the context with required type narrowing. Pass a discriminant value to narrow the type, or `'default'` to get the full union type.\n\n#### Throws\n\n- Error if `useContext` is called outside of a Provider\n\n### `DiscriminantValues<TUnion, TKey>`\n\nA utility type that extracts all possible values of the discriminant key from a union type.\n\n```tsx\ntype AuthState =\n  | { status: \"idle\" }\n  | { status: \"loading\" }\n  | { status: \"authenticated\"; user: User };\n\ntype StatusValues = DiscriminantValues<AuthState, \"status\">;\n// Result: 'idle' | 'loading' | 'authenticated'\n```\n\n## Example Application\n\nThe repository includes a full example React application demonstrating the library in action.\n\n### Running the Example\n\n```bash\n# Clone the repository\ngit clone https://github.com/ScriptAlchemist/react-discriminated-union-context.git\ncd react-discriminated-union-context\n\n# Build the library\nnpm install\nnpm run build\n\n# Run the example app\ncd example\nnpm install\nnpm run dev\n```\n\nThen open `http://localhost:5173` in your browser.\n\n### Example Structure\n\nThe example demonstrates an authentication state machine:\n\n```\nexample/src/\n├── authContext.ts          # Context and types definition\n├── components/\n│   ├── AuthStatus.tsx      # Uses full union type\n│   ├── UserProfile.tsx     # Narrowed to \"authenticated\"\n│   └── ErrorDisplay.tsx    # Narrowed to \"error\"\n├── App.tsx                 # Main app with provider\n└── main.tsx                # Entry point\n```\n\n### Key Patterns Demonstrated\n\n1. **Shared Context Module** (`authContext.ts`):\n\n   ```tsx\n   import { createDiscriminatedContext } from \"@bender-tools/react-discriminated-union-context\";\n\n   export type AuthState =\n     | { status: \"idle\" }\n     | { status: \"loading\" }\n     | {\n         status: \"authenticated\";\n         user: { name: string; email: string };\n       }\n     | { status: \"error\"; error: string };\n\n   export const { Context: AuthContext, useContext: useAuthContext } =\n     createDiscriminatedContext<AuthState, \"status\">(\"status\");\n   ```\n\n2. **Full Union Type Usage** (`AuthStatus.tsx`):\n\n   ```tsx\n   export function AuthStatus() {\n     const auth = useAuthContext(\"default\"); // Type: AuthState\n     // Handle all cases manually\n   }\n   ```\n\n3. **Destructuring with 'default'** - Access all possible properties:\n\n   ```tsx\n   export function AuthStatus() {\n     const auth = useAuthContext(\"default\");\n     // Destructure properties from any union member\n     // Hover over 'user' or 'error' to see narrowing hints\n     const { status, user, error } = auth;\n\n     // TypeScript hints: `Use useContext(\"authenticated\") to access \"user\"`\n     console.log(\"status:\", status);\n     console.log(\"user:\", user); // May be undefined\n     console.log(\"error:\", error); // May be undefined\n   }\n   ```\n\n4. **Type Narrowing** (`UserProfile.tsx`):\n\n   ```tsx\n   export function UserProfile() {\n     const auth = useAuthContext(\"authenticated\");\n     // Type: { status: \"authenticated\"; user: { name: string; email: string } }\n     return <div>{auth.user.name}</div>; // TypeScript knows auth.user exists!\n   }\n   ```\n\n5. **Required Parameter**:\n\n   ```tsx\n   // ❌ Error - empty () not allowed, must specify a value\n   const auth = useAuthContext();\n\n   // ✅ Use 'default' to get full union type\n   const auth = useAuthContext(\"default\");\n\n   // ✅ Use a discriminant value to narrow the type\n   const auth = useAuthContext(\"authenticated\");\n   ```\n\n## Requirements\n\n- React 18.0.0 or higher (including React 19)\n- TypeScript 5.0 or higher (for best type inference)\n\n## Running Tests\n\nThis project includes a comprehensive test suite using the Node.js built-in test runner and @testing-library/react.\n\nFrom the repository root, you can run:\n\n```bash\n# Install dependencies\nnpm install\n\n# Type-check the library source\nnpm run typecheck\n\n# Type-check the test files (uses tsconfig.test.json)\nnpm run typecheck:test\n\n# Run the test suite in watch/interactive mode (if configured)\nnpm test\n\n# Run the test suite in CI mode (no watch, suitable for pipelines)\nnpm run test:ci\n```\n\nThe tests cover:\n\n- Type narrowing behavior for discriminated unions\n- `'default'` behavior (including that it does not validate the discriminant)\n- Error handling when used outside of a Provider\n- Various discriminant types and runtime validation behavior\n\n## License\n\nMIT\n","readmeFilename":"README.md"}