{"_id":"remix-domains","_rev":"35-92bfc2fc1990056ea4cb1b859f6c54b3","name":"remix-domains","dist-tags":{"latest":"0.3.2"},"versions":{"0.0.0":{"name":"remix-domains","version":"0.0.0","description":"","main":"index.js","scripts":{"test":"echo \"Error: no test specified\" && exit 1"},"repository":{"type":"git","url":"git+https://github.com/SeasonedSoftware/remix-domains.git"},"author":{"name":"Gustavo Guichard"},"license":"ISC","bugs":{"url":"https://github.com/SeasonedSoftware/remix-domains/issues"},"homepage":"https://github.com/SeasonedSoftware/remix-domains#readme","gitHead":"256196e69c124ac59001aae141935ae18fd5a755","_id":"remix-domains@0.0.0","_nodeVersion":"16.13.1","_npmVersion":"8.3.0","dist":{"integrity":"sha512-53gagQEfLkr4L71cTqA/+BWbMmxRGvTU9BpgNgagPER0L6+8ktywp0IxpYKBpW0ttE5HLDblymwa6HvqAJaHxg==","shasum":"79fb0d11931ee5dea3a98c319bc2d9ba5ee1560c","tarball":"https://registry.npmjs.org/remix-domains/-/remix-domains-0.0.0.tgz","fileCount":1,"unpackedSize":499,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJiL5u3ACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2Vmr0Cg//RZHLFH207CBXQWUIBPOKzGmAsi430tTdWhKVZsbzkoCSsrFp\r\nWRxsVkBeak+yA580EwLUZVEQ0eQ1ijoSabpHdt9tSLeUnl4XJEovTDxQ9HiH\r\nltnSh6VeYag8YGI91KjSONu/14nxDxRY5TIM59gvi5IHrX3gV8xz6tyRSYqE\r\nMGGTT4l3JjY9d1r7GIvTBrIdRUAVCQ/EmHlg9l/Vx8r8tllqh18P9pm3P735\r\nNjRqbqn7S0n/tpcwLd33yyVAkyhY3dF4OiLGjrJ2uziE035X+T6cBD6GY/Ky\r\niEo0W6yGYjdwPzrMNxX/Zo7lmYP9HkqdnDI/X/kbXX6q5o5fvArefod0Qz8q\r\nffQ/oWCSz9kluXLnRE9KYafXtJAmBQb9m8Cksemk0CcSVQWugwoxvvmfLKhe\r\nyD7J9Wy7Vh7wn/Lzk3s8Tqh8dwQOZzwblPvcFPuXnkmhVuRmJMribhCf/xC+\r\njUTYdFXgPsdP+WsJGp9m0D7wSG7ggi5RvnFuInEcA30GDpK9DUNd+YwWWszR\r\nXogZtFEOdZxpsVw2ujJrThSfMWdSwsc+9YLF60zH3wIW8/KyyHx7ISF40bkW\r\nZSsBsHnwThyZxkZP3GLotQ5eztmI8h2KMnjb2Ka4/0inxydSRfq/RIADaGh/\r\nP34NTWJRvBpdZBlJVRGLdSCUDNJsBjgDN8Q=\r\n=PXZg\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCIBecktbdqCwPBq6wrG8pNrdQePF03T/9f7sPB/8kkFbYAiBFw0G2Do0XeyVMwYc1Tpi5L7CkC5Xla4BYM1jtBDUq3Q=="}]},"_npmUser":{"name":"gugaguichard","email":"gustavoguichard@gmail.com"},"directories":{},"maintainers":[{"name":"gugaguichard","email":"gustavoguichard@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/remix-domains_0.0.0_1647287223831_0.5669593263900938"},"_hasShrinkwrap":false,"deprecated":"🚨 remix-domains was renamed to domain-functions 🔀. Make sure you change it in your package.json so you keep your version up to date."},"0.0.1-rc.0":{"name":"remix-domains","version":"0.0.1-rc.0","description":"Keep your Business Logic appart from your actions/loaders plumbing","main":"./dist/index.js","types":"./dist/index.d.ts","scripts":{"prebuild":"rm -rf dist/","build":"tsc","test":"vitest","typecheck":"tsc --noEmit","lint":"eslint ./src/*.ts"},"dependencies":{"qs":"^6.10.3"},"peerDependencies":{"zod":"^3.13.4"},"repository":{"type":"git","url":"git+https://github.com/SeasonedSoftware/remix-domains.git"},"author":{"name":"Seasoned Software"},"license":"MIT","bugs":{"url":"https://github.com/SeasonedSoftware/remix-domains/issues"},"homepage":"https://github.com/SeasonedSoftware/remix-domains#readme","devDependencies":{"@remix-run/node":"^1.3.1","@types/node":"^17.0.21","@types/qs":"^6.9.7","@typescript-eslint/eslint-plugin":"^5.15.0","@typescript-eslint/parser":"^5.15.0","c8":"^7.11.0","eslint":"^8.11.0","eslint-plugin-react":"^7.29.4","prettier":"^2.6.0","typescript":"^4.6.2","vitest":"^0.7.0","zod":"^3.13.4"},"gitHead":"5e40197f294eb07c217340dd5bfe4900eca90803","_id":"remix-domains@0.0.1-rc.0","_nodeVersion":"16.13.1","_npmVersion":"8.3.0","dist":{"integrity":"sha512-1f8Xw69oTkhX2EU47AeBEWXJiPzAZr/bvrdf5rjOLTbOZzK/dCmjgEXLo6UaCf6oiEKGl2Vn0AJAgtX6KStvxQ==","shasum":"c19e1f034964c8aa6a656be4368b64d1e078fbae","tarball":"https://registry.npmjs.org/remix-domains/-/remix-domains-0.0.1-rc.0.tgz","fileCount":10,"unpackedSize":8232,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJiNIMQACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2VmrqEw/+NpG4h3l70RMuttbehlVRSRM2eR4OgLteDa/qfXqVhjVxN0ml\r\nHpNKIwF08t8aeBwvI2rxyMnVNeKQmpYWN5+U37z9cZr28ixGoO2Y8lf74PzX\r\nyaywR8KJbsYsF4kYt7zMoeoXlq7vyjD3mFCn1sR37m+YITGfMDiiq++CEC/2\r\n2lCQcGJkJMIiK/hjmKyIi8dtHiFHLlGzANDEaGmlJQ58EfdQHKiOveyEFofd\r\n6+7csFu835YVjGHK14W4SACPQ5sGyksbShGXmfiG+zbMsWQcnEn6ylkWIK7H\r\nrIwj/9pl0ctuKdj8K7JJMpdFFY+Z5VMfj0SFpdP/xT2QA8xDyo50ROSNyR82\r\nmhyabhI2W0dV1H9auhtprfbLxVI80cHqEMe5SstIfqKU2EDfmD0+bDwZwBL1\r\nxXhazHUy9+vGuCOI6ehyPSFLSuX27+AweWEHcMpsFIihtoNJCps5OzECQXPn\r\n5oCH5d6pDTlEbbd1FlNQ6FyOLtK3G0VuLjIwIGtU9icqRGODssfoMImi+i75\r\nla+95wjUd3iMr0i0BPQavtWjUAw9Isf4Kww22641xy2V/gQ8S1ldVtX+uh6U\r\nNoeLZCxYtOb3nxxNtKcU5QChlbAFFuZKMvRX0VZr0bwc3aUAY3N26WUm2qXV\r\n1ffd3X7rLjdLNCO5HkuEcswkl8Efc9Wjobs=\r\n=DTCR\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIHXLCMWCUEeVriN2ug2lJp6if056elq3nfNtWXBAxNyrAiEA2oLK+albE4RvrSngQFsG4cZkxv4IJoMKoON2HIA9hSc="}]},"_npmUser":{"name":"gugaguichard","email":"gustavoguichard@gmail.com"},"directories":{},"maintainers":[{"name":"gugaguichard","email":"gustavoguichard@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/remix-domains_0.0.1-rc.0_1647608592232_0.5567875650554788"},"_hasShrinkwrap":false,"deprecated":"🚨 remix-domains was renamed to domain-functions 🔀. Make sure you change it in your package.json so you keep your version up to date."},"0.0.1-rc.2":{"name":"remix-domains","version":"0.0.1-rc.2","description":"Keep your Business Logic appart from your actions/loaders plumbing","main":"./dist/index.js","types":"./dist/index.d.ts","scripts":{"prebuild":"rm -rf dist/","build":"tsc","test":"vitest","typecheck":"tsc --noEmit","lint":"eslint ./src/*.ts"},"dependencies":{"qs":"^6.10.3"},"peerDependencies":{"zod":"^3.13.4"},"repository":{"type":"git","url":"git+https://github.com/SeasonedSoftware/remix-domains.git"},"author":{"name":"Seasoned Software"},"license":"MIT","bugs":{"url":"https://github.com/SeasonedSoftware/remix-domains/issues"},"homepage":"https://github.com/SeasonedSoftware/remix-domains#readme","devDependencies":{"@remix-run/node":"^1.3.1","@types/node":"^17.0.21","@types/qs":"^6.9.7","@typescript-eslint/eslint-plugin":"^5.15.0","@typescript-eslint/parser":"^5.15.0","c8":"^7.11.0","eslint":"^8.11.0","eslint-plugin-react":"^7.29.4","prettier":"^2.6.0","typescript":"^4.6.2","vitest":"^0.7.0","zod":"^3.13.4"},"gitHead":"0a9202d1adf3a9b29a369c0a942a83726c3b5a77","_id":"remix-domains@0.0.1-rc.2","_nodeVersion":"16.13.1","_npmVersion":"8.3.0","dist":{"integrity":"sha512-BqK7IJisc6zLOTrBATc5kNHruCWXmI8BsM0jG2rtB3xyZ3N/O55iitGmFQ/un7wHTNbUvLrCEcen7EpVDh/hrQ==","shasum":"34a2a45be64b52f320865fa273dea137f68787b4","tarball":"https://registry.npmjs.org/remix-domains/-/remix-domains-0.0.1-rc.2.tgz","fileCount":10,"unpackedSize":12554,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJiNKMVACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2Vmreag/8DAs9FmFmEjGiOqMEmUgWBcQ5IaC0tB/9z1dXVKD1MmrMH9f8\r\n9Gbe9WHbkCkibYMnRj6CWlTL1jyd0J9jH7xjlUSTTg6T/jAKqKMhc6oKoOdM\r\nNDY7WRhrsczNYK1DsBupLN0FmyFTFSzOi0WzFTMMPM8PogJhQaViEzjRZUyq\r\n6fgXNoC2bMORIcTF5zb/p/Pu1lOE83nj6NUarVboLA/Fdn9Vqo6I2CWG5OFe\r\nJ3QwSzitFpcQry56MXzYDZHD0rkxvwytmiPiL2lBYuiC2aFxvI76WkXDXDKc\r\nJxTNCBhDWmva1L+FoymkaEpqvMwe9/hSvuDae0cbksA/90DkNj15te0objjj\r\nPk7AQ2JyBQIssHIL/f5UHfCzpFHsEc/1lWEkA7Izj+Bgt21q19WdJ9KSiKZE\r\ngRyAPiIMgGH3hHRYf41g1eC2pm3vRJ+sbYPE/F8VzgPDJrzHk6V/kPdFR/qk\r\nJQ9VWlS2SE7B3E1ITJDuRzDS5DIU8kN+t3oWcwzc5f1Dos4z2AJm9F+EOK5w\r\nlqFqHff7O/zw1BO3emvOptkHl1Lliz8x6sXudCnRcXp8AZBeoJTers9uGSoy\r\n+430BK2z1BXp5xhCkAKWo2y3vCQtkVhWUmE7O50qlV+kyfDUUoVD/7cTL6Ch\r\njBiLOUrX8M7MTjvaHrCoem9860D3Hlqfz6k=\r\n=94GA\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCIGlLX7xifwbDsRBHdOBN2qnV4dlmoF7kNlXX7f2j63BtAiBMCO1NLEIGjaBN1QMqGQQtYJkPQ8b1M06P4ghHRL2R5A=="}]},"_npmUser":{"name":"gugaguichard","email":"gustavoguichard@gmail.com"},"directories":{},"maintainers":[{"name":"gugaguichard","email":"gustavoguichard@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/remix-domains_0.0.1-rc.2_1647616789637_0.8647007845826564"},"_hasShrinkwrap":false,"deprecated":"🚨 remix-domains was renamed to domain-functions 🔀. Make sure you change it in your package.json so you keep your version up to date."},"0.0.1-rc.4":{"name":"remix-domains","version":"0.0.1-rc.4","description":"Keep your Business Logic appart from your actions/loaders plumbing","main":"./dist/index.js","types":"./dist/index.d.ts","scripts":{"prebuild":"rm -rf dist/","build":"tsc","test":"vitest","typecheck":"tsc --noEmit","lint":"eslint ./src/*.ts"},"dependencies":{"qs":"^6.10.3"},"peerDependencies":{"zod":"^3.13.4"},"repository":{"type":"git","url":"git+https://github.com/SeasonedSoftware/remix-domains.git"},"author":{"name":"Seasoned Software"},"license":"MIT","bugs":{"url":"https://github.com/SeasonedSoftware/remix-domains/issues"},"homepage":"https://github.com/SeasonedSoftware/remix-domains#readme","devDependencies":{"@remix-run/node":"^1.3.1","@types/node":"^17.0.21","@types/qs":"^6.9.7","@typescript-eslint/eslint-plugin":"^5.15.0","@typescript-eslint/parser":"^5.15.0","c8":"^7.11.0","eslint":"^8.11.0","eslint-plugin-react":"^7.29.4","prettier":"^2.6.0","typescript":"^4.6.2","vitest":"^0.7.0","zod":"^3.13.4"},"gitHead":"884a8c22a8b2ca3103674888577c9a7f0d64113b","_id":"remix-domains@0.0.1-rc.4","_nodeVersion":"16.13.1","_npmVersion":"8.3.0","dist":{"integrity":"sha512-Uws/JR+8GUimoftWdlDOQ5iuYEu6Ks7j52B4J1pvV33G7dcPUowNTbl3EBA/Ag+DQ95muSUu6b7veiPHCbvKKA==","shasum":"0baca7ba1919608b7ab26896038e572080cc227b","tarball":"https://registry.npmjs.org/remix-domains/-/remix-domains-0.0.1-rc.4.tgz","fileCount":10,"unpackedSize":12929,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJiNTc1ACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2Vmq3ww/9ERPSsoneURuxM2d+4gbhHe7kITl7tWvuQOYJtvcJU18+ZO1W\r\nx2X+lV8XzHF/hqrY4bCtx0tyxuTdrBprCu1IljX9TzlEKwNnCcPczmtnekNV\r\ns40g69VxS9zTGh6kbrs6a+4bqcxEcD/sGQR1vpv/5haPuBBDfiZbM+NeMHlK\r\nHguZ8xqrxfZDRFx25YTOrJs8ZR7gGOrxoW7pvUC4W4rX5MIsJxQenDSV0glf\r\npO8rkE1x2XnbvXJpUTMUJFWJndMEv2lJkj+vGCSciZcDFe92gzsG/EiJe1u2\r\nY9R5V2ytbHCII7ytNjJK98jVGhAb4kSRoGXPdhmmscIztfNjJgKKgmkzcCkY\r\neR15WT1OYhBSWeWwKzhbNqMd+cMO2a43mI2NN2KiFuBZu+6iFTnxZhnTw4Yx\r\nv+S2eEqDF1rG3kJrViHezwy/gGxw8PYC9GSKsMjQur2UFSQkPtOQUa0vRbk6\r\njRhiC3YD+OWASatpm/RUUU2WlNf7bpGFCKqNha92AhcGZko+YNb21XztfyVJ\r\n059gcNdHRwZNV7IH7S/x2Pq9L0txpynZARvbEoH3+2kfUv/8/PSrasL/ObNt\r\nMwzkt28kBs6wlPFmGNXAJlJK3DA6B7xHAs2KkvwosFnNb1QkvbWqyFkQjOY5\r\npNJ60J11++qISejoWi33taES83NWsEamNqI=\r\n=fE1y\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQCPRV+Rw1EZRierv6bVJKf50DaTufX62xcnOVqq6PbazgIhANrBU1wiwrRW/WRpzS1nc/SSc525aC6viQmgDDNfVZYK"}]},"_npmUser":{"name":"gugaguichard","email":"gustavoguichard@gmail.com"},"directories":{},"maintainers":[{"name":"gugaguichard","email":"gustavoguichard@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/remix-domains_0.0.1-rc.4_1647654709364_0.5541124350254834"},"_hasShrinkwrap":false,"deprecated":"🚨 remix-domains was renamed to domain-functions 🔀. Make sure you change it in your package.json so you keep your version up to date."},"0.0.1-rc.6":{"name":"remix-domains","version":"0.0.1-rc.6","description":"Keep your Business Logic appart from your actions/loaders plumbing","main":"./dist/index.js","types":"./dist/index.d.ts","scripts":{"prepublishOnly":"rm -rf dist/ && tsc","test":"vitest","typecheck":"tsc --noEmit","lint":"eslint ./src/*.ts"},"dependencies":{"qs":"^6.10.3"},"peerDependencies":{"zod":"^3.13.4"},"repository":{"type":"git","url":"git+https://github.com/SeasonedSoftware/remix-domains.git"},"author":{"name":"Seasoned Software"},"license":"MIT","bugs":{"url":"https://github.com/SeasonedSoftware/remix-domains/issues"},"homepage":"https://github.com/SeasonedSoftware/remix-domains#readme","devDependencies":{"@remix-run/node":"^1.3.1","@types/node":"^17.0.21","@types/qs":"^6.9.7","@typescript-eslint/eslint-plugin":"^5.15.0","@typescript-eslint/parser":"^5.15.0","c8":"^7.11.0","eslint":"^8.11.0","eslint-plugin-react":"^7.29.4","prettier":"^2.6.0","typescript":"^4.6.2","vitest":"^0.7.0","zod":"^3.13.4"},"gitHead":"eed52601675066c8d27bb78f161391c35a4b112b","_id":"remix-domains@0.0.1-rc.6","_nodeVersion":"16.13.1","_npmVersion":"8.3.0","dist":{"integrity":"sha512-Z+tN2D8pfyNgppyOl9T8EumHqRugjPszfB4JKo/p6lCCh8k2CH+Qf8jCofFWmJ0mz+hk+hsg45w4r8vlZ9u6ag==","shasum":"29eef99903bc3de7d99e17bc5d8314421e8c82a3","tarball":"https://registry.npmjs.org/remix-domains/-/remix-domains-0.0.1-rc.6.tgz","fileCount":10,"unpackedSize":13256,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJiNhnQACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2VmqcJQ//bMBadY0AiSj24wcig1tYjaQdUJkv7duA7sf5W8IYN1sF54rE\r\ngiDxwC+KZiizJTUtR9ec9oxoUu+gTPExnM9I2p7hNUOatJfICXb0WOL5yaxJ\r\nE6B8XFGjm+O10W1072Y0rZyG9L0Me9pjs34Rofffvaioq/B4HK/Cnlc4WD1+\r\nt5EdqAL11RE0X1op1p4iO2FEWyGQWCtjhqGe02grVvXBQkT1jXJJ2P4padmO\r\nZvMDmXyEIjOEXiwyHJ3/R1ptszkrzsnC5bObYxcEdUT5zNf1OUF0kBvxit1E\r\nRbwm8A0gCbpShbiWsW1BO1SDwFF3+TIqP7O1lmrLSs+GRX1mO1IyobDilnvx\r\nprVJiLdJvdBAUYHByAAQ/BPLRzO/KSMPeNjYsu6jAP57mSdqpPCR1btD0TYB\r\n0/slqOosAzreQt0PK2znB/0Lc+Om/h2/2ZheKwoG0rRjNDyNnoKHArQmVOjl\r\nTLGNoe4yUbjYKuRJt5YSd8hyy2ykqUMpmTxa6zzJNkQXOjPkar58Xfonbr+x\r\nz7yTjlwA98DtBk4mUbAUHtldmGIaEu/e50jxV8F7BfHtrFkmZZ4g4YOmfjqd\r\nCGrZYmWCjvlJzcIo+7nCxqIjHlGVbz4RPozzaT/i/MHWi7+CrtVp9n3jYlA0\r\ny2OhckT3jiyxC8GJ8qrF4vzu2WZhYrDd7hM=\r\n=FfU0\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIFiMSL9Jzd33L+LUsnoJMtU5mUppX2pIfq2vS5k5maWIAiEAg5y0Q04JYtnI4BjadftHvfxd8x3Wwq9P5FyFtd8d15E="}]},"_npmUser":{"name":"gugaguichard","email":"gustavoguichard@gmail.com"},"directories":{},"maintainers":[{"name":"gugaguichard","email":"gustavoguichard@gmail.com"},{"name":"danielweinmann","email":"danielweinmann@gmail.com"},{"name":"felipefreitag","email":"ffvargas@gmail.com"},{"name":"devseasoned","email":"dev@seasoned.cc"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/remix-domains_0.0.1-rc.6_1647712720048_0.6831782757067384"},"_hasShrinkwrap":false,"deprecated":"🚨 remix-domains was renamed to domain-functions 🔀. Make sure you change it in your package.json so you keep your version up to date."},"0.0.1-rc.7":{"name":"remix-domains","version":"0.0.1-rc.7","description":"Keep your Business Logic appart from your actions/loaders plumbing","main":"./dist/index.js","types":"./dist/index.d.ts","scripts":{"prebuild":"rm -rf dist/","build":"tsc","prepublishOnly":"npm run build","test":"vitest","typecheck":"tsc --noEmit","lint":"eslint ./src/*.ts"},"dependencies":{"qs":"^6.10.3"},"peerDependencies":{"zod":"^3.13.4"},"repository":{"type":"git","url":"git+https://github.com/SeasonedSoftware/remix-domains.git"},"author":{"name":"Seasoned Software"},"license":"MIT","bugs":{"url":"https://github.com/SeasonedSoftware/remix-domains/issues"},"homepage":"https://github.com/SeasonedSoftware/remix-domains#readme","devDependencies":{"@remix-run/node":"^1.3.1","@types/node":"^17.0.21","@types/qs":"^6.9.7","@typescript-eslint/eslint-plugin":"^5.15.0","@typescript-eslint/parser":"^5.15.0","c8":"^7.11.0","eslint":"^8.11.0","prettier":"^2.6.0","typescript":"^4.6.2","vitest":"^0.7.0","zod":"^3.13.4"},"gitHead":"c356af21c46f93976e73e2d579c196f972c35a2b","_id":"remix-domains@0.0.1-rc.7","_nodeVersion":"16.13.1","_npmVersion":"8.3.0","dist":{"integrity":"sha512-R0CYhon9j2F/jlR6kPg+BNNc8tOsE2pPP1g02QP/ZCQikqNDlTjWJXaun1Zd4cfMh94ye2vSTiUh3fwUO0iYGw==","shasum":"e59dfb3268f9b41b555be7d3ce52eb7f978e880b","tarball":"https://registry.npmjs.org/remix-domains/-/remix-domains-0.0.1-rc.7.tgz","fileCount":12,"unpackedSize":14486,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJiPb3wACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2VmqbUg//d5XdjrcQwM1gwAgGatBCWeMIb4v4jfaW6eLyWfqqveMbsAS1\r\nXonQBuYwH9RUu6dAWh0YeLAIO8bZb9XbgP5Lib9uTDkMUKREIGJew9KUGF21\r\nvixvNZMFjEh4CAQ32NvIvukCOUD4pHNAgcfMjyugdq17vfUIfmTS0ZwopSx9\r\n78xXiOcfsmpPpIihA/q9MMM3wJtMAwph4IpLLvDa26rBLoJxWNozh4tas7xH\r\n7dDe6RfTNbf57vqw5YpSoZLyVruNyIbtkBFxsYDLYC+iMHGZIaWXAHe+u7rg\r\nnupbrYVL09CvpoYdUWXkVLQMjBv/YRhwPjsV3B/VQOp6ixjMTs6WbFiApo+C\r\n6aC1ngBulmqmvigUmQfaFKmce9fQHYvIqMioT/W9rcW7ZWntA1pZym1usX0S\r\nDJV8vYx+7TfSn8YX40FL2PbNzPa9qQVZFymUlMVmiAOFgok9kU1WiMpswCfN\r\ndH16OIVkn0aK5kK496/c6QHBe5afwUbztnCj3dKjdKe/BXs72p8jWPMlRz/g\r\n4nFlLKGyLZorgrDfxEocpwqyieWccI9BsKfTY9K/3WdTaG3OmZDQwt7NNWZc\r\nzOnmWJLHwJ8MgQc8DAYS6W29saqYeGxv3YfHss8mjAI4+xd4iKTW3MlRzlrZ\r\nbyheufecRaw8DQWFlTJCSSLHRQY2UC+i35k=\r\n=7IoA\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCIBJtJMAg/KW3w2wp/5bdyoVLkAtaJr9OK0Y8GMfQ4DqlAiBljok0e6XGdRQnwpSMxAz3x75Slw5pheyYCDGCAdTcew=="}]},"_npmUser":{"name":"gugaguichard","email":"gustavoguichard@gmail.com"},"directories":{},"maintainers":[{"name":"felipefreitag","email":"ffvargas@gmail.com"},{"name":"danielweinmann","email":"danielweinmann@gmail.com"},{"name":"gugaguichard","email":"gustavoguichard@gmail.com"},{"name":"devseasoned","email":"dev@seasoned.cc"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/remix-domains_0.0.1-rc.7_1648213488741_0.8766900471176504"},"_hasShrinkwrap":false,"deprecated":"🚨 remix-domains was renamed to domain-functions 🔀. Make sure you change it in your package.json so you keep your version up to date."},"0.0.1-rc.8":{"name":"remix-domains","version":"0.0.1-rc.8","description":"Keep your Business Logic appart from your actions/loaders plumbing","main":"./dist/index.js","types":"./dist/index.d.ts","scripts":{"prebuild":"rm -rf dist/","build":"tsc","prepublishOnly":"npm run build","test":"vitest","typecheck":"tsc --noEmit","lint":"eslint ./src/*.ts"},"dependencies":{"qs":"^6.10.3"},"peerDependencies":{"zod":"^3.13.4"},"repository":{"type":"git","url":"git+https://github.com/SeasonedSoftware/remix-domains.git"},"author":{"name":"Seasoned Software"},"license":"MIT","bugs":{"url":"https://github.com/SeasonedSoftware/remix-domains/issues"},"homepage":"https://github.com/SeasonedSoftware/remix-domains#readme","devDependencies":{"@remix-run/node":"^1.3.1","@types/node":"^17.0.21","@types/qs":"^6.9.7","@typescript-eslint/eslint-plugin":"^5.15.0","@typescript-eslint/parser":"^5.15.0","c8":"^7.11.0","eslint":"^8.11.0","prettier":"^2.6.0","typescript":"^4.6.2","vitest":"^0.7.0","zod":"^3.13.4"},"gitHead":"4d943aa911464a30c4275226df9d3b058e91b1aa","_id":"remix-domains@0.0.1-rc.8","_nodeVersion":"16.13.1","_npmVersion":"8.3.0","dist":{"integrity":"sha512-71GGKpFXwW6aITXe7BoXoixLE0gjQOlQGzqNUELyOZBKbGp5Va2BFizyr5ghK5jZV9LaD0FFWOFVgH3kNqHOdQ==","shasum":"60a95a4430363aa018eb24a3659b1f15978dc458","tarball":"https://registry.npmjs.org/remix-domains/-/remix-domains-0.0.1-rc.8.tgz","fileCount":12,"unpackedSize":16645,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJiQ0uPACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2VmrHww//YetnEUP14AJY4e1aEZK4J6NS4teXWNNE3XDeqzRcV371jffT\r\n4k6JXwjUGSUNDIh98BIP+SXH7Va6iZk9WzIJwVZLh+IlElBqGl9XrG5SleQZ\r\nDyDB66b+SU6lfT9cDh8dbayjPoNXSOMb7JGzTzap13b3d2Kb7Y9HGLjpDHrm\r\n0MGG5wQJV8e+d1kIIiqQl/0PorqY1/Jvjd3jSbD5jox5cQ16S8uNxoITD92P\r\n0Fy9/tBiowqyqU92SaKgmB4yL7gSiNh2y9DeyJhFA8AKrio34pIK88ryCnH9\r\nIlLP+PLHz/KvnQORYYm8pnNAFPLXKyKyvcgOsVr9729tTkZqtJ76+5GKg5TX\r\nQNPmUgFYkys1kL8WlaBurh1HLkdw1VOhzHnJ36oNd6TD35rz56TS4MDev82p\r\nvfT+OLRDOUWHHqBru/T9/l+9K3j1zjYTHc9DRXXzqCeaJa3KZ9m/UI6EEu//\r\nlBRjaO6+Odc8Tbw+2AS2KXEFlJHL+A3jLJflIspnr02f4SIYkzsAqbpulA+K\r\nqhR40Uh473yAF6dmJ6KItDvY/mGmKvDfx15Eq2ISVDe5DujbLHO2Zi3k024J\r\nRO0FC9r7no8hjCWE19WqOGROG8L/XQvZr+sH1GliKX+XgpY1c+l6aWkKhVFq\r\ne3xv5ROuc2lDavvwYI7MFbE9D6T9TRZ8lTw=\r\n=NXRK\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQCSuLlJ1W456oKeBCJi/XgWsseOTP31Y4MCZu12hE57BAIgIivCJJ5O3ow+zTxbg6FMQoNXsv59G/UcSMAZiiuBjig="}]},"_npmUser":{"name":"gugaguichard","email":"gustavoguichard@gmail.com"},"directories":{},"maintainers":[{"name":"felipefreitag","email":"ffvargas@gmail.com"},{"name":"danielweinmann","email":"danielweinmann@gmail.com"},{"name":"gugaguichard","email":"gustavoguichard@gmail.com"},{"name":"devseasoned","email":"dev@seasoned.cc"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/remix-domains_0.0.1-rc.8_1648577423160_0.8553349587876367"},"_hasShrinkwrap":false,"deprecated":"🚨 remix-domains was renamed to domain-functions 🔀. Make sure you change it in your package.json so you keep your version up to date."},"0.0.1-rc.9":{"name":"remix-domains","version":"0.0.1-rc.9","description":"Keep your Business Logic appart from your actions/loaders plumbing","main":"./dist/index.js","types":"./dist/index.d.ts","scripts":{"prebuild":"rm -rf dist/","build":"tsc","prepublishOnly":"npm run build","test":"vitest","typecheck":"tsc --noEmit","lint":"eslint ./src/*.ts"},"dependencies":{"qs":"^6.10.3"},"peerDependencies":{"zod":"^3.13.4"},"repository":{"type":"git","url":"git+https://github.com/SeasonedSoftware/remix-domains.git"},"author":{"name":"Seasoned Software"},"license":"MIT","bugs":{"url":"https://github.com/SeasonedSoftware/remix-domains/issues"},"homepage":"https://github.com/SeasonedSoftware/remix-domains#readme","devDependencies":{"@remix-run/node":"^1.3.1","@types/node":"^17.0.21","@types/qs":"^6.9.7","@typescript-eslint/eslint-plugin":"^5.15.0","@typescript-eslint/parser":"^5.15.0","c8":"^7.11.0","eslint":"^8.11.0","prettier":"^2.6.0","typescript":"^4.6.2","vitest":"^0.7.0","zod":"^3.13.4"},"gitHead":"086366c138898fe652a07a02dd0f4fc14180a584","_id":"remix-domains@0.0.1-rc.9","_nodeVersion":"16.14.2","_npmVersion":"8.5.0","dist":{"integrity":"sha512-i0dGPiXionlow2SgAAh5L+mayqXPxd3aDTe9o3k5D1reHwuPlSNHaUhtxUf9iWQcYF5PTdyk/XBXPYpBQ2ReSA==","shasum":"3a5d61706cda06cda956bb255d28707d6ec0a499","tarball":"https://registry.npmjs.org/remix-domains/-/remix-domains-0.0.1-rc.9.tgz","fileCount":12,"unpackedSize":18395,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCICGTTs2daGFBETW20EfD88AwvXfOsBFlQwSoSjdQri4QAiEA42RsGJibz0TyWx2uUyotXqOfUfaL/B6PuycY9B4mAXE="}],"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJiTa5DACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2VmrAdA//RyzTfGur8d2QDc/F7stCeizlbBvcihETldZaGvWvp577d4n9\r\nJJ/XyI0ZIKp6ILyRTDIHq2g0sZzYmiSR0oPcthxCdkwjEFvqlYVXCXaIQHyJ\r\nxSQGYk/hTFZyFdtfccDuh7MD2FUtKgQE02xAo0EEW92iNNCUNZsgbY2SYXEx\r\ndRZ5SRqDP1WV4fwgZUASnBrPTUs8YyGUa73aFvNWVcMv1k55MhvoMe1ip21A\r\n7xtlrfb6XbwFaDmLpvvVvCQYE3aSOHowaF5/oWoZYS+eH6eM4bsIhsRQSSx1\r\nBYPL4Qun0ILkmuta+PI+pfxpwZLJQs2/XSP4fxZU53OKoAaL6WhEeLdnKJFf\r\n0WulQJWwOWHRmHTydzxkSynaVGBtt0ofthAvcsw/MMHgxtHZLiBUeWRP29r4\r\nt4eoLVoXQj8OCf9/3jR0cPZ6CbIVqKAtJ4wHbpUEUFwxsxZv+iPw7932AVO4\r\ntDXdItW01wQljNDNElD7b+v3BJoRl46P4csJBXF/BCqhFnot9tRf7QYooe0I\r\nbS+6SjSGeVsOeTcmchoS8Wuwm4i/7OQt/yBExLCH+RG2Xcd+gOT9Ph3farXF\r\n4XnnK8THRaVBPwOAWQS+ovdTfltY2b86kGnDk5zKCuapIZC5q6qAqsN47XSu\r\nRaADu8hpQ9M3pF6k8e5vUjsrBWjL4k0E9J4=\r\n=KMzR\r\n-----END PGP SIGNATURE-----\r\n"},"_npmUser":{"name":"gugaguichard","email":"gustavoguichard@gmail.com"},"directories":{},"maintainers":[{"name":"felipefreitag","email":"ffvargas@gmail.com"},{"name":"danielweinmann","email":"danielweinmann@gmail.com"},{"name":"gugaguichard","email":"gustavoguichard@gmail.com"},{"name":"devseasoned","email":"dev@seasoned.cc"},{"name":"diogoseasoned","email":"diogo@seasoned.cc"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/remix-domains_0.0.1-rc.9_1649258051641_0.6194528304924121"},"_hasShrinkwrap":false,"deprecated":"🚨 remix-domains was renamed to domain-functions 🔀. Make sure you change it in your package.json so you keep your version up to date."},"0.0.1-rc.10":{"name":"remix-domains","version":"0.0.1-rc.10","description":"Keep your Business Logic appart from your actions/loaders plumbing with end to end type safety","main":"./dist/index.js","types":"./dist/index.d.ts","scripts":{"prebuild":"rm -rf dist/","build":"tsc","prepublishOnly":"npm run build","test":"vitest","typecheck":"tsc --noEmit","lint":"eslint ./src/*.ts"},"dependencies":{"qs":"^6.10.3"},"peerDependencies":{"zod":"^3.13.4"},"repository":{"type":"git","url":"git+https://github.com/SeasonedSoftware/remix-domains.git"},"author":{"name":"Seasoned Software"},"license":"MIT","bugs":{"url":"https://github.com/SeasonedSoftware/remix-domains/issues"},"homepage":"https://github.com/SeasonedSoftware/remix-domains#readme","devDependencies":{"@remix-run/node":"^1.3.1","@types/node":"^17.0.21","@types/qs":"^6.9.7","@typescript-eslint/eslint-plugin":"^5.15.0","@typescript-eslint/parser":"^5.15.0","c8":"^7.11.0","eslint":"^8.11.0","prettier":"^2.6.0","typescript":"^4.6.2","vitest":"^0.7.0","zod":"^3.13.4"},"gitHead":"06a77530fa441c395808e39019a7c79edce89e7e","_id":"remix-domains@0.0.1-rc.10","_nodeVersion":"16.14.2","_npmVersion":"8.5.0","dist":{"integrity":"sha512-Zk3TKj80s6OmzaVAnXhEsddJ62h5xm4ILyurqh2n50AloK7egBiOv/ZaWkqP/xk7EgTHt1BdfQLg4opTw08/Fg==","shasum":"73e52f99e4d1e4807aeb193ad1cfb711efe50b4d","tarball":"https://registry.npmjs.org/remix-domains/-/remix-domains-0.0.1-rc.10.tgz","fileCount":13,"unpackedSize":22737,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQDit+IuNtBL7rGy4A6TWoDraRHLLWgVm4Esvfe6042zygIhANrRIICq1TacsNbP27lNGh4kl1FbVEQJrALdEFtg7jNf"}],"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJiUKBvACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2Vmqv1w//W2Q2hHTnQJ1WF9e63HvcxSM7VrXVgQXcbn+7597uCxVXa5Hw\r\nACpQH7gHGsXUqCtWSRgoIZFVQQ1ddbKDY/ZQAGidU31NlKgUFZ4hle3qcDPz\r\nrxuDgwyrioRyyzrbCTH7jE0zEEMepEn5KjN97WzUY1uV0GcEBXI5iUS4yte/\r\n3Z9V/QPa5DbRyfNdz7P2+uq6NfmMtLO0ciwpMnX3OILQNDpsSr+ADhCsQvMd\r\n9VUWqQaGuOHxcG7Mlm+t6dpzneOp1b/c3Ro4cX0XByv/ocvoDFQJDfHGCaNa\r\nMWTYpzIT4Q5W4t1BaTcw/vPnZy7WunaxS0P5YnejpIRdO6mmZ5bFJfHy+uvR\r\ngAG8wgn3H9OmlJA/UGqkuwrdeGf2LMeAyyKrNCntbcA4XGagN0saQXb6jlDl\r\n94hD5Xt0C5Z4FQoP/Qv1KMwKNK0rYCU3Pl9H1jZhxTCeeybXodyc1iGYEMFM\r\ngUiTSyuvByGGjpKNKZlIE2PcrsY5K4pdjzN9JGl0GaX7ZlEC6jKMTsP8EptC\r\n5wiqtSfOoq5KdNgBTnyiM1zxqTKtdEd17dGHUBQAPQ8p4z3J9d1A1tw39ZUO\r\nLlTyIUzLUXE/STNmBlE4dvx0ZZi3KQjdXao/3S0LDN8+EK11wL9E7mnMyBaa\r\nPPXHo7zqa4O5UggxVKBbQ69/joRoxYJciiQ=\r\n=SnSF\r\n-----END PGP SIGNATURE-----\r\n"},"_npmUser":{"name":"gugaguichard","email":"gustavoguichard@gmail.com"},"directories":{},"maintainers":[{"name":"felipefreitag","email":"ffvargas@gmail.com"},{"name":"danielweinmann","email":"danielweinmann@gmail.com"},{"name":"gugaguichard","email":"gustavoguichard@gmail.com"},{"name":"devseasoned","email":"dev@seasoned.cc"},{"name":"diogoseasoned","email":"diogo@seasoned.cc"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/remix-domains_0.0.1-rc.10_1649451119663_0.04631911207361994"},"_hasShrinkwrap":false,"deprecated":"🚨 remix-domains was renamed to domain-functions 🔀. Make sure you change it in your package.json so you keep your version up to date."},"0.0.1-rc.11":{"name":"remix-domains","version":"0.0.1-rc.11","description":"Keep your Business Logic appart from your actions/loaders plumbing with end to end type safety","main":"./dist/index.js","types":"./dist/index.d.ts","scripts":{"dev":"tsc --watch","prebuild":"rm -rf dist/","build":"tsc","prepublishOnly":"npm run build","test":"vitest","typecheck":"tsc --noEmit","lint":"eslint ./src/*.ts"},"dependencies":{"qs":"^6.10.3"},"peerDependencies":{"zod":"^3.13.4"},"repository":{"type":"git","url":"git+https://github.com/SeasonedSoftware/remix-domains.git"},"author":{"name":"Seasoned Software"},"license":"MIT","bugs":{"url":"https://github.com/SeasonedSoftware/remix-domains/issues"},"homepage":"https://github.com/SeasonedSoftware/remix-domains#readme","devDependencies":{"@remix-run/node":"^1.3.1","@types/node":"^17.0.21","@types/qs":"^6.9.7","@typescript-eslint/eslint-plugin":"^5.15.0","@typescript-eslint/parser":"^5.15.0","c8":"^7.11.0","eslint":"^8.11.0","prettier":"^2.6.0","typescript":"^4.6.2","vitest":"^0.7.0","zod":"^3.13.4"},"gitHead":"7d5cb2cdb04f8f260db77f1abc892c45177c7784","_id":"remix-domains@0.0.1-rc.11","_nodeVersion":"16.14.2","_npmVersion":"8.5.0","dist":{"integrity":"sha512-IEyzOp8xsXAeITjHEJLRaWWK/ja9idIPbA3xpoD03HyEN/ztF7C/oc3dtFGkgohrOWQZBl+behMNs4XAysGJgA==","shasum":"4c700e21107201880170c6f355993a34256b4bbe","tarball":"https://registry.npmjs.org/remix-domains/-/remix-domains-0.0.1-rc.11.tgz","fileCount":13,"unpackedSize":29096,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIGO/kz/gylOaBrAwVKtZnjOi3Tl4vAnfnBGIzuCE8xQpAiEA6znM9qpYVrGRlKbEzgFRbpj6DzZwtzLXoIBqJfxQF4M="}],"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJiWCoDACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2VmqLrxAAnjQcE/OBzWB3+nJANGff8qC3XF5vkZtDodgnuxy/U0QMvbMz\r\nSnNXrrQwq3oKr0VgcUz6QdJ74GwkVPCUU6gZwqaqzoutb5uz770sdMZrbi+C\r\nP+haRQJZ/bASIoGt7j3udQnLbZMqXZ8G5hhAWif2i0i3T3QvsYbcVn0oA5+8\r\nZTfd2tHTkuNzIvu/N6xsUt8vLZ1LSeZdsE7DvFyVOjwOuBn6mBjmLcuLHwXi\r\n3NI9jVebYtwTLkTx56TvJ1+//sI9yO6Qky5GqPKLvwR++y/iqcgOpAfDF3AI\r\ncLt+wJ7J64Bu7KRGVujqlXnF64A2vKyfN7ZTmaowhH8t+XH4wProocqN+mi6\r\nSBe7o3SCWLdV0eysTDBn+OSq+bB6mONUjQYzjyKw+arrVCIy+KH9dncXOafN\r\n4HTbWau89PaQQlow48n92X5D6JLRdFxA8iYPwRYWroWmKezhziWQMlBXn/5k\r\nZIrSHpnLpcIWqXRYHJgMRLFi1/IhFuiJ0H89d7ya86XAQiy0zRC7oUspdtqa\r\nR8/iGMEJ7LyqpeMwQzUYHz6xmmIfzV+tXehk9tkB29dZPEG+xVJor+3GxwnZ\r\n1D2TsryFdcwmmQRQkFuVRUqLKiIoN+B96V0FqRwVEjQExf0Xu+dDFJPizTEH\r\n1rgH4xMPL17wE5jNt6w9s/k6685yw3dEZmI=\r\n=oAYZ\r\n-----END PGP SIGNATURE-----\r\n"},"_npmUser":{"name":"gugaguichard","email":"gustavoguichard@gmail.com"},"directories":{},"maintainers":[{"name":"felipefreitag","email":"ffvargas@gmail.com"},{"name":"danielweinmann","email":"danielweinmann@gmail.com"},{"name":"gugaguichard","email":"gustavoguichard@gmail.com"},{"name":"devseasoned","email":"dev@seasoned.cc"},{"name":"diogoseasoned","email":"diogo@seasoned.cc"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/remix-domains_0.0.1-rc.11_1649945090913_0.5960798022958573"},"_hasShrinkwrap":false,"deprecated":"🚨 remix-domains was renamed to domain-functions 🔀. Make sure you change it in your package.json so you keep your version up to date."},"0.0.2":{"name":"remix-domains","version":"0.0.2","description":"Keep your Business Logic appart from your actions/loaders plumbing with end to end type safety","main":"./dist/index.js","types":"./dist/index.d.ts","scripts":{"dev":"tsc --watch","prebuild":"rm -rf dist/","build":"tsc","prepublishOnly":"npm run build","test":"vitest","typecheck":"tsc --noEmit","lint":"eslint ./src/*.ts"},"dependencies":{"qs":"^6.10.3"},"peerDependencies":{"zod":"^3.13.4"},"repository":{"type":"git","url":"git+https://github.com/SeasonedSoftware/remix-domains.git"},"author":{"name":"Seasoned Software"},"license":"MIT","bugs":{"url":"https://github.com/SeasonedSoftware/remix-domains/issues"},"homepage":"https://github.com/SeasonedSoftware/remix-domains#readme","devDependencies":{"@remix-run/node":"^1.3.1","@types/node":"^17.0.21","@types/qs":"^6.9.7","@typescript-eslint/eslint-plugin":"^5.15.0","@typescript-eslint/parser":"^5.15.0","c8":"^7.11.0","eslint":"^8.11.0","prettier":"^2.6.0","typescript":"^4.6.2","vitest":"^0.7.0","zod":"^3.13.4"},"gitHead":"b1766aa068eab84b8fed29addc684a7c1ce92af4","_id":"remix-domains@0.0.2","_nodeVersion":"16.14.2","_npmVersion":"8.5.0","dist":{"integrity":"sha512-tHsfIsFeoOlAA8IMGPIk6AAceW6RTSXt/4deBLzVOgWJizjFZmozngzjuaPKyVqNex+REgpprJoPpVEORMS8Yw==","shasum":"4f413b1f0fd6cfa535010a2db8e596aca4dea19b","tarball":"https://registry.npmjs.org/remix-domains/-/remix-domains-0.0.2.tgz","fileCount":13,"unpackedSize":29104,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCIAD6ogrE2gB3jGvUaQ0m75OUjQ7Qqyijw3X/l1AjAOs0AiBoO51vW+X6YKoT4H4VOf1Nyl/bc5LW7DeMxvRwp3OL7w=="}],"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJiWHMyACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2VmqUgA/+KeKU5fy0RYpgFScbqklUUXhENOcm5Ne0oNerRpGPkG0tyPYN\r\nYhEbc8qNzpP4I8hdgj4uGbU7phC93ytBlq1qkwFiZib7uB+ujXZ1cY/U02vl\r\n5CQkgldH903hyU+NmJxoabto9oJqnnfXIN6LlNJ1v/UE8NSl/9551jaHtWhF\r\nvyIAAOIRUbcw+VlEFiLecnI0dsXbVk4vSrky22GMkiq9c5bzcAMsn1zjVh26\r\n4j2iGJMeKqQpaOH37r4slyenZF9oD7ZHzVUkhoogyzhBxjGtJkaUZ8rPGWnl\r\nDisXgTIySuaQoNAwBXa7kdEC6LQPkdjuN84GCzNizKHlFXYm5q3AFfJ00aRU\r\ngoHKvqZpg+FeiPyo/6f8cP6QUhALUmsgh+H1uwns3S8g+XA/RNCKn/2Y40O+\r\newb94ibXDpzxs9hZyOJgxP+7JIKxiPX+lstiw461eyjn/esaiUeA2/LXoYOS\r\nA8vbQs7u+3/XRXCnoPEdCrELqrCmKXYy2lgiB/kCQ40luMNqxMy5HyGEUz3D\r\nfi3ahbCNukDspKPpWKXzVQit7+opj7Ip64OBPXrkwOb4sMo7ix0v2NwHS6Ha\r\nFGXS7V2ubh6mTl6WU0HFjyK25GpI5GN8mw2OdNQf2ibhbAKOKre4N1rdvxEG\r\nI6iv8MmpYFwLKlexPmpWP7WGIWYzvRYL5uA=\r\n=eEfB\r\n-----END PGP SIGNATURE-----\r\n"},"_npmUser":{"name":"gugaguichard","email":"gustavoguichard@gmail.com"},"directories":{},"maintainers":[{"name":"felipefreitag","email":"ffvargas@gmail.com"},{"name":"danielweinmann","email":"danielweinmann@gmail.com"},{"name":"gugaguichard","email":"gustavoguichard@gmail.com"},{"name":"devseasoned","email":"dev@seasoned.cc"},{"name":"diogoseasoned","email":"diogo@seasoned.cc"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/remix-domains_0.0.2_1649963826007_0.24336158023337195"},"_hasShrinkwrap":false,"deprecated":"🚨 remix-domains was renamed to domain-functions 🔀. Make sure you change it in your package.json so you keep your version up to date."},"0.1.0":{"name":"remix-domains","version":"0.1.0","description":"Keep your Business Logic appart from your actions/loaders plumbing with end to end type safety","main":"./dist/index.js","types":"./dist/index.d.ts","scripts":{"dev":"tsc --watch","prebuild":"rm -rf dist/","build":"tsc","prepublishOnly":"npm run build","test":"vitest","typecheck":"tsc --noEmit","lint":"eslint ./src/*.ts"},"dependencies":{"qs":"^6.10.3"},"peerDependencies":{"zod":"^3.13.4"},"repository":{"type":"git","url":"git+https://github.com/SeasonedSoftware/remix-domains.git"},"author":{"name":"Seasoned Software"},"license":"MIT","bugs":{"url":"https://github.com/SeasonedSoftware/remix-domains/issues"},"homepage":"https://github.com/SeasonedSoftware/remix-domains#readme","devDependencies":{"@remix-run/node":"^1.3.1","@types/node":"^17.0.21","@types/qs":"^6.9.7","@typescript-eslint/eslint-plugin":"^5.15.0","@typescript-eslint/parser":"^5.15.0","c8":"^7.11.0","eslint":"^8.11.0","prettier":"^2.6.0","typescript":"^4.6.2","vitest":"^0.7.0","zod":"^3.13.4"},"gitHead":"1a0b85f0f9f6394f256dbc7dbc104f3ada5cd9e8","_id":"remix-domains@0.1.0","_nodeVersion":"16.14.2","_npmVersion":"8.5.0","dist":{"integrity":"sha512-I4TQMZlFBkVAncwRW58WPLfy+ipLXEk9UJO5wCHoXjXJkBH6ijJ+mCc4WuOyV/53Cpt2/N0AwqJ1bsrLuIyexw==","shasum":"916bcf90f2d4fcb251a2ccbd1a0a96c3962757a8","tarball":"https://registry.npmjs.org/remix-domains/-/remix-domains-0.1.0.tgz","fileCount":13,"unpackedSize":31372,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQDUigVRvMSq14v77rQRKgeI7HAoRwi6wX4fOYswJt/gzgIhAP1SmnKfv53/dNBc4P9fP0be0MDeHO1GrSZ+5qf24wHw"}],"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJiZroVACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2VmqO6g//UVwcS2f5snW7GXaYzMQLjt0DqDmO608mUkmsncJhhLWTNhHw\r\ncKT0219IegcyCIgz6Ru0WsGaneAqUmHFCXVi2cwKHFN2oV5Wjc2ToI7WMSJp\r\nohMlZwki0/Q1jqbx1SPiQaaolk6jfrDhtLRZg2wjGnrkxZ4VeI7QdeKoHDH+\r\nJ6qlujy6xZMujY4cNivNT4kFuTbsKWd6tBYFI4YRhCc4AIBtKJv8DUT6UYAF\r\nmk7SWuzQdtWjjk44CrLPE11Nf1j1oSCPm3e9Q3rRq3ON3FrfleAZBDKYqGj/\r\nAzHq8CqaxHRCfEpzi+sPJQPt7XLAvOKE3WBQzF2SiWwQUmDXOYbbWJk4IlhC\r\n/mBLKdZIvfAq+2rz8yZ++MyoLLGr0H4APYbGl55u1n/YXSxZ3A1nNWNCucQy\r\nbOzO7e3LWqQjx02P8nmhG+gAAzHhmv31+3EaSJ2hkCoV1IWJBm1rFpQB3ohA\r\nc6SAT9MAtN4/7QhINTR93hI/oZzhNfftZla3NAmrhlpP+z/ncFYeNNcj/hEW\r\nsiXIdai3Tn+6LfEh/7aCyCsmZrbUQ7gazA5OSWaagi/jGywejI2yqTn+DbsW\r\nSA2RNgSNEuZzBKoKxu2tZHwe/wfWEzhWwCAOMkHD2xMa8yOxUu2QzDdYoFO/\r\n7P0SwzyJ/JScIVtwmcqTOS5n2kyXnpXWbBA=\r\n=MgY4\r\n-----END PGP SIGNATURE-----\r\n"},"_npmUser":{"name":"gugaguichard","email":"gustavoguichard@gmail.com"},"directories":{},"maintainers":[{"name":"felipefreitag","email":"ffvargas@gmail.com"},{"name":"danielweinmann","email":"danielweinmann@gmail.com"},{"name":"gugaguichard","email":"gustavoguichard@gmail.com"},{"name":"devseasoned","email":"dev@seasoned.cc"},{"name":"diogoseasoned","email":"diogo@seasoned.cc"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/remix-domains_0.1.0_1650899477150_0.1321598798129615"},"_hasShrinkwrap":false,"deprecated":"🚨 remix-domains was renamed to domain-functions 🔀. Make sure you change it in your package.json so you keep your version up to date."},"0.2.0":{"name":"remix-domains","version":"0.2.0","description":"Decouple your business logic from your Remix actions and loaders. With first-class type inference from end to end.","main":"./dist/index.js","types":"./dist/index.d.ts","scripts":{"dev":"tsc --watch","prebuild":"rm -rf dist/","build":"tsc","prepublishOnly":"npm run build","test":"vitest","typecheck":"tsc --noEmit","lint":"eslint ./src/*.ts"},"dependencies":{"qs":"^6.10.3"},"peerDependencies":{"zod":"^3.13.4"},"repository":{"type":"git","url":"git+https://github.com/SeasonedSoftware/remix-domains.git"},"author":{"name":"Seasoned Software"},"license":"MIT","bugs":{"url":"https://github.com/SeasonedSoftware/remix-domains/issues"},"homepage":"https://remix-domains.seasoned.cc","devDependencies":{"@remix-run/node":"^1.3.1","@types/node":"^17.0.21","@types/qs":"^6.9.7","@typescript-eslint/eslint-plugin":"^5.15.0","@typescript-eslint/parser":"^5.15.0","c8":"^7.11.0","eslint":"^8.11.0","prettier":"^2.6.0","typescript":"^4.6.2","vitest":"^0.7.0","zod":"^3.13.4"},"gitHead":"86d381c09000f17b0cd6497c192055d92654277a","_id":"remix-domains@0.2.0","_nodeVersion":"16.14.2","_npmVersion":"8.5.0","dist":{"integrity":"sha512-muH3Bu+UAEKgUPHLwZ8LsQWFJ21zmPlLQj8WauIWSJdhfIZfcVQfrh2l3vNI/4O368vxtL5wRbLoGJyMWrw9AA==","shasum":"de083fe2434f1e40ab4b2d0c338abe8f81590301","tarball":"https://registry.npmjs.org/remix-domains/-/remix-domains-0.2.0.tgz","fileCount":13,"unpackedSize":31557,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQCh8qAHnsL73z8kLsztp+nNIvKrJ8ZpltcY9NRITKAErgIhAIIgs8o5YEQIRLicWYTLua9Q8/LwvSQAkrjAtLr2KGD9"}],"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJib9cHACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2VmrmMA//SRwtFhnZ5P9K1ZOMZkIgWiAVMfkk1dlPVnZRSul27jDsDaFD\r\nc8jSzz1welHbPguh9qSo+SlqWYANoQzdcJG5D/7rJzbJNQpBOJaZgl5e//6w\r\nq3WfxG+rc2qCERZwtEw49DvtxolI9noYvuVid9nsgUBbIPZyyPyWEOF5jv5X\r\nwClOzIcW7ZX9A7QTzubxlHiM4aO5s+SYy0+EWV814Q9N2ms+P5+tzds2k3+a\r\nR8P8bgcyh3PArTmE4bqpo/Wt3NSlRcX+ESXMNw7oG5B3NId5dAcUCx0JTaNy\r\nPsDYsJNz0Nk7RA8+RvrleKkXSDNI/qFKFmKAYKdkTdYAwYMfPoI28JD7Znnz\r\nDTuCBz8xnCfX+hryT7zRdx0oLSY3+edCfZH9t69OYoSecitfSVTY/NI+AsJK\r\nVCvL/QOfK8mqFEf3taJULC3hFcmI6mNNTCAgfd1EK3r79XUDqay7pakp5hzm\r\nnpV6cabWYWe5uQQDQzbSOzw0hDKajAHZmAD0HHSmhViEPonYfNfZa32+ylka\r\ngXZcopwewv+hY9P87YJ0oX/1OFGqmJmBOyHa69a3utHE217cjKNBxVXVXCxh\r\nVBrMfolCHsKzd43fYHDXL2zSBhwUvJkHiHuwIJQ7bS03RKBYnPEbEYhcYAmJ\r\nxAS2xyV0tBJQthjOiUolrFaZuujdh62h6V4=\r\n=hSeu\r\n-----END PGP SIGNATURE-----\r\n"},"_npmUser":{"name":"gugaguichard","email":"gustavoguichard@gmail.com"},"directories":{},"maintainers":[{"name":"felipefreitag","email":"ffvargas@gmail.com"},{"name":"danielweinmann","email":"danielweinmann@gmail.com"},{"name":"gugaguichard","email":"gustavoguichard@gmail.com"},{"name":"devseasoned","email":"dev@seasoned.cc"},{"name":"diogoseasoned","email":"diogo@seasoned.cc"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/remix-domains_0.2.0_1651496711075_0.6841541567517055"},"_hasShrinkwrap":false,"deprecated":"🚨 remix-domains was renamed to domain-functions 🔀. Make sure you change it in your package.json so you keep your version up to date."},"0.3.0":{"name":"remix-domains","version":"0.3.0","description":"Decouple your business logic from your Remix actions and loaders. With first-class type inference from end to end.","main":"./dist/index.js","types":"./dist/index.d.ts","scripts":{"dev":"tsc --watch","prebuild":"rm -rf dist/","build":"tsc","prepublishOnly":"npm run build","test":"vitest","typecheck":"tsc --noEmit","lint":"eslint ./src/*.ts"},"dependencies":{"qs":"^6.10.3"},"peerDependencies":{"zod":"^3.13.4"},"repository":{"type":"git","url":"git+https://github.com/SeasonedSoftware/remix-domains.git"},"author":{"name":"Seasoned Software"},"license":"MIT","bugs":{"url":"https://github.com/SeasonedSoftware/remix-domains/issues"},"homepage":"https://remix-domains.seasoned.cc","devDependencies":{"@remix-run/node":"^1.3.1","@types/node":"^17.0.21","@types/qs":"^6.9.7","@typescript-eslint/eslint-plugin":"^5.15.0","@typescript-eslint/parser":"^5.15.0","c8":"^7.11.0","eslint":"^8.11.0","prettier":"^2.6.0","typescript":"^4.6.2","vitest":"^0.7.0","zod":"^3.13.4"},"gitHead":"a5b5d57a4df6523a7f41222f6ef1a07e18a97a8b","_id":"remix-domains@0.3.0","_nodeVersion":"16.10.0","_npmVersion":"7.24.0","dist":{"integrity":"sha512-ny3MiXWJEOoPYJ/4JvYUYckbTkpOo+7Zb0G7eIzPlbFT8n2rCJpPW7iaUm1FuvEvAOY1t4a+Pz2PEygqde96oQ==","shasum":"670fb2638c370103cebca7a0f68dedf824728ec6","tarball":"https://registry.npmjs.org/remix-domains/-/remix-domains-0.3.0.tgz","fileCount":13,"unpackedSize":33130,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIBM86vC15K2A6hREH0jEag9ThMmoCwH77qFwScaky2ZlAiEA4r7FKmTwGdJpyiVFD3RFL4v1FieDYTzYtLlk5NqcqCE="}],"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJilpmIACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2VmqG2w/+P0NDA6KMP9DmdS54bsVgoojRcAwcTOOS6Z2Y3dhkiCF0n9nN\r\nK6t9AS/oHlJnIC5b7c2tAttA10Q4byQk8vYWfXoqRbhf/WVapOxIspy2kzz2\r\nWVapPYbKOwSa9zfllsTlrhLTu831eTPrVwxKOeadobBAigZegx/oA8KNGj3k\r\nGAecdkKOj0HtV2GMjmN7agLMb8f6Q0dEnlYIzlZqc1w3RB0mxca8kpoUOcVH\r\ne+gHkYasMFiR91nmbceZczTjjFMMEz74Rh5vLmC6D0Ve8Q/urLqbvooixXI3\r\nCAity1JxoQfTmtBhVpJ3QhK3Hf0Ius0Na7A6+DkEHgTR1gFnoyxGH0Kf2l2f\r\nEHixEOTv++foWCBwXkKRCNpPLYUDeO+2Fr8LqSzY4jowakaW45zLPPT0ew+o\r\n+vdw7pY9ZgtxcopBgnYyaSwnCcQf481CCcq5t6dk2EUkbJke5crtBoIHWs7X\r\njyQ3dql45xDsiNpwxAYyVqqMhgRVpJZFHps6T9xcg2bnsKwfjqcxaPmzYGD5\r\n4fYoe15khYu/9B6hv8BAhfsTjfcEIlUn9JgSewXpSeMAC0J3FGmyj4YQUv4W\r\nvuAcskT0+c6E2uNfbw57D6i5k+KS0MAWe9o2JQ+4S2tsFoDw8vvYwIv5L0jv\r\nTYbd3wz3J2dJnNsPp9ja1vWlALvaAGaIRug=\r\n=H3ry\r\n-----END PGP SIGNATURE-----\r\n"},"_npmUser":{"name":"diogoseasoned","email":"diogo@seasoned.cc"},"directories":{},"maintainers":[{"name":"felipefreitag","email":"ffvargas@gmail.com"},{"name":"danielweinmann","email":"danielweinmann@gmail.com"},{"name":"gugaguichard","email":"gustavoguichard@gmail.com"},{"name":"devseasoned","email":"dev@seasoned.cc"},{"name":"diogoseasoned","email":"diogo@seasoned.cc"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/remix-domains_0.3.0_1654036872394_0.11000009448559944"},"_hasShrinkwrap":false,"deprecated":"🚨 remix-domains was renamed to domain-functions 🔀. Make sure you change it in your package.json so you keep your version up to date."},"0.3.1":{"name":"remix-domains","version":"0.3.1","description":"Decouple your business logic from your Remix actions and loaders. With first-class type inference from end to end.","main":"./dist/index.js","types":"./dist/index.d.ts","scripts":{"dev":"tsc --watch","prebuild":"rm -rf dist/","build":"tsc","prepublishOnly":"npm run build","test":"vitest","typecheck":"tsc --noEmit","lint":"eslint ./src/*.ts"},"dependencies":{"qs":"^6.10.3"},"peerDependencies":{"zod":"^3.17.3"},"repository":{"type":"git","url":"git+https://github.com/SeasonedSoftware/remix-domains.git"},"author":{"name":"Seasoned Software"},"license":"MIT","bugs":{"url":"https://github.com/SeasonedSoftware/remix-domains/issues"},"homepage":"https://remix-domains.seasoned.cc","devDependencies":{"@remix-run/node":"^1.3.1","@types/node":"^17.0.21","@types/qs":"^6.9.7","@typescript-eslint/eslint-plugin":"^5.15.0","@typescript-eslint/parser":"^5.15.0","c8":"^7.11.0","eslint":"^8.11.0","prettier":"^2.6.0","typescript":"^4.6.2","vitest":"^0.7.0","zod":"^3.17.3"},"gitHead":"51a1f6f50f26817c834839d33d8b7902173ffe76","_id":"remix-domains@0.3.1","_nodeVersion":"16.14.2","_npmVersion":"8.5.0","dist":{"integrity":"sha512-id0ujfVCwlssyYdQcZe6Xx6ebGCEvCirxfyTj2ZYtbSO7QAkiIZcTIYSqp7XVTOjOLt7trPxpjYOOtwEdF3OHQ==","shasum":"fb39bc5d4f158775c23b33c84224b47d8fa44fea","tarball":"https://registry.npmjs.org/remix-domains/-/remix-domains-0.3.1.tgz","fileCount":13,"unpackedSize":34261,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCIAuYNOkn/UHfIC1ar6RqYbZIsuVS6Y2CWpiWo0uWPXdfAiAmR5p/n661DIb0mD8QgTwBu1dYRpNgSnDwH4VZrIP+hQ=="}],"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJivg5KACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2VmpV+w/9FjBK+JV83YJ/ejepid3P4IaE5UQd7vFG/1JmgxXOIF2FI20q\r\n5bCTV2FTuuIEfGZTplBNv/S/F7m/IWGIKcBhH+iujr/SdffV7+sxyVm3aDvR\r\nwNNh6q3uxktfh1IYYMLjIvc6ADvursaify6VVvQKx3xzDbSXAChWTRataSTV\r\n4MZsoSiOhfqJ+4TZBl4NuElqGcVJcr15zEI0ncjt4HbwOmVCArSio4pii61Z\r\n1Kr4Ud4OXVQ9qqEms4P1p688ZQz9TWems1il1J/vi8SUeJNn2tvpjDO5bNyF\r\nHskN9qGaR2G9HZ3CCVXbNjRO+hk/VJmTF5f+kGgQKAg6BJn8OzhXgfdmciqR\r\nkdZK2y8OIuU6HRZNTYUOBXRo1se5je5CNaSB+ClwMLmGHtMfwXP2XG7HGkEF\r\np//AK5b/8bpOHTxD182eGcywf/0HwkNkXSs/A899v+q53Ty6IE9ZHsgdY2mJ\r\nLyTXjzJ7WEULbBIggJXq1PkMELfeYA9+DBGqqbNvU8ADPdX6EOjqUkLU63hu\r\nsAnV12QGxiwZFwI9Sof3mfbIx2Gwmk7P+LIiSDsO7dPe7GcA8IpC1v0jo392\r\nRRf5sgUUqyAJOI1WdJOVCwdLIjTR75+WdO3fBKVIsH9p9jVbTUzZBjNLiSUt\r\nV5NEGW29PrZ5umNwaITW3TT0e4JsNPKvDwQ=\r\n=p188\r\n-----END PGP SIGNATURE-----\r\n"},"_npmUser":{"name":"gugaguichard","email":"gustavoguichard@gmail.com"},"directories":{},"maintainers":[{"name":"felipefreitag","email":"ffvargas@gmail.com"},{"name":"danielweinmann","email":"danielweinmann@gmail.com"},{"name":"gugaguichard","email":"gustavoguichard@gmail.com"},{"name":"devseasoned","email":"dev@seasoned.cc"},{"name":"diogoseasoned","email":"diogo@seasoned.cc"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/remix-domains_0.3.1_1656622666016_0.7404127613156279"},"_hasShrinkwrap":false,"deprecated":"🚨 remix-domains was renamed to domain-functions 🔀. Make sure you change it in your package.json so you keep your version up to date."},"0.3.2":{"name":"remix-domains","version":"0.3.2","description":"Decouple your business logic from your Remix actions and loaders. With first-class type inference from end to end.","main":"./dist/index.js","types":"./dist/index.d.ts","scripts":{"dev":"tsc --watch","prebuild":"rm -rf dist/","build":"tsc","prepublishOnly":"npm run build","test":"vitest","typecheck":"tsc --noEmit","lint":"eslint ./src/*.ts"},"dependencies":{"qs":"^6.10.3"},"peerDependencies":{"zod":"^3.17.3"},"repository":{"type":"git","url":"git+https://github.com/SeasonedSoftware/remix-domains.git"},"author":{"name":"Seasoned Software"},"license":"MIT","bugs":{"url":"https://github.com/SeasonedSoftware/remix-domains/issues"},"homepage":"https://remix-domains.seasoned.cc","devDependencies":{"@remix-run/node":"^1.3.1","@types/node":"^17.0.21","@types/qs":"^6.9.7","@typescript-eslint/eslint-plugin":"^5.15.0","@typescript-eslint/parser":"^5.15.0","c8":"^7.11.0","eslint":"^8.11.0","prettier":"^2.6.0","typescript":"^4.6.2","vitest":"^0.7.0","zod":"^3.17.3"},"gitHead":"4bad6e62a86e07481c46ea9ce9f27c9e175ed662","_id":"remix-domains@0.3.2","_nodeVersion":"16.10.0","_npmVersion":"7.24.0","dist":{"integrity":"sha512-e/SvgweoZdItbagdijkCFyaCOc1rZJGaDEu68tBlFv5SAa0RjebFMn+Kj3KxwjmK57ltXJt20022EmnGV4meBQ==","shasum":"5b2198f73ae82f841322ff1871d58b411c4a87af","tarball":"https://registry.npmjs.org/remix-domains/-/remix-domains-0.3.2.tgz","fileCount":13,"unpackedSize":34259,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQCS5XGFelooiN7jFB2PVo9E2S/daxY1eR1W0+XYt60c1gIhAJtOgfBJt3wn9JyMlUJHHtic6e5m4SJuMTLF6Xsc5tWc"}],"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJiw1CDACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2Vmp3kA/8Cpgyd1r5tCbRNMnGjsmwKrNReH+QLdWy5caA8b65FUP33H8v\r\n1B5Y4zgb1raHWaCl+hVHos8NYBPFnI/DxSvvrO9OqxdIukZngZpTReqtb7qg\r\nRfi+mmMSrcIdjpuo2P4crcmrATH0Ci30u0Zaqzo08QCGymuARVvKfbat9wTX\r\n9gZoTADOPWlLTCMLwYlgY7DX/aSIMusKyK85R9wEb0gJxoeSiw4sW58bGhW8\r\nNmaaHWm9n8X2tC54cb4JsbeZdqzTjWPPNkXOva3oyn+7GHaOJERKDtEch4a/\r\ny1lINtoe7vdBYnnColxoa6l8VtQsjARpTIhG6JUEGMGiMx0HXacAocxBgy8M\r\nbZb3jHjnkXIrfRiapwpCCeQ4LdwmqKp6Gg2JcSyfkoeEkd7TTvehO8pkgj2Q\r\nmSUE7FgzBaybTvKFuOtMX9LcUvGwnKtnaP6QIt1sNFFWMZjZpAzALjUxyJjE\r\nfmYtBL4m3GOdThacFFG/bh3h3SJjPW4m9QpuoiTXApYTri6HcrkO0w/lF5Md\r\n9isXoL/NA9HAXbbBt79gOO5Wm0jIaLRRK+MSkDIfYToL73pyTstUqVczeAjl\r\n7laoA191rSSL3gT6q/SrShDdYGX9neOdKt+RS0raSBT16JhRput38KDLuLeB\r\ni1e5Pi+lwfiZmS3dcug+nUKMD/Mo/cxrz/8=\r\n=IaJh\r\n-----END PGP SIGNATURE-----\r\n"},"_npmUser":{"name":"diogoseasoned","email":"diogo@seasoned.cc"},"directories":{},"maintainers":[{"name":"felipefreitag","email":"ffvargas@gmail.com"},{"name":"danielweinmann","email":"danielweinmann@gmail.com"},{"name":"gugaguichard","email":"gustavoguichard@gmail.com"},{"name":"devseasoned","email":"dev@seasoned.cc"},{"name":"diogoseasoned","email":"diogo@seasoned.cc"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/remix-domains_0.3.2_1656967299224_0.9701087134016664"},"_hasShrinkwrap":false,"deprecated":"🚨 remix-domains was renamed to domain-functions 🔀. Make sure you change it in your package.json so you keep your version up to date."}},"time":{"created":"2022-03-14T19:47:03.830Z","0.0.0":"2022-03-14T19:47:03.976Z","modified":"2023-04-11T03:35:08.750Z","0.0.1":"2022-03-18T12:40:49.454Z","0.0.2-rc.0":"2022-03-18T13:02:05.087Z","0.0.1-rc.0":"2022-03-18T13:03:12.374Z","0.0.1-rc.1":"2022-03-18T15:19:23.728Z","0.0.1-rc.2":"2022-03-18T15:19:49.811Z","0.0.1-rc.3":"2022-03-19T01:44:05.483Z","0.0.1-rc.4":"2022-03-19T01:51:49.522Z","0.0.1-rc.5":"2022-03-19T17:41:19.503Z","0.0.1-rc.6":"2022-03-19T17:58:40.200Z","0.0.1-rc.7":"2022-03-25T13:04:48.903Z","0.0.1-rc.8":"2022-03-29T18:10:23.362Z","0.0.1-rc.9":"2022-04-06T15:14:11.746Z","0.0.1-rc.10":"2022-04-08T20:51:59.806Z","0.0.1-rc.11":"2022-04-14T14:04:51.117Z","0.0.2":"2022-04-14T19:17:06.330Z","0.1.0":"2022-04-25T15:11:17.300Z","0.2.0":"2022-05-02T13:05:11.285Z","0.3.0":"2022-05-31T22:41:12.552Z","0.3.1":"2022-06-30T20:57:46.209Z","0.3.2":"2022-07-04T20:41:39.419Z"},"maintainers":[{"email":"gustavoguichard@gmail.com","name":"guga.guichard"},{"email":"ffvargas@gmail.com","name":"felipefreitag"},{"email":"danielweinmann@gmail.com","name":"danielweinmann"},{"email":"dev@seasoned.cc","name":"devseasoned"},{"email":"diogo@seasoned.cc","name":"diogoseasoned"}],"homepage":"https://remix-domains.seasoned.cc","repository":{"type":"git","url":"git+https://github.com/SeasonedSoftware/remix-domains.git"},"author":{"name":"Seasoned Software"},"bugs":{"url":"https://github.com/SeasonedSoftware/remix-domains/issues"},"license":"MIT","readme":"# Keep your business logic clean with Remix Domains\n\nRemix Domains helps you decouple your business logic from your Remix actions and loaders. With first-class type inference from end to end.\nIt does this by enforcing the parameters' types in runtime (through [zod](https://github.com/colinhacks/zod#what-is-zod) schemas) and always wrapping results (even exceptions) into a `Promise<Result<Output>>` type.\n\n![](example.gif)\n\n## Table of contents\n\n- [Benefits](#benefits)\n- [Quickstart](#quickstart)\n- [Create your first action with Remix](#create-your-first-action-with-remix)\n- [Taking parameters that are not user input](#taking-parameters-that-are-not-user-input)\n- [Dealing with errors](#dealing-with-errors)\n  - [Changing the ErrorResult with Custom Errors](#changing-the-errorresult-with-custom-errors)\n  - [Using error messages in the UI](#using-error-messages-in-the-ui)\n    - [errorMessagesFor](#errormessagesfor)\n    - [errorMessagesForSchema](#errormessagesforschema)\n- [Combining domain functions](#combining-domain-functions)\n  - [all](#all)\n  - [pipe](#pipe)\n  - [map](#map)\n  - [mapError](#maperror)\n- [Extracting input values for domain functions](#extracting-input-values-for-domain-functions)\n  - [inputFromForm](#inputfromform)\n  - [inputFromFormData](#inputfromformdata)\n  - [inputFromUrl](#inputfromurl)\n  - [inputFromSearch](#inputfromsearch)\n- [Improve type inference with Utility Types](#improve-type-inference-with-utility-types)\n  - [UnpackData](#unpackdata)\n  - [UnpackSuccess](#unpacksuccess)\n  - [UnpackResult](#unpackresult)\n- [Resources](#resources)\n- [Acknowlegements](#acknowlegements)\n\n## Benefits\n- End-to-End typesafety all the way from the Backend to the UI\n- Keep your Remix Actions and Loaders slim and tidy\n- Removes the plumbing of extracting and parsing structured data from your Requests\n- Keep your domain functions decoupled from the framework, with the assurance that your values conform to your types\n- Easier to test and maintain business logic\n- Business Logic can be expressed in the type system\n\n## Quickstart\n\n```\nnpm i remix-domains zod\n```\n\n```tsx\nimport { makeDomainFunction, inputFromForm } from 'remix-domains'\nimport * as z from 'zod'\n\nconst schema = z.object({ number: z.preprocess(Number, z.number()) })\nconst increment = makeDomainFunction(schema)(async ({ number }) => number + 1)\n\nconst result = await increment({ number: 1 })\n/*\nresult = {\n  success: true,\n  data: 2,\n  errors: []\n  inputErrors: []\n  environmentErrors: []\n}\n*/\nconst failedResult = await increment({ number: 'foo' })\n/*\nfailedResult = {\n  success: false,\n  inputErrors: [{ path: ['number'], message: 'Expected number, received nan' }],\n  environmentErrors: []\n  errors: [],\n}\n*/\n```\n\nTo understand how to build the schemas, refer to [Zod documentation](https://github.com/colinhacks/zod#defining-schemas).\n\n## Create your first action with Remix\n```tsx\nimport type { ActionFunction } from 'remix'\nimport { useActionData, redirect } from 'remix'\nimport { makeDomainFunction, inputFromForm } from 'remix-domains'\nimport * as z from 'zod'\n\nconst schema = z.object({ number: z.preprocess(Number, z.number()) })\nconst increment = makeDomainFunction(schema)(({ number }) => number + 1)\n\nexport const action: ActionFunction = async ({ request }) => {\n  const result = await increment(await inputFromForm(request))\n\n  if (!result.success) return result\n\n  return redirect('/')\n}\n\nexport default function Index() {\n  const actionData = useActionData()\n\n  return (\n    <Form method=\"post\">\n      <input name=\"number\" type=\"number\" />\n      {actionData.inputErrors && (\n        <span role=\"alert\">{actionData.inputErrors[0].message}</span>\n      )}\n      <button type=\"submit\">\n        Submit\n      </button>\n    </Form>\n  )\n}\n```\n\n## Taking parameters that are not user input\n\nSometimes you want to ensure the safety of certain values that weren't explicitly sent by the user. We call them _environment_:\n\n```tsx\n// In some app/domain/*.server.ts file\nconst sendEmail = makeDomainFunction(\n  z.object({ email: z.string().email() }), // user input schema\n  z.object({ origin: z.string() }) // environment schema\n)(\n  async ({ email }, { origin }) => {\n    mailer.send({\n      email,\n      message: `Link to reset password: ${origin}/reset-password`\n    })\n  }\n)\n\n// In your Remix action:\nexport const action = async ({ request }) => {\n  const environment = (request: Request) => ({\n    origin: new URL(request.url).origin,\n  })\n\n  await sendEmail(\n    await inputFromForm(request),\n    environment(request),\n  )\n}\n```\n\nWe usually use the environment for ensuring authenticated requests.\nIn this case, assume you have a `currentUser` function that returns the authenticated user:\n```tsx\nconst dangerousFunction = makeDomainFunction(\n  someInputSchema,\n  z.object({ user: z.object({ id: z.string(), admin: z.literal(true) }) })\n)(async (input, { user }) => {\n  // do something that only the admin can do\n})\n```\n\n## Dealing with errors\n\nThe error result has the following structure:\n```ts\ntype ErrorResult = {\n  success: false\n  errors: { message: string }[]\n  inputErrors: SchemaError[]\n  environmentErrors: SchemaError[]\n}\n```\n\nWhere `inputErrors` and `environmentErrors` will be the errors from parsing the corresponding Zod schemas and `errors` will be for any exceptions thrown inside the domain function:\n\n```ts\nconst alwaysFails = makeDomainFunction(input, environment)(async () => {\n  throw new Error('Some error')\n})\n\nconst failedResult = await alwaysFails(someInput)\n/*\nfailedResult = {\n  success: false,\n  errors: [{ message: 'Some error' }],\n  inputErrors: [],\n  environmentErrors: [],\n}\n*/\n```\n\n### Changing the ErrorResult with Custom Errors\n\nOr you can throw an `InputError` whenever you want a custom input error that cannot be generated by your schema.\n\n```ts\nconst alwaysFails = makeDomainFunction(input, environment)(async () => {\n  throw new InputError('Email already taken', 'email')\n})\n\nconst failedResult = await alwaysFails(someInput)\n/*\nfailedResult = {\n  success: false,\n  errors: [],\n  inputErrors: [{ message: 'Email already taken', path: ['email'] }],\n  environmentErrors: [],\n}\n*/\n```\n\nTo throw several input errors in one shot you can use the pluralized version `InputErrors` as in:\n\n```ts\nconst alwaysFails = makeDomainFunction(input, environment)(async () => {\n  throw new InputErrors([{message: 'Email already taken', path: 'email'}, {message: 'Password too short', path: 'password'}])\n})\n\nconst failedResult = await alwaysFails(someInput)\n/*\nfailedResult = {\n  success: false,\n  errors: [],\n  inputErrors: [{ message: 'Email already taken', path: ['email'] }, { message: 'Password too short', path: ['password'] }],\n  environmentErrors: [],\n}\n*/\n```\n\nYou can also return a custom environment error by throwing an `EnvironmentError`.\n\n### Using error messages in the UI\nTo improve DX when dealing with errors we do export a couple of utilities.\n\n#### errorMessagesFor\nGiven a array of `SchemaError` be it from `inputErrors` or `environmentErrors` and a name, it returns a list of error messages with that name in their path.\n\n```tsx\nconst result = {\n  success: false,\n  errors: [],\n  inputErrors: [],\n  environmentErrors: [{ message: 'Must not be empty', path: ['host'] }, { message: 'Must be a fully qualified domain', path: ['host'] }]\n}\n\nerrorMessagesFor(result.inputErrors, 'email') === null\nerrorMessagesFor(result.environmentErrors, 'host').message === 'Must not be empty'\n```\n#### errorMessagesForSchema\nGiven a array of `SchemaError` be it from `inputErrors` or `environmentErrors` and a Zod Schema, it returns an object with a list of error messages for each key in the schema shape.\n\n```tsx\nconst schema = z.object({ email: z.string().nonEmpty(), password: z.string().nonEmpty() })\nconst result = {\n  success: false,\n  errors: [],\n  inputErrors: [{ message: 'Must not be empty', path: ['email'] }, { message: 'Must be a string', path: ['email'] }, { message: 'Must not be empty', path: ['password'] }],\n  environmentErrors: []\n}\n\nerrorForSchema(result.inputErrors, schema)\n/*\n{\n  email: ['Must not be empty', 'Must be a string'],\n  password: ['Must not be empty']\n}\n*/\n```\n\n## Combining domain functions\n\n### all\n\nIt creates a single domain function out of multiple domain functions.\nIt will pass the same input and environment to all given functions.\nThe resulting data is going to be a tuple of the results of each function only when __all functions__ are successful.\n```ts\nconst a = makeDomainFunction(z.object({ id: z.number() }))(async ({ id }) => String(id))\nconst b = makeDomainFunction(z.object({ id: z.number() }))(async ({ id }) => id + 1)\nconst c = makeDomainFunction(z.object({ id: z.number() }))(async ({ id }) => Boolean(id))\n\nconst results = await all(a, b, c)({ id: 1 })\n```\n\nOn the exemple above, the result will be of type `Result<[string, number, boolean]>`:\n```ts\n{\n  success: true,\n  data: ['1', 2, true],\n  errors: [],\n  inputErrors: [],\n  environmentErrors: [],\n}\n```\n\nIf one or more of the functions fails, the errors will be concatenated:\n\n```ts\nconst a = makeDomainFunction(z.object({ id: z.number() }))(async () => {\n  throw new Error('Error A')\n})\nconst b = makeDomainFunction(z.object({ id: z.number() }))(async () => {\n  throw new Error('Error B')\n})\n\nconst results = await all(a, b)({ id: 1 })\n\n/*{\n  success: false,\n  errors: [{ message: 'Error A' }, { message: 'Error B' }],\n  inputErrors: [],\n  environmentErrors: [],\n}*/\n```\n\n### pipe\n\nIt creates a single domain function out of a composition of multiple domain functions.\nIt will pass the same environment to all given functions and pass the output of one to the next's input in left-to-right order.\nThe resulting data is going to be the output of the rightmost function.\n\nNote that there is no type-level assurance (yet) that one function output will be succesfully parsed by the next function in the pipeline.\n```ts\nconst a = makeDomainFunction(z.object({ aNumber: z.number() }))(\n  async ({ aNumber }) => ({\n    aString: String(aNumber),\n  }),\n)\nconst b = makeDomainFunction(z.object({ aString: z.string() }))(\n  async ({ aString }) => ({\n    aBoolean: aString == '1',\n  }),\n)\nconst c = makeDomainFunction(z.object({ aBoolean: z.boolean() }))(\n  async ({ aBoolean }) => !aBoolean,\n)\n\nconst d = pipe(a, b, c)\n\nconst result = await d({ aNumber: 1 })\n```\n\nOn the exemple above, the result will be of type `Result<boolean>`:\n```ts\n{\n  success: true,\n  data: false,\n  errors: [],\n  inputErrors: [],\n  environmentErrors: [],\n}\n```\n\nIf one functions fails, the execution will halt and the error returned.\n\n### map\n\nIt creates a single domain function that will apply a transformation over the `result.data` of a successful `DomainFunction`.\nWhen the given domain function fails, its error is returned wihout changes.\nThe resulting data is going to be the output of the second argument.\n\nThis could be useful when composing domain functions to align their types:\n\n```ts\nconst fetchAsText = makeDomainFunction(z.object({ userId: z.number() }))(\n  ({ userId }) =>\n    fetch(`https://reqres.in/api/users/${String(userId)}`).then((r) =>\n      r.json(),\n    ),\n)\n\nconst fullName = makeDomainFunction(\n  z.object({ first_name: z.string(), last_name: z.string() }),\n)(async ({ first_name, last_name }) => `${first_name} ${last_name}`)\n\nconst fetchFullName = pipe(\n  map(fetchAsText, ({ data }) => data),\n  fullName,\n)\n\nconst result = fetchFullName({ userId: 2 })\n```\n\nOn the exemple above, the result will be of type `Result<string>` and tis value something like:\n```ts\n{\n  success: true,\n  data: 'Janet Weaver',\n  errors: [],\n  inputErrors: [],\n  environmentErrors: [],\n}\n```\n\n### mapError\n\nIt creates a single domain function that will apply a transformation over the `ErrorResult` of a failed `DomainFunction`.\nWhen the given domain function suceeds, its result is returned wihout changes.\n\nThis could be useful when adding any layer of error handling.\nIn the example bellow we are discarding the contents of the errors but keeping a tally of how many there were:\n\n```ts\nconst increment = makeDomainFunction(z.object({ id: z.number() }))(\n  async ({ id }) => id + 1,\n)\n\nconst summarizeErrors = (result: ErrorData) =>\n  ({\n    errors: [{ message: 'Number of errors: ' + result.errors.length }],\n    inputErrors: [\n      { message: 'Number of input errors: ' + result.inputErrors.length },\n    ],\n    environmentErrors: [\n      { message: 'Number of environment errors: ' + result.environmentErrors.length },\n    ],\n  } as ErrorData)\n\nconst incrementWithErrorSummary = mapError(increment, summarizeErrors)\n\nconst result = await incrementWithErrorSummary({ invalidInput: '1' })\n```\n\nOn the exemple above, the `result` will be:\n```ts\n{\n  success: false,\n  errors: [{ message: 'Number of errors: 0' }],\n  inputErrors: [{ message: 'Number of input errors: 1' }],\n  environmentErrors: [{ message: 'Number of environment errors: 0' }],\n}\n```\n\n## Extracting input values for domain functions\nWe export some functions to help you extract values out of your requests before sending them as user input.\n\n### inputFromForm\n\nExtracts values sent in a request through the `FormData` as an object of values:\n```tsx\n// Given the following form:\nfunction Form() {\n  return (\n    <form method=\"post\">\n      <input name=\"email\" value=\"john@doe.com\" />\n      <input name=\"password\" value=\"1234\" />\n      <button type=\"submit\">\n        Submit\n      </button>\n    </form>\n  )\n}\n\nexport const action = async ({ request }) => {\n  const values = await inputFromForm(request)\n  // values = { email: 'john@doe.com', password: '1234' }\n}\n```\n\n### inputFromFormData\n\nExtracts a structured object from a `FormData`:\n```tsx\nconst formData = new FormData()\nformData.append('email', 'john@doe.com')\nformData.append('tasks[]', 'one')\nformData.append('tasks[]', 'two')\nconst values = inputFromFormData(formData)\n// values = { email: 'john@doe.com', tasks: ['one', 'two'] }\n```\n\n### inputFromUrl\nExtracts values sent in a request through the URL as an object of values:\n```tsx\n// Given the following form:\nfunction Form() {\n  return (\n    <form method=\"get\">\n      <button name=\"page\" value=\"2\">\n        Change URL\n      </button>\n    </form>\n  )\n}\n\nexport const action = async ({ request }) => {\n  const values = inputFromUrl(request)\n  // values = { page: '2' }\n}\n```\n### inputFromSearch\nExtracts a structured object from a `URLSearchParams` object:\n```tsx\nconst qs = new URLSearchParams()\nqs.append('colors[]', 'red')\nqs.append('colors[]', 'green')\nqs.append('colors[]', 'blue')\nconst values = inputFromSearch(qs)\n// values = { colors: ['red', 'green', 'blue'] }\n```\n\nAll of the functions above will parse the input using [`qs`](https://www.npmjs.com/package/qs), thus allowing structured data as follows:\n```tsx\n// Given the following form:\nfunction Form() {\n  return (\n    <form method=\"post\">\n      <input name=\"numbers[]\" value=\"1\" />\n      <input name=\"numbers[]\" value=\"2\" />\n      <input name=\"person[0][email]\" value=\"john@doe.com\" />\n      <input name=\"person[0][password]\" value=\"1234\" />\n      <button type=\"submit\">\n        Submit\n      </button>\n    </form>\n  )\n}\n\nexport const action = async ({ request }) => {\n  const values = await inputFromForm(request)\n  /*\n  values = {\n    numbers: ['1', '2'],\n    person: [{ email: 'john@doe.com', password: '1234' }]\n  }\n  */\n}\n```\n\nTo better understand how to structure your data, refer to [qs documentation](https://github.com/ljharb/qs#parsing-objects)\n\n## Improve type inference with Utility Types\n\n### UnpackData\nIt infers the returned data of a successful domain function:\n```ts\nconst fn = makeDomainFunction()(async () => '')\n\ntype Data = UnpackData<typeof fn>\n// Data = string\n```\n\n### UnpackSuccess\nIt infers the success result of a domain function:\n```ts\nconst fn = makeDomainFunction()(async () => '')\n\ntype Success = UnpackSuccess<typeof fn>\n// Success = { success: true, data: string, errors: [], inputErrors: [], environmentErrors: [] }\n// Which is the same as: SuccessResult<string>\n```\n### UnpackResult\nIt infers the result of a domain function:\n```ts\nconst fn = makeDomainFunction()(async () => '')\n\ntype Result = UnpackResult<typeof fn>\n/*\nResult =\n  | { success: true, data: string, errors: [], inputErrors: [], environmentErrors: [], }\n  | { success: false, errors: { message: string }[], inputErrors: SchemaError[], environmentErrors: SchemaError[] }\n\n* Which is the same as:\nResult<string>\n* Which is the same as:\nSuccessResult<string> | ErrorResult\n*/\n```\n\n## Resources\n- Blog post: [How remix-domains improves the already awesome DX of Remix projects](https://dev.to/gugaguichard/how-remix-domains-improves-the-already-awesome-dx-of-remix-projects-56lm)\n\n## Acknowlegements\n\nWe are grateful for [Zod](https://github.com/colinhacks/zod) as it is a great library and informed our design.\nIt's worth mentioning two other projects that inspired remix domains:\n\n- [Servant](https://github.com/haskell-servant/servant/)\n- [tRPC](https://trpc.io)\n","readmeFilename":"README.md","description":"Decouple your business logic from your Remix actions and loaders. With first-class type inference from end to end."}