{"_id":"@bpits/results-ngx","_rev":"9-1c3daa3a5cc9c061404b94885aadfa1b","name":"@bpits/results-ngx","dist-tags":{"latest":"2.0.2"},"versions":{"1.1.0":{"name":"@bpits/results-ngx","version":"1.1.0","_id":"@bpits/results-ngx@1.1.0","maintainers":[{"name":"brodie124","email":"brodie.pestell7@gmail.com"}],"homepage":"https://github.com/BP-IT-Services/BPITS.Results#readme","bugs":{"url":"https://github.com/BP-IT-Services/BPITS.Results/issues"},"dist":{"shasum":"9106f1d8fb32da4821ebf7daf88b596af77c1e8d","tarball":"https://registry.npmjs.org/@bpits/results-ngx/-/results-ngx-1.1.0.tgz","fileCount":20,"integrity":"sha512-igi9sAcjROg8xk/p0TcLafGk2n/TUXN1I2Pf6M8FDmhaNDvfVU+jzZH3KshBTcjtwgNEElMv97J8UHgDfuAOmA==","signatures":[{"sig":"MEUCIQCBeckclN91YZGNVwAzEM0cp/mdCwtxyBy32WWIP/azGwIgH4V/x+W88VBBheZIl2XyXaL3jqpbxPBcmLgnibSvlBA=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@bpits%2fresults-ngx@1.1.0","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":100370},"module":"fesm2022/bpits-results-ngx.mjs","exports":{".":{"types":"./index.d.ts","default":"./fesm2022/bpits-results-ngx.mjs"},"./package.json":{"default":"./package.json"}},"typings":"index.d.ts","_npmUser":{"name":"brodie124","actor":{"name":"brodie124","type":"user","email":"brodie.pestell7@gmail.com"},"email":"brodie.pestell7@gmail.com"},"repository":{"url":"git+https://github.com/BP-IT-Services/BPITS.Results.git","type":"git"},"_npmVersion":"10.9.2","description":"A robust Angular library for type-safe API result handling and form validation, designed to work seamlessly with the [BPITS.Results](https://www.nuget.org/packages/BPITS.Results) .NET library.","directories":{},"sideEffects":false,"_nodeVersion":"22.17.0","dependencies":{"tslib":"^2.3.0"},"_hasShrinkwrap":false,"peerDependencies":{"@angular/core":"^19.2.0","@angular/common":"^19.2.0"},"_npmOperationalInternal":{"tmp":"tmp/results-ngx_1.1.0_1751929355622_0.44350075965257796","host":"s3://npm-registry-packages-npm-production"}},"1.1.1":{"name":"@bpits/results-ngx","version":"1.1.1","_id":"@bpits/results-ngx@1.1.1","maintainers":[{"name":"brodie124","email":"brodie.pestell7@gmail.com"}],"homepage":"https://github.com/BP-IT-Services/BPITS.Results#readme","bugs":{"url":"https://github.com/BP-IT-Services/BPITS.Results/issues"},"dist":{"shasum":"8582f9ab742f0435726a791ca421437e7a1235fa","tarball":"https://registry.npmjs.org/@bpits/results-ngx/-/results-ngx-1.1.1.tgz","fileCount":20,"integrity":"sha512-NmBx3yGCz3SOF+jgKYSgFDDuXwj3TbRzacr7Wp5OTGw8KKi27sEHCo4zBUUgHrUbFfJLs65lsWW9cTYjTgFFEg==","signatures":[{"sig":"MEYCIQCg4OCA/yGDfxSDlmvjuSj3KauleabB3Zq746O3AQRfcQIhAJXC+lJDPlWnBqCaNlwqaLmqpt8F2td/OEw4fXYzkik5","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@bpits%2fresults-ngx@1.1.1","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":100370},"module":"fesm2022/bpits-results-ngx.mjs","exports":{".":{"types":"./index.d.ts","default":"./fesm2022/bpits-results-ngx.mjs"},"./package.json":{"default":"./package.json"}},"typings":"index.d.ts","_npmUser":{"name":"brodie124","actor":{"name":"brodie124","type":"user","email":"brodie.pestell7@gmail.com"},"email":"brodie.pestell7@gmail.com"},"repository":{"url":"git+https://github.com/BP-IT-Services/BPITS.Results.git","type":"git"},"_npmVersion":"10.9.2","description":"A robust Angular library for type-safe API result handling and form validation, designed to work seamlessly with the [BPITS.Results](https://www.nuget.org/packages/BPITS.Results) .NET library.","directories":{},"sideEffects":false,"_nodeVersion":"22.17.0","dependencies":{"tslib":"^2.3.0"},"_hasShrinkwrap":false,"peerDependencies":{"@angular/core":"^19.2.0","@angular/common":"^19.2.0"},"_npmOperationalInternal":{"tmp":"tmp/results-ngx_1.1.1_1751929749670_0.17148477878145885","host":"s3://npm-registry-packages-npm-production"}},"1.1.2":{"name":"@bpits/results-ngx","version":"1.1.2","license":"AGPL-3.0-only","_id":"@bpits/results-ngx@1.1.2","maintainers":[{"name":"brodie124","email":"brodie.pestell7@gmail.com"}],"homepage":"https://github.com/BP-IT-Services/BPITS.Results#readme","bugs":{"url":"https://github.com/BP-IT-Services/BPITS.Results/issues"},"dist":{"shasum":"44ecf16d788ee9bdceab09fd48096b538ea15514","tarball":"https://registry.npmjs.org/@bpits/results-ngx/-/results-ngx-1.1.2.tgz","fileCount":20,"integrity":"sha512-67RUGj+qtTms5LKQkMZgD2udAl/jBkkqhs4VZq8UQWHfJksutpSodpxfAi5bK200ERhEHNRTGeOceI9rVZ/ZTw==","signatures":[{"sig":"MEUCIQD9Lt8PrcOby1OQf2cbAbbeWOJpZtxZ1iCOj8ZPb4hYuQIgDR9mAXzPenq1OWFTlbkCyXz+9u4OeuSaHDjwdNE7vjg=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@bpits%2fresults-ngx@1.1.2","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":100400},"module":"fesm2022/bpits-results-ngx.mjs","exports":{".":{"types":"./index.d.ts","default":"./fesm2022/bpits-results-ngx.mjs"},"./package.json":{"default":"./package.json"}},"typings":"index.d.ts","_npmUser":{"name":"brodie124","actor":{"name":"brodie124","type":"user","email":"brodie.pestell7@gmail.com"},"email":"brodie.pestell7@gmail.com"},"repository":{"url":"git+https://github.com/BP-IT-Services/BPITS.Results.git","type":"git"},"_npmVersion":"10.9.2","description":"A robust Angular library for type-safe API result handling and form validation, designed to work seamlessly with the [BPITS.Results](https://www.nuget.org/packages/BPITS.Results) .NET library.","directories":{},"sideEffects":false,"_nodeVersion":"22.17.0","dependencies":{"tslib":"^2.3.0"},"_hasShrinkwrap":false,"peerDependencies":{"@angular/core":"^19.2.0","@angular/common":"^19.2.0"},"_npmOperationalInternal":{"tmp":"tmp/results-ngx_1.1.2_1751930140619_0.7753265678465324","host":"s3://npm-registry-packages-npm-production"}},"1.1.3":{"name":"@bpits/results-ngx","version":"1.1.3","license":"MIT","_id":"@bpits/results-ngx@1.1.3","maintainers":[{"name":"brodie124","email":"brodie.pestell7@gmail.com"}],"homepage":"https://github.com/BP-IT-Services/BPITS.Results#readme","bugs":{"url":"https://github.com/BP-IT-Services/BPITS.Results/issues"},"dist":{"shasum":"2d5d1d6f5a62921a8dd307ff97ada5d532ca5efd","tarball":"https://registry.npmjs.org/@bpits/results-ngx/-/results-ngx-1.1.3.tgz","fileCount":20,"integrity":"sha512-F2c0JqcsjX1S7HDnI4EXusoebeBeRYaXSIrMImAju/+65L0GaO76DeJnZMRPjVb/4VTPjPg7cOY4nXtoADCV5w==","signatures":[{"sig":"MEQCIFOrKSOb3OcYap+ZoTa/rDra8conljKxXDgBp7cQRviOAiA7dybSUO/ODnwL5vClTxAOIG/y5mHTRqGk6KTAKoBkyw==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@bpits%2fresults-ngx@1.1.3","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":100664},"module":"fesm2022/bpits-results-ngx.mjs","exports":{".":{"types":"./index.d.ts","default":"./fesm2022/bpits-results-ngx.mjs"},"./package.json":{"default":"./package.json"}},"typings":"index.d.ts","_npmUser":{"name":"brodie124","email":"brodie.pestell7@gmail.com"},"repository":{"url":"git+https://github.com/BP-IT-Services/BPITS.Results.git","type":"git"},"_npmVersion":"10.9.2","description":"A robust Angular library for type-safe API result handling and form validation, designed to work seamlessly with the [BPITS.Results](https://www.nuget.org/packages/BPITS.Results) .NET library.","directories":{},"sideEffects":false,"_nodeVersion":"22.17.0","dependencies":{"tslib":"^2.3.0"},"_hasShrinkwrap":false,"peerDependencies":{"@angular/core":"^19.2.0","@angular/common":"^19.2.0"},"_npmOperationalInternal":{"tmp":"tmp/results-ngx_1.1.3_1752363767159_0.848127107459749","host":"s3://npm-registry-packages-npm-production"}},"1.1.4":{"name":"@bpits/results-ngx","version":"1.1.4","license":"MIT","_id":"@bpits/results-ngx@1.1.4","maintainers":[{"name":"brodie124","email":"brodie.pestell7@gmail.com"}],"homepage":"https://github.com/BP-IT-Services/BPITS.Results#readme","bugs":{"url":"https://github.com/BP-IT-Services/BPITS.Results/issues"},"dist":{"shasum":"845a672855bda7c777ceb52e70101678748c8b06","tarball":"https://registry.npmjs.org/@bpits/results-ngx/-/results-ngx-1.1.4.tgz","fileCount":20,"integrity":"sha512-HF71cx1o8A3CPVQdlypE8c7/knhvFFuXGx9kdMg8zfqb4ghtl0eSaIjcI6tMpQ7cIpDeauMfo8JxQiTqrh3lZQ==","signatures":[{"sig":"MEYCIQDEOgvYzNX9zc8sYghtUMJO7Zuxasfu3MSczArehrKYcgIhAMa+hd296vLhIFgQmrp2xYkI3Ljpk4L4ZOGEVWFhj7gX","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@bpits%2fresults-ngx@1.1.4","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":101038},"module":"fesm2022/bpits-results-ngx.mjs","exports":{".":{"types":"./index.d.ts","default":"./fesm2022/bpits-results-ngx.mjs"},"./package.json":{"default":"./package.json"}},"typings":"index.d.ts","_npmUser":{"name":"brodie124","email":"brodie.pestell7@gmail.com"},"repository":{"url":"git+https://github.com/BP-IT-Services/BPITS.Results.git","type":"git"},"_npmVersion":"10.9.2","description":"A robust Angular library for type-safe API result handling and form validation, designed to work seamlessly with the [BPITS.Results](https://www.nuget.org/packages/BPITS.Results) .NET library.","directories":{},"sideEffects":false,"_nodeVersion":"22.17.0","dependencies":{"tslib":"^2.3.0"},"_hasShrinkwrap":false,"peerDependencies":{"@angular/core":"^19.2.0","@angular/common":"^19.2.0"},"_npmOperationalInternal":{"tmp":"tmp/results-ngx_1.1.4_1752366451834_0.008632800972996568","host":"s3://npm-registry-packages-npm-production"}},"1.1.5":{"name":"@bpits/results-ngx","version":"1.1.5","license":"MIT","_id":"@bpits/results-ngx@1.1.5","maintainers":[{"name":"brodie124","email":"brodie.pestell7@gmail.com"}],"homepage":"https://github.com/BP-IT-Services/BPITS.Results#readme","bugs":{"url":"https://github.com/BP-IT-Services/BPITS.Results/issues"},"dist":{"shasum":"4b4ef4d24a010ecc79ff917606eeb06b67a5003a","tarball":"https://registry.npmjs.org/@bpits/results-ngx/-/results-ngx-1.1.5.tgz","fileCount":19,"integrity":"sha512-VljaGrGiWwptAy5JJbAmX9u8lpYqVGm4N5pxxQF8JinXRiENJ+sklM+w6p1f6AapBNVSXKmfSddNbFIRFEo08A==","signatures":[{"sig":"MEUCICLGb//RxXvNsE2sNYIHfDy0SucS/h39DPkW9hNrdvWQAiEAzIpui+0WPSfEeJFPrfNR7HspY/phwFjGipEDNr4YYYA=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@bpits%2fresults-ngx@1.1.5","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":101721},"module":"fesm2022/bpits-results-ngx.mjs","exports":{".":{"types":"./index.d.ts","default":"./fesm2022/bpits-results-ngx.mjs"},"./package.json":{"default":"./package.json"}},"typings":"index.d.ts","_npmUser":{"name":"brodie124","email":"brodie.pestell7@gmail.com"},"repository":{"url":"git+https://github.com/BP-IT-Services/BPITS.Results.git","type":"git"},"_npmVersion":"10.9.3","description":"A robust Angular library for type-safe API result handling and form validation, designed to work seamlessly with the [BPITS.Results](https://www.nuget.org/packages/BPITS.Results) .NET library.","directories":{},"sideEffects":false,"_nodeVersion":"22.18.0","dependencies":{"tslib":"^2.3.0"},"_hasShrinkwrap":false,"peerDependencies":{"@angular/core":"^19.2.0","@angular/common":"^19.2.0","@bpits/type-guards":"^1.0.4"},"_npmOperationalInternal":{"tmp":"tmp/results-ngx_1.1.5_1754742529120_0.6812074283203458","host":"s3://npm-registry-packages-npm-production"}},"2.0.0":{"name":"@bpits/results-ngx","version":"2.0.0","license":"MIT","_id":"@bpits/results-ngx@2.0.0","maintainers":[{"name":"brodie124","email":"brodie.pestell7@gmail.com"}],"homepage":"https://github.com/BP-IT-Services/BPITS.Results#readme","bugs":{"url":"https://github.com/BP-IT-Services/BPITS.Results/issues"},"dist":{"shasum":"e085a1a6a0abf1b849f2588df682ceefacf45243","tarball":"https://registry.npmjs.org/@bpits/results-ngx/-/results-ngx-2.0.0.tgz","fileCount":19,"integrity":"sha512-SQDNmfAQPTUfYQLB2/LhOSR/t8KdsosWkv7hNJfCHZfGYf2ECjFGPNW8ZTEkcnLP1ncJNOfBz4Io299rMCcqSg==","signatures":[{"sig":"MEUCIQDWhx/B5kTioatQB4q0N2AHOQaFPuS8b137rUubksSFmgIgR5dubHR9/mF425H3rnM8ngFF/Ugr9QYZlAKpNk9ee9w=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@bpits%2fresults-ngx@2.0.0","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":101721},"module":"fesm2022/bpits-results-ngx.mjs","exports":{".":{"types":"./index.d.ts","default":"./fesm2022/bpits-results-ngx.mjs"},"./package.json":{"default":"./package.json"}},"typings":"index.d.ts","_npmUser":{"name":"brodie124","email":"brodie.pestell7@gmail.com"},"repository":{"url":"git+https://github.com/BP-IT-Services/BPITS.Results.git","type":"git"},"_npmVersion":"10.9.4","description":"A robust Angular library for type-safe API result handling and form validation, designed to work seamlessly with the [BPITS.Results](https://www.nuget.org/packages/BPITS.Results) .NET library.","directories":{},"sideEffects":false,"_nodeVersion":"22.22.0","dependencies":{"tslib":"^2.3.0"},"_hasShrinkwrap":false,"peerDependencies":{"@angular/core":"^19.2.0","@angular/common":"^19.2.0","@bpits/type-guards":"^1.0.4"},"_npmOperationalInternal":{"tmp":"tmp/results-ngx_2.0.0_1769545045120_0.4112459338938652","host":"s3://npm-registry-packages-npm-production"}},"2.0.1":{"name":"@bpits/results-ngx","version":"2.0.1","license":"MIT","_id":"@bpits/results-ngx@2.0.1","maintainers":[{"name":"brodie124","email":"brodie.pestell7@gmail.com"}],"homepage":"https://github.com/BP-IT-Services/BPITS.Results#readme","bugs":{"url":"https://github.com/BP-IT-Services/BPITS.Results/issues"},"dist":{"shasum":"3de96640baa47f6c752b9ab4cdc083d194a22247","tarball":"https://registry.npmjs.org/@bpits/results-ngx/-/results-ngx-2.0.1.tgz","fileCount":19,"integrity":"sha512-jfCZlC7Th5+E+vjYWeRqcT5uoAI6h3z8Q86dlN/tKu2Qf3OitZMBMQ0Srp0+x84TO1gjHgSeY/Cl0xDYfLxjTA==","signatures":[{"sig":"MEUCIHv5pUOep7OHkaYRKjkq8epstJcmGLlj6aJw1rrkQwbtAiEA/Ta7EBOQshzTFhr6uSCL4w5oUxWJ5ZNePznouRF2Fqk=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@bpits%2fresults-ngx@2.0.1","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":101721},"module":"fesm2022/bpits-results-ngx.mjs","exports":{".":{"types":"./index.d.ts","default":"./fesm2022/bpits-results-ngx.mjs"},"./package.json":{"default":"./package.json"}},"typings":"index.d.ts","_npmUser":{"name":"brodie124","email":"brodie.pestell7@gmail.com"},"repository":{"url":"git+https://github.com/BP-IT-Services/BPITS.Results.git","type":"git"},"_npmVersion":"10.9.4","description":"A robust Angular library for type-safe API result handling and form validation, designed to work seamlessly with the [BPITS.Results](https://www.nuget.org/packages/BPITS.Results) .NET library.","directories":{},"sideEffects":false,"_nodeVersion":"22.22.0","dependencies":{"tslib":"^2.3.0"},"_hasShrinkwrap":false,"peerDependencies":{"@angular/core":"^19.2.0","@angular/common":"^19.2.0","@bpits/type-guards":"^1.0.4"},"_npmOperationalInternal":{"tmp":"tmp/results-ngx_2.0.1_1769545990168_0.10466616626178671","host":"s3://npm-registry-packages-npm-production"}},"2.0.2":{"name":"@bpits/results-ngx","repository":{"type":"git","url":"git+https://github.com/BP-IT-Services/BPITS.Results.git"},"license":"MIT","version":"2.0.2","peerDependencies":{"@angular/common":"^19.2.0","@angular/core":"^19.2.0","@bpits/type-guards":"^1.0.4"},"dependencies":{"tslib":"^2.3.0"},"sideEffects":false,"module":"fesm2022/bpits-results-ngx.mjs","typings":"index.d.ts","exports":{"./package.json":{"default":"./package.json"},".":{"types":"./index.d.ts","default":"./fesm2022/bpits-results-ngx.mjs"}},"_id":"@bpits/results-ngx@2.0.2","description":"A robust Angular library for type-safe API result handling and form validation, designed to work seamlessly with the [BPITS.Results](https://www.nuget.org/packages/BPITS.Results) .NET library.","bugs":{"url":"https://github.com/BP-IT-Services/BPITS.Results/issues"},"homepage":"https://github.com/BP-IT-Services/BPITS.Results#readme","_nodeVersion":"22.22.0","_npmVersion":"10.9.4","dist":{"integrity":"sha512-6xugd9pMwym/QRQ3/tIkSLKVvq8Ixl2shRCjSZ3ORrHhnslEb11chz7jy/VFsI+ZvMNz+5ZuqcLKBawBu9GNiA==","shasum":"67984c1c760a5b5ccd7b6e90b1525352d9c10e7e","tarball":"https://registry.npmjs.org/@bpits/results-ngx/-/results-ngx-2.0.2.tgz","fileCount":19,"unpackedSize":102024,"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@bpits%2fresults-ngx@2.0.2","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"signatures":[{"keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U","sig":"MEQCIAVm0JnsUdjWksNJK4T9caiujorqT6BreT7pCrChAsHnAiAI21t9QIBgBL1fBXTRmxxAdN8ijFOpPj+LLAKSvkEN0g=="}]},"_npmUser":{"name":"brodie124","email":"brodie.pestell7@gmail.com"},"directories":{},"maintainers":[{"name":"brodie124","email":"brodie.pestell7@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages-npm-production","tmp":"tmp/results-ngx_2.0.2_1772409813765_0.14811709449890365"},"_hasShrinkwrap":false}},"time":{"created":"2025-07-07T23:02:35.564Z","modified":"2026-03-02T00:03:34.206Z","1.1.0":"2025-07-07T23:02:35.829Z","1.1.1":"2025-07-07T23:09:09.886Z","1.1.2":"2025-07-07T23:15:40.799Z","1.1.3":"2025-07-12T23:42:47.348Z","1.1.4":"2025-07-13T00:27:32.022Z","1.1.5":"2025-08-09T12:28:49.287Z","2.0.0":"2026-01-27T20:17:25.257Z","2.0.1":"2026-01-27T20:33:10.325Z","2.0.2":"2026-03-02T00:03:33.906Z"},"bugs":{"url":"https://github.com/BP-IT-Services/BPITS.Results/issues"},"license":"MIT","homepage":"https://github.com/BP-IT-Services/BPITS.Results#readme","repository":{"type":"git","url":"git+https://github.com/BP-IT-Services/BPITS.Results.git"},"description":"A robust Angular library for type-safe API result handling and form validation, designed to work seamlessly with the [BPITS.Results](https://www.nuget.org/packages/BPITS.Results) .NET library.","maintainers":[{"name":"brodie124","email":"brodie.pestell7@gmail.com"}],"readme":"# @bpits/results-ngx\n\nA robust Angular library for type-safe API result handling and form validation, designed to work seamlessly with the [BPITS.Results](https://www.nuget.org/packages/BPITS.Results) .NET library.\n\n## Table of Contents\n\n- [Overview](#overview)\n- [Installation](#installation)\n- [Quick Start](#quick-start)\n  - [1. Define Your Status Code Enum](#1-define-your-status-code-enum)\n  - [2. Create Your API Client](#2-create-your-api-client)\n  - [3. Build Your Services](#3-build-your-services)\n  - [4. Create Forms with Validation](#4-create-forms-with-validation)\n- [Core Concepts](#core-concepts)\n  - [BaseApiResult](#baseapiresult)\n  - [ApiClient](#apiclient)\n  - [Form Managers](#form-managers)\n- [API Client Usage](#api-client-usage)\n  - [Making HTTP Requests](#making-http-requests)\n  - [Type Guards and Validation](#type-guards-and-validation)\n  - [Request Cancellation](#request-cancellation)\n  - [Error Handling](#error-handling)\n- [Form Management](#form-management)\n  - [Basic Form Validation](#basic-form-validation)\n  - [API Validation Integration](#api-validation-integration)\n  - [Multi-Step Forms](#multi-step-forms)\n  - [Form Field Component](#form-field-component)\n- [Advanced Patterns](#advanced-patterns)\n  - [Custom Error Handling](#custom-error-handling)\n  - [Form Change Tracking](#form-change-tracking)\n  - [Validation Message Customization](#validation-message-customization)\n- [Best Practices](#best-practices)\n- [Integration with Backend](#integration-with-backend)\n\n## Overview\n\n`@bpits/results-ngx` provides a comprehensive solution for handling API responses and form validation in Angular applications.\nIt offers:\n\n- **Type-safe API responses** with `BaseApiResult<T, TStatusCode>`\n- **Integrated form validation** that combines Angular Reactive Forms with server-side validation\n- **Automatic error handling** and display\n- **Multi-step form support** with validation state management\n- **Request cancellation** capabilities\n- **Consistent error patterns** across your application\n\n## Installation\n\n```bash\nnpm install @bpits/results-ngx\n```\n\n## Quick Start\n\n### 1. Define Your Status Code Enum\n\nCreate an enum that matches your backend status codes. **Important**: Your enum must include specific values that the library\nrequires to automatically handle network errors and unexpected responses:\n\n```typescript\n// api/app-status-code.ts\nexport enum AppStatusCode {\n  Ok = 1,\n  GenericFailure = 2,\n  BadRequest = 3,\n  Unauthorized = 4,\n  NotFound = 5,\n\n  // These client-only status codes are REQUIRED by the library\n  // for automatic error handling:\n  RequestCancelled = 65533,  // When requests are cancelled\n  UnexpectedFormat = 65534,  // When responses don't match expected format\n  ServerUnreachable = 65535, // When network requests fail\n}\n```\n\nThe library automatically handles network failures, request cancellations, and malformed responses behind the scenes.\nIt needs to know which status codes to use for these scenarios, which is where the `ICustomStatusCodeProvider` (next step)\ncomes in to create the mapping.\n\n### 2. Create Your API Types and Client\n\nCreate your app-specific types and API client:\n\n```typescript\n// api/status-code-provider.ts\nimport { ICustomStatusCodeProvider } from '@bpits/results-ngx';\nimport { AppStatusCode } from './app-status-code';\n\nexport class AppStatusCodeProvider implements ICustomStatusCodeProvider<AppStatusCode> {\n  readonly serverUnreachable = AppStatusCode.ServerUnreachable;\n  readonly unexpectedFormat = AppStatusCode.UnexpectedFormat;\n  readonly requestCancelled = AppStatusCode.RequestCancelled;\n  readonly badRequest = AppStatusCode.BadRequest;\n  readonly authenticationTokenInvalid = AppStatusCode.Unauthorized;\n  readonly genericFailure = AppStatusCode.GenericFailure;\n}\n```\n\nThe `ICustomStatusCodeProvider` creates a bridge between your enum values and the library's automatic error handling.\nWhen network requests fail or responses are malformed, the library uses these mappings to set the appropriate status code.\n\n```typescript\n// api/app-api-result.ts\nimport { BaseApiResult } from '@bpits/results-ngx';\nimport { AppStatusCode } from './app-status-code';\n\nexport type AppApiResult<T> = BaseApiResult<T, AppStatusCode>;\n```\n\nThis type alias eliminates boilerplate throughout your application. Instead of writing `BaseApiResult<User, AppStatusCode>` everywhere,\nyou can write `AppApiResult<User>`. The types remain fully interchangeable while dramatically improving readability.\n\n```typescript\n// api/app-api-client.ts\nimport { HttpClient } from '@angular/common/http';\nimport { ApiClient } from '@bpits/results-ngx';\nimport { AppStatusCode } from './app-status-code';\nimport { AppStatusCodeProvider } from './status-code-provider';\n\nexport class AppApiClient extends ApiClient<AppStatusCode> {\n  constructor(http: HttpClient) {\n    super(http, new AppStatusCodeProvider(), 'https://api.your-domain.com/');\n  }\n}\n```\n\nExtending `ApiClient` bakes in your status code enum and provider, eliminating the need to specify these generics repeatedly.\nThis creates a clean, app-specific API for making HTTP requests.\n\n### 3. Build Your Services\n\nCreate services that use your API client. For best practice, define type guards for all your models - the library automatically validates responses using these guards:\n\n```typescript\n// services/user.service.ts\nimport { inject, Injectable } from '@angular/core';\nimport { Observable } from 'rxjs';\nimport { AppApiClient } from '../api/app-api-client';\nimport { AppApiResult } from '../api/app-api-result';\nimport { AppStatusCode } from '../api/app-status-code';\n\nexport interface User {\n  id: string;\n  name: string;\n  email: string;\n}\n\nexport interface CreateUserRequest {\n  name: string;\n  email: string;\n}\n\n// Type guard for User - crucial for automatic response validation\nfunction isUser(obj: unknown): obj is User {\n  if (!obj || typeof obj !== 'object') return false;\n  const user = obj as Record<string, unknown>;\n  return typeof user.id === 'string' && \n         typeof user.name === 'string' && \n         typeof user.email === 'string';\n}\n\n@Injectable({ providedIn: 'root' })\nexport class UserService {\n  private readonly _api = inject(AppApiClient);\n\n  async getUserAsync(\n    userId: string,\n    cancelRequest$?: Observable<unknown>\n  ): Promise<AppApiResult<User>> {\n    try {\n      const url = `users/${encodeURIComponent(userId)}`;\n      return await this._api.getAsync(url, isUser, undefined, cancelRequest$);\n    } catch (err) {\n      console.error(\"Failed to get user!\", err);\n      return this._api.handleRequestError(err);\n    }\n  }\n\n  async createUserAsync(\n    request: CreateUserRequest,\n    cancelRequest$?: Observable<unknown>\n  ): Promise<AppApiResult<User>> {\n    try {\n      return await this._api.postAsync('users', request, isUser, undefined, cancelRequest$);\n    } catch (err) {\n      console.error(\"Failed to create user!\", err);\n      return this._api.handleRequestError(err);\n    }\n  }\n}\n```\n\nThe library automatically calls your type guard on every successful response. If the server returns data that doesn't match\nyour expected structure, the library automatically returns an `AppApiResult` with `statusCode: AppStatusCode.UnexpectedFormat`.\nThis protects your application from malformed API responses and provides additional type safety beyond TypeScript's compile-time\nchecks.\n\n### 4. Create Your Form Managers\n\nCreate app-specific form managers that eliminate boilerplate and automatically connect Angular Reactive Forms with API validation:\n\n```typescript\n// forms/app-form-managers.ts\nimport { \n  BaseApiValidatedFormManager, \n  BaseApiValidatedStepFormManager,\n  GenericFormGroup \n} from '@bpits/results-ngx';\nimport { AppStatusCode } from '../api/app-status-code';\n\nexport class AppApiValidatedFormManager<TFormGroup extends GenericFormGroup<TFormGroup>>\n  extends BaseApiValidatedFormManager<TFormGroup, AppStatusCode> {\n  // Inherit base behaviour and extend/override if necessary\n  // You can add app-specific form validation logic here\n}\n\nexport class AppApiValidatedStepFormManager<TFormGroup extends GenericFormGroup<TFormGroup>> \n  extends BaseApiValidatedStepFormManager<TFormGroup, AppStatusCode> {\n  // Inherit base behaviour and extend/override if necessary\n  // You can add app-specific step form logic here\n}\n```\n\nThese form managers provide several key benefits: they reduce boilerplate by eliminating repetitive validation checking code,\nautomatically integrate with API responses so server validation errors appear on the correct form fields when you call\n`applyApiValidationErrors(apiResult)`, seamlessly blend client-side (Angular Validators) and server-side validation errors,\nand bake in your status code enum for better type safety.\n\n### 5. Create Forms with Validation\n\nUse the form managers and `FormField` component for integrated validation. The `FormField` component automatically displays\nvalidation errors from both Angular Reactive Forms and API responses:\n\n```typescript\n// components/user-form.component.ts\nimport { Component, inject } from '@angular/core';\nimport { FormBuilder, FormControl, ReactiveFormsModule, Validators } from '@angular/forms';\nimport { FormFieldComponent } from '@bpits/results-ngx';\nimport { AppApiValidatedFormManager } from '../forms/app-form-managers';\nimport { UserService, CreateUserRequest } from '../services/user.service';\nimport { AppStatusCode } from '../api/app-status-code';\n\n@Component({\n  selector: 'app-user-form',\n  standalone: true,\n  imports: [ ReactiveFormsModule, FormFieldComponent ],\n  template: `\n    <form [formGroup]=\"formGroup\" (ngSubmit)=\"submitAsync()\">\n      <app-form-field \n        field=\"name\"\n        [formManager]=\"formManager\"\n        [formErrorMessages]=\"{required: 'Name is required'}\">\n        <label for=\"name\">Name *</label>\n        <input \n          id=\"name\" \n          formControlName=\"name\"\n          [class]=\"formManager.getInvalidFieldClasses('name')\" />\n      </app-form-field>\n\n      <app-form-field \n        field=\"email\"\n        [formManager]=\"formManager\"\n        [formErrorMessages]=\"{required: 'Email is required', email: 'Invalid email format'}\">\n        <label for=\"email\">Email *</label>\n        <input \n          id=\"email\" \n          type=\"email\"\n          formControlName=\"email\"\n          [class]=\"formManager.getInvalidFieldClasses('email')\" />\n      </app-form-field>\n\n      <button type=\"submit\" [disabled]=\"formManager.isSubmitted && formGroup.invalid\">\n        Create User\n      </button>\n    </form>\n  `\n})\nexport class UserFormComponent {\n  private readonly _userService = inject(UserService);\n  private readonly _formBuilder = inject(FormBuilder);\n\n  public readonly formManager = new AppApiValidatedFormManager(\n    this._formBuilder.group({\n      name: new FormControl<string>('', [ Validators.required ]),\n      email: new FormControl<string>('', [ Validators.required, Validators.email ])\n    })\n  );\n\n  public get formGroup() {\n    return this.formManager.formGroup;\n  }\n\n  public async submitAsync() {\n    if (!this.formManager.validate()) {\n      return; // Client-side validation failed\n    }\n\n    const formValue = this.formGroup.value;\n    const request: CreateUserRequest = {\n      name: formValue.name!,\n      email: formValue.email!\n    };\n\n    const result = await this._userService.createUserAsync(request);\n\n    if (result.statusCode === AppStatusCode.Ok) {\n      // Handle success\n      console.log('User created:', result.value);\n      this.formManager.reset();\n    } else if (result.statusCode === AppStatusCode.BadRequest) {\n      // This is the magic: server validation errors automatically \n      // appear on the correct form fields!\n      this.formManager.applyApiValidationErrors(result);\n    } else {\n      // Handle other errors\n      console.error('Failed to create user:', result.errorMessage);\n    }\n  }\n}\n```\n\n**How the `FormField` component works**: The component requires a form manager parameter and automatically shows validation\nerrors from three sources: Angular Validators (required, email, etc.) with your custom error messages, API validation errors\nfrom `result.errorDetails` when you call `applyApiValidationErrors()`, and global form-level validation errors.\nField-specific errors take precedence over global errors, and you just need to wrap your form inputs with `<app-form-field>`\n- errors appear automatically with zero additional configuration.\n\nThe key insight here is that when your server returns validation errors in the `errorDetails` object\n(like `{\"email\": [\"Email address is already in use\"]}`), calling `formManager.applyApiValidationErrors(result)` makes those\nerrors automatically appear below the correct form fields. No manual error handling required!\n\n\n## Core Concepts\n\n### BaseApiResult\n\nThe core type for all API responses. You should create your own type alias:\n\n```typescript\n// Your app-specific type\nexport type AppApiResult<T> = BaseApiResult<T, AppStatusCode>;\n\n// Base type structure\ntype BaseApiResult<T, TResultStatusEnum> = {\n  statusCode: TResultStatusEnum;\n  value: T | null;\n  errorMessage: string | null;\n  errorDetails: Record<string, string[]> | null;\n}\n```\n\n**Properties:**\n\n- `statusCode`: Enum value indicating the result status\n- `value`: The actual data (null for failures)\n- `errorMessage`: General error message\n- `errorDetails`: Field-specific validation errors\n\n### ApiClient\n\nBase class for making HTTP requests with automatic result parsing. You should extend this with your own implementation:\n\n```typescript\n// Your app-specific API client\nexport class AppApiClient extends ApiClient<AppStatusCode> {\n  constructor(http: HttpClient) {\n    super(http, new AppStatusCodeProvider(), 'https://api.your-domain.com/');\n  }\n}\n\n// Base class methods available:\nabstract class ApiClient<TResultStatusEnum> {\n  // HTTP methods\n  getAsync<T>(url, typeGuard?, options?, cancelRequest$?): Promise<BaseApiResult<T, TResultStatusEnum>>\n\n  postAsync<T>(url, payload, typeGuard?, options?, cancelRequest$?): Promise<BaseApiResult<T, TResultStatusEnum>>\n\n  patchAsync<T>(url, payload, typeGuard?, options?, cancelRequest$?): Promise<BaseApiResult<T, TResultStatusEnum>>\n\n  deleteAsync<T>(url, typeGuard?, options?, cancelRequest$?): Promise<BaseApiResult<T, TResultStatusEnum>>\n\n  // Error handling\n  handleRequestError<T>(error): BaseApiResult<T, TResultStatusEnum>\n}\n```\n\n### Form Managers\n\nYou should create app-specific form managers that extend the base classes:\n\n```typescript\n// Your app-specific form managers\nexport class AppApiValidatedFormManager<TFormGroup extends GenericFormGroup<TFormGroup>>\n  extends BaseApiValidatedFormManager<TFormGroup, AppStatusCode> {\n  // Add your app-specific validation logic here\n}\n\nexport class AppApiValidatedStepFormManager<TFormGroup extends GenericFormGroup<TFormGroup>>\n  extends BaseApiValidatedStepFormManager<TFormGroup, AppStatusCode> {\n  // Add your app-specific step form logic here\n}\n```\n\n**BaseApiValidatedFormManager**: Integrates Angular Reactive Forms with API validation  \n**BaseApiValidatedStepFormManager**: Extends the base manager for multi-step forms\n\n## API Client Usage\n\n### Making HTTP Requests\n\n```typescript\n// GET request with type validation\nconst userResult = await apiClient.getAsync('users/123', isUser);\n\n// POST request with payload\nconst createResult = await apiClient.postAsync('users', createRequest, isUser);\n\n// PATCH request\nconst updateResult = await apiClient.patchAsync('users/123', updateData, isUser);\n\n// DELETE request\nconst deleteResult = await apiClient.deleteAsync('users/123');\n```\n\n### Type Guards and Validation\n\nType guards ensure response data matches expected types:\n\n```typescript\nfunction isUser(obj: unknown): obj is User {\n  if (!obj || typeof obj !== 'object') return false;\n  const user = obj as Record<string, unknown>;\n  return typeof user.id === 'string' &&\n    typeof user.name === 'string' &&\n    typeof user.email === 'string';\n}\n\n// Use with API calls\nconst result = await apiClient.getAsync('users/123', isUser);\nif (result.statusCode === AppStatusCode.Ok) {\n  // result.value is guaranteed to be User type\n  console.log(result.value.name);\n}\n```\n\n### Request Cancellation\n\nCancel requests using observables:\n\n```typescript\nimport { Subject, takeUntil } from 'rxjs';\n\nconst cancelSubject = new Subject<void>();\n\n// Start request\nconst resultPromise = apiClient.getAsync('users', isUserArray, undefined, cancelSubject);\n\n// Cancel after 5 seconds\nsetTimeout(() => cancelSubject.next(), 5000);\n\nconst result = await resultPromise;\nif (result.statusCode === AppStatusCode.RequestCancelled) {\n  console.log('Request was cancelled');\n}\n```\n\n### Error Handling\n\n```typescript\nasync function handleApiCall() {\n  const result = await userService.getUserAsync('123');\n\n  switch (result.statusCode) {\n    case AppStatusCode.Ok:\n      // Handle success\n      return result.value;\n\n    case AppStatusCode.NotFound:\n      // Handle not found\n      showMessage('User not found');\n      break;\n\n    case AppStatusCode.ServerUnreachable:\n      // Handle network issues\n      showMessage('Server unreachable. Please try again.');\n      break;\n\n    default:\n      // Handle unexpected errors\n      showMessage('An unexpected error occurred');\n      break;\n  }\n}\n```\n\n## Form Management\n\n### Basic Form Validation\n\n```typescript\nexport class MyFormComponent {\n  public readonly formManager = new AppApiValidatedFormManager(\n    this.formBuilder.group({\n      name: [ '', Validators.required ],\n      email: [ '', [ Validators.required, Validators.email ] ]\n    })\n  );\n\n  async submit() {\n    if (!this.formManager.validate()) {\n      return; // Form has client-side validation errors\n    }\n\n    // Form is valid, proceed with submission\n    const result = await this.submitToApi(this.formManager.formGroup.value);\n\n    if (result.statusCode === AppStatusCode.BadRequest) {\n      // Apply server validation errors\n      this.formManager.applyApiValidationErrors(result);\n    }\n  }\n}\n```\n\n### API Validation Integration\n\nServer validation errors are automatically applied to form fields:\n\n```typescript\n// Server returns validation errors\nconst result = {\n  statusCode: AppStatusCode.BadRequest,\n  value: null,\n  errorMessage: \"Validation failed\",\n  errorDetails: {\n    \"email\": [ \"Email address is already in use\" ],\n    \"name\": [ \"Name must be at least 2 characters\" ]\n  }\n};\n\n// Apply to form\nthis.formManager.applyApiValidationErrors(result);\n\n// Errors are now displayed in FormFieldComponents\n```\n\n### Multi-Step Forms\n\n```typescript\nimport { ControlStepMap } from '@bpits/results-ngx';\nimport { AppApiValidatedStepFormManager } from '../forms/app-form-managers';\n\nconst stepMap = new ControlStepMap({\n  name: 1,\n  email: 1,\n  address: 2,\n  phone: 2,\n  preferences: 3\n});\n\nconst stepFormManager = new AppApiValidatedStepFormManager(formGroup, stepMap);\n\n// Validate current step before moving to next\nconst canMoveToNext = stepFormManager.validateCanMoveToNextStep(currentStep);\n\n// Find earliest step with validation errors\nconst errorStep = stepFormManager.findEarliestStepWithValidationError(apiResult);\n```\n\n### Form Field Component\n\nThe `FormFieldComponent` automatically displays validation errors:\n\n```html\n\n<app-form-field\n  field=\"email\"\n  [formManager]=\"formManager\"\n  [formErrorMessages]=\"{\n    required: 'Email is required',\n    email: 'Please enter a valid email'\n  }\">\n  <label for=\"email\">Email Address</label>\n  <input\n    id=\"email\"\n    type=\"email\"\n    formControlName=\"email\"\n    [class]=\"formManager.getInvalidFieldClasses('email')\" />\n</app-form-field>\n```\n\n## Advanced Patterns\n\n### Custom Error Handling\n\nCreate reusable error handling utilities:\n\n```typescript\n// utils/error-handler.ts\nimport { AppApiResult } from '../api/app-api-result';\n\nexport function handleCommonApiErrors(\n  result: AppApiResult<unknown>,\n  messageService: MessageService\n)\n{\n  switch (result.statusCode) {\n    case AppStatusCode.Unauthorized:\n      messageService.showError('You are not authorized to perform this action');\n      break;\n    case AppStatusCode.NotFound:\n      messageService.showError('The requested resource was not found');\n      break;\n    case AppStatusCode.ServerUnreachable:\n      messageService.showError('Unable to connect to server. Please try again.');\n      break;\n    default:\n      messageService.showError('An unexpected error occurred');\n      break;\n  }\n}\n\n// Use in components\nconst result = await this.userService.createUserAsync(request);\nif (result.statusCode !== AppStatusCode.Ok) {\n  handleCommonApiErrors(result, this.messageService);\n}\n```\n\n### Form Change Tracking\n\nTrack and restore form changes:\n\n```typescript\nexport class FormComponent implements OnInit, OnDestroy {\n  ngOnInit() {\n    // Enable change tracking\n    this.formManager.trackFormChanges(true);\n\n    // Subscribe to changes\n    this.formManager.onFormValueChanged$.subscribe(event => {\n      if (event.hasChanged) {\n        console.log('Form has unsaved changes');\n      }\n    });\n  }\n\n  ngOnDestroy() {\n    this.formManager.onDestroy();\n  }\n\n  restoreChanges() {\n    this.formManager.restoreTrackedChanges();\n  }\n\n  resetChanges() {\n    this.formManager.resetTrackedChanges();\n  }\n}\n```\n\n### Validation Message Customization\n\nUse the pipe directly for custom validation display:\n\n```typescript\n// In component template\n{\n  {\n    apiResult | apiValidationMessage\n  :\n    'fieldName'\n  }\n}\n\n// In component code\nimport { ApiValidationMessagePipe } from '@bpits/results-ngx';\n\nconst hasError = ApiValidationMessagePipe.hasError(apiResult, 'email');\nconst errors = ApiValidationMessagePipe.getErrors(apiResult, 'email');\n```\n\n## Best Practices\n\n### 1. Consistent Status Code Definitions\n\nKeep your frontend status codes synchronized with your backend:\n\n```typescript\n// Ensure these match your backend enum exactly\nexport enum AppStatusCode {\n  Ok = 1,\n  GenericFailure = 2,\n  BadRequest = 3,\n  // ... other codes\n}\n```\n\n### 2. Type Guards for All API Responses\n\nAlways use type guards to ensure type safety:\n\n```typescript\nfunction isUserArray(obj: unknown): obj is User[] {\n  return Array.isArray(obj) && obj.every(isUser);\n}\n```\n\n### 3. Centralized Error Handling\n\nCreate utility functions for common error scenarios:\n\n```typescript\nexport const ApiErrorHandlers = {\n  handleStandardErrors: (result: AppApiResult<unknown>) => {\n    // Handle common patterns\n  },\n\n  handleFormErrors: (result: AppApiResult<unknown>, formManager: AppApiValidatedFormManager<any>) => {\n    if (result.statusCode === AppStatusCode.BadRequest) {\n      formManager.applyApiValidationErrors(result);\n      return true;\n    }\n    return false;\n  }\n};\n```\n\n### 4. Proper Cleanup\n\nAlways clean up form managers and subscriptions:\n\n```typescript\nexport class MyComponent implements OnDestroy {\n  ngOnDestroy() {\n    this.formManager.onDestroy();\n  }\n}\n```\n\n### 5. Request Cancellation for Navigation\n\nCancel pending requests when users navigate away:\n\n```typescript\nexport class MyComponent implements OnDestroy {\n  private readonly destroy$ = new Subject<void>();\n\n  async loadData() {\n    const result = await this.apiClient.getAsync('data', typeGuard, undefined, this.destroy$);\n    // Handle result\n  }\n\n  ngOnDestroy() {\n    this.destroy$.next();\n    this.destroy$.complete();\n  }\n}\n```\n\n## Integration with Backend\n\nThis library is designed to work seamlessly with the [BPITS.Results](https://www.nuget.org/packages/BPITS.Results) .NET library. When your backend returns `ApiResult<T>` responses, they will be automatically parsed and validated by the frontend.\n\n**Backend (.NET):**\n\n```csharp\n[HttpPost]\npublic async Task<ApiResult<UserDto>> CreateUser([FromBody] CreateUserRequest request)\n{\n    var result = await _userService.CreateUserAsync(request);\n    return ApiResult.FromServiceResult(result.MapValue(u => u?.ToDto()));\n}\n```\n\n**Frontend (Angular):**\n\n```typescript\nconst result = await this.userService.createUserAsync(request);\n// result is automatically typed as AppApiResult<User>\n```\n\nThe status codes, error messages, and validation details flow seamlessly from backend to frontend, providing a consistent developer experience across your entire application stack.\n","readmeFilename":"README.md"}