{"_id":"remix-utils","_rev":"79-e9b55b123445e08de9850664f2d09991","name":"remix-utils","dist-tags":{"next":"7.0.0-pre.7","latest":"10.0.0"},"versions":{"1.0.2":{"name":"remix-utils","version":"1.0.2","author":{"name":"Sergio Xalambrí"},"license":"MIT","_id":"remix-utils@1.0.2","maintainers":[{"name":"sergiodxa","email":"sergiodxa@gmail.com"}],"dist":{"shasum":"f96129169ec43fc70f94bdc4885334d8d76d9d39","tarball":"https://registry.npmjs.org/remix-utils/-/remix-utils-1.0.2.tgz","fileCount":12,"integrity":"sha512-nr5sgQfMX59GAQZJW0iUuwrdR9R07JscinxxB9HpN28kIUEQgksHosJvRUzaMbdIj0h6TXuAIKKqbBcM9iTYvA==","signatures":[{"sig":"MEYCIQC1gAGajTW2gtTRnZK0vaPQyJHUFNZ9OAsEGIAapLFo0wIhAKaT3kVDwR6cqYcNP0nypdROEFJycritBDLKFnhHS0CX","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":17069,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.13\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJgkFvsCRA9TVsSAnZWagAAQXQP/iWfBHjWLuWQOsdisonq\n6kPX7I/vJAk6QsFPsn79yM03yeDd7q2gys3/UxybgdtNM28gf0HFKw0ijOJB\nJTUUdbbQkQAZR6wcAJHhSkhN9Ph9udtM6O3kMqHEl91pOS68fbdT8eDuD6Sg\nRDFGe5jC6fumvrnuAVIjjq9hKWfbMH4YPWUu48HRehyzHCZO92bcz98y1Ihk\nf9Yu0OH3hYPqxNP+4vYLrZFSyV7GUnmPjZ5Z/Kkoxdh1E5rQgAZ//MIBLxc2\nXvLbghRRyFAwvooTd5FN8UkdMzvxtnGuary+Pnv0REwzHWiVk4mMwk6Z41Cm\nsXrpePSQM1aA2tmUowcrRlB8CtSBKaPxrGpiD0W3ITFQPB3Nb/e4mFOlzHdA\n5FUhKmUoAwktF/FU0YqlalOU/6KbNmpILaSSscKQJ7d1Nfp/2J4g0OzsUPGh\n+wGkaskCbE4Ut2BB1AnJPwu/aBPnxAcAGJSaA/6qMhQXhaeaF+05wx7Tq6QQ\nuMF5Oo6KFAT8KkJxnzyygCDQzNNmoMYuSe1brMyiAE7mGSRbPQp/AxgwKbKU\n74nOtY9+aeGpAzJqlrRE/1AcNrGCKbkilgh/xYWGb3SJK73zEtCEstkUrzyV\nfSpcVVji8heJMJ/D1paNB1UWUJfy6wGC2sjWKK1LC5k88pclMgyul5r7GCd4\nzP7G\r\n=MYso\r\n-----END PGP SIGNATURE-----\r\n"},"main":"dist/index.js","husky":{"hooks":{"pre-commit":"tsdx lint"}},"module":"dist/remix-utils.esm.js","engines":{"node":">=14"},"gitHead":"57689792b2927c8c83f5ffa55450c78d8fbd1405","scripts":{"lint":"tsdx lint","size":"size-limit","test":"tsdx test","build":"tsdx build","start":"tsdx watch","analyze":"size-limit --why","prepare":"tsdx build"},"typings":"dist/index.d.ts","_npmUser":{"name":"sergiodxa","email":"sergiodxa@gmail.com"},"prettier":{"semi":true,"printWidth":80,"singleQuote":true,"trailingComma":"es5"},"size-limit":[{"path":"dist/remix-utils.cjs.production.min.js","limit":"10 KB"},{"path":"dist/remix-utils.esm.js","limit":"10 KB"}],"_npmVersion":"6.14.12","description":"This package contains simple utility functions and types to use together with [Remix.run](https://remix.run).","directories":{},"_nodeVersion":"14.16.1","_hasShrinkwrap":false,"devDependencies":{"tsdx":"^0.14.1","husky":"^6.0.0","react":"^17.0.2","remix":"^0.17.0","tslib":"^2.2.0","size-limit":"^4.10.2","typescript":"^4.2.4","@remix-run/node":"^0.17.0","@remix-run/react":"^0.17.0","@size-limit/preset-small-lib":"^4.10.2"},"peerDependencies":{"react":"^17.0.2","remix":"^0.17.0","@remix-run/node":"^0.17.0","@remix-run/react":"^0.17.0"},"_npmOperationalInternal":{"tmp":"tmp/remix-utils_1.0.2_1620073451746_0.36675524995478836","host":"s3://npm-registry-packages"}},"2.0.0":{"name":"remix-utils","version":"2.0.0","keywords":["remix","remix.run","react","utils","request","response","csrf","redirect-back","outlet","client-only","hydrated","body parser"],"author":{"url":"https://sergiodxa.com","name":"Sergio Xalambrí","email":"hello@sergiodxa.com"},"license":"MIT","_id":"remix-utils@2.0.0","maintainers":[{"name":"sergiodxa","email":"sergiodxa@gmail.com"}],"homepage":"https://github.com/sergiodxa/remix-utils#readme","bugs":{"url":"https://github.com/sergiodxa/remix-utils/issues"},"dist":{"shasum":"b7be056a562579cb85196eda16753fa5cbad0201","tarball":"https://registry.npmjs.org/remix-utils/-/remix-utils-2.0.0.tgz","fileCount":23,"integrity":"sha512-ZIMt5EKEJxjcK8kqYVmSqa+qbKsx68O/mJny/aCvO0cfIfPyEVlYhrg2QSIJqxk4nV4YOm58A3OITC3q/Tb2vQ==","signatures":[{"sig":"MEUCIQDLIOE5h/LO69vkXds/0xLYi2oST91z8NaY2DjotId3lgIgJrP1twNpD5DEJqnwxAkzAjGUIlaAU+DwfDesuXD6y/Q=","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":47409},"engines":{"node":">=16"},"gitHead":"ce753364d9ff88a94ec05428f72ebee8c3b18c63","scripts":{"lint":"eslint --ext .ts,.tsx src/","test":"jest --config=config/jest.config.ts --passWithNoTests","build":"tsc --project tsconfig.json","setup":"remix setup","start":"node server.js","typecheck":"tsc --project tsconfig.json --noEmit","postinstall":"npm run setup"},"_npmUser":{"name":"sergiodxa","email":"sergiodxa@gmail.com"},"repository":{"url":"git+https://github.com/sergiodxa/remix-utils.git","type":"git"},"_npmVersion":"6.14.15","description":"This package contains simple utility functions to use with [Remix.run](https://remix.run).","directories":{},"_nodeVersion":"14.18.1","dependencies":{"prettier":"^2.4.1","type-fest":"^2.5.2"},"_hasShrinkwrap":false,"devDependencies":{"jest":"^27.3.1","react":"^17.0.2","remix":"^0.20.1","eslint":"^7.26.0","ts-node":"^10.4.0","babel-jest":"^27.3.1","typescript":"^4.2.4","@babel/core":"^7.16.0","@jest/types":"^27.2.5","@types/react":"^17.0.14","@remix-run/dev":"^0.20.1","@remix-run/node":"^0.20.1","jest-fetch-mock":"^3.0.3","@remix-run/react":"^0.20.1","react-router-dom":"^6.0.0-beta.6","@babel/preset-env":"^7.16.0","eslint-plugin-jest":"^24.3.6","@babel/preset-react":"^7.16.0","eslint-plugin-react":"^7.26.1","eslint-plugin-import":"^2.22.1","eslint-plugin-cypress":"^2.11.3","eslint-plugin-promise":"^5.1.0","eslint-plugin-unicorn":"^32.0.1","@testing-library/react":"^12.1.2","eslint-config-prettier":"^8.3.0","eslint-plugin-jest-dom":"^3.9.0","eslint-plugin-jsx-a11y":"^6.4.1","eslint-plugin-prettier":"^3.4.0","@babel/preset-typescript":"^7.16.0","@testing-library/jest-dom":"^5.15.0","@typescript-eslint/parser":"^5.3.0","eslint-plugin-react-hooks":"^4.2.0","@size-limit/preset-small-lib":"^4.10.2","eslint-plugin-testing-library":"^4.3.0","@typescript-eslint/eslint-plugin":"^5.3.0","eslint-import-resolver-typescript":"^2.5.0"},"peerDependencies":{"react":"^17.0.2","remix":"^0.20.1","@remix-run/node":"^0.20.1","@remix-run/react":"^0.20.1"},"_npmOperationalInternal":{"tmp":"tmp/remix-utils_2.0.0_1636050693265_0.619824070851319","host":"s3://npm-registry-packages"}},"2.0.1":{"name":"remix-utils","version":"2.0.1","keywords":["remix","remix.run","react","utils","request","response","csrf","redirect-back","outlet","client-only","hydrated","body parser"],"author":{"url":"https://sergiodxa.com","name":"Sergio Xalambrí","email":"hello@sergiodxa.com"},"license":"MIT","_id":"remix-utils@2.0.1","maintainers":[{"name":"sergiodxa","email":"sergiodxa@gmail.com"}],"homepage":"https://github.com/sergiodxa/remix-utils#readme","bugs":{"url":"https://github.com/sergiodxa/remix-utils/issues"},"dist":{"shasum":"3998f569bca7c4614d1a4ef650b3c65176a6adef","tarball":"https://registry.npmjs.org/remix-utils/-/remix-utils-2.0.1.tgz","fileCount":47,"integrity":"sha512-Eoz7ijaKbMe1dospTiMgqWB+/Xx2KAF520CopJDMwnH5pbAEfidlvDZ5K4FFDTEkq3ciP/SvuHEoGzvYtvSbDg==","signatures":[{"sig":"MEUCIQCdRkp/JxCSY4zMtQqEo/+m3QjUDP31Lm5IQ0KUnyPmlAIgZo6U3fggz5vx3xQnnoxKUpA1To08L2LEde1I8Kw8gPM=","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":73641},"main":"./build/index.js","types":"./build/index.d.ts","browser":"./browser/index.js","engines":{"node":">=16"},"gitHead":"067dfe167a6eb75ffa592994ce8885a579000b06","scripts":{"lint":"eslint --ext .ts,.tsx src/","test":"jest --config=config/jest.config.ts --passWithNoTests","build":"npm run build:browser && npm run build:main","setup":"remix setup","typecheck":"tsc --project tsconfig.json --noEmit","build:main":"tsc --project tsconfig.json --module CommonJS --outDir ./build","postinstall":"npm run setup","build:browser":"tsc --project tsconfig.json --module ESNext --outDir ./browser"},"_npmUser":{"name":"sergiodxa","email":"sergiodxa@gmail.com"},"repository":{"url":"git+https://github.com/sergiodxa/remix-utils.git","type":"git"},"_npmVersion":"8.1.0","description":"This package contains simple utility functions to use with [Remix.run](https://remix.run).","directories":{},"sideEffects":false,"_nodeVersion":"16.13.0","dependencies":{"prettier":"^2.4.1","type-fest":"^2.5.2"},"_hasShrinkwrap":false,"devDependencies":{"jest":"^27.3.1","react":"^17.0.2","remix":"^0.20.1","eslint":"^7.26.0","ts-node":"^10.4.0","babel-jest":"^27.3.1","typescript":"^4.2.4","@babel/core":"^7.16.0","@jest/types":"^27.2.5","@types/react":"^17.0.14","@remix-run/dev":"^0.20.1","@remix-run/node":"^0.20.1","jest-fetch-mock":"^3.0.3","@remix-run/react":"^0.20.1","react-router-dom":"^6.0.0-beta.6","@babel/preset-env":"^7.16.0","eslint-plugin-jest":"^24.3.6","@babel/preset-react":"^7.16.0","eslint-plugin-react":"^7.26.1","eslint-plugin-import":"^2.22.1","eslint-plugin-cypress":"^2.11.3","eslint-plugin-promise":"^5.1.0","eslint-plugin-unicorn":"^32.0.1","@testing-library/react":"^12.1.2","eslint-config-prettier":"^8.3.0","eslint-plugin-jest-dom":"^3.9.0","eslint-plugin-jsx-a11y":"^6.4.1","eslint-plugin-prettier":"^3.4.0","@babel/preset-typescript":"^7.16.0","@testing-library/jest-dom":"^5.15.0","@typescript-eslint/parser":"^5.3.0","eslint-plugin-react-hooks":"^4.2.0","@size-limit/preset-small-lib":"^4.10.2","eslint-plugin-testing-library":"^4.3.0","@typescript-eslint/eslint-plugin":"^5.3.0","eslint-import-resolver-typescript":"^2.5.0"},"peerDependencies":{"react":"^17.0.2","remix":"^0.20.1","@remix-run/node":"^0.20.1","@remix-run/react":"^0.20.1"},"_npmOperationalInternal":{"tmp":"tmp/remix-utils_2.0.1_1636477500716_0.24967848730540365","host":"s3://npm-registry-packages"}},"2.1.0":{"name":"remix-utils","version":"2.1.0","keywords":["remix","remix.run","react","utils","request","response","csrf","redirect-back","outlet","client-only","hydrated","body parser"],"author":{"url":"https://sergiodxa.com","name":"Sergio Xalambrí","email":"hello@sergiodxa.com"},"license":"MIT","_id":"remix-utils@2.1.0","maintainers":[{"name":"sergiodxa","email":"sergiodxa@gmail.com"}],"homepage":"https://github.com/sergiodxa/remix-utils#readme","bugs":{"url":"https://github.com/sergiodxa/remix-utils/issues"},"dist":{"shasum":"326d1f7204f97f9d13ed51ad8bfd0322b93a3a20","tarball":"https://registry.npmjs.org/remix-utils/-/remix-utils-2.1.0.tgz","fileCount":66,"integrity":"sha512-oWaUUUHMLPbUKtgwrI8fsHpJFBetCMbXkx1mzSQ0cIxQ+ZUD/eeQJ/BF1Pfmk5aWqOdkuuoio6uZdvnVeAb+PA==","signatures":[{"sig":"MEUCIC3HzLEMv482snzB+tC6OfsZL56goGrcmCFBAq0XJhmBAiEA6Gxj6ImAwGhpqV0ZM6/IWho/wvJlXPWialCUzDAA0Qw=","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":91572,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.13\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJhnJicCRA9TVsSAnZWagAA4x8P/ikUPr2MdwCKKA+Cnerv\n59IYZS14UrvEsTExjoJArpLOmhVgwDJtBe2ue3unxN3gRzvU7UvVBdfb3YpP\nJ5l4yzWoofHrf1vSkb617yG8QfwSBhN5lXmruHEWB139V6v94N6xgPUuM1Iu\n2f+TJAPTs3o/9q2LmnrfSd7bmwPac/h2Du2f1m9yB3l1bIu+k/uQvuduikko\nDfx+s51H8Fl/IGwSD69NjDNwe79B9CDmhK8d+RPqq79Qn6OkJeg5I7tFTnHy\n5W75mF61NbKiyKTZxRMDC5GG/2q+perI4Nz43l0C0h3hUx/qGRBggqKkHwOE\nPOcL6G6oCZx0c8Cy65l3khHKpaPwMr/EkSYD4wzsvOydtYn2RLjXoqmqarFr\nK2kTE/1z/3qdgh216HDVwQT+EifS+N1wdoZI7laCU6daxlAutiYQWlX3uBIE\nv9b3OkYfL+hjRafTKt0chQdGXAO6V/xhEG+D7GFyG7+Xkv6XUyuVQvrICzfF\nKt6oYOOllBfn6zP8My8OjUx38cEGiCpYmqCPuuPjvrnkEDHNJU9+tol1eW8g\n+KeTZ/bhQuLkFNdHYF/Jn1nnymPBRN+ZcHk22SVcLKL1ENnHeGc4dQTbxhdJ\nK6bJbAEODnxmxqgwTpLNWdzujNpp/xZsRRw7HfmvcmBMKyrwVmWKCVDGnyZL\n4hNU\r\n=uILU\r\n-----END PGP SIGNATURE-----\r\n"},"main":"./build/index.js","types":"./build/index.d.ts","browser":"./browser/index.js","engines":{"node":">=16"},"gitHead":"3308a3f4b3d1bdab57c177b4660972d0ff5c7bfa","scripts":{"lint":"eslint --ext .ts,.tsx src/","test":"jest --config=config/jest.config.ts --passWithNoTests","build":"npm run build:browser && npm run build:main","typecheck":"tsc --project tsconfig.json --noEmit","build:main":"tsc --project tsconfig.json --module CommonJS --outDir ./build","build:browser":"tsc --project tsconfig.json --module ESNext --outDir ./browser"},"_npmUser":{"name":"sergiodxa","email":"sergiodxa@gmail.com"},"repository":{"url":"git+https://github.com/sergiodxa/remix-utils.git","type":"git"},"_npmVersion":"8.1.0","description":"This package contains simple utility functions to use with [Remix.run](https://remix.run).","directories":{},"sideEffects":false,"_nodeVersion":"16.13.0","dependencies":{"prettier":"^2.4.1","type-fest":"^2.5.2"},"_hasShrinkwrap":false,"devDependencies":{"jest":"^27.3.1","react":"^17.0.2","eslint":"^7.26.0","ts-node":"^10.4.0","babel-jest":"^27.3.1","typescript":"^4.2.4","@babel/core":"^7.16.0","@jest/types":"^27.2.5","@types/react":"^17.0.14","@remix-run/node":"^1.0.0","jest-fetch-mock":"^3.0.3","@remix-run/react":"^1.0.0","react-router-dom":"^6.0.0-beta.6","@babel/preset-env":"^7.16.0","eslint-plugin-jest":"^24.3.6","@babel/preset-react":"^7.16.0","eslint-plugin-react":"^7.26.1","eslint-plugin-import":"^2.22.1","eslint-plugin-cypress":"^2.11.3","eslint-plugin-promise":"^5.1.0","eslint-plugin-unicorn":"^32.0.1","@testing-library/react":"^12.1.2","eslint-config-prettier":"^8.3.0","eslint-plugin-jest-dom":"^3.9.0","eslint-plugin-jsx-a11y":"^6.4.1","eslint-plugin-prettier":"^3.4.0","@babel/preset-typescript":"^7.16.0","@remix-run/server-runtime":"^1.0.0","@testing-library/jest-dom":"^5.15.0","@typescript-eslint/parser":"^5.3.0","eslint-plugin-react-hooks":"^4.2.0","@size-limit/preset-small-lib":"^4.10.2","eslint-plugin-testing-library":"^4.3.0","@typescript-eslint/eslint-plugin":"^5.3.0","eslint-import-resolver-typescript":"^2.5.0"},"peerDependencies":{"react":"^17.0.2","@remix-run/react":"^1.0.0","@remix-run/server-runtime":"^1.0.0"},"_npmOperationalInternal":{"tmp":"tmp/remix-utils_2.1.0_1637652636620_0.6840147418723228","host":"s3://npm-registry-packages"}},"2.1.1":{"name":"remix-utils","version":"2.1.1","keywords":["remix","remix.run","react","utils","request","response","csrf","redirect-back","outlet","client-only","hydrated","body parser"],"author":{"url":"https://sergiodxa.com","name":"Sergio Xalambrí","email":"hello@sergiodxa.com"},"license":"MIT","_id":"remix-utils@2.1.1","maintainers":[{"name":"sergiodxa","email":"sergiodxa@gmail.com"}],"homepage":"https://github.com/sergiodxa/remix-utils#readme","bugs":{"url":"https://github.com/sergiodxa/remix-utils/issues"},"dist":{"shasum":"c04ce132d6f18ed3218faafea8290bfdb3d914ac","tarball":"https://registry.npmjs.org/remix-utils/-/remix-utils-2.1.1.tgz","fileCount":66,"integrity":"sha512-a7XNWvbnVR0ANEa3V4MjFGrh/VlqsRslO2NLNPP5OvyQ1TgRbcaaY0Z/vYBnakIs6KuKhmHSTcg52c/vxrHStA==","signatures":[{"sig":"MEUCIQDA9WilcTyi8GOTwbbSVihiW4+Ug6PqsPsiFkonSDwURQIgLsLWU5pdNbwqD6RlnSX8s32IgDj5j2r9ed7wdc2f1Do=","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":91545,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.13\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJhnwyNCRA9TVsSAnZWagAAlaAQAJQyA9MdYW9m5cEPxoV+\nyh5Q9yN3KoDx5yFw1jxnXNlTmeYAaFgcn9TXgXlKdBYx5rqORf1pj8Sho45H\nqsPH0RHCRnv34c+d8UviJ4+lum2/XxGREgkcuLlbFEY15q0bXeP0237Nb1DV\nYbtN8svuWJJWMsGwdYrJsPoTCugsUasZ/U3Pen7xKBQRJU2nsRGw00BWPERE\nWzpCOj37Lr3xKElLaYaWDY5YH2ZbqoA1f52u4yGD9W68xZSX6BENS8WocMKH\nEh52gNxRk0vaoLdEEcedlJV2zJFQrns1GqOHjIACZHQrq7ecGa+Mr4AJbgm7\naObCqEjuse+0rTDFXWWuScjsDBl778OdQoMASGZh4+YxnD5SIdFddm2fy0z4\ntJwqWM8Y1z7+8VPFQ3m8AzqUX91KbsZvuV4lpVJmN/AjgtWZ/xl7+fM1jUqE\npUCjeyKpHkGZSBrHIQ7aGTXKfUgk6foGQ3NjBzlA0f/eN5y94zrjltvDGGvO\nrkISx1v2So++K+FnhVzz6XBOIfgzyOkquIn618p5JH/JrStIpGeT22Wc60MD\nhEhtzjioGcpEpxhyN/ICzngIdO1OHKHC4zFgY2Qf+oyrUTWyI3feyTcdfd2N\nYxAXHFCsyK05QiZ42Dz8tQ9C58gkKd7aK6I6kujihpNuoGlG4BOo5EmQ6b6D\nfQMN\r\n=UD/b\r\n-----END PGP SIGNATURE-----\r\n"},"main":"./build/index.js","types":"./build/index.d.ts","browser":"./browser/index.js","engines":{"node":">=14"},"gitHead":"2be83b4eab34bb8dcdb9ab29952ab29ebe0b9a86","scripts":{"lint":"eslint --ext .ts,.tsx src/","test":"jest --config=config/jest.config.ts --passWithNoTests","build":"npm run build:browser && npm run build:main","typecheck":"tsc --project tsconfig.json --noEmit","build:main":"tsc --project tsconfig.json --module CommonJS --outDir ./build","build:browser":"tsc --project tsconfig.json --module ESNext --outDir ./browser"},"_npmUser":{"name":"sergiodxa","email":"sergiodxa@gmail.com"},"repository":{"url":"git+https://github.com/sergiodxa/remix-utils.git","type":"git"},"_npmVersion":"8.1.0","description":"This package contains simple utility functions to use with [Remix.run](https://remix.run).","directories":{},"sideEffects":false,"_nodeVersion":"16.13.0","dependencies":{"prettier":"^2.4.1","type-fest":"^2.5.2"},"_hasShrinkwrap":false,"devDependencies":{"jest":"^27.3.1","react":"^17.0.2","eslint":"^7.26.0","ts-node":"^10.4.0","babel-jest":"^27.3.1","typescript":"^4.2.4","@babel/core":"^7.16.0","@jest/types":"^27.2.5","@types/react":"^17.0.14","@remix-run/node":"^1.0.0","jest-fetch-mock":"^3.0.3","@remix-run/react":"^1.0.0","react-router-dom":"^6.0.0-beta.6","@babel/preset-env":"^7.16.0","eslint-plugin-jest":"^24.3.6","@babel/preset-react":"^7.16.0","eslint-plugin-react":"^7.26.1","eslint-plugin-import":"^2.22.1","eslint-plugin-cypress":"^2.11.3","eslint-plugin-promise":"^5.1.0","eslint-plugin-unicorn":"^32.0.1","@testing-library/react":"^12.1.2","eslint-config-prettier":"^8.3.0","eslint-plugin-jest-dom":"^3.9.0","eslint-plugin-jsx-a11y":"^6.4.1","eslint-plugin-prettier":"^3.4.0","@babel/preset-typescript":"^7.16.0","@remix-run/server-runtime":"^1.0.0","@testing-library/jest-dom":"^5.15.0","@typescript-eslint/parser":"^5.3.0","eslint-plugin-react-hooks":"^4.2.0","@size-limit/preset-small-lib":"^4.10.2","eslint-plugin-testing-library":"^4.3.0","@typescript-eslint/eslint-plugin":"^5.3.0","eslint-import-resolver-typescript":"^2.5.0"},"peerDependencies":{"react":"^17.0.2","@remix-run/react":"^1.0.0","@remix-run/server-runtime":"^1.0.0"},"_npmOperationalInternal":{"tmp":"tmp/remix-utils_2.1.1_1637813389615_0.20770245537916","host":"s3://npm-registry-packages"}},"2.1.2":{"name":"remix-utils","version":"2.1.2","keywords":["remix","remix.run","react","utils","request","response","csrf","redirect-back","outlet","client-only","hydrated","body parser"],"author":{"url":"https://sergiodxa.com","name":"Sergio Xalambrí","email":"hello@sergiodxa.com"},"license":"MIT","_id":"remix-utils@2.1.2","maintainers":[{"name":"sergiodxa","email":"sergiodxa@gmail.com"}],"homepage":"https://github.com/sergiodxa/remix-utils#readme","bugs":{"url":"https://github.com/sergiodxa/remix-utils/issues"},"dist":{"shasum":"200537d6b5bde055012bed0cd01d008148f29841","tarball":"https://registry.npmjs.org/remix-utils/-/remix-utils-2.1.2.tgz","fileCount":66,"integrity":"sha512-ZMDT8YXs9t7/LNN1hpvy5lghMSmsd+WDohsaul4ZROYfJklyWJUgR6BrAvEiBRpz2HskfJ8MPctPPGudy4E2qg==","signatures":[{"sig":"MEUCIEjGt15/XidBOkiUqEWNT/S4UExC9t6NqsXeFU/KHv+kAiEAj8ZpV1IfOXoEoV7/+h+x2nJLu/lpwuifwgn1epXxXwA=","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":91527,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.13\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJhoWoPCRA9TVsSAnZWagAAjKUP/2+gIIojL+7RPrO4bOns\np850ltH5F54mlFDDUxz+EVqzN//EyAo4Hmxz7ajYvZzs9Mnv+ehMUZRG8LfF\n2g6gKR+uydDMci7pTihXCLbNRRRQriSvWIyRdLDRdzaNtgzD7yrFWwJJHHbM\nTs3PyxXizrZeLUDZDlmKQnzcL2dk1NoEW8/6o/SnlnD+IR7f2OpPiwpgBmnr\nIhgMOckV9dlLwV+HmMOrDnaoNPC/NJl/4x74UN10090qMG/jaqjclMTEQPbZ\nQw/Q6gmxps5TX+QKa3+izScYIsaBQadY0fR451FfNTfT5H6viIebvESNTJAk\njRvogAHj3L0qkPtevbnlV+Qw9aixgT/dNGIJu2fD1Rt2rGyI/AdBjWgCpG7e\novdfbrxIESKiK71AMhL6UOXSdv/p9fqwNXVZ69RJZMDhhiripKG2bWrgXiZa\nHRfs2FF/z7Xc2M44OOOeZOoRY3ESWkOOWUaVaXqmC8OMWaLZBuUBoXEsoEGQ\nJ5Hzb+j7BXJyotOkFXPRrxUUY6ew2Ks6M2WayfgKopioU5JSpB7Tjnu5ZtTo\nerLoiBC7IveqBMvQGipm8DLC0jWzvKetWaIOoW79Vt+Xbq9Pj3DW8NQkoP8I\nsEazzfADylmnWJHjdgS5H8wmQHycdaDMNbS09C578QEM+ogii3dWu2Scx0FT\nz5vb\r\n=Ydhk\r\n-----END PGP SIGNATURE-----\r\n"},"main":"./build/index.js","types":"./build/index.d.ts","browser":"./browser/index.js","engines":{"node":">=14"},"gitHead":"5214813937aee45c8cce5fc750f0713d5e6f6707","scripts":{"lint":"eslint --ext .ts,.tsx src/","test":"jest --config=config/jest.config.ts --passWithNoTests","build":"npm run build:browser && npm run build:main","typecheck":"tsc --project tsconfig.json --noEmit","build:main":"tsc --project tsconfig.json --module CommonJS --outDir ./build","build:browser":"tsc --project tsconfig.json --module ESNext --outDir ./browser"},"_npmUser":{"name":"sergiodxa","email":"sergiodxa@gmail.com"},"repository":{"url":"git+https://github.com/sergiodxa/remix-utils.git","type":"git"},"_npmVersion":"8.1.0","description":"This package contains simple utility functions to use with [Remix.run](https://remix.run).","directories":{},"sideEffects":false,"_nodeVersion":"16.13.0","dependencies":{"uuid":"^8.3.2","prettier":"^2.4.1","type-fest":"^2.5.2"},"_hasShrinkwrap":false,"devDependencies":{"jest":"^27.3.1","react":"^17.0.2","eslint":"^7.26.0","ts-node":"^10.4.0","babel-jest":"^27.3.1","typescript":"^4.2.4","@babel/core":"^7.16.0","@jest/types":"^27.2.5","@types/uuid":"^8.3.3","@types/react":"^17.0.14","@remix-run/node":"^1.0.0","jest-fetch-mock":"^3.0.3","@remix-run/react":"^1.0.0","react-router-dom":"^6.0.0-beta.6","@babel/preset-env":"^7.16.0","eslint-plugin-jest":"^24.3.6","@babel/preset-react":"^7.16.0","eslint-plugin-react":"^7.26.1","eslint-plugin-import":"^2.22.1","eslint-plugin-cypress":"^2.11.3","eslint-plugin-promise":"^5.1.0","eslint-plugin-unicorn":"^32.0.1","@testing-library/react":"^12.1.2","eslint-config-prettier":"^8.3.0","eslint-plugin-jest-dom":"^3.9.0","eslint-plugin-jsx-a11y":"^6.4.1","eslint-plugin-prettier":"^3.4.0","@babel/preset-typescript":"^7.16.0","@remix-run/server-runtime":"^1.0.0","@testing-library/jest-dom":"^5.15.0","@typescript-eslint/parser":"^5.3.0","eslint-plugin-react-hooks":"^4.2.0","@size-limit/preset-small-lib":"^4.10.2","eslint-plugin-testing-library":"^4.3.0","@typescript-eslint/eslint-plugin":"^5.3.0","eslint-import-resolver-typescript":"^2.5.0"},"peerDependencies":{"react":"^17.0.2","@remix-run/react":"^1.0.0","@remix-run/server-runtime":"^1.0.0"},"_npmOperationalInternal":{"tmp":"tmp/remix-utils_2.1.2_1637968399291_0.4364108827323683","host":"s3://npm-registry-packages"}},"2.1.3":{"name":"remix-utils","version":"2.1.3","keywords":["remix","remix.run","react","utils","request","response","csrf","redirect-back","outlet","client-only","hydrated","body parser"],"author":{"url":"https://sergiodxa.com","name":"Sergio Xalambrí","email":"hello@sergiodxa.com"},"license":"MIT","_id":"remix-utils@2.1.3","maintainers":[{"name":"sergiodxa","email":"sergiodxa@gmail.com"}],"homepage":"https://github.com/sergiodxa/remix-utils#readme","bugs":{"url":"https://github.com/sergiodxa/remix-utils/issues"},"dist":{"shasum":"8829fe544fc3d14e95a607a3e5d880d4cf41eb11","tarball":"https://registry.npmjs.org/remix-utils/-/remix-utils-2.1.3.tgz","fileCount":66,"integrity":"sha512-2TVkInIRRCXy46zJw5O8Vzas5lWB8/0Q5TM/ZXOur0QOMF13GZ3pYQBNDAOhIWgCxamHIFz2qp+88AlX+qTkug==","signatures":[{"sig":"MEUCIQCg5hrQlHyafN5WUcc6/0mDKayYlv8Xu0BXHHwEzSJimQIgURyssh4TXS3MCDmujqpAR05aYLbygSjNOw7yEd6Vjb8=","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":91381,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.13\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJhoWu0CRA9TVsSAnZWagAAfT8P/1rjOCO0rncHrDlhJndf\niLH6E/huEZaMsbMSovyKxdLsG9jYdv5SgWFMGH0OE0fXBs8sMaDZUu2LUU4+\nAKu8cWJloglGVQrV4HPOD7eMJz1J7vcI9OqFcZ3DwzEAMpSz6HBYS+bvdrAN\n44VBd+R9kCxVtNfVGaAsWsAhzg68lECkpiCLtqvmqM7FibQeQ8cCm575el1y\nm65jraUVQQ9zl8Ew7SWCMwoFdRB55ef4SFwXKiutGGTrhH9QIjOp+4hNh4Bi\nmvZnMnkq8To2WU10KhoQwW+hLsdJjP6ZjOoisHekUVcgm2AM00j/5KDSqH7R\nHOPrTZVpIKQ6UA5SMcpUFJ8MkGWzMt521rh3+lp0v+Li+Nl3I4ToovjmwYX6\nRkzmhKDJDgaTjUdGXfYW1h5tt8bxj9NuGga/ncemJkBH4s0DJ8bnXfA20SXH\nIvMZew8Ixy3fUVzH7ub5W/8M01aPH+N4CKwM8GRWKho1m5MrBxYjN11Ia5p1\nXKXsNQxZ+fRIyHHZooR6DeRpUkfg4YJw3D/JbrkNw2OCKSRCQqEUR9jXARPa\nx458qATnlxEETTrf+OVoqSv233dLVd8YM/m7VCtT3B2Ba31e9cr+Qy0woSWS\nf9W5ewdyoAv8nNWWC3vhtisqHW1mQUabe5VqH715XNA+J8AP7vPAYL3RkGUX\n48hV\r\n=iLXd\r\n-----END PGP SIGNATURE-----\r\n"},"main":"./build/index.js","types":"./build/index.d.ts","browser":"./browser/index.js","engines":{"node":">=14"},"gitHead":"3674696c772308200a15c08f6a156e6c54de3f0a","scripts":{"lint":"eslint --ext .ts,.tsx src/","test":"jest --config=config/jest.config.ts --passWithNoTests","build":"npm run build:browser && npm run build:main","typecheck":"tsc --project tsconfig.json --noEmit","build:main":"tsc --project tsconfig.json --module CommonJS --outDir ./build","build:browser":"tsc --project tsconfig.json --module ESNext --outDir ./browser"},"_npmUser":{"name":"sergiodxa","email":"sergiodxa@gmail.com"},"repository":{"url":"git+https://github.com/sergiodxa/remix-utils.git","type":"git"},"_npmVersion":"8.1.0","description":"This package contains simple utility functions to use with [Remix.run](https://remix.run).","directories":{},"sideEffects":false,"_nodeVersion":"16.13.0","dependencies":{"uuid":"^8.3.2","prettier":"^2.4.1","type-fest":"^2.5.2"},"_hasShrinkwrap":false,"devDependencies":{"jest":"^27.3.1","react":"^17.0.2","eslint":"^7.26.0","ts-node":"^10.4.0","babel-jest":"^27.3.1","typescript":"^4.2.4","@babel/core":"^7.16.0","@jest/types":"^27.2.5","@types/uuid":"^8.3.3","@types/react":"^17.0.14","@remix-run/node":"^1.0.0","jest-fetch-mock":"^3.0.3","@remix-run/react":"^1.0.0","react-router-dom":"^6.0.0-beta.6","@babel/preset-env":"^7.16.0","eslint-plugin-jest":"^24.3.6","@babel/preset-react":"^7.16.0","eslint-plugin-react":"^7.26.1","eslint-plugin-import":"^2.22.1","eslint-plugin-cypress":"^2.11.3","eslint-plugin-promise":"^5.1.0","eslint-plugin-unicorn":"^32.0.1","@testing-library/react":"^12.1.2","eslint-config-prettier":"^8.3.0","eslint-plugin-jest-dom":"^3.9.0","eslint-plugin-jsx-a11y":"^6.4.1","eslint-plugin-prettier":"^3.4.0","@babel/preset-typescript":"^7.16.0","@remix-run/server-runtime":"^1.0.0","@testing-library/jest-dom":"^5.15.0","@typescript-eslint/parser":"^5.3.0","eslint-plugin-react-hooks":"^4.2.0","@size-limit/preset-small-lib":"^4.10.2","eslint-plugin-testing-library":"^4.3.0","@typescript-eslint/eslint-plugin":"^5.3.0","eslint-import-resolver-typescript":"^2.5.0"},"peerDependencies":{"react":"^17.0.2","@remix-run/react":"^1.0.0","@remix-run/server-runtime":"^1.0.0"},"_npmOperationalInternal":{"tmp":"tmp/remix-utils_2.1.3_1637968820509_0.9309718373066442","host":"s3://npm-registry-packages"}},"2.2.0":{"name":"remix-utils","version":"2.2.0","keywords":["remix","remix.run","react","utils","request","response","csrf","redirect-back","outlet","client-only","hydrated","body parser"],"author":{"url":"https://sergiodxa.com","name":"Sergio Xalambrí","email":"hello@sergiodxa.com"},"license":"MIT","_id":"remix-utils@2.2.0","maintainers":[{"name":"sergiodxa","email":"sergiodxa@gmail.com"}],"homepage":"https://github.com/sergiodxa/remix-utils#readme","bugs":{"url":"https://github.com/sergiodxa/remix-utils/issues"},"dist":{"shasum":"36b7d6b7611824d2072ae36aa5d5774c89ff9a6e","tarball":"https://registry.npmjs.org/remix-utils/-/remix-utils-2.2.0.tgz","fileCount":66,"integrity":"sha512-kCsaGsm1s+h86OqROn+twzPcSHwkxQRyCW+wMgv5kRm6j/KlUqdK9U98u+paq676Y9LmcSXUW2clLqBQU5Z2rQ==","signatures":[{"sig":"MEUCIQCnIGDGrTSOVTxjfwEn9RCG9IQ1IwEd0ogcCipU0UGQWQIgMgKMzKlHKgI/V3q/65R/pQYP89e75NNWB2xwrmxfeKg=","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":92133,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.13\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJhvZPtCRA9TVsSAnZWagAAM+IP/idQ/rR9BzhTiPFoVX2J\n9tq0DZweC782yrb4GRh4YZ7t/rks7K6R+uxz7gqCcVoxmM/l+MMDEAgQfxlG\n70mtcL7PNhFsnZf7r7kJ7bA4k2f7cMtU4l5lzkc1GYuqgQnBhs1NR5cWX8uI\nj0xBoXGbSMAViIEZSWoCw4nYI5YM4R9ccLdCqtD62fQIBgDYW+waqCokllb3\nEVuUsE0rUWH6L8x4+BGUd28VivylBeCLhdzh+AsMqBaiF4DYaMw15HPHVlO6\nWBseRS/uzKa4k242358CRXdPg9Vc/FXRxkve/h9VA4g/uh28NiI138i7wOFb\nBq5fVhfw32kY+slFokQ+BLVhPFUja8tRUeD99ZI29YGv6YfoqpPDeDa6gxTj\nGlYhW5eyZGd50LLN6dT5PjfYwpXtFnbXXfRkF/fOnzu1/Em1nBWFBnnglKfB\niHGeZGOOAuSpNe+bjprTSBzUUu7d0HPeOiVfS9jCogHxj6gYTUwbdmHtYoaF\nzrTQaO2/GovW1hPjguQ3xyiG/20ud2SMHdBDwgwySDN6JKpK/CZtomzG13Yb\nHsFoqrExrA1rmhcNSw8vnnFvlKdEsxp55a1aKx93XVtksibX3KZX4LR05nh3\n2WOcyYxMKsLqCEVrPPZZYtEvkO4/uay7LIC7M/ThYKTGbwcz+6qERQKjyCuq\nYCgg\r\n=sNBB\r\n-----END PGP SIGNATURE-----\r\n"},"main":"./build/index.js","types":"./build/index.d.ts","browser":"./browser/index.js","engines":{"node":">=14"},"gitHead":"c1bda01749acf9c86b76faca179c5b03da225042","scripts":{"lint":"eslint --ext .ts,.tsx src/","test":"jest --config=config/jest.config.ts --passWithNoTests","build":"npm run build:browser && npm run build:main","typecheck":"tsc --project tsconfig.json --noEmit","build:main":"tsc --project tsconfig.json --module CommonJS --outDir ./build","build:browser":"tsc --project tsconfig.json --module ESNext --outDir ./browser"},"_npmUser":{"name":"sergiodxa","email":"sergiodxa@gmail.com"},"repository":{"url":"git+https://github.com/sergiodxa/remix-utils.git","type":"git"},"_npmVersion":"8.1.2","description":"This package contains simple utility functions to use with [Remix.run](https://remix.run).","directories":{},"sideEffects":false,"_nodeVersion":"16.13.1","dependencies":{"uuid":"^8.3.2","type-fest":"^2.5.2"},"_hasShrinkwrap":false,"devDependencies":{"jest":"^27.3.1","react":"^17.0.2","eslint":"^7.26.0","ts-node":"^10.4.0","prettier":"^2.5.1","babel-jest":"^27.3.1","typescript":"^4.2.4","@babel/core":"^7.16.0","@jest/types":"^27.2.5","@types/uuid":"^8.3.3","@types/react":"^17.0.14","@remix-run/node":"^1.1.1","jest-fetch-mock":"^3.0.3","@remix-run/react":"^1.1.1","react-router-dom":"^6.0.0-beta.6","@babel/preset-env":"^7.16.0","eslint-plugin-jest":"^24.3.6","@babel/preset-react":"^7.16.0","eslint-plugin-react":"^7.26.1","eslint-plugin-import":"^2.22.1","eslint-plugin-cypress":"^2.11.3","eslint-plugin-promise":"^5.1.0","eslint-plugin-unicorn":"^32.0.1","@testing-library/react":"^12.1.2","eslint-config-prettier":"^8.3.0","eslint-plugin-jest-dom":"^3.9.0","eslint-plugin-jsx-a11y":"^6.4.1","eslint-plugin-prettier":"^3.4.0","@babel/preset-typescript":"^7.16.0","@remix-run/server-runtime":"^1.1.1","@testing-library/jest-dom":"^5.15.0","@typescript-eslint/parser":"^5.3.0","eslint-plugin-react-hooks":"^4.2.0","@size-limit/preset-small-lib":"^4.10.2","eslint-plugin-testing-library":"^4.3.0","@typescript-eslint/eslint-plugin":"^5.3.0","eslint-import-resolver-typescript":"^2.5.0"},"peerDependencies":{"react":"^17.0.2","@remix-run/react":"^1.1.1","@remix-run/server-runtime":"^1.1.1"},"_npmOperationalInternal":{"tmp":"tmp/remix-utils_2.2.0_1639814125493_0.12116134486634889","host":"s3://npm-registry-packages"}},"2.3.0":{"name":"remix-utils","version":"2.3.0","keywords":["remix","remix.run","react","utils","request","response","csrf","redirect-back","outlet","client-only","hydrated","body parser"],"author":{"url":"https://sergiodxa.com","name":"Sergio Xalambrí","email":"hello@sergiodxa.com"},"license":"MIT","_id":"remix-utils@2.3.0","maintainers":[{"name":"sergiodxa","email":"sergiodxa@gmail.com"}],"homepage":"https://github.com/sergiodxa/remix-utils#readme","bugs":{"url":"https://github.com/sergiodxa/remix-utils/issues"},"dist":{"shasum":"4979b162b4df06bc2d505eadb7b5ee66bb15fac3","tarball":"https://registry.npmjs.org/remix-utils/-/remix-utils-2.3.0.tgz","fileCount":74,"integrity":"sha512-78oWG5/r78KXKsyM6Q0Ckx0ux4KK7egXdOr0e/mS4Dw+OWL3d6he4xfaCvdk8vi2MHtOguIOgcSUGsumUUN8Hg==","signatures":[{"sig":"MEUCIQDI7K5iH0hHs80dxWVM5ovvHFPdubamwFisSubq7xGddQIgASUuMg/OP6ZSafyxX3bEpZhvKQBfKCY0cTYdYsHw6is=","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":101206,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.13\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJhw7OjCRA9TVsSAnZWagAAxfUQAIO5gfoa4xdrPjNrIC4K\nMhWBmOxb9xW7LU69a/BLLntDoFRCI9LVq102ABL9o65bT5i3VqbIB93yESTI\n0ti6VS26ohBScYgtmAXkTKp9Autbf7wv8YGre8ovNHIAZSJLkF96UTIsUOnQ\neum2xKJXG6LewUT+Q1AIqahD9Hc6/MnulEs6pwwt7/9bfcMn0Mio8Kx+osy8\n4ivbKkP00F96LrR39GAAbJl4RhYgP8Svazk3zJESP1DqDzU/SuEIWcq3BQQn\nv5w1VMA6TcJGDhvCxuu5rwQOnzYMwIK2ktGqb0afRUjavbQYYle4Aj2/Zn+2\nU14RAqgqBdnVvX3I3lLsqC22UIszO0MSpn3X8V8dw1q7AS0QF681VG3OXC/v\nrxvf2oKs96hS68bVJRYUSdYCTVGSBzZP5OndYzhrq7yu2B/8DR3dJ618rWfy\nRKzUjekVbYBChcEG8rHih6Uj1QZZk0qNAbeh9SZdc9s68ruYBQ8xGCZGZuzI\n6rQMRWMiU/35Y7rMuVzjwgDN1XF9j5QrhfiDY7MwCD/aIxZuBNlUALSTGy6n\nuOqxlOl/UuxDexQOtIce2BqGZY/rJPVTlvNJI5g6tylAScwq9WCqWHbphvmX\nWkp4AGDRunMCCFLpOt3B85BqHy6U9xr+dKWF2W/lOcw2sVDW1+Q/RcfqxrNW\nv2Fj\r\n=yrSb\r\n-----END PGP SIGNATURE-----\r\n"},"main":"./build/index.js","types":"./build/index.d.ts","browser":"./browser/index.js","engines":{"node":">=14"},"gitHead":"c426883775236fbc5bc21996cdd0d9afd9260857","scripts":{"lint":"eslint --ext .ts,.tsx src/","test":"jest --config=config/jest.config.ts --passWithNoTests","build":"npm run build:browser && npm run build:main","typecheck":"tsc --project tsconfig.json --noEmit","build:main":"tsc --project tsconfig.json --module CommonJS --outDir ./build","build:browser":"tsc --project tsconfig.json --module ESNext --outDir ./browser"},"_npmUser":{"name":"sergiodxa","email":"sergiodxa@gmail.com"},"repository":{"url":"git+https://github.com/sergiodxa/remix-utils.git","type":"git"},"_npmVersion":"8.1.2","description":"This package contains simple utility functions to use with [Remix.run](https://remix.run).","directories":{},"sideEffects":false,"_nodeVersion":"16.13.1","dependencies":{"uuid":"^8.3.2","type-fest":"^2.5.2"},"_hasShrinkwrap":false,"devDependencies":{"jest":"^27.3.1","react":"^17.0.2","eslint":"^7.26.0","ts-node":"^10.4.0","prettier":"^2.5.1","babel-jest":"^27.3.1","typescript":"^4.2.4","@babel/core":"^7.16.0","@jest/types":"^27.2.5","@types/uuid":"^8.3.3","@types/react":"^17.0.14","@remix-run/node":"^1.1.1","jest-fetch-mock":"^3.0.3","@remix-run/react":"^1.1.1","react-router-dom":"^6.0.0-beta.6","@babel/preset-env":"^7.16.0","eslint-plugin-jest":"^24.3.6","@babel/preset-react":"^7.16.0","eslint-plugin-react":"^7.26.1","eslint-plugin-import":"^2.22.1","eslint-plugin-cypress":"^2.11.3","eslint-plugin-promise":"^5.1.0","eslint-plugin-unicorn":"^32.0.1","@testing-library/react":"^12.1.2","eslint-config-prettier":"^8.3.0","eslint-plugin-jest-dom":"^3.9.0","eslint-plugin-jsx-a11y":"^6.4.1","eslint-plugin-prettier":"^3.4.0","@babel/preset-typescript":"^7.16.0","@remix-run/server-runtime":"^1.1.1","@testing-library/jest-dom":"^5.15.0","@typescript-eslint/parser":"^5.3.0","eslint-plugin-react-hooks":"^4.2.0","@size-limit/preset-small-lib":"^4.10.2","eslint-plugin-testing-library":"^4.3.0","@typescript-eslint/eslint-plugin":"^5.3.0","eslint-import-resolver-typescript":"^2.5.0"},"peerDependencies":{"react":"^17.0.2","@remix-run/react":"^1.1.1","@remix-run/server-runtime":"^1.1.1"},"_npmOperationalInternal":{"tmp":"tmp/remix-utils_2.3.0_1640215458946_0.39951239708663455","host":"s3://npm-registry-packages"}},"2.4.0":{"name":"remix-utils","version":"2.4.0","keywords":["remix","remix.run","react","utils","request","response","csrf","redirect-back","outlet","client-only","hydrated","body parser"],"author":{"url":"https://sergiodxa.com","name":"Sergio Xalambrí","email":"hello@sergiodxa.com"},"license":"MIT","_id":"remix-utils@2.4.0","maintainers":[{"name":"sergiodxa","email":"sergiodxa@gmail.com"}],"homepage":"https://github.com/sergiodxa/remix-utils#readme","bugs":{"url":"https://github.com/sergiodxa/remix-utils/issues"},"dist":{"shasum":"a614508369a00fd77a0633fd636d76c1526ea58e","tarball":"https://registry.npmjs.org/remix-utils/-/remix-utils-2.4.0.tgz","fileCount":78,"integrity":"sha512-qwzlPwjvRHIrPULnl7AFZAbjku6sihid2412QLMc8bPC6mm1XpUKnJtebW30WtO6wgwQu2CAwhIFQ2HsBQLXTw==","signatures":[{"sig":"MEUCIQCSTyMcgHbY9lqWj81x853S71wEOPlcrtbe9vXwIPqRfAIgRwcBVXjY1jplWhFbFxO/G8+CO3hWf8MUHoM3w7YuWis=","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":105167,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.13\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJhzR52CRA9TVsSAnZWagAAa6MP/2Iun4KIVfhcJEPUMuBg\nCofELzb0hcaOMvdfZyS0KQCdJZvy8fUVQr3PHOzz6tMY/w0Wu9dSisiMIj0r\nfMMznrE+rw4ufmJjgv0y5MOSbuv78naBKvXBxHhmNqgWOc+wv+jWjDWwp3GO\nLgsbBupA//dimQgMGf5g4qFMEsh0EpWAZ5RQbJ4KDtCBZAORWGn75kCmaY2J\niDejuxXfhB+67yPylpHVMWxQ1iEnEuDTvk7R3M3sGG+GXw8gTLnw3hf/G1g1\nS6Ny7v/JXdz+/cmU/PvScQ+xWQC7to79GZRbIIFoxLAJ0wS44/nS0750oqOM\nZ9XvTBFPO4so8hMiQH2A3kPoDIfcLnagS7UFQn9jQx5mWYPaog0q0rnLPfEQ\neEfBq0JH7P81xxI/aOHRa5X3RHvpmeTRkExwP1CvTJHCjvae7+YF+/N2lz8y\nuN0rPvsi/aXwKKca4Vi/4NRLPQes02nRu93yutfa2fUMnF8OUAusEQkI9bep\nN6bXjXqpislp0TeH76preqFq/xgqQgi5RzRj9JNp62SE/uSGVKFyqLGfw6He\n5AoKghwu67Y0z8ym1ZoXobN21iP46MsAZWf2EZtmmyMT2tc9OC3ZKM+cD/+v\nb7XA5AwnQ4YU877yxuVy88De43XQzqk4fqHYdugUyQhcxuh4sBOCgjD+t48N\n7KPx\r\n=Kyth\r\n-----END PGP SIGNATURE-----\r\n"},"main":"./build/index.js","types":"./build/index.d.ts","browser":"./browser/index.js","engines":{"node":">=14"},"gitHead":"f9a444fb94548e1bfdfadca65e7a2099676443ca","scripts":{"lint":"eslint --ext .ts,.tsx src/","test":"jest --config=config/jest.config.ts --passWithNoTests","build":"npm run build:browser && npm run build:main","typecheck":"tsc --project tsconfig.json --noEmit","build:main":"tsc --project tsconfig.json --module CommonJS --outDir ./build","build:browser":"tsc --project tsconfig.json --module ESNext --outDir ./browser"},"_npmUser":{"name":"sergiodxa","email":"sergiodxa@gmail.com"},"repository":{"url":"git+https://github.com/sergiodxa/remix-utils.git","type":"git"},"_npmVersion":"8.1.2","description":"This package contains simple utility functions to use with [Remix.run](https://remix.run).","directories":{},"sideEffects":false,"_nodeVersion":"16.13.1","dependencies":{"uuid":"^8.3.2","type-fest":"^2.5.2"},"_hasShrinkwrap":false,"devDependencies":{"jest":"^27.3.1","react":"^17.0.2","eslint":"^7.26.0","ts-node":"^10.4.0","prettier":"^2.5.1","babel-jest":"^27.3.1","typescript":"^4.2.4","@babel/core":"^7.16.0","@jest/types":"^27.2.5","@types/uuid":"^8.3.3","@types/react":"^17.0.14","@remix-run/node":"^1.1.1","jest-fetch-mock":"^3.0.3","@remix-run/react":"^1.1.1","react-router-dom":"^6.0.0-beta.6","@babel/preset-env":"^7.16.0","eslint-plugin-jest":"^24.3.6","@babel/preset-react":"^7.16.0","eslint-plugin-react":"^7.26.1","eslint-plugin-import":"^2.22.1","eslint-plugin-cypress":"^2.11.3","eslint-plugin-promise":"^5.1.0","eslint-plugin-unicorn":"^32.0.1","@testing-library/react":"^12.1.2","eslint-config-prettier":"^8.3.0","eslint-plugin-jest-dom":"^3.9.0","eslint-plugin-jsx-a11y":"^6.4.1","eslint-plugin-prettier":"^3.4.0","@babel/preset-typescript":"^7.16.0","@remix-run/server-runtime":"^1.1.1","@testing-library/jest-dom":"^5.15.0","@typescript-eslint/parser":"^5.3.0","eslint-plugin-react-hooks":"^4.2.0","@size-limit/preset-small-lib":"^4.10.2","eslint-plugin-testing-library":"^4.3.0","@typescript-eslint/eslint-plugin":"^5.3.0","eslint-import-resolver-typescript":"^2.5.0"},"peerDependencies":{"react":"^17.0.2","@remix-run/react":"^1.1.1","@remix-run/server-runtime":"^1.1.1"},"_npmOperationalInternal":{"tmp":"tmp/remix-utils_2.4.0_1640832630280_0.06933406576338785","host":"s3://npm-registry-packages"}},"2.5.0":{"name":"remix-utils","version":"2.5.0","keywords":["remix","remix.run","react","utils","request","response","csrf","redirect-back","outlet","client-only","hydrated","body parser"],"author":{"url":"https://sergiodxa.com","name":"Sergio Xalambrí","email":"hello@sergiodxa.com"},"license":"MIT","_id":"remix-utils@2.5.0","maintainers":[{"name":"sergiodxa","email":"sergiodxa@gmail.com"}],"homepage":"https://github.com/sergiodxa/remix-utils#readme","bugs":{"url":"https://github.com/sergiodxa/remix-utils/issues"},"dist":{"shasum":"3a22c2650d091ba563686061188e92c4f6676dd9","tarball":"https://registry.npmjs.org/remix-utils/-/remix-utils-2.5.0.tgz","fileCount":78,"integrity":"sha512-zEVjJRWzCjG4il5W3zV9OFOVigaCcUCDzQtmxMOGbfoBKRtvP0D4X10wDuZ5+rTLw2zBOBEIJ1ySAtcWpxbDVA==","signatures":[{"sig":"MEYCIQCWh/cXT4sme4O6kZhIpy33VZW1OzgnUdRnH9q7h9mO/wIhANeYuO08P6YZ8RA0j6lMFqZhC9WX0Ry7kx4aauBgfYsJ","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":116676,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.13\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJh/0rKCRA9TVsSAnZWagAATvoP/0g80RbHt7s6nz4iOWUy\nUAFLxg8gvpkt5d1fE3IdG6CvxMMXVlw341AX8t0QaW6Rkc5mJgJt/EIhtKGq\ng/5MV5k3LpTg74rqgaQ1E9POQwxbDSsmqkH+8Q2KklaIB4kUacQ3i3Ajm4jG\n56hR62sJhPpHO5ycWOi0f0Rtw+/spQY04gwU+SjmiTx1NkLHTGK42YRtI70Z\nRePKdtdbCuKiAxGgo+0w5eyhntI2Ox9UylhIaqVcsVtdPHooALvHr6GnjQOP\nQERrK5k3wEx/ZuslQrblPoY3sZ00rv5rqDf59LqE0+eK1HIodlDrpS4Xyo8c\nQACsLhP3wkjeo+U0mMKJ/JOu9yM0c1X+SYdCmhi/cGDVSnS0i2UVmRNv3+hY\nPDejxp4cP36NtatNjJEVon+HPlOUnhnmqeJN7fITf2+Qsi2bPkqutqIzsgeN\nn00a1+E510tdTUXFcrACbgqZrDzFgz3MIQMSs7ZVljW9en2di9CAkXGhVERE\nwX17ymD/A1D7C/paRtWOqNNbS7UN8NffAOEauiVm6p/Kznw5kmPnq8VTDRze\noFP+DcPE/grvsRbRDBI+P6j7/8ibU9lPj6zYHMzKa4u/C4IQ9y6QKq6kxycT\njOKX7g1vq4u8ieblzcIYySi7al+51Jo6CzjbsRyFgA+g96ELy/PdwzNLJOW8\nOFYP\r\n=Hsdr\r\n-----END PGP SIGNATURE-----\r\n"},"main":"./build/index.js","types":"./build/index.d.ts","browser":"./browser/index.js","engines":{"node":">=14"},"gitHead":"1463f74de7ed3e4087314f0fef9771916c0c7c81","scripts":{"lint":"eslint --ext .ts,.tsx src/","test":"jest --config=config/jest.config.ts --passWithNoTests","build":"npm run build:browser && npm run build:main","typecheck":"tsc --project tsconfig.json --noEmit","build:main":"tsc --project tsconfig.json --module CommonJS --outDir ./build","build:browser":"tsc --project tsconfig.json --module ESNext --outDir ./browser"},"_npmUser":{"name":"sergiodxa","email":"sergiodxa@gmail.com"},"repository":{"url":"git+https://github.com/sergiodxa/remix-utils.git","type":"git"},"_npmVersion":"8.1.2","description":"This package contains simple utility functions to use with [Remix.run](https://remix.run).","directories":{},"sideEffects":false,"_nodeVersion":"16.13.2","dependencies":{"uuid":"^8.3.2","type-fest":"^2.5.2"},"_hasShrinkwrap":false,"devDependencies":{"jest":"^27.3.1","react":"^17.0.2","eslint":"^7.26.0","ts-node":"^10.4.0","prettier":"^2.5.1","babel-jest":"^27.3.1","typescript":"^4.2.4","@babel/core":"^7.16.0","@jest/types":"^27.2.5","@types/uuid":"^8.3.3","@types/react":"^17.0.14","@remix-run/node":"^1.1.1","jest-fetch-mock":"^3.0.3","@remix-run/react":"^1.1.1","react-router-dom":"^6.0.0-beta.6","@babel/preset-env":"^7.16.0","eslint-plugin-jest":"^24.3.6","@babel/preset-react":"^7.16.0","eslint-plugin-react":"^7.26.1","eslint-plugin-import":"^2.22.1","eslint-plugin-cypress":"^2.11.3","eslint-plugin-promise":"^5.1.0","eslint-plugin-unicorn":"^32.0.1","@testing-library/react":"^12.1.2","eslint-config-prettier":"^8.3.0","eslint-plugin-jest-dom":"^3.9.0","eslint-plugin-jsx-a11y":"^6.4.1","eslint-plugin-prettier":"^3.4.0","@babel/preset-typescript":"^7.16.0","@remix-run/server-runtime":"^1.1.1","@testing-library/jest-dom":"^5.15.0","@typescript-eslint/parser":"^5.3.0","eslint-plugin-react-hooks":"^4.2.0","@size-limit/preset-small-lib":"^4.10.2","eslint-plugin-testing-library":"^4.3.0","@typescript-eslint/eslint-plugin":"^5.3.0","eslint-import-resolver-typescript":"^2.5.0"},"peerDependencies":{"react":"^17.0.2","@remix-run/react":"^1.1.1","@remix-run/server-runtime":"^1.1.1"},"_npmOperationalInternal":{"tmp":"tmp/remix-utils_2.5.0_1644120778686_0.8914681131972806","host":"s3://npm-registry-packages"}},"2.6.0":{"name":"remix-utils","version":"2.6.0","keywords":["remix","remix.run","react","utils","request","response","csrf","redirect-back","outlet","client-only","hydrated","body parser"],"author":{"url":"https://sergiodxa.com","name":"Sergio Xalambrí","email":"hello@sergiodxa.com"},"license":"MIT","_id":"remix-utils@2.6.0","maintainers":[{"name":"sergiodxa","email":"sergiodxa@gmail.com"}],"homepage":"https://github.com/sergiodxa/remix-utils#readme","bugs":{"url":"https://github.com/sergiodxa/remix-utils/issues"},"dist":{"shasum":"8d31959e5cfd9b0182bccefeafd62f541496bf44","tarball":"https://registry.npmjs.org/remix-utils/-/remix-utils-2.6.0.tgz","fileCount":82,"integrity":"sha512-5db+CodSyxRc5Ns14bO5jU8U970bn0eXRw9MZUqDkfDZXZOGKaCVpYAND/OOc1YHlmDzSF5Fymq7tR5EX0bObQ==","signatures":[{"sig":"MEYCIQCybEphnBgdBTxlBeSdoOuXR5oQpLWpN7TOTuh7RGwwZgIhANJJW5hpfT6I5/kyyY4Vo9TckdMfh/lpz1LKExMm6PaV","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":123720,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJiIRTDACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2Vmoepg/6AnyrsB2jgMoeH2pGxYPEBVflOiCdUnmmBL1o1K2J3gsJDJQu\r\nDpeK/EKNS9NlOElkDCLxkl6gN3TcSFPKcD/Uy3TAIYnNyC9uxfucuIprfoAj\r\nyu0Hh+lZKnT54XodO8nn18M2ymKK+JmrCZ2SaKrEfs9XVXlMtIHH/lNXqa4X\r\nrhmb56BrKkkAdSHN9du48Gco7tZcUfdOCtO9LZsZ/0VT7kv144xaSp+DhBnH\r\nbUxMjPV/FiC8S5aywqkQRf/AgbVpi03S25plkd+8sZvPb9cqzUsMoaOSQEhw\r\nBVxsdcuvL/BQX6JZbUN2Ue/c0BuUexAV9WA8vz6xdRyLnUHwLT2dMmFc1yNJ\r\ndZwc/j4u+2BcFV36kvRCo+PmoQSZFwX886mZ/fXGqpch8oLrJC7sI3BlbG/n\r\nFyQjCH878ScKtzkVgeu9WtAPszQB+geX0t+VbSCgnuhxW/ujbPjeYl5dqtgS\r\naluZaf1jQbTkID+4TGQ+n/IIaEaYNlaVWrpzdvXPhf9WOiQc7P9IgqH2bnrv\r\nnR7tRzmMDR/xeLv4luBmhAxwpGG3BZ+bQM6xvA2PeF/SnlZsZqTrrMcx+CeP\r\nQo0cZKsa+EXr7h0oStSlYXq178knDuzw4VHmMPQ876fvuzOcm34G7XRRnrtO\r\n/Dhnc30UpMY3whC0MKUTZsoZlTvUuPLL1kk=\r\n=4MIn\r\n-----END PGP SIGNATURE-----\r\n"},"main":"./build/index.js","types":"./build/index.d.ts","browser":"./browser/index.js","engines":{"node":">=14"},"gitHead":"a8aa36bbc3c97701ff858d69cb0c106d6bf766da","scripts":{"lint":"eslint --ext .ts,.tsx src/","test":"jest --config=config/jest.config.ts --passWithNoTests","build":"npm run build:browser && npm run build:main","typecheck":"tsc --project tsconfig.json --noEmit","build:main":"tsc --project tsconfig.json --module CommonJS --outDir ./build","build:browser":"tsc --project tsconfig.json --module ESNext --outDir ./browser"},"_npmUser":{"name":"sergiodxa","email":"sergiodxa@gmail.com"},"repository":{"url":"git+https://github.com/sergiodxa/remix-utils.git","type":"git"},"_npmVersion":"8.3.1","description":"This package contains simple utility functions to use with [Remix.run](https://remix.run).","directories":{},"sideEffects":false,"_nodeVersion":"16.14.0","dependencies":{"uuid":"^8.3.2","is-ip":"^3.1.0","type-fest":"^2.5.2"},"_hasShrinkwrap":false,"devDependencies":{"jest":"^27.3.1","react":"^17.0.2","eslint":"^7.26.0","ts-node":"^10.4.0","prettier":"^2.5.1","babel-jest":"^27.3.1","typescript":"^4.2.4","@babel/core":"^7.16.0","@jest/types":"^27.2.5","@types/uuid":"^8.3.3","@types/react":"^17.0.14","@remix-run/node":"^1.1.1","jest-fetch-mock":"^3.0.3","@remix-run/react":"^1.1.1","react-router-dom":"^6.0.0-beta.6","@babel/preset-env":"^7.16.0","eslint-plugin-jest":"^24.3.6","@babel/preset-react":"^7.16.0","eslint-plugin-react":"^7.26.1","eslint-plugin-import":"^2.22.1","eslint-plugin-cypress":"^2.11.3","eslint-plugin-promise":"^5.1.0","eslint-plugin-unicorn":"^32.0.1","@testing-library/react":"^12.1.2","eslint-config-prettier":"^8.3.0","eslint-plugin-jest-dom":"^3.9.0","eslint-plugin-jsx-a11y":"^6.4.1","eslint-plugin-prettier":"^3.4.0","@babel/preset-typescript":"^7.16.0","@remix-run/server-runtime":"^1.1.1","@testing-library/jest-dom":"^5.15.0","@typescript-eslint/parser":"^5.3.0","eslint-plugin-react-hooks":"^4.2.0","@size-limit/preset-small-lib":"^4.10.2","eslint-plugin-testing-library":"^4.3.0","@typescript-eslint/eslint-plugin":"^5.3.0","eslint-import-resolver-typescript":"^2.5.0"},"peerDependencies":{"react":"^17.0.2","@remix-run/react":"^1.1.1","@remix-run/server-runtime":"^1.1.1"},"_npmOperationalInternal":{"tmp":"tmp/remix-utils_2.6.0_1646335171567_0.9400259293637148","host":"s3://npm-registry-packages"}},"2.7.0":{"name":"remix-utils","version":"2.7.0","keywords":["remix","remix.run","react","utils","request","response","csrf","redirect-back","outlet","client-only","hydrated","body parser"],"author":{"url":"https://sergiodxa.com","name":"Sergio Xalambrí","email":"hello@sergiodxa.com"},"license":"MIT","_id":"remix-utils@2.7.0","maintainers":[{"name":"sergiodxa","email":"sergiodxa@gmail.com"}],"homepage":"https://github.com/sergiodxa/remix-utils#readme","bugs":{"url":"https://github.com/sergiodxa/remix-utils/issues"},"dist":{"shasum":"4d5e598a0b04c108a1dc68840014d66ac3c00ef2","tarball":"https://registry.npmjs.org/remix-utils/-/remix-utils-2.7.0.tgz","fileCount":82,"integrity":"sha512-d6tjqK6EDeg08iJyXDsszXOMnSeY/RGeTCvZjVYnvDvU9DlzTsi/gDuFI0zBX5LWpXUKvGOqQq030SsOLTm/ZQ==","signatures":[{"sig":"MEQCIFzqFS/ArgV2LmZ6neE38cUPd9MrP86QXJDDT+bWSzs3AiBqwm6O42nzKrFeS7cLTtJyV94FPTKkZVrpdUnCSiDB1Q==","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":123816,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJiIR5zACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2VmpFGw//amj4OViIqBIk4x+nhSe1GkhxwmqFA8cIOukBMYVfY3YvHySd\r\nZa9DK5aaND732LZr3df06IfSQxO6pAY/2c6yi0ZYhZaiKerdhcDXFXygogcT\r\nVSY0xqURlJUxx+6zWxYNlHVBjKEHwgPdVZNqYrKYiGXXyrRImDgmtAR5io1a\r\noYFuHTSMkKZymDkSBjHvdwO33O2G8TiGBYF9qL8ac9vm8Z+CdYpepoElu+Zj\r\nqe5BHopDOxXohA6azRp42uyW2q+/QOuHQl60YWAjxkc2+Y6OrcdlveS+JhSN\r\nAEg/XBL7X1bB6/YqSuC7L3ug7N15TxLxweXofE+2SyGOUCuQLZoSXDXcfINo\r\nNPAVvYTrNSSqtVR1MAKUHYqLu9DS35z/yeENex7F8vrol4g1jMgm2ocfq6cf\r\nb411irl0CrOlKoV8Q++ljLhqGM7Jt7GZeMO7WecQwt7S09m1zGWpm5fLpYET\r\nle9UD8VnWh6tjIpvhcknJjbYKgNUsV20XiNNVX8QbKZws2cQF6IxbSjNCgTk\r\nNQO4+L2MNHx8/u4VQyuO/PfQr6AEaYtQ+r9mQgP5X3KHkHEdiloZA8iaNvPd\r\nTsEhZ/+MbE7vCJPp3dd2xyAiyuBlIYIBuIgg45AIyT2FPp/GVYKPbbuxEibj\r\nU2HEkFhJGbV5Ws4M1T1iZ4LapiReM4P1GIY=\r\n=nkDZ\r\n-----END PGP SIGNATURE-----\r\n"},"main":"./build/index.js","types":"./build/index.d.ts","browser":"./browser/index.js","engines":{"node":">=14"},"gitHead":"28303f57ffbffc66cc3edb91ae86e1143b435765","scripts":{"lint":"eslint --ext .ts,.tsx src/","test":"jest --config=config/jest.config.ts --passWithNoTests","build":"npm run build:browser && npm run build:main","typecheck":"tsc --project tsconfig.json --noEmit","build:main":"tsc --project tsconfig.json --module CommonJS --outDir ./build","build:browser":"tsc --project tsconfig.json --module ESNext --outDir ./browser"},"_npmUser":{"name":"sergiodxa","email":"sergiodxa@gmail.com"},"repository":{"url":"git+https://github.com/sergiodxa/remix-utils.git","type":"git"},"_npmVersion":"8.3.1","description":"This package contains simple utility functions to use with [Remix.run](https://remix.run).","directories":{},"sideEffects":false,"_nodeVersion":"16.14.0","dependencies":{"uuid":"^8.3.2","is-ip":"^3.1.0","type-fest":"^2.5.2"},"_hasShrinkwrap":false,"devDependencies":{"jest":"^27.3.1","react":"^17.0.2","eslint":"^7.26.0","ts-node":"^10.4.0","prettier":"^2.5.1","babel-jest":"^27.3.1","typescript":"^4.2.4","@babel/core":"^7.16.0","@jest/types":"^27.2.5","@types/uuid":"^8.3.3","@types/react":"^17.0.14","@remix-run/node":"^1.1.1","jest-fetch-mock":"^3.0.3","@remix-run/react":"^1.1.1","react-router-dom":"^6.0.0-beta.6","@babel/preset-env":"^7.16.0","eslint-plugin-jest":"^24.3.6","@babel/preset-react":"^7.16.0","eslint-plugin-react":"^7.26.1","eslint-plugin-import":"^2.22.1","eslint-plugin-cypress":"^2.11.3","eslint-plugin-promise":"^5.1.0","eslint-plugin-unicorn":"^32.0.1","@testing-library/react":"^12.1.2","eslint-config-prettier":"^8.3.0","eslint-plugin-jest-dom":"^3.9.0","eslint-plugin-jsx-a11y":"^6.4.1","eslint-plugin-prettier":"^3.4.0","@babel/preset-typescript":"^7.16.0","@remix-run/server-runtime":"^1.1.1","@testing-library/jest-dom":"^5.15.0","@typescript-eslint/parser":"^5.3.0","eslint-plugin-react-hooks":"^4.2.0","@size-limit/preset-small-lib":"^4.10.2","eslint-plugin-testing-library":"^4.3.0","@typescript-eslint/eslint-plugin":"^5.3.0","eslint-import-resolver-typescript":"^2.5.0"},"peerDependencies":{"react":"^17.0.2","@remix-run/react":"^1.1.1","@remix-run/server-runtime":"^1.1.1"},"_npmOperationalInternal":{"tmp":"tmp/remix-utils_2.7.0_1646337651157_0.5591076280844669","host":"s3://npm-registry-packages"}},"2.8.0":{"name":"remix-utils","version":"2.8.0","keywords":["remix","remix.run","react","utils","request","response","csrf","redirect-back","outlet","client-only","hydrated","body parser"],"author":{"url":"https://sergiodxa.com","name":"Sergio Xalambrí","email":"hello@sergiodxa.com"},"license":"MIT","_id":"remix-utils@2.8.0","maintainers":[{"name":"sergiodxa","email":"sergiodxa@gmail.com"}],"homepage":"https://github.com/sergiodxa/remix-utils#readme","bugs":{"url":"https://github.com/sergiodxa/remix-utils/issues"},"dist":{"shasum":"b07dc80d4c719bf0e226c24b7addc9fedbbc4ede","tarball":"https://registry.npmjs.org/remix-utils/-/remix-utils-2.8.0.tgz","fileCount":86,"integrity":"sha512-XV1hM/6rq0qRL6pwBG8rUeibtBzGHLf4pdp2dgfh7tirTFGYKxqvIueXEseuaKv+4BeHaNcWOMMDc95sOwVqKg==","signatures":[{"sig":"MEUCIDTV4Uj1EOHehxiWeO0ZKFHeNv+pA3y/lshdAliiwbwFAiEA4MoVtCq1awhQJwhrLeVB/+5rP9RmKJx8ErZmCR9+3e0=","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":149445,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJiKmdrACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2VmoczxAAg+T+wOFgFHHYcaRIdRlWPVPJYhNAgB/DGU37/73ZsqozrRiX\r\n0QJbZU/lKKg/qIuKAmMQX2oNtP5VD0GYJLr7qDd3MG7v49plFevYPHVJctYZ\r\nDz+Vzfw9IfM9VvDtLSSqP8ir5kcm/Aum8jzIm34w/HTezt1HAqW7l5JeASHj\r\nZqeVmgQwaPqGnti5z1k8Q78qQdqgRMjRhA3pYiAMFFvL6JRAqFrDJ2eSjgIr\r\nqlKPdeiGtKwGE0iXfBSoX7b4Xr2akIvHEhOP4HyUGQDPU2a6gCIl8bwSreXN\r\ngiCdPQiY548+1a92BL+OfuJ75lha+CZGJ/dMmleACsGHNLot3HWjRv+b5Fqn\r\n3eY3E5XxcpqQpNO2T71T+ga0iLfEm5d1jcPhXZNjKSrKcPRxHWSFdmjVCDS4\r\nA6fhWUvcH6YAakMn8beJe3NV/+XF/o92O6b3HwQ9MLiBT5PYio3mHYTSnT3s\r\nRzWT5ru3K2E3o6f9D6gnikvha812k5HiMDMyjhRnnzcfZmgyLDBPVbyAvEFT\r\n6t1TXTMANFVxKq9x0nl43dcA0CkblZvWbDWapU7tanIsZJGmeDt8jgegES43\r\nPJU4F/z6F61XbYJHAbzGuHSnOblMxWESxzgRxl3qhCCQOhTwOEMv8erPJwdb\r\nSru4T/CyQz7zAtkqspsvl0I550/s+yIYFU4=\r\n=jw+W\r\n-----END PGP SIGNATURE-----\r\n"},"main":"./build/index.js","types":"./build/index.d.ts","browser":"./browser/index.js","engines":{"node":">=14"},"gitHead":"aae1ae2886b3abf7cc98a3df679e1542bb5c21c7","scripts":{"lint":"eslint --ext .ts,.tsx src/","test":"jest --config=config/jest.config.ts --passWithNoTests","build":"npm run build:browser && npm run build:main","typecheck":"tsc --project tsconfig.json --noEmit","build:main":"tsc --project tsconfig.json --module CommonJS --outDir ./build","build:browser":"tsc --project tsconfig.json --module ESNext --outDir ./browser"},"_npmUser":{"name":"sergiodxa","email":"sergiodxa@gmail.com"},"repository":{"url":"git+https://github.com/sergiodxa/remix-utils.git","type":"git"},"_npmVersion":"8.3.1","description":"This package contains simple utility functions to use with [Remix.run](https://remix.run).","directories":{},"sideEffects":false,"_nodeVersion":"16.14.0","dependencies":{"uuid":"^8.3.2","is-ip":"^3.1.0","type-fest":"^2.5.2"},"_hasShrinkwrap":false,"devDependencies":{"jest":"^27.3.1","react":"^17.0.2","eslint":"^7.26.0","ts-node":"^10.4.0","prettier":"^2.5.1","babel-jest":"^27.3.1","typescript":"^4.2.4","@babel/core":"^7.16.0","@jest/types":"^27.2.5","@types/uuid":"^8.3.3","@types/react":"^17.0.14","@remix-run/node":"^1.1.1","jest-fetch-mock":"^3.0.3","@remix-run/react":"^1.1.1","react-router-dom":"^6.0.0-beta.6","@babel/preset-env":"^7.16.0","eslint-plugin-jest":"^24.3.6","@babel/preset-react":"^7.16.0","eslint-plugin-react":"^7.26.1","eslint-plugin-import":"^2.22.1","eslint-plugin-cypress":"^2.11.3","eslint-plugin-promise":"^5.1.0","eslint-plugin-unicorn":"^32.0.1","@testing-library/react":"^12.1.2","eslint-config-prettier":"^8.3.0","eslint-plugin-jest-dom":"^3.9.0","eslint-plugin-jsx-a11y":"^6.4.1","eslint-plugin-prettier":"^3.4.0","@babel/preset-typescript":"^7.16.0","@remix-run/server-runtime":"^1.1.1","@testing-library/jest-dom":"^5.15.0","@typescript-eslint/parser":"^5.3.0","eslint-plugin-react-hooks":"^4.2.0","@size-limit/preset-small-lib":"^4.10.2","eslint-plugin-testing-library":"^4.3.0","@typescript-eslint/eslint-plugin":"^5.3.0","eslint-import-resolver-typescript":"^2.5.0"},"peerDependencies":{"react":"^17.0.2","@remix-run/react":"^1.1.1","@remix-run/server-runtime":"^1.1.1"},"_npmOperationalInternal":{"tmp":"tmp/remix-utils_2.8.0_1646946155661_0.5051917217399096","host":"s3://npm-registry-packages"}},"2.9.0":{"name":"remix-utils","version":"2.9.0","keywords":["remix","remix.run","react","utils","request","response","csrf","redirect-back","outlet","client-only","hydrated","body parser"],"author":{"url":"https://sergiodxa.com","name":"Sergio Xalambrí","email":"hello@sergiodxa.com"},"license":"MIT","_id":"remix-utils@2.9.0","maintainers":[{"name":"sergiodxa","email":"sergiodxa@gmail.com"}],"homepage":"https://github.com/sergiodxa/remix-utils#readme","bugs":{"url":"https://github.com/sergiodxa/remix-utils/issues"},"dist":{"shasum":"ecdf024be23c00988aadf8e8a7f98ca366ea790b","tarball":"https://registry.npmjs.org/remix-utils/-/remix-utils-2.9.0.tgz","fileCount":90,"integrity":"sha512-lQQ1+9MBO3fOx8NhZZzVhDy8tm6H4vItc5WU/HwrBKWdJU8Lt6JS/cO+VYO+Sqm34yXuNOF+GNOIzWD/AVmknQ==","signatures":[{"sig":"MEUCIBDFQF3UEig8XGIIAme3A7FRSkfNmK78Y86bdlvrUTiLAiEA15db9uM2MGz+7EN4wW6B2ASl+SOUuPjqPpjn21eiYFg=","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":159273,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJiMjwlACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2Vmrr7w/5AQ8bv15I5y48+QHioN2tkeNTiIyov14daDr+Up9tIM/wsdyq\r\nXkAcDk5/95ra+pZzgr7NRnGKQgORL4Y0UbdAZySPVA2RQjhlEuvsxEnFC0jV\r\nNKywBPhgZhE1Gma09zQd8cvdwg5ceQHbOEDvzubdl1+ZC8pJlpbyHabyf8U5\r\noA/PzVxAttKZ9RoUnmoDINNBA+7+RZZnjGhNbFQKigz1juhvXE+U88yKV89U\r\ngBPY64S/XkX043owm1EsJiDMX5cB7hXDaJ4lgb85+L+q++dxi80Iw3FhtiHN\r\nXTVDKIW+IXqYtpRztIn43brhG4VajOJ/Y91lhcr5ZfDqMIkM12JDDhiG5kxx\r\nR91KwqX2rnl5IhXD+wAYd1pPojkoz+V1czrxbjtobntN3jYSoIXLrtSrWmfQ\r\nzOOo/cc26PbVQOWNShULupL9uIqSOQ0vbTvKsLXGw+MOTBriW0viixVtT0uM\r\nQ8vjC8X8/pea6zsey2Ua/zuuLsRpuiShkDZBN3ZsmK8A0I2Rzi6vP9djMOPd\r\n8AFVEplR+T7t+Cl5u5d0Iz0Su2XyMe184lBroeFmNYWPczFlr+ZmZCszdkUQ\r\nsZc4PW3g+R4nMpK/G1RrCFDNJF+pxhDPyXiEUPIdHeUvbWP1HV8uYDpdO/XM\r\nTjwukfcR2AbT3qPyxU+QM/fyNzm4tVjTpmU=\r\n=oC6u\r\n-----END PGP SIGNATURE-----\r\n"},"main":"./build/index.js","types":"./build/index.d.ts","browser":"./browser/index.js","engines":{"node":">=14"},"gitHead":"0a4ac070af367ec434bf069ab3a32c3c6e7e0ff0","scripts":{"lint":"eslint --ext .ts,.tsx src/","test":"jest --config=config/jest.config.ts --passWithNoTests","build":"npm run build:browser && npm run build:main","typecheck":"tsc --project tsconfig.json --noEmit","build:main":"tsc --project tsconfig.json --module CommonJS --outDir ./build","build:browser":"tsc --project tsconfig.json --module ESNext --outDir ./browser"},"_npmUser":{"name":"sergiodxa","email":"sergiodxa@gmail.com"},"repository":{"url":"git+https://github.com/sergiodxa/remix-utils.git","type":"git"},"_npmVersion":"8.3.1","description":"This package contains simple utility functions to use with [Remix.run](https://remix.run).","directories":{},"sideEffects":false,"_nodeVersion":"16.14.0","dependencies":{"uuid":"^8.3.2","is-ip":"^3.1.0","type-fest":"^2.5.2"},"_hasShrinkwrap":false,"devDependencies":{"jest":"^27.3.1","react":"^17.0.2","eslint":"^7.26.0","ts-node":"^10.4.0","prettier":"^2.5.1","babel-jest":"^27.3.1","schema-dts":"^1.1.0","typescript":"^4.2.4","@babel/core":"^7.16.0","@jest/types":"^27.2.5","@types/uuid":"^8.3.3","@types/react":"^17.0.14","@remix-run/node":"^1.1.1","jest-fetch-mock":"^3.0.3","@remix-run/react":"^1.1.1","react-router-dom":"^6.0.0-beta.6","@babel/preset-env":"^7.16.0","eslint-plugin-jest":"^24.3.6","@babel/preset-react":"^7.16.0","eslint-plugin-react":"^7.26.1","eslint-plugin-import":"^2.22.1","eslint-plugin-cypress":"^2.11.3","eslint-plugin-promise":"^5.1.0","eslint-plugin-unicorn":"^32.0.1","@testing-library/react":"^12.1.2","eslint-config-prettier":"^8.3.0","eslint-plugin-jest-dom":"^3.9.0","eslint-plugin-jsx-a11y":"^6.4.1","eslint-plugin-prettier":"^3.4.0","@babel/preset-typescript":"^7.16.0","@remix-run/server-runtime":"^1.1.1","@testing-library/jest-dom":"^5.15.0","@typescript-eslint/parser":"^5.3.0","eslint-plugin-react-hooks":"^4.2.0","@size-limit/preset-small-lib":"^4.10.2","eslint-plugin-testing-library":"^4.3.0","@typescript-eslint/eslint-plugin":"^5.3.0","eslint-import-resolver-typescript":"^2.5.0"},"peerDependencies":{"react":"^17.0.2","@remix-run/react":"^1.1.1","@remix-run/server-runtime":"^1.1.1"},"_npmOperationalInternal":{"tmp":"tmp/remix-utils_2.9.0_1647459364975_0.8964133082725081","host":"s3://npm-registry-packages"}},"2.10.0":{"name":"remix-utils","version":"2.10.0","keywords":["remix","remix.run","react","utils","request","response","csrf","redirect-back","outlet","client-only","hydrated","body parser"],"author":{"url":"https://sergiodxa.com","name":"Sergio Xalambrí","email":"hello@sergiodxa.com"},"license":"MIT","_id":"remix-utils@2.10.0","maintainers":[{"name":"sergiodxa","email":"sergiodxa@gmail.com"}],"homepage":"https://github.com/sergiodxa/remix-utils#readme","bugs":{"url":"https://github.com/sergiodxa/remix-utils/issues"},"dist":{"shasum":"b72a16cc2d736b5ffb1f78c55e9c7abb6116585f","tarball":"https://registry.npmjs.org/remix-utils/-/remix-utils-2.10.0.tgz","fileCount":94,"integrity":"sha512-dtxxfiHpdPuZv+0c9i7erdLdLh6PNfd6YJV9kPuAWf+F113vJ4kNU0YCJDn4Kb9fkkb1RuTl+ubKj1NTXHO+0Q==","signatures":[{"sig":"MEUCIQDrBoFkTUYrCyepkxGcaTdVCEWtrK95Arci8SNkTYDjfQIgCBbii5Yw5eAmW0qWAI/9Ikmk+JySNLjAg81scV4Ht1U=","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":162841,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJiONdEACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2VmrHYQ//a2TbGWEcnNHCj674F+ClHiEFcpUsrfZwm7KavZmkr1RpHDKF\r\n41+x4Hpebg7A9QUWwjazsiAvE3FVazGHnVg0PRXpWyyXHi9Yd6uyXLzM/srp\r\nqkUO8VNm01ikMoOHHAUkk2PNcQqp9bvsyOe/k12ZAIsASAr9+ngZsSIR+GSS\r\nfdu0W6HZfSnBAiYP3lb8jmOV2kUDvD3GAEVunktG9G2vnV+dpRvB58h7DMwc\r\nx6vkADfkzGp1cm+7HT7Nksi2L9T1qmgCFiyjFlq9nt9S48xLejSa5rVi7XYK\r\n7GO3tnogC+Qq5nlN5Vpkp2ghEtewGrLkYwZsFsL03BeQk6ZjlGljKJV9Q28T\r\nhKAhjjjOgnnNFeJkJ5IOiSsJ0uGkiv6ZeWO1u3jW0Jpjm2XsNxYJT5TX2kLF\r\nt8V+ugVjMRFq4CBlIBAS5ggCEAavzZ9qpPbfMoQXkS1EDJTx26Y7nj010dhy\r\nYfascMVu9+yJTW4nyd3mJGfDfohk1AetIUxlc1mgvlNeH7iZOK/yI0yPv/Ut\r\nSnH0iMC1W8YlnvfN10v6HmZegkleufbv3QEeov2vYrDhHsq43D3T1zctecIY\r\nP/jKW90C44P7JmP6KEo3129yNLzR4MvGSkB3ZVzz84BJiIcj0wBUTNwqOzhk\r\n5t3a4UB8t6PtucKne/Tx1gNIRk9Pk7rUlF0=\r\n=Bc29\r\n-----END PGP SIGNATURE-----\r\n"},"main":"./build/index.js","types":"./build/index.d.ts","browser":"./browser/index.js","engines":{"node":">=14"},"gitHead":"e6efea4627f1327a734aadb5b3bdee4aa1ae9d2e","scripts":{"lint":"eslint --ext .ts,.tsx src/","test":"jest --config=config/jest.config.ts --passWithNoTests","build":"npm run build:browser && npm run build:main","typecheck":"tsc --project tsconfig.json --noEmit","build:main":"tsc --project tsconfig.json --module CommonJS --outDir ./build","build:browser":"tsc --project tsconfig.json --module ESNext --outDir ./browser"},"_npmUser":{"name":"sergiodxa","email":"sergiodxa@gmail.com"},"repository":{"url":"git+https://github.com/sergiodxa/remix-utils.git","type":"git"},"_npmVersion":"8.3.1","description":"This package contains simple utility functions to use with [Remix.run](https://remix.run).","directories":{},"sideEffects":false,"_nodeVersion":"16.14.0","dependencies":{"uuid":"^8.3.2","is-ip":"^3.1.0","type-fest":"^2.5.2","schema-dts":"^1.1.0"},"_hasShrinkwrap":false,"devDependencies":{"jest":"^27.3.1","react":"^17.0.2","eslint":"^7.26.0","ts-node":"^10.4.0","prettier":"^2.5.1","babel-jest":"^27.3.1","typescript":"^4.2.4","@babel/core":"^7.16.0","@jest/types":"^27.2.5","@types/uuid":"^8.3.3","@types/react":"^17.0.14","@remix-run/node":"^1.1.1","jest-fetch-mock":"^3.0.3","@remix-run/react":"^1.1.1","react-router-dom":"^6.0.0-beta.6","@babel/preset-env":"^7.16.0","eslint-plugin-jest":"^24.3.6","@babel/preset-react":"^7.16.0","eslint-plugin-react":"^7.26.1","eslint-plugin-import":"^2.22.1","eslint-plugin-cypress":"^2.11.3","eslint-plugin-promise":"^5.1.0","eslint-plugin-unicorn":"^32.0.1","@testing-library/react":"^12.1.2","eslint-config-prettier":"^8.3.0","eslint-plugin-jest-dom":"^3.9.0","eslint-plugin-jsx-a11y":"^6.4.1","eslint-plugin-prettier":"^3.4.0","@babel/preset-typescript":"^7.16.0","@remix-run/server-runtime":"^1.1.1","@testing-library/jest-dom":"^5.15.0","@typescript-eslint/parser":"^5.3.0","eslint-plugin-react-hooks":"^4.2.0","@size-limit/preset-small-lib":"^4.10.2","eslint-plugin-testing-library":"^4.3.0","@typescript-eslint/eslint-plugin":"^5.3.0","eslint-import-resolver-typescript":"^2.5.0"},"peerDependencies":{"react":"^17.0.2","@remix-run/react":"^1.1.1","@remix-run/server-runtime":"^1.1.1"},"_npmOperationalInternal":{"tmp":"tmp/remix-utils_2.10.0_1647892292594_0.709351489778071","host":"s3://npm-registry-packages"}},"2.11.0":{"name":"remix-utils","version":"2.11.0","keywords":["remix","remix.run","react","utils","request","response","csrf","redirect-back","outlet","client-only","hydrated","body parser"],"author":{"url":"https://sergiodxa.com","name":"Sergio Xalambrí","email":"hello@sergiodxa.com"},"license":"MIT","_id":"remix-utils@2.11.0","maintainers":[{"name":"sergiodxa","email":"sergiodxa@gmail.com"}],"homepage":"https://github.com/sergiodxa/remix-utils#readme","bugs":{"url":"https://github.com/sergiodxa/remix-utils/issues"},"dist":{"shasum":"ebba81ae3d9a1eed7cbc64b9260f18defc4a16ba","tarball":"https://registry.npmjs.org/remix-utils/-/remix-utils-2.11.0.tgz","fileCount":110,"integrity":"sha512-qPQ9Smwk1pc4obWl+qWDHSCff7L3FS444KGxug6DdS0ZOGmmsfA4ggeRQdZbeTTMzBuzKfNCdiGqilxYabOv0w==","signatures":[{"sig":"MEYCIQD4SBJKWyyYdFkFkL/e2KB9zTRrVPo9iRUR4BCneCjUAwIhAOaRNIENgStqbhcMW8fRciDrYrvP3pL4mtorepMvj5IS","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":179566,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJiPkArACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2Vmr0CA//fZPnX4O2DyI5czXfT86fAl+P9ESJzONe+6/rO7B2xFRQ2Azw\r\npFad+ZmGIsq/v0ISh8TxtXVrpKQCmANGmJTmPaFm7gdO/3S2/jV22P+L5WcG\r\nSNQvpm7q8xurSkc5IQCuau6ICZct2vL3FEsbEQAEv3ymn3juw1wD+eJkvvNq\r\nFo3UFaJTSooGTJ81G93ukgxrYKP0iF997ZgMpuI1060wdL16vZgzUpjooTio\r\ngzkt1FADfFogYuA9PFrmvkBXjqtwYYUg8CAFrz+LTTEjOJjOh1dUD173SGg4\r\n7on+oiGXFh3rt5fw5QKr65wP2ICpLnULk4h/GRazQYsFhDIZG5HEgSigeG5t\r\noJrOMHPFebJQCrj0syazjgkc9NCnC2Rnz+CPMXczK7BjRRu3jEdhrHzhr6sz\r\nCkojdnpdMkKzW15ik4zJEKZ9LkBvM1jwGRvE6msuMex8gkgH9pKy3+Vm3EjN\r\ny+hsC80dkuEB6pFNQAMG80OAjWTIqUYg5KMHC7cJiKYFWcyi5k/cFhH9/lDV\r\nqR7qF4psLri77BdS2weyfLitPx9UOgYkqctXcbjFQYIQdyg6lMyGT2VM189r\r\nA4zqJrV3EuMZcjg/H9uP9UBLPr6w9l819Tyy/pPrMqy6E3f80Q9uaswFDYmE\r\nwiKxU7xDZN3q2OvOpmJauD6OPwssxUCZYG0=\r\n=sJ8M\r\n-----END PGP SIGNATURE-----\r\n"},"main":"./build/index.js","types":"./build/index.d.ts","browser":"./browser/index.js","engines":{"node":">=14"},"gitHead":"d6a5cf9930fbcfa5bf70bf1f1c3e7aae3913dc8b","scripts":{"lint":"eslint --ext .ts,.tsx src/","test":"jest --config=config/jest.config.ts --passWithNoTests","build":"npm run build:browser && npm run build:main","typecheck":"tsc --project tsconfig.json --noEmit","build:main":"tsc --project tsconfig.json --module CommonJS --outDir ./build","build:browser":"tsc --project tsconfig.json --module ESNext --outDir ./browser"},"_npmUser":{"name":"sergiodxa","email":"sergiodxa@gmail.com"},"repository":{"url":"git+https://github.com/sergiodxa/remix-utils.git","type":"git"},"_npmVersion":"8.3.1","description":"This package contains simple utility functions to use with [Remix.run](https://remix.run).","directories":{},"sideEffects":false,"_nodeVersion":"16.14.0","dependencies":{"uuid":"^8.3.2","is-ip":"^3.1.0","type-fest":"^2.5.2","schema-dts":"^1.1.0","intl-parse-accept-language":"^1.0.0"},"_hasShrinkwrap":false,"devDependencies":{"jest":"^27.3.1","react":"^17.0.2","eslint":"^7.26.0","ts-node":"^10.4.0","prettier":"^2.5.1","babel-jest":"^27.3.1","typescript":"^4.2.4","@babel/core":"^7.16.0","@jest/types":"^27.2.5","@types/uuid":"^8.3.3","@types/react":"^17.0.14","@remix-run/node":"^1.1.1","jest-fetch-mock":"^3.0.3","@remix-run/react":"^1.1.1","react-router-dom":"^6.0.0-beta.6","@babel/preset-env":"^7.16.0","eslint-plugin-jest":"^24.3.6","@babel/preset-react":"^7.16.0","eslint-plugin-react":"^7.26.1","eslint-plugin-import":"^2.22.1","eslint-plugin-cypress":"^2.11.3","eslint-plugin-promise":"^5.1.0","eslint-plugin-unicorn":"^32.0.1","@testing-library/react":"^12.1.2","eslint-config-prettier":"^8.3.0","eslint-plugin-jest-dom":"^3.9.0","eslint-plugin-jsx-a11y":"^6.4.1","eslint-plugin-prettier":"^3.4.0","@babel/preset-typescript":"^7.16.0","@remix-run/server-runtime":"^1.1.1","@testing-library/jest-dom":"^5.15.0","@typescript-eslint/parser":"^5.3.0","eslint-plugin-react-hooks":"^4.2.0","@size-limit/preset-small-lib":"^4.10.2","eslint-plugin-testing-library":"^4.3.0","@typescript-eslint/eslint-plugin":"^5.3.0","eslint-import-resolver-typescript":"^2.5.0"},"peerDependencies":{"react":"^17.0.2","@remix-run/react":"^1.1.1","@remix-run/server-runtime":"^1.1.1"},"_npmOperationalInternal":{"tmp":"tmp/remix-utils_2.11.0_1648246826939_0.030081426950959056","host":"s3://npm-registry-packages"}},"2.11.1":{"name":"remix-utils","version":"2.11.1","keywords":["remix","remix.run","react","utils","request","response","csrf","redirect-back","outlet","client-only","hydrated","body parser"],"author":{"url":"https://sergiodxa.com","name":"Sergio Xalambrí","email":"hello@sergiodxa.com"},"license":"MIT","_id":"remix-utils@2.11.1","maintainers":[{"name":"sergiodxa","email":"sergiodxa@gmail.com"}],"homepage":"https://github.com/sergiodxa/remix-utils#readme","bugs":{"url":"https://github.com/sergiodxa/remix-utils/issues"},"dist":{"shasum":"a4e6d61c594f166e8bdc78ba089a2e1b55802654","tarball":"https://registry.npmjs.org/remix-utils/-/remix-utils-2.11.1.tgz","fileCount":114,"integrity":"sha512-6Nvb2v/vL4UjHeMO/KbJ73t4jr48qdH1nKAWAuGqCly+3Dcrj8Gt8ITOQ0Di7IL4R5o3kgWchdx520Hcr9ICKg==","signatures":[{"sig":"MEUCIQCj9OceepnJdif+7eYACX+YPFH1mPs2Cn8HAmMGt1KHgwIgVBHGs3TOS4iESjHn8756Sg8NcGNwJ4nOm6zlze2AbKc=","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":180244,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJiPkWEACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2VmrqnRAAnVT95qZklaLi1JEJvGkq710XGHKmIvslfAkV+yY3Q28jcJay\r\nO+2rrclXEUB6fHfDaA9rM4BiTJNyDXcY6RSajIxkLwjyhbcF3WNMtVvkR8MG\r\nJfnPtL/G9spO472bKK7cebQ+WAyTPhPb07uJwpgDsPTW79H0+UMsQsn1jZ6v\r\nXHdQBgL17I61ulwcJWJt4MrZb8/CQ1wCz8GfXFxhXiMho3Ip2upcQr7KXHXn\r\n9wqrOoZv20pB6U+3God5cC0kDRM3m5E9rEZPPWv/Ury7FIcZFhQPbgXMqQYv\r\nK0GY9bakT7Ts0/G5mFIzI1A9B23A5Q0MQSWSrUoh8MLREztRCi/A17ZWbmwI\r\nem3orIt+2u0rAxqqlsMLgDRlGa0DQw3KPy4+AJCjQGl5qEuwzBI4sn/WvqBe\r\nLy0cWyPaVw2dW0X5yYt0iFFcT6Yyw+TWvc9Yi3LnRBxYxqDnKiA6bi+JfVCg\r\nTPhhFlrKuh2o2EfFxvGWLvusupfpWTN9nhSSGO5a6aIvPcxf8qsrEgB8uRf0\r\n4UsuNddUEMwyd5tJu/dBV1IScC+cnpRbztkQdZqWqEr7URmTyvuhZ7gcFWQS\r\nI+SxBLWfelzfXrru17qbTDSMR9Ep7OBOYZfjh2g9E+pMfsCBnhgJFlvYpVlx\r\nGfsrwhP/rTHChbWODuOgxuPBCoWuCmhYV1E=\r\n=+Nfs\r\n-----END PGP SIGNATURE-----\r\n"},"main":"./build/index.js","types":"./build/index.d.ts","browser":"./browser/index.js","engines":{"node":">=14"},"gitHead":"43560f6e2934d215a0075c40fb90b9175886687b","scripts":{"lint":"eslint --ext .ts,.tsx src/","test":"jest --config=config/jest.config.ts --passWithNoTests","build":"npm run build:browser && npm run build:main","typecheck":"tsc --project tsconfig.json --noEmit","build:main":"tsc --project tsconfig.json --module CommonJS --outDir ./build","build:browser":"tsc --project tsconfig.json --module ESNext --outDir ./browser"},"_npmUser":{"name":"sergiodxa","email":"sergiodxa@gmail.com"},"repository":{"url":"git+https://github.com/sergiodxa/remix-utils.git","type":"git"},"_npmVersion":"8.3.1","description":"This package contains simple utility functions to use with [Remix.run](https://remix.run).","directories":{},"sideEffects":false,"_nodeVersion":"16.14.0","dependencies":{"uuid":"^8.3.2","is-ip":"^3.1.0","type-fest":"^2.5.2","schema-dts":"^1.1.0","intl-parse-accept-language":"^1.0.0"},"_hasShrinkwrap":false,"devDependencies":{"jest":"^27.3.1","react":"^17.0.2","eslint":"^7.26.0","ts-node":"^10.4.0","prettier":"^2.5.1","babel-jest":"^27.3.1","typescript":"^4.2.4","@babel/core":"^7.16.0","@jest/types":"^27.2.5","@types/uuid":"^8.3.3","@types/react":"^17.0.14","@remix-run/node":"^1.1.1","jest-fetch-mock":"^3.0.3","@remix-run/react":"^1.1.1","react-router-dom":"^6.0.0-beta.6","@babel/preset-env":"^7.16.0","eslint-plugin-jest":"^24.3.6","@babel/preset-react":"^7.16.0","eslint-plugin-react":"^7.26.1","eslint-plugin-import":"^2.22.1","eslint-plugin-cypress":"^2.11.3","eslint-plugin-promise":"^5.1.0","eslint-plugin-unicorn":"^32.0.1","@testing-library/react":"^12.1.2","eslint-config-prettier":"^8.3.0","eslint-plugin-jest-dom":"^3.9.0","eslint-plugin-jsx-a11y":"^6.4.1","eslint-plugin-prettier":"^3.4.0","@babel/preset-typescript":"^7.16.0","@remix-run/server-runtime":"^1.1.1","@testing-library/jest-dom":"^5.15.0","@typescript-eslint/parser":"^5.3.0","eslint-plugin-react-hooks":"^4.2.0","@size-limit/preset-small-lib":"^4.10.2","eslint-plugin-testing-library":"^4.3.0","@typescript-eslint/eslint-plugin":"^5.3.0","eslint-import-resolver-typescript":"^2.5.0"},"peerDependencies":{"react":"^17.0.2","@remix-run/react":"^1.1.1","@remix-run/server-runtime":"^1.1.1"},"_npmOperationalInternal":{"tmp":"tmp/remix-utils_2.11.1_1648248196755_0.791587058797693","host":"s3://npm-registry-packages"}},"3.0.0":{"name":"remix-utils","version":"3.0.0","keywords":["remix","remix.run","react","utils","request","response","csrf","redirect-back","outlet","client-only","hydrated","body parser"],"author":{"url":"https://sergiodxa.com","name":"Sergio Xalambrí","email":"hello@sergiodxa.com"},"license":"MIT","_id":"remix-utils@3.0.0","maintainers":[{"name":"sergiodxa","email":"sergiodxa@gmail.com"}],"homepage":"https://github.com/sergiodxa/remix-utils#readme","bugs":{"url":"https://github.com/sergiodxa/remix-utils/issues"},"dist":{"shasum":"49bc613781c19b63a0c61c53d770014d4147ff86","tarball":"https://registry.npmjs.org/remix-utils/-/remix-utils-3.0.0.tgz","fileCount":106,"integrity":"sha512-2LLE0o9pmvbKl1f/APk3o4PPEljFmYly3jL1P2BJCtGTseESKb/JVnAYitaJh/K9uMp+8h7WwqTbMan6loHPPg==","signatures":[{"sig":"MEQCIC+V6r/teBZ50vcA7MQxFzp1MYrkEorTFaZhVqGZC/JKAiAoBRbK72Lst+c7EuNp/rKHlrOl+BJUMIEMZamkjgdz5w==","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":180509,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJiThmuACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2VmpMTA/+P/zWH2tzMxzUlilPZeUc/3SMQ9zuJ33SZ4zJL4EyoFcAhHxw\r\naWMLAF4yxbFoVG5KlDo446WCwJUI9YZq7ZhhfGpf6P4lGAEq4d/K04s7hy1B\r\n/b4ES08bBIgcCa6cHwonyTKHdl2VBHhpvVq93gQNt2chvs/2ErHouCumQMd4\r\n0VDGxytHlOwWfafjluqq2XrFQaaK+adgD5U04lehZujMhJFrEjwWBQVlApX4\r\nIryN+JKMutB/7wh9B95v7k3aK6rjDafTiS8wL2C8kT4XNqOXmL5Ay63OnZ8l\r\noafBEnGVKix0sku+knw0CzNVGVnSaldaDAc0FViWIrgxFUQQrz3GR1pC4EKV\r\nmTgegsVVhYZkUBbQJEmd/LEBtWI1xFOcz27WKon0nvpZMBZvYKdAuGn14tLK\r\nBJKsQIUQ7iPY7XCBB2FLgCMtK/9rLU6LrogtdjG7Qj1CWEFZeLoI4Usf4w/3\r\nyMh/m1B9dPx3LLOoVvpnIcEx8O+9/R4OEqzv2hbQz1rxX9kfX4kgUF+EBozt\r\n3xrETCB8U6nqNGz0IQ14+UVAkk8at3TfXHnjf1uq4uJEnmu1eQf8iT4E/pAq\r\nwXO7DajtABQUTf9vNCAIYXXFVp8kSEWF5SeCT3XX9mcWxq+mnw/ChF8bYX/j\r\nJO+Qw8VG8RS23ieP0c9+wSgPKhtOFNilyD8=\r\n=C0Ef\r\n-----END PGP SIGNATURE-----\r\n"},"main":"./build/index.js","types":"./build/index.d.ts","browser":"./browser/index.js","engines":{"node":">=14"},"gitHead":"34cb0386c2a7a4207dc0455bdba729546f25ca1b","scripts":{"lint":"eslint --ext .ts,.tsx src/","test":"jest --config=config/jest.config.ts --passWithNoTests","build":"npm run build:browser && npm run build:main","typecheck":"tsc --project tsconfig.json --noEmit","build:main":"tsc --project tsconfig.json --module CommonJS --outDir ./build","build:browser":"tsc --project tsconfig.json --module ESNext --outDir ./browser"},"_npmUser":{"name":"sergiodxa","email":"sergiodxa@gmail.com"},"repository":{"url":"git+https://github.com/sergiodxa/remix-utils.git","type":"git"},"_npmVersion":"8.5.0","description":"This package contains simple utility functions to use with [Remix.run](https://remix.run).","directories":{},"sideEffects":false,"_nodeVersion":"16.14.2","dependencies":{"uuid":"^8.3.2","is-ip":"^3.1.0","type-fest":"^2.5.2","schema-dts":"^1.1.0","intl-parse-accept-language":"^1.0.0"},"_hasShrinkwrap":false,"devDependencies":{"jest":"^27.3.1","react":"^17.0.2","eslint":"^8.12.0","ts-node":"^10.4.0","prettier":"^2.5.1","babel-jest":"^27.3.1","typescript":"^4.2.4","@babel/core":"^7.16.0","@jest/types":"^27.2.5","@types/uuid":"^8.3.3","@types/react":"^17.0.14","@remix-run/node":"^1.1.1","jest-fetch-mock":"^3.0.3","@remix-run/react":"^1.1.1","react-router-dom":"^6.0.0-beta.6","@babel/preset-env":"^7.16.0","eslint-plugin-jest":"^26.1.3","@babel/preset-react":"^7.16.0","eslint-plugin-react":"^7.26.1","eslint-plugin-import":"^2.22.1","eslint-plugin-cypress":"^2.11.3","eslint-plugin-promise":"^6.0.0","eslint-plugin-unicorn":"^41.0.1","@testing-library/react":"^12.1.2","eslint-config-prettier":"^8.3.0","eslint-plugin-jest-dom":"^4.0.1","eslint-plugin-jsx-a11y":"^6.4.1","eslint-plugin-prettier":"^4.0.0","@babel/preset-typescript":"^7.16.0","@remix-run/server-runtime":"^1.1.1","@testing-library/jest-dom":"^5.15.0","@typescript-eslint/parser":"^5.3.0","eslint-plugin-react-hooks":"^4.2.0","eslint-plugin-testing-library":"^5.1.0","@typescript-eslint/eslint-plugin":"^5.3.0","eslint-import-resolver-typescript":"^2.5.0"},"peerDependencies":{"react":"^17.0.2","@remix-run/react":"^1.1.1","@remix-run/server-runtime":"^1.1.1"},"_npmOperationalInternal":{"tmp":"tmp/remix-utils_3.0.0_1649285550260_0.8017250256060457","host":"s3://npm-registry-packages"}},"3.1.0":{"name":"remix-utils","version":"3.1.0","keywords":["remix","remix.run","react","utils","request","response","csrf","redirect-back","outlet","client-only","hydrated","body parser"],"author":{"url":"https://sergiodxa.com","name":"Sergio Xalambrí","email":"hello@sergiodxa.com"},"license":"MIT","_id":"remix-utils@3.1.0","maintainers":[{"name":"sergiodxa","email":"sergiodxa@gmail.com"}],"homepage":"https://github.com/sergiodxa/remix-utils#readme","bugs":{"url":"https://github.com/sergiodxa/remix-utils/issues"},"dist":{"shasum":"bfb4a2aecfdc5919550d2ead2e34dfc457701c3f","tarball":"https://registry.npmjs.org/remix-utils/-/remix-utils-3.1.0.tgz","fileCount":110,"integrity":"sha512-Fmfxai+Z4RXaVMRxLCEKKA/mXhLYYWffzzvBg5v+eoBc0UAUs1PUcwnU9ssaoFjexXck9r3l3/sawa8myv1XPg==","signatures":[{"sig":"MEQCIEf7waJHNRVAZj9Y8OIMSQwu2NFYwWxJ9OCPKl3ijHgsAiB7V+ySEA/yN0GKpJcpRpYYTG6bsduTTQwDkIKpqvoPSg==","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":184275,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJia3+3ACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2Vmr2mw//WEd+qGCYAg7BLZ4xuBRW5aZtDaf0V6d1JVvh4PG5CRbz0/GM\r\nol5hE0dvSTN35YDcc8pcuKCRsYUtI9rxGNRGmah1rgBtt8mzLGb20m9G/Kpb\r\ntOlJyTW1IaTlxBj4fueQ7SkB91UF6pXW2HcbXlD2t7F7FusYd0IADTYdi0Zm\r\nfV7X5oWMAK/473Y3qBvx1eXzhnpFnih4K9m8BJSsqqbkzRQkIMmg3q+7gWCx\r\n7A8VlkWQDA4APtSPByuD9fJxz6XKD+dvsELKXJPx6bOKkVjTCwG5THwsqFlK\r\ntJzfOe78fpVA3PxKZ5+i+pnK4lnAvzxM9LL4KJ0iAbZ3KwXOcJ1S+aQ3fbda\r\nHL7ws13cFy3jAlV6IfUst8SFMFdaZwKOeu6dFZCUBcaPFr6CYD8qYxelF2bD\r\nsuljRrVBZ/keIpRddcZoQ9L8xnB8Bmu6UeWoy8ovhwKEAQIuDOvwLHWhBx16\r\n+cwoLApy9eVaKXiEy3qgCs6E7XkhRATDCgo7qwIcUJQGFGuzIW5eH63flxHi\r\nJ6D1Z5XsnheeohGmSVNqfx7iCIEMdg1xIivAB5RkV5fyijvCJaXR/VO2Iuo4\r\nANi8zx9MbQ5Fhmwp1HiR2Bil7rjVqevRtMnO1dLtjlwnQSVPD+OzUjlxUAsz\r\nZYIxkkmLRDE21RPodQquh5IdJQIVkgxVDW4=\r\n=WUlp\r\n-----END PGP SIGNATURE-----\r\n"},"main":"./build/index.js","types":"./build/index.d.ts","browser":"./browser/index.js","engines":{"node":">=14"},"gitHead":"98989d02637ce83fbda7f1655d27e7ea5b1eddcf","scripts":{"lint":"eslint --ext .ts,.tsx src/","test":"jest --config=config/jest.config.ts --passWithNoTests","build":"npm run build:browser && npm run build:main","typecheck":"tsc --project tsconfig.json --noEmit","build:main":"tsc --project tsconfig.json --module CommonJS --outDir ./build","build:browser":"tsc --project tsconfig.json --module ESNext --outDir ./browser"},"_npmUser":{"name":"sergiodxa","email":"sergiodxa@gmail.com"},"repository":{"url":"git+https://github.com/sergiodxa/remix-utils.git","type":"git"},"_npmVersion":"8.5.0","description":"This package contains simple utility functions to use with [Remix.run](https://remix.run).","directories":{},"sideEffects":false,"_nodeVersion":"16.14.2","dependencies":{"uuid":"^8.3.2","is-ip":"^3.1.0","type-fest":"^2.5.2","schema-dts":"^1.1.0","intl-parse-accept-language":"^1.0.0"},"_hasShrinkwrap":false,"devDependencies":{"jest":"^27.3.1","react":"^17.0.2","eslint":"^8.12.0","ts-node":"^10.4.0","prettier":"^2.5.1","babel-jest":"^27.3.1","typescript":"^4.2.4","@babel/core":"^7.16.0","@jest/types":"^27.2.5","@types/uuid":"^8.3.3","@types/react":"^17.0.14","@remix-run/node":"^1.1.1","jest-fetch-mock":"^3.0.3","@remix-run/react":"^1.1.1","react-router-dom":"^6.0.0-beta.6","@babel/preset-env":"^7.16.0","eslint-plugin-jest":"^26.1.3","@babel/preset-react":"^7.16.0","eslint-plugin-react":"^7.26.1","eslint-plugin-import":"^2.22.1","eslint-plugin-cypress":"^2.11.3","eslint-plugin-promise":"^6.0.0","eslint-plugin-unicorn":"^41.0.1","@testing-library/react":"^12.1.2","eslint-config-prettier":"^8.3.0","eslint-plugin-jest-dom":"^4.0.1","eslint-plugin-jsx-a11y":"^6.4.1","eslint-plugin-prettier":"^4.0.0","@babel/preset-typescript":"^7.16.0","@remix-run/server-runtime":"^1.1.1","@testing-library/jest-dom":"^5.15.0","@typescript-eslint/parser":"^5.3.0","eslint-plugin-react-hooks":"^4.2.0","eslint-plugin-testing-library":"^5.1.0","@typescript-eslint/eslint-plugin":"^5.3.0","eslint-import-resolver-typescript":"^2.5.0"},"peerDependencies":{"react":"^16.8.0 || ^17.0.0 || ^18.0.0","@remix-run/react":"^1.1.1","@remix-run/server-runtime":"^1.1.1"},"_npmOperationalInternal":{"tmp":"tmp/remix-utils_3.1.0_1651212215767_0.4645511381497922","host":"s3://npm-registry-packages"}},"3.2.0":{"name":"remix-utils","version":"3.2.0","keywords":["remix","remix.run","react","utils","request","response","csrf","redirect-back","outlet","client-only","hydrated","body parser"],"author":{"url":"https://sergiodxa.com","name":"Sergio Xalambrí","email":"hello@sergiodxa.com"},"license":"MIT","_id":"remix-utils@3.2.0","maintainers":[{"name":"sergiodxa","email":"sergiodxa@gmail.com"}],"homepage":"https://github.com/sergiodxa/remix-utils#readme","bugs":{"url":"https://github.com/sergiodxa/remix-utils/issues"},"dist":{"shasum":"7885cccd9e42cfcd96a0f083194d8889c14ec6c9","tarball":"https://registry.npmjs.org/remix-utils/-/remix-utils-3.2.0.tgz","fileCount":114,"integrity":"sha512-jNtaqq5kWs1vfXlcKK6biLaFlyJa/2tnaVoTBOiymkiajEa9OamCapFjcrmRGuTA3vcOeeBvgzp7oOS40ycQNA==","signatures":[{"sig":"MEQCIAjxFYDZ+NcZK4qSdXIHQlv30G4Yk6ti23q7LCSuwBOyAiBTGoxv4KIqoNi4inXzSWkLJKVoStDPEnkKoK02zdwvqA==","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":191545,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJie/eNACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2VmoYBw/8DlqzAumMnPUjx0u2SScngeF/JQmamqH0qoX5BKTFrIYsQHoT\r\nIrsZv5UKou9+4d5rjn5ZloAzYeC4Y5nTu+NSPNCmoHKgfouM17rkApobU9au\r\nuA9PuXpEWZ42dwv75cwOJkutGSYDz7d+VQnraBW9KWeVlJjSWlfXTfr1HHZ3\r\ndmfCiWmef1R40/kXpmd+Q0Ug6gkbyBT6UUQwEe/l92y2GCb0kZZrrnXSNG8V\r\nEhG8SQeForFYzYgNZiw+ng97ReaXUWhpv56etj3fbZ6uVel3mqN5xQs2VRHP\r\nE3gj7qtl7bFflmM32tr0e0+kB3ySfgQpE125ncqog2TIxkR2x3ODgsrIxWme\r\nvk2AVWeVQHUVj643SA0beYt6Airat63by0U5uWVr+wz4Nf8proknjXIIwEu1\r\n5aYrsRtz7FquEZS2L3AKVOQ07aEkBsTgSfxcQ3xy0Oall2LoNM9z2CeZgaQm\r\nKslfYLf1kz4B2DZSJRdUFtODuxt7hbUCkxlkH9U5JLrFpnXtOI/SWOsuoddL\r\nL4v3NqOH3+YKPBy04byHhzi+8yOqiEUQiJcPWLif/nVSFhveK6p/N2Om3CRn\r\nxOdkpd2aBmDxTb9swp4ES3Q8XqTHTPuqW2gIDALV/SFVetHy0bZr9RcsZidL\r\nay1WJIf5C33QWBfeaxcUziMkl6iyiPcmWwY=\r\n=C8QT\r\n-----END PGP SIGNATURE-----\r\n"},"main":"./build/index.js","types":"./build/index.d.ts","browser":"./browser/index.js","engines":{"node":">=14"},"gitHead":"ff0ed88a54f7afbf8b833bdde96f6c5b7902c11b","scripts":{"lint":"eslint --ext .ts,.tsx src/","test":"jest --config=config/jest.config.ts --passWithNoTests","build":"npm run build:browser && npm run build:main","typecheck":"tsc --project tsconfig.json --noEmit","build:main":"tsc --project tsconfig.json --module CommonJS --outDir ./build","build:browser":"tsc --project tsconfig.json --module ESNext --outDir ./browser"},"_npmUser":{"name":"sergiodxa","email":"sergiodxa@gmail.com"},"repository":{"url":"git+https://github.com/sergiodxa/remix-utils.git","type":"git"},"_npmVersion":"8.5.5","description":"This package contains simple utility functions to use with [Remix.run](https://remix.run).","directories":{},"sideEffects":false,"_nodeVersion":"16.15.0","dependencies":{"uuid":"^8.3.2","is-ip":"^3.1.0","type-fest":"^2.5.2","schema-dts":"^1.1.0","intl-parse-accept-language":"^1.0.0"},"_hasShrinkwrap":false,"devDependencies":{"jest":"^27.3.1","react":"^17.0.2","eslint":"^8.12.0","ts-node":"^10.4.0","prettier":"^2.5.1","babel-jest":"^27.3.1","typescript":"^4.2.4","@babel/core":"^7.16.0","@jest/types":"^27.2.5","@types/uuid":"^8.3.3","@types/react":"^17.0.14","@remix-run/node":"^1.1.1","jest-fetch-mock":"^3.0.3","@remix-run/react":"^1.1.1","react-router-dom":"^6.0.0-beta.6","@babel/preset-env":"^7.16.0","eslint-plugin-jest":"^26.1.3","@babel/preset-react":"^7.16.0","eslint-plugin-react":"^7.26.1","eslint-plugin-import":"^2.22.1","eslint-plugin-cypress":"^2.11.3","eslint-plugin-promise":"^6.0.0","eslint-plugin-unicorn":"^41.0.1","@testing-library/react":"^12.1.2","eslint-config-prettier":"^8.3.0","eslint-plugin-jest-dom":"^4.0.1","eslint-plugin-jsx-a11y":"^6.4.1","eslint-plugin-prettier":"^4.0.0","@babel/preset-typescript":"^7.16.0","@remix-run/server-runtime":"^1.1.1","@testing-library/jest-dom":"^5.15.0","@typescript-eslint/parser":"^5.3.0","eslint-plugin-react-hooks":"^4.2.0","eslint-plugin-testing-library":"^5.1.0","@typescript-eslint/eslint-plugin":"^5.3.0","eslint-import-resolver-typescript":"^2.5.0"},"peerDependencies":{"react":"^16.8.0 || ^17.0.0 || ^18.0.0","@remix-run/react":"^1.1.1","@remix-run/server-runtime":"^1.1.1"},"_npmOperationalInternal":{"tmp":"tmp/remix-utils_3.2.0_1652291469230_0.3656750325518878","host":"s3://npm-registry-packages"}},"3.3.0":{"name":"remix-utils","version":"3.3.0","keywords":["remix","remix.run","react","utils","request","response","csrf","redirect-back","outlet","client-only","hydrated","body parser"],"author":{"url":"https://sergiodxa.com","name":"Sergio Xalambrí","email":"hello@sergiodxa.com"},"license":"MIT","_id":"remix-utils@3.3.0","maintainers":[{"name":"sergiodxa","email":"sergiodxa@gmail.com"}],"homepage":"https://github.com/sergiodxa/remix-utils#readme","bugs":{"url":"https://github.com/sergiodxa/remix-utils/issues"},"dist":{"shasum":"1387d055b3ec176b4724906086c95ad85c573805","tarball":"https://registry.npmjs.org/remix-utils/-/remix-utils-3.3.0.tgz","fileCount":114,"integrity":"sha512-jqqFcUH8DNTgcw8rje0q1Ra3w0TBa8B8c39BArXIweWsNX12MVwBY9NET3c+IXj0iQlzRk4GNObuOe4r5UrJIg==","signatures":[{"sig":"MEUCIHy5gU6ucrrCsohG3nv5HqD+xm5TFhakA0VI6ajzgjKmAiEA1EkyP86I5UvGp53ElEgaFqwSka44G46qlI2bBbZmSYA=","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":192938,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJim47IACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2VmrAuw//XcgRpyW0rXPDEWrdJ8LLpvy0f2kZ2ZK4B95Nv/qJqQozi06Q\r\n7rFpWbbYUOB1aISx/+fd7QQrwOwygjjdp0RueLRIntsku7IsyYLnWU+LG3lA\r\nWYl3+GlzPNIyMY/MVn/zv85QjcClyleYGxMHjb2oC46/ZhOGjWf13XdoycQ/\r\nCAz/FSDCZcVRobrf5Fg8wj62gpbeCRtkkGsCUdthoj8++9x8n+Owtzp7K6He\r\n1z7eku6UhW7KrHVifBBu8aLBZ2bsq3G9YVmrnhFR2YQI5dWSKt8bzgSOiZW9\r\nO/glxvGETymRH5iUQtbJCZbyfgdm41n4e6zwBttCfF0ZTBuQnjoD1PBGROzB\r\n6s5W+pVHprPhUiBwN1sd3GxcjwV8NNPBwPB/4eoydmJoEKlwY1rF1K1XLyTg\r\ndtTfaV37ilmHK661VGgVGResPajG8278mhjNu8Ig1Fg15ne59JPGqQgzEAk9\r\nzSSnLRNgsdbjJRAV1mEqwLN1FrroLukPScjUS3x4fMOki7wGpseQfas6tUyX\r\nUgvHdEo5DSESFWcuxlCwMngaf5IBdXT/KsmzA6K0px4qttvvd02g4qpdV208\r\nk6s5m2Nu8spC91c+USSfZ0GbcaREWBVz9NFs75OTV1toir6PnxWMIx84QkSo\r\nqz2A/yzlXl6d3gkSI0PFoinAuep7nMQLtuk=\r\n=gmtI\r\n-----END PGP SIGNATURE-----\r\n"},"main":"./build/index.js","types":"./build/index.d.ts","browser":"./browser/index.js","engines":{"node":">=14"},"gitHead":"f2f25377da044e411c0391d470d1c80f868d7da0","scripts":{"lint":"eslint --ext .ts,.tsx src/","test":"jest --config=config/jest.config.ts --passWithNoTests","build":"npm run build:browser && npm run build:main","typecheck":"tsc --project tsconfig.json --noEmit","build:main":"tsc --project tsconfig.json --module CommonJS --outDir ./build","build:browser":"tsc --project tsconfig.json --module ESNext --outDir ./browser"},"_npmUser":{"name":"sergiodxa","email":"sergiodxa@gmail.com"},"repository":{"url":"git+https://github.com/sergiodxa/remix-utils.git","type":"git"},"_npmVersion":"8.5.5","description":"This package contains simple utility functions to use with [Remix.run](https://remix.run).","directories":{},"sideEffects":false,"_nodeVersion":"16.15.0","dependencies":{"uuid":"^8.3.2","is-ip":"^3.1.0","type-fest":"^2.5.2","schema-dts":"^1.1.0","intl-parse-accept-language":"^1.0.0"},"_hasShrinkwrap":false,"devDependencies":{"jest":"^27.3.1","react":"^17.0.2","eslint":"^8.12.0","ts-node":"^10.4.0","prettier":"^2.5.1","babel-jest":"^27.3.1","typescript":"^4.2.4","@babel/core":"^7.16.0","@jest/types":"^27.2.5","@types/uuid":"^8.3.3","@types/react":"^17.0.14","@remix-run/node":"^1.1.1","jest-fetch-mock":"^3.0.3","@remix-run/react":"^1.1.1","react-router-dom":"^6.0.0-beta.6","@babel/preset-env":"^7.16.0","eslint-plugin-jest":"^26.1.3","@babel/preset-react":"^7.16.0","eslint-plugin-react":"^7.26.1","eslint-plugin-import":"^2.22.1","eslint-plugin-cypress":"^2.11.3","eslint-plugin-promise":"^6.0.0","eslint-plugin-unicorn":"^41.0.1","@testing-library/react":"^12.1.2","eslint-config-prettier":"^8.3.0","eslint-plugin-jest-dom":"^4.0.1","eslint-plugin-jsx-a11y":"^6.4.1","eslint-plugin-prettier":"^4.0.0","@babel/preset-typescript":"^7.16.0","@remix-run/server-runtime":"^1.1.1","@testing-library/jest-dom":"^5.15.0","@typescript-eslint/parser":"^5.3.0","eslint-plugin-react-hooks":"^4.2.0","eslint-plugin-testing-library":"^5.1.0","@typescript-eslint/eslint-plugin":"^5.3.0","eslint-import-resolver-typescript":"^2.5.0"},"peerDependencies":{"react":"^16.8.0 || ^17.0.0 || ^18.0.0","@remix-run/react":"^1.1.1","@remix-run/server-runtime":"^1.1.1"},"_npmOperationalInternal":{"tmp":"tmp/remix-utils_3.3.0_1654361800469_0.9290551442377775","host":"s3://npm-registry-packages"}},"3.4.0":{"name":"remix-utils","version":"3.4.0","keywords":["remix","remix.run","react","utils","request","response","csrf","redirect-back","outlet","client-only","hydrated","body parser"],"author":{"url":"https://sergiodxa.com","name":"Sergio Xalambrí","email":"hello@sergiodxa.com"},"license":"MIT","_id":"remix-utils@3.4.0","maintainers":[{"name":"sergiodxa","email":"sergiodxa@gmail.com"}],"homepage":"https://github.com/sergiodxa/remix-utils#readme","bugs":{"url":"https://github.com/sergiodxa/remix-utils/issues"},"dist":{"shasum":"cc940490e6cd766154291ddf169d35c30067e018","tarball":"https://registry.npmjs.org/remix-utils/-/remix-utils-3.4.0.tgz","fileCount":114,"integrity":"sha512-rfRZlqUj49jmsqm/T7lKG/TDCf3WD3r+CzbkPxwTxX52YQULWLY55+jfS7OwuQ/H9+iJS+YG0N+P1+dml3o02A==","signatures":[{"sig":"MEUCIQCWnTZb2dapD7wrwf7mJA9tQrwMi0q/eXrBCGYLtQj7aAIgZtZQqsWKg64jaoPXWRrnj6zk8XNyV8xCxulHWGjxVg0=","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":194585,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJjVCj3ACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2VmqEHQ/8CByiJxBXE06XjvTPhgFbCY2e61/aZJrZrh7yPC2n8nrzUUl9\r\n3gV96mmZrvX4tG+iM9Ce6QapHOoFvcR78nBz33GEXm5K1kugqlsVG27VdEGD\r\nF04dbQCl5iBZQ1oimAVIuJ/axW9DffKnnCDPmneJUOrWsS26WB+MzMEVIhsY\r\nGiNXAHe0uDMItYN6DrPTfECKUksOUgVpkP7MB6jI7u3pWNCPmLgYZyv12wUx\r\nr+QR3t0dCmGHWuMLnxgOy2RVtCuMEij3MkyQYIjjxp/h4aW4yBrh5e8zBSTs\r\nlp0uFQng9Sa3IcqVCWA+2MpQMz+chbcBo11lwbtJ2Mkkx4/fqGerYrwU/Oz0\r\n4Yi0Lw5TWYZRmyAu8uN6nsMyhxNd3U0cpieWqE9FigHePTxcImXem8zNL0LM\r\nn79PVhoDTIszhTWJ4oLnpbIT1Az5wGUPOq4j2SfzrxGeAVvN89MHidAVzH/J\r\nobQLPSpjuGSpM7pYx1SWqZT7m4jq1nDhxOy569psnCbzWEGVm23t2kCLcK++\r\nc4e/7sP67sYWkuUjciAmW1+i6NxOdT/1rSRWZ1pFYclgRHzza6K77O1X+tF2\r\nBAXqSqwFH+whhM07+2ORISym5KM+hThKIMwzHeUD3vVauIPdX1MWoMNSH98h\r\nqDPzxFJT7XHg3tzebXliZR/JiaSUyC9vaes=\r\n=hD/8\r\n-----END PGP SIGNATURE-----\r\n"},"main":"./build/index.js","types":"./build/index.d.ts","browser":"./browser/index.js","engines":{"node":">=14"},"gitHead":"e7b83b417c276d16ccbb9dedd057f3362e7c8a3e","scripts":{"lint":"eslint --ext .ts,.tsx src/","test":"jest --config=config/jest.config.ts --passWithNoTests","build":"npm run build:browser && npm run build:main","typecheck":"tsc --project tsconfig.json --noEmit","build:main":"tsc --project tsconfig.json --module CommonJS --outDir ./build","build:browser":"tsc --project tsconfig.json --module ESNext --outDir ./browser"},"_npmUser":{"name":"sergiodxa","email":"sergiodxa@gmail.com"},"repository":{"url":"git+https://github.com/sergiodxa/remix-utils.git","type":"git"},"_npmVersion":"8.15.0","description":"This package contains simple utility functions to use with [Remix.run](https://remix.run).","directories":{},"sideEffects":false,"_nodeVersion":"16.17.1","dependencies":{"uuid":"^8.3.2","is-ip":"^3.1.0","type-fest":"^2.5.2","schema-dts":"^1.1.0","intl-parse-accept-language":"^1.0.0"},"_hasShrinkwrap":false,"devDependencies":{"jest":"^27.3.1","react":"^17.0.2","eslint":"^8.12.0","ts-node":"^10.4.0","prettier":"^2.5.1","babel-jest":"^27.3.1","typescript":"^4.2.4","@babel/core":"^7.16.0","@jest/types":"^27.2.5","@types/uuid":"^8.3.3","@types/react":"^17.0.14","@remix-run/node":"^1.1.1","jest-fetch-mock":"^3.0.3","@remix-run/react":"^1.1.1","react-router-dom":"^6.0.0-beta.6","@babel/preset-env":"^7.16.0","eslint-plugin-jest":"^26.1.3","@babel/preset-react":"^7.16.0","eslint-plugin-react":"^7.26.1","eslint-plugin-import":"^2.22.1","eslint-plugin-cypress":"^2.11.3","eslint-plugin-promise":"^6.0.0","eslint-plugin-unicorn":"^41.0.1","@testing-library/react":"^12.1.2","eslint-config-prettier":"^8.3.0","eslint-plugin-jest-dom":"^4.0.1","eslint-plugin-jsx-a11y":"^6.4.1","eslint-plugin-prettier":"^4.0.0","@babel/preset-typescript":"^7.16.0","@remix-run/server-runtime":"^1.1.1","@testing-library/jest-dom":"^5.15.0","@typescript-eslint/parser":"^5.3.0","eslint-plugin-react-hooks":"^4.2.0","eslint-plugin-testing-library":"^5.1.0","@typescript-eslint/eslint-plugin":"^5.3.0","eslint-import-resolver-typescript":"^2.5.0"},"peerDependencies":{"react":"^16.8.0 || ^17.0.0 || ^18.0.0","@remix-run/react":"^1.1.1","@remix-run/server-runtime":"^1.1.1"},"_npmOperationalInternal":{"tmp":"tmp/remix-utils_3.4.0_1666459895220_0.10039819259174454","host":"s3://npm-registry-packages"}},"4.0.0":{"name":"remix-utils","version":"4.0.0","keywords":["remix","remix.run","react","utils","request","response","csrf","redirect-back","outlet","client-only","hydrated","body parser"],"author":{"url":"https://sergiodxa.com","name":"Sergio Xalambrí","email":"hello@sergiodxa.com"},"license":"MIT","_id":"remix-utils@4.0.0","maintainers":[{"name":"sergiodxa","email":"sergiodxa@gmail.com"}],"homepage":"https://github.com/sergiodxa/remix-utils#readme","bugs":{"url":"https://github.com/sergiodxa/remix-utils/issues"},"dist":{"shasum":"1defba34a7b427432c3fda124462eb1a76b25bba","tarball":"https://registry.npmjs.org/remix-utils/-/remix-utils-4.0.0.tgz","fileCount":115,"integrity":"sha512-J+awwyLab1E5qYJxZuKwRWPl+9qBjqt5zYvBGcqapatqpEWvfwpIkuOfWzHp2FcbUqDKHCTpvo4Op3khWGdcpg==","signatures":[{"sig":"MEQCICzbRbJW6Bgtz7Wd+RS1aHEtwD2lD3m+P0PyVsSUKPlQAiAR/i8d5o4wQxBNTaVEVw/gW54YKQ71sK97ltKEQnJAcw==","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":186897,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJjbS7CACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2VmqoGw/7B/xcxq70SdJN9tHf9t+75weM77nTp7/hJJck9g3fC/sF4Gpd\r\nz1JMESBPrpGXMjyAPrE3zICs4e4oYNWd7NP9LT7bgx4tW505yLQfJL9LfKzD\r\nwvncHAN8kesoYFt6+CscLDyIWhoh39EkoFyjzG4d9pcKYtHuD+QGipbt4UYl\r\nCcldCQOLYjCTtZgx/jKqdJYGM8E+0IjW+bYHTyej3TotHtFhhs72dwqQY91c\r\nvf5CQO7hVPWnID4vaS1YbvFpblOjboK7i7I3/GsNBnEgmBGICMoYjfeIhLlU\r\ncsvMPNW9200wgYOqmDmsasqukAr7OEjp4e3gVXx/A6V0jU73rvN4vyUg9nzq\r\nsqK1od2c/OnPU+Yro20hjExpW9ebpQD3JLPrjOPkqTGDEBzFdVJ/lo34KKrK\r\n0RvmL5J2QzyjdOnsZR79f4xefsckjJsI0RWweUKOIy9wcf0GOjahR3M8JJ3N\r\n4NfApfRQvIMnXV/RjYgoSIeiLJtv3bVKmO4QAQt2UKwWytaYHbaBswM4d90T\r\nIGrESWgoN+pIJTWkcujvy6/fCHc6ZDcZoZ3kKzX11kBXqBEi8FuQMbr1jAYM\r\nQr8WjropHsf9EMv//j0w3JFEstXvPvI+Fjvcj4gRYPqgkIBSwbUzzbRgKMAL\r\nmGN8WAquajwI1lpRsJivAZe2CNCHKUHyYRs=\r\n=FvXR\r\n-----END PGP SIGNATURE-----\r\n"},"main":"./build/index.js","types":"./build/index.d.ts","browser":"./browser/index.js","engines":{"node":">=14"},"gitHead":"4e213f11475d573c0eb81e161cc1bf4db0a9e7ec","scripts":{"lint":"eslint --ext .ts,.tsx src/","test":"jest --config=config/jest.config.ts --passWithNoTests","build":"npm run build:browser && npm run build:main","typecheck":"tsc --project tsconfig.json --noEmit","build:main":"tsc --project tsconfig.json --module CommonJS --outDir ./build","build:browser":"tsc --project tsconfig.json --module ESNext --outDir ./browser"},"_npmUser":{"name":"sergiodxa","email":"sergiodxa@gmail.com"},"repository":{"url":"git+https://github.com/sergiodxa/remix-utils.git","type":"git"},"_npmVersion":"8.19.2","description":"This package contains simple utility functions to use with [Remix.run](https://remix.run).","directories":{},"sideEffects":false,"_nodeVersion":"18.12.0","dependencies":{"uuid":"^8.3.2","is-ip":"^3.1.0","type-fest":"^2.5.2","schema-dts":"^1.1.0","intl-parse-accept-language":"^1.0.0"},"_hasShrinkwrap":false,"devDependencies":{"zod":"^3.19.1","jest":"^27.3.1","react":"^17.0.2","eslint":"^8.12.0","ts-node":"^10.4.0","prettier":"^2.5.1","babel-jest":"^27.3.1","typescript":"^4.2.4","@babel/core":"^7.16.0","@jest/types":"^27.2.5","@types/uuid":"^8.3.3","@types/react":"^17.0.14","@remix-run/node":"^1.1.1","jest-fetch-mock":"^3.0.3","@remix-run/react":"^1.1.1","react-router-dom":"^6.0.0-beta.6","@babel/preset-env":"^7.16.0","eslint-plugin-jest":"^26.1.3","@babel/preset-react":"^7.16.0","eslint-plugin-react":"^7.26.1","eslint-plugin-import":"^2.22.1","eslint-plugin-cypress":"^2.11.3","eslint-plugin-promise":"^6.0.0","eslint-plugin-unicorn":"^41.0.1","@testing-library/react":"^12.1.2","eslint-config-prettier":"^8.3.0","eslint-plugin-jest-dom":"^4.0.1","eslint-plugin-jsx-a11y":"^6.4.1","eslint-plugin-prettier":"^4.0.0","@babel/preset-typescript":"^7.16.0","@remix-run/server-runtime":"^1.1.1","@testing-library/jest-dom":"^5.15.0","@typescript-eslint/parser":"^5.3.0","eslint-plugin-react-hooks":"^4.2.0","eslint-plugin-testing-library":"^5.1.0","@typescript-eslint/eslint-plugin":"^5.3.0","eslint-import-resolver-typescript":"^2.5.0"},"peerDependencies":{"zod":"^3.19.1","react":"^16.8.0 || ^17.0.0 || ^18.0.0","@remix-run/react":"^1.1.1","@remix-run/server-runtime":"^1.1.1"},"_npmOperationalInternal":{"tmp":"tmp/remix-utils_4.0.0_1668099778170_0.4298871244024387","host":"s3://npm-registry-packages"}},"4.1.0":{"name":"remix-utils","version":"4.1.0","keywords":["remix","remix.run","react","utils","request","response","csrf","redirect-back","outlet","client-only","hydrated","body parser"],"author":{"url":"https://sergiodxa.com","name":"Sergio Xalambrí","email":"hello@sergiodxa.com"},"license":"MIT","_id":"remix-utils@4.1.0","maintainers":[{"name":"sergiodxa","email":"sergiodxa@gmail.com"}],"homepage":"https://github.com/sergiodxa/remix-utils#readme","bugs":{"url":"https://github.com/sergiodxa/remix-utils/issues"},"dist":{"shasum":"d46cce6661befecdb3ed40269c3215377e719b58","tarball":"https://registry.npmjs.org/remix-utils/-/remix-utils-4.1.0.tgz","fileCount":115,"integrity":"sha512-Ii/+6bd56t2D3ADeXD4RGc3Ym7Yn/rA/n7GZ9naTjF+fire7vqsDhBPwhZV0gIJBLIbw8ZRUlIAg+Ia95+CLBA==","signatures":[{"sig":"MEUCIQD0S03jRmsKUwgMPemUvJ3oNirR32rRzJGblpo7swObhgIgQNnsNjj+SKpX9hpqcWuxKLMy08frHFO7lNjj2eeInzU=","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":189379,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJjcnk8ACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2Vmqp7A/8C6lwRpmysvdwYwAyVFZAS49Ao1RauLvuvrbSCIN0yX9KVODu\r\nhl0E4UL+AOQjQHCvH+nh/THnwkwV7+e3jKXh2NM81NHHRA8blnZkLPkwpMkK\r\nl+7wthx5af4hREbNBthJ7PrhucXYAC3h8pfS+/S0hCcD6FfoJOS/4gdmfEPH\r\nZ4KXgy94bosUsezRauidQ2Pa/y2J8K52uDiSM4l3I87zy3VdeFVmXUsYwOf0\r\niK53/br9ElWUKa5e3WWKZ1GAz/2uJgmyAvEc6wGTeBNrAZ0s+MfCulA/M9vo\r\nLWWY8++W0oSZCYlf8QIg3huyv6t3Peeo6ElaoI8ruVHCD8KwBR8XU4EQGLa1\r\nfvxNH8yDKv2WnFMmbg2PgNAXrKglb5Ouh32a6M/iZVeWBFavG7nPocrtkNJD\r\n+xU4yDLaXz93GxYVO52LBgMTdC1LpR28msbDrIjltiYfM8HDQEjiewnRVV9S\r\nY2myAFlnSNuP8cxRfpP7dPZEk9sC2NTvzAEPcInMtHugQWCLIojgLASHYm0R\r\nb0HhzKIhd1P8JAQgFCWjtVUSwgyyF4LID+2Jv9bdH1JXaJ18j2YzKMRtPWCE\r\nE3doCGYCTsYgaodFeE+cCUvPkxXOQKfMZlud6NC26lKKvPezulpVvO35QIm0\r\n3zXgNy1r75RXIyUQauqQD5OG821KGplf9mk=\r\n=V/ck\r\n-----END PGP SIGNATURE-----\r\n"},"main":"./build/index.js","types":"./build/index.d.ts","browser":"./browser/index.js","engines":{"node":">=14"},"gitHead":"02af80e12829a53696bfa8f3c2363975cf59f55e","scripts":{"lint":"eslint --ext .ts,.tsx src/","test":"jest --config=config/jest.config.ts --passWithNoTests","build":"npm run build:browser && npm run build:main","typecheck":"tsc --project tsconfig.json --noEmit","build:main":"tsc --project tsconfig.json --module CommonJS --outDir ./build","build:browser":"tsc --project tsconfig.json --module ESNext --outDir ./browser"},"_npmUser":{"name":"sergiodxa","email":"sergiodxa@gmail.com"},"repository":{"url":"git+https://github.com/sergiodxa/remix-utils.git","type":"git"},"_npmVersion":"8.19.2","description":"This package contains simple utility functions to use with [Remix.run](https://remix.run).","directories":{},"sideEffects":false,"_nodeVersion":"18.12.0","dependencies":{"uuid":"^8.3.2","is-ip":"^3.1.0","type-fest":"^2.5.2","schema-dts":"^1.1.0","intl-parse-accept-language":"^1.0.0"},"_hasShrinkwrap":false,"devDependencies":{"zod":"^3.19.1","jest":"^27.3.1","react":"^17.0.2","eslint":"^8.12.0","ts-node":"^10.4.0","prettier":"^2.5.1","babel-jest":"^27.3.1","typescript":"^4.2.4","@babel/core":"^7.16.0","@jest/types":"^27.2.5","@types/uuid":"^8.3.3","@types/react":"^17.0.14","@remix-run/node":"^1.1.1","jest-fetch-mock":"^3.0.3","@remix-run/react":"^1.1.1","react-router-dom":"^6.0.0-beta.6","@babel/preset-env":"^7.16.0","eslint-plugin-jest":"^26.1.3","@babel/preset-react":"^7.16.0","eslint-plugin-react":"^7.26.1","eslint-plugin-import":"^2.22.1","eslint-plugin-cypress":"^2.11.3","eslint-plugin-promise":"^6.0.0","eslint-plugin-unicorn":"^41.0.1","@testing-library/react":"^12.1.2","eslint-config-prettier":"^8.3.0","eslint-plugin-jest-dom":"^4.0.1","eslint-plugin-jsx-a11y":"^6.4.1","eslint-plugin-prettier":"^4.0.0","@babel/preset-typescript":"^7.16.0","@remix-run/server-runtime":"^1.1.1","@testing-library/jest-dom":"^5.15.0","@typescript-eslint/parser":"^5.3.0","eslint-plugin-react-hooks":"^4.2.0","eslint-plugin-testing-library":"^5.1.0","@typescript-eslint/eslint-plugin":"^5.3.0","eslint-import-resolver-typescript":"^2.5.0"},"peerDependencies":{"zod":"^3.19.1","react":"^16.8.0 || ^17.0.0 || ^18.0.0","@remix-run/react":"^1.1.1","@remix-run/server-runtime":"^1.1.1"},"_npmOperationalInternal":{"tmp":"tmp/remix-utils_4.1.0_1668446524489_0.4911844147133311","host":"s3://npm-registry-packages"}},"4.2.0":{"name":"remix-utils","version":"4.2.0","keywords":["remix","remix.run","react","utils","request","response","csrf","redirect-back","outlet","client-only","hydrated","body parser"],"author":{"url":"https://sergiodxa.com","name":"Sergio Xalambrí","email":"hello@sergiodxa.com"},"license":"MIT","_id":"remix-utils@4.2.0","maintainers":[{"name":"sergiodxa","email":"sergiodxa@gmail.com"}],"homepage":"https://github.com/sergiodxa/remix-utils#readme","bugs":{"url":"https://github.com/sergiodxa/remix-utils/issues"},"dist":{"shasum":"3f43e095f3a6cec3348d2cedd6a6847076f99132","tarball":"https://registry.npmjs.org/remix-utils/-/remix-utils-4.2.0.tgz","fileCount":123,"integrity":"sha512-L+e8Cm1mPPPYIh+VU711U0L0D3vt7YFu4/q4bzLG6FZhdpxcjwjOGst4WZZf71xKrfiFdogcXZc37ddiMPb0ow==","signatures":[{"sig":"MEUCIEzbIbP7CxtRe8upZ0fUl7PQUR+dsuMTPBa8vM2lOPTHAiEA/adgKnf6ruO2ReoA5rPo1qfhSby2Ee3lwsZFNw9gHS4=","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":198450,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJjgTf0ACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2VmqMgg//StLIDe7+q7bYNGF//d9g2wQmCx4dr2Snbnpd4M8kRO2n67m/\r\nR9EMns33ZWwJiVEJ+les2akR0UKuFGIL5wWx2AekJxvENuiPfI+Fd3TvJ1yi\r\nX8q0tM1Rb9TLVwfZMCH0JAshBpUXA/N/bVL/FT2OW1+tPfcS8wJ8ToGxcrLb\r\nTmqIWo9db3m1+/QhmpfqLWdRRReRqXpSmkbY8C3UIiKXEnzRO9o2vegWsCd/\r\npWtGx1g/3mlmIcQJ53EX0lpuzZ/tVu4bGljpXqUn2716ENG/wJ/2RuN9XZfZ\r\niEiuDjt8v2ojcMf5rO+48gLRQiFnU0KUWaxDa2haOi4AutSBKtnTmIs2FJ0y\r\nh9UbHZ1+/7dg6I0Tqen4JDtMj+/MZg2uc+y1c/7mxgOAqsZECkuRsSBhtVhX\r\nUCjpkH6SRtICo7JkYyr8ad+PVPuD2fa71L694E9xvSxqLBuV3H0zf6dhGF/v\r\nzjG07E0gDmvi4ksMU7y8b23iKlsDLgDJlsSDCDLyLR6u7z9/zASMmUqO8W5s\r\nFlrRXxxz6WRrwEc+cKgfepYCPdPri0eh8nAIsT+KQB9T2rTzdGBBETIhJdn1\r\nffCWob7B/y2jFiRxUspnGDrXU//C4deNcAVeYPB3odNPbvVSX/XvMnrTYcK0\r\n9Ym4o/Z+KM+xcaGrVCAmbsPdTgev9JqBpE4=\r\n=nvVn\r\n-----END PGP SIGNATURE-----\r\n"},"main":"./build/index.js","types":"./build/index.d.ts","browser":"./browser/index.js","engines":{"node":">=14"},"gitHead":"860535a12fe99be3fb9445e2408f5642fa163e5e","scripts":{"lint":"eslint --ext .ts,.tsx src/","test":"jest --config=config/jest.config.ts --passWithNoTests","build":"npm run build:browser && npm run build:main","typecheck":"tsc --project tsconfig.json --noEmit","build:main":"tsc --project tsconfig.json --module CommonJS --outDir ./build","build:browser":"tsc --project tsconfig.json --module ESNext --outDir ./browser"},"_npmUser":{"name":"sergiodxa","email":"sergiodxa@gmail.com"},"repository":{"url":"git+https://github.com/sergiodxa/remix-utils.git","type":"git"},"_npmVersion":"8.19.2","description":"This package contains simple utility functions to use with [Remix.run](https://remix.run).","directories":{},"sideEffects":false,"_nodeVersion":"18.12.1","dependencies":{"uuid":"^8.3.2","is-ip":"^3.1.0","type-fest":"^2.5.2","schema-dts":"^1.1.0","intl-parse-accept-language":"^1.0.0"},"_hasShrinkwrap":false,"devDependencies":{"zod":"^3.19.1","jest":"^27.3.1","react":"^17.0.2","eslint":"^8.12.0","ts-node":"^10.4.0","prettier":"^2.5.1","react-dom":"^17.0.2","babel-jest":"^27.3.1","typescript":"^4.2.4","@babel/core":"^7.16.0","@jest/types":"^27.2.5","@types/uuid":"^8.3.3","@types/react":"^17.0.14","@remix-run/node":"^1.1.1","jest-fetch-mock":"^3.0.3","@remix-run/react":"^1.1.1","react-router-dom":"6.3.0","@babel/preset-env":"^7.16.0","eslint-plugin-jest":"^26.1.3","@babel/preset-react":"^7.16.0","eslint-plugin-react":"^7.26.1","eslint-plugin-import":"^2.22.1","eslint-plugin-cypress":"^2.11.3","eslint-plugin-promise":"^6.0.0","eslint-plugin-unicorn":"^41.0.1","@testing-library/react":"^12.1.2","eslint-config-prettier":"^8.3.0","eslint-plugin-jest-dom":"^4.0.1","eslint-plugin-jsx-a11y":"^6.4.1","eslint-plugin-prettier":"^4.0.0","@babel/preset-typescript":"^7.16.0","@remix-run/server-runtime":"^1.1.1","@testing-library/jest-dom":"^5.15.0","@typescript-eslint/parser":"^5.3.0","eslint-plugin-react-hooks":"^4.2.0","eslint-plugin-testing-library":"^5.1.0","@typescript-eslint/eslint-plugin":"^5.3.0","eslint-import-resolver-typescript":"^2.5.0"},"peerDependencies":{"zod":"^3.19.1","react":"^16.8.0 || ^17.0.0 || ^18.0.0","@remix-run/react":"^1.1.1","@remix-run/server-runtime":"^1.1.1"},"_npmOperationalInternal":{"tmp":"tmp/remix-utils_4.2.0_1669412851752_0.35623797855500805","host":"s3://npm-registry-packages"}},"4.2.1":{"name":"remix-utils","version":"4.2.1","keywords":["remix","remix.run","react","utils","request","response","csrf","redirect-back","outlet","client-only","hydrated","body parser"],"author":{"url":"https://sergiodxa.com","name":"Sergio Xalambrí","email":"hello@sergiodxa.com"},"license":"MIT","_id":"remix-utils@4.2.1","maintainers":[{"name":"sergiodxa","email":"sergiodxa@gmail.com"}],"homepage":"https://github.com/sergiodxa/remix-utils#readme","bugs":{"url":"https://github.com/sergiodxa/remix-utils/issues"},"dist":{"shasum":"fd89f0d46c4ff442564130b7d8a141c058d7c52a","tarball":"https://registry.npmjs.org/remix-utils/-/remix-utils-4.2.1.tgz","fileCount":123,"integrity":"sha512-Eb8U186H87sirVr852Sc7K3au/ZCScfur8AFquLF2x89tEeXIcrrhF8zt2tyeH6E4m0CH+STAJeDqFVx0knTLA==","signatures":[{"sig":"MEQCIAoB8JaKpsASZEpGRJmRPXcxGWyJejr+I1jQcPsAiArIAiASUZUdBKQ0ysmSbkSHN/em03e64TvTYxyc/7uENnLG2g==","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":198278,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJjgUtAACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2VmrIkA//aWMVJfDfEeZ7UvFWrbj5I7L4sVOUtZqhhyqIi82vAc6UREKc\r\ntXZwMAzmUNWZ7XPHKeiAq8YIYlYZSs0EytC2Wtnc4NBOOK/96y1Dqj1ayHky\r\nGfiwwY9hW2sGjF/QnvOwjP5t72ogGxHgRqfMHtkY4nCdzRVRLrUE+91VkCeq\r\n14nLUwn1KYmPLRead1p4FhEoCi0B8tFc5LY8BFbR42ibS+zlzWGwUDMsBhjl\r\n8/TBgcIci+bjTUUZS6PI0uKEEWCDHf16i4jK3HbniyaddDLDX97GfflPBmof\r\ntghIQnuzDvouoIQ+XJWvrM5owG7NaBk5JmCNDr3LcNYsc3AvC2tQW5QKYCi+\r\nH7Bf3BP/uXb/6bIVBBgX1rNPC84yronlSd9G+HRjDOTMcSLKl2x8EhYYgSIg\r\neZ0tdGTUXpS876py+q3ihX/SY9P+ZqXlAtl8nU0qoQgYcpHNX3jAAuqqC44l\r\nT126wDWGbOxqFvunetBF+IFislIyL4QKY/yWEYCsXmNgQ2wYc42Z3FE7Cvwu\r\nPKKzGzyE6DQ3x34gDkgevjO+q8wzbFuJTuXu47kMycr+M3AMEaBs2B711yM+\r\nEaI0IsosDnaQuSqOcO8hxMkzEVOGw9a9Bk5BABjDyMTkAbQTFe3Y1+sdBovs\r\neN1TI8oe/AnNZA4ctQrroo4uYLZYCdBCBqY=\r\n=veh5\r\n-----END PGP SIGNATURE-----\r\n"},"main":"./build/index.js","types":"./build/index.d.ts","browser":"./browser/index.js","engines":{"node":">=14"},"gitHead":"ca97c8caf6baf13394d55bdcb1ce22bb8108de8d","scripts":{"lint":"eslint --ext .ts,.tsx src/","test":"jest --config=config/jest.config.ts --passWithNoTests","build":"npm run build:browser && npm run build:main","typecheck":"tsc --project tsconfig.json --noEmit","build:main":"tsc --project tsconfig.json --module CommonJS --outDir ./build","build:browser":"tsc --project tsconfig.json --module ESNext --outDir ./browser"},"_npmUser":{"name":"sergiodxa","email":"sergiodxa@gmail.com"},"repository":{"url":"git+https://github.com/sergiodxa/remix-utils.git","type":"git"},"_npmVersion":"8.19.2","description":"This package contains simple utility functions to use with [Remix.run](https://remix.run).","directories":{},"sideEffects":false,"_nodeVersion":"18.12.1","dependencies":{"uuid":"^8.3.2","is-ip":"^3.1.0","type-fest":"^2.5.2","schema-dts":"^1.1.0","intl-parse-accept-language":"^1.0.0"},"_hasShrinkwrap":false,"devDependencies":{"zod":"^3.19.1","jest":"^27.3.1","react":"^17.0.2","eslint":"^8.12.0","ts-node":"^10.4.0","prettier":"^2.5.1","react-dom":"^17.0.2","babel-jest":"^27.3.1","typescript":"^4.2.4","@babel/core":"^7.16.0","@jest/types":"^27.2.5","@types/uuid":"^8.3.3","@types/react":"^17.0.14","@remix-run/node":"^1.1.1","jest-fetch-mock":"^3.0.3","@remix-run/react":"^1.1.1","react-router-dom":"6.3.0","@babel/preset-env":"^7.16.0","eslint-plugin-jest":"^26.1.3","@babel/preset-react":"^7.16.0","eslint-plugin-react":"^7.26.1","eslint-plugin-import":"^2.22.1","eslint-plugin-cypress":"^2.11.3","eslint-plugin-promise":"^6.0.0","eslint-plugin-unicorn":"^41.0.1","@testing-library/react":"^12.1.2","eslint-config-prettier":"^8.3.0","eslint-plugin-jest-dom":"^4.0.1","eslint-plugin-jsx-a11y":"^6.4.1","eslint-plugin-prettier":"^4.0.0","@babel/preset-typescript":"^7.16.0","@remix-run/server-runtime":"^1.1.1","@testing-library/jest-dom":"^5.15.0","@typescript-eslint/parser":"^5.3.0","eslint-plugin-react-hooks":"^4.2.0","eslint-plugin-testing-library":"^5.1.0","@typescript-eslint/eslint-plugin":"^5.3.0","eslint-import-resolver-typescript":"^2.5.0"},"peerDependencies":{"zod":"^3.19.1","react":"^16.8.0 || ^17.0.0 || ^18.0.0","@remix-run/react":"^1.1.1","@remix-run/server-runtime":"^1.1.1"},"_npmOperationalInternal":{"tmp":"tmp/remix-utils_4.2.1_1669417792661_0.5164489334727878","host":"s3://npm-registry-packages"}},"4.3.0":{"name":"remix-utils","version":"4.3.0","keywords":["remix","remix.run","react","utils","request","response","csrf","redirect-back","outlet","client-only","hydrated","body parser"],"author":{"url":"https://sergiodxa.com","name":"Sergio Xalambrí","email":"hello@sergiodxa.com"},"license":"MIT","_id":"remix-utils@4.3.0","maintainers":[{"name":"sergiodxa","email":"sergiodxa@gmail.com"}],"homepage":"https://github.com/sergiodxa/remix-utils#readme","bugs":{"url":"https://github.com/sergiodxa/remix-utils/issues"},"dist":{"shasum":"ca574152e6d500ea303b3effaa50f7a8d36e8009","tarball":"https://registry.npmjs.org/remix-utils/-/remix-utils-4.3.0.tgz","fileCount":127,"integrity":"sha512-Fjph3pc1jdFdZRd3bXZnFlB/rQEGvQumZYmLkGhPYYsGU0He6coqJ3sKH212co3gScqXXdJQASPqXE+HfQgnwA==","signatures":[{"sig":"MEUCIHTCt4zVlAGeYVHtWfFh/G3/c0vnsZkVWybF4er0nDHyAiEA5hkGZaD7YB807TbAhuQJB2NabjaE2K/8m3AtueKiHRI=","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":201621,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJjiQ3ZACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2Vmql9A/+J1xvzEYn/LDeWP8dvoIly4SRd0vEybZEIqOqnqCuxDL6+fS2\r\nHTOJDF8FcGizxjonckNhGCxEOIxfbzaq0ukJGbcjXEGj4j3xDMJaqfSbzevT\r\nelQ7cWQekjWfD2ifklzUxzFIM1vj1GEzGpOlBu4gRgWJOUPMbeg3RR4L57Ru\r\nzHc8qSSIJKIbBhLBtnjUFNAKvZR4UGDlPw0WoHYdlggzDCohdrt9lY/fuT8Q\r\nETcwRDBbat8szbJitZwlMIXIW0lvryIs5P0Ccq8c/D297bbQW2Sg6MrD2iAG\r\nFpojUjolegIurp9O5G8Iy/3gUa2kBGo1eMvx31HW2iXrsTMzKSw5LDK4zpo2\r\nHxW5nJIODhEOecrrLuMxKPuqBk1c19Z28SfWWXJwIUlJbCujjTFEeofSTUDM\r\n/keTgafzJb5fyg4cikAoeOhnLnhLFn7Pi//3DVM4e9uhyVe8hp70Lp1QoNOP\r\nRkQYoV1OqZGL5cpUpO5wnpuDI0vGGc7BNom+EjuwV6kVP/hhHOw4HNni63Hj\r\nx2rRwdnGWc7IlHh6o6LkY/6j8Q6PlqFo1rsYTYvOSmKQX8qh8AdoNvcvj75S\r\nPTM0uT0nYgdZfuC9+LAEq4ATTOGSmNrhSBftfDXNByJ+kuRKctSNqqKjGmPz\r\nT4Q3pMHNPNl9fqe8mtpZUIkPRWtJDwL/uEI=\r\n=pmBE\r\n-----END PGP SIGNATURE-----\r\n"},"main":"./build/index.js","types":"./build/index.d.ts","browser":"./browser/index.js","engines":{"node":">=14"},"gitHead":"2d902e45ec9724202eb62f4467fbb26b8540c440","scripts":{"lint":"eslint --ext .ts,.tsx src/","test":"jest --config=config/jest.config.ts --passWithNoTests","build":"npm run build:browser && npm run build:main","typecheck":"tsc --project tsconfig.json --noEmit","build:main":"tsc --project tsconfig.json --module CommonJS --outDir ./build","build:browser":"tsc --project tsconfig.json --module ESNext --outDir ./browser"},"_npmUser":{"name":"sergiodxa","email":"sergiodxa@gmail.com"},"repository":{"url":"git+https://github.com/sergiodxa/remix-utils.git","type":"git"},"_npmVersion":"8.19.2","description":"This package contains simple utility functions to use with [Remix.run](https://remix.run).","directories":{},"sideEffects":false,"_nodeVersion":"18.12.1","dependencies":{"uuid":"^8.3.2","is-ip":"^3.1.0","type-fest":"^2.5.2","schema-dts":"^1.1.0","intl-parse-accept-language":"^1.0.0"},"_hasShrinkwrap":false,"devDependencies":{"zod":"^3.19.1","jest":"^27.3.1","react":"^17.0.2","eslint":"^8.12.0","ts-node":"^10.4.0","prettier":"^2.5.1","react-dom":"^17.0.2","babel-jest":"^27.3.1","typescript":"^4.2.4","@babel/core":"^7.16.0","@jest/types":"^27.2.5","@types/uuid":"^8.3.3","@types/react":"^17.0.14","@remix-run/node":"^1.1.1","jest-fetch-mock":"^3.0.3","@remix-run/react":"^1.1.1","react-router-dom":"6.3.0","@babel/preset-env":"^7.16.0","eslint-plugin-jest":"^26.1.3","@babel/preset-react":"^7.16.0","eslint-plugin-react":"^7.26.1","eslint-plugin-import":"^2.22.1","eslint-plugin-cypress":"^2.11.3","eslint-plugin-promise":"^6.0.0","eslint-plugin-unicorn":"^41.0.1","@testing-library/react":"^12.1.2","eslint-config-prettier":"^8.3.0","eslint-plugin-jest-dom":"^4.0.1","eslint-plugin-jsx-a11y":"^6.4.1","eslint-plugin-prettier":"^4.0.0","@babel/preset-typescript":"^7.16.0","@remix-run/server-runtime":"^1.1.1","@testing-library/jest-dom":"^5.15.0","@typescript-eslint/parser":"^5.3.0","eslint-plugin-react-hooks":"^4.2.0","eslint-plugin-testing-library":"^5.1.0","@typescript-eslint/eslint-plugin":"^5.3.0","eslint-import-resolver-typescript":"^2.5.0"},"peerDependencies":{"zod":"^3.19.1","react":"^16.8.0 || ^17.0.0 || ^18.0.0","@remix-run/react":"^1.1.1","@remix-run/server-runtime":"^1.1.1"},"_npmOperationalInternal":{"tmp":"tmp/remix-utils_4.3.0_1669926361597_0.570227131325926","host":"s3://npm-registry-packages"}},"4.4.0":{"name":"remix-utils","version":"4.4.0","keywords":["remix","remix.run","react","utils","request","response","csrf","redirect-back","outlet","client-only","hydrated","body parser"],"author":{"url":"https://sergiodxa.com","name":"Sergio Xalambrí","email":"hello@sergiodxa.com"},"license":"MIT","_id":"remix-utils@4.4.0","maintainers":[{"name":"sergiodxa","email":"sergiodxa@gmail.com"}],"homepage":"https://github.com/sergiodxa/remix-utils#readme","bugs":{"url":"https://github.com/sergiodxa/remix-utils/issues"},"dist":{"shasum":"887714b082b33a2b75d1b290c24c051c30d8aa1c","tarball":"https://registry.npmjs.org/remix-utils/-/remix-utils-4.4.0.tgz","fileCount":131,"integrity":"sha512-jzpth8AyNUOKsJaV1+ar+bbv6kvPEG2z74abTKRaTAqLOZr5r8UBYZr3ERkefWUdjjFnY45rfQZA5oIiZ3lIQg==","signatures":[{"sig":"MEQCIFuCMqZL8WQ1sz62DWlba9FfHjrDpW9torIHRTRpC7W4AiBd8Tr7MSpll8wJ2qKkg57WJ2Z5kd4gZ+8d5G4+2O+AFg==","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":210017,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJjk7UwACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2VmpQOw/+ItuVQExZRP60uspFozmiYEDglloo0AX2DvCSSmcjNa9ZHfxM\r\nGtB67dgwYVjb+msbARs7K3Anz0FZzKzjgIhDBSwXX9HG3rRV0YVsrHiq/+bp\r\ng0dmPse4M06uvZvMd0LN+jJxJOE/zKP5ilAhN8SVgVzAroFNZTFBrnAjMYO7\r\nyqb06WLzt+6alG1wX2eMi1aKOlKTY0NT6mb1AnnOxSDpAd96xBVv5jL380+s\r\nCFfyulzu7A6iJVYJwVXKgFzvkfOqDEPnGlxxeH0T1dCQpykwRPyg8mM61ubj\r\nFaMhhpAB1BHKMp/bGp1Mr2b1e29UcXVncpc6WbyFlkiZ+Ejj/Bj8Ua5GhJyH\r\nqkRH0ncUGsymZlqF3mm+rHb+pNqvjg8JYwG+LjRwMfyp2yXzWWuKYbTws7hW\r\nJdy5HvzCf3FjLvEhCJZH1GZQqelB30y3gsoMUC0pV2eauaMj0gVd57bXLaWW\r\n4uycfpC5C7G6fgKOpBO/++Fpu6JzExN9flbRonsdq1hOrVKuIlbFBEYkkcGe\r\n7fS1G7row0srbfTkdR0u9ASkt6MSfKkS+n5D/vJDmocuM0j9D/Rp0mUsQHQ8\r\nd6QqALghYt5y6v+XUchFb+j4APIpiiCUM0pNatIvZ+Oc3SZ71lW7Akq41+hB\r\nfekzzl0BcMeGjTAtS/ARPyUkspxx09ww9zU=\r\n=/C0P\r\n-----END PGP SIGNATURE-----\r\n"},"main":"./build/index.js","types":"./build/index.d.ts","browser":"./browser/index.js","engines":{"node":">=14"},"gitHead":"ce314d5245ce2cc0e5c1cae188241e8bd7af0c13","scripts":{"lint":"eslint --ext .ts,.tsx src/","test":"jest --config=config/jest.config.ts --passWithNoTests","build":"npm run build:browser && npm run build:main","typecheck":"tsc --project tsconfig.json --noEmit","build:main":"tsc --project tsconfig.json --module CommonJS --outDir ./build","build:browser":"tsc --project tsconfig.json --module ESNext --outDir ./browser"},"_npmUser":{"name":"sergiodxa","email":"sergiodxa@gmail.com"},"repository":{"url":"git+https://github.com/sergiodxa/remix-utils.git","type":"git"},"_npmVersion":"8.19.2","description":"This package contains simple utility functions to use with [Remix.run](https://remix.run).","directories":{},"sideEffects":false,"_nodeVersion":"18.12.1","dependencies":{"uuid":"^8.3.2","is-ip":"^3.1.0","type-fest":"^2.5.2","schema-dts":"^1.1.0","intl-parse-accept-language":"^1.0.0"},"_hasShrinkwrap":false,"devDependencies":{"zod":"^3.19.1","jest":"^27.3.1","react":"^17.0.2","eslint":"^8.12.0","ts-node":"^10.4.0","prettier":"^2.5.1","react-dom":"^17.0.2","babel-jest":"^27.3.1","typescript":"^4.2.4","@babel/core":"^7.16.0","@jest/types":"^27.2.5","@types/uuid":"^8.3.3","@types/react":"^17.0.14","@remix-run/node":"^1.1.1","jest-fetch-mock":"^3.0.3","@remix-run/react":"^1.1.1","react-router-dom":"6.3.0","@babel/preset-env":"^7.16.0","eslint-plugin-jest":"^26.1.3","@babel/preset-react":"^7.16.0","eslint-plugin-react":"^7.26.1","eslint-plugin-import":"^2.22.1","eslint-plugin-cypress":"^2.11.3","eslint-plugin-promise":"^6.0.0","eslint-plugin-unicorn":"^41.0.1","@testing-library/react":"^12.1.2","eslint-config-prettier":"^8.3.0","eslint-plugin-jest-dom":"^4.0.1","eslint-plugin-jsx-a11y":"^6.4.1","eslint-plugin-prettier":"^4.0.0","@babel/preset-typescript":"^7.16.0","@remix-run/server-runtime":"^1.1.1","@testing-library/jest-dom":"^5.15.0","@typescript-eslint/parser":"^5.3.0","eslint-plugin-react-hooks":"^4.2.0","eslint-plugin-testing-library":"^5.1.0","@typescript-eslint/eslint-plugin":"^5.3.0","eslint-import-resolver-typescript":"^2.5.0"},"peerDependencies":{"zod":"^3.19.1","react":"^16.8.0 || ^17.0.0 || ^18.0.0","@remix-run/react":"^1.1.1","@remix-run/server-runtime":"^1.1.1"},"_npmOperationalInternal":{"tmp":"tmp/remix-utils_4.4.0_1670624560687_0.21538140202746558","host":"s3://npm-registry-packages"}},"5.0.0":{"name":"remix-utils","version":"5.0.0","keywords":["remix","remix.run","react","utils","request","response","csrf","redirect-back","outlet","client-only","hydrated","body parser"],"author":{"url":"https://sergiodxa.com","name":"Sergio Xalambrí","email":"hello@sergiodxa.com"},"license":"MIT","_id":"remix-utils@5.0.0","maintainers":[{"name":"sergiodxa","email":"sergiodxa@gmail.com"}],"homepage":"https://github.com/sergiodxa/remix-utils#readme","bugs":{"url":"https://github.com/sergiodxa/remix-utils/issues"},"dist":{"shasum":"b8936d0b309f4cd373492905fa4db346c2190a63","tarball":"https://registry.npmjs.org/remix-utils/-/remix-utils-5.0.0.tgz","fileCount":131,"integrity":"sha512-cfuD4BGifTfhrwOFdGDf86eBonQ3I692xyqE/n3IiGJ3gS70NONty6lZqnzDcjbrhi7A3TZQ77emy7rC5a8RPw==","signatures":[{"sig":"MEQCIBijUd9/vTChWqqGsecRxWMMvKjOLAVOiXflxZA7rzWDAiBCti5ue08Yije7IF8BcP1xD68vXMlJzlP1HioOZgnz0Q==","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":210628,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJjlPqlACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2VmqA/A//TVYPoZKjavsh6qLtHIkqLNuXsGjLfog7itt1ZyGvAQpAxzLv\r\ngSc1OZGRa5iihFbfnRFEss05e/6rvJnhh1abU5ZwJh5e/Mxac6TJEOhmhtj5\r\n8MNKaNOGNNs82RXjv/KuQbHUqGePfz22Qb2ApD1uNBPJOyRz0t9t/ZBt8KeV\r\nUHJ6X1TmyCLFyH2LrJuVj6e51zseW3PHbM2Aocmq9488xUDjdF1TmwAJzs1B\r\nMBaN9yMOb87tu5x99Z2cUjt77k2J4O0BxX/D9nFKIGWdbkWgqkvt4hT1mipi\r\nhMSrPt9J8kJCTJKpx/GroORFko6q5n7PijIm2sgF2Lo1PbUZ3gzglXw11Jea\r\n7Fu00JnaUd0n6UiQL7Q0PUqWzKb11DRt/QwpnJmKmqCaSYZN4l+P+wsXdLvV\r\nzA0GSJHZrZMu24FqH3r5InzJUqiZq0tD1p+YJkj6ag4ntelBtMvhSr6QEZbn\r\nL2SA4ArqlCIINc+qlLioVO3O7nItsmC/Hf6fpsTNgOVTuF7RvlFNlUxUSZRC\r\nvtQa397igu6wNn8fdzXZr426EiR/g2YulgbtLvmAvmoUaoK1McVE0E0P2HfT\r\nufiVnhm2shQFnsKFZ3Bxlb2SAZkWaGrxG8V4dj9PeD55axHduYwdqaIeHQ4T\r\nY5M070ddHl/VnN2LcEXH8PbXRR9/Jd8kyBg=\r\n=3J95\r\n-----END PGP SIGNATURE-----\r\n"},"main":"./build/index.js","types":"./build/index.d.ts","browser":"./browser/index.js","engines":{"node":">=14"},"gitHead":"360609e6bc0b8d2948db9ec65cc95111ec88e5a9","scripts":{"lint":"eslint --ext .ts,.tsx src/","test":"jest --config=config/jest.config.ts --passWithNoTests","build":"npm run build:browser && npm run build:main","typecheck":"tsc --project tsconfig.json --noEmit","build:main":"tsc --project tsconfig.json --module CommonJS --outDir ./build","build:browser":"tsc --project tsconfig.json --module ESNext --outDir ./browser"},"_npmUser":{"name":"sergiodxa","email":"sergiodxa@gmail.com"},"repository":{"url":"git+https://github.com/sergiodxa/remix-utils.git","type":"git"},"_npmVersion":"8.19.2","description":"This package contains simple utility functions to use with [Remix.run](https://remix.run).","directories":{},"sideEffects":false,"_nodeVersion":"18.12.1","dependencies":{"uuid":"^8.3.2","is-ip":"^3.1.0","type-fest":"^2.5.2","schema-dts":"^1.1.0","intl-parse-accept-language":"^1.0.0"},"_hasShrinkwrap":false,"devDependencies":{"zod":"^3.19.1","jest":"^27.3.1","react":"^17.0.2","eslint":"^8.12.0","ts-node":"^10.4.0","prettier":"^2.5.1","react-dom":"^17.0.2","babel-jest":"^27.3.1","typescript":"^4.2.4","@babel/core":"^7.16.0","@jest/types":"^27.2.5","@types/uuid":"^8.3.3","@types/react":"^17.0.14","@remix-run/node":"^1.5.1","jest-fetch-mock":"^3.0.3","@remix-run/react":"^1.5.1","react-router-dom":"6.3.0","@babel/preset-env":"^7.16.0","eslint-plugin-jest":"^26.1.3","@babel/preset-react":"^7.16.0","eslint-plugin-react":"^7.26.1","eslint-plugin-import":"^2.22.1","eslint-plugin-cypress":"^2.11.3","eslint-plugin-promise":"^6.0.0","eslint-plugin-unicorn":"^41.0.1","@testing-library/react":"^12.1.2","eslint-config-prettier":"^8.3.0","eslint-plugin-jest-dom":"^4.0.1","eslint-plugin-jsx-a11y":"^6.4.1","eslint-plugin-prettier":"^4.0.0","@babel/preset-typescript":"^7.16.0","@remix-run/server-runtime":"^1.5.1","@testing-library/jest-dom":"^5.15.0","@typescript-eslint/parser":"^5.3.0","eslint-plugin-react-hooks":"^4.2.0","eslint-plugin-testing-library":"^5.1.0","@typescript-eslint/eslint-plugin":"^5.3.0","eslint-import-resolver-typescript":"^2.5.0"},"peerDependencies":{"zod":"^3.19.1","react":"^16.8.0 || ^17.0.0 || ^18.0.0","@remix-run/react":"^1.5.1","@remix-run/server-runtime":"^1.5.1"},"_npmOperationalInternal":{"tmp":"tmp/remix-utils_5.0.0_1670707877116_0.5165976263164009","host":"s3://npm-registry-packages"}},"5.0.1":{"name":"remix-utils","version":"5.0.1","keywords":["remix","remix.run","react","utils","request","response","csrf","redirect-back","outlet","client-only","hydrated","body parser"],"author":{"url":"https://sergiodxa.com","name":"Sergio Xalambrí","email":"hello@sergiodxa.com"},"license":"MIT","_id":"remix-utils@5.0.1","maintainers":[{"name":"sergiodxa","email":"sergiodxa@gmail.com"}],"homepage":"https://github.com/sergiodxa/remix-utils#readme","bugs":{"url":"https://github.com/sergiodxa/remix-utils/issues"},"dist":{"shasum":"4d485ab954a67830379830451976243f0c59acc2","tarball":"https://registry.npmjs.org/remix-utils/-/remix-utils-5.0.1.tgz","fileCount":131,"integrity":"sha512-knt8pmcWECIurYlR+gTOaNF8AkfIlAjOyS5/kPMVkIXt16BjfjyPMG6HrAK1Npvl1cpURq623PBrfGezvBeXFg==","signatures":[{"sig":"MEYCIQCnhT0bbnk6ija2xpg8aJA56Xb5RaC0Pgns5DxCymb3cgIhAP7INPI3MFbmRTM4nwvGCDTgKdsl+QhFHnF+x4f8dNgK","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":210646,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJjl0rFACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2VmopWA/+MVhLrInZR/9insuiRlq33J5oPbv3A8h2o+K5QvDrR4nWKTVC\r\nWxKHVI2ZoHrq7J2gGn3pLB0aTgLwrUHcMnZe9lNeis31xrfKVdNWzyQHyeWV\r\nnUIHXH60A+bzNcZ4knOd3Y0/1ji9Y49Spw6LE0SGWpKp41IP3bZcFzhWLQEm\r\n0bZUBLfwE66yyvx/9FqeonL1RQ60mXrlQNlv3xqs3eOCwPf25KRi+NeluKNM\r\nRhcsZ82w0OR2jt1N66lPCA407gmEjZx9ml1Lc2mQrGuu2BsbrVJl+4tzIOsT\r\nwBU9FEq29I6miHHEgu14CKrj19dZw51JdiF5mnyRKa34r74WEiuFMevKjkRz\r\nEl2TlqIJ2EicU9X0eaSPJX4FbSnuGdVNof3af+fyBbCDV8J3spIxgPZORG5X\r\nH2TCA9PKjg0GZRmiQz7SnPbiVMI5vZIghcErZ3wiYYO93E9veLhKUGq0AMgf\r\n3imLFI1YS9cM/D+qsxxWt+S0e2g7BFxfpVyhRDlBgyTT/l7PObtEzEkfSjnU\r\nujoAUdT0OG13uv0SBx+TL0DEPxfWtCBDZUsWxDdniIcsULFqvBLyDvLBxbmG\r\nbqRTn6qG5/7F8bYjiJIsfU4rGlhicMwufCPksU9pCT2JAJahU5EvXkzyT11y\r\nBb8vuTrP3VHt7lEBOlGYv4ACzoLAul+9/QA=\r\n=nIFg\r\n-----END PGP SIGNATURE-----\r\n"},"main":"./build/index.js","types":"./build/index.d.ts","browser":"./browser/index.js","engines":{"node":">=14"},"gitHead":"6c263b0746ba18d5e94fd7a4cc8238d2c6ac86a3","scripts":{"lint":"eslint --ext .ts,.tsx src/","test":"jest --config=config/jest.config.ts --passWithNoTests","build":"npm run build:browser && npm run build:main","typecheck":"tsc --project tsconfig.json --noEmit","build:main":"tsc --project tsconfig.json --module CommonJS --outDir ./build","build:browser":"tsc --project tsconfig.json --module ESNext --outDir ./browser"},"_npmUser":{"name":"sergiodxa","email":"sergiodxa@gmail.com"},"repository":{"url":"git+https://github.com/sergiodxa/remix-utils.git","type":"git"},"_npmVersion":"8.19.2","description":"This package contains simple utility functions to use with [Remix.run](https://remix.run).","directories":{},"sideEffects":false,"_nodeVersion":"18.12.1","dependencies":{"uuid":"^8.3.2","is-ip":"^3.1.0","type-fest":"^2.5.2","schema-dts":"^1.1.0","intl-parse-accept-language":"^1.0.0"},"_hasShrinkwrap":false,"devDependencies":{"zod":"^3.19.1","jest":"^27.3.1","react":"^17.0.2","eslint":"^8.12.0","ts-node":"^10.4.0","prettier":"^2.5.1","react-dom":"^17.0.2","babel-jest":"^27.3.1","typescript":"^4.2.4","@babel/core":"^7.16.0","@jest/types":"^27.2.5","@types/uuid":"^8.3.3","@types/react":"^17.0.14","@remix-run/node":"^1.5.1","jest-fetch-mock":"^3.0.3","@remix-run/react":"^1.5.1","react-router-dom":"6.3.0","@babel/preset-env":"^7.16.0","eslint-plugin-jest":"^26.1.3","@babel/preset-react":"^7.16.0","eslint-plugin-react":"^7.26.1","eslint-plugin-import":"^2.22.1","eslint-plugin-cypress":"^2.11.3","eslint-plugin-promise":"^6.0.0","eslint-plugin-unicorn":"^41.0.1","@testing-library/react":"^12.1.2","eslint-config-prettier":"^8.3.0","eslint-plugin-jest-dom":"^4.0.1","eslint-plugin-jsx-a11y":"^6.4.1","eslint-plugin-prettier":"^4.0.0","@babel/preset-typescript":"^7.16.0","@remix-run/server-runtime":"^1.5.1","@testing-library/jest-dom":"^5.15.0","@typescript-eslint/parser":"^5.3.0","eslint-plugin-react-hooks":"^4.2.0","eslint-plugin-testing-library":"^5.1.0","@typescript-eslint/eslint-plugin":"^5.3.0","eslint-import-resolver-typescript":"^2.5.0"},"peerDependencies":{"zod":"^3.19.1","react":"^16.8.0 || ^17.0.0 || ^18.0.0","@remix-run/react":"^1.5.1","@remix-run/server-runtime":"^1.5.1"},"_npmOperationalInternal":{"tmp":"tmp/remix-utils_5.0.1_1670859461384_0.948476551751231","host":"s3://npm-registry-packages"}},"5.1.0":{"name":"remix-utils","version":"5.1.0","keywords":["remix","remix.run","react","utils","request","response","csrf","redirect-back","outlet","client-only","hydrated","body parser"],"author":{"url":"https://sergiodxa.com","name":"Sergio Xalambrí","email":"hello@sergiodxa.com"},"license":"MIT","_id":"remix-utils@5.1.0","maintainers":[{"name":"sergiodxa","email":"sergiodxa@gmail.com"}],"homepage":"https://github.com/sergiodxa/remix-utils#readme","bugs":{"url":"https://github.com/sergiodxa/remix-utils/issues"},"dist":{"shasum":"63ccc03bbd99ee8128e24635b8f0b26ec7cfaf48","tarball":"https://registry.npmjs.org/remix-utils/-/remix-utils-5.1.0.tgz","fileCount":131,"integrity":"sha512-2xoKgJmj/T+U8QNIWk0T5oJhJ8fHy+i1p5PGXc58ZvVZ4aqIHM0jR81Di3MUZGdq/LrdE6n9PnxbCaO55eZ9zQ==","signatures":[{"sig":"MEUCIEEbr+OKLRDIhsdlPtOvygI5DCF8dGScPR/hP08xcQ+4AiEA5UPVDVnTBLXTmDBSL0ewujJcU7NIKs/alFw96NTeCfA=","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":216468,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJjmAM/ACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2Vmo+vxAApP32Cqb66OjTuaFALadr8VArEsVbrOZ2NpSbTaCRdZ1308Zh\r\nF9QQfiWYNFjuq/fhmW9p0XlARwh9A4l/i6xqbEUQtP7EXefUcaBvhq3WVito\r\nhG4pxjYSPEdZCzpMxEcj4mMG6ZFwKTZF+VjMzvo4nwmz4D93nasnSmOn7W2s\r\nRSf1Qbfj/RWHe9P75jFqvHDfcrdDIqBMd7NJZ6r8ro86dSlVm/nkLkG8Ir0J\r\nivW/dc0+8zANUeHchSjfl0bTF+VK80KmV5TyXtotRwHvjE7YeKWUj1z95HSn\r\nYVagTtoraKNspH1y6OeiaJE/mExWDoDTDB+BLKxtncK32AIj9ztPIv+Ch0LG\r\nvXxaAJDMzVcgFS52zWGNBb5Vag+GHTlEaOKnb1qkJYkMOtaeQ4cJaTvqSDxm\r\nH3amkYb+uLaQyZ8c4GBrQaTgn9IUKVQ/AtgI3M5lJPS5+gMsEYVboBF8SH8a\r\nfxwZ6oYmxDXd46gJ4pd0rEfR/n/oUodERNvXg9laJwLlsnip4CQy/rGNbGq8\r\nwfRT8AXH5i4qmFkqQ2JIbSGcZcT2vsVy3lpjQAVM6ORCGbVjWxo3y4YnXYCU\r\nLGdw4e1IVFhfdpBUZ36wmNNSpDCScMpQJOcaeP+Lkptx7JxSuGHIaf7RetL5\r\nI5MnkWfFm0jaSv0hAdn8ra+hq3JyGfxS9Lw=\r\n=sv/I\r\n-----END PGP SIGNATURE-----\r\n"},"main":"./build/index.js","types":"./build/index.d.ts","browser":"./browser/index.js","engines":{"node":">=14"},"gitHead":"d37b11ccb3e97c63ab82cb3b32b4e53830b245c5","scripts":{"lint":"eslint --ext .ts,.tsx src/","test":"jest --config=config/jest.config.ts --passWithNoTests","build":"npm run build:browser && npm run build:main","typecheck":"tsc --project tsconfig.json --noEmit","build:main":"tsc --project tsconfig.json --module CommonJS --outDir ./build","build:browser":"tsc --project tsconfig.json --module ESNext --outDir ./browser"},"_npmUser":{"name":"sergiodxa","email":"sergiodxa@gmail.com"},"repository":{"url":"git+https://github.com/sergiodxa/remix-utils.git","type":"git"},"_npmVersion":"8.19.2","description":"This package contains simple utility functions to use with [Remix.run](https://remix.run).","directories":{},"sideEffects":false,"_nodeVersion":"18.12.1","dependencies":{"uuid":"^8.3.2","is-ip":"^3.1.0","type-fest":"^2.5.2","schema-dts":"^1.1.0","intl-parse-accept-language":"^1.0.0"},"_hasShrinkwrap":false,"devDependencies":{"zod":"^3.19.1","jest":"^27.3.1","react":"^17.0.2","eslint":"^8.12.0","ts-node":"^10.4.0","prettier":"^2.5.1","react-dom":"^17.0.2","babel-jest":"^27.3.1","typescript":"^4.2.4","@babel/core":"^7.16.0","@jest/types":"^27.2.5","@types/uuid":"^8.3.3","@types/react":"^17.0.14","@remix-run/node":"^1.5.1","jest-fetch-mock":"^3.0.3","@remix-run/react":"^1.5.1","react-router-dom":"6.3.0","@babel/preset-env":"^7.16.0","eslint-plugin-jest":"^26.1.3","@babel/preset-react":"^7.16.0","eslint-plugin-react":"^7.26.1","eslint-plugin-import":"^2.22.1","eslint-plugin-cypress":"^2.11.3","eslint-plugin-promise":"^6.0.0","eslint-plugin-unicorn":"^41.0.1","@testing-library/react":"^12.1.2","eslint-config-prettier":"^8.3.0","eslint-plugin-jest-dom":"^4.0.1","eslint-plugin-jsx-a11y":"^6.4.1","eslint-plugin-prettier":"^4.0.0","@babel/preset-typescript":"^7.16.0","@remix-run/server-runtime":"^1.5.1","@testing-library/jest-dom":"^5.15.0","@typescript-eslint/parser":"^5.3.0","eslint-plugin-react-hooks":"^4.2.0","eslint-plugin-testing-library":"^5.1.0","@typescript-eslint/eslint-plugin":"^5.3.0","eslint-import-resolver-typescript":"^2.5.0"},"peerDependencies":{"zod":"^3.19.1","react":"^16.8.0 || ^17.0.0 || ^18.0.0","@remix-run/react":"^1.5.1","@remix-run/server-runtime":"^1.5.1"},"_npmOperationalInternal":{"tmp":"tmp/remix-utils_5.1.0_1670906687783_0.9342839881050096","host":"s3://npm-registry-packages"}},"5.2.0":{"name":"remix-utils","version":"5.2.0","keywords":["remix","remix.run","react","utils","request","response","csrf","redirect-back","outlet","client-only","hydrated","body parser"],"author":{"url":"https://sergiodxa.com","name":"Sergio Xalambrí","email":"hello@sergiodxa.com"},"license":"MIT","_id":"remix-utils@5.2.0","maintainers":[{"name":"sergiodxa","email":"sergiodxa@gmail.com"}],"homepage":"https://github.com/sergiodxa/remix-utils#readme","bugs":{"url":"https://github.com/sergiodxa/remix-utils/issues"},"dist":{"shasum":"b681e4149e0f3cbf56967b5fa4704d8a8b166afc","tarball":"https://registry.npmjs.org/remix-utils/-/remix-utils-5.2.0.tgz","fileCount":135,"integrity":"sha512-8DMewdpYdhL/rcQ2MPusxz4L85+1ICVr/3qY81kfq59YSfWcWTleshnlkft1Pusc0wKYLnYuSkpVb478iAYukw==","signatures":[{"sig":"MEUCIAE8IJPBJifbhgRbG0P/dMVbNSpCuZXpjR3/nlW1pGTUAiEA76px/4c6/Bq66+LrOarZtPAl3doE6X85SCREsXG2Kt0=","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":230360,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJjt27oACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2VmpMeQ//TYBtfBuh211MyAv442JQA8ew7VNOQ8Z6peatbH5PUeZqXYCw\r\nVNEYa3LrLd9vCltp6izrB6EXncEN0H5mKeJp+8xs9HBbWgtMzHHcP9KJvruT\r\n5U636xdly2OYyp7+cQQk/Ob2/vBUO7McmakJvDKn9k2GTfm24jIxaOu/8v21\r\nIfHj+3EV1SgmQCk1d0A4uz3+vMuIf8Q9f7cweAAoIPcemQ5gzdv2BwToA/4p\r\nw1bCtE10NNI+miXK1E3YfF3UHiJaANwzlEeMuWbfNZxDgyqE+3MVyTuw7ReS\r\nHIV6B28XNBHAGw94wOswOqO35qLGPBmIOJd6cVODerU2qHOeaDZyNGhoUDbt\r\n4OsQJ5uMlkkWEHbVtSo5xdbQLGrkqGo6QHcNXr7NS45iFUdIRo9nGCRApY2k\r\nD0J05MYO0rt6nTWX+5T7XFDpLbYO4kAzpT/alz9caXLxpkgTEJl1FIhpkl9Z\r\nF9ghkz8dufvCy7pIfhbfvXWQiiRMMo6XyBn9qRCVTUQfDIoJKlE9aK0Q1ad5\r\nTieK47/LITYUkqGW3Fbc9iWFlJVijvBfqiOGb+zQ3nHQWi+jnWBRdxBl8CGM\r\ntXWSYAEYtKmBGFBzoCQmmSafA5wayVG6V3tsx73uigM8nsDp28Cc0lCR4IgL\r\nF1jr2MYmXrJ/vPTQktCCIpHdrsSN5R0sG5Y=\r\n=2Am0\r\n-----END PGP SIGNATURE-----\r\n"},"main":"./build/index.js","types":"./build/index.d.ts","browser":"./browser/index.js","engines":{"node":">=14"},"gitHead":"b70933ef5f0257152efef97a281c9c2a460b19e3","scripts":{"lint":"eslint --ext .ts,.tsx src/","test":"jest --config=config/jest.config.ts --passWithNoTests","build":"npm run build:browser && npm run build:main","typecheck":"tsc --project tsconfig.json --noEmit","build:main":"tsc --project tsconfig.json --module CommonJS --outDir ./build","build:browser":"tsc --project tsconfig.json --module ESNext --outDir ./browser"},"_npmUser":{"name":"sergiodxa","email":"sergiodxa@gmail.com"},"repository":{"url":"git+https://github.com/sergiodxa/remix-utils.git","type":"git"},"_npmVersion":"8.19.2","description":"This package contains simple utility functions to use with [Remix.run](https://remix.run).","directories":{},"sideEffects":false,"_nodeVersion":"18.12.1","dependencies":{"uuid":"^8.3.2","is-ip":"^3.1.0","type-fest":"^2.5.2","schema-dts":"^1.1.0","intl-parse-accept-language":"^1.0.0"},"_hasShrinkwrap":false,"devDependencies":{"zod":"^3.19.1","jest":"^27.3.1","react":"^17.0.2","eslint":"^8.12.0","ts-node":"^10.4.0","prettier":"^2.5.1","react-dom":"^17.0.2","babel-jest":"^27.3.1","typescript":"^4.2.4","@babel/core":"^7.16.0","@jest/types":"^27.2.5","@types/uuid":"^8.3.3","@types/react":"^17.0.14","@remix-run/node":"^1.5.1","jest-fetch-mock":"^3.0.3","@remix-run/react":"^1.5.1","react-router-dom":"6.3.0","@babel/preset-env":"^7.16.0","eslint-plugin-jest":"^26.1.3","@babel/preset-react":"^7.16.0","eslint-plugin-react":"^7.26.1","eslint-plugin-import":"^2.22.1","eslint-plugin-cypress":"^2.11.3","eslint-plugin-promise":"^6.0.0","eslint-plugin-unicorn":"^41.0.1","@testing-library/react":"^12.1.2","eslint-config-prettier":"^8.3.0","eslint-plugin-jest-dom":"^4.0.1","eslint-plugin-jsx-a11y":"^6.4.1","eslint-plugin-prettier":"^4.0.0","@babel/preset-typescript":"^7.16.0","@remix-run/server-runtime":"^1.5.1","@testing-library/jest-dom":"^5.15.0","@typescript-eslint/parser":"^5.3.0","eslint-plugin-react-hooks":"^4.2.0","eslint-plugin-testing-library":"^5.1.0","@typescript-eslint/eslint-plugin":"^5.3.0","eslint-import-resolver-typescript":"^2.5.0"},"peerDependencies":{"zod":"^3.19.1","react":"^16.8.0 || ^17.0.0 || ^18.0.0","@remix-run/react":"^1.5.1","@remix-run/server-runtime":"^1.5.1"},"_npmOperationalInternal":{"tmp":"tmp/remix-utils_5.2.0_1672965864419_0.6043305015579128","host":"s3://npm-registry-packages"}},"5.2.1":{"name":"remix-utils","version":"5.2.1","keywords":["remix","remix.run","react","utils","request","response","csrf","redirect-back","outlet","client-only","hydrated","body parser"],"author":{"url":"https://sergiodxa.com","name":"Sergio Xalambrí","email":"hello@sergiodxa.com"},"license":"MIT","_id":"remix-utils@5.2.1","maintainers":[{"name":"sergiodxa","email":"sergiodxa@gmail.com"}],"homepage":"https://github.com/sergiodxa/remix-utils#readme","bugs":{"url":"https://github.com/sergiodxa/remix-utils/issues"},"dist":{"shasum":"4067417b90024b12fea0f3867b966ab4df8a7240","tarball":"https://registry.npmjs.org/remix-utils/-/remix-utils-5.2.1.tgz","fileCount":135,"integrity":"sha512-FEpB/HIp542nXorHAZVjyh4hhfe66CPhpYN+3zaBFM8bzHfwgjBwOju0k4UM4uOxGOrW+o4zOnakCdChEpYpZQ==","signatures":[{"sig":"MEYCIQCppgAlNh07ofcSSXaUCD7+HI8XOLuZpvuU2kPnEF3uuAIhALvZ6RSMmEcEQbed9aKAWtGpzGQPv4ssYmGhRLmPdgHS","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":232036,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJjuHomACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2Vmr1Aw//eM35rNIHgguXGrFmUOnuyVEJE1JKDslJ8714BGghwWaKaymn\r\nKdRCOePn8eVMf6R/dQcvhsEMXDgYIJg+GHumUpFy3gq8ilxUWTSLrslQqB1P\r\nhS0Ho5fNfsKnQLBlBihWERC1/ZeEvWCNZonPnaM/tPr9mXkQwuR14J2mTQLc\r\ns2CB4urptt3Nw9fduEMz5VHjAzLuyGLxhtp6gIT16wTWQfit96u9zwPGzp1Y\r\nH2PpX6uKymAUlWIYhgiGXyWcjRO6mqmOU+tb1K0TEHcMPfOwfcDMlbg0qCTb\r\n2f/nNoTh9dhnQ2p6fPRjbxy1ol0j7lkOPJ12jzGCGgwluS+fSAQ92Y+TPHSJ\r\nFYllHq0PygAHgzEnaZHoAtRToH4qdxtbo8LQluXWJ1A36PGwrqY8PFje0pgh\r\n12TXklXdlyf8F8n5bbimi7pBuA00OKilvRy1STmcRzqw9mnSDNZEGyF5vwsm\r\n5TMuSnXlZ4xeXf5B+KB+7jOK5c4QAujkIxmNXtCSz12bT0UOibK2RQwnePKF\r\nqnOMxUrWDXRJMdeEyagcWrU4kjxKRxClNAMoSJroAvAohR12cBskaZ5Mp0J9\r\nChyQK/iB2hLmkvofJLPu352Uo1VGMLcoDOHu1vD1FtoTDNErPTpbIH6KQInf\r\n+nqhUUdpGljedmzdtQmmYgvPqUaMICjdVrk=\r\n=wDzP\r\n-----END PGP SIGNATURE-----\r\n"},"main":"./build/index.js","types":"./build/index.d.ts","browser":"./browser/index.js","engines":{"node":">=14"},"gitHead":"53bcbccc46e7b4a7076b15f9c5d10cf8b6dd6df3","scripts":{"lint":"eslint --ext .ts,.tsx src/","test":"jest --config=config/jest.config.ts --passWithNoTests","build":"npm run build:browser && npm run build:main","typecheck":"tsc --project tsconfig.json --noEmit","build:main":"tsc --project tsconfig.json --module CommonJS --outDir ./build","build:browser":"tsc --project tsconfig.json --module ESNext --outDir ./browser"},"_npmUser":{"name":"sergiodxa","email":"sergiodxa@gmail.com"},"repository":{"url":"git+https://github.com/sergiodxa/remix-utils.git","type":"git"},"_npmVersion":"8.19.2","description":"This package contains simple utility functions to use with [Remix.run](https://remix.run).","directories":{},"sideEffects":false,"_nodeVersion":"18.12.1","dependencies":{"uuid":"^8.3.2","is-ip":"^3.1.0","type-fest":"^2.5.2","schema-dts":"^1.1.0","intl-parse-accept-language":"^1.0.0"},"_hasShrinkwrap":false,"devDependencies":{"zod":"^3.19.1","jest":"^27.3.1","react":"^17.0.2","eslint":"^8.12.0","ts-node":"^10.4.0","prettier":"^2.5.1","react-dom":"^17.0.2","babel-jest":"^27.3.1","typescript":"^4.2.4","@babel/core":"^7.16.0","@jest/types":"^27.2.5","@types/uuid":"^8.3.3","@types/react":"^17.0.14","@remix-run/node":"^1.5.1","jest-fetch-mock":"^3.0.3","@remix-run/react":"^1.5.1","react-router-dom":"6.3.0","@babel/preset-env":"^7.16.0","eslint-plugin-jest":"^26.1.3","@babel/preset-react":"^7.16.0","eslint-plugin-react":"^7.26.1","eslint-plugin-import":"^2.22.1","eslint-plugin-cypress":"^2.11.3","eslint-plugin-promise":"^6.0.0","eslint-plugin-unicorn":"^41.0.1","@testing-library/react":"^12.1.2","eslint-config-prettier":"^8.3.0","eslint-plugin-jest-dom":"^4.0.1","eslint-plugin-jsx-a11y":"^6.4.1","eslint-plugin-prettier":"^4.0.0","@babel/preset-typescript":"^7.16.0","@remix-run/server-runtime":"^1.5.1","@testing-library/jest-dom":"^5.15.0","@typescript-eslint/parser":"^5.3.0","eslint-plugin-react-hooks":"^4.2.0","eslint-plugin-testing-library":"^5.1.0","@typescript-eslint/eslint-plugin":"^5.3.0","eslint-import-resolver-typescript":"^2.5.0"},"peerDependencies":{"zod":"^3.19.1","react":"^16.8.0 || ^17.0.0 || ^18.0.0","@remix-run/react":"^1.5.1","@remix-run/server-runtime":"^1.5.1"},"_npmOperationalInternal":{"tmp":"tmp/remix-utils_5.2.1_1673034278446_0.22266525923306446","host":"s3://npm-registry-packages"}},"5.3.0":{"name":"remix-utils","version":"5.3.0","keywords":["remix","remix.run","react","utils","request","response","csrf","redirect-back","outlet","client-only","hydrated","body parser"],"author":{"url":"https://sergiodxa.com","name":"Sergio Xalambrí","email":"hello@sergiodxa.com"},"license":"MIT","_id":"remix-utils@5.3.0","maintainers":[{"name":"sergiodxa","email":"sergiodxa@gmail.com"}],"homepage":"https://github.com/sergiodxa/remix-utils#readme","bugs":{"url":"https://github.com/sergiodxa/remix-utils/issues"},"dist":{"shasum":"9bb0b0add7c86d7586d04b2626385ba23612e4e0","tarball":"https://registry.npmjs.org/remix-utils/-/remix-utils-5.3.0.tgz","fileCount":135,"integrity":"sha512-gw9OHagay49k+Qi1d5t8pzqY+I2TI5vMEHKaSr0D1k6aZZWgmJWUOVPJ2mduYDeQjMV5Wt0ejxzuW2z8ShL0Fw==","signatures":[{"sig":"MEUCIQDY/ZKb2kPpV4WpM2TCnCY4drahTmc1Q5QRmg+TRfckvQIgJnSafJpmqaEw3cyagrd9H5qYr95J/tMSPL03PfKLIGM=","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":232656,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJjv692ACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2VmorfxAAlUkcYMC/M0FpIeZk0suhaemS2GQaNAQLQTSRCg18PRqGH3Rl\r\nSuye1dWyE69xo9spyLG7/r8AMGVTJJbdUr/aNfbpAhJanAcW9rqQIt8MFBYm\r\nk0ijX6uO/+usRdXRAsPM7DByBKOwldVqTiZ7yz6Uc3smqBPpPFoRfzVE6Hwi\r\nj5TcLhxJhjPW5UX4tWVpxYqYR/nacQIsGrdtpbgaIjOKjhQNQZj4AjkZPb/6\r\nvKsFO1gZC99sqHRM47KytbqrQHhtD0Re+VrENBOymIUZm4lYoqGZJuyHlh7O\r\nneQkfV88O9Vm55KSWc2rh+RegDO7SUiYvhIg5RczEz8RgEQu5ToNvUf2ffKN\r\n7MwvuvDXcEyv+nr89zS2gjJ9whZwR82oE1cNLHsatgd57gZ6c697ASYAT6Dt\r\nmIt419nWQ4iSc9Wtjet4/Dn0H7SjmMdoG9+LhyXkttwrENpcZnAB04QS8mEM\r\nOXV/Pq6AFgbFcKXCRvBpsD9cmoVsywRPFGpf+i1qvZ+fWkewgX3BxqlUlKHn\r\nEXXosPz7g1ivF41nz8eG72AUnSIzPrYR0Qk71nq37qNuhCNcisgmvzSZoPvM\r\n7yBpdBFvF0Y/WqzpIM/jRB8nEP1f7K25z22ri6Mesme1zX/Ys2mLMjvf8/HA\r\nYrKS1Jx1dBhGj/G4Gdnz+g/pU4EWhXOg088=\r\n=Qq3H\r\n-----END PGP SIGNATURE-----\r\n"},"main":"./build/index.js","types":"./build/index.d.ts","browser":"./browser/index.js","engines":{"node":">=14"},"gitHead":"79eaf7399509f7881aee6af84152f040b09548db","scripts":{"lint":"eslint --ext .ts,.tsx src/","test":"jest --config=config/jest.config.ts --passWithNoTests","build":"npm run build:browser && npm run build:main","typecheck":"tsc --project tsconfig.json --noEmit","build:main":"tsc --project tsconfig.json --module CommonJS --outDir ./build","build:browser":"tsc --project tsconfig.json --module ESNext --outDir ./browser"},"_npmUser":{"name":"sergiodxa","email":"sergiodxa@gmail.com"},"repository":{"url":"git+https://github.com/sergiodxa/remix-utils.git","type":"git"},"_npmVersion":"8.19.2","description":"This package contains simple utility functions to use with [Remix.run](https://remix.run).","directories":{},"sideEffects":false,"_nodeVersion":"18.12.1","dependencies":{"uuid":"^8.3.2","is-ip":"^3.1.0","type-fest":"^2.5.2","schema-dts":"^1.1.0","intl-parse-accept-language":"^1.0.0"},"_hasShrinkwrap":false,"devDependencies":{"zod":"^3.19.1","jest":"^27.3.1","react":"^17.0.2","eslint":"^8.12.0","ts-node":"^10.4.0","prettier":"^2.5.1","react-dom":"^17.0.2","babel-jest":"^27.3.1","typescript":"^4.2.4","@babel/core":"^7.16.0","@jest/types":"^27.2.5","@types/uuid":"^8.3.3","@types/react":"^17.0.14","@remix-run/node":"^1.5.1","jest-fetch-mock":"^3.0.3","@remix-run/react":"^1.5.1","react-router-dom":"6.3.0","@babel/preset-env":"^7.16.0","eslint-plugin-jest":"^26.1.3","@babel/preset-react":"^7.16.0","eslint-plugin-react":"^7.26.1","eslint-plugin-import":"^2.22.1","eslint-plugin-cypress":"^2.11.3","eslint-plugin-promise":"^6.0.0","eslint-plugin-unicorn":"^41.0.1","@testing-library/react":"^12.1.2","eslint-config-prettier":"^8.3.0","eslint-plugin-jest-dom":"^4.0.1","eslint-plugin-jsx-a11y":"^6.4.1","eslint-plugin-prettier":"^4.0.0","@babel/preset-typescript":"^7.16.0","@remix-run/server-runtime":"^1.5.1","@testing-library/jest-dom":"^5.15.0","@typescript-eslint/parser":"^5.3.0","eslint-plugin-react-hooks":"^4.2.0","eslint-plugin-testing-library":"^5.1.0","@typescript-eslint/eslint-plugin":"^5.3.0","eslint-import-resolver-typescript":"^2.5.0"},"peerDependencies":{"zod":"^3.19.1","react":"^16.8.0 || ^17.0.0 || ^18.0.0","@remix-run/react":"^1.5.1","@remix-run/server-runtime":"^1.5.1"},"_npmOperationalInternal":{"tmp":"tmp/remix-utils_5.3.0_1673506677920_0.2611814511796551","host":"s3://npm-registry-packages"}},"6.0.0":{"name":"remix-utils","version":"6.0.0","keywords":["remix","remix.run","react","utils","request","response","csrf","redirect-back","outlet","client-only","hydrated","body parser"],"author":{"url":"https://sergiodxa.com","name":"Sergio Xalambrí","email":"hello@sergiodxa.com"},"license":"MIT","_id":"remix-utils@6.0.0","maintainers":[{"name":"sergiodxa","email":"sergiodxa@gmail.com"}],"homepage":"https://github.com/sergiodxa/remix-utils#readme","bugs":{"url":"https://github.com/sergiodxa/remix-utils/issues"},"dist":{"shasum":"1c075c7a466d40d5c89950f694b24ce0cdc9a5a4","tarball":"https://registry.npmjs.org/remix-utils/-/remix-utils-6.0.0.tgz","fileCount":135,"integrity":"sha512-S7Xec0YHZxGFEDawWpIbU7HQAZC0j51FmAvcCyBRuxjo71aAIMdmez47dgF8T91yxpHV1xlIKPL7LhBzmYsOZw==","signatures":[{"sig":"MEQCIA+fWr1XQpSZb5iNtSEyHCtXFUQa7S8JjR9bDkniTdG7AiBCio+O0AoOcwdaxJxrYbwHdI/aaifiCoSffM0BP3heHA==","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":238148,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJjwJBEACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2Vmo9Jg/+K9vpKkkysrvVn3W/UhIE7rnZQqqE2b29iW3qfYu2h713dEN4\r\nUzyg9WBRyNAG+1lkjetqhqRbB+wJKBWvstT2tP/suK2EU8mxR4m1Epare4zN\r\ncYDUBjTaNZTvNNCN3IEA/F4gTcAtGzymaKlSHugqchv31bmOyHFYB8n1lBDp\r\ndUYQPSLe74YKuoC6dn9KM1+FcWG3jahe1yOAE+p5W9rorGV8jXzX4cFJNoV+\r\nSSp1o3iY+YyUe7w51x4gmGaHp9PJJs1sdlAQse7dQ9ovdo3AC8DJvkY5HT9X\r\n3LPZLRsP8M5CSUZvrKjnzU8LItw8ulYmnGlpkUs6tVKquHtXktySjJYtkbKk\r\nLt9oYTxk1QoaZYDYBTEN5V3Ny4lNPXfKuxDeDQwL2DowVzFVY6v2FE907WGF\r\n0ZqcB0dsmJ74kaNhTXORONCz8pIhq13Gv1syh1ivJE+pEMXOYsIejkzSIUU1\r\n3fqR4veJnuuHw5fAapRZOkHgh9xIzI9ePqpldQRQ1VtUWnAIIZcHFMClWGFd\r\nagpDkssDhwL6KmbydExoWhtd79GcGO4mUeNPILFMa1UB0siMZsu0JaRXCKoE\r\nZwasWESDETKbDb2CtXeulqyWFRiaSr9Wrrf2q9L2j4fcqzGv29+8WaOKyZg4\r\nfBI9A/+Y5FKAMO6YEj0ZNK6NsStnpNwmEtM=\r\n=TNVp\r\n-----END PGP SIGNATURE-----\r\n"},"main":"./build/index.js","types":"./build/index.d.ts","browser":"./browser/index.js","engines":{"node":">=14"},"gitHead":"67db36f59ad415876a4359f5869aa7d9a19909b0","scripts":{"lint":"eslint --ext .ts,.tsx src/","test":"jest --config=config/jest.config.ts --passWithNoTests","build":"npm run build:browser && npm run build:main","typecheck":"tsc --project tsconfig.json --noEmit","build:main":"tsc --project tsconfig.json --module CommonJS --outDir ./build","build:browser":"tsc --project tsconfig.json --module ESNext --outDir ./browser"},"_npmUser":{"name":"sergiodxa","email":"sergiodxa@gmail.com"},"repository":{"url":"git+https://github.com/sergiodxa/remix-utils.git","type":"git"},"_npmVersion":"8.19.3","description":"This package contains simple utility functions to use with [Remix.run](https://remix.run).","directories":{},"sideEffects":false,"_nodeVersion":"18.13.0","dependencies":{"uuid":"^8.3.2","is-ip":"^3.1.0","type-fest":"^2.5.2","schema-dts":"^1.1.0","intl-parse-accept-language":"^1.0.0"},"_hasShrinkwrap":false,"devDependencies":{"zod":"^3.19.1","jest":"^27.3.1","react":"^17.0.2","eslint":"^8.12.0","ts-node":"^10.4.0","prettier":"^2.5.1","react-dom":"^17.0.2","babel-jest":"^27.3.1","typescript":"^4.2.4","@babel/core":"^7.16.0","@jest/types":"^27.2.5","@types/uuid":"^8.3.3","@types/react":"^17.0.14","@remix-run/node":"^1.10.0","jest-fetch-mock":"^3.0.3","@remix-run/react":"^1.10.0","react-router-dom":"6.3.0","@babel/preset-env":"^7.16.0","eslint-plugin-jest":"^26.1.3","@babel/preset-react":"^7.16.0","eslint-plugin-react":"^7.26.1","eslint-plugin-import":"^2.22.1","eslint-plugin-cypress":"^2.11.3","eslint-plugin-promise":"^6.0.0","eslint-plugin-unicorn":"^41.0.1","@testing-library/react":"^12.1.2","eslint-config-prettier":"^8.3.0","eslint-plugin-jest-dom":"^4.0.1","eslint-plugin-jsx-a11y":"^6.4.1","eslint-plugin-prettier":"^4.0.0","@babel/preset-typescript":"^7.16.0","@remix-run/server-runtime":"^1.10.0","@testing-library/jest-dom":"^5.15.0","@typescript-eslint/parser":"^5.3.0","eslint-plugin-react-hooks":"^4.2.0","eslint-plugin-testing-library":"^5.1.0","@typescript-eslint/eslint-plugin":"^5.3.0","eslint-import-resolver-typescript":"^2.5.0"},"peerDependencies":{"zod":"^3.19.1","react":"^16.8.0 || ^17.0.0 || ^18.0.0","@remix-run/react":"^1.10.0","@remix-run/server-runtime":"^1.10.0"},"_npmOperationalInternal":{"tmp":"tmp/remix-utils_6.0.0_1673564228118_0.2885715535715707","host":"s3://npm-registry-packages"}},"6.1.0":{"name":"remix-utils","version":"6.1.0","keywords":["remix","remix.run","react","utils","request","response","csrf","redirect-back","outlet","client-only","hydrated","body parser"],"author":{"url":"https://sergiodxa.com","name":"Sergio Xalambrí","email":"hello@sergiodxa.com"},"license":"MIT","_id":"remix-utils@6.1.0","maintainers":[{"name":"sergiodxa","email":"sergiodxa@gmail.com"}],"homepage":"https://github.com/sergiodxa/remix-utils#readme","bugs":{"url":"https://github.com/sergiodxa/remix-utils/issues"},"dist":{"shasum":"130bf7ca1fbf0824c6fcfbe578e7e332406768f7","tarball":"https://registry.npmjs.org/remix-utils/-/remix-utils-6.1.0.tgz","fileCount":139,"integrity":"sha512-OEuoSEBjtkxiscaTdabq/F9jnyOfygeLMpvF0b6RTH07RWUyQjiSX4aKenk4jhEnxUTqUmK9KC2GUvZo/HjPCA==","signatures":[{"sig":"MEUCIAYmeItrIj+s1gDohQ1f6BvXa4Tx6hgVpvUG/HYqEBPnAiEA3HwDmHg91jbr74k/1yHdb+nm18CSJELZ5UxgMk9wLXQ=","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":257589,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJkKwqjACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2VmrIeA//W7rvetlbqfCgCrMbRuj2GIAql2hZdTRWrL9y9QcaOYkUDha2\r\n4B6oxiG7zn08oF69r/6RmyurXr1BiTU6b/jHLkMtH58Ap1iQ4Uz9lBQwAwZV\r\nTg8glNjNZkrYNOQcpXF4D6+vHD2GEaPkDYHf6Q0Wf6qzheVIv5tnQ72jYpLQ\r\n0WBgtqbaolmjkUe9lRQ7dC2EBP7vYyPmu1xkGGY0NfFeQA2XCfoNXfDa/bGx\r\n5CS87E5ODih2HQP0LOupFOVj+IFzDTvX4VUaL212DE0Z2mEYpOjXBDuUOF7f\r\nKmTppgYZTOA9qYRIbz9ztyQD8SrQd2V2nm7SSBm+0r5RlEMhlw0XGBB61M+6\r\n7UeEXshUjqBv2ojafBs2UwgOa3aAnMNVuaG6wD9oSLlNuWzHH84F/gGWF6ao\r\n/CLlo5qZ/H5nORAv09NoR8lrwX92rfEWE70ycg2sl6g44HK3QUczyCyFaVgO\r\nsHWH1HZaEjM2cXFotClzGT7mDTsFF8a+7Ingy12ADhl0poXPsxsKXW1Vn8+u\r\nHkPuBhnimZ6Ibb61fDkBzPBRBKpeHwWS7Ue+Vwnrau97rolUN41C+L94/wMQ\r\n5q7x5d0GDLzsKxPhnRVlhMBjGAVJzqTSQ1tPNkWIHsoyx7E57BubL9doXCGN\r\nkCvTCQBGNavETFU/jzpuKCoYWk3+gbO5/iE=\r\n=KDXZ\r\n-----END PGP SIGNATURE-----\r\n"},"main":"./build/index.js","types":"./build/index.d.ts","browser":"./browser/index.js","engines":{"node":">=14"},"gitHead":"c01392b6169a886b0154b37bffd69ad56f9c0125","scripts":{"lint":"eslint --ext .ts,.tsx src/","test":"jest --config=config/jest.config.ts --passWithNoTests","build":"npm run build:browser && npm run build:main","typecheck":"tsc --project tsconfig.json --noEmit","build:main":"tsc --project tsconfig.json --module CommonJS --outDir ./build","build:browser":"tsc --project tsconfig.json --module ESNext --outDir ./browser"},"_npmUser":{"name":"sergiodxa","email":"sergiodxa@gmail.com"},"repository":{"url":"git+https://github.com/sergiodxa/remix-utils.git","type":"git"},"_npmVersion":"9.5.0","description":"This package contains simple utility functions to use with [Remix.run](https://remix.run).","directories":{},"sideEffects":false,"_nodeVersion":"18.15.0","dependencies":{"uuid":"^8.3.2","is-ip":"^3.1.0","type-fest":"^2.5.2","schema-dts":"^1.1.0","intl-parse-accept-language":"^1.0.0"},"_hasShrinkwrap":false,"devDependencies":{"zod":"^3.19.1","jest":"^27.3.1","react":"^17.0.2","eslint":"^8.12.0","ts-node":"^10.4.0","prettier":"^2.5.1","react-dom":"^17.0.2","babel-jest":"^27.3.1","typescript":"^4.2.4","@babel/core":"^7.16.0","@jest/types":"^27.2.5","@types/uuid":"^8.3.3","@types/react":"^17.0.14","@remix-run/node":"^1.10.0","jest-fetch-mock":"^3.0.3","@remix-run/react":"^1.10.0","react-router-dom":"6.3.0","@babel/preset-env":"^7.16.0","eslint-plugin-jest":"^26.1.3","@babel/preset-react":"^7.16.0","eslint-plugin-react":"^7.26.1","eslint-plugin-import":"^2.22.1","eslint-plugin-cypress":"^2.11.3","eslint-plugin-promise":"^6.0.0","eslint-plugin-unicorn":"^41.0.1","@testing-library/react":"^12.1.2","eslint-config-prettier":"^8.3.0","eslint-plugin-jest-dom":"^4.0.1","eslint-plugin-jsx-a11y":"^6.4.1","eslint-plugin-prettier":"^4.0.0","@babel/preset-typescript":"^7.16.0","@remix-run/server-runtime":"^1.10.0","@testing-library/jest-dom":"^5.15.0","@typescript-eslint/parser":"^5.3.0","eslint-plugin-react-hooks":"^4.2.0","eslint-plugin-testing-library":"^5.1.0","@typescript-eslint/eslint-plugin":"^5.3.0","eslint-import-resolver-typescript":"^2.5.0"},"peerDependencies":{"zod":"^3.19.1","react":"^16.8.0 || ^17.0.0 || ^18.0.0","@remix-run/react":"^1.10.0","@remix-run/server-runtime":"^1.10.0"},"_npmOperationalInternal":{"tmp":"tmp/remix-utils_6.1.0_1680542371184_0.22815286430469817","host":"s3://npm-registry-packages"}},"6.3.0":{"name":"remix-utils","version":"6.3.0","keywords":["remix","remix.run","react","utils","request","response","csrf","redirect-back","outlet","client-only","hydrated","body parser"],"author":{"url":"https://sergiodxa.com","name":"Sergio Xalambrí","email":"hello@sergiodxa.com"},"license":"MIT","_id":"remix-utils@6.3.0","maintainers":[{"name":"sergiodxa","email":"sergiodxa@gmail.com"}],"homepage":"https://github.com/sergiodxa/remix-utils#readme","bugs":{"url":"https://github.com/sergiodxa/remix-utils/issues"},"dist":{"shasum":"e5ec6e426664cad38c496b60b34c0af75a775ddb","tarball":"https://registry.npmjs.org/remix-utils/-/remix-utils-6.3.0.tgz","fileCount":139,"integrity":"sha512-ivtBYxsToXYFFzvkVPJiw21a5bbzucJslK2H3McJDjkaGvivSGULdyUmSWwmDhzuAXdUxNOV/MBoWtBnNLCIOg==","signatures":[{"sig":"MEUCIGjkTfgYShNMn2amKN2ET27X4c/ldsnngg+Q8ywTSgg8AiEAxcxtNlVx6WLBgmqbE8Tkc7DO71gdZ6QEkfEewGOlICo=","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":261047,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJkUW3nACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2Vmr6vQ//SkxmLkWYCxst5jbBmbbzM1ucJPls47abW+tDaCtQ+ioEnyi8\r\nadZDODYpt+IXGEbk2uCbwHLeVE4UHNMnbYFmWqaQ20dbx1A30o2Ll0tIx4o+\r\npsB/whK/h4JDUjveq41xqF4v3pKc14maWbnqhDqxML8zW3ulwL9kNyWeDOar\r\nexNmQVdD+A1OD5WC9YGea4uLcIELNO7liu4rcrg8If3SjjMb0l8m4mkfSt7w\r\neCqkob13W+4bWD36Waa7EcKfEAXWNlUvnG2jWtFNYrfKGczW8UnTjekG/o7Q\r\nGbyjl7UHRK1ElOjSisn5FoxJnMvnJzAmqI3F6/s5/AEuIdLO0maM3CkTQG/p\r\nd/v7TWjHbv6KhYkG2F+94VlqdCrksOL6xPUwC9E7GXZo+NUkplf16ck5B1m3\r\nFaS5SAE5YMZGTcSsHbtDDUXedwCfmPicwYjqeI5e/Aq4ILk3F212tgXrIVxs\r\n+ikiYuHZaqMXT9WX51b6XxyiQtzNIJX9pX20H2zCtdO0zfc7YUxO/yaNtJDA\r\n5jW7HEKsCIJYWd9qbs1/XSxDx1hYK3fNdlosAApyeQJIBCFz3e/LqRD0CKTY\r\nvwdOxiGgNkhmpPWBKn7Y4FvDkhJHPD7VfLYcZmioh9eu/2S858jPbdLQwAvK\r\nv2GrFB12Zy1tKeMxBdNlECnPV7x4/0CJucQ=\r\n=u4jC\r\n-----END PGP SIGNATURE-----\r\n"},"main":"./build/index.js","types":"./build/index.d.ts","browser":"./browser/index.js","engines":{"node":">=14"},"gitHead":"0e1ae22168a2f099a85b28fda6a07e6fddd5c68b","scripts":{"lint":"eslint --ext .ts,.tsx src/","test":"jest --config=config/jest.config.ts --passWithNoTests","build":"npm run build:browser && npm run build:main","typecheck":"tsc --project tsconfig.json --noEmit","build:main":"tsc --project tsconfig.json --module CommonJS --outDir ./build","build:browser":"tsc --project tsconfig.json --module ESNext --outDir ./browser"},"_npmUser":{"name":"sergiodxa","email":"sergiodxa@gmail.com"},"repository":{"url":"git+https://github.com/sergiodxa/remix-utils.git","type":"git"},"_npmVersion":"9.5.1","description":"This package contains simple utility functions to use with [Remix.run](https://remix.run).","directories":{},"sideEffects":false,"_nodeVersion":"18.16.0","dependencies":{"uuid":"^8.3.2","is-ip":"^3.1.0","type-fest":"^2.5.2","schema-dts":"^1.1.0","intl-parse-accept-language":"^1.0.0"},"_hasShrinkwrap":false,"devDependencies":{"zod":"^3.19.1","jest":"^27.3.1","react":"^17.0.2","eslint":"^8.12.0","ts-node":"^10.4.0","prettier":"^2.5.1","react-dom":"^17.0.2","babel-jest":"^27.3.1","typescript":"^4.2.4","@babel/core":"^7.16.0","@jest/types":"^27.2.5","@types/uuid":"^8.3.3","@types/react":"^17.0.14","@remix-run/node":"^1.10.0","jest-fetch-mock":"^3.0.3","@remix-run/react":"^1.10.0","react-router-dom":"6.3.0","@babel/preset-env":"^7.16.0","eslint-plugin-jest":"^26.1.3","@babel/preset-react":"^7.16.0","eslint-plugin-react":"^7.26.1","eslint-plugin-import":"^2.22.1","eslint-plugin-cypress":"^2.11.3","eslint-plugin-promise":"^6.0.0","eslint-plugin-unicorn":"^41.0.1","@testing-library/react":"^12.1.2","eslint-config-prettier":"^8.3.0","eslint-plugin-jest-dom":"^4.0.1","eslint-plugin-jsx-a11y":"^6.4.1","eslint-plugin-prettier":"^4.0.0","@babel/preset-typescript":"^7.16.0","@remix-run/server-runtime":"^1.10.0","@testing-library/jest-dom":"^5.15.0","@typescript-eslint/parser":"^5.3.0","eslint-plugin-react-hooks":"^4.2.0","eslint-plugin-testing-library":"^5.1.0","@typescript-eslint/eslint-plugin":"^5.3.0","eslint-import-resolver-typescript":"^2.5.0"},"peerDependencies":{"zod":"^3.19.1","react":"^16.8.0 || ^17.0.0 || ^18.0.0","@remix-run/react":"^1.10.0","@remix-run/server-runtime":"^1.10.0"},"_npmOperationalInternal":{"tmp":"tmp/remix-utils_6.3.0_1683058151453_0.6091724990599563","host":"s3://npm-registry-packages"}},"6.4.0":{"name":"remix-utils","version":"6.4.0","keywords":["remix","remix.run","react","utils","request","response","csrf","redirect-back","outlet","client-only","hydrated","body parser"],"author":{"url":"https://sergiodxa.com","name":"Sergio Xalambrí","email":"hello@sergiodxa.com"},"license":"MIT","_id":"remix-utils@6.4.0","maintainers":[{"name":"sergiodxa","email":"sergiodxa@gmail.com"}],"homepage":"https://github.com/sergiodxa/remix-utils#readme","bugs":{"url":"https://github.com/sergiodxa/remix-utils/issues"},"dist":{"shasum":"bf6d59619b6972d8b4ddc8ac6b9efdc26a358919","tarball":"https://registry.npmjs.org/remix-utils/-/remix-utils-6.4.0.tgz","fileCount":143,"integrity":"sha512-1M+cHq3sfkg8a0n5C2UJHCHjScFQkHHV0s3r0mBT89zClg8tl7qE7BNn7BS7ZC7XJLpnOWF5u50NcaIiVEsOiw==","signatures":[{"sig":"MEUCIG7bpwLu+aKD3aO/yoqpGIc9FQICIfAMmaY8Q6J7InyKAiEA3pJcT1l+OXrJ0lPx6cFgwjatCO/QvbWQL/J3knyxAUk=","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":265173},"main":"./build/index.js","types":"./build/index.d.ts","browser":"./browser/index.js","engines":{"node":">=14"},"gitHead":"5b69a89f4e2c1ee8d059e69e891ba5f6cc9f3c7b","scripts":{"lint":"eslint --ext .ts,.tsx src/","test":"jest --config=config/jest.config.ts --passWithNoTests","build":"npm run build:browser && npm run build:main","typecheck":"tsc --project tsconfig.json --noEmit","build:main":"tsc --project tsconfig.json --module CommonJS --outDir ./build","build:browser":"tsc --project tsconfig.json --module ESNext --outDir ./browser"},"_npmUser":{"name":"sergiodxa","email":"sergiodxa@gmail.com"},"repository":{"url":"git+https://github.com/sergiodxa/remix-utils.git","type":"git"},"_npmVersion":"9.5.1","description":"This package contains simple utility functions to use with [Remix.run](https://remix.run).","directories":{},"sideEffects":false,"_nodeVersion":"18.16.0","dependencies":{"uuid":"^8.3.2","is-ip":"^3.1.0","type-fest":"^2.5.2","schema-dts":"^1.1.0","intl-parse-accept-language":"^1.0.0"},"_hasShrinkwrap":false,"devDependencies":{"zod":"^3.19.1","jest":"^27.3.1","react":"^17.0.2","eslint":"^8.12.0","ts-node":"^10.4.0","prettier":"^2.5.1","react-dom":"^17.0.2","babel-jest":"^27.3.1","typescript":"^4.2.4","@babel/core":"^7.16.0","@jest/types":"^27.2.5","@types/uuid":"^8.3.3","@types/react":"^17.0.14","@remix-run/node":"^1.10.0","jest-fetch-mock":"^3.0.3","@remix-run/react":"^1.10.0","react-router-dom":"6.3.0","@babel/preset-env":"^7.16.0","eslint-plugin-jest":"^26.1.3","@babel/preset-react":"^7.16.0","eslint-plugin-react":"^7.26.1","eslint-plugin-import":"^2.22.1","eslint-plugin-cypress":"^2.11.3","eslint-plugin-promise":"^6.0.0","eslint-plugin-unicorn":"^41.0.1","@testing-library/react":"^12.1.2","eslint-config-prettier":"^8.3.0","eslint-plugin-jest-dom":"^4.0.1","eslint-plugin-jsx-a11y":"^6.4.1","eslint-plugin-prettier":"^4.0.0","@babel/preset-typescript":"^7.16.0","@remix-run/server-runtime":"^1.10.0","@testing-library/jest-dom":"^5.15.0","@typescript-eslint/parser":"^5.3.0","eslint-plugin-react-hooks":"^4.2.0","eslint-plugin-testing-library":"^5.1.0","@typescript-eslint/eslint-plugin":"^5.3.0","eslint-import-resolver-typescript":"^2.5.0"},"peerDependencies":{"zod":"^3.19.1","react":"^16.8.0 || ^17.0.0 || ^18.0.0","@remix-run/react":"^1.10.0","@remix-run/server-runtime":"^1.10.0"},"_npmOperationalInternal":{"tmp":"tmp/remix-utils_6.4.0_1686348391713_0.0634913733880973","host":"s3://npm-registry-packages"}},"6.4.1":{"name":"remix-utils","version":"6.4.1","keywords":["remix","remix.run","react","utils","request","response","csrf","redirect-back","outlet","client-only","hydrated","body parser"],"author":{"url":"https://sergiodxa.com","name":"Sergio Xalambrí","email":"hello@sergiodxa.com"},"license":"MIT","_id":"remix-utils@6.4.1","maintainers":[{"name":"sergiodxa","email":"sergiodxa@gmail.com"}],"homepage":"https://github.com/sergiodxa/remix-utils#readme","bugs":{"url":"https://github.com/sergiodxa/remix-utils/issues"},"dist":{"shasum":"5d5f07fc54bcfe020f74be4f41d776c18fac1a5c","tarball":"https://registry.npmjs.org/remix-utils/-/remix-utils-6.4.1.tgz","fileCount":143,"integrity":"sha512-qIm4bLArf7Np7rhCyI5vRT2dToNIQjModkJyiri6ydflnz6CkRHf4FokbtW187F4tqmXe/0oNyZ7rhaxY7VP8Q==","signatures":[{"sig":"MEQCIDWqX65c6ICnq2ZerPMyqWxWphW2mExNTR+7qF6PyCv7AiBvnoSspfTvS0VdmHzm5MlRLM/k/ZjK358Fbc4dcs5nxw==","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":265339},"main":"./build/index.js","types":"./build/index.d.ts","browser":"./browser/index.js","engines":{"node":">=14"},"gitHead":"23d9cfc04ac1fdaf449a4099813a9284b61f6700","scripts":{"lint":"eslint --ext .ts,.tsx src/","test":"jest --config=config/jest.config.ts --passWithNoTests","build":"npm run build:browser && npm run build:main","typecheck":"tsc --project tsconfig.json --noEmit","build:main":"tsc --project tsconfig.json --module CommonJS --outDir ./build","build:browser":"tsc --project tsconfig.json --module ESNext --outDir ./browser"},"_npmUser":{"name":"sergiodxa","email":"sergiodxa@gmail.com"},"repository":{"url":"git+https://github.com/sergiodxa/remix-utils.git","type":"git"},"_npmVersion":"9.5.1","description":"This package contains simple utility functions to use with [Remix.run](https://remix.run).","directories":{},"sideEffects":false,"_nodeVersion":"18.16.0","dependencies":{"uuid":"^8.3.2","is-ip":"^3.1.0","type-fest":"^2.5.2","schema-dts":"^1.1.0","intl-parse-accept-language":"^1.0.0"},"_hasShrinkwrap":false,"devDependencies":{"zod":"^3.19.1","jest":"^27.3.1","react":"^17.0.2","eslint":"^8.12.0","ts-node":"^10.4.0","prettier":"^2.5.1","react-dom":"^17.0.2","babel-jest":"^27.3.1","typescript":"^4.2.4","@babel/core":"^7.16.0","@jest/types":"^27.2.5","@types/uuid":"^8.3.3","@types/react":"^17.0.14","@remix-run/node":"^1.10.0","jest-fetch-mock":"^3.0.3","@remix-run/react":"^1.10.0","react-router-dom":"6.3.0","@babel/preset-env":"^7.16.0","eslint-plugin-jest":"^26.1.3","@babel/preset-react":"^7.16.0","eslint-plugin-react":"^7.26.1","eslint-plugin-import":"^2.22.1","eslint-plugin-cypress":"^2.11.3","eslint-plugin-promise":"^6.0.0","eslint-plugin-unicorn":"^41.0.1","@testing-library/react":"^12.1.2","eslint-config-prettier":"^8.3.0","eslint-plugin-jest-dom":"^4.0.1","eslint-plugin-jsx-a11y":"^6.4.1","eslint-plugin-prettier":"^4.0.0","@babel/preset-typescript":"^7.16.0","@remix-run/server-runtime":"^1.10.0","@testing-library/jest-dom":"^5.15.0","@typescript-eslint/parser":"^5.3.0","eslint-plugin-react-hooks":"^4.2.0","eslint-plugin-testing-library":"^5.1.0","@typescript-eslint/eslint-plugin":"^5.3.0","eslint-import-resolver-typescript":"^2.5.0"},"peerDependencies":{"zod":"^3.19.1","react":"^16.8.0 || ^17.0.0 || ^18.0.0","@remix-run/react":"^1.10.0","@remix-run/server-runtime":"^1.10.0"},"_npmOperationalInternal":{"tmp":"tmp/remix-utils_6.4.1_1686625627390_0.23624227595497183","host":"s3://npm-registry-packages"}},"6.5.0":{"name":"remix-utils","version":"6.5.0","keywords":["remix","remix.run","react","utils","request","response","csrf","redirect-back","outlet","client-only","hydrated","body parser"],"author":{"url":"https://sergiodxa.com","name":"Sergio Xalambrí","email":"hello@sergiodxa.com"},"license":"MIT","_id":"remix-utils@6.5.0","maintainers":[{"name":"sergiodxa","email":"sergiodxa@gmail.com"}],"homepage":"https://github.com/sergiodxa/remix-utils#readme","bugs":{"url":"https://github.com/sergiodxa/remix-utils/issues"},"dist":{"shasum":"efd6e29fc0417934e7f6716c58a2bc65a58e0a3a","tarball":"https://registry.npmjs.org/remix-utils/-/remix-utils-6.5.0.tgz","fileCount":143,"integrity":"sha512-UoC1UFfT867hQuLy5976ajMG87/dNzpdQ5xWyllkaAYiF0ZuGDe/j/kQ/rIJ9xIMyjJttiknDF2ajpNMO0+n2A==","signatures":[{"sig":"MEQCIAXNzUAjt3LJGc5VyRn5sxHmIHSUt/1YjNHvkAuMEGSVAiB+S5ljXq473YYWnaSpTCpGGTjgOrXkCRktGRbp4++Adw==","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":265623},"main":"./build/index.js","types":"./build/index.d.ts","browser":"./browser/index.js","engines":{"node":">=14"},"gitHead":"fd6728dc4fc7e4ebcdc31a9beb9bcd3a72adf5ae","scripts":{"lint":"eslint --ext .ts,.tsx src/","test":"jest --config=config/jest.config.ts --passWithNoTests","build":"npm run build:browser && npm run build:main","typecheck":"tsc --project tsconfig.json --noEmit","build:main":"tsc --project tsconfig.json --module CommonJS --outDir ./build","build:browser":"tsc --project tsconfig.json --module ESNext --outDir ./browser"},"_npmUser":{"name":"sergiodxa","email":"sergiodxa@gmail.com"},"repository":{"url":"git+https://github.com/sergiodxa/remix-utils.git","type":"git"},"_npmVersion":"9.5.1","description":"This package contains simple utility functions to use with [Remix.run](https://remix.run).","directories":{},"sideEffects":false,"_nodeVersion":"18.16.0","dependencies":{"uuid":"^8.3.2","is-ip":"^3.1.0","type-fest":"^2.5.2","schema-dts":"^1.1.0","intl-parse-accept-language":"^1.0.0"},"_hasShrinkwrap":false,"devDependencies":{"zod":"^3.19.1","jest":"^27.3.1","react":"^17.0.2","eslint":"^8.12.0","ts-node":"^10.4.0","prettier":"^2.5.1","react-dom":"^17.0.2","babel-jest":"^27.3.1","typescript":"^4.2.4","@babel/core":"^7.16.0","@jest/types":"^27.2.5","@types/uuid":"^8.3.3","@types/react":"^17.0.14","@remix-run/node":"^1.10.0","jest-fetch-mock":"^3.0.3","@remix-run/react":"^1.10.0","react-router-dom":"6.3.0","@babel/preset-env":"^7.16.0","eslint-plugin-jest":"^26.1.3","@babel/preset-react":"^7.16.0","eslint-plugin-react":"^7.26.1","eslint-plugin-import":"^2.22.1","eslint-plugin-cypress":"^2.11.3","eslint-plugin-promise":"^6.0.0","eslint-plugin-unicorn":"^41.0.1","@testing-library/react":"^12.1.2","eslint-config-prettier":"^8.3.0","eslint-plugin-jest-dom":"^4.0.1","eslint-plugin-jsx-a11y":"^6.4.1","eslint-plugin-prettier":"^4.0.0","@babel/preset-typescript":"^7.16.0","@remix-run/server-runtime":"^1.10.0","@testing-library/jest-dom":"^5.15.0","@typescript-eslint/parser":"^5.3.0","eslint-plugin-react-hooks":"^4.2.0","eslint-plugin-testing-library":"^5.1.0","@typescript-eslint/eslint-plugin":"^5.3.0","eslint-import-resolver-typescript":"^2.5.0"},"peerDependencies":{"zod":"^3.19.1","react":"^16.8.0 || ^17.0.0 || ^18.0.0","@remix-run/react":"^1.10.0","@remix-run/server-runtime":"^1.10.0"},"_npmOperationalInternal":{"tmp":"tmp/remix-utils_6.5.0_1687995956171_0.30475130795596117","host":"s3://npm-registry-packages"}},"6.6.0":{"name":"remix-utils","version":"6.6.0","keywords":["remix","remix.run","react","utils","request","response","csrf","redirect-back","outlet","client-only","hydrated","body parser"],"author":{"url":"https://sergiodxa.com","name":"Sergio Xalambrí","email":"hello@sergiodxa.com"},"license":"MIT","_id":"remix-utils@6.6.0","maintainers":[{"name":"sergiodxa","email":"sergiodxa@gmail.com"}],"homepage":"https://github.com/sergiodxa/remix-utils#readme","bugs":{"url":"https://github.com/sergiodxa/remix-utils/issues"},"dist":{"shasum":"9ad2120553f3b26a70269be3601db4a4f4de970b","tarball":"https://registry.npmjs.org/remix-utils/-/remix-utils-6.6.0.tgz","fileCount":143,"integrity":"sha512-4r4ifahU61Aa54m6Yu8B8GTzXyo+9RUzkFZdBNZOErpZ1LUMQ/ng4LeCJX2M6m4obdMjq0ot0pPlnAzeZOSttg==","signatures":[{"sig":"MEUCIQCu3HW/edNA45YlaPqnKOld7847SOxTm1t0jcJflxJn2AIgObCRc3yxJArsjlxLnFbVp5K75rzxNn4/UaAHIzIuWAo=","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":266832},"main":"./build/index.js","types":"./build/index.d.ts","browser":"./browser/index.js","engines":{"node":">=14"},"gitHead":"6d3012ffdc8ed62f7c85cd24721efe3792580357","scripts":{"lint":"eslint --ext .ts,.tsx src/","test":"jest --config=config/jest.config.ts --passWithNoTests","build":"npm run build:browser && npm run build:main","prepare":"npm run build","typecheck":"tsc --project tsconfig.json --noEmit","build:main":"tsc --project tsconfig.json --module CommonJS --outDir ./build","build:browser":"tsc --project tsconfig.json --module ESNext --outDir ./browser"},"_npmUser":{"name":"sergiodxa","email":"sergiodxa@gmail.com"},"repository":{"url":"git+https://github.com/sergiodxa/remix-utils.git","type":"git"},"_npmVersion":"9.5.1","description":"This package contains simple utility functions to use with [Remix.run](https://remix.run).","directories":{},"sideEffects":false,"_nodeVersion":"18.16.1","dependencies":{"uuid":"^8.3.2","is-ip":"^3.1.0","type-fest":"^2.5.2","schema-dts":"^1.1.0","intl-parse-accept-language":"^1.0.0"},"_hasShrinkwrap":false,"devDependencies":{"zod":"^3.19.1","jest":"^27.3.1","react":"^17.0.2","eslint":"^8.12.0","ts-node":"^10.4.0","prettier":"^2.5.1","react-dom":"^17.0.2","babel-jest":"^27.3.1","typescript":"^4.2.4","@babel/core":"^7.16.0","@jest/types":"^27.2.5","@types/uuid":"^8.3.3","@types/react":"^17.0.14","@remix-run/node":"^1.10.0","jest-fetch-mock":"^3.0.3","@remix-run/react":"^1.10.0","react-router-dom":"6.3.0","@babel/preset-env":"^7.16.0","eslint-plugin-jest":"^26.1.3","@babel/preset-react":"^7.16.0","eslint-plugin-react":"^7.26.1","eslint-plugin-import":"^2.22.1","eslint-plugin-cypress":"^2.11.3","eslint-plugin-promise":"^6.0.0","eslint-plugin-unicorn":"^41.0.1","@testing-library/react":"^12.1.2","eslint-config-prettier":"^8.3.0","eslint-plugin-jest-dom":"^4.0.1","eslint-plugin-jsx-a11y":"^6.4.1","eslint-plugin-prettier":"^4.0.0","@babel/preset-typescript":"^7.16.0","@remix-run/server-runtime":"^1.10.0","@testing-library/jest-dom":"^5.15.0","@typescript-eslint/parser":"^5.3.0","eslint-plugin-react-hooks":"^4.2.0","eslint-plugin-testing-library":"^5.1.0","@typescript-eslint/eslint-plugin":"^5.3.0","eslint-import-resolver-typescript":"^2.5.0"},"peerDependencies":{"zod":"^3.19.1","react":"^16.8.0 || ^17.0.0 || ^18.0.0","@remix-run/react":"^1.10.0","@remix-run/server-runtime":"^1.10.0"},"_npmOperationalInternal":{"tmp":"tmp/remix-utils_6.6.0_1688422747283_0.9084543209483877","host":"s3://npm-registry-packages"}},"7.0.0":{"name":"remix-utils","version":"7.0.0","keywords":["remix","remix.run","react","utils","request","response","csrf","redirect-back","outlet","client-only","hydrated","body parser"],"author":{"url":"https://sergiodxa.com","name":"Sergio Xalambrí","email":"hello@sergiodxa.com"},"license":"MIT","_id":"remix-utils@7.0.0","maintainers":[{"name":"sergiodxa","email":"sergiodxa@gmail.com"}],"homepage":"https://github.com/sergiodxa/remix-utils#readme","bugs":{"url":"https://github.com/sergiodxa/remix-utils/issues"},"dist":{"shasum":"1ed30fdf33e60c846c79776fe0a628d4325cc860","tarball":"https://registry.npmjs.org/remix-utils/-/remix-utils-7.0.0.tgz","fileCount":84,"integrity":"sha512-6cSGMd1mlycKRaaMGIvwqPbzW477lEE1BkD/4xntFb0STQdKodmIJWoU/mjvrV09lKgbgBeyPdQQm+pHjys6Fg==","signatures":[{"sig":"MEUCIG0b+DqdPo6Sxg8YYAs+lovMYAN9XOAR5RLPK1Gy2psMAiEA3eVEfoC0NKkvQ4LXDfMV/Cu1CT3dfPHCcQCm2czpBGg=","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":170207},"main":"./build/index.js","types":"./build/index.d.ts","engines":{"node":">=18.0.0"},"gitHead":"136bc7023f5a676ecb8042f2a9736f2c0abbba8d","scripts":{"lint":"eslint --ext .ts,.tsx src/","test":"vitest --run","build":"tsc --project tsconfig.json --module ESNext --outDir ./build","format":"prettier --write \"src/**/*.ts\" \"src/**/*.tsx\" \"test/**/*.ts\" \"test/**/*.tsx\"","prepare":"npm run build","postbuild":"prettier --write \"build/**/*.js\" \"build/**/*.d.ts\"","typecheck":"tsc --project tsconfig.json --noEmit","test:watch":"vitest","test:coverage":"vitest --coverage"},"_npmUser":{"name":"sergiodxa","email":"sergiodxa@gmail.com"},"repository":{"url":"git+https://github.com/sergiodxa/remix-utils.git","type":"git"},"_npmVersion":"8.19.2","description":"This package contains simple utility functions to use with [Remix.run](https://remix.run).","directories":{},"sideEffects":false,"_nodeVersion":"16.18.1","dependencies":{"uuid":"^8.3.2","is-ip":"^3.1.0","crypto-js":"^4.1.1","type-fest":"^2.5.2","schema-dts":"^1.1.0","intl-parse-accept-language":"^1.0.0"},"_hasShrinkwrap":false,"readmeFilename":"README.md","devDependencies":{"msw":"^1.2.3","zod":"^3.19.1","vite":"^4.4.9","react":"^18.2.0","eslint":"^8.12.0","vitest":"^0.34.1","ts-node":"^10.4.0","prettier":"^2.5.1","happy-dom":"^10.9.0","react-dom":"^18.2.0","typescript":"^5.1.6","@types/uuid":"^8.3.3","@types/react":"^17.0.14","@remix-run/node":"^1.19.2","@remix-run/react":"^1.19.2","@types/crypto-js":"^4.1.1","@remix-run/router":"^1.7.2","@remix-run/testing":"^1.19.3","@vitest/coverage-v8":"^0.34.1","eslint-plugin-react":"^7.26.1","@vitejs/plugin-react":"^4.0.4","eslint-plugin-import":"^2.22.1","eslint-plugin-cypress":"^2.11.3","eslint-plugin-promise":"^6.0.0","eslint-plugin-unicorn":"^41.0.1","@testing-library/react":"^12.1.2","eslint-config-prettier":"^8.3.0","eslint-plugin-jest-dom":"^4.0.1","eslint-plugin-jsx-a11y":"^6.4.1","eslint-plugin-prettier":"^4.0.0","@remix-run/server-runtime":"^1.19.2","@testing-library/jest-dom":"^5.15.0","@typescript-eslint/parser":"^5.3.0","eslint-plugin-react-hooks":"^4.2.0","eslint-plugin-testing-library":"^5.1.0","@typescript-eslint/eslint-plugin":"^5.3.0","eslint-import-resolver-typescript":"^2.5.0"},"peerDependencies":{"zod":"^3.19.1","react":"^18.0.0","@remix-run/react":"^1.19.1","@remix-run/router":"^1.7.2","@remix-run/server-runtime":"^1.19.1"},"_npmOperationalInternal":{"tmp":"tmp/remix-utils_7.0.0_1692913013584_0.535592484673358","host":"s3://npm-registry-packages"}},"7.0.0-pre.1":{"name":"remix-utils","version":"7.0.0-pre.1","keywords":["remix","remix.run","react","utils","request","response","csrf","redirect-back","outlet","client-only","hydrated","body parser"],"author":{"url":"https://sergiodxa.com","name":"Sergio Xalambrí","email":"hello@sergiodxa.com"},"license":"MIT","_id":"remix-utils@7.0.0-pre.1","maintainers":[{"name":"sergiodxa","email":"sergiodxa@gmail.com"}],"homepage":"https://github.com/sergiodxa/remix-utils#readme","bugs":{"url":"https://github.com/sergiodxa/remix-utils/issues"},"dist":{"shasum":"71f4fecb44c035294c0c68d6e45a9f984d384b0f","tarball":"https://registry.npmjs.org/remix-utils/-/remix-utils-7.0.0-pre.1.tgz","fileCount":84,"integrity":"sha512-cMx8AWcRYiQo7kH4je1dz4/YqVAA6jZ2eMduMZm/+jCQjmOxYzw0bfSJ8tkF2a0GF5SxO+4H/ljtDz6+dTxbIg==","signatures":[{"sig":"MEQCIBhgnBuz3O5LzyCEmfUxzvEJQ0kEqAQNavyKEmwOanPMAiB3J21CraH6KK4Ey9JYy6N8+OEQLLTDAS2HUo1zVuOzxw==","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":168640},"main":"./build/index.js","type":"module","types":"./build/index.d.ts","engines":{"node":">=18.0.0"},"gitHead":"136bc7023f5a676ecb8042f2a9736f2c0abbba8d","scripts":{"lint":"eslint --ext .ts,.tsx src/","test":"vitest --run","build":"tsc --project tsconfig.json --module ESNext --outDir ./build","format":"prettier --write \"src/**/*.ts\" \"src/**/*.tsx\" \"test/**/*.ts\" \"test/**/*.tsx\"","prepare":"npm run build","postbuild":"prettier --write \"build/**/*.js\" \"build/**/*.d.ts\"","typecheck":"tsc --project tsconfig.json --noEmit","test:watch":"vitest","test:coverage":"vitest --coverage"},"_npmUser":{"name":"sergiodxa","email":"sergiodxa@gmail.com"},"repository":{"url":"git+https://github.com/sergiodxa/remix-utils.git","type":"git"},"_npmVersion":"8.19.2","description":"This package contains simple utility functions to use with [Remix.run](https://remix.run).","directories":{},"sideEffects":false,"_nodeVersion":"16.18.1","dependencies":{"uuid":"^8.3.2","is-ip":"^3.1.0","crypto-js":"^4.1.1","type-fest":"^2.5.2","schema-dts":"^1.1.0","intl-parse-accept-language":"^1.0.0"},"_hasShrinkwrap":false,"readmeFilename":"README.md","devDependencies":{"msw":"^1.2.3","zod":"^3.19.1","vite":"^4.4.9","react":"^18.2.0","eslint":"^8.12.0","vitest":"^0.34.1","ts-node":"^10.4.0","prettier":"^2.5.1","happy-dom":"^10.9.0","react-dom":"^18.2.0","typescript":"^5.1.6","@types/uuid":"^8.3.3","@types/react":"^17.0.14","@remix-run/node":"^1.19.2","@remix-run/react":"^1.19.2","@types/crypto-js":"^4.1.1","@remix-run/router":"^1.7.2","@remix-run/testing":"^1.19.3","@vitest/coverage-v8":"^0.34.1","eslint-plugin-react":"^7.26.1","@vitejs/plugin-react":"^4.0.4","eslint-plugin-import":"^2.22.1","eslint-plugin-cypress":"^2.11.3","eslint-plugin-promise":"^6.0.0","eslint-plugin-unicorn":"^41.0.1","@testing-library/react":"^12.1.2","eslint-config-prettier":"^8.3.0","eslint-plugin-jest-dom":"^4.0.1","eslint-plugin-jsx-a11y":"^6.4.1","eslint-plugin-prettier":"^4.0.0","@remix-run/server-runtime":"^1.19.2","@testing-library/jest-dom":"^5.15.0","@typescript-eslint/parser":"^5.3.0","eslint-plugin-react-hooks":"^4.2.0","eslint-plugin-testing-library":"^5.1.0","@typescript-eslint/eslint-plugin":"^5.3.0","eslint-import-resolver-typescript":"^2.5.0"},"peerDependencies":{"zod":"^3.19.1","react":"^18.0.0","@remix-run/react":"^1.19.1","@remix-run/router":"^1.7.2","@remix-run/server-runtime":"^1.19.1"},"_npmOperationalInternal":{"tmp":"tmp/remix-utils_7.0.0-pre.1_1692984535303_0.3045212543011633","host":"s3://npm-registry-packages"}},"7.0.0-pre.2":{"name":"remix-utils","version":"7.0.0-pre.2","keywords":["remix","remix.run","react","utils","request","response","csrf","redirect-back","outlet","client-only","hydrated","body parser"],"author":{"url":"https://sergiodxa.com","name":"Sergio Xalambrí","email":"hello@sergiodxa.com"},"license":"MIT","_id":"remix-utils@7.0.0-pre.2","maintainers":[{"name":"sergiodxa","email":"sergiodxa@gmail.com"}],"homepage":"https://github.com/sergiodxa/remix-utils#readme","bugs":{"url":"https://github.com/sergiodxa/remix-utils/issues"},"dist":{"shasum":"4a770f992c8e9d0eeef2c265b6665845a472b154","tarball":"https://registry.npmjs.org/remix-utils/-/remix-utils-7.0.0-pre.2.tgz","fileCount":82,"integrity":"sha512-eL/xE6Qh56S2NDNWoP99J4GeR7Ro/encjtT8VmD2cAYMRhzaiHgSU73Cgt6aTPEGXFiXinNBk7/LnyzfYTnXyQ==","signatures":[{"sig":"MEUCIQCd0kgS/wWluO/1nW64aHsvnUxXhjfqFyTh/TrO3ULfEQIgOM+Y80hUKLNO4hOHaoPX1RF/v3IvDceMVzoG3ENamaw=","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":166964},"main":"./build/index.js","type":"module","types":"./build/index.d.ts","engines":{"node":">=18.0.0"},"gitHead":"de258a97f7834cfd9af60e5e66ac8314418bbd24","scripts":{"lint":"eslint --ext .ts,.tsx src/","test":"vitest --run","build":"tsc --project tsconfig.json --module ESNext --outDir ./build","format":"prettier --write \"src/**/*.ts\" \"src/**/*.tsx\" \"test/**/*.ts\" \"test/**/*.tsx\"","prepare":"npm run build","postbuild":"prettier --write \"build/**/*.js\" \"build/**/*.d.ts\"","typecheck":"tsc --project tsconfig.json --noEmit","test:watch":"vitest","test:coverage":"vitest --coverage"},"_npmUser":{"name":"sergiodxa","email":"sergiodxa@gmail.com"},"repository":{"url":"git+https://github.com/sergiodxa/remix-utils.git","type":"git"},"_npmVersion":"8.19.2","description":"This package contains simple utility functions to use with [Remix.run](https://remix.run).","directories":{},"sideEffects":false,"_nodeVersion":"16.18.1","dependencies":{"uuid":"^8.3.2","is-ip":"^3.1.0","crypto-js":"^4.1.1","type-fest":"^2.5.2","schema-dts":"^1.1.0","intl-parse-accept-language":"^1.0.0"},"_hasShrinkwrap":false,"readmeFilename":"README.md","devDependencies":{"msw":"^1.2.3","zod":"^3.19.1","vite":"^4.4.9","react":"^18.2.0","eslint":"^8.12.0","vitest":"^0.34.1","ts-node":"^10.4.0","prettier":"^2.5.1","happy-dom":"^10.9.0","react-dom":"^18.2.0","typescript":"^5.1.6","@types/uuid":"^8.3.3","@types/react":"^17.0.14","@remix-run/node":"^1.19.2","@remix-run/react":"^1.19.2","@types/crypto-js":"^4.1.1","@remix-run/router":"^1.7.2","@remix-run/testing":"^1.19.3","@vitest/coverage-v8":"^0.34.1","eslint-plugin-react":"^7.26.1","@vitejs/plugin-react":"^4.0.4","eslint-plugin-import":"^2.22.1","eslint-plugin-cypress":"^2.11.3","eslint-plugin-promise":"^6.0.0","eslint-plugin-unicorn":"^41.0.1","@testing-library/react":"^12.1.2","eslint-config-prettier":"^8.3.0","eslint-plugin-jest-dom":"^4.0.1","eslint-plugin-jsx-a11y":"^6.4.1","eslint-plugin-prettier":"^4.0.0","@remix-run/server-runtime":"^1.19.2","@testing-library/jest-dom":"^5.15.0","@typescript-eslint/parser":"^5.3.0","eslint-plugin-react-hooks":"^4.2.0","eslint-plugin-testing-library":"^5.1.0","@typescript-eslint/eslint-plugin":"^5.3.0","eslint-import-resolver-typescript":"^2.5.0"},"peerDependencies":{"zod":"^3.19.1","react":"^18.0.0","@remix-run/react":"^1.19.1","@remix-run/router":"^1.7.2","@remix-run/server-runtime":"^1.19.1"},"_npmOperationalInternal":{"tmp":"tmp/remix-utils_7.0.0-pre.2_1692999514148_0.7871242390283573","host":"s3://npm-registry-packages"}},"7.0.0-pre.3":{"name":"remix-utils","version":"7.0.0-pre.3","keywords":["remix","remix.run","react","utils","request","response","csrf","redirect-back","client-only","hydrated","server-only","cors","rolling cookie","safe redirect","typed cookie","typed session","client IP address","client locale","json hash","prefetch","named action"],"author":{"url":"https://sergiodxa.com","name":"Sergio Xalambrí","email":"hello@sergiodxa.com"},"license":"MIT","_id":"remix-utils@7.0.0-pre.3","maintainers":[{"name":"sergiodxa","email":"sergiodxa@gmail.com"}],"homepage":"https://github.com/sergiodxa/remix-utils#readme","bugs":{"url":"https://github.com/sergiodxa/remix-utils/issues"},"dist":{"shasum":"1e0f3595fd302f7d27a60527a751a716e39e7f48","tarball":"https://registry.npmjs.org/remix-utils/-/remix-utils-7.0.0-pre.3.tgz","fileCount":74,"integrity":"sha512-jFtNjicKmlX2HCvDuKSzkpj204Yxy9dvZ+bnHXb7ohaScKzv4bbEi60EHbT+2M7DC8CYip+ZVPktOLwwLVTzvA==","signatures":[{"sig":"MEUCIQCQs7z5MxjFNsAfPMkNVMUPc7Etdf7y1Ag0MGi8JXIOvwIgU8EMy70OtAG3K7YVqv2wQYJZJBcK6wynf0GRmcHDdzI=","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":166730},"main":"./build/index.js","type":"module","engines":{"node":">=18.0.0"},"exports":{"./cors":{"types":"./build/server/cors.d.ts","default":"./build/server/cors.js"},"./csrf":{"types":"./build/server/csrf.d.ts","default":"./build/server/csrf.js"},"./promise":{"types":"./build/common/promise.d.ts","default":"./build/common/promise.js"},"./honeypot":{"types":"./build/server/honeypot.d.ts","default":"./build/server/honeypot.js"},"./json-hash":{"types":"./build/server/json-hash.d.ts","default":"./build/server/json-hash.js"},"./responses":{"types":"./build/server/responses.d.ts","default":"./build/server/responses.js"},"./respond-to":{"types":"./build/server/respond-to.d.ts","default":"./build/server/respond-to.js"},"./client-only":{"types":"./build/react/client-only.d.ts","default":"./build/react/client-only.js"},"./is-prefetch":{"types":"./build/server/is-prefetch.d.ts","default":"./build/server/is-prefetch.js"},"./server-only":{"types":"./build/react/server-only.d.ts","default":"./build/react/server-only.js"},"./use-locales":{"types":"./build/react/use-locales.d.ts","default":"./build/react/use-locales.js"},"./cache-assets":{"types":"./build/client/cache-assets.d.ts","default":"./build/client/cache-assets.js"},"./event-stream":{"types":"./build/server/event-stream.d.ts","default":"./build/server/event-stream.js"},"./fetcher-type":{"types":"./build/react/fetcher-type.d.ts","default":"./build/react/fetcher-type.js"},"./named-action":{"types":"./build/server/named-action.d.ts","default":"./build/server/named-action.js"},"./typed-cookie":{"types":"./build/server/typed-cookie.d.ts","default":"./build/server/typed-cookie.js"},"./use-hydrated":{"types":"./build/react/use-hydrated.d.ts","default":"./build/react/use-hydrated.js"},"./redirect-back":{"types":"./build/server/redirect-back.d.ts","default":"./build/server/redirect-back.js"},"./safe-redirect":{"types":"./build/server/safe-redirect.d.ts","default":"./build/server/safe-redirect.js"},"./typed-session":{"types":"./build/server/typed-session.d.ts","default":"./build/server/typed-session.js"},"./honeypot-input":{"types":"./build/react/honeypot-inputs.d.ts","default":"./build/react/honeypot-inputs.js"},"./rolling-cookie":{"types":"./build/server/rolling-cookie.d.ts","default":"./build/server/rolling-cookie.js"},"./external-scripts":{"types":"./build/react/external-scripts.d.ts","default":"./build/react/external-scripts.js"},"./use-event-source":{"types":"./build/react/use-event-source.d.ts","default":"./build/react/use-event-source.js"},"./authenticity-token":{"types":"./build/react/authenticity-token.d.ts","default":"./build/react/authenticity-token.js"},"./get-client-locales":{"types":"./build/server/get-client-locales.d.ts","default":"./build/server/get-client-locales.js"},"./use-should-hydrate":{"types":"./build/react/use-should-hydrate.d.ts","default":"./build/react/use-should-hydrate.js"},"./parse-accept-header":{"types":"./build/server/parse-accept-header.d.ts","default":"./build/server/parse-accept-header.js"},"./preload-route-assets":{"types":"./build/server/preload-route-assets.d.ts","default":"./build/server/preload-route-assets.js"},"./use-debounce-fetcher":{"types":"./build/react/use-debounce-fetcher.d.ts","default":"./build/react/use-debounce-fetcher.js"},"./get-client-ip-address":{"types":"./build/server/get-client-ip-address.d.ts","default":"./build/server/get-client-ip-address.js"},"./use-delegated-anchors":{"types":"./build/react/use-delegated-anchors.d.ts","default":"./build/react/use-delegated-anchors.js"},"./use-global-navigation-state":{"types":"./build/react/use-global-navigation-state.d.ts","default":"./build/react/use-global-navigation-state.js"}},"gitHead":"5a69f031495dc4b9cd3623ea888028b48560ae88","scripts":{"lint":"eslint --ext .ts,.tsx src/","test":"vitest --run","build":"tsc --project tsconfig.json --module ESNext --outDir ./build","format":"prettier --write \"src/**/*.ts\" \"src/**/*.tsx\" \"test/**/*.ts\" \"test/**/*.tsx\"","prepare":"npm run build","postbuild":"prettier --write \"build/**/*.js\" \"build/**/*.d.ts\"","typecheck":"tsc --project tsconfig.json --noEmit","test:watch":"vitest","test:coverage":"vitest --coverage"},"_npmUser":{"name":"sergiodxa","email":"sergiodxa@gmail.com"},"repository":{"url":"git+https://github.com/sergiodxa/remix-utils.git","type":"git"},"_npmVersion":"8.19.2","description":"This package contains simple utility functions to use with [Remix.run](https://remix.run).","directories":{},"sideEffects":false,"_nodeVersion":"16.18.1","dependencies":{"uuid":"^8.3.2","is-ip":"^3.1.0","crypto-js":"^4.1.1","type-fest":"^2.5.2","schema-dts":"^1.1.0","intl-parse-accept-language":"^1.0.0"},"_hasShrinkwrap":false,"readmeFilename":"README.md","devDependencies":{"msw":"^1.2.3","zod":"^3.19.1","vite":"^4.4.9","react":"^18.2.0","eslint":"^8.12.0","vitest":"^0.34.1","ts-node":"^10.4.0","prettier":"^2.5.1","happy-dom":"^10.9.0","react-dom":"^18.2.0","typescript":"^5.1.6","@types/uuid":"^8.3.3","@types/react":"^17.0.14","@remix-run/node":"^1.19.2","@remix-run/react":"^1.19.2","@types/crypto-js":"^4.1.1","@remix-run/router":"^1.7.2","@remix-run/testing":"^1.19.3","@vitest/coverage-v8":"^0.34.1","eslint-plugin-react":"^7.26.1","@vitejs/plugin-react":"^4.0.4","eslint-plugin-import":"^2.22.1","eslint-plugin-cypress":"^2.11.3","eslint-plugin-promise":"^6.0.0","eslint-plugin-unicorn":"^41.0.1","@testing-library/react":"^12.1.2","eslint-config-prettier":"^8.3.0","eslint-plugin-jest-dom":"^4.0.1","eslint-plugin-jsx-a11y":"^6.4.1","eslint-plugin-prettier":"^4.0.0","@remix-run/server-runtime":"^1.19.2","@testing-library/jest-dom":"^5.15.0","@typescript-eslint/parser":"^5.3.0","eslint-plugin-react-hooks":"^4.2.0","eslint-plugin-testing-library":"^5.1.0","@typescript-eslint/eslint-plugin":"^5.3.0","eslint-import-resolver-typescript":"^2.5.0"},"peerDependencies":{"zod":"^3.19.1","react":"^18.0.0","@remix-run/react":"^1.19.1","@remix-run/router":"^1.7.2","@remix-run/server-runtime":"^1.19.1"},"_npmOperationalInternal":{"tmp":"tmp/remix-utils_7.0.0-pre.3_1693200031605_0.9942051417066333","host":"s3://npm-registry-packages"}},"7.0.0-pre.4":{"name":"remix-utils","version":"7.0.0-pre.4","keywords":["remix","remix.run","react","utils","request","response","csrf","redirect-back","client-only","hydrated","server-only","cors","rolling cookie","safe redirect","typed cookie","typed session","client IP address","client locale","json hash","prefetch","named action"],"author":{"url":"https://sergiodxa.com","name":"Sergio Xalambrí","email":"hello@sergiodxa.com"},"license":"MIT","_id":"remix-utils@7.0.0-pre.4","maintainers":[{"name":"sergiodxa","email":"sergiodxa@gmail.com"}],"homepage":"https://github.com/sergiodxa/remix-utils#readme","bugs":{"url":"https://github.com/sergiodxa/remix-utils/issues"},"dist":{"shasum":"d42dca08071d62e55ac42d7feb8cadd4c4bea514","tarball":"https://registry.npmjs.org/remix-utils/-/remix-utils-7.0.0-pre.4.tgz","fileCount":74,"integrity":"sha512-4kq7GdBRsjw9lTWnKfJkvv68Q9TqkQjSYYHGK901iJAeoUwIDGQy7LQeXGVpDNwwEQhhLc/GXckNjwVruehUCw==","signatures":[{"sig":"MEYCIQCJLCuoI/W8Nl9VF2A71AF4Ur46fZd95gw1U+Pls2qGbwIhALzM5w5+KZH3WBX+zq7+V4Cv7yX90KHjcfZmILnkPrth","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":172169},"type":"module","engines":{"node":">=18.0.0"},"exports":{"./cors":"./build/server/cors.js","./promise":"./build/common/promise.js","./json-hash":"./build/server/json-hash.js","./responses":"./build/server/responses.js","./sse/react":"./build/react/use-event-source.js","./csrf/react":"./build/react/authenticity-token.js","./respond-to":"./build/server/respond-to.js","./sse/server":"./build/server/event-stream.js","./client-only":"./build/react/client-only.js","./csrf/server":"./build/server/csrf.js","./is-prefetch":"./build/server/is-prefetch.js","./server-only":"./build/react/server-only.js","./cache-assets":"./build/client/cache-assets.js","./fetcher-type":"./build/react/fetcher-type.js","./named-action":"./build/server/named-action.js","./typed-cookie":"./build/server/typed-cookie.js","./use-hydrated":"./build/react/use-hydrated.js","./locales/react":"./build/react/use-locales.js","./redirect-back":"./build/server/redirect-back.js","./safe-redirect":"./build/server/safe-redirect.js","./typed-session":"./build/server/typed-session.js","./honeypot/react":"./build/react/honeypot.js","./locales/server":"./build/server/get-client-locales.js","./rolling-cookie":"./build/server/rolling-cookie.js","./honeypot/server":"./build/server/honeypot.js","./external-scripts":"./build/react/external-scripts.js","./use-should-hydrate":"./build/react/use-should-hydrate.js","./parse-accept-header":"./build/server/parse-accept-header.js","./preload-route-assets":"./build/server/preload-route-assets.js","./get-client-ip-address":"./build/server/get-client-ip-address.js","./use-debounced-fetcher":"./build/react/use-debounced-fetcher.js","./use-delegated-anchors":"./build/react/use-delegated-anchors.js","./use-global-pending-state":"./build/react/use-global-pending-state.js"},"gitHead":"46b4422d29ec58f839891353f312ef1ae08813ed","scripts":{"lint":"eslint --ext .ts,.tsx src/","test":"vitest --run","build":"tsc --project tsconfig.json --module ESNext --outDir ./build","format":"prettier --write \"src/**/*.ts\" \"src/**/*.tsx\" \"test/**/*.ts\" \"test/**/*.tsx\"","prepare":"npm run build","postbuild":"prettier --write \"build/**/*.js\" \"build/**/*.d.ts\"","typecheck":"tsc --project tsconfig.json --noEmit","test:watch":"vitest","test:coverage":"vitest --coverage"},"_npmUser":{"name":"sergiodxa","email":"sergiodxa@gmail.com"},"repository":{"url":"git+https://github.com/sergiodxa/remix-utils.git","type":"git"},"_npmVersion":"9.6.7","description":"This package contains simple utility functions to use with [Remix.run](https://remix.run).","directories":{},"sideEffects":false,"_nodeVersion":"18.17.1","dependencies":{"zod":"^3.19.1","is-ip":"^3.1.0","react":"^18.0.0","crypto-js":"^4.1.1","type-fest":"^2.5.2","@remix-run/deno":"^2.0.0","@remix-run/node":"^2.0.0","@remix-run/react":"^2.0.0","@remix-run/router":"^1.7.2","@remix-run/cloudflare":"^2.0.0","intl-parse-accept-language":"^1.0.0"},"_hasShrinkwrap":false,"readmeFilename":"README.md","devDependencies":{"msw":"^1.2.3","zod":"^3.19.1","vite":"^4.4.9","react":"^18.0.0","eslint":"^8.12.0","vitest":"^0.34.1","ts-node":"^10.4.0","prettier":"^2.5.1","happy-dom":"^10.9.0","react-dom":"^18.0.0","typescript":"^5.1.6","@types/react":"^17.0.14","@remix-run/node":"^2.0.0","@remix-run/react":"^2.0.0","@types/crypto-js":"^4.1.1","@remix-run/router":"^1.7.2","@remix-run/testing":"^2.0.0","@vitest/coverage-v8":"^0.34.1","eslint-plugin-react":"^7.26.1","@vitejs/plugin-react":"^4.0.4","eslint-plugin-import":"^2.22.1","eslint-plugin-cypress":"^2.11.3","eslint-plugin-promise":"^6.0.0","eslint-plugin-unicorn":"^41.0.1","@testing-library/react":"^12.1.2","eslint-config-prettier":"^8.3.0","eslint-plugin-jest-dom":"^4.0.1","eslint-plugin-jsx-a11y":"^6.4.1","eslint-plugin-prettier":"^4.0.0","@testing-library/jest-dom":"^5.15.0","@typescript-eslint/parser":"^5.3.0","eslint-plugin-react-hooks":"^4.2.0","eslint-plugin-testing-library":"^5.1.0","@typescript-eslint/eslint-plugin":"^5.3.0","eslint-import-resolver-typescript":"^2.5.0"},"optionalDependencies":{"zod":"^3.19.1","is-ip":"^3.1.0","react":"^18.0.0","crypto-js":"^4.1.1","@remix-run/deno":"^2.0.0","@remix-run/node":"^2.0.0","@remix-run/react":"^2.0.0","@remix-run/router":"^1.7.2","@remix-run/cloudflare":"^2.0.0","intl-parse-accept-language":"^1.0.0"},"_npmOperationalInternal":{"tmp":"tmp/remix-utils_7.0.0-pre.4_1696454519733_0.695033929666403","host":"s3://npm-registry-packages"}},"7.0.0-pre.5":{"name":"remix-utils","version":"7.0.0-pre.5","keywords":["remix","remix.run","react","utils","request","response","csrf","redirect-back","client-only","hydrated","server-only","cors","rolling cookie","safe redirect","typed cookie","typed session","client IP address","client locale","json hash","prefetch","named action"],"author":{"url":"https://sergiodxa.com","name":"Sergio Xalambrí","email":"hello@sergiodxa.com"},"license":"MIT","_id":"remix-utils@7.0.0-pre.5","maintainers":[{"name":"sergiodxa","email":"sergiodxa@gmail.com"}],"homepage":"https://github.com/sergiodxa/remix-utils#readme","bugs":{"url":"https://github.com/sergiodxa/remix-utils/issues"},"dist":{"shasum":"dea676c319f94f4af921a047a227a347123016f1","tarball":"https://registry.npmjs.org/remix-utils/-/remix-utils-7.0.0-pre.5.tgz","fileCount":74,"integrity":"sha512-XDKvEo6ICtjD+IH9YsP+uPEruFoSUGsmwrxHXROB340zz+jHcnDtn3bMB/APUT6NVZcCpRnVHYEDB+G4Hm+6MA==","signatures":[{"sig":"MEUCIDeuoW6sm6Fm4T/xekSeezi+nn8i5dtY96PGx5chJn99AiEA8vmbuSSDJwV1/st9l+PUAA0nxSWF3Iw3DF24WE99D/Y=","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":175031},"type":"module","engines":{"node":">=18.0.0"},"exports":{"./cors":"./build/server/cors.js","./promise":"./build/common/promise.js","./json-hash":"./build/server/json-hash.js","./responses":"./build/server/responses.js","./sse/react":"./build/react/use-event-source.js","./csrf/react":"./build/react/authenticity-token.js","./respond-to":"./build/server/respond-to.js","./sse/server":"./build/server/event-stream.js","./client-only":"./build/react/client-only.js","./csrf/server":"./build/server/csrf.js","./is-prefetch":"./build/server/is-prefetch.js","./server-only":"./build/react/server-only.js","./cache-assets":"./build/client/cache-assets.js","./fetcher-type":"./build/react/fetcher-type.js","./named-action":"./build/server/named-action.js","./package.json":"./package.json","./typed-cookie":"./build/server/typed-cookie.js","./use-hydrated":"./build/react/use-hydrated.js","./locales/react":"./build/react/use-locales.js","./redirect-back":"./build/server/redirect-back.js","./safe-redirect":"./build/server/safe-redirect.js","./typed-session":"./build/server/typed-session.js","./honeypot/react":"./build/react/honeypot.js","./locales/server":"./build/server/get-client-locales.js","./rolling-cookie":"./build/server/rolling-cookie.js","./honeypot/server":"./build/server/honeypot.js","./external-scripts":"./build/react/external-scripts.js","./use-should-hydrate":"./build/react/use-should-hydrate.js","./parse-accept-header":"./build/server/parse-accept-header.js","./preload-route-assets":"./build/server/preload-route-assets.js","./get-client-ip-address":"./build/server/get-client-ip-address.js","./use-debounced-fetcher":"./build/react/use-debounced-fetcher.js","./use-delegated-anchors":"./build/react/use-delegated-anchors.js","./use-global-pending-state":"./build/react/use-global-pending-state.js"},"gitHead":"87f5e380369b463714c9b8910785937abbc0d939","scripts":{"lint":"eslint --ext .ts,.tsx src/","test":"vitest --run","build":"tsc --project tsconfig.json --module ESNext --outDir ./build","format":"prettier --write \"src/**/*.ts\" \"src/**/*.tsx\" \"test/**/*.ts\" \"test/**/*.tsx\"","prepare":"npm run build","postbuild":"prettier --write \"build/**/*.js\" \"build/**/*.d.ts\"","typecheck":"tsc --project tsconfig.json --noEmit","test:watch":"vitest","test:coverage":"vitest --coverage"},"_npmUser":{"name":"sergiodxa","email":"sergiodxa@gmail.com"},"repository":{"url":"git+https://github.com/sergiodxa/remix-utils.git","type":"git"},"_npmVersion":"8.19.2","description":"This package contains simple utility functions to use with [Remix.run](https://remix.run).","directories":{},"sideEffects":false,"_nodeVersion":"16.18.1","dependencies":{"type-fest":"^2.5.2"},"_hasShrinkwrap":false,"readmeFilename":"README.md","devDependencies":{"msw":"^1.2.3","zod":"^3.19.1","vite":"^4.4.9","react":"^18.0.0","eslint":"^8.12.0","vitest":"^0.34.1","ts-node":"^10.4.0","prettier":"^2.5.1","happy-dom":"^10.9.0","react-dom":"^18.0.0","typescript":"^5.1.6","@types/react":"^17.0.14","@remix-run/node":"^2.0.0","@remix-run/react":"^2.0.0","@types/crypto-js":"^4.1.1","@remix-run/router":"^1.7.2","@remix-run/testing":"^2.0.0","@vitest/coverage-v8":"^0.34.1","eslint-plugin-react":"^7.26.1","@vitejs/plugin-react":"^4.0.4","eslint-plugin-import":"^2.22.1","eslint-plugin-cypress":"^2.11.3","eslint-plugin-promise":"^6.0.0","eslint-plugin-unicorn":"^41.0.1","@testing-library/react":"^12.1.2","eslint-config-prettier":"^8.3.0","eslint-plugin-jest-dom":"^4.0.1","eslint-plugin-jsx-a11y":"^6.4.1","eslint-plugin-prettier":"^4.0.0","@testing-library/jest-dom":"^5.15.0","@typescript-eslint/parser":"^5.3.0","eslint-plugin-react-hooks":"^4.2.0","eslint-plugin-testing-library":"^5.1.0","@typescript-eslint/eslint-plugin":"^5.3.0","eslint-import-resolver-typescript":"^2.5.0"},"peerDependencies":{"zod":"^3.19.1","is-ip":"^3.1.0","react":"^18.0.0","crypto-js":"^4.1.1","@remix-run/deno":"^2.0.0","@remix-run/node":"^2.0.0","@remix-run/react":"^2.0.0","@remix-run/router":"^1.7.2","@remix-run/cloudflare":"^2.0.0","intl-parse-accept-language":"^1.0.0"},"peerDependenciesMeta":{"zod":{"optional":true},"is-ip":{"optional":true},"react":{"optional":true},"crypto-js":{"optional":true},"@remix-run/deno":{"optional":true},"@remix-run/node":{"optional":true},"@remix-run/react":{"optional":true},"@remix-run/router":{"optional":true},"@remix-run/cloudflare":{"optional":true},"intl-parse-accept-language":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/remix-utils_7.0.0-pre.5_1696567607220_0.09260929835740983","host":"s3://npm-registry-packages"}},"7.0.0-pre.6":{"name":"remix-utils","version":"7.0.0-pre.6","keywords":["remix","remix.run","react","utils","request","response","csrf","redirect-back","client-only","hydrated","server-only","cors","rolling cookie","safe redirect","typed cookie","typed session","client IP address","client locale","json hash","prefetch","named action"],"author":{"url":"https://sergiodxa.com","name":"Sergio Xalambrí","email":"hello@sergiodxa.com"},"license":"MIT","_id":"remix-utils@7.0.0-pre.6","maintainers":[{"name":"sergiodxa","email":"sergiodxa@gmail.com"}],"homepage":"https://github.com/sergiodxa/remix-utils#readme","bugs":{"url":"https://github.com/sergiodxa/remix-utils/issues"},"dist":{"shasum":"395c9d910cedb669f6cb5c41df5537e3b7e5a4fe","tarball":"https://registry.npmjs.org/remix-utils/-/remix-utils-7.0.0-pre.6.tgz","fileCount":76,"integrity":"sha512-5uDx7nCaX+VQOQJo++S2LD7U9dlydXFpZlCspfecp61h9vnlr7Jcl/ZLmCa5qZhS//XowfHHhDNjGC35lL0ycw==","signatures":[{"sig":"MEUCIF74mr1HKsnyEsVbW7p7qK7vOKiRSl/Yv7czgRqlMWUOAiEAlFn3kQtLDVlUr547xPWFefUob8BmvSLib9U8FnPRnB0=","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":445755},"type":"module","engines":{"node":">=18.0.0"},"exports":{"./cors":"./build/server/cors.js","./promise":"./build/common/promise.js","./json-hash":"./build/server/json-hash.js","./responses":"./build/server/responses.js","./sse/react":"./build/react/use-event-source.js","./csrf/react":"./build/react/authenticity-token.js","./respond-to":"./build/server/respond-to.js","./sse/server":"./build/server/event-stream.js","./client-only":"./build/react/client-only.js","./csrf/server":"./build/server/csrf.js","./is-prefetch":"./build/server/is-prefetch.js","./server-only":"./build/react/server-only.js","./cache-assets":"./build/client/cache-assets.js","./fetcher-type":"./build/react/fetcher-type.js","./named-action":"./build/server/named-action.js","./package.json":"./package.json","./typed-cookie":"./build/server/typed-cookie.js","./use-hydrated":"./build/react/use-hydrated.js","./locales/react":"./build/react/use-locales.js","./redirect-back":"./build/server/redirect-back.js","./safe-redirect":"./build/server/safe-redirect.js","./typed-session":"./build/server/typed-session.js","./honeypot/react":"./build/react/honeypot.js","./locales/server":"./build/server/get-client-locales.js","./rolling-cookie":"./build/server/rolling-cookie.js","./honeypot/server":"./build/server/honeypot.js","./external-scripts":"./build/react/external-scripts.js","./use-should-hydrate":"./build/react/use-should-hydrate.js","./parse-accept-header":"./build/server/parse-accept-header.js","./preload-route-assets":"./build/server/preload-route-assets.js","./get-client-ip-address":"./build/server/get-client-ip-address.js","./use-debounced-fetcher":"./build/react/use-debounced-fetcher.js","./use-delegated-anchors":"./build/react/use-delegated-anchors.js","./use-global-pending-state":"./build/react/use-global-pending-state.js"},"gitHead":"d2b12bbf92edec7aada0aa0f19a97afd0b48cdc8","scripts":{"lint":"eslint --ext .ts,.tsx src/","test":"vitest --run","build":"tsc --project tsconfig.json --outDir ./build","format":"prettier --write \"src/**/*.ts\" \"src/**/*.tsx\" \"test/**/*.ts\" \"test/**/*.tsx\"","prepare":"npm run build","postbuild":"prettier --write \"build/**/*.js\" \"build/**/*.d.ts\"","typecheck":"tsc --project tsconfig.json --noEmit","test:watch":"vitest","test:coverage":"vitest --coverage"},"_npmUser":{"name":"sergiodxa","email":"sergiodxa@gmail.com"},"repository":{"url":"git+https://github.com/sergiodxa/remix-utils.git","type":"git"},"_npmVersion":"9.6.7","description":"This package contains simple utility functions to use with [Remix.run](https://remix.run).","directories":{},"sideEffects":false,"_nodeVersion":"18.17.1","dependencies":{"type-fest":"^4.3.3"},"_hasShrinkwrap":false,"readmeFilename":"README.md","devDependencies":{"msw":"^1.3.2","zod":"^3.22.4","vite":"^4.4.11","is-ip":"5.0.1","react":"^18.0.0","eslint":"^8.12.0","vitest":"^0.34.6","ts-node":"^10.9.1","prettier":"^3.0.3","crypto-js":"^4.1.1","happy-dom":"^12.9.0","react-dom":"^18.0.0","typescript":"^5.2.2","@types/react":"^18.2.25","@remix-run/node":"^2.0.0","@remix-run/react":"^2.0.0","@types/crypto-js":"^4.1.2","@remix-run/router":"^1.7.2","@remix-run/testing":"^2.0.0","@vitest/coverage-v8":"^0.34.6","eslint-plugin-react":"^7.33.2","@vitejs/plugin-react":"^4.1.0","eslint-plugin-import":"^2.28.1","eslint-plugin-cypress":"^2.15.1","eslint-plugin-promise":"^6.1.1","eslint-plugin-unicorn":"^48.0.1","@testing-library/react":"^14.0.0","eslint-config-prettier":"^9.0.0","eslint-plugin-jest-dom":"^5.1.0","eslint-plugin-jsx-a11y":"^6.7.1","eslint-plugin-prettier":"^5.0.0","@testing-library/jest-dom":"^6.1.3","@typescript-eslint/parser":"^6.7.4","eslint-plugin-react-hooks":"^4.6.0","intl-parse-accept-language":"^1.0.0","eslint-plugin-testing-library":"^6.0.2","@typescript-eslint/eslint-plugin":"^6.7.4","eslint-import-resolver-typescript":"^3.6.1"},"peerDependencies":{"zod":"^3.22.4","is-ip":"^5.0.1","react":"^18.0.0","crypto-js":"^4.1.1","@remix-run/deno":"^2.0.0","@remix-run/node":"^2.0.0","@remix-run/react":"^2.0.0","@remix-run/router":"^1.7.2","@remix-run/cloudflare":"^2.0.0","intl-parse-accept-language":"^1.0.0"},"peerDependenciesMeta":{"zod":{"optional":true},"is-ip":{"optional":true},"react":{"optional":true},"crypto-js":{"optional":true},"@remix-run/deno":{"optional":true},"@remix-run/node":{"optional":true},"@remix-run/react":{"optional":true},"@remix-run/router":{"optional":true},"@remix-run/cloudflare":{"optional":true},"intl-parse-accept-language":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/remix-utils_7.0.0-pre.6_1696571413032_0.5124660120903326","host":"s3://npm-registry-packages"}},"7.0.0-pre.7":{"name":"remix-utils","version":"7.0.0-pre.7","keywords":["remix","remix.run","react","utils","request","response","csrf","redirect-back","client-only","hydrated","server-only","cors","rolling cookie","safe redirect","typed cookie","typed session","client IP address","client locale","json hash","prefetch","named action"],"author":{"url":"https://sergiodxa.com","name":"Sergio Xalambrí","email":"hello@sergiodxa.com"},"license":"MIT","_id":"remix-utils@7.0.0-pre.7","maintainers":[{"name":"sergiodxa","email":"sergiodxa@gmail.com"}],"homepage":"https://github.com/sergiodxa/remix-utils#readme","bugs":{"url":"https://github.com/sergiodxa/remix-utils/issues"},"dist":{"shasum":"768e53b59b044c655c1431b68bf9d59eb57589ff","tarball":"https://registry.npmjs.org/remix-utils/-/remix-utils-7.0.0-pre.7.tgz","fileCount":75,"integrity":"sha512-S5qUPzeoRfDZYArcpaUjlDlNSRnWFwaZ2GvDz1S+hMQx2yGarVYG9+remBifvDNC/e61JOOynmHei/WyCnPLZg==","signatures":[{"sig":"MEQCIGHzmVOIrCSjpBpUgbFTK8A+K1vOhKrqhVic/T+/+C+uAiADByb2watPjzyocpF8i5nMqrW4ZAARsVecW9DO3WsKOQ==","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":179570},"type":"module","engines":{"node":">=18.0.0"},"exports":{"./cors":"./build/server/cors.js","./promise":"./build/common/promise.js","./json-hash":"./build/server/json-hash.js","./responses":"./build/server/responses.js","./sse/react":"./build/react/use-event-source.js","./csrf/react":"./build/react/authenticity-token.js","./respond-to":"./build/server/respond-to.js","./sse/server":"./build/server/event-stream.js","./client-only":"./build/react/client-only.js","./csrf/server":"./build/server/csrf.js","./is-prefetch":"./build/server/is-prefetch.js","./server-only":"./build/react/server-only.js","./cache-assets":"./build/client/cache-assets.js","./fetcher-type":"./build/react/fetcher-type.js","./named-action":"./build/server/named-action.js","./package.json":"./package.json","./typed-cookie":"./build/server/typed-cookie.js","./use-hydrated":"./build/react/use-hydrated.js","./locales/react":"./build/react/use-locales.js","./redirect-back":"./build/server/redirect-back.js","./safe-redirect":"./build/server/safe-redirect.js","./typed-session":"./build/server/typed-session.js","./honeypot/react":"./build/react/honeypot.js","./locales/server":"./build/server/get-client-locales.js","./rolling-cookie":"./build/server/rolling-cookie.js","./honeypot/server":"./build/server/honeypot.js","./external-scripts":"./build/react/external-scripts.js","./use-should-hydrate":"./build/react/use-should-hydrate.js","./parse-accept-header":"./build/server/parse-accept-header.js","./preload-route-assets":"./build/server/preload-route-assets.js","./get-client-ip-address":"./build/server/get-client-ip-address.js","./use-debounced-fetcher":"./build/react/use-debounced-fetcher.js","./use-delegated-anchors":"./build/react/use-delegated-anchors.js","./use-global-pending-state":"./build/react/use-global-pending-state.js"},"gitHead":"d2b12bbf92edec7aada0aa0f19a97afd0b48cdc8","scripts":{"lint":"eslint --ext .ts,.tsx src/","test":"vitest --run","build":"tsc --project tsconfig.json --outDir ./build","format":"prettier --write \"src/**/*.ts\" \"src/**/*.tsx\" \"test/**/*.ts\" \"test/**/*.tsx\"","prepare":"npm run build","postbuild":"prettier --write \"build/**/*.js\" \"build/**/*.d.ts\"","typecheck":"tsc --project tsconfig.json --noEmit","test:watch":"vitest","test:coverage":"vitest --coverage"},"_npmUser":{"name":"sergiodxa","email":"sergiodxa@gmail.com"},"repository":{"url":"git+https://github.com/sergiodxa/remix-utils.git","type":"git"},"_npmVersion":"9.6.7","description":"This package contains simple utility functions to use with [Remix.run](https://remix.run).","directories":{},"sideEffects":false,"_nodeVersion":"18.17.1","dependencies":{"type-fest":"^4.3.3"},"_hasShrinkwrap":false,"readmeFilename":"README.md","devDependencies":{"msw":"^1.3.2","zod":"^3.22.4","vite":"^4.4.11","is-ip":"5.0.1","react":"^18.0.0","eslint":"^8.12.0","vitest":"^0.34.6","ts-node":"^10.9.1","prettier":"^3.0.3","crypto-js":"^4.1.1","happy-dom":"^12.9.0","react-dom":"^18.0.0","typescript":"^5.2.2","@types/react":"^18.2.25","@remix-run/node":"^2.0.0","@remix-run/react":"^2.0.0","@types/crypto-js":"^4.1.2","@remix-run/router":"^1.7.2","@remix-run/testing":"^2.0.0","@vitest/coverage-v8":"^0.34.6","eslint-plugin-react":"^7.33.2","@vitejs/plugin-react":"^4.1.0","eslint-plugin-import":"^2.28.1","eslint-plugin-cypress":"^2.15.1","eslint-plugin-promise":"^6.1.1","eslint-plugin-unicorn":"^48.0.1","@testing-library/react":"^14.0.0","eslint-config-prettier":"^9.0.0","eslint-plugin-jest-dom":"^5.1.0","eslint-plugin-jsx-a11y":"^6.7.1","eslint-plugin-prettier":"^5.0.0","@testing-library/jest-dom":"^6.1.3","@typescript-eslint/parser":"^6.7.4","eslint-plugin-react-hooks":"^4.6.0","intl-parse-accept-language":"^1.0.0","eslint-plugin-testing-library":"^6.0.2","@typescript-eslint/eslint-plugin":"^6.7.4","eslint-import-resolver-typescript":"^3.6.1"},"peerDependencies":{"zod":"^3.22.4","is-ip":"^5.0.1","react":"^18.0.0","crypto-js":"^4.1.1","@remix-run/deno":"^2.0.0","@remix-run/node":"^2.0.0","@remix-run/react":"^2.0.0","@remix-run/router":"^1.7.2","@remix-run/cloudflare":"^2.0.0","intl-parse-accept-language":"^1.0.0"},"peerDependenciesMeta":{"zod":{"optional":true},"is-ip":{"optional":true},"react":{"optional":true},"crypto-js":{"optional":true},"@remix-run/deno":{"optional":true},"@remix-run/node":{"optional":true},"@remix-run/react":{"optional":true},"@remix-run/router":{"optional":true},"@remix-run/cloudflare":{"optional":true},"intl-parse-accept-language":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/remix-utils_7.0.0-pre.7_1696571496231_0.2861783272800378","host":"s3://npm-registry-packages"}},"7.0.1":{"name":"remix-utils","version":"7.0.1","keywords":["remix","remix.run","react","utils","request","response","csrf","redirect-back","client-only","hydrated","server-only","cors","rolling cookie","safe redirect","typed cookie","typed session","client IP address","client locale","json hash","prefetch","named action"],"author":{"url":"https://sergiodxa.com","name":"Sergio Xalambrí","email":"hello@sergiodxa.com"},"license":"MIT","_id":"remix-utils@7.0.1","maintainers":[{"name":"sergiodxa","email":"sergiodxa@gmail.com"}],"homepage":"https://github.com/sergiodxa/remix-utils#readme","bugs":{"url":"https://github.com/sergiodxa/remix-utils/issues"},"dist":{"shasum":"421aad1ac903907ec977a05560c537b9af25ffd1","tarball":"https://registry.npmjs.org/remix-utils/-/remix-utils-7.0.1.tgz","fileCount":75,"integrity":"sha512-jx/p+6SSoMQpVElNPMo9tsIcjDCOooVBPOKhVx9SFTFXxLztxC/1RPoC6Ntzk8//60hYVrtvfyosBrhZNXlUpg==","signatures":[{"sig":"MEYCIQCE0jUC+6BwCTfWd229slUxTNtquCfFfgZqCwtcsAB1ZQIhAL51h6cOWKE1a5U35uQEo5niDjMC4iHH7Nq3P1ZzxJu4","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":179564},"type":"module","engines":{"node":">=18.0.0"},"exports":{"./cors":"./build/server/cors.js","./promise":"./build/common/promise.js","./json-hash":"./build/server/json-hash.js","./responses":"./build/server/responses.js","./sse/react":"./build/react/use-event-source.js","./csrf/react":"./build/react/authenticity-token.js","./respond-to":"./build/server/respond-to.js","./sse/server":"./build/server/event-stream.js","./client-only":"./build/react/client-only.js","./csrf/server":"./build/server/csrf.js","./is-prefetch":"./build/server/is-prefetch.js","./server-only":"./build/react/server-only.js","./cache-assets":"./build/client/cache-assets.js","./fetcher-type":"./build/react/fetcher-type.js","./named-action":"./build/server/named-action.js","./package.json":"./package.json","./typed-cookie":"./build/server/typed-cookie.js","./use-hydrated":"./build/react/use-hydrated.js","./locales/react":"./build/react/use-locales.js","./redirect-back":"./build/server/redirect-back.js","./safe-redirect":"./build/server/safe-redirect.js","./typed-session":"./build/server/typed-session.js","./honeypot/react":"./build/react/honeypot.js","./locales/server":"./build/server/get-client-locales.js","./rolling-cookie":"./build/server/rolling-cookie.js","./honeypot/server":"./build/server/honeypot.js","./external-scripts":"./build/react/external-scripts.js","./use-should-hydrate":"./build/react/use-should-hydrate.js","./parse-accept-header":"./build/server/parse-accept-header.js","./preload-route-assets":"./build/server/preload-route-assets.js","./get-client-ip-address":"./build/server/get-client-ip-address.js","./use-debounced-fetcher":"./build/react/use-debounced-fetcher.js","./use-delegated-anchors":"./build/react/use-delegated-anchors.js","./use-global-pending-state":"./build/react/use-global-pending-state.js"},"gitHead":"14c19011368018dc27d4bb2e605c3e6ee766a608","scripts":{"lint":"eslint --ext .ts,.tsx src/","test":"vitest --run","build":"tsc --project tsconfig.json --outDir ./build","format":"prettier --write \"src/**/*.ts\" \"src/**/*.tsx\" \"test/**/*.ts\" \"test/**/*.tsx\"","prepare":"npm run build","postbuild":"prettier --write \"build/**/*.js\" \"build/**/*.d.ts\"","typecheck":"tsc --project tsconfig.json --noEmit","test:watch":"vitest","test:coverage":"vitest --coverage"},"_npmUser":{"name":"sergiodxa","email":"sergiodxa@gmail.com"},"repository":{"url":"git+https://github.com/sergiodxa/remix-utils.git","type":"git"},"_npmVersion":"9.8.1","description":"This package contains simple utility functions to use with [Remix.run](https://remix.run).","directories":{},"sideEffects":false,"_nodeVersion":"18.18.0","dependencies":{"type-fest":"^4.3.3"},"_hasShrinkwrap":false,"devDependencies":{"msw":"^1.3.2","zod":"^3.22.4","vite":"^4.4.11","is-ip":"5.0.1","react":"^18.0.0","eslint":"^8.12.0","vitest":"^0.34.6","ts-node":"^10.9.1","prettier":"^3.0.3","crypto-js":"^4.1.1","happy-dom":"^12.9.0","react-dom":"^18.0.0","typescript":"^5.2.2","@types/react":"^18.2.25","@remix-run/node":"^2.0.0","@remix-run/react":"^2.0.0","@types/crypto-js":"^4.1.2","@remix-run/router":"^1.7.2","@remix-run/testing":"^2.0.0","@vitest/coverage-v8":"^0.34.6","eslint-plugin-react":"^7.33.2","@vitejs/plugin-react":"^4.1.0","eslint-plugin-import":"^2.28.1","eslint-plugin-cypress":"^2.15.1","eslint-plugin-promise":"^6.1.1","eslint-plugin-unicorn":"^48.0.1","@testing-library/react":"^14.0.0","eslint-config-prettier":"^9.0.0","eslint-plugin-jest-dom":"^5.1.0","eslint-plugin-jsx-a11y":"^6.7.1","eslint-plugin-prettier":"^5.0.0","@testing-library/jest-dom":"^6.1.3","@typescript-eslint/parser":"^6.7.4","eslint-plugin-react-hooks":"^4.6.0","intl-parse-accept-language":"^1.0.0","eslint-plugin-testing-library":"^6.0.2","@typescript-eslint/eslint-plugin":"^6.7.4","eslint-import-resolver-typescript":"^3.6.1"},"peerDependencies":{"zod":"^3.22.4","is-ip":"^5.0.1","react":"^18.0.0","crypto-js":"^4.1.1","@remix-run/deno":"^2.0.0","@remix-run/node":"^2.0.0","@remix-run/react":"^2.0.0","@remix-run/router":"^1.7.2","@remix-run/cloudflare":"^2.0.0","intl-parse-accept-language":"^1.0.0"},"peerDependenciesMeta":{"zod":{"optional":true},"is-ip":{"optional":true},"react":{"optional":true},"crypto-js":{"optional":true},"@remix-run/deno":{"optional":true},"@remix-run/node":{"optional":true},"@remix-run/react":{"optional":true},"@remix-run/router":{"optional":true},"@remix-run/cloudflare":{"optional":true},"intl-parse-accept-language":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/remix-utils_7.0.1_1696572176065_0.31913276580454686","host":"s3://npm-registry-packages"}},"7.0.2":{"name":"remix-utils","version":"7.0.2","keywords":["remix","remix.run","react","utils","request","response","csrf","redirect-back","client-only","hydrated","server-only","cors","rolling cookie","safe redirect","typed cookie","typed session","client IP address","client locale","json hash","prefetch","named action"],"author":{"url":"https://sergiodxa.com","name":"Sergio Xalambrí","email":"hello@sergiodxa.com"},"license":"MIT","_id":"remix-utils@7.0.2","maintainers":[{"name":"sergiodxa","email":"sergiodxa@gmail.com"}],"homepage":"https://github.com/sergiodxa/remix-utils#readme","bugs":{"url":"https://github.com/sergiodxa/remix-utils/issues"},"dist":{"shasum":"80762d9a3ed8df8bd6e34bbb3262f9f2258c0273","tarball":"https://registry.npmjs.org/remix-utils/-/remix-utils-7.0.2.tgz","fileCount":74,"integrity":"sha512-BsGmOgUzbT+Ui0hlWe5XR37N/MAbOSRyKBkxs8yckU+VOCzIuSRiOPk6qK+Hch4F18QSMRm/5IlrsROtrM1l2A==","signatures":[{"sig":"MEQCID2lBfhvNAIVA3zN4wNQX55yastel8PevHKBnIbWrxSuAiBzlRXKmmANofAfWH/WmpFF/G1KfOpprBadOtlcF9+R1g==","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":179221},"type":"module","engines":{"node":">=18.0.0"},"exports":{"./cors":"./build/server/cors.js","./promise":"./build/common/promise.js","./json-hash":"./build/server/json-hash.js","./responses":"./build/server/responses.js","./sse/react":"./build/react/use-event-source.js","./csrf/react":"./build/react/authenticity-token.js","./respond-to":"./build/server/respond-to.js","./sse/server":"./build/server/event-stream.js","./client-only":"./build/react/client-only.js","./csrf/server":"./build/server/csrf.js","./is-prefetch":"./build/server/is-prefetch.js","./server-only":"./build/react/server-only.js","./cache-assets":"./build/client/cache-assets.js","./fetcher-type":"./build/react/fetcher-type.js","./named-action":"./build/server/named-action.js","./package.json":"./package.json","./typed-cookie":"./build/server/typed-cookie.js","./use-hydrated":"./build/react/use-hydrated.js","./locales/react":"./build/react/use-locales.js","./redirect-back":"./build/server/redirect-back.js","./safe-redirect":"./build/server/safe-redirect.js","./typed-session":"./build/server/typed-session.js","./honeypot/react":"./build/react/honeypot.js","./locales/server":"./build/server/get-client-locales.js","./rolling-cookie":"./build/server/rolling-cookie.js","./honeypot/server":"./build/server/honeypot.js","./external-scripts":"./build/react/external-scripts.js","./use-should-hydrate":"./build/react/use-should-hydrate.js","./parse-accept-header":"./build/server/parse-accept-header.js","./preload-route-assets":"./build/server/preload-route-assets.js","./use-debounce-fetcher":"./build/react/use-debounce-fetcher.js","./get-client-ip-address":"./build/server/get-client-ip-address.js","./use-delegated-anchors":"./build/react/use-delegated-anchors.js","./use-global-pending-state":"./build/react/use-global-pending-state.js"},"gitHead":"4c350450e5a63602e4308fca5da3ed87c46ac09a","scripts":{"lint":"eslint --ext .ts,.tsx src/","test":"vitest --run","build":"tsc --project tsconfig.json --outDir ./build","format":"prettier --write \"src/**/*.ts\" \"src/**/*.tsx\" \"test/**/*.ts\" \"test/**/*.tsx\" \"*.md\"","prepare":"npm run build","postbuild":"prettier --write \"build/**/*.js\" \"build/**/*.d.ts\"","typecheck":"tsc --project tsconfig.json --noEmit","test:watch":"vitest","test:coverage":"vitest --coverage"},"_npmUser":{"name":"sergiodxa","email":"sergiodxa@gmail.com"},"repository":{"url":"git+https://github.com/sergiodxa/remix-utils.git","type":"git"},"_npmVersion":"9.8.1","description":"This package contains simple utility functions to use with [Remix.run](https://remix.run).","directories":{},"sideEffects":false,"_nodeVersion":"18.18.0","dependencies":{"type-fest":"^4.3.3"},"_hasShrinkwrap":false,"devDependencies":{"msw":"^1.3.2","zod":"^3.22.4","vite":"^4.4.11","is-ip":"5.0.1","react":"^18.0.0","eslint":"^8.12.0","vitest":"^0.34.6","ts-node":"^10.9.1","prettier":"^3.0.3","crypto-js":"^4.1.1","happy-dom":"^12.9.0","react-dom":"^18.0.0","typescript":"^5.2.2","@types/react":"^18.2.25","@remix-run/node":"^2.0.0","@remix-run/react":"^2.0.0","@types/crypto-js":"^4.1.2","@remix-run/router":"^1.7.2","@remix-run/testing":"^2.0.0","@vitest/coverage-v8":"^0.34.6","eslint-plugin-react":"^7.33.2","@vitejs/plugin-react":"^4.1.0","eslint-plugin-import":"^2.28.1","eslint-plugin-cypress":"^2.15.1","eslint-plugin-promise":"^6.1.1","eslint-plugin-unicorn":"^48.0.1","@testing-library/react":"^14.0.0","eslint-config-prettier":"^9.0.0","eslint-plugin-jest-dom":"^5.1.0","eslint-plugin-jsx-a11y":"^6.7.1","eslint-plugin-prettier":"^5.0.0","@testing-library/jest-dom":"^6.1.3","@typescript-eslint/parser":"^6.7.4","eslint-plugin-react-hooks":"^4.6.0","intl-parse-accept-language":"^1.0.0","eslint-plugin-testing-library":"^6.0.2","@typescript-eslint/eslint-plugin":"^6.7.4","eslint-import-resolver-typescript":"^3.6.1"},"peerDependencies":{"zod":"^3.22.4","is-ip":"^5.0.1","react":"^18.0.0","crypto-js":"^4.1.1","@remix-run/deno":"^2.0.0","@remix-run/node":"^2.0.0","@remix-run/react":"^2.0.0","@remix-run/router":"^1.7.2","@remix-run/cloudflare":"^2.0.0","intl-parse-accept-language":"^1.0.0"},"peerDependenciesMeta":{"zod":{"optional":true},"is-ip":{"optional":true},"react":{"optional":true},"crypto-js":{"optional":true},"@remix-run/deno":{"optional":true},"@remix-run/node":{"optional":true},"@remix-run/react":{"optional":true},"@remix-run/router":{"optional":true},"@remix-run/cloudflare":{"optional":true},"intl-parse-accept-language":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/remix-utils_7.0.2_1696616287712_0.6873154523953833","host":"s3://npm-registry-packages"}},"7.1.0":{"name":"remix-utils","version":"7.1.0","keywords":["remix","remix.run","react","utils","request","response","csrf","redirect-back","client-only","hydrated","server-only","cors","rolling cookie","safe redirect","typed cookie","typed session","client IP address","client locale","json hash","prefetch","named action"],"author":{"url":"https://sergiodxa.com","name":"Sergio Xalambrí","email":"hello@sergiodxa.com"},"license":"MIT","_id":"remix-utils@7.1.0","maintainers":[{"name":"sergiodxa","email":"sergiodxa@gmail.com"}],"homepage":"https://github.com/sergiodxa/remix-utils#readme","bugs":{"url":"https://github.com/sergiodxa/remix-utils/issues"},"dist":{"shasum":"e42dccef9157099888a2130b13c09ba7db60c5a2","tarball":"https://registry.npmjs.org/remix-utils/-/remix-utils-7.1.0.tgz","fileCount":79,"integrity":"sha512-cceintceWvmNvgLLFeAUkWRcdWuOHGDLaWh0aeL0bLGWnMPBilIyT74Rira1az/ImS9owfh8tjLL4w/22AXJiA==","signatures":[{"sig":"MEQCIDmcCaiS8seP3n/q+PYxlwrBbOkPWlTcyGKk92WL/VKlAiAF5FMTclUNAD88KuJFF/A95Uqwv0FRIMFnZ+NzzHjF8Q==","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":190669},"type":"module","engines":{"node":">=18.0.0"},"exports":{"./cors":"./build/server/cors.js","./timers":"./build/common/timers.js","./promise":"./build/common/promise.js","./json-hash":"./build/server/json-hash.js","./responses":"./build/server/responses.js","./sec-fetch":"./build/server/sec-fetch.js","./sse/react":"./build/react/use-event-source.js","./csrf/react":"./build/react/authenticity-token.js","./respond-to":"./build/server/respond-to.js","./sse/server":"./build/server/event-stream.js","./client-only":"./build/react/client-only.js","./csrf/server":"./build/server/csrf.js","./is-prefetch":"./build/server/is-prefetch.js","./server-only":"./build/react/server-only.js","./cache-assets":"./build/client/cache-assets.js","./fetcher-type":"./build/react/fetcher-type.js","./named-action":"./build/server/named-action.js","./package.json":"./package.json","./typed-cookie":"./build/server/typed-cookie.js","./use-hydrated":"./build/react/use-hydrated.js","./locales/react":"./build/react/use-locales.js","./redirect-back":"./build/server/redirect-back.js","./safe-redirect":"./build/server/safe-redirect.js","./typed-session":"./build/server/typed-session.js","./honeypot/react":"./build/react/honeypot.js","./locales/server":"./build/server/get-client-locales.js","./rolling-cookie":"./build/server/rolling-cookie.js","./honeypot/server":"./build/server/honeypot.js","./external-scripts":"./build/react/external-scripts.js","./use-should-hydrate":"./build/react/use-should-hydrate.js","./parse-accept-header":"./build/server/parse-accept-header.js","./preload-route-assets":"./build/server/preload-route-assets.js","./use-debounce-fetcher":"./build/react/use-debounce-fetcher.js","./get-client-ip-address":"./build/server/get-client-ip-address.js","./use-delegated-anchors":"./build/react/use-delegated-anchors.js","./use-global-navigation-state":"./build/react/use-global-navigation-state.js"},"gitHead":"d7e85cb7ae8cc4e97fd93c2c97c80421b97b0d58","scripts":{"lint":"eslint --ext .ts,.tsx src/","test":"vitest --run","build":"tsc --project tsconfig.json --outDir ./build","format":"prettier --write \"src/**/*.ts\" \"src/**/*.tsx\" \"test/**/*.ts\" \"test/**/*.tsx\" \"*.md\" \"package.json\"","prepare":"npm run build","postbuild":"prettier --write \"build/**/*.js\" \"build/**/*.d.ts\"","typecheck":"tsc --project tsconfig.json --noEmit","test:watch":"vitest","test:exports":"bun scripts/check-pkg-exports.ts","test:coverage":"vitest --coverage"},"_npmUser":{"name":"sergiodxa","email":"sergiodxa@gmail.com"},"repository":{"url":"git+https://github.com/sergiodxa/remix-utils.git","type":"git"},"_npmVersion":"9.8.1","description":"This package contains simple utility functions to use with [Remix.run](https://remix.run).","directories":{},"sideEffects":false,"_nodeVersion":"18.18.0","dependencies":{"type-fest":"^4.3.3"},"_hasShrinkwrap":false,"devDependencies":{"msw":"^1.3.2","zod":"^3.22.4","vite":"^4.4.11","is-ip":"5.0.1","react":"^18.0.0","eslint":"^8.12.0","vitest":"^0.34.6","ts-node":"^10.9.1","prettier":"^3.0.3","crypto-js":"^4.1.1","happy-dom":"^12.9.0","react-dom":"^18.0.0","typescript":"^5.2.2","@types/react":"^18.2.25","@remix-run/node":"^2.0.0","@remix-run/react":"^2.0.0","@types/crypto-js":"^4.1.2","@remix-run/router":"^1.7.2","@remix-run/testing":"^2.0.0","@vitest/coverage-v8":"^0.34.6","eslint-plugin-react":"^7.33.2","@vitejs/plugin-react":"^4.1.0","eslint-plugin-import":"^2.28.1","@arethetypeswrong/cli":"^0.12.1","eslint-plugin-cypress":"^2.15.1","eslint-plugin-promise":"^6.1.1","eslint-plugin-unicorn":"^48.0.1","@testing-library/react":"^14.0.0","eslint-config-prettier":"^9.0.0","eslint-plugin-jest-dom":"^5.1.0","eslint-plugin-jsx-a11y":"^6.7.1","eslint-plugin-prettier":"^5.0.0","@testing-library/jest-dom":"^6.1.3","@typescript-eslint/parser":"^6.7.4","eslint-plugin-react-hooks":"^4.6.0","intl-parse-accept-language":"^1.0.0","eslint-plugin-testing-library":"^6.0.2","@typescript-eslint/eslint-plugin":"^6.7.4","eslint-import-resolver-typescript":"^3.6.1"},"peerDependencies":{"zod":"^3.22.4","is-ip":"^5.0.1","react":"^18.0.0","crypto-js":"^4.1.1","@remix-run/deno":"^2.0.0","@remix-run/node":"^2.0.0","@remix-run/react":"^2.0.0","@remix-run/router":"^1.7.2","@remix-run/cloudflare":"^2.0.0","intl-parse-accept-language":"^1.0.0"},"peerDependenciesMeta":{"zod":{"optional":true},"is-ip":{"optional":true},"react":{"optional":true},"crypto-js":{"optional":true},"@remix-run/deno":{"optional":true},"@remix-run/node":{"optional":true},"@remix-run/react":{"optional":true},"@remix-run/router":{"optional":true},"@remix-run/cloudflare":{"optional":true},"intl-parse-accept-language":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/remix-utils_7.1.0_1697241008702_0.09876551771190578","host":"s3://npm-registry-packages"}},"7.2.0":{"name":"remix-utils","version":"7.2.0","keywords":["remix","remix.run","react","utils","request","response","csrf","redirect-back","client-only","hydrated","server-only","cors","rolling cookie","safe redirect","typed cookie","typed session","client IP address","client locale","json hash","prefetch","named action"],"author":{"url":"https://sergiodxa.com","name":"Sergio Xalambrí","email":"hello@sergiodxa.com"},"license":"MIT","_id":"remix-utils@7.2.0","maintainers":[{"name":"sergiodxa","email":"sergiodxa@gmail.com"}],"homepage":"https://github.com/sergiodxa/remix-utils#readme","bugs":{"url":"https://github.com/sergiodxa/remix-utils/issues"},"dist":{"shasum":"b3c7dbbae00c154978b0c91c7acae143f8963c2a","tarball":"https://registry.npmjs.org/remix-utils/-/remix-utils-7.2.0.tgz","fileCount":81,"integrity":"sha512-eFfwUZnGwKvINpC10HaF6fzywp0CsJ3cI/voNM7tv3NN+mbrqiwuOb/ANkVCOj51wdoXyGyvi1rix6j1IJf21w==","signatures":[{"sig":"MEUCIQC7+iQBGePbyvmW5Ed1e06ZfJ6JIn0r5FjUqVXerdlavwIgbwwtd0JsXTP6nul1xwL5wZG1LR0WZjIOvaXwdR58aOI=","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":194233},"type":"module","engines":{"node":">=18.0.0"},"exports":{"./cors":"./build/server/cors.js","./timers":"./build/common/timers.js","./promise":"./build/common/promise.js","./json-hash":"./build/server/json-hash.js","./responses":"./build/server/responses.js","./sec-fetch":"./build/server/sec-fetch.js","./sse/react":"./build/react/use-event-source.js","./csrf/react":"./build/react/authenticity-token.js","./respond-to":"./build/server/respond-to.js","./sse/server":"./build/server/event-stream.js","./client-only":"./build/react/client-only.js","./csrf/server":"./build/server/csrf.js","./is-prefetch":"./build/server/is-prefetch.js","./server-only":"./build/react/server-only.js","./cache-assets":"./build/client/cache-assets.js","./fetcher-type":"./build/react/fetcher-type.js","./named-action":"./build/server/named-action.js","./package.json":"./package.json","./typed-cookie":"./build/server/typed-cookie.js","./use-hydrated":"./build/react/use-hydrated.js","./locales/react":"./build/react/use-locales.js","./redirect-back":"./build/server/redirect-back.js","./safe-redirect":"./build/server/safe-redirect.js","./typed-session":"./build/server/typed-session.js","./honeypot/react":"./build/react/honeypot.js","./locales/server":"./build/server/get-client-locales.js","./rolling-cookie":"./build/server/rolling-cookie.js","./honeypot/server":"./build/server/honeypot.js","./external-scripts":"./build/react/external-scripts.js","./use-should-hydrate":"./build/react/use-should-hydrate.js","./parse-accept-header":"./build/server/parse-accept-header.js","./preload-route-assets":"./build/server/preload-route-assets.js","./use-debounce-fetcher":"./build/react/use-debounce-fetcher.js","./get-client-ip-address":"./build/server/get-client-ip-address.js","./use-delegated-anchors":"./build/react/use-delegated-anchors.js","./existing-search-params":"./build/react/existing-search-params.js","./use-global-navigation-state":"./build/react/use-global-navigation-state.js"},"gitHead":"cc49e04d6f0f82d60c5cd1a5030a784cccce4a87","scripts":{"lint":"eslint --ext .ts,.tsx src/","test":"vitest --run","build":"tsc --project tsconfig.json --outDir ./build","format":"prettier --write \"src/**/*.ts\" \"src/**/*.tsx\" \"test/**/*.ts\" \"test/**/*.tsx\" \"*.md\" \"package.json\"","prepare":"npm run build","postbuild":"prettier --write \"build/**/*.js\" \"build/**/*.d.ts\"","typecheck":"tsc --project tsconfig.json --noEmit","test:watch":"vitest","test:exports":"bun scripts/check-pkg-exports.ts","test:coverage":"vitest --coverage"},"_npmUser":{"name":"sergiodxa","email":"sergiodxa@gmail.com"},"repository":{"url":"git+https://github.com/sergiodxa/remix-utils.git","type":"git"},"_npmVersion":"10.1.0","description":"This package contains simple utility functions to use with [Remix.run](https://remix.run).","directories":{},"sideEffects":false,"_nodeVersion":"20.9.0","dependencies":{"type-fest":"^4.3.3"},"_hasShrinkwrap":false,"devDependencies":{"msw":"^2.0.0","zod":"^3.22.4","vite":"^5.0.0","is-ip":"5.0.1","react":"^18.0.0","eslint":"^8.12.0","vitest":"^0.34.6","ts-node":"^10.9.1","prettier":"^3.0.3","crypto-js":"^4.1.1","happy-dom":"^12.9.0","react-dom":"^18.0.0","typescript":"^5.2.2","@types/react":"^18.2.25","@remix-run/node":"^2.0.0","@remix-run/react":"^2.0.0","@types/crypto-js":"^4.1.2","@remix-run/router":"^1.7.2","@remix-run/testing":"^2.0.0","@vitest/coverage-v8":"^0.34.6","eslint-plugin-react":"^7.33.2","@vitejs/plugin-react":"^4.1.0","eslint-plugin-import":"^2.28.1","@arethetypeswrong/cli":"^0.13.1","eslint-plugin-cypress":"^2.15.1","eslint-plugin-promise":"^6.1.1","eslint-plugin-unicorn":"^49.0.0","@testing-library/react":"^14.0.0","eslint-config-prettier":"^9.0.0","eslint-plugin-jest-dom":"^5.1.0","eslint-plugin-jsx-a11y":"^6.7.1","eslint-plugin-prettier":"^5.0.0","@testing-library/jest-dom":"^6.1.3","@typescript-eslint/parser":"^6.7.4","eslint-plugin-react-hooks":"^4.6.0","intl-parse-accept-language":"^1.0.0","eslint-plugin-testing-library":"^6.0.2","@typescript-eslint/eslint-plugin":"^6.7.4","eslint-import-resolver-typescript":"^3.6.1"},"peerDependencies":{"zod":"^3.22.4","is-ip":"^5.0.1","react":"^18.0.0","crypto-js":"^4.1.1","@remix-run/deno":"^2.0.0","@remix-run/node":"^2.0.0","@remix-run/react":"^2.0.0","@remix-run/router":"^1.7.2","@remix-run/cloudflare":"^2.0.0","intl-parse-accept-language":"^1.0.0"},"peerDependenciesMeta":{"zod":{"optional":true},"is-ip":{"optional":true},"react":{"optional":true},"crypto-js":{"optional":true},"@remix-run/deno":{"optional":true},"@remix-run/node":{"optional":true},"@remix-run/react":{"optional":true},"@remix-run/router":{"optional":true},"@remix-run/cloudflare":{"optional":true},"intl-parse-accept-language":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/remix-utils_7.2.0_1700844396372_0.7159919140288056","host":"s3://npm-registry-packages"}},"7.3.0":{"name":"remix-utils","version":"7.3.0","keywords":["remix","remix.run","react","utils","request","response","csrf","redirect-back","client-only","hydrated","server-only","cors","rolling cookie","safe redirect","typed cookie","typed session","client IP address","client locale","json hash","prefetch","named action"],"author":{"url":"https://sergiodxa.com","name":"Sergio Xalambrí","email":"hello@sergiodxa.com"},"license":"MIT","_id":"remix-utils@7.3.0","maintainers":[{"name":"sergiodxa","email":"sergiodxa@gmail.com"}],"homepage":"https://github.com/sergiodxa/remix-utils#readme","bugs":{"url":"https://github.com/sergiodxa/remix-utils/issues"},"dist":{"shasum":"f5837ae6aa0a29cc21590f4b38686292324bbd9e","tarball":"https://registry.npmjs.org/remix-utils/-/remix-utils-7.3.0.tgz","fileCount":81,"integrity":"sha512-Ea5eNL04Ke4YYKI79ZR5doWtULe3ABkYkqhaP7mKiYcNVYAg6pA0PMuFYR2uyJYCGW43+/WlTfr3D4X5A0PsUA==","signatures":[{"sig":"MEQCIEIzVMf7v0uY/ZGd62xoyQMxEoDObq4Ns/fb+FAXDfb4AiAbro/9ej81dAmsNTkZGPERDgq6EHQddFpMBHSciT9UgQ==","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":194451},"type":"module","engines":{"node":">=18.0.0"},"exports":{"./cors":"./build/server/cors.js","./timers":"./build/common/timers.js","./promise":"./build/common/promise.js","./json-hash":"./build/server/json-hash.js","./responses":"./build/server/responses.js","./sec-fetch":"./build/server/sec-fetch.js","./sse/react":"./build/react/use-event-source.js","./csrf/react":"./build/react/authenticity-token.js","./respond-to":"./build/server/respond-to.js","./sse/server":"./build/server/event-stream.js","./client-only":"./build/react/client-only.js","./csrf/server":"./build/server/csrf.js","./is-prefetch":"./build/server/is-prefetch.js","./server-only":"./build/react/server-only.js","./cache-assets":"./build/client/cache-assets.js","./fetcher-type":"./build/react/fetcher-type.js","./named-action":"./build/server/named-action.js","./package.json":"./package.json","./typed-cookie":"./build/server/typed-cookie.js","./use-hydrated":"./build/react/use-hydrated.js","./locales/react":"./build/react/use-locales.js","./redirect-back":"./build/server/redirect-back.js","./safe-redirect":"./build/server/safe-redirect.js","./typed-session":"./build/server/typed-session.js","./honeypot/react":"./build/react/honeypot.js","./locales/server":"./build/server/get-client-locales.js","./rolling-cookie":"./build/server/rolling-cookie.js","./honeypot/server":"./build/server/honeypot.js","./external-scripts":"./build/react/external-scripts.js","./use-should-hydrate":"./build/react/use-should-hydrate.js","./parse-accept-header":"./build/server/parse-accept-header.js","./preload-route-assets":"./build/server/preload-route-assets.js","./use-debounce-fetcher":"./build/react/use-debounce-fetcher.js","./get-client-ip-address":"./build/server/get-client-ip-address.js","./use-delegated-anchors":"./build/react/use-delegated-anchors.js","./existing-search-params":"./build/react/existing-search-params.js","./use-global-navigation-state":"./build/react/use-global-navigation-state.js"},"gitHead":"5c7dd489e65679bd9ecb4c8d2f200c9ff75768f7","scripts":{"lint":"eslint --ext .ts,.tsx src/","test":"vitest --run","build":"tsc --project tsconfig.json --outDir ./build","format":"prettier --write \"src/**/*.ts\" \"src/**/*.tsx\" \"test/**/*.ts\" \"test/**/*.tsx\" \"*.md\" \"package.json\"","prepare":"npm run build","postbuild":"prettier --write \"build/**/*.js\" \"build/**/*.d.ts\"","typecheck":"tsc --project tsconfig.json --noEmit","test:watch":"vitest","test:exports":"bun scripts/check-pkg-exports.ts","test:coverage":"vitest --coverage"},"_npmUser":{"name":"sergiodxa","email":"sergiodxa@gmail.com"},"repository":{"url":"git+https://github.com/sergiodxa/remix-utils.git","type":"git"},"_npmVersion":"10.1.0","description":"This package contains simple utility functions to use with [Remix.run](https://remix.run).","directories":{},"sideEffects":false,"_nodeVersion":"20.9.0","dependencies":{"type-fest":"^4.3.3"},"_hasShrinkwrap":false,"devDependencies":{"msw":"^2.0.0","zod":"^3.22.4","vite":"^5.0.0","is-ip":"5.0.1","react":"^18.0.0","eslint":"^8.12.0","vitest":"^0.34.6","ts-node":"^10.9.1","prettier":"^3.0.3","crypto-js":"^4.1.1","happy-dom":"^12.9.0","react-dom":"^18.0.0","typescript":"^5.2.2","@types/react":"^18.2.25","@remix-run/node":"^2.0.0","@remix-run/react":"^2.0.0","@types/crypto-js":"^4.1.2","@remix-run/router":"^1.7.2","@remix-run/testing":"^2.0.0","@vitest/coverage-v8":"^0.34.6","eslint-plugin-react":"^7.33.2","@vitejs/plugin-react":"^4.1.0","eslint-plugin-import":"^2.28.1","@arethetypeswrong/cli":"^0.13.1","eslint-plugin-cypress":"^2.15.1","eslint-plugin-promise":"^6.1.1","eslint-plugin-unicorn":"^49.0.0","@testing-library/react":"^14.0.0","eslint-config-prettier":"^9.0.0","eslint-plugin-jest-dom":"^5.1.0","eslint-plugin-jsx-a11y":"^6.7.1","eslint-plugin-prettier":"^5.0.0","@testing-library/jest-dom":"^6.1.3","@typescript-eslint/parser":"^6.7.4","eslint-plugin-react-hooks":"^4.6.0","intl-parse-accept-language":"^1.0.0","eslint-plugin-testing-library":"^6.0.2","@typescript-eslint/eslint-plugin":"^6.7.4","eslint-import-resolver-typescript":"^3.6.1"},"peerDependencies":{"zod":"^3.22.4","is-ip":"^5.0.1","react":"^18.0.0","crypto-js":"^4.1.1","@remix-run/deno":"^2.0.0","@remix-run/node":"^2.0.0","@remix-run/react":"^2.0.0","@remix-run/router":"^1.7.2","@remix-run/cloudflare":"^2.0.0","intl-parse-accept-language":"^1.0.0"},"peerDependenciesMeta":{"zod":{"optional":true},"is-ip":{"optional":true},"react":{"optional":true},"crypto-js":{"optional":true},"@remix-run/deno":{"optional":true},"@remix-run/node":{"optional":true},"@remix-run/react":{"optional":true},"@remix-run/router":{"optional":true},"@remix-run/cloudflare":{"optional":true},"intl-parse-accept-language":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/remix-utils_7.3.0_1700893191465_0.9167272395601389","host":"s3://npm-registry-packages"}},"7.4.0":{"name":"remix-utils","version":"7.4.0","keywords":["remix","remix.run","react","utils","request","response","csrf","redirect-back","client-only","hydrated","server-only","cors","rolling cookie","safe redirect","typed cookie","typed session","client IP address","client locale","json hash","prefetch","named action"],"author":{"url":"https://sergiodxa.com","name":"Sergio Xalambrí","email":"hello@sergiodxa.com"},"license":"MIT","_id":"remix-utils@7.4.0","maintainers":[{"name":"sergiodxa","email":"sergiodxa@gmail.com"}],"homepage":"https://github.com/sergiodxa/remix-utils#readme","bugs":{"url":"https://github.com/sergiodxa/remix-utils/issues"},"dist":{"shasum":"272b29b66a5e965a48dc26e177f8152cde85b0dc","tarball":"https://registry.npmjs.org/remix-utils/-/remix-utils-7.4.0.tgz","fileCount":83,"integrity":"sha512-Bq5frrMqixGoeTKaexQeCASFQUHreY3dD/cBuowdb6G8uQe006p3HJkxmElRc4ez25yLqlmi08hq6EQX/U8fpw==","signatures":[{"sig":"MEYCIQCAB4hg5IqlUdc8XYTrLeUjkpeTzWh65TZG2ern2tg8mwIhAJJa3oPxmitXZOBraWxSeXolnDqQj/B9ym0Eer5Cihsj","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":196974},"type":"module","engines":{"node":">=18.0.0"},"exports":{"./cors":"./build/server/cors.js","./timers":"./build/common/timers.js","./promise":"./build/common/promise.js","./json-hash":"./build/server/json-hash.js","./responses":"./build/server/responses.js","./sec-fetch":"./build/server/sec-fetch.js","./sse/react":"./build/react/use-event-source.js","./csrf/react":"./build/react/authenticity-token.js","./respond-to":"./build/server/respond-to.js","./sse/server":"./build/server/event-stream.js","./client-only":"./build/react/client-only.js","./csrf/server":"./build/server/csrf.js","./is-prefetch":"./build/server/is-prefetch.js","./server-only":"./build/react/server-only.js","./cache-assets":"./build/client/cache-assets.js","./fetcher-type":"./build/react/fetcher-type.js","./named-action":"./build/server/named-action.js","./package.json":"./package.json","./typed-cookie":"./build/server/typed-cookie.js","./use-hydrated":"./build/react/use-hydrated.js","./locales/react":"./build/react/use-locales.js","./redirect-back":"./build/server/redirect-back.js","./safe-redirect":"./build/server/safe-redirect.js","./typed-session":"./build/server/typed-session.js","./honeypot/react":"./build/react/honeypot.js","./locales/server":"./build/server/get-client-locales.js","./rolling-cookie":"./build/server/rolling-cookie.js","./honeypot/server":"./build/server/honeypot.js","./external-scripts":"./build/react/external-scripts.js","./use-should-hydrate":"./build/react/use-should-hydrate.js","./parse-accept-header":"./build/server/parse-accept-header.js","./use-debounce-submit":"./build/react/use-debounce-submit.js","./preload-route-assets":"./build/server/preload-route-assets.js","./use-debounce-fetcher":"./build/react/use-debounce-fetcher.js","./get-client-ip-address":"./build/server/get-client-ip-address.js","./use-delegated-anchors":"./build/react/use-delegated-anchors.js","./existing-search-params":"./build/react/existing-search-params.js","./use-global-navigation-state":"./build/react/use-global-navigation-state.js"},"gitHead":"a76cf0c2b996d69f9fda237adc42b4145c3065bc","scripts":{"lint":"eslint --ext .ts,.tsx src/","test":"vitest --run","build":"tsc --project tsconfig.json --outDir ./build","format":"prettier --write \"src/**/*.ts\" \"src/**/*.tsx\" \"test/**/*.ts\" \"test/**/*.tsx\" \"*.md\" \"package.json\"","prepare":"npm run build","postbuild":"prettier --write \"build/**/*.js\" \"build/**/*.d.ts\"","typecheck":"tsc --project tsconfig.json --noEmit","test:watch":"vitest","test:exports":"bun scripts/check-pkg-exports.ts","test:coverage":"vitest --coverage"},"_npmUser":{"name":"sergiodxa","email":"sergiodxa@gmail.com"},"repository":{"url":"git+https://github.com/sergiodxa/remix-utils.git","type":"git"},"_npmVersion":"10.2.3","description":"This package contains simple utility functions to use with [Remix.run](https://remix.run).","directories":{},"sideEffects":false,"_nodeVersion":"20.10.0","dependencies":{"type-fest":"^4.3.3"},"_hasShrinkwrap":false,"devDependencies":{"msw":"^2.0.0","zod":"^3.22.4","vite":"^5.0.0","is-ip":"5.0.1","react":"^18.0.0","eslint":"^8.12.0","vitest":"^0.34.6","ts-node":"^10.9.1","prettier":"^3.0.3","crypto-js":"^4.1.1","happy-dom":"^12.9.0","react-dom":"^18.0.0","typescript":"^5.2.2","@types/react":"^18.2.25","@remix-run/node":"^2.0.0","@remix-run/react":"^2.0.0","@types/crypto-js":"^4.1.2","@remix-run/router":"^1.7.2","@remix-run/testing":"^2.0.0","@vitest/coverage-v8":"^0.34.6","eslint-plugin-react":"^7.33.2","@vitejs/plugin-react":"^4.1.0","eslint-plugin-import":"^2.28.1","@arethetypeswrong/cli":"^0.13.1","eslint-plugin-cypress":"^2.15.1","eslint-plugin-promise":"^6.1.1","eslint-plugin-unicorn":"^49.0.0","@testing-library/react":"^14.0.0","eslint-config-prettier":"^9.0.0","eslint-plugin-jest-dom":"^5.1.0","eslint-plugin-jsx-a11y":"^6.7.1","eslint-plugin-prettier":"^5.0.0","@testing-library/jest-dom":"^6.1.3","@typescript-eslint/parser":"^6.7.4","eslint-plugin-react-hooks":"^4.6.0","intl-parse-accept-language":"^1.0.0","eslint-plugin-testing-library":"^6.0.2","@typescript-eslint/eslint-plugin":"^6.7.4","eslint-import-resolver-typescript":"^3.6.1"},"peerDependencies":{"zod":"^3.22.4","is-ip":"^5.0.1","react":"^18.0.0","crypto-js":"^4.1.1","@remix-run/deno":"^2.0.0","@remix-run/node":"^2.0.0","@remix-run/react":"^2.0.0","@remix-run/router":"^1.7.2","@remix-run/cloudflare":"^2.0.0","intl-parse-accept-language":"^1.0.0"},"peerDependenciesMeta":{"zod":{"optional":true},"is-ip":{"optional":true},"react":{"optional":true},"crypto-js":{"optional":true},"@remix-run/deno":{"optional":true},"@remix-run/node":{"optional":true},"@remix-run/react":{"optional":true},"@remix-run/router":{"optional":true},"@remix-run/cloudflare":{"optional":true},"intl-parse-accept-language":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/remix-utils_7.4.0_1702964373433_0.6290561187070078","host":"s3://npm-registry-packages"}},"7.5.0":{"name":"remix-utils","version":"7.5.0","keywords":["remix","remix.run","react","utils","request","response","csrf","redirect-back","client-only","hydrated","server-only","cors","rolling cookie","safe redirect","typed cookie","typed session","client IP address","client locale","json hash","prefetch","named action"],"author":{"url":"https://sergiodxa.com","name":"Sergio Xalambrí","email":"hello@sergiodxa.com"},"license":"MIT","_id":"remix-utils@7.5.0","maintainers":[{"name":"sergiodxa","email":"sergiodxa@gmail.com"}],"homepage":"https://github.com/sergiodxa/remix-utils#readme","bugs":{"url":"https://github.com/sergiodxa/remix-utils/issues"},"dist":{"shasum":"0121585167957b194ec8bcae08e8902eacd0564a","tarball":"https://registry.npmjs.org/remix-utils/-/remix-utils-7.5.0.tgz","fileCount":83,"integrity":"sha512-vzjDhbdwK+3XxqL2LM7ZPzq0zyjb+77eAWbKhDqhnh0nlA11n3CmTtYzrZYpVf6h24+6m5mD6KnRfcdD3Zrl7w==","signatures":[{"sig":"MEYCIQD5Zt66QTCmfOPRyuKlfNKPfl5PjlTytEdtNm5qXv/BmgIhALAwTvEsHc1voImw63VJ6clJ8paP2xapttAA0Ptyt6je","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":196885},"type":"module","engines":{"node":">=18.0.0"},"exports":{"./cors":"./build/server/cors.js","./timers":"./build/common/timers.js","./promise":"./build/common/promise.js","./json-hash":"./build/server/json-hash.js","./responses":"./build/server/responses.js","./sec-fetch":"./build/server/sec-fetch.js","./sse/react":"./build/react/use-event-source.js","./csrf/react":"./build/react/authenticity-token.js","./respond-to":"./build/server/respond-to.js","./sse/server":"./build/server/event-stream.js","./client-only":"./build/react/client-only.js","./csrf/server":"./build/server/csrf.js","./is-prefetch":"./build/server/is-prefetch.js","./server-only":"./build/react/server-only.js","./cache-assets":"./build/client/cache-assets.js","./fetcher-type":"./build/react/fetcher-type.js","./named-action":"./build/server/named-action.js","./package.json":"./package.json","./typed-cookie":"./build/server/typed-cookie.js","./use-hydrated":"./build/react/use-hydrated.js","./locales/react":"./build/react/use-locales.js","./redirect-back":"./build/server/redirect-back.js","./safe-redirect":"./build/server/safe-redirect.js","./typed-session":"./build/server/typed-session.js","./honeypot/react":"./build/react/honeypot.js","./locales/server":"./build/server/get-client-locales.js","./rolling-cookie":"./build/server/rolling-cookie.js","./honeypot/server":"./build/server/honeypot.js","./external-scripts":"./build/react/external-scripts.js","./use-should-hydrate":"./build/react/use-should-hydrate.js","./parse-accept-header":"./build/server/parse-accept-header.js","./use-debounce-submit":"./build/react/use-debounce-submit.js","./preload-route-assets":"./build/server/preload-route-assets.js","./use-debounce-fetcher":"./build/react/use-debounce-fetcher.js","./get-client-ip-address":"./build/server/get-client-ip-address.js","./use-delegated-anchors":"./build/react/use-delegated-anchors.js","./existing-search-params":"./build/react/existing-search-params.js","./use-global-navigation-state":"./build/react/use-global-navigation-state.js"},"gitHead":"6cba41a8ee4a6814639f551e24ec63f58ccd94ae","scripts":{"lint":"eslint --ext .ts,.tsx src/","test":"vitest --run","build":"tsc --project tsconfig.json --outDir ./build","format":"prettier --write \"src/**/*.ts\" \"src/**/*.tsx\" \"test/**/*.ts\" \"test/**/*.tsx\" \"*.md\" \"package.json\"","prepare":"npm run build","postbuild":"prettier --write \"build/**/*.js\" \"build/**/*.d.ts\"","typecheck":"tsc --project tsconfig.json --noEmit","test:watch":"vitest","test:exports":"bun scripts/check-pkg-exports.ts","test:coverage":"vitest --coverage"},"_npmUser":{"name":"sergiodxa","email":"sergiodxa@gmail.com"},"repository":{"url":"git+https://github.com/sergiodxa/remix-utils.git","type":"git"},"_npmVersion":"10.2.3","description":"This package contains simple utility functions to use with [Remix.run](https://remix.run).","directories":{},"sideEffects":false,"_nodeVersion":"20.10.0","dependencies":{"type-fest":"^4.3.3"},"_hasShrinkwrap":false,"devDependencies":{"msw":"^2.0.0","zod":"^3.22.4","vite":"^5.0.0","is-ip":"5.0.1","react":"^18.0.0","eslint":"^8.12.0","vitest":"^0.34.6","ts-node":"^10.9.1","prettier":"^3.0.3","crypto-js":"^4.1.1","happy-dom":"^12.9.0","react-dom":"^18.0.0","typescript":"^5.2.2","@types/react":"^18.2.25","@remix-run/node":"^2.0.0","@remix-run/react":"^2.0.0","@types/crypto-js":"^4.1.2","@remix-run/router":"^1.7.2","@remix-run/testing":"^2.0.0","@vitest/coverage-v8":"^0.34.6","eslint-plugin-react":"^7.33.2","@vitejs/plugin-react":"^4.1.0","eslint-plugin-import":"^2.28.1","@arethetypeswrong/cli":"^0.13.1","eslint-plugin-cypress":"^2.15.1","eslint-plugin-promise":"^6.1.1","eslint-plugin-unicorn":"^50.0.1","@testing-library/react":"^14.0.0","eslint-config-prettier":"^9.0.0","eslint-plugin-jest-dom":"^5.1.0","eslint-plugin-jsx-a11y":"^6.7.1","eslint-plugin-prettier":"^5.0.0","@testing-library/jest-dom":"^6.1.3","@typescript-eslint/parser":"^6.7.4","eslint-plugin-react-hooks":"^4.6.0","intl-parse-accept-language":"^1.0.0","eslint-plugin-testing-library":"^6.0.2","@typescript-eslint/eslint-plugin":"^6.7.4","eslint-import-resolver-typescript":"^3.6.1"},"peerDependencies":{"zod":"^3.22.4","is-ip":"^5.0.1","react":"^18.0.0","crypto-js":"^4.1.1","@remix-run/deno":"^2.0.0","@remix-run/node":"^2.0.0","@remix-run/react":"^2.0.0","@remix-run/router":"^1.7.2","@remix-run/cloudflare":"^2.0.0","intl-parse-accept-language":"^1.0.0"},"peerDependenciesMeta":{"zod":{"optional":true},"is-ip":{"optional":true},"react":{"optional":true},"crypto-js":{"optional":true},"@remix-run/deno":{"optional":true},"@remix-run/node":{"optional":true},"@remix-run/react":{"optional":true},"@remix-run/router":{"optional":true},"@remix-run/cloudflare":{"optional":true},"intl-parse-accept-language":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/remix-utils_7.5.0_1703990579415_0.9637464489889092","host":"s3://npm-registry-packages"}},"7.6.0":{"name":"remix-utils","version":"7.6.0","keywords":["remix","remix.run","react","utils","request","response","csrf","redirect-back","client-only","hydrated","server-only","cors","rolling cookie","safe redirect","typed cookie","typed session","client IP address","client locale","json hash","prefetch","named action"],"author":{"url":"https://sergiodxa.com","name":"Sergio Xalambrí","email":"hello@sergiodxa.com"},"license":"MIT","_id":"remix-utils@7.6.0","maintainers":[{"name":"sergiodxa","email":"sergiodxa@gmail.com"}],"homepage":"https://github.com/sergiodxa/remix-utils#readme","bugs":{"url":"https://github.com/sergiodxa/remix-utils/issues"},"dist":{"shasum":"831e7e75fd128ff7cd4eb1c3daad0d2d3ba176bb","tarball":"https://registry.npmjs.org/remix-utils/-/remix-utils-7.6.0.tgz","fileCount":83,"integrity":"sha512-BPhCUEy+nwrhDDDg2v3+LFSszV6tluMbeSkbffj2o4tqZxt5Kn69Y9sNpGxYLAj8gjqeYDuxjv55of+gYnnykA==","signatures":[{"sig":"MEQCIGzXa/bPaIZGOSEu9jNGdtgQie/QPTYV+wbLSblBXSwqAiAcmTnIyL7mxvu4sCOwJsBQGxeJRWrKACl6uXWfCCaeBw==","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":198950},"type":"module","engines":{"node":">=18.0.0"},"exports":{"./cors":"./build/server/cors.js","./timers":"./build/common/timers.js","./promise":"./build/common/promise.js","./json-hash":"./build/server/json-hash.js","./responses":"./build/server/responses.js","./sec-fetch":"./build/server/sec-fetch.js","./sse/react":"./build/react/use-event-source.js","./csrf/react":"./build/react/authenticity-token.js","./respond-to":"./build/server/respond-to.js","./sse/server":"./build/server/event-stream.js","./client-only":"./build/react/client-only.js","./csrf/server":"./build/server/csrf.js","./is-prefetch":"./build/server/is-prefetch.js","./server-only":"./build/react/server-only.js","./cache-assets":"./build/client/cache-assets.js","./fetcher-type":"./build/react/fetcher-type.js","./named-action":"./build/server/named-action.js","./package.json":"./package.json","./typed-cookie":"./build/server/typed-cookie.js","./use-hydrated":"./build/react/use-hydrated.js","./locales/react":"./build/react/use-locales.js","./redirect-back":"./build/server/redirect-back.js","./safe-redirect":"./build/server/safe-redirect.js","./typed-session":"./build/server/typed-session.js","./honeypot/react":"./build/react/honeypot.js","./locales/server":"./build/server/get-client-locales.js","./rolling-cookie":"./build/server/rolling-cookie.js","./honeypot/server":"./build/server/honeypot.js","./external-scripts":"./build/react/external-scripts.js","./use-should-hydrate":"./build/react/use-should-hydrate.js","./parse-accept-header":"./build/server/parse-accept-header.js","./use-debounce-submit":"./build/react/use-debounce-submit.js","./preload-route-assets":"./build/server/preload-route-assets.js","./use-debounce-fetcher":"./build/react/use-debounce-fetcher.js","./get-client-ip-address":"./build/server/get-client-ip-address.js","./use-delegated-anchors":"./build/react/use-delegated-anchors.js","./existing-search-params":"./build/react/existing-search-params.js","./use-global-navigation-state":"./build/react/use-global-navigation-state.js"},"gitHead":"25b658f723c7ede1b95f7f2f72a0360962360d09","scripts":{"lint":"eslint --ext .ts,.tsx src/","test":"vitest --run","build":"tsc --project tsconfig.json --outDir ./build","format":"prettier --write \"src/**/*.ts\" \"src/**/*.tsx\" \"test/**/*.ts\" \"test/**/*.tsx\" \"*.md\" \"package.json\"","prepare":"npm run build","postbuild":"prettier --write \"build/**/*.js\" \"build/**/*.d.ts\"","typecheck":"tsc --project tsconfig.json --noEmit","test:watch":"vitest","test:exports":"bun scripts/check-pkg-exports.ts","test:coverage":"vitest --coverage"},"_npmUser":{"name":"sergiodxa","email":"sergiodxa@gmail.com"},"repository":{"url":"git+https://github.com/sergiodxa/remix-utils.git","type":"git"},"_npmVersion":"10.5.0","description":"This package contains simple utility functions to use with [Remix.run](https://remix.run).","directories":{},"sideEffects":false,"_nodeVersion":"20.12.0","dependencies":{"type-fest":"^4.3.3"},"_hasShrinkwrap":false,"devDependencies":{"msw":"^2.0.0","zod":"^3.22.4","vite":"^5.0.0","is-ip":"5.0.1","react":"^18.0.0","eslint":"^8.12.0","vitest":"^0.34.6","ts-node":"^10.9.1","prettier":"^3.0.3","crypto-js":"^4.1.1","happy-dom":"^14.3.6","react-dom":"^18.0.0","typescript":"^5.2.2","@types/react":"^18.2.25","@remix-run/node":"^2.0.0","@remix-run/react":"^2.0.0","@types/crypto-js":"^4.1.2","@remix-run/router":"^1.7.2","@remix-run/testing":"^2.0.0","@vitest/coverage-v8":"^1.3.1","eslint-plugin-react":"^7.33.2","@vitejs/plugin-react":"^4.1.0","eslint-plugin-import":"^2.28.1","@arethetypeswrong/cli":"^0.15.0","eslint-plugin-cypress":"^2.15.1","eslint-plugin-promise":"^6.1.1","eslint-plugin-unicorn":"^52.0.0","@testing-library/react":"^14.0.0","eslint-config-prettier":"^9.0.0","eslint-plugin-jest-dom":"^5.1.0","eslint-plugin-jsx-a11y":"^6.7.1","eslint-plugin-prettier":"^5.0.0","@testing-library/jest-dom":"^6.1.3","@typescript-eslint/parser":"^7.0.1","eslint-plugin-react-hooks":"^4.6.0","intl-parse-accept-language":"^1.0.0","eslint-plugin-testing-library":"^6.0.2","@typescript-eslint/eslint-plugin":"^7.0.2","eslint-import-resolver-typescript":"^3.6.1"},"peerDependencies":{"zod":"^3.22.4","is-ip":"^5.0.1","react":"^18.0.0","crypto-js":"^4.1.1","@remix-run/deno":"^2.0.0","@remix-run/node":"^2.0.0","@remix-run/react":"^2.0.0","@remix-run/router":"^1.7.2","@remix-run/cloudflare":"^2.0.0","intl-parse-accept-language":"^1.0.0"},"peerDependenciesMeta":{"zod":{"optional":true},"is-ip":{"optional":true},"react":{"optional":true},"crypto-js":{"optional":true},"@remix-run/deno":{"optional":true},"@remix-run/node":{"optional":true},"@remix-run/react":{"optional":true},"@remix-run/router":{"optional":true},"@remix-run/cloudflare":{"optional":true},"intl-parse-accept-language":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/remix-utils_7.6.0_1712597794543_0.5319140150739643","host":"s3://npm-registry-packages"}},"7.7.0":{"name":"remix-utils","version":"7.7.0","keywords":["remix","remix.run","react","utils","request","response","csrf","redirect-back","client-only","hydrated","server-only","cors","rolling cookie","safe redirect","typed cookie","typed session","client IP address","client locale","json hash","prefetch","named action"],"author":{"url":"https://sergiodxa.com","name":"Sergio Xalambrí","email":"hello@sergiodxa.com"},"license":"MIT","_id":"remix-utils@7.7.0","maintainers":[{"name":"sergiodxa","email":"hello@sergiodxa.com"}],"homepage":"https://github.com/sergiodxa/remix-utils#readme","bugs":{"url":"https://github.com/sergiodxa/remix-utils/issues"},"dist":{"shasum":"973425232d979d6ec5f18018f816ada74096dcbf","tarball":"https://registry.npmjs.org/remix-utils/-/remix-utils-7.7.0.tgz","fileCount":85,"integrity":"sha512-J8NhP044nrNIam/xOT1L9a4RQ9FSaA2wyrUwmN8ZT+c/+CdAAf70yfaLnvMyKcV5U+8BcURQ/aVbth77sT6jGA==","signatures":[{"sig":"MEYCIQDD/YFmv1NjnUYZUzWyAC9+mCu/BqxS1HY/wRr8L6eagQIhAKVql7iSDNU6Qlu+dspYxZ6M3QFF0aoAk1HCkZa5mdqR","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":204096},"type":"module","engines":{"node":">=18.0.0"},"exports":{"./cors":"./build/server/cors.js","./timers":"./build/common/timers.js","./promise":"./build/common/promise.js","./json-hash":"./build/server/json-hash.js","./responses":"./build/server/responses.js","./sec-fetch":"./build/server/sec-fetch.js","./sse/react":"./build/react/use-event-source.js","./csrf/react":"./build/react/authenticity-token.js","./respond-to":"./build/server/respond-to.js","./sse/server":"./build/server/event-stream.js","./client-only":"./build/react/client-only.js","./csrf/server":"./build/server/csrf.js","./is-prefetch":"./build/server/is-prefetch.js","./server-only":"./build/react/server-only.js","./cache-assets":"./build/client/cache-assets.js","./fetcher-type":"./build/react/fetcher-type.js","./named-action":"./build/server/named-action.js","./package.json":"./package.json","./typed-cookie":"./build/server/typed-cookie.js","./use-hydrated":"./build/react/use-hydrated.js","./locales/react":"./build/react/use-locales.js","./redirect-back":"./build/server/redirect-back.js","./safe-redirect":"./build/server/safe-redirect.js","./typed-session":"./build/server/typed-session.js","./honeypot/react":"./build/react/honeypot.js","./locales/server":"./build/server/get-client-locales.js","./rolling-cookie":"./build/server/rolling-cookie.js","./honeypot/server":"./build/server/honeypot.js","./external-scripts":"./build/react/external-scripts.js","./use-should-hydrate":"./build/react/use-should-hydrate.js","./parse-accept-header":"./build/server/parse-accept-header.js","./use-debounce-submit":"./build/react/use-debounce-submit.js","./preload-route-assets":"./build/server/preload-route-assets.js","./use-debounce-fetcher":"./build/react/use-debounce-fetcher.js","./get-client-ip-address":"./build/server/get-client-ip-address.js","./use-delegated-anchors":"./build/react/use-delegated-anchors.js","./existing-search-params":"./build/react/existing-search-params.js","./use-global-navigation-state":"./build/react/use-global-navigation-state.js"},"funding":["https://github.com/sponsors/sergiodxa"],"gitHead":"e4d599d6722a300f2e6241dd1b62ddeb2eca7a9e","scripts":{"lint":"biome lint .","test":"vitest --run","build":"tsc --project tsconfig.json --outDir ./build","check":"biome check .","format":"biome format --write .","prepare":"npm run build","typecheck":"tsc --project tsconfig.json --noEmit","test:watch":"vitest","test:exports":"bun scripts/check-pkg-exports.ts","test:coverage":"vitest --coverage"},"_npmUser":{"name":"sergiodxa","email":"hello@sergiodxa.com"},"repository":{"url":"git+https://github.com/sergiodxa/remix-utils.git","type":"git"},"_npmVersion":"10.8.2","description":"This package contains simple utility functions to use with [Remix.run](https://remix.run).","directories":{},"sideEffects":false,"_nodeVersion":"20.17.0","dependencies":{"type-fest":"^4.18.1"},"_hasShrinkwrap":false,"devDependencies":{"msw":"^2.2.13","zod":"^3.22.4","vite":"^5.2.8","is-ip":"5.0.1","react":"^18.0.0","vitest":"^1.4.0","ts-node":"^10.9.1","typedoc":"^0.25.13","crypto-js":"^4.1.1","happy-dom":"^14.7.1","react-dom":"^18.0.0","@types/bun":"^1.1.1","typescript":"^5.2.2","@types/react":"^18.2.78","@biomejs/biome":"^1.7.2","@remix-run/node":"^2.0.0","@remix-run/react":"^2.0.0","@types/crypto-js":"^4.1.2","@remix-run/router":"^1.7.2","@remix-run/testing":"^2.0.0","@vitest/coverage-v8":"^1.5.0","@vitejs/plugin-react":"^4.2.1","@arethetypeswrong/cli":"^0.15.0","@testing-library/react":"^15.0.2","typedoc-plugin-mdn-links":"^3.1.23","@testing-library/jest-dom":"^6.1.3","intl-parse-accept-language":"^1.0.0"},"peerDependencies":{"zod":"^3.22.4","is-ip":"^5.0.1","react":"^18.0.0","crypto-js":"^4.1.1","@remix-run/node":"^2.0.0","@remix-run/react":"^2.0.0","@remix-run/router":"^1.7.2","@remix-run/cloudflare":"^2.0.0","intl-parse-accept-language":"^1.0.0"},"peerDependenciesMeta":{"zod":{"optional":true},"is-ip":{"optional":true},"react":{"optional":true},"crypto-js":{"optional":true},"@remix-run/node":{"optional":true},"@remix-run/react":{"optional":true},"@remix-run/router":{"optional":true},"@remix-run/cloudflare":{"optional":true},"intl-parse-accept-language":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/remix-utils_7.7.0_1726814990460_0.8446446507807781","host":"s3://npm-registry-packages"}},"8.0.0":{"name":"remix-utils","version":"8.0.0","keywords":["remix","remix.run","react","utils","request","response","csrf","redirect-back","client-only","hydrated","server-only","cors","rolling cookie","safe redirect","typed cookie","typed session","client IP address","client locale","json hash","prefetch","named action"],"author":{"url":"https://sergiodxa.com","name":"Sergio Xalambrí","email":"hello@sergiodxa.com"},"license":"MIT","_id":"remix-utils@8.0.0","maintainers":[{"name":"sergiodxa","email":"hello@sergiodxa.com"}],"homepage":"https://github.com/sergiodxa/remix-utils#readme","bugs":{"url":"https://github.com/sergiodxa/remix-utils/issues"},"dist":{"shasum":"96386e67fd4de9c163cc43e83e8cd9bb84dfe5a9","tarball":"https://registry.npmjs.org/remix-utils/-/remix-utils-8.0.0.tgz","fileCount":126,"integrity":"sha512-vrs8Iytnuwi+KF+VYOPT3vzDX7cLbys897pwzLpMzLjOXJQ/S60dApHCmQ9cPWH3XHRgvaoJjZ6+sMGaax4fbg==","signatures":[{"sig":"MEUCIQCYNJJ8fY9KfDDFgTHF9XY/lu7iQ/QFqSIvpkI26ArfWgIgYLetTO8ZCTRZvxHnhXCRv7oW+DHW8hU9/DoRjafmllU=","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":257246},"type":"module","engines":{"node":">=20.0.0"},"exports":{"./cors":"./build/server/cors.js","./timers":"./build/common/timers.js","./promise":"./build/common/promise.js","./json-hash":"./build/server/json-hash.js","./responses":"./build/server/responses.js","./sec-fetch":"./build/server/sec-fetch.js","./sse/react":"./build/react/use-event-source.js","./csrf/react":"./build/react/authenticity-token.js","./respond-to":"./build/server/respond-to.js","./sse/server":"./build/server/event-stream.js","./client-only":"./build/react/client-only.js","./csrf/server":"./build/server/csrf.js","./is-prefetch":"./build/server/is-prefetch.js","./server-only":"./build/react/server-only.js","./cache-assets":"./build/client/cache-assets.js","./fetcher-type":"./build/react/fetcher-type.js","./named-action":"./build/server/named-action.js","./package.json":"./package.json","./typed-cookie":"./build/server/typed-cookie.js","./use-hydrated":"./build/react/use-hydrated.js","./locales/react":"./build/react/use-locales.js","./redirect-back":"./build/server/redirect-back.js","./safe-redirect":"./build/server/safe-redirect.js","./typed-session":"./build/server/typed-session.js","./honeypot/react":"./build/react/honeypot.js","./locales/server":"./build/server/get-client-locales.js","./rolling-cookie":"./build/server/rolling-cookie.js","./honeypot/server":"./build/server/honeypot.js","./external-scripts":"./build/react/external-scripts.js","./use-should-hydrate":"./build/react/use-should-hydrate.js","./parse-accept-header":"./build/server/parse-accept-header.js","./use-debounce-submit":"./build/react/use-debounce-submit.js","./preload-route-assets":"./build/server/preload-route-assets.js","./use-debounce-fetcher":"./build/react/use-debounce-fetcher.js","./get-client-ip-address":"./build/server/get-client-ip-address.js","./use-delegated-anchors":"./build/react/use-delegated-anchors.js","./existing-search-params":"./build/react/existing-search-params.js","./use-global-navigation-state":"./build/react/use-global-navigation-state.js"},"funding":["https://github.com/sponsors/sergiodxa"],"gitHead":"bc5ab4eea5707c409f2354b70f751668af0fc68f","scripts":{"build":"tsc","exports":"bun run ./scripts/exports.ts","quality":"biome check .","typecheck":"tsc --noEmit","quality:fix":"biome check . --write --unsafe"},"_npmUser":{"name":"sergiodxa","email":"hello@sergiodxa.com"},"repository":{"url":"git+https://github.com/sergiodxa/remix-utils.git","type":"git"},"_npmVersion":"10.9.0","description":"This package contains simple utility functions to use with [React Router](https://reactrouter.com/home).","directories":{},"sideEffects":false,"_nodeVersion":"22.12.0","dependencies":{"type-fest":"^4.30.0"},"_hasShrinkwrap":false,"devDependencies":{"msw":"^2.6.6","zod":"^3.22.4","vite":"^6.0.2","is-ip":"5.0.1","react":"^19.0.0","ts-node":"^10.9.1","typedoc":"^0.27.2","react-dom":"^19.0.0","@types/bun":"^1.1.14","typescript":"^5.7.2","@types/react":"^18.2.78","react-router":"^7.0.2","@biomejs/biome":"^1.7.2","@oslojs/crypto":"^1.0.1","@oslojs/encoding":"^1.1.0","@vitejs/plugin-react":"^4.3.4","@arethetypeswrong/cli":"^0.17.0","@testing-library/react":"^16.0.1","typedoc-plugin-mdn-links":"^4.0.3","@testing-library/jest-dom":"^6.1.3","@total-typescript/tsconfig":"^1.0.4","intl-parse-accept-language":"^1.0.0","@testing-library/user-event":"^14.5.2","@happy-dom/global-registrator":"^15.11.7"},"peerDependencies":{"zod":"^3.22.4","is-ip":"^5.0.1","react":"^18.0.0 || ^19.0.0","react-router":"^7.0.0","@oslojs/crypto":"^1.0.1","@oslojs/encoding":"^1.1.0","intl-parse-accept-language":"^1.0.0"},"peerDependenciesMeta":{"zod":{"optional":true},"is-ip":{"optional":true},"react":{"optional":true},"react-router":{"optional":true},"@oslojs/crypto":{"optional":true},"@oslojs/encoding":{"optional":true},"intl-parse-accept-language":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/remix-utils_8.0.0_1734047074935_0.7586405515866903","host":"s3://npm-registry-packages-npm-production"}},"8.1.0":{"name":"remix-utils","version":"8.1.0","keywords":["remix","remix.run","react","utils","request","response","csrf","redirect-back","client-only","hydrated","server-only","cors","rolling cookie","safe redirect","typed cookie","typed session","client IP address","client locale","json hash","prefetch","named action"],"author":{"url":"https://sergiodxa.com","name":"Sergio Xalambrí","email":"hello@sergiodxa.com"},"license":"MIT","_id":"remix-utils@8.1.0","maintainers":[{"name":"sergiodxa","email":"hello@sergiodxa.com"}],"homepage":"https://github.com/sergiodxa/remix-utils#readme","bugs":{"url":"https://github.com/sergiodxa/remix-utils/issues"},"dist":{"shasum":"f317f3e929c75da69c8b1ce80b25a1b0b09651ec","tarball":"https://registry.npmjs.org/remix-utils/-/remix-utils-8.1.0.tgz","fileCount":126,"integrity":"sha512-k44K4FOPyMv6QQ+yaQrCrXdnzkKE1b86ZUODAK5fvmWsmi7ntZAAA+Ods+nzNAxFEAPDTreCzl7cGWnxWd6ibw==","signatures":[{"sig":"MEUCIBKAfk7HabmDUIHW1NLpOxazlJKuIlwZgYUOU0HjjOIFAiEA+mFj/Nwzw6PwzEC9Iqrf1gMA2JlP6ouo5pOj4VzvVT4=","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":258016},"type":"module","engines":{"node":">=20.0.0"},"exports":{"./cors":"./build/server/cors.js","./timers":"./build/common/timers.js","./promise":"./build/common/promise.js","./json-hash":"./build/server/json-hash.js","./responses":"./build/server/responses.js","./sec-fetch":"./build/server/sec-fetch.js","./sse/react":"./build/react/use-event-source.js","./csrf/react":"./build/react/authenticity-token.js","./respond-to":"./build/server/respond-to.js","./sse/server":"./build/server/event-stream.js","./client-only":"./build/react/client-only.js","./csrf/server":"./build/server/csrf.js","./is-prefetch":"./build/server/is-prefetch.js","./server-only":"./build/react/server-only.js","./cache-assets":"./build/client/cache-assets.js","./fetcher-type":"./build/react/fetcher-type.js","./named-action":"./build/server/named-action.js","./package.json":"./package.json","./typed-cookie":"./build/server/typed-cookie.js","./use-hydrated":"./build/react/use-hydrated.js","./locales/react":"./build/react/use-locales.js","./redirect-back":"./build/server/redirect-back.js","./safe-redirect":"./build/server/safe-redirect.js","./typed-session":"./build/server/typed-session.js","./honeypot/react":"./build/react/honeypot.js","./locales/server":"./build/server/get-client-locales.js","./rolling-cookie":"./build/server/rolling-cookie.js","./honeypot/server":"./build/server/honeypot.js","./external-scripts":"./build/react/external-scripts.js","./use-should-hydrate":"./build/react/use-should-hydrate.js","./parse-accept-header":"./build/server/parse-accept-header.js","./use-debounce-submit":"./build/react/use-debounce-submit.js","./preload-route-assets":"./build/server/preload-route-assets.js","./use-debounce-fetcher":"./build/react/use-debounce-fetcher.js","./get-client-ip-address":"./build/server/get-client-ip-address.js","./use-delegated-anchors":"./build/react/use-delegated-anchors.js","./existing-search-params":"./build/react/existing-search-params.js","./use-global-navigation-state":"./build/react/use-global-navigation-state.js"},"funding":["https://github.com/sponsors/sergiodxa"],"gitHead":"d605dd8ca26030b7c6fd91ecdbcb5a27c2ab43c5","scripts":{"build":"tsc","exports":"bun run ./scripts/exports.ts","quality":"biome check .","typecheck":"tsc --noEmit","quality:fix":"biome check . --write --unsafe"},"_npmUser":{"name":"sergiodxa","email":"hello@sergiodxa.com"},"repository":{"url":"git+https://github.com/sergiodxa/remix-utils.git","type":"git"},"_npmVersion":"10.9.0","description":"This package contains simple utility functions to use with [React Router](https://reactrouter.com/home).","directories":{},"sideEffects":false,"_nodeVersion":"22.12.0","dependencies":{"type-fest":"^4.33.0"},"_hasShrinkwrap":false,"devDependencies":{"msw":"^2.7.0","zod":"^3.24.1","is-ip":"5.0.1","react":"^19.0.0","ts-node":"^10.9.1","typedoc":"^0.27.6","@types/bun":"^1.1.17","typescript":"^5.7.3","@types/react":"^19.0.7","react-router":"^7.1.3","@biomejs/biome":"^1.7.2","@oslojs/crypto":"^1.0.1","@oslojs/encoding":"^1.1.0","@arethetypeswrong/cli":"^0.17.3","@testing-library/react":"^16.2.0","typedoc-plugin-mdn-links":"^4.0.9","@testing-library/jest-dom":"^6.1.3","@total-typescript/tsconfig":"^1.0.4","intl-parse-accept-language":"^1.0.0","@testing-library/user-event":"^14.6.0","@happy-dom/global-registrator":"^16.7.0"},"peerDependencies":{"zod":"^3.22.4","is-ip":"^5.0.1","react":"^18.0.0 || ^19.0.0","react-router":"^7.0.0","@oslojs/crypto":"^1.0.1","@oslojs/encoding":"^1.1.0","intl-parse-accept-language":"^1.0.0"},"peerDependenciesMeta":{"zod":{"optional":true},"is-ip":{"optional":true},"react":{"optional":true},"react-router":{"optional":true},"@oslojs/crypto":{"optional":true},"@oslojs/encoding":{"optional":true},"intl-parse-accept-language":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/remix-utils_8.1.0_1737411066452_0.6583739405098628","host":"s3://npm-registry-packages-npm-production"}},"8.1.1":{"name":"remix-utils","version":"8.1.1","keywords":["remix","remix.run","react","utils","request","response","csrf","redirect-back","client-only","hydrated","server-only","cors","rolling cookie","safe redirect","typed cookie","typed session","client IP address","client locale","json hash","prefetch","named action"],"author":{"url":"https://sergiodxa.com","name":"Sergio Xalambrí","email":"hello@sergiodxa.com"},"license":"MIT","_id":"remix-utils@8.1.1","maintainers":[{"name":"sergiodxa","email":"hello@sergiodxa.com"}],"homepage":"https://github.com/sergiodxa/remix-utils#readme","bugs":{"url":"https://github.com/sergiodxa/remix-utils/issues"},"dist":{"shasum":"d47e195104533623bdfbe30fc001cb5ccb8f00a5","tarball":"https://registry.npmjs.org/remix-utils/-/remix-utils-8.1.1.tgz","fileCount":126,"integrity":"sha512-OU6r+1tsjaDJvvzl8qopmdHmTZqMQ670AUQIZQh8BKaPvhq0axbm6YEE/OwPvqfM859CfQG60E8Pt5WhLGutzw==","signatures":[{"sig":"MEQCIGY9MkXKM6OBfnXVOhmd2AqGQOp3A8BHP82ORUKNzdeHAiBYrP26db8yWylE7cA7AlbMz32G27TsU1VqeodMtFuy3A==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":260581},"type":"module","engines":{"node":">=20.0.0"},"exports":{"./cors":{"types":"./build/server/cors.d.ts","default":"./build/server/cors.js"},"./timers":{"types":"./build/common/timers.d.ts","default":"./build/common/timers.js"},"./promise":{"types":"./build/common/promise.d.ts","default":"./build/common/promise.js"},"./json-hash":{"types":"./build/server/json-hash.d.ts","default":"./build/server/json-hash.js"},"./responses":{"types":"./build/server/responses.d.ts","default":"./build/server/responses.js"},"./sec-fetch":{"types":"./build/server/sec-fetch.d.ts","default":"./build/server/sec-fetch.js"},"./sse/react":{"types":"./build/react/use-event-source.d.ts","default":"./build/react/use-event-source.js"},"./csrf/react":{"types":"./build/react/authenticity-token.d.ts","default":"./build/react/authenticity-token.js"},"./respond-to":{"types":"./build/server/respond-to.d.ts","default":"./build/server/respond-to.js"},"./sse/server":{"types":"./build/server/event-stream.d.ts","default":"./build/server/event-stream.js"},"./client-only":{"types":"./build/react/client-only.d.ts","default":"./build/react/client-only.js"},"./csrf/server":{"types":"./build/server/csrf.d.ts","default":"./build/server/csrf.js"},"./is-prefetch":{"types":"./build/server/is-prefetch.d.ts","default":"./build/server/is-prefetch.js"},"./server-only":{"types":"./build/react/server-only.d.ts","default":"./build/react/server-only.js"},"./cache-assets":{"types":"./build/client/cache-assets.d.ts","default":"./build/client/cache-assets.js"},"./fetcher-type":{"types":"./build/react/fetcher-type.d.ts","default":"./build/react/fetcher-type.js"},"./named-action":{"types":"./build/server/named-action.d.ts","default":"./build/server/named-action.js"},"./package.json":"./package.json","./typed-cookie":{"types":"./build/server/typed-cookie.d.ts","default":"./build/server/typed-cookie.js"},"./use-hydrated":{"types":"./build/react/use-hydrated.d.ts","default":"./build/react/use-hydrated.js"},"./locales/react":{"types":"./build/react/use-locales.d.ts","default":"./build/react/use-locales.js"},"./redirect-back":{"types":"./build/server/redirect-back.d.ts","default":"./build/server/redirect-back.js"},"./safe-redirect":{"types":"./build/server/safe-redirect.d.ts","default":"./build/server/safe-redirect.js"},"./typed-session":{"types":"./build/server/typed-session.d.ts","default":"./build/server/typed-session.js"},"./honeypot/react":{"types":"./build/react/honeypot.d.ts","default":"./build/react/honeypot.js"},"./locales/server":{"types":"./build/server/get-client-locales.d.ts","default":"./build/server/get-client-locales.js"},"./rolling-cookie":{"types":"./build/server/rolling-cookie.d.ts","default":"./build/server/rolling-cookie.js"},"./honeypot/server":{"types":"./build/server/honeypot.d.ts","default":"./build/server/honeypot.js"},"./external-scripts":{"types":"./build/react/external-scripts.d.ts","default":"./build/react/external-scripts.js"},"./use-should-hydrate":{"types":"./build/react/use-should-hydrate.d.ts","default":"./build/react/use-should-hydrate.js"},"./parse-accept-header":{"types":"./build/server/parse-accept-header.d.ts","default":"./build/server/parse-accept-header.js"},"./use-debounce-submit":{"types":"./build/react/use-debounce-submit.d.ts","default":"./build/react/use-debounce-submit.js"},"./preload-route-assets":{"types":"./build/server/preload-route-assets.d.ts","default":"./build/server/preload-route-assets.js"},"./use-debounce-fetcher":{"types":"./build/react/use-debounce-fetcher.d.ts","default":"./build/react/use-debounce-fetcher.js"},"./get-client-ip-address":{"types":"./build/server/get-client-ip-address.d.ts","default":"./build/server/get-client-ip-address.js"},"./use-delegated-anchors":{"types":"./build/react/use-delegated-anchors.d.ts","default":"./build/react/use-delegated-anchors.js"},"./existing-search-params":{"types":"./build/react/existing-search-params.d.ts","default":"./build/react/existing-search-params.js"},"./use-global-navigation-state":{"types":"./build/react/use-global-navigation-state.d.ts","default":"./build/react/use-global-navigation-state.js"}},"funding":["https://github.com/sponsors/sergiodxa"],"gitHead":"027e526e09dddd4f99cf52835457860082df0175","scripts":{"build":"tsc","exports":"bun run ./scripts/exports.ts","quality":"biome check .","typecheck":"tsc --noEmit","quality:fix":"biome check . --write --unsafe"},"_npmUser":{"name":"sergiodxa","email":"hello@sergiodxa.com"},"repository":{"url":"git+https://github.com/sergiodxa/remix-utils.git","type":"git"},"_npmVersion":"10.9.2","description":"This package contains simple utility functions to use with [React Router](https://reactrouter.com/home).","directories":{},"sideEffects":false,"_nodeVersion":"22.14.0","dependencies":{"type-fest":"^4.33.0"},"_hasShrinkwrap":false,"devDependencies":{"msw":"^2.7.0","zod":"^3.24.1","is-ip":"5.0.1","react":"^19.0.0","ts-node":"^10.9.1","typedoc":"^0.27.6","@types/bun":"^1.1.17","typescript":"^5.7.3","@types/react":"^19.0.7","react-router":"^7.1.3","@biomejs/biome":"^1.7.2","@oslojs/crypto":"^1.0.1","@oslojs/encoding":"^1.1.0","@arethetypeswrong/cli":"^0.17.3","@testing-library/react":"^16.2.0","typedoc-plugin-mdn-links":"^4.0.9","@testing-library/jest-dom":"^6.1.3","@total-typescript/tsconfig":"^1.0.4","intl-parse-accept-language":"^1.0.0","@testing-library/user-event":"^14.6.0","@happy-dom/global-registrator":"^16.7.0"},"peerDependencies":{"zod":"^3.22.4","is-ip":"^5.0.1","react":"^18.0.0 || ^19.0.0","react-router":"^7.0.0","@oslojs/crypto":"^1.0.1","@oslojs/encoding":"^1.1.0","intl-parse-accept-language":"^1.0.0"},"peerDependenciesMeta":{"zod":{"optional":true},"is-ip":{"optional":true},"react":{"optional":true},"react-router":{"optional":true},"@oslojs/crypto":{"optional":true},"@oslojs/encoding":{"optional":true},"intl-parse-accept-language":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/remix-utils_8.1.1_1741111958713_0.07676425972427703","host":"s3://npm-registry-packages-npm-production"}},"8.2.0":{"name":"remix-utils","version":"8.2.0","keywords":["remix","remix.run","react","utils","request","response","csrf","redirect-back","client-only","hydrated","server-only","cors","rolling cookie","safe redirect","typed cookie","typed session","client IP address","client locale","json hash","prefetch","named action"],"author":{"url":"https://sergiodxa.com","name":"Sergio Xalambrí","email":"hello@sergiodxa.com"},"license":"MIT","_id":"remix-utils@8.2.0","maintainers":[{"name":"sergiodxa","email":"hello@sergiodxa.com"}],"homepage":"https://github.com/sergiodxa/remix-utils#readme","bugs":{"url":"https://github.com/sergiodxa/remix-utils/issues"},"dist":{"shasum":"c2f80c913a07135abb74f4d0c2ebb67c0ce7d49a","tarball":"https://registry.npmjs.org/remix-utils/-/remix-utils-8.2.0.tgz","fileCount":129,"integrity":"sha512-RdQI2hzLAeVCbDRtKkLAUW+fMjsNEb2yBkGY5AtCcaYpWPG08Qf3JlWxWdoMze5qgejhZEZ7407iZ6JRZgFfqg==","signatures":[{"sig":"MEUCIQCaDON8PhGW15vpTnnudSAHWZuQp6ibpD9aLI8fv7nVtwIgHfzNDT4UIJSfY3cG23ekdB/57AGHfDxdjbsmt+JeEJU=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":269775},"type":"module","engines":{"node":">=20.0.0"},"exports":{"./cors":{"types":"./build/server/cors.d.ts","default":"./build/server/cors.js"},"./timers":{"types":"./build/common/timers.d.ts","default":"./build/common/timers.js"},"./promise":{"types":"./build/common/promise.d.ts","default":"./build/common/promise.js"},"./json-hash":{"types":"./build/server/json-hash.d.ts","default":"./build/server/json-hash.js"},"./responses":{"types":"./build/server/responses.d.ts","default":"./build/server/responses.js"},"./sec-fetch":{"types":"./build/server/sec-fetch.d.ts","default":"./build/server/sec-fetch.js"},"./sse/react":{"types":"./build/react/use-event-source.d.ts","default":"./build/react/use-event-source.js"},"./csrf/react":{"types":"./build/react/authenticity-token.d.ts","default":"./build/react/authenticity-token.js"},"./respond-to":{"types":"./build/server/respond-to.d.ts","default":"./build/server/respond-to.js"},"./sse/server":{"types":"./build/server/event-stream.d.ts","default":"./build/server/event-stream.js"},"./client-only":{"types":"./build/react/client-only.d.ts","default":"./build/react/client-only.js"},"./csrf/server":{"types":"./build/server/csrf.d.ts","default":"./build/server/csrf.js"},"./is-prefetch":{"types":"./build/server/is-prefetch.d.ts","default":"./build/server/is-prefetch.js"},"./server-only":{"types":"./build/react/server-only.d.ts","default":"./build/react/server-only.js"},"./cache-assets":{"types":"./build/client/cache-assets.d.ts","default":"./build/client/cache-assets.js"},"./fetcher-type":{"types":"./build/react/fetcher-type.d.ts","default":"./build/react/fetcher-type.js"},"./named-action":{"types":"./build/server/named-action.d.ts","default":"./build/server/named-action.js"},"./package.json":"./package.json","./typed-cookie":{"types":"./build/server/typed-cookie.d.ts","default":"./build/server/typed-cookie.js"},"./use-hydrated":{"types":"./build/react/use-hydrated.d.ts","default":"./build/react/use-hydrated.js"},"./locales/react":{"types":"./build/react/use-locales.d.ts","default":"./build/react/use-locales.js"},"./redirect-back":{"types":"./build/server/redirect-back.d.ts","default":"./build/server/redirect-back.js"},"./safe-redirect":{"types":"./build/server/safe-redirect.d.ts","default":"./build/server/safe-redirect.js"},"./typed-session":{"types":"./build/server/typed-session.d.ts","default":"./build/server/typed-session.js"},"./honeypot/react":{"types":"./build/react/honeypot.d.ts","default":"./build/react/honeypot.js"},"./locales/server":{"types":"./build/server/get-client-locales.d.ts","default":"./build/server/get-client-locales.js"},"./rolling-cookie":{"types":"./build/server/rolling-cookie.d.ts","default":"./build/server/rolling-cookie.js"},"./honeypot/server":{"types":"./build/server/honeypot.d.ts","default":"./build/server/honeypot.js"},"./external-scripts":{"types":"./build/react/external-scripts.d.ts","default":"./build/react/external-scripts.js"},"./use-should-hydrate":{"types":"./build/react/use-should-hydrate.d.ts","default":"./build/react/use-should-hydrate.js"},"./middlewares/session":{"types":"./build/server/middlewares/session.d.ts","default":"./build/server/middlewares/session.js"},"./parse-accept-header":{"types":"./build/server/parse-accept-header.d.ts","default":"./build/server/parse-accept-header.js"},"./use-debounce-submit":{"types":"./build/react/use-debounce-submit.d.ts","default":"./build/react/use-debounce-submit.js"},"./preload-route-assets":{"types":"./build/server/preload-route-assets.d.ts","default":"./build/server/preload-route-assets.js"},"./use-debounce-fetcher":{"types":"./build/react/use-debounce-fetcher.d.ts","default":"./build/react/use-debounce-fetcher.js"},"./get-client-ip-address":{"types":"./build/server/get-client-ip-address.d.ts","default":"./build/server/get-client-ip-address.js"},"./use-delegated-anchors":{"types":"./build/react/use-delegated-anchors.d.ts","default":"./build/react/use-delegated-anchors.js"},"./existing-search-params":{"types":"./build/react/existing-search-params.d.ts","default":"./build/react/existing-search-params.js"},"./use-global-navigation-state":{"types":"./build/react/use-global-navigation-state.d.ts","default":"./build/react/use-global-navigation-state.js"}},"funding":["https://github.com/sponsors/sergiodxa"],"gitHead":"c01eca4f9dffb54d300d9037b676517e89a55358","scripts":{"build":"tsc","exports":"bun run ./scripts/exports.ts","quality":"biome check .","typecheck":"tsc --noEmit","quality:fix":"biome check . --write --unsafe"},"_npmUser":{"name":"sergiodxa","email":"hello@sergiodxa.com"},"repository":{"url":"git+https://github.com/sergiodxa/remix-utils.git","type":"git"},"_npmVersion":"10.9.2","description":"This package contains simple utility functions to use with [React Router](https://reactrouter.com/).","directories":{},"sideEffects":false,"_nodeVersion":"22.14.0","dependencies":{"type-fest":"^4.33.0"},"_hasShrinkwrap":false,"devDependencies":{"msw":"^2.7.0","zod":"^3.24.1","is-ip":"5.0.1","react":"^19.0.0","ts-node":"^10.9.1","typedoc":"^0.27.6","@types/bun":"^1.1.17","typescript":"^5.7.3","@types/react":"^19.0.7","react-router":"^7.3.0","@biomejs/biome":"^1.7.2","@oslojs/crypto":"^1.0.1","@oslojs/encoding":"^1.1.0","@arethetypeswrong/cli":"^0.17.3","@testing-library/react":"^16.2.0","typedoc-plugin-mdn-links":"^4.0.9","@testing-library/jest-dom":"^6.1.3","@total-typescript/tsconfig":"^1.0.4","intl-parse-accept-language":"^1.0.0","@testing-library/user-event":"^14.6.0","@happy-dom/global-registrator":"^16.7.0"},"peerDependencies":{"zod":"^3.22.4","is-ip":"^5.0.1","react":"^18.0.0 || ^19.0.0","react-router":"^7.0.0","@oslojs/crypto":"^1.0.1","@oslojs/encoding":"^1.1.0","intl-parse-accept-language":"^1.0.0"},"peerDependenciesMeta":{"zod":{"optional":true},"is-ip":{"optional":true},"react":{"optional":true},"react-router":{"optional":true},"@oslojs/crypto":{"optional":true},"@oslojs/encoding":{"optional":true},"intl-parse-accept-language":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/remix-utils_8.2.0_1741420050470_0.5861180526369079","host":"s3://npm-registry-packages-npm-production"}},"8.3.0":{"name":"remix-utils","version":"8.3.0","keywords":["remix","remix.run","react","utils","request","response","csrf","redirect-back","client-only","hydrated","server-only","cors","rolling cookie","safe redirect","typed cookie","typed session","client IP address","client locale","json hash","prefetch","named action"],"author":{"url":"https://sergiodxa.com","name":"Sergio Xalambrí","email":"hello@sergiodxa.com"},"license":"MIT","_id":"remix-utils@8.3.0","maintainers":[{"name":"sergiodxa","email":"hello@sergiodxa.com"}],"homepage":"https://github.com/sergiodxa/remix-utils#readme","bugs":{"url":"https://github.com/sergiodxa/remix-utils/issues"},"dist":{"shasum":"f7522c21569903a058b71cec467c23605a3b80a7","tarball":"https://registry.npmjs.org/remix-utils/-/remix-utils-8.3.0.tgz","fileCount":141,"integrity":"sha512-WA3ABUTUG63SmdhY/kPAwyKqN3KALKwhLd2/Ld6ZEnZPy7Gbz/yrmA1UMm7RcawyeuPJVCd/4vQo0N8myNlITQ==","signatures":[{"sig":"MEUCIQCZh+8rYKPD2Zn0VZfP1m1gOBNY0bDip20rWcDYe+nAXAIgBVJh1+OxhsKs1zIaVwAuFm9k9WqrGptw8tKVCa0ZGoI=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":289021},"type":"module","engines":{"node":">=20.0.0"},"exports":{"./cors":{"types":"./build/server/cors.d.ts","default":"./build/server/cors.js"},"./timers":{"types":"./build/common/timers.d.ts","default":"./build/common/timers.js"},"./promise":{"types":"./build/common/promise.d.ts","default":"./build/common/promise.js"},"./json-hash":{"types":"./build/server/json-hash.d.ts","default":"./build/server/json-hash.js"},"./responses":{"types":"./build/server/responses.d.ts","default":"./build/server/responses.js"},"./sec-fetch":{"types":"./build/server/sec-fetch.d.ts","default":"./build/server/sec-fetch.js"},"./sse/react":{"types":"./build/react/use-event-source.d.ts","default":"./build/react/use-event-source.js"},"./csrf/react":{"types":"./build/react/authenticity-token.d.ts","default":"./build/react/authenticity-token.js"},"./respond-to":{"types":"./build/server/respond-to.d.ts","default":"./build/server/respond-to.js"},"./sse/server":{"types":"./build/server/event-stream.d.ts","default":"./build/server/event-stream.js"},"./client-only":{"types":"./build/react/client-only.d.ts","default":"./build/react/client-only.js"},"./csrf/server":{"types":"./build/server/csrf.d.ts","default":"./build/server/csrf.js"},"./is-prefetch":{"types":"./build/server/is-prefetch.d.ts","default":"./build/server/is-prefetch.js"},"./server-only":{"types":"./build/react/server-only.d.ts","default":"./build/react/server-only.js"},"./cache-assets":{"types":"./build/client/cache-assets.d.ts","default":"./build/client/cache-assets.js"},"./fetcher-type":{"types":"./build/react/fetcher-type.d.ts","default":"./build/react/fetcher-type.js"},"./named-action":{"types":"./build/server/named-action.d.ts","default":"./build/server/named-action.js"},"./package.json":"./package.json","./typed-cookie":{"types":"./build/server/typed-cookie.d.ts","default":"./build/server/typed-cookie.js"},"./use-hydrated":{"types":"./build/react/use-hydrated.d.ts","default":"./build/react/use-hydrated.js"},"./locales/react":{"types":"./build/react/use-locales.d.ts","default":"./build/react/use-locales.js"},"./redirect-back":{"types":"./build/server/redirect-back.d.ts","default":"./build/server/redirect-back.js"},"./safe-redirect":{"types":"./build/server/safe-redirect.d.ts","default":"./build/server/safe-redirect.js"},"./typed-session":{"types":"./build/server/typed-session.d.ts","default":"./build/server/typed-session.js"},"./honeypot/react":{"types":"./build/react/honeypot.d.ts","default":"./build/react/honeypot.js"},"./locales/server":{"types":"./build/server/get-client-locales.d.ts","default":"./build/server/get-client-locales.js"},"./rolling-cookie":{"types":"./build/server/rolling-cookie.d.ts","default":"./build/server/rolling-cookie.js"},"./honeypot/server":{"types":"./build/server/honeypot.d.ts","default":"./build/server/honeypot.js"},"./external-scripts":{"types":"./build/react/external-scripts.d.ts","default":"./build/react/external-scripts.js"},"./middleware/logger":{"types":"./build/server/middleware/logger.d.ts","default":"./build/server/middleware/logger.js"},"./middleware/batcher":{"types":"./build/server/middleware/batcher.d.ts","default":"./build/server/middleware/batcher.js"},"./middleware/session":{"types":"./build/server/middleware/session.d.ts","default":"./build/server/middleware/session.js"},"./use-should-hydrate":{"types":"./build/react/use-should-hydrate.d.ts","default":"./build/react/use-should-hydrate.js"},"./parse-accept-header":{"types":"./build/server/parse-accept-header.d.ts","default":"./build/server/parse-accept-header.js"},"./use-debounce-submit":{"types":"./build/react/use-debounce-submit.d.ts","default":"./build/react/use-debounce-submit.js"},"./middleware/singleton":{"types":"./build/server/middleware/singleton.d.ts","default":"./build/server/middleware/singleton.js"},"./preload-route-assets":{"types":"./build/server/preload-route-assets.d.ts","default":"./build/server/preload-route-assets.js"},"./use-debounce-fetcher":{"types":"./build/react/use-debounce-fetcher.d.ts","default":"./build/react/use-debounce-fetcher.js"},"./get-client-ip-address":{"types":"./build/server/get-client-ip-address.d.ts","default":"./build/server/get-client-ip-address.js"},"./use-delegated-anchors":{"types":"./build/react/use-delegated-anchors.d.ts","default":"./build/react/use-delegated-anchors.js"},"./existing-search-params":{"types":"./build/react/existing-search-params.d.ts","default":"./build/react/existing-search-params.js"},"./use-global-navigation-state":{"types":"./build/react/use-global-navigation-state.d.ts","default":"./build/react/use-global-navigation-state.js"}},"funding":["https://github.com/sponsors/sergiodxa"],"gitHead":"d4c873cc26cd2fcab423a4690165d81b9280018d","scripts":{"build":"tsc","exports":"bun run ./scripts/exports.ts","quality":"biome check .","typecheck":"tsc --noEmit","quality:fix":"biome check . --write --unsafe"},"_npmUser":{"name":"sergiodxa","email":"hello@sergiodxa.com"},"repository":{"url":"git+https://github.com/sergiodxa/remix-utils.git","type":"git"},"_npmVersion":"10.9.2","description":"This package contains simple utility functions to use with [React Router](https://reactrouter.com/).","directories":{},"sideEffects":false,"_nodeVersion":"22.14.0","dependencies":{"type-fest":"^4.37.0"},"_hasShrinkwrap":false,"devDependencies":{"msw":"^2.7.3","zod":"^3.24.2","is-ip":"5.0.1","react":"^19.0.0","ts-node":"^10.9.1","typedoc":"^0.27.9","@types/bun":"^1.2.4","typescript":"^5.8.2","@types/react":"^19.0.10","react-router":"^7.3.0","@biomejs/biome":"^1.7.2","@oslojs/crypto":"^1.0.1","@oslojs/encoding":"^1.1.0","@arethetypeswrong/cli":"^0.17.4","@edgefirst-dev/batcher":"^1.0.1","@testing-library/react":"^16.2.0","typedoc-plugin-mdn-links":"^5.0.1","@testing-library/jest-dom":"^6.1.3","@total-typescript/tsconfig":"^1.0.4","intl-parse-accept-language":"^1.0.0","@testing-library/user-event":"^14.6.1","@edgefirst-dev/server-timing":"^0.0.1","@happy-dom/global-registrator":"^17.4.3"},"peerDependencies":{"zod":"^3.22.4","is-ip":"^5.0.1","react":"^18.0.0 || ^19.0.0","react-router":"^7.0.0","@oslojs/crypto":"^1.0.1","@oslojs/encoding":"^1.1.0","@edgefirst-dev/batcher":"^1.0.0","intl-parse-accept-language":"^1.0.0","@edgefirst-dev/server-timing":"^0.0.1"},"peerDependenciesMeta":{"zod":{"optional":true},"is-ip":{"optional":true},"react":{"optional":true},"react-router":{"optional":true},"@oslojs/crypto":{"optional":true},"@oslojs/encoding":{"optional":true},"@edgefirst-dev/batcher":{"optional":true},"intl-parse-accept-language":{"optional":true},"@edgefirst-dev/server-timing":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/remix-utils_8.3.0_1741673270743_0.5018624041805317","host":"s3://npm-registry-packages-npm-production"}},"8.3.1":{"name":"remix-utils","version":"8.3.1","keywords":["remix","remix.run","react","utils","request","response","csrf","redirect-back","client-only","hydrated","server-only","cors","rolling cookie","safe redirect","typed cookie","typed session","client IP address","client locale","json hash","prefetch","named action"],"author":{"url":"https://sergiodxa.com","name":"Sergio Xalambrí","email":"hello@sergiodxa.com"},"license":"MIT","_id":"remix-utils@8.3.1","maintainers":[{"name":"sergiodxa","email":"hello@sergiodxa.com"}],"homepage":"https://github.com/sergiodxa/remix-utils#readme","bugs":{"url":"https://github.com/sergiodxa/remix-utils/issues"},"dist":{"shasum":"cea131d020326b07af84fc894440984d040ac8db","tarball":"https://registry.npmjs.org/remix-utils/-/remix-utils-8.3.1.tgz","fileCount":141,"integrity":"sha512-tnUnQ3SORoIe9u8TYHKT6ZsRXDPRnXFFksk+5N0EZUc0sCNHhILl1JHms7uT6U5oUMmVxY2ZQKzwDRM5oGzbkw==","signatures":[{"sig":"MEUCIDTkDyLSoQHbIvSe2dOto23sYRWagX5jH288R35nwwmcAiEAnRVc8Zc97An0OuYnBiR6ROVy2QK/5MlSe5DIkgj9/ZQ=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":289179},"type":"module","engines":{"node":">=20.0.0"},"exports":{"./cors":{"types":"./build/server/cors.d.ts","default":"./build/server/cors.js"},"./timers":{"types":"./build/common/timers.d.ts","default":"./build/common/timers.js"},"./promise":{"types":"./build/common/promise.d.ts","default":"./build/common/promise.js"},"./json-hash":{"types":"./build/server/json-hash.d.ts","default":"./build/server/json-hash.js"},"./responses":{"types":"./build/server/responses.d.ts","default":"./build/server/responses.js"},"./sec-fetch":{"types":"./build/server/sec-fetch.d.ts","default":"./build/server/sec-fetch.js"},"./sse/react":{"types":"./build/react/use-event-source.d.ts","default":"./build/react/use-event-source.js"},"./csrf/react":{"types":"./build/react/authenticity-token.d.ts","default":"./build/react/authenticity-token.js"},"./respond-to":{"types":"./build/server/respond-to.d.ts","default":"./build/server/respond-to.js"},"./sse/server":{"types":"./build/server/event-stream.d.ts","default":"./build/server/event-stream.js"},"./client-only":{"types":"./build/react/client-only.d.ts","default":"./build/react/client-only.js"},"./csrf/server":{"types":"./build/server/csrf.d.ts","default":"./build/server/csrf.js"},"./is-prefetch":{"types":"./build/server/is-prefetch.d.ts","default":"./build/server/is-prefetch.js"},"./server-only":{"types":"./build/react/server-only.d.ts","default":"./build/react/server-only.js"},"./cache-assets":{"types":"./build/client/cache-assets.d.ts","default":"./build/client/cache-assets.js"},"./fetcher-type":{"types":"./build/react/fetcher-type.d.ts","default":"./build/react/fetcher-type.js"},"./named-action":{"types":"./build/server/named-action.d.ts","default":"./build/server/named-action.js"},"./package.json":"./package.json","./typed-cookie":{"types":"./build/server/typed-cookie.d.ts","default":"./build/server/typed-cookie.js"},"./use-hydrated":{"types":"./build/react/use-hydrated.d.ts","default":"./build/react/use-hydrated.js"},"./locales/react":{"types":"./build/react/use-locales.d.ts","default":"./build/react/use-locales.js"},"./redirect-back":{"types":"./build/server/redirect-back.d.ts","default":"./build/server/redirect-back.js"},"./safe-redirect":{"types":"./build/server/safe-redirect.d.ts","default":"./build/server/safe-redirect.js"},"./typed-session":{"types":"./build/server/typed-session.d.ts","default":"./build/server/typed-session.js"},"./honeypot/react":{"types":"./build/react/honeypot.d.ts","default":"./build/react/honeypot.js"},"./locales/server":{"types":"./build/server/get-client-locales.d.ts","default":"./build/server/get-client-locales.js"},"./rolling-cookie":{"types":"./build/server/rolling-cookie.d.ts","default":"./build/server/rolling-cookie.js"},"./honeypot/server":{"types":"./build/server/honeypot.d.ts","default":"./build/server/honeypot.js"},"./external-scripts":{"types":"./build/react/external-scripts.d.ts","default":"./build/react/external-scripts.js"},"./middleware/logger":{"types":"./build/server/middleware/logger.d.ts","default":"./build/server/middleware/logger.js"},"./middleware/batcher":{"types":"./build/server/middleware/batcher.d.ts","default":"./build/server/middleware/batcher.js"},"./middleware/session":{"types":"./build/server/middleware/session.d.ts","default":"./build/server/middleware/session.js"},"./use-should-hydrate":{"types":"./build/react/use-should-hydrate.d.ts","default":"./build/react/use-should-hydrate.js"},"./parse-accept-header":{"types":"./build/server/parse-accept-header.d.ts","default":"./build/server/parse-accept-header.js"},"./use-debounce-submit":{"types":"./build/react/use-debounce-submit.d.ts","default":"./build/react/use-debounce-submit.js"},"./middleware/singleton":{"types":"./build/server/middleware/singleton.d.ts","default":"./build/server/middleware/singleton.js"},"./preload-route-assets":{"types":"./build/server/preload-route-assets.d.ts","default":"./build/server/preload-route-assets.js"},"./use-debounce-fetcher":{"types":"./build/react/use-debounce-fetcher.d.ts","default":"./build/react/use-debounce-fetcher.js"},"./get-client-ip-address":{"types":"./build/server/get-client-ip-address.d.ts","default":"./build/server/get-client-ip-address.js"},"./use-delegated-anchors":{"types":"./build/react/use-delegated-anchors.d.ts","default":"./build/react/use-delegated-anchors.js"},"./existing-search-params":{"types":"./build/react/existing-search-params.d.ts","default":"./build/react/existing-search-params.js"},"./middleware/server-timing":{"types":"./build/server/middleware/server-timing.d.ts","default":"./build/server/middleware/server-timing.js"},"./use-global-navigation-state":{"types":"./build/react/use-global-navigation-state.d.ts","default":"./build/react/use-global-navigation-state.js"}},"funding":["https://github.com/sponsors/sergiodxa"],"gitHead":"c37dfe0c3da4cac46b8c34d37d05d77efbddc8ae","scripts":{"build":"tsc","exports":"bun run ./scripts/exports.ts","quality":"biome check .","typecheck":"tsc --noEmit","quality:fix":"biome check . --write --unsafe"},"_npmUser":{"name":"sergiodxa","email":"hello@sergiodxa.com"},"repository":{"url":"git+https://github.com/sergiodxa/remix-utils.git","type":"git"},"_npmVersion":"10.9.2","description":"This package contains simple utility functions to use with [React Router](https://reactrouter.com/).","directories":{},"sideEffects":false,"_nodeVersion":"22.14.0","dependencies":{"type-fest":"^4.37.0"},"_hasShrinkwrap":false,"devDependencies":{"msw":"^2.7.3","zod":"^3.24.2","is-ip":"5.0.1","react":"^19.0.0","ts-node":"^10.9.1","typedoc":"^0.27.9","@types/bun":"^1.2.4","typescript":"^5.8.2","@types/react":"^19.0.10","react-router":"^7.3.0","@biomejs/biome":"^1.7.2","@oslojs/crypto":"^1.0.1","@oslojs/encoding":"^1.1.0","@arethetypeswrong/cli":"^0.17.4","@edgefirst-dev/batcher":"^1.0.1","@testing-library/react":"^16.2.0","typedoc-plugin-mdn-links":"^5.0.1","@testing-library/jest-dom":"^6.1.3","@total-typescript/tsconfig":"^1.0.4","intl-parse-accept-language":"^1.0.0","@testing-library/user-event":"^14.6.1","@edgefirst-dev/server-timing":"^0.0.1","@happy-dom/global-registrator":"^17.4.3"},"peerDependencies":{"zod":"^3.22.4","is-ip":"^5.0.1","react":"^18.0.0 || ^19.0.0","react-router":"^7.0.0","@oslojs/crypto":"^1.0.1","@oslojs/encoding":"^1.1.0","@edgefirst-dev/batcher":"^1.0.0","intl-parse-accept-language":"^1.0.0","@edgefirst-dev/server-timing":"^0.0.1"},"peerDependenciesMeta":{"zod":{"optional":true},"is-ip":{"optional":true},"react":{"optional":true},"react-router":{"optional":true},"@oslojs/crypto":{"optional":true},"@oslojs/encoding":{"optional":true},"@edgefirst-dev/batcher":{"optional":true},"intl-parse-accept-language":{"optional":true},"@edgefirst-dev/server-timing":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/remix-utils_8.3.1_1741675911196_0.7345205615181181","host":"s3://npm-registry-packages-npm-production"}},"8.4.0":{"name":"remix-utils","version":"8.4.0","keywords":["remix","remix.run","react","utils","request","response","csrf","redirect-back","client-only","hydrated","server-only","cors","rolling cookie","safe redirect","typed cookie","typed session","client IP address","client locale","json hash","prefetch","named action"],"author":{"url":"https://sergiodxa.com","name":"Sergio Xalambrí","email":"hello@sergiodxa.com"},"license":"MIT","_id":"remix-utils@8.4.0","maintainers":[{"name":"sergiodxa","email":"hello@sergiodxa.com"}],"homepage":"https://github.com/sergiodxa/remix-utils#readme","bugs":{"url":"https://github.com/sergiodxa/remix-utils/issues"},"dist":{"shasum":"7c79efdec515bd3dab61f4870d67e26a345ee158","tarball":"https://registry.npmjs.org/remix-utils/-/remix-utils-8.4.0.tgz","fileCount":153,"integrity":"sha512-w/b2Qu1iLOcavKGF2+Zu0pg/n79B9O7EjqKHkJCFtDm4Gz79ofOwnX8T2A0RVI0sCoOq9Ds4NW72ZC9XGDj6LQ==","signatures":[{"sig":"MEUCIQCUpZcHkiIkbA6M6Mfj6NecYIVQuUvOLftNWw3TWLTZswIgHwKTv2/EjVm0uOakX7drXff94ikOnVia7GglMFToLCI=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":317435},"type":"module","engines":{"node":">=20.0.0"},"exports":{"./cors":{"types":"./build/server/cors.d.ts","default":"./build/server/cors.js"},"./timers":{"types":"./build/common/timers.d.ts","default":"./build/common/timers.js"},"./promise":{"types":"./build/common/promise.d.ts","default":"./build/common/promise.js"},"./json-hash":{"types":"./build/server/json-hash.d.ts","default":"./build/server/json-hash.js"},"./responses":{"types":"./build/server/responses.d.ts","default":"./build/server/responses.js"},"./sec-fetch":{"types":"./build/server/sec-fetch.d.ts","default":"./build/server/sec-fetch.js"},"./sse/react":{"types":"./build/react/use-event-source.d.ts","default":"./build/react/use-event-source.js"},"./csrf/react":{"types":"./build/react/authenticity-token.d.ts","default":"./build/react/authenticity-token.js"},"./respond-to":{"types":"./build/server/respond-to.d.ts","default":"./build/server/respond-to.js"},"./sse/server":{"types":"./build/server/event-stream.d.ts","default":"./build/server/event-stream.js"},"./client-only":{"types":"./build/react/client-only.d.ts","default":"./build/react/client-only.js"},"./csrf/server":{"types":"./build/server/csrf.d.ts","default":"./build/server/csrf.js"},"./is-prefetch":{"types":"./build/server/is-prefetch.d.ts","default":"./build/server/is-prefetch.js"},"./server-only":{"types":"./build/react/server-only.d.ts","default":"./build/react/server-only.js"},"./cache-assets":{"types":"./build/client/cache-assets.d.ts","default":"./build/client/cache-assets.js"},"./fetcher-type":{"types":"./build/react/fetcher-type.d.ts","default":"./build/react/fetcher-type.js"},"./named-action":{"types":"./build/server/named-action.d.ts","default":"./build/server/named-action.js"},"./package.json":"./package.json","./typed-cookie":{"types":"./build/server/typed-cookie.d.ts","default":"./build/server/typed-cookie.js"},"./use-hydrated":{"types":"./build/react/use-hydrated.d.ts","default":"./build/react/use-hydrated.js"},"./locales/react":{"types":"./build/react/use-locales.d.ts","default":"./build/react/use-locales.js"},"./redirect-back":{"types":"./build/server/redirect-back.d.ts","default":"./build/server/redirect-back.js"},"./safe-redirect":{"types":"./build/server/safe-redirect.d.ts","default":"./build/server/safe-redirect.js"},"./typed-session":{"types":"./build/server/typed-session.d.ts","default":"./build/server/typed-session.js"},"./honeypot/react":{"types":"./build/react/honeypot.d.ts","default":"./build/react/honeypot.js"},"./locales/server":{"types":"./build/server/get-client-locales.d.ts","default":"./build/server/get-client-locales.js"},"./rolling-cookie":{"types":"./build/server/rolling-cookie.d.ts","default":"./build/server/rolling-cookie.js"},"./honeypot/server":{"types":"./build/server/honeypot.d.ts","default":"./build/server/honeypot.js"},"./external-scripts":{"types":"./build/react/external-scripts.d.ts","default":"./build/react/external-scripts.js"},"./middleware/logger":{"types":"./build/server/middleware/logger.d.ts","default":"./build/server/middleware/logger.js"},"./middleware/batcher":{"types":"./build/server/middleware/batcher.d.ts","default":"./build/server/middleware/batcher.js"},"./middleware/session":{"types":"./build/server/middleware/session.d.ts","default":"./build/server/middleware/session.js"},"./use-should-hydrate":{"types":"./build/react/use-should-hydrate.d.ts","default":"./build/react/use-should-hydrate.js"},"./parse-accept-header":{"types":"./build/server/parse-accept-header.d.ts","default":"./build/server/parse-accept-header.js"},"./use-debounce-submit":{"types":"./build/react/use-debounce-submit.d.ts","default":"./build/react/use-debounce-submit.js"},"./middleware/singleton":{"types":"./build/server/middleware/singleton.d.ts","default":"./build/server/middleware/singleton.js"},"./preload-route-assets":{"types":"./build/server/preload-route-assets.d.ts","default":"./build/server/preload-route-assets.js"},"./use-debounce-fetcher":{"types":"./build/react/use-debounce-fetcher.d.ts","default":"./build/react/use-debounce-fetcher.js"},"./get-client-ip-address":{"types":"./build/server/get-client-ip-address.d.ts","default":"./build/server/get-client-ip-address.js"},"./middleware/basic-auth":{"types":"./build/server/middleware/basic-auth.d.ts","default":"./build/server/middleware/basic-auth.js"},"./middleware/request-id":{"types":"./build/server/middleware/request-id.d.ts","default":"./build/server/middleware/request-id.js"},"./use-delegated-anchors":{"types":"./build/react/use-delegated-anchors.d.ts","default":"./build/react/use-delegated-anchors.js"},"./existing-search-params":{"types":"./build/react/existing-search-params.d.ts","default":"./build/react/existing-search-params.js"},"./middleware/server-timing":{"types":"./build/server/middleware/server-timing.d.ts","default":"./build/server/middleware/server-timing.js"},"./middleware/context-storage":{"types":"./build/server/middleware/context-storage.d.ts","default":"./build/server/middleware/context-storage.js"},"./use-global-navigation-state":{"types":"./build/react/use-global-navigation-state.d.ts","default":"./build/react/use-global-navigation-state.js"}},"funding":["https://github.com/sponsors/sergiodxa"],"gitHead":"1feaaf0b2c985b0591b0159777cd547cb43b96d7","scripts":{"build":"tsc","exports":"bun run ./scripts/exports.ts","quality":"biome check .","typecheck":"tsc --noEmit","quality:fix":"biome check . --write --unsafe"},"_npmUser":{"name":"sergiodxa","email":"hello@sergiodxa.com"},"repository":{"url":"git+https://github.com/sergiodxa/remix-utils.git","type":"git"},"_npmVersion":"10.9.2","description":"This package contains simple utility functions to use with [React Router](https://reactrouter.com/).","directories":{},"sideEffects":false,"_nodeVersion":"22.14.0","dependencies":{"type-fest":"^4.37.0"},"_hasShrinkwrap":false,"devDependencies":{"msw":"^2.7.3","zod":"^3.24.2","is-ip":"5.0.1","react":"^19.0.0","ts-node":"^10.9.1","typedoc":"^0.27.9","@types/bun":"^1.2.4","typescript":"^5.8.2","@types/react":"^19.0.10","react-router":"^7.3.0","@biomejs/biome":"^1.7.2","@oslojs/crypto":"^1.0.1","@oslojs/encoding":"^1.1.0","@arethetypeswrong/cli":"^0.17.4","@edgefirst-dev/batcher":"^1.0.1","@testing-library/react":"^16.2.0","typedoc-plugin-mdn-links":"^5.0.1","@testing-library/jest-dom":"^6.1.3","@total-typescript/tsconfig":"^1.0.4","intl-parse-accept-language":"^1.0.0","@testing-library/user-event":"^14.6.1","@edgefirst-dev/server-timing":"^0.0.1","@happy-dom/global-registrator":"^17.4.3"},"peerDependencies":{"zod":"^3.22.4","is-ip":"^5.0.1","react":"^18.0.0 || ^19.0.0","react-router":"^7.0.0","@oslojs/crypto":"^1.0.1","@oslojs/encoding":"^1.1.0","@edgefirst-dev/batcher":"^1.0.0","intl-parse-accept-language":"^1.0.0","@edgefirst-dev/server-timing":"^0.0.1"},"peerDependenciesMeta":{"zod":{"optional":true},"is-ip":{"optional":true},"react":{"optional":true},"react-router":{"optional":true},"@oslojs/crypto":{"optional":true},"@oslojs/encoding":{"optional":true},"@edgefirst-dev/batcher":{"optional":true},"intl-parse-accept-language":{"optional":true},"@edgefirst-dev/server-timing":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/remix-utils_8.4.0_1741880923378_0.6249566414107444","host":"s3://npm-registry-packages-npm-production"}},"8.4.1":{"name":"remix-utils","version":"8.4.1","keywords":["remix","remix.run","react","utils","request","response","csrf","redirect-back","client-only","hydrated","server-only","cors","rolling cookie","safe redirect","typed cookie","typed session","client IP address","client locale","json hash","prefetch","named action"],"author":{"url":"https://sergiodxa.com","name":"Sergio Xalambrí","email":"hello@sergiodxa.com"},"license":"MIT","_id":"remix-utils@8.4.1","maintainers":[{"name":"sergiodxa","email":"hello@sergiodxa.com"}],"homepage":"https://github.com/sergiodxa/remix-utils#readme","bugs":{"url":"https://github.com/sergiodxa/remix-utils/issues"},"dist":{"shasum":"2e31e574bff094225060a349fececaffe0b8790a","tarball":"https://registry.npmjs.org/remix-utils/-/remix-utils-8.4.1.tgz","fileCount":153,"integrity":"sha512-YwKmoPIsQ4UuwrLEQFZmnJb1kWKkAIrmdY4DWQPQ78XTqs7Z5qnkNmWm7vJxvdkB025YfMtrDSU9+iSRaod2+w==","signatures":[{"sig":"MEUCIQCm+JGTua7l8S1OKarfmYpxfv8HMehXWuiaWzp50oByzgIgDK6VQJTyzqN+uLGdTQp/7UBgKqCe+Qoey3VC0r0fJWc=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":317580},"type":"module","engines":{"node":">=20.0.0"},"exports":{"./cors":{"types":"./build/server/cors.d.ts","default":"./build/server/cors.js"},"./timers":{"types":"./build/common/timers.d.ts","default":"./build/common/timers.js"},"./promise":{"types":"./build/common/promise.d.ts","default":"./build/common/promise.js"},"./json-hash":{"types":"./build/server/json-hash.d.ts","default":"./build/server/json-hash.js"},"./responses":{"types":"./build/server/responses.d.ts","default":"./build/server/responses.js"},"./sec-fetch":{"types":"./build/server/sec-fetch.d.ts","default":"./build/server/sec-fetch.js"},"./sse/react":{"types":"./build/react/use-event-source.d.ts","default":"./build/react/use-event-source.js"},"./csrf/react":{"types":"./build/react/authenticity-token.d.ts","default":"./build/react/authenticity-token.js"},"./respond-to":{"types":"./build/server/respond-to.d.ts","default":"./build/server/respond-to.js"},"./sse/server":{"types":"./build/server/event-stream.d.ts","default":"./build/server/event-stream.js"},"./client-only":{"types":"./build/react/client-only.d.ts","default":"./build/react/client-only.js"},"./csrf/server":{"types":"./build/server/csrf.d.ts","default":"./build/server/csrf.js"},"./is-prefetch":{"types":"./build/server/is-prefetch.d.ts","default":"./build/server/is-prefetch.js"},"./server-only":{"types":"./build/react/server-only.d.ts","default":"./build/react/server-only.js"},"./cache-assets":{"types":"./build/client/cache-assets.d.ts","default":"./build/client/cache-assets.js"},"./fetcher-type":{"types":"./build/react/fetcher-type.d.ts","default":"./build/react/fetcher-type.js"},"./named-action":{"types":"./build/server/named-action.d.ts","default":"./build/server/named-action.js"},"./package.json":"./package.json","./typed-cookie":{"types":"./build/server/typed-cookie.d.ts","default":"./build/server/typed-cookie.js"},"./use-hydrated":{"types":"./build/react/use-hydrated.d.ts","default":"./build/react/use-hydrated.js"},"./locales/react":{"types":"./build/react/use-locales.d.ts","default":"./build/react/use-locales.js"},"./redirect-back":{"types":"./build/server/redirect-back.d.ts","default":"./build/server/redirect-back.js"},"./safe-redirect":{"types":"./build/server/safe-redirect.d.ts","default":"./build/server/safe-redirect.js"},"./typed-session":{"types":"./build/server/typed-session.d.ts","default":"./build/server/typed-session.js"},"./honeypot/react":{"types":"./build/react/honeypot.d.ts","default":"./build/react/honeypot.js"},"./locales/server":{"types":"./build/server/get-client-locales.d.ts","default":"./build/server/get-client-locales.js"},"./rolling-cookie":{"types":"./build/server/rolling-cookie.d.ts","default":"./build/server/rolling-cookie.js"},"./honeypot/server":{"types":"./build/server/honeypot.d.ts","default":"./build/server/honeypot.js"},"./external-scripts":{"types":"./build/react/external-scripts.d.ts","default":"./build/react/external-scripts.js"},"./middleware/logger":{"types":"./build/server/middleware/logger.d.ts","default":"./build/server/middleware/logger.js"},"./middleware/batcher":{"types":"./build/server/middleware/batcher.d.ts","default":"./build/server/middleware/batcher.js"},"./middleware/session":{"types":"./build/server/middleware/session.d.ts","default":"./build/server/middleware/session.js"},"./use-should-hydrate":{"types":"./build/react/use-should-hydrate.d.ts","default":"./build/react/use-should-hydrate.js"},"./parse-accept-header":{"types":"./build/server/parse-accept-header.d.ts","default":"./build/server/parse-accept-header.js"},"./use-debounce-submit":{"types":"./build/react/use-debounce-submit.d.ts","default":"./build/react/use-debounce-submit.js"},"./middleware/singleton":{"types":"./build/server/middleware/singleton.d.ts","default":"./build/server/middleware/singleton.js"},"./preload-route-assets":{"types":"./build/server/preload-route-assets.d.ts","default":"./build/server/preload-route-assets.js"},"./use-debounce-fetcher":{"types":"./build/react/use-debounce-fetcher.d.ts","default":"./build/react/use-debounce-fetcher.js"},"./get-client-ip-address":{"types":"./build/server/get-client-ip-address.d.ts","default":"./build/server/get-client-ip-address.js"},"./middleware/basic-auth":{"types":"./build/server/middleware/basic-auth.d.ts","default":"./build/server/middleware/basic-auth.js"},"./middleware/request-id":{"types":"./build/server/middleware/request-id.d.ts","default":"./build/server/middleware/request-id.js"},"./use-delegated-anchors":{"types":"./build/react/use-delegated-anchors.d.ts","default":"./build/react/use-delegated-anchors.js"},"./existing-search-params":{"types":"./build/react/existing-search-params.d.ts","default":"./build/react/existing-search-params.js"},"./middleware/server-timing":{"types":"./build/server/middleware/server-timing.d.ts","default":"./build/server/middleware/server-timing.js"},"./middleware/context-storage":{"types":"./build/server/middleware/context-storage.d.ts","default":"./build/server/middleware/context-storage.js"},"./use-global-navigation-state":{"types":"./build/react/use-global-navigation-state.d.ts","default":"./build/react/use-global-navigation-state.js"}},"funding":["https://github.com/sponsors/sergiodxa"],"gitHead":"30a7ad0f371a7958634cca475db474b4a9b743ea","scripts":{"build":"tsc","exports":"bun run ./scripts/exports.ts","quality":"biome check .","typecheck":"tsc --noEmit","quality:fix":"biome check . --write --unsafe"},"_npmUser":{"name":"sergiodxa","email":"hello@sergiodxa.com"},"repository":{"url":"git+https://github.com/sergiodxa/remix-utils.git","type":"git"},"_npmVersion":"10.9.2","description":"This package contains simple utility functions to use with [React Router](https://reactrouter.com/).","directories":{},"sideEffects":false,"_nodeVersion":"22.14.0","dependencies":{"type-fest":"^4.37.0"},"_hasShrinkwrap":false,"devDependencies":{"msw":"^2.7.3","zod":"^3.24.2","is-ip":"5.0.1","react":"^19.0.0","ts-node":"^10.9.1","typedoc":"^0.27.9","@types/bun":"^1.2.4","typescript":"^5.8.2","@types/react":"^19.0.10","react-router":"^7.3.0","@biomejs/biome":"^1.7.2","@oslojs/crypto":"^1.0.1","@oslojs/encoding":"^1.1.0","@arethetypeswrong/cli":"^0.17.4","@edgefirst-dev/batcher":"^1.0.1","@testing-library/react":"^16.2.0","typedoc-plugin-mdn-links":"^5.0.1","@testing-library/jest-dom":"^6.1.3","@total-typescript/tsconfig":"^1.0.4","intl-parse-accept-language":"^1.0.0","@testing-library/user-event":"^14.6.1","@edgefirst-dev/server-timing":"^0.0.1","@happy-dom/global-registrator":"^17.4.3"},"peerDependencies":{"zod":"^3.22.4","is-ip":"^5.0.1","react":"^18.0.0 || ^19.0.0","react-router":"^7.0.0","@oslojs/crypto":"^1.0.1","@oslojs/encoding":"^1.1.0","@edgefirst-dev/batcher":"^1.0.0","intl-parse-accept-language":"^1.0.0","@edgefirst-dev/server-timing":"^0.0.1"},"peerDependenciesMeta":{"zod":{"optional":true},"is-ip":{"optional":true},"react":{"optional":true},"react-router":{"optional":true},"@oslojs/crypto":{"optional":true},"@oslojs/encoding":{"optional":true},"@edgefirst-dev/batcher":{"optional":true},"intl-parse-accept-language":{"optional":true},"@edgefirst-dev/server-timing":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/remix-utils_8.4.1_1742236500445_0.17507498825856205","host":"s3://npm-registry-packages-npm-production"}},"8.5.0":{"name":"remix-utils","version":"8.5.0","keywords":["remix","remix.run","react","utils","request","response","csrf","redirect-back","client-only","hydrated","server-only","cors","rolling cookie","safe redirect","typed cookie","typed session","client IP address","client locale","json hash","prefetch","named action"],"author":{"url":"https://sergiodxa.com","name":"Sergio Xalambrí","email":"hello@sergiodxa.com"},"license":"MIT","_id":"remix-utils@8.5.0","maintainers":[{"name":"sergiodxa","email":"hello@sergiodxa.com"}],"homepage":"https://github.com/sergiodxa/remix-utils#readme","bugs":{"url":"https://github.com/sergiodxa/remix-utils/issues"},"dist":{"shasum":"33eebd7bee4dc87404e5fea7d3d7114d14525ce3","tarball":"https://registry.npmjs.org/remix-utils/-/remix-utils-8.5.0.tgz","fileCount":156,"integrity":"sha512-Wf9OGSJveBaVHKptbEgxc+DwKRUUGOH+aiaBlsrAA2b4F+gNtCkvaZzA7Tp+1esBElRcRvMZQq/0aSSWFMP18A==","signatures":[{"sig":"MEUCIQC7EP3YIbNZrHHnAx6fhC1229Gqbfs1eO/kgnvmYSTOBwIgCyw7y6Sd4L6Drm7g5TA/eYdGEmJVPq2JJami+luS+Ps=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":330081},"type":"module","engines":{"node":">=20.0.0"},"exports":{"./cors":{"types":"./build/server/cors.d.ts","default":"./build/server/cors.js"},"./timers":{"types":"./build/common/timers.d.ts","default":"./build/common/timers.js"},"./promise":{"types":"./build/common/promise.d.ts","default":"./build/common/promise.js"},"./json-hash":{"types":"./build/server/json-hash.d.ts","default":"./build/server/json-hash.js"},"./responses":{"types":"./build/server/responses.d.ts","default":"./build/server/responses.js"},"./sec-fetch":{"types":"./build/server/sec-fetch.d.ts","default":"./build/server/sec-fetch.js"},"./sse/react":{"types":"./build/react/use-event-source.d.ts","default":"./build/react/use-event-source.js"},"./csrf/react":{"types":"./build/react/authenticity-token.d.ts","default":"./build/react/authenticity-token.js"},"./respond-to":{"types":"./build/server/respond-to.d.ts","default":"./build/server/respond-to.js"},"./sse/server":{"types":"./build/server/event-stream.d.ts","default":"./build/server/event-stream.js"},"./client-only":{"types":"./build/react/client-only.d.ts","default":"./build/react/client-only.js"},"./csrf/server":{"types":"./build/server/csrf.d.ts","default":"./build/server/csrf.js"},"./is-prefetch":{"types":"./build/server/is-prefetch.d.ts","default":"./build/server/is-prefetch.js"},"./server-only":{"types":"./build/react/server-only.d.ts","default":"./build/react/server-only.js"},"./cache-assets":{"types":"./build/client/cache-assets.d.ts","default":"./build/client/cache-assets.js"},"./fetcher-type":{"types":"./build/react/fetcher-type.d.ts","default":"./build/react/fetcher-type.js"},"./named-action":{"types":"./build/server/named-action.d.ts","default":"./build/server/named-action.js"},"./package.json":"./package.json","./typed-cookie":{"types":"./build/server/typed-cookie.d.ts","default":"./build/server/typed-cookie.js"},"./use-hydrated":{"types":"./build/react/use-hydrated.d.ts","default":"./build/react/use-hydrated.js"},"./locales/react":{"types":"./build/react/use-locales.d.ts","default":"./build/react/use-locales.js"},"./redirect-back":{"types":"./build/server/redirect-back.d.ts","default":"./build/server/redirect-back.js"},"./safe-redirect":{"types":"./build/server/safe-redirect.d.ts","default":"./build/server/safe-redirect.js"},"./typed-session":{"types":"./build/server/typed-session.d.ts","default":"./build/server/typed-session.js"},"./honeypot/react":{"types":"./build/react/honeypot.d.ts","default":"./build/react/honeypot.js"},"./locales/server":{"types":"./build/server/get-client-locales.d.ts","default":"./build/server/get-client-locales.js"},"./rolling-cookie":{"types":"./build/server/rolling-cookie.d.ts","default":"./build/server/rolling-cookie.js"},"./honeypot/server":{"types":"./build/server/honeypot.d.ts","default":"./build/server/honeypot.js"},"./external-scripts":{"types":"./build/react/external-scripts.d.ts","default":"./build/react/external-scripts.js"},"./middleware/logger":{"types":"./build/server/middleware/logger.d.ts","default":"./build/server/middleware/logger.js"},"./middleware/batcher":{"types":"./build/server/middleware/batcher.d.ts","default":"./build/server/middleware/batcher.js"},"./middleware/session":{"types":"./build/server/middleware/session.d.ts","default":"./build/server/middleware/session.js"},"./use-should-hydrate":{"types":"./build/react/use-should-hydrate.d.ts","default":"./build/react/use-should-hydrate.js"},"./middleware/jwk-auth":{"types":"./build/server/middleware/jwk-auth.d.ts","default":"./build/server/middleware/jwk-auth.js"},"./parse-accept-header":{"types":"./build/server/parse-accept-header.d.ts","default":"./build/server/parse-accept-header.js"},"./use-debounce-submit":{"types":"./build/react/use-debounce-submit.d.ts","default":"./build/react/use-debounce-submit.js"},"./middleware/singleton":{"types":"./build/server/middleware/singleton.d.ts","default":"./build/server/middleware/singleton.js"},"./preload-route-assets":{"types":"./build/server/preload-route-assets.d.ts","default":"./build/server/preload-route-assets.js"},"./use-debounce-fetcher":{"types":"./build/react/use-debounce-fetcher.d.ts","default":"./build/react/use-debounce-fetcher.js"},"./get-client-ip-address":{"types":"./build/server/get-client-ip-address.d.ts","default":"./build/server/get-client-ip-address.js"},"./middleware/basic-auth":{"types":"./build/server/middleware/basic-auth.d.ts","default":"./build/server/middleware/basic-auth.js"},"./middleware/request-id":{"types":"./build/server/middleware/request-id.d.ts","default":"./build/server/middleware/request-id.js"},"./use-delegated-anchors":{"types":"./build/react/use-delegated-anchors.d.ts","default":"./build/react/use-delegated-anchors.js"},"./existing-search-params":{"types":"./build/react/existing-search-params.d.ts","default":"./build/react/existing-search-params.js"},"./middleware/server-timing":{"types":"./build/server/middleware/server-timing.d.ts","default":"./build/server/middleware/server-timing.js"},"./middleware/context-storage":{"types":"./build/server/middleware/context-storage.d.ts","default":"./build/server/middleware/context-storage.js"},"./use-global-navigation-state":{"types":"./build/react/use-global-navigation-state.d.ts","default":"./build/react/use-global-navigation-state.js"}},"funding":["https://github.com/sponsors/sergiodxa"],"gitHead":"a520263ea9cd57170e72eeb6b5e3e4d76a64d6ce","scripts":{"build":"tsc","exports":"bun run ./scripts/exports.ts","quality":"biome check .","typecheck":"tsc --noEmit","quality:fix":"biome check . --write --unsafe"},"_npmUser":{"name":"sergiodxa","email":"hello@sergiodxa.com"},"repository":{"url":"git+https://github.com/sergiodxa/remix-utils.git","type":"git"},"_npmVersion":"10.9.2","description":"This package contains simple utility functions to use with [React Router](https://reactrouter.com/).","directories":{},"sideEffects":false,"_nodeVersion":"22.14.0","dependencies":{"type-fest":"^4.37.0"},"_hasShrinkwrap":false,"devDependencies":{"msw":"^2.7.3","zod":"^3.24.2","is-ip":"5.0.1","react":"^19.0.0","ts-node":"^10.9.1","typedoc":"^0.27.9","@types/bun":"^1.2.4","typescript":"^5.8.2","@types/react":"^19.0.10","react-router":"^7.3.0","@biomejs/biome":"^1.7.2","@oslojs/crypto":"^1.0.1","@oslojs/encoding":"^1.1.0","@edgefirst-dev/jwt":"^1.2.0","@arethetypeswrong/cli":"^0.17.4","@edgefirst-dev/batcher":"^1.0.1","@mjackson/file-storage":"^0.6.1","@testing-library/react":"^16.2.0","typedoc-plugin-mdn-links":"^5.0.1","@testing-library/jest-dom":"^6.1.3","@total-typescript/tsconfig":"^1.0.4","intl-parse-accept-language":"^1.0.0","@testing-library/user-event":"^14.6.1","@edgefirst-dev/server-timing":"^0.0.1","@happy-dom/global-registrator":"^17.4.3"},"peerDependencies":{"zod":"^3.22.4","is-ip":"^5.0.1","react":"^18.0.0 || ^19.0.0","react-router":"^7.0.0","@oslojs/crypto":"^1.0.1","@oslojs/encoding":"^1.1.0","@edgefirst-dev/jwt":"^1.2.0","@edgefirst-dev/batcher":"^1.0.0","intl-parse-accept-language":"^1.0.0","@edgefirst-dev/server-timing":"^0.0.1"},"peerDependenciesMeta":{"zod":{"optional":true},"is-ip":{"optional":true},"react":{"optional":true},"react-router":{"optional":true},"@oslojs/crypto":{"optional":true},"@oslojs/encoding":{"optional":true},"@edgefirst-dev/jwt":{"optional":true},"@edgefirst-dev/batcher":{"optional":true},"intl-parse-accept-language":{"optional":true},"@edgefirst-dev/server-timing":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/remix-utils_8.5.0_1742273200544_0.2223967737651169","host":"s3://npm-registry-packages-npm-production"}},"8.6.0":{"name":"remix-utils","version":"8.6.0","keywords":["remix","remix.run","react","utils","request","response","csrf","redirect-back","client-only","hydrated","server-only","cors","rolling cookie","safe redirect","typed cookie","typed session","client IP address","client locale","json hash","prefetch","named action"],"author":{"url":"https://sergiodxa.com","name":"Sergio Xalambrí","email":"hello@sergiodxa.com"},"license":"MIT","_id":"remix-utils@8.6.0","maintainers":[{"name":"sergiodxa","email":"hello@sergiodxa.com"}],"homepage":"https://github.com/sergiodxa/remix-utils#readme","bugs":{"url":"https://github.com/sergiodxa/remix-utils/issues"},"dist":{"shasum":"c2d6ff3592a081f43aed93d2a36690be31917a55","tarball":"https://registry.npmjs.org/remix-utils/-/remix-utils-8.6.0.tgz","fileCount":165,"integrity":"sha512-FFJVQOaOEoqJliAKfA8a5jdh35CicXjT8yAOguH84ZfOLyCPJDi6yWmvickPs/jygLGPRDGe0S8mu+X6aLcb5w==","signatures":[{"sig":"MEUCIQCRj1L/9tA46w+5kvDra+40N0TLLLEYc8IzqE/oWN9wMwIgJZo7RPYQ6+jb7otmZsmu1BMsMDebiptSUhMuQr4a/as=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":362212},"type":"module","engines":{"node":">=20.0.0"},"exports":{"./cors":{"types":"./build/server/cors.d.ts","default":"./build/server/cors.js"},"./timers":{"types":"./build/common/timers.d.ts","default":"./build/common/timers.js"},"./promise":{"types":"./build/common/promise.d.ts","default":"./build/common/promise.js"},"./json-hash":{"types":"./build/server/json-hash.d.ts","default":"./build/server/json-hash.js"},"./responses":{"types":"./build/server/responses.d.ts","default":"./build/server/responses.js"},"./sec-fetch":{"types":"./build/server/sec-fetch.d.ts","default":"./build/server/sec-fetch.js"},"./sse/react":{"types":"./build/react/use-event-source.d.ts","default":"./build/react/use-event-source.js"},"./csrf/react":{"types":"./build/react/authenticity-token.d.ts","default":"./build/react/authenticity-token.js"},"./respond-to":{"types":"./build/server/respond-to.d.ts","default":"./build/server/respond-to.js"},"./sse/server":{"types":"./build/server/event-stream.d.ts","default":"./build/server/event-stream.js"},"./client-only":{"types":"./build/react/client-only.d.ts","default":"./build/react/client-only.js"},"./csrf/server":{"types":"./build/server/csrf.d.ts","default":"./build/server/csrf.js"},"./is-prefetch":{"types":"./build/server/is-prefetch.d.ts","default":"./build/server/is-prefetch.js"},"./server-only":{"types":"./build/react/server-only.d.ts","default":"./build/react/server-only.js"},"./cache-assets":{"types":"./build/client/cache-assets.d.ts","default":"./build/client/cache-assets.js"},"./fetcher-type":{"types":"./build/react/fetcher-type.d.ts","default":"./build/react/fetcher-type.js"},"./named-action":{"types":"./build/server/named-action.d.ts","default":"./build/server/named-action.js"},"./package.json":"./package.json","./typed-cookie":{"types":"./build/server/typed-cookie.d.ts","default":"./build/server/typed-cookie.js"},"./use-hydrated":{"types":"./build/react/use-hydrated.d.ts","default":"./build/react/use-hydrated.js"},"./locales/react":{"types":"./build/react/use-locales.d.ts","default":"./build/react/use-locales.js"},"./redirect-back":{"types":"./build/server/redirect-back.d.ts","default":"./build/server/redirect-back.js"},"./safe-redirect":{"types":"./build/server/safe-redirect.d.ts","default":"./build/server/safe-redirect.js"},"./typed-session":{"types":"./build/server/typed-session.d.ts","default":"./build/server/typed-session.js"},"./honeypot/react":{"types":"./build/react/honeypot.d.ts","default":"./build/react/honeypot.js"},"./locales/server":{"types":"./build/server/get-client-locales.d.ts","default":"./build/server/get-client-locales.js"},"./rolling-cookie":{"types":"./build/server/rolling-cookie.d.ts","default":"./build/server/rolling-cookie.js"},"./honeypot/server":{"types":"./build/server/honeypot.d.ts","default":"./build/server/honeypot.js"},"./external-scripts":{"types":"./build/react/external-scripts.d.ts","default":"./build/react/external-scripts.js"},"./middleware/logger":{"types":"./build/server/middleware/logger.d.ts","default":"./build/server/middleware/logger.js"},"./middleware/batcher":{"types":"./build/server/middleware/batcher.d.ts","default":"./build/server/middleware/batcher.js"},"./middleware/session":{"types":"./build/server/middleware/session.d.ts","default":"./build/server/middleware/session.js"},"./use-should-hydrate":{"types":"./build/react/use-should-hydrate.d.ts","default":"./build/react/use-should-hydrate.js"},"./middleware/jwk-auth":{"types":"./build/server/middleware/jwk-auth.d.ts","default":"./build/server/middleware/jwk-auth.js"},"./parse-accept-header":{"types":"./build/server/parse-accept-header.d.ts","default":"./build/server/parse-accept-header.js"},"./use-debounce-submit":{"types":"./build/react/use-debounce-submit.d.ts","default":"./build/react/use-debounce-submit.js"},"./middleware/singleton":{"types":"./build/server/middleware/singleton.d.ts","default":"./build/server/middleware/singleton.js"},"./preload-route-assets":{"types":"./build/server/preload-route-assets.d.ts","default":"./build/server/preload-route-assets.js"},"./use-debounce-fetcher":{"types":"./build/react/use-debounce-fetcher.d.ts","default":"./build/react/use-debounce-fetcher.js"},"./get-client-ip-address":{"types":"./build/server/get-client-ip-address.d.ts","default":"./build/server/get-client-ip-address.js"},"./middleware/basic-auth":{"types":"./build/server/middleware/basic-auth.d.ts","default":"./build/server/middleware/basic-auth.js"},"./middleware/request-id":{"types":"./build/server/middleware/request-id.d.ts","default":"./build/server/middleware/request-id.js"},"./use-delegated-anchors":{"types":"./build/react/use-delegated-anchors.d.ts","default":"./build/react/use-delegated-anchors.js"},"./existing-search-params":{"types":"./build/react/existing-search-params.d.ts","default":"./build/react/existing-search-params.js"},"./middleware/server-timing":{"types":"./build/server/middleware/server-timing.d.ts","default":"./build/server/middleware/server-timing.js"},"./middleware/secure-headers":{"types":"./build/server/middleware/secure-headers.d.ts","default":"./build/server/middleware/secure-headers.js"},"./middleware/context-storage":{"types":"./build/server/middleware/context-storage.d.ts","default":"./build/server/middleware/context-storage.js"},"./use-global-navigation-state":{"types":"./build/react/use-global-navigation-state.d.ts","default":"./build/react/use-global-navigation-state.js"}},"funding":["https://github.com/sponsors/sergiodxa"],"gitHead":"84e253f160fb7731439b0cba52b02349db487f28","scripts":{"build":"tsc","exports":"bun run ./scripts/exports.ts","quality":"biome check .","typecheck":"tsc --noEmit","quality:fix":"biome check . --write --unsafe"},"_npmUser":{"name":"sergiodxa","email":"hello@sergiodxa.com"},"repository":{"url":"git+https://github.com/sergiodxa/remix-utils.git","type":"git"},"_npmVersion":"10.9.2","description":"This package contains simple utility functions to use with [React Router](https://reactrouter.com/).","directories":{},"sideEffects":false,"_nodeVersion":"22.15.0","dependencies":{"type-fest":"^4.37.0"},"_hasShrinkwrap":false,"devDependencies":{"msw":"^2.7.3","zod":"^3.24.2","is-ip":"5.0.1","react":"^19.0.0","ts-node":"^10.9.1","typedoc":"^0.27.9","@types/bun":"^1.2.5","typescript":"^5.8.2","@types/react":"^19.0.10","react-router":"^7.3.0","@biomejs/biome":"^1.7.2","@oslojs/crypto":"^1.0.1","@oslojs/encoding":"^1.1.0","@edgefirst-dev/jwt":"^1.2.0","@arethetypeswrong/cli":"^0.17.4","@edgefirst-dev/batcher":"^1.0.1","@mjackson/file-storage":"^0.6.1","@testing-library/react":"^16.2.0","typedoc-plugin-mdn-links":"^5.0.1","@testing-library/jest-dom":"^6.1.3","@total-typescript/tsconfig":"^1.0.4","intl-parse-accept-language":"^1.0.0","@testing-library/user-event":"^14.6.1","@edgefirst-dev/server-timing":"^0.0.1","@happy-dom/global-registrator":"^17.4.3"},"peerDependencies":{"zod":"^3.22.4","is-ip":"^5.0.1","react":"^18.0.0 || ^19.0.0","react-router":"^7.0.0","@oslojs/crypto":"^1.0.1","@oslojs/encoding":"^1.1.0","@edgefirst-dev/jwt":"^1.2.0","@edgefirst-dev/batcher":"^1.0.0","intl-parse-accept-language":"^1.0.0","@edgefirst-dev/server-timing":"^0.0.1"},"peerDependenciesMeta":{"zod":{"optional":true},"is-ip":{"optional":true},"react":{"optional":true},"react-router":{"optional":true},"@oslojs/crypto":{"optional":true},"@oslojs/encoding":{"optional":true},"@edgefirst-dev/jwt":{"optional":true},"@edgefirst-dev/batcher":{"optional":true},"intl-parse-accept-language":{"optional":true},"@edgefirst-dev/server-timing":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/remix-utils_8.6.0_1746840260775_0.8587962525137804","host":"s3://npm-registry-packages-npm-production"}},"8.7.0":{"name":"remix-utils","version":"8.7.0","keywords":["remix","remix.run","react","utils","request","response","csrf","redirect-back","client-only","hydrated","server-only","cors","rolling cookie","safe redirect","typed cookie","typed session","client IP address","client locale","json hash","prefetch","named action"],"author":{"url":"https://sergiodxa.com","name":"Sergio Xalambrí","email":"hello@sergiodxa.com"},"license":"MIT","_id":"remix-utils@8.7.0","maintainers":[{"name":"sergiodxa","email":"hello@sergiodxa.com"}],"homepage":"https://github.com/sergiodxa/remix-utils#readme","bugs":{"url":"https://github.com/sergiodxa/remix-utils/issues"},"dist":{"shasum":"ca904c05ba36ec382854c9d4897c58013aa62b5f","tarball":"https://registry.npmjs.org/remix-utils/-/remix-utils-8.7.0.tgz","fileCount":171,"integrity":"sha512-oRumofsYFaxHyPtqLuYe3g2nQi4SMYjCoebaeed0gYHIOKBiPPYdNP6cgmQbFjQQ5pwXV+uQiKLqO6pM9ep3VA==","signatures":[{"sig":"MEYCIQCxgnsvsXiuuVVi5WKx4RkLpRSzdLNYtvDwzFny5YIZtwIhAI8tTvUwWfE/H9PnaLE0JLr18tVVbX35zXvKXKbu76iM","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":417890},"type":"module","engines":{"node":">=20.0.0"},"exports":{"./cors":{"types":"./build/server/cors.d.ts","default":"./build/server/cors.js"},"./timers":{"types":"./build/common/timers.d.ts","default":"./build/common/timers.js"},"./promise":{"types":"./build/common/promise.d.ts","default":"./build/common/promise.js"},"./json-hash":{"types":"./build/server/json-hash.d.ts","default":"./build/server/json-hash.js"},"./responses":{"types":"./build/server/responses.d.ts","default":"./build/server/responses.js"},"./sec-fetch":{"types":"./build/server/sec-fetch.d.ts","default":"./build/server/sec-fetch.js"},"./sse/react":{"types":"./build/react/use-event-source.d.ts","default":"./build/react/use-event-source.js"},"./csrf/react":{"types":"./build/react/authenticity-token.d.ts","default":"./build/react/authenticity-token.js"},"./respond-to":{"types":"./build/server/respond-to.d.ts","default":"./build/server/respond-to.js"},"./sse/server":{"types":"./build/server/event-stream.d.ts","default":"./build/server/event-stream.js"},"./client-only":{"types":"./build/react/client-only.d.ts","default":"./build/react/client-only.js"},"./csrf/server":{"types":"./build/server/csrf.d.ts","default":"./build/server/csrf.js"},"./is-prefetch":{"types":"./build/server/is-prefetch.d.ts","default":"./build/server/is-prefetch.js"},"./server-only":{"types":"./build/react/server-only.d.ts","default":"./build/react/server-only.js"},"./cache-assets":{"types":"./build/client/cache-assets.d.ts","default":"./build/client/cache-assets.js"},"./fetcher-type":{"types":"./build/react/fetcher-type.d.ts","default":"./build/react/fetcher-type.js"},"./named-action":{"types":"./build/server/named-action.d.ts","default":"./build/server/named-action.js"},"./package.json":"./package.json","./typed-cookie":{"types":"./build/server/typed-cookie.d.ts","default":"./build/server/typed-cookie.js"},"./use-hydrated":{"types":"./build/react/use-hydrated.d.ts","default":"./build/react/use-hydrated.js"},"./locales/react":{"types":"./build/react/use-locales.d.ts","default":"./build/react/use-locales.js"},"./redirect-back":{"types":"./build/server/redirect-back.d.ts","default":"./build/server/redirect-back.js"},"./safe-redirect":{"types":"./build/server/safe-redirect.d.ts","default":"./build/server/safe-redirect.js"},"./typed-session":{"types":"./build/server/typed-session.d.ts","default":"./build/server/typed-session.js"},"./honeypot/react":{"types":"./build/react/honeypot.d.ts","default":"./build/react/honeypot.js"},"./locales/server":{"types":"./build/server/get-client-locales.d.ts","default":"./build/server/get-client-locales.js"},"./rolling-cookie":{"types":"./build/server/rolling-cookie.d.ts","default":"./build/server/rolling-cookie.js"},"./honeypot/server":{"types":"./build/server/honeypot.d.ts","default":"./build/server/honeypot.js"},"./middleware/cors":{"types":"./build/server/middleware/cors.d.ts","default":"./build/server/middleware/cors.js"},"./external-scripts":{"types":"./build/react/external-scripts.d.ts","default":"./build/react/external-scripts.js"},"./middleware/logger":{"types":"./build/server/middleware/logger.d.ts","default":"./build/server/middleware/logger.js"},"./middleware/batcher":{"types":"./build/server/middleware/batcher.d.ts","default":"./build/server/middleware/batcher.js"},"./middleware/session":{"types":"./build/server/middleware/session.d.ts","default":"./build/server/middleware/session.js"},"./use-should-hydrate":{"types":"./build/react/use-should-hydrate.d.ts","default":"./build/react/use-should-hydrate.js"},"./middleware/honeypot":{"types":"./build/server/middleware/honeypot.d.ts","default":"./build/server/middleware/honeypot.js"},"./middleware/jwk-auth":{"types":"./build/server/middleware/jwk-auth.d.ts","default":"./build/server/middleware/jwk-auth.js"},"./parse-accept-header":{"types":"./build/server/parse-accept-header.d.ts","default":"./build/server/parse-accept-header.js"},"./use-debounce-submit":{"types":"./build/react/use-debounce-submit.d.ts","default":"./build/react/use-debounce-submit.js"},"./middleware/singleton":{"types":"./build/server/middleware/singleton.d.ts","default":"./build/server/middleware/singleton.js"},"./preload-route-assets":{"types":"./build/server/preload-route-assets.d.ts","default":"./build/server/preload-route-assets.js"},"./use-debounce-fetcher":{"types":"./build/react/use-debounce-fetcher.d.ts","default":"./build/react/use-debounce-fetcher.js"},"./get-client-ip-address":{"types":"./build/server/get-client-ip-address.d.ts","default":"./build/server/get-client-ip-address.js"},"./middleware/basic-auth":{"types":"./build/server/middleware/basic-auth.d.ts","default":"./build/server/middleware/basic-auth.js"},"./middleware/request-id":{"types":"./build/server/middleware/request-id.d.ts","default":"./build/server/middleware/request-id.js"},"./use-delegated-anchors":{"types":"./build/react/use-delegated-anchors.d.ts","default":"./build/react/use-delegated-anchors.js"},"./existing-search-params":{"types":"./build/react/existing-search-params.d.ts","default":"./build/react/existing-search-params.js"},"./middleware/server-timing":{"types":"./build/server/middleware/server-timing.d.ts","default":"./build/server/middleware/server-timing.js"},"./middleware/rolling-cookie":{"types":"./build/server/middleware/rolling-cookie.d.ts","default":"./build/server/middleware/rolling-cookie.js"},"./middleware/secure-headers":{"types":"./build/server/middleware/secure-headers.d.ts","default":"./build/server/middleware/secure-headers.js"},"./middleware/context-storage":{"types":"./build/server/middleware/context-storage.d.ts","default":"./build/server/middleware/context-storage.js"},"./use-global-navigation-state":{"types":"./build/react/use-global-navigation-state.d.ts","default":"./build/react/use-global-navigation-state.js"}},"funding":["https://github.com/sponsors/sergiodxa"],"gitHead":"05f736072521b5f875272dd0e013088a7196a4a2","scripts":{"build":"tsc","exports":"bun run ./scripts/exports.ts","quality":"biome check .","typecheck":"tsc --noEmit","quality:fix":"biome check . --write --unsafe"},"_npmUser":{"name":"sergiodxa","email":"hello@sergiodxa.com"},"repository":{"url":"git+https://github.com/sergiodxa/remix-utils.git","type":"git"},"_npmVersion":"10.9.2","description":"This package contains simple utility functions to use with [React Router](https://reactrouter.com/).","directories":{},"sideEffects":false,"_nodeVersion":"22.15.0","dependencies":{"type-fest":"^4.37.0"},"_hasShrinkwrap":false,"devDependencies":{"msw":"^2.7.3","zod":"^3.24.2","is-ip":"5.0.1","react":"^19.0.0","ts-node":"^10.9.1","typedoc":"^0.27.9","@types/bun":"^1.2.5","typescript":"^5.8.2","@types/react":"^19.0.10","react-router":"^7.3.0","@biomejs/biome":"^1.7.2","@oslojs/crypto":"^1.0.1","@oslojs/encoding":"^1.1.0","@edgefirst-dev/jwt":"^1.2.0","@arethetypeswrong/cli":"^0.17.4","@edgefirst-dev/batcher":"^1.0.1","@mjackson/file-storage":"^0.6.1","@testing-library/react":"^16.2.0","typedoc-plugin-mdn-links":"^5.0.1","@testing-library/jest-dom":"^6.1.3","@total-typescript/tsconfig":"^1.0.4","intl-parse-accept-language":"^1.0.0","@testing-library/user-event":"^14.6.1","@edgefirst-dev/server-timing":"^0.0.1","@happy-dom/global-registrator":"^17.4.3"},"peerDependencies":{"zod":"^3.22.4","is-ip":"^5.0.1","react":"^18.0.0 || ^19.0.0","react-router":"^7.0.0","@oslojs/crypto":"^1.0.1","@oslojs/encoding":"^1.1.0","@edgefirst-dev/jwt":"^1.2.0","@edgefirst-dev/batcher":"^1.0.0","intl-parse-accept-language":"^1.0.0","@edgefirst-dev/server-timing":"^0.0.1"},"peerDependenciesMeta":{"zod":{"optional":true},"is-ip":{"optional":true},"react":{"optional":true},"react-router":{"optional":true},"@oslojs/crypto":{"optional":true},"@oslojs/encoding":{"optional":true},"@edgefirst-dev/jwt":{"optional":true},"@edgefirst-dev/batcher":{"optional":true},"intl-parse-accept-language":{"optional":true},"@edgefirst-dev/server-timing":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/remix-utils_8.7.0_1746853345608_0.9017640767073416","host":"s3://npm-registry-packages-npm-production"}},"8.8.0":{"name":"remix-utils","version":"8.8.0","keywords":["remix","remix.run","react","utils","request","response","csrf","redirect-back","client-only","hydrated","server-only","cors","rolling cookie","safe redirect","typed cookie","typed session","client IP address","client locale","json hash","prefetch","named action"],"author":{"url":"https://sergiodxa.com","name":"Sergio Xalambrí","email":"hello@sergiodxa.com"},"license":"MIT","_id":"remix-utils@8.8.0","maintainers":[{"name":"sergiodxa","email":"hello@sergiodxa.com"}],"homepage":"https://github.com/sergiodxa/remix-utils#readme","bugs":{"url":"https://github.com/sergiodxa/remix-utils/issues"},"dist":{"shasum":"13d7abb3e60a90f175179b515029d9e2d68c39b7","tarball":"https://registry.npmjs.org/remix-utils/-/remix-utils-8.8.0.tgz","fileCount":171,"integrity":"sha512-5CR4a3YwPaCoPUHg+O69UMek05tnFMrtQsoXTU4KzsyU7heDO94IFTjKVzEFhi+s+SSo+ebRMxWvjf/QiPpqiQ==","signatures":[{"sig":"MEYCIQCyh3u0K9R/zBDGfCilVUbqYmKLsHf/xdWx9nExwlllawIhALbvOH6PUfFzq1jiM/IyshkemUJHMeomn+TCys/vjWVK","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":421692},"type":"module","engines":{"node":">=20.0.0"},"exports":{"./cors":{"types":"./build/server/cors.d.ts","default":"./build/server/cors.js"},"./timers":{"types":"./build/common/timers.d.ts","default":"./build/common/timers.js"},"./promise":{"types":"./build/common/promise.d.ts","default":"./build/common/promise.js"},"./json-hash":{"types":"./build/server/json-hash.d.ts","default":"./build/server/json-hash.js"},"./responses":{"types":"./build/server/responses.d.ts","default":"./build/server/responses.js"},"./sec-fetch":{"types":"./build/server/sec-fetch.d.ts","default":"./build/server/sec-fetch.js"},"./sse/react":{"types":"./build/react/use-event-source.d.ts","default":"./build/react/use-event-source.js"},"./csrf/react":{"types":"./build/react/authenticity-token.d.ts","default":"./build/react/authenticity-token.js"},"./respond-to":{"types":"./build/server/respond-to.d.ts","default":"./build/server/respond-to.js"},"./sse/server":{"types":"./build/server/event-stream.d.ts","default":"./build/server/event-stream.js"},"./client-only":{"types":"./build/react/client-only.d.ts","default":"./build/react/client-only.js"},"./csrf/server":{"types":"./build/server/csrf.d.ts","default":"./build/server/csrf.js"},"./is-prefetch":{"types":"./build/server/is-prefetch.d.ts","default":"./build/server/is-prefetch.js"},"./server-only":{"types":"./build/react/server-only.d.ts","default":"./build/react/server-only.js"},"./cache-assets":{"types":"./build/client/cache-assets.d.ts","default":"./build/client/cache-assets.js"},"./fetcher-type":{"types":"./build/react/fetcher-type.d.ts","default":"./build/react/fetcher-type.js"},"./named-action":{"types":"./build/server/named-action.d.ts","default":"./build/server/named-action.js"},"./package.json":"./package.json","./typed-cookie":{"types":"./build/server/typed-cookie.d.ts","default":"./build/server/typed-cookie.js"},"./use-hydrated":{"types":"./build/react/use-hydrated.d.ts","default":"./build/react/use-hydrated.js"},"./locales/react":{"types":"./build/react/use-locales.d.ts","default":"./build/react/use-locales.js"},"./redirect-back":{"types":"./build/server/redirect-back.d.ts","default":"./build/server/redirect-back.js"},"./safe-redirect":{"types":"./build/server/safe-redirect.d.ts","default":"./build/server/safe-redirect.js"},"./typed-session":{"types":"./build/server/typed-session.d.ts","default":"./build/server/typed-session.js"},"./honeypot/react":{"types":"./build/react/honeypot.d.ts","default":"./build/react/honeypot.js"},"./locales/server":{"types":"./build/server/get-client-locales.d.ts","default":"./build/server/get-client-locales.js"},"./rolling-cookie":{"types":"./build/server/rolling-cookie.d.ts","default":"./build/server/rolling-cookie.js"},"./honeypot/server":{"types":"./build/server/honeypot.d.ts","default":"./build/server/honeypot.js"},"./middleware/cors":{"types":"./build/server/middleware/cors.d.ts","default":"./build/server/middleware/cors.js"},"./external-scripts":{"types":"./build/react/external-scripts.d.ts","default":"./build/react/external-scripts.js"},"./middleware/logger":{"types":"./build/server/middleware/logger.d.ts","default":"./build/server/middleware/logger.js"},"./middleware/batcher":{"types":"./build/server/middleware/batcher.d.ts","default":"./build/server/middleware/batcher.js"},"./middleware/session":{"types":"./build/server/middleware/session.d.ts","default":"./build/server/middleware/session.js"},"./use-should-hydrate":{"types":"./build/react/use-should-hydrate.d.ts","default":"./build/react/use-should-hydrate.js"},"./middleware/honeypot":{"types":"./build/server/middleware/honeypot.d.ts","default":"./build/server/middleware/honeypot.js"},"./middleware/jwk-auth":{"types":"./build/server/middleware/jwk-auth.d.ts","default":"./build/server/middleware/jwk-auth.js"},"./parse-accept-header":{"types":"./build/server/parse-accept-header.d.ts","default":"./build/server/parse-accept-header.js"},"./use-debounce-submit":{"types":"./build/react/use-debounce-submit.d.ts","default":"./build/react/use-debounce-submit.js"},"./middleware/singleton":{"types":"./build/server/middleware/singleton.d.ts","default":"./build/server/middleware/singleton.js"},"./preload-route-assets":{"types":"./build/server/preload-route-assets.d.ts","default":"./build/server/preload-route-assets.js"},"./use-debounce-fetcher":{"types":"./build/react/use-debounce-fetcher.d.ts","default":"./build/react/use-debounce-fetcher.js"},"./get-client-ip-address":{"types":"./build/server/get-client-ip-address.d.ts","default":"./build/server/get-client-ip-address.js"},"./middleware/basic-auth":{"types":"./build/server/middleware/basic-auth.d.ts","default":"./build/server/middleware/basic-auth.js"},"./middleware/request-id":{"types":"./build/server/middleware/request-id.d.ts","default":"./build/server/middleware/request-id.js"},"./use-delegated-anchors":{"types":"./build/react/use-delegated-anchors.d.ts","default":"./build/react/use-delegated-anchors.js"},"./existing-search-params":{"types":"./build/react/existing-search-params.d.ts","default":"./build/react/existing-search-params.js"},"./middleware/server-timing":{"types":"./build/server/middleware/server-timing.d.ts","default":"./build/server/middleware/server-timing.js"},"./middleware/rolling-cookie":{"types":"./build/server/middleware/rolling-cookie.d.ts","default":"./build/server/middleware/rolling-cookie.js"},"./middleware/secure-headers":{"types":"./build/server/middleware/secure-headers.d.ts","default":"./build/server/middleware/secure-headers.js"},"./middleware/context-storage":{"types":"./build/server/middleware/context-storage.d.ts","default":"./build/server/middleware/context-storage.js"},"./use-global-navigation-state":{"types":"./build/react/use-global-navigation-state.d.ts","default":"./build/react/use-global-navigation-state.js"}},"funding":["https://github.com/sponsors/sergiodxa"],"gitHead":"fa22559f97e004437dd2eb0f4e708e0a4dc1904b","scripts":{"build":"tsc","exports":"bun run ./scripts/exports.ts","quality":"biome check .","typecheck":"tsc --noEmit","quality:fix":"biome check . --write --unsafe"},"_npmUser":{"name":"sergiodxa","email":"hello@sergiodxa.com"},"repository":{"url":"git+https://github.com/sergiodxa/remix-utils.git","type":"git"},"_npmVersion":"10.9.2","description":"This package contains simple utility functions to use with [React Router](https://reactrouter.com/).","directories":{},"sideEffects":false,"_nodeVersion":"22.17.1","dependencies":{"type-fest":"^4.41.0"},"_hasShrinkwrap":false,"devDependencies":{"msw":"^2.8.2","zod":"^3.24.4","is-ip":"5.0.1","react":"^19.1.0","ts-node":"^10.9.1","typedoc":"^0.28.4","react-dom":"^19.1.0","@types/bun":"^1.2.12","typescript":"^5.8.3","@types/react":"^19.1.3","react-router":"^7.6.0","@biomejs/biome":"^1.7.2","@oslojs/crypto":"^1.0.1","@oslojs/encoding":"^1.1.0","@edgefirst-dev/jwt":"^1.2.0","@arethetypeswrong/cli":"^0.18.1","@standard-schema/spec":"^1.0.0","@edgefirst-dev/batcher":"^1.0.1","@mjackson/file-storage":"^0.6.1","@testing-library/react":"^16.3.0","typedoc-plugin-mdn-links":"^5.0.1","@testing-library/jest-dom":"^6.1.3","@total-typescript/tsconfig":"^1.0.4","intl-parse-accept-language":"^1.0.0","@testing-library/user-event":"^14.6.1","@edgefirst-dev/server-timing":"^0.0.1","@happy-dom/global-registrator":"^17.4.6"},"peerDependencies":{"zod":"^3.22.4","is-ip":"^5.0.1","react":"^18.0.0 || ^19.0.0","react-router":"^7.0.0","@oslojs/crypto":"^1.0.1","@oslojs/encoding":"^1.1.0","@edgefirst-dev/jwt":"^1.2.0","@standard-schema/spec":"^1.0.0","@edgefirst-dev/batcher":"^1.0.0","intl-parse-accept-language":"^1.0.0","@edgefirst-dev/server-timing":"^0.0.1"},"peerDependenciesMeta":{"zod":{"optional":true},"is-ip":{"optional":true},"react":{"optional":true},"react-router":{"optional":true},"@oslojs/crypto":{"optional":true},"@oslojs/encoding":{"optional":true},"@edgefirst-dev/jwt":{"optional":true},"@standard-schema/spec":{"optional":true},"@edgefirst-dev/batcher":{"optional":true},"intl-parse-accept-language":{"optional":true},"@edgefirst-dev/server-timing":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/remix-utils_8.8.0_1753985640123_0.4312336452656378","host":"s3://npm-registry-packages-npm-production"}},"9.0.0":{"name":"remix-utils","version":"9.0.0","keywords":["remix","remix.run","react","utils","request","response","csrf","redirect-back","client-only","hydrated","server-only","cors","rolling cookie","safe redirect","typed cookie","typed session","client IP address","client locale","json hash","prefetch","named action"],"author":{"url":"https://sergiodxa.com","name":"Sergio Xalambrí","email":"hello@sergiodxa.com"},"license":"MIT","_id":"remix-utils@9.0.0","maintainers":[{"name":"sergiodxa","email":"hello@sergiodxa.com"}],"homepage":"https://github.com/sergiodxa/remix-utils#readme","bugs":{"url":"https://github.com/sergiodxa/remix-utils/issues"},"dist":{"shasum":"2a869e47d069ab77065dc56e3e9f7de3b25ab58d","tarball":"https://registry.npmjs.org/remix-utils/-/remix-utils-9.0.0.tgz","fileCount":168,"integrity":"sha512-xpDnw6hIjYbHR9/noE4lKNPRzfxvGai3XBQcjOjcwIwZVW9O1bdsnYAl+aqJ2fMXSQTNMjNuR8Cetn76HqwXCg==","signatures":[{"sig":"MEUCIQCOCS8JiL4eIYWbcw5SAoy+0zyOdYqRy3xo+1EaUUi30QIgf9M9XDe0znPrgnEYTz4DQPt5Rt4kgpPnJFOQ3OaWLQE=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":407366},"type":"module","engines":{"node":">=20.0.0"},"exports":{"./cors":{"types":"./build/server/cors.d.ts","default":"./build/server/cors.js"},"./timers":{"types":"./build/common/timers.d.ts","default":"./build/common/timers.js"},"./promise":{"types":"./build/common/promise.d.ts","default":"./build/common/promise.js"},"./json-hash":{"types":"./build/server/json-hash.d.ts","default":"./build/server/json-hash.js"},"./responses":{"types":"./build/server/responses.d.ts","default":"./build/server/responses.js"},"./sec-fetch":{"types":"./build/server/sec-fetch.d.ts","default":"./build/server/sec-fetch.js"},"./sse/react":{"types":"./build/react/use-event-source.d.ts","default":"./build/react/use-event-source.js"},"./csrf/react":{"types":"./build/react/authenticity-token.d.ts","default":"./build/react/authenticity-token.js"},"./respond-to":{"types":"./build/server/respond-to.d.ts","default":"./build/server/respond-to.js"},"./sse/server":{"types":"./build/server/event-stream.d.ts","default":"./build/server/event-stream.js"},"./client-only":{"types":"./build/react/client-only.d.ts","default":"./build/react/client-only.js"},"./csrf/server":{"types":"./build/server/csrf.d.ts","default":"./build/server/csrf.js"},"./is-prefetch":{"types":"./build/server/is-prefetch.d.ts","default":"./build/server/is-prefetch.js"},"./server-only":{"types":"./build/react/server-only.d.ts","default":"./build/react/server-only.js"},"./cache-assets":{"types":"./build/client/cache-assets.d.ts","default":"./build/client/cache-assets.js"},"./fetcher-type":{"types":"./build/react/fetcher-type.d.ts","default":"./build/react/fetcher-type.js"},"./named-action":{"types":"./build/server/named-action.d.ts","default":"./build/server/named-action.js"},"./package.json":"./package.json","./typed-cookie":{"types":"./build/server/typed-cookie.d.ts","default":"./build/server/typed-cookie.js"},"./use-hydrated":{"types":"./build/react/use-hydrated.d.ts","default":"./build/react/use-hydrated.js"},"./locales/react":{"types":"./build/react/use-locales.d.ts","default":"./build/react/use-locales.js"},"./redirect-back":{"types":"./build/server/redirect-back.d.ts","default":"./build/server/redirect-back.js"},"./safe-redirect":{"types":"./build/server/safe-redirect.d.ts","default":"./build/server/safe-redirect.js"},"./honeypot/react":{"types":"./build/react/honeypot.d.ts","default":"./build/react/honeypot.js"},"./locales/server":{"types":"./build/server/get-client-locales.d.ts","default":"./build/server/get-client-locales.js"},"./rolling-cookie":{"types":"./build/server/rolling-cookie.d.ts","default":"./build/server/rolling-cookie.js"},"./honeypot/server":{"types":"./build/server/honeypot.d.ts","default":"./build/server/honeypot.js"},"./middleware/cors":{"types":"./build/server/middleware/cors.d.ts","default":"./build/server/middleware/cors.js"},"./external-scripts":{"types":"./build/react/external-scripts.d.ts","default":"./build/react/external-scripts.js"},"./middleware/logger":{"types":"./build/server/middleware/logger.d.ts","default":"./build/server/middleware/logger.js"},"./middleware/batcher":{"types":"./build/server/middleware/batcher.d.ts","default":"./build/server/middleware/batcher.js"},"./middleware/session":{"types":"./build/server/middleware/session.d.ts","default":"./build/server/middleware/session.js"},"./use-should-hydrate":{"types":"./build/react/use-should-hydrate.d.ts","default":"./build/react/use-should-hydrate.js"},"./middleware/honeypot":{"types":"./build/server/middleware/honeypot.d.ts","default":"./build/server/middleware/honeypot.js"},"./middleware/jwk-auth":{"types":"./build/server/middleware/jwk-auth.d.ts","default":"./build/server/middleware/jwk-auth.js"},"./parse-accept-header":{"types":"./build/server/parse-accept-header.d.ts","default":"./build/server/parse-accept-header.js"},"./use-debounce-submit":{"types":"./build/react/use-debounce-submit.d.ts","default":"./build/react/use-debounce-submit.js"},"./middleware/singleton":{"types":"./build/server/middleware/singleton.d.ts","default":"./build/server/middleware/singleton.js"},"./preload-route-assets":{"types":"./build/server/preload-route-assets.d.ts","default":"./build/server/preload-route-assets.js"},"./use-debounce-fetcher":{"types":"./build/react/use-debounce-fetcher.d.ts","default":"./build/react/use-debounce-fetcher.js"},"./get-client-ip-address":{"types":"./build/server/get-client-ip-address.d.ts","default":"./build/server/get-client-ip-address.js"},"./middleware/basic-auth":{"types":"./build/server/middleware/basic-auth.d.ts","default":"./build/server/middleware/basic-auth.js"},"./middleware/request-id":{"types":"./build/server/middleware/request-id.d.ts","default":"./build/server/middleware/request-id.js"},"./use-delegated-anchors":{"types":"./build/react/use-delegated-anchors.d.ts","default":"./build/react/use-delegated-anchors.js"},"./existing-search-params":{"types":"./build/react/existing-search-params.d.ts","default":"./build/react/existing-search-params.js"},"./middleware/server-timing":{"types":"./build/server/middleware/server-timing.d.ts","default":"./build/server/middleware/server-timing.js"},"./middleware/rolling-cookie":{"types":"./build/server/middleware/rolling-cookie.d.ts","default":"./build/server/middleware/rolling-cookie.js"},"./middleware/secure-headers":{"types":"./build/server/middleware/secure-headers.d.ts","default":"./build/server/middleware/secure-headers.js"},"./middleware/context-storage":{"types":"./build/server/middleware/context-storage.d.ts","default":"./build/server/middleware/context-storage.js"},"./use-global-navigation-state":{"types":"./build/react/use-global-navigation-state.d.ts","default":"./build/react/use-global-navigation-state.js"}},"funding":["https://github.com/sponsors/sergiodxa"],"gitHead":"817527a4a7d3e00c7d47fa70851288ecfde33e1a","scripts":{"build":"tsc","exports":"bun run ./scripts/exports.ts","quality":"biome check .","typecheck":"tsc --noEmit","quality:fix":"biome check . --write --unsafe"},"_npmUser":{"name":"sergiodxa","email":"hello@sergiodxa.com"},"repository":{"url":"git+https://github.com/sergiodxa/remix-utils.git","type":"git"},"_npmVersion":"10.9.3","description":"This package contains simple utility functions to use with [React Router](https://reactrouter.com/).","directories":{},"sideEffects":false,"_nodeVersion":"22.19.0","dependencies":{"type-fest":"^4.41.0"},"_hasShrinkwrap":false,"devDependencies":{"msw":"^2.11.1","zod":"^4.1.5","is-ip":"5.0.1","react":"^19.1.1","ts-node":"^10.9.1","typedoc":"^0.28.12","react-dom":"^19.1.1","@types/bun":"^1.2.21","typescript":"^5.9.2","@types/react":"^19.1.12","react-router":"^7.9.0","@biomejs/biome":"^2.2.2","@oslojs/crypto":"^1.0.1","@oslojs/encoding":"^1.1.0","@edgefirst-dev/jwt":"^1.3.0","@arethetypeswrong/cli":"^0.18.2","@standard-schema/spec":"^1.0.0","@edgefirst-dev/batcher":"^1.0.1","@testing-library/react":"^16.3.0","@remix-run/file-storage":"^0.9.0","typedoc-plugin-mdn-links":"^5.0.9","@testing-library/jest-dom":"^6.8.0","@total-typescript/tsconfig":"^1.0.4","intl-parse-accept-language":"^1.0.0","@testing-library/user-event":"^14.6.1","@edgefirst-dev/server-timing":"^0.0.1","@happy-dom/global-registrator":"^18.0.1"},"peerDependencies":{"is-ip":"^5.0.1","react":"^18.0.0 || ^19.0.0","react-router":"^7.0.0","@oslojs/crypto":"^1.0.1","@oslojs/encoding":"^1.1.0","@edgefirst-dev/jwt":"^1.2.0","@standard-schema/spec":"^1.0.0","@edgefirst-dev/batcher":"^1.0.0","intl-parse-accept-language":"^1.0.0","@edgefirst-dev/server-timing":"^0.0.1"},"peerDependenciesMeta":{"is-ip":{"optional":true},"react":{"optional":true},"react-router":{"optional":true},"@oslojs/crypto":{"optional":true},"@oslojs/encoding":{"optional":true},"@edgefirst-dev/jwt":{"optional":true},"@standard-schema/spec":{"optional":true},"@edgefirst-dev/batcher":{"optional":true},"intl-parse-accept-language":{"optional":true},"@edgefirst-dev/server-timing":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/remix-utils_9.0.0_1758519916675_0.3315720479594777","host":"s3://npm-registry-packages-npm-production"}},"9.0.1":{"name":"remix-utils","version":"9.0.1","keywords":["remix","remix.run","react","utils","request","response","csrf","redirect-back","client-only","hydrated","server-only","cors","rolling cookie","safe redirect","typed cookie","typed session","client IP address","client locale","json hash","prefetch","named action"],"author":{"url":"https://sergiodxa.com","name":"Sergio Xalambrí","email":"hello@sergiodxa.com"},"license":"MIT","_id":"remix-utils@9.0.1","maintainers":[{"name":"sergiodxa","email":"hello@sergiodxa.com"}],"homepage":"https://github.com/sergiodxa/remix-utils#readme","bugs":{"url":"https://github.com/sergiodxa/remix-utils/issues"},"dist":{"shasum":"d0eef84ba376fa9b6ddba6974a99a7c753295d41","tarball":"https://registry.npmjs.org/remix-utils/-/remix-utils-9.0.1.tgz","fileCount":168,"integrity":"sha512-u3CmayaYTin/zsjHom7t2CR+A5uWnNnkq7B1ifFtDZknuHeKnldx2BGyNx3uXliIHEOv+a1c8oqi7MIqVypRqg==","signatures":[{"sig":"MEYCIQDdRJ0ISxvUIdk4och/hfWi1ngjoYc1qA4JIcRbmvBxOgIhAJqQT6qzgYZOjM0r6rLmFkAiuXcifqRbRiuXZT3RRNdH","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/remix-utils@9.0.1","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":407357},"type":"module","engines":{"node":">=20.0.0"},"exports":{"./cors":{"types":"./build/server/cors.d.ts","default":"./build/server/cors.js"},"./timers":{"types":"./build/common/timers.d.ts","default":"./build/common/timers.js"},"./promise":{"types":"./build/common/promise.d.ts","default":"./build/common/promise.js"},"./json-hash":{"types":"./build/server/json-hash.d.ts","default":"./build/server/json-hash.js"},"./responses":{"types":"./build/server/responses.d.ts","default":"./build/server/responses.js"},"./sec-fetch":{"types":"./build/server/sec-fetch.d.ts","default":"./build/server/sec-fetch.js"},"./sse/react":{"types":"./build/react/use-event-source.d.ts","default":"./build/react/use-event-source.js"},"./csrf/react":{"types":"./build/react/authenticity-token.d.ts","default":"./build/react/authenticity-token.js"},"./respond-to":{"types":"./build/server/respond-to.d.ts","default":"./build/server/respond-to.js"},"./sse/server":{"types":"./build/server/event-stream.d.ts","default":"./build/server/event-stream.js"},"./client-only":{"types":"./build/react/client-only.d.ts","default":"./build/react/client-only.js"},"./csrf/server":{"types":"./build/server/csrf.d.ts","default":"./build/server/csrf.js"},"./is-prefetch":{"types":"./build/server/is-prefetch.d.ts","default":"./build/server/is-prefetch.js"},"./server-only":{"types":"./build/react/server-only.d.ts","default":"./build/react/server-only.js"},"./cache-assets":{"types":"./build/client/cache-assets.d.ts","default":"./build/client/cache-assets.js"},"./fetcher-type":{"types":"./build/react/fetcher-type.d.ts","default":"./build/react/fetcher-type.js"},"./named-action":{"types":"./build/server/named-action.d.ts","default":"./build/server/named-action.js"},"./package.json":"./package.json","./typed-cookie":{"types":"./build/server/typed-cookie.d.ts","default":"./build/server/typed-cookie.js"},"./use-hydrated":{"types":"./build/react/use-hydrated.d.ts","default":"./build/react/use-hydrated.js"},"./locales/react":{"types":"./build/react/use-locales.d.ts","default":"./build/react/use-locales.js"},"./redirect-back":{"types":"./build/server/redirect-back.d.ts","default":"./build/server/redirect-back.js"},"./safe-redirect":{"types":"./build/server/safe-redirect.d.ts","default":"./build/server/safe-redirect.js"},"./honeypot/react":{"types":"./build/react/honeypot.d.ts","default":"./build/react/honeypot.js"},"./locales/server":{"types":"./build/server/get-client-locales.d.ts","default":"./build/server/get-client-locales.js"},"./rolling-cookie":{"types":"./build/server/rolling-cookie.d.ts","default":"./build/server/rolling-cookie.js"},"./honeypot/server":{"types":"./build/server/honeypot.d.ts","default":"./build/server/honeypot.js"},"./middleware/cors":{"types":"./build/server/middleware/cors.d.ts","default":"./build/server/middleware/cors.js"},"./external-scripts":{"types":"./build/react/external-scripts.d.ts","default":"./build/react/external-scripts.js"},"./middleware/logger":{"types":"./build/server/middleware/logger.d.ts","default":"./build/server/middleware/logger.js"},"./middleware/batcher":{"types":"./build/server/middleware/batcher.d.ts","default":"./build/server/middleware/batcher.js"},"./middleware/session":{"types":"./build/server/middleware/session.d.ts","default":"./build/server/middleware/session.js"},"./use-should-hydrate":{"types":"./build/react/use-should-hydrate.d.ts","default":"./build/react/use-should-hydrate.js"},"./middleware/honeypot":{"types":"./build/server/middleware/honeypot.d.ts","default":"./build/server/middleware/honeypot.js"},"./middleware/jwk-auth":{"types":"./build/server/middleware/jwk-auth.d.ts","default":"./build/server/middleware/jwk-auth.js"},"./parse-accept-header":{"types":"./build/server/parse-accept-header.d.ts","default":"./build/server/parse-accept-header.js"},"./use-debounce-submit":{"types":"./build/react/use-debounce-submit.d.ts","default":"./build/react/use-debounce-submit.js"},"./middleware/singleton":{"types":"./build/server/middleware/singleton.d.ts","default":"./build/server/middleware/singleton.js"},"./preload-route-assets":{"types":"./build/server/preload-route-assets.d.ts","default":"./build/server/preload-route-assets.js"},"./use-debounce-fetcher":{"types":"./build/react/use-debounce-fetcher.d.ts","default":"./build/react/use-debounce-fetcher.js"},"./get-client-ip-address":{"types":"./build/server/get-client-ip-address.d.ts","default":"./build/server/get-client-ip-address.js"},"./middleware/basic-auth":{"types":"./build/server/middleware/basic-auth.d.ts","default":"./build/server/middleware/basic-auth.js"},"./middleware/request-id":{"types":"./build/server/middleware/request-id.d.ts","default":"./build/server/middleware/request-id.js"},"./use-delegated-anchors":{"types":"./build/react/use-delegated-anchors.d.ts","default":"./build/react/use-delegated-anchors.js"},"./existing-search-params":{"types":"./build/react/existing-search-params.d.ts","default":"./build/react/existing-search-params.js"},"./middleware/server-timing":{"types":"./build/server/middleware/server-timing.d.ts","default":"./build/server/middleware/server-timing.js"},"./middleware/rolling-cookie":{"types":"./build/server/middleware/rolling-cookie.d.ts","default":"./build/server/middleware/rolling-cookie.js"},"./middleware/secure-headers":{"types":"./build/server/middleware/secure-headers.d.ts","default":"./build/server/middleware/secure-headers.js"},"./middleware/context-storage":{"types":"./build/server/middleware/context-storage.d.ts","default":"./build/server/middleware/context-storage.js"},"./use-global-navigation-state":{"types":"./build/react/use-global-navigation-state.d.ts","default":"./build/react/use-global-navigation-state.js"}},"funding":["https://github.com/sponsors/sergiodxa"],"gitHead":"f1ba339691cdf41ea56eb145bd012c30669339df","scripts":{"build":"tsc","exports":"bun run ./scripts/exports.ts","quality":"biome check .","typecheck":"tsc --noEmit","quality:fix":"biome check . --write --unsafe"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:fa0665cd-01bc-4461-8821-82da60eb6f73"}},"repository":{"url":"git+https://github.com/sergiodxa/remix-utils.git","type":"git"},"_npmVersion":"11.6.2","description":"This package contains simple utility functions to use with [React Router](https://reactrouter.com/).","directories":{},"sideEffects":false,"_nodeVersion":"24.13.0","dependencies":{"type-fest":"^4.41.0"},"_hasShrinkwrap":false,"devDependencies":{"msw":"^2.11.1","zod":"^4.1.5","is-ip":"5.0.1","react":"^19.1.1","ts-node":"^10.9.1","typedoc":"^0.28.12","react-dom":"^19.1.1","@types/bun":"^1.2.21","typescript":"^5.9.2","@types/react":"^19.1.12","react-router":"^7.9.0","@biomejs/biome":"^2.2.2","@oslojs/crypto":"^1.0.1","@oslojs/encoding":"^1.1.0","@edgefirst-dev/jwt":"^1.3.0","@arethetypeswrong/cli":"^0.18.2","@standard-schema/spec":"^1.0.0","@edgefirst-dev/batcher":"^1.0.1","@testing-library/react":"^16.3.0","@remix-run/file-storage":"^0.9.0","typedoc-plugin-mdn-links":"^5.0.9","@testing-library/jest-dom":"^6.8.0","@total-typescript/tsconfig":"^1.0.4","intl-parse-accept-language":"^1.0.0","@testing-library/user-event":"^14.6.1","@edgefirst-dev/server-timing":"^0.0.1","@happy-dom/global-registrator":"^18.0.1"},"peerDependencies":{"is-ip":"^5.0.1","react":"^18.0.0 || ^19.0.0","react-router":"^7.0.0","@oslojs/crypto":"^1.0.1","@oslojs/encoding":"^1.1.0","@edgefirst-dev/jwt":"^1.2.0","@standard-schema/spec":"^1.0.0","@edgefirst-dev/batcher":"^1.0.0","intl-parse-accept-language":"^1.0.0","@edgefirst-dev/server-timing":"^0.0.1"},"peerDependenciesMeta":{"is-ip":{"optional":true},"react":{"optional":true},"react-router":{"optional":true},"@oslojs/crypto":{"optional":true},"@oslojs/encoding":{"optional":true},"@edgefirst-dev/jwt":{"optional":true},"@standard-schema/spec":{"optional":true},"@edgefirst-dev/batcher":{"optional":true},"intl-parse-accept-language":{"optional":true},"@edgefirst-dev/server-timing":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/remix-utils_9.0.1_1769707128262_0.31424872839633333","host":"s3://npm-registry-packages-npm-production"}},"9.1.0":{"name":"remix-utils","version":"9.1.0","keywords":["remix","remix.run","react","utils","request","response","csrf","redirect-back","client-only","hydrated","server-only","cors","rolling cookie","safe redirect","typed cookie","typed session","client IP address","client locale","json hash","prefetch","named action"],"author":{"url":"https://sergiodxa.com","name":"Sergio Xalambrí","email":"hello@sergiodxa.com"},"license":"MIT","_id":"remix-utils@9.1.0","maintainers":[{"name":"sergiodxa","email":"hello@sergiodxa.com"}],"homepage":"https://github.com/sergiodxa/remix-utils#readme","bugs":{"url":"https://github.com/sergiodxa/remix-utils/issues"},"dist":{"shasum":"b867959e6501443eb5fdc00df4fa17fd87bb1bff","tarball":"https://registry.npmjs.org/remix-utils/-/remix-utils-9.1.0.tgz","fileCount":174,"integrity":"sha512-bEVFdPyR0q/wK7QYpRMEnMewZPpO5Y+KgDg+RZo2pQy/beVlntceq90iVPgDFq+A6kUa3bKo7+Xhgy+KZNr2+Q==","signatures":[{"sig":"MEUCIEeCNaxVC6hd9VojAJFClhmmBy7kUX5tqODDsnCfirQoAiEA4I8jL6cJGuPbLa/aaW98jEIDhIB2yD4i3cN56c7IWto=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/remix-utils@9.1.0","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":445906},"type":"module","engines":{"node":">=20.0.0"},"exports":{"./cors":{"types":"./build/server/cors.d.ts","default":"./build/server/cors.js"},"./timers":{"types":"./build/common/timers.d.ts","default":"./build/common/timers.js"},"./promise":{"types":"./build/common/promise.d.ts","default":"./build/common/promise.js"},"./json-hash":{"types":"./build/server/json-hash.d.ts","default":"./build/server/json-hash.js"},"./responses":{"types":"./build/server/responses.d.ts","default":"./build/server/responses.js"},"./sec-fetch":{"types":"./build/server/sec-fetch.d.ts","default":"./build/server/sec-fetch.js"},"./sse/react":{"types":"./build/react/use-event-source.d.ts","default":"./build/react/use-event-source.js"},"./csrf/react":{"types":"./build/react/authenticity-token.d.ts","default":"./build/react/authenticity-token.js"},"./respond-to":{"types":"./build/server/respond-to.d.ts","default":"./build/server/respond-to.js"},"./sse/server":{"types":"./build/server/event-stream.d.ts","default":"./build/server/event-stream.js"},"./client-only":{"types":"./build/react/client-only.d.ts","default":"./build/react/client-only.js"},"./csrf/server":{"types":"./build/server/csrf.d.ts","default":"./build/server/csrf.js"},"./is-prefetch":{"types":"./build/server/is-prefetch.d.ts","default":"./build/server/is-prefetch.js"},"./server-only":{"types":"./build/react/server-only.d.ts","default":"./build/react/server-only.js"},"./cache-assets":{"types":"./build/client/cache-assets.d.ts","default":"./build/client/cache-assets.js"},"./fetcher-type":{"types":"./build/react/fetcher-type.d.ts","default":"./build/react/fetcher-type.js"},"./named-action":{"types":"./build/server/named-action.d.ts","default":"./build/server/named-action.js"},"./package.json":"./package.json","./typed-cookie":{"types":"./build/server/typed-cookie.d.ts","default":"./build/server/typed-cookie.js"},"./use-hydrated":{"types":"./build/react/use-hydrated.d.ts","default":"./build/react/use-hydrated.js"},"./locales/react":{"types":"./build/react/use-locales.d.ts","default":"./build/react/use-locales.js"},"./redirect-back":{"types":"./build/server/redirect-back.d.ts","default":"./build/server/redirect-back.js"},"./safe-redirect":{"types":"./build/server/safe-redirect.d.ts","default":"./build/server/safe-redirect.js"},"./honeypot/react":{"types":"./build/react/honeypot.d.ts","default":"./build/react/honeypot.js"},"./locales/server":{"types":"./build/server/get-client-locales.d.ts","default":"./build/server/get-client-locales.js"},"./rolling-cookie":{"types":"./build/server/rolling-cookie.d.ts","default":"./build/server/rolling-cookie.js"},"./honeypot/server":{"types":"./build/server/honeypot.d.ts","default":"./build/server/honeypot.js"},"./middleware/cors":{"types":"./build/server/middleware/cors.d.ts","default":"./build/server/middleware/cors.js"},"./middleware/csrf":{"types":"./build/server/middleware/csrf.d.ts","default":"./build/server/middleware/csrf.js"},"./external-scripts":{"types":"./build/react/external-scripts.d.ts","default":"./build/react/external-scripts.js"},"./middleware/logger":{"types":"./build/server/middleware/logger.d.ts","default":"./build/server/middleware/logger.js"},"./middleware/batcher":{"types":"./build/server/middleware/batcher.d.ts","default":"./build/server/middleware/batcher.js"},"./middleware/session":{"types":"./build/server/middleware/session.d.ts","default":"./build/server/middleware/session.js"},"./use-should-hydrate":{"types":"./build/react/use-should-hydrate.d.ts","default":"./build/react/use-should-hydrate.js"},"./middleware/honeypot":{"types":"./build/server/middleware/honeypot.d.ts","default":"./build/server/middleware/honeypot.js"},"./middleware/jwk-auth":{"types":"./build/server/middleware/jwk-auth.d.ts","default":"./build/server/middleware/jwk-auth.js"},"./parse-accept-header":{"types":"./build/server/parse-accept-header.d.ts","default":"./build/server/parse-accept-header.js"},"./use-debounce-submit":{"types":"./build/react/use-debounce-submit.d.ts","default":"./build/react/use-debounce-submit.js"},"./middleware/singleton":{"types":"./build/server/middleware/singleton.d.ts","default":"./build/server/middleware/singleton.js"},"./preload-route-assets":{"types":"./build/server/preload-route-assets.d.ts","default":"./build/server/preload-route-assets.js"},"./use-debounce-fetcher":{"types":"./build/react/use-debounce-fetcher.d.ts","default":"./build/react/use-debounce-fetcher.js"},"./get-client-ip-address":{"types":"./build/server/get-client-ip-address.d.ts","default":"./build/server/get-client-ip-address.js"},"./middleware/basic-auth":{"types":"./build/server/middleware/basic-auth.d.ts","default":"./build/server/middleware/basic-auth.js"},"./middleware/csrf-token":{"types":"./build/server/middleware/csrf-token.d.ts","default":"./build/server/middleware/csrf-token.js"},"./middleware/request-id":{"types":"./build/server/middleware/request-id.d.ts","default":"./build/server/middleware/request-id.js"},"./use-delegated-anchors":{"types":"./build/react/use-delegated-anchors.d.ts","default":"./build/react/use-delegated-anchors.js"},"./existing-search-params":{"types":"./build/react/existing-search-params.d.ts","default":"./build/react/existing-search-params.js"},"./middleware/server-timing":{"types":"./build/server/middleware/server-timing.d.ts","default":"./build/server/middleware/server-timing.js"},"./middleware/rolling-cookie":{"types":"./build/server/middleware/rolling-cookie.d.ts","default":"./build/server/middleware/rolling-cookie.js"},"./middleware/secure-headers":{"types":"./build/server/middleware/secure-headers.d.ts","default":"./build/server/middleware/secure-headers.js"},"./middleware/context-storage":{"types":"./build/server/middleware/context-storage.d.ts","default":"./build/server/middleware/context-storage.js"},"./use-global-navigation-state":{"types":"./build/react/use-global-navigation-state.d.ts","default":"./build/react/use-global-navigation-state.js"}},"funding":["https://github.com/sponsors/sergiodxa"],"gitHead":"6c5cb0f6044192e0c81159638755d1a2ca8bd8ae","scripts":{"build":"tsc","exports":"bun run ./scripts/exports.ts","quality":"biome check .","typecheck":"tsc --noEmit","quality:fix":"biome check . --write --unsafe"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:fa0665cd-01bc-4461-8821-82da60eb6f73"}},"repository":{"url":"git+https://github.com/sergiodxa/remix-utils.git","type":"git"},"_npmVersion":"11.8.0","description":"This package contains simple utility functions to use with [React Router](https://reactrouter.com/).","directories":{},"sideEffects":false,"_nodeVersion":"24.13.1","dependencies":{"type-fest":"^4.41.0"},"_hasShrinkwrap":false,"devDependencies":{"msw":"^2.11.1","zod":"^4.1.5","is-ip":"5.0.1","react":"^19.1.1","ts-node":"^10.9.1","typedoc":"^0.28.12","react-dom":"^19.1.1","@types/bun":"^1.2.21","typescript":"^5.9.2","@types/react":"^19.1.12","react-router":"^7.9.0","@biomejs/biome":"^2.2.2","@oslojs/crypto":"^1.0.1","@oslojs/encoding":"^1.1.0","@edgefirst-dev/jwt":"^1.3.0","@arethetypeswrong/cli":"^0.18.2","@standard-schema/spec":"^1.0.0","@edgefirst-dev/batcher":"^1.0.1","@testing-library/react":"^16.3.0","@remix-run/file-storage":"^0.9.0","typedoc-plugin-mdn-links":"^5.0.9","@testing-library/jest-dom":"^6.8.0","@total-typescript/tsconfig":"^1.0.4","intl-parse-accept-language":"^1.0.0","@testing-library/user-event":"^14.6.1","@edgefirst-dev/server-timing":"^0.0.1","@happy-dom/global-registrator":"^18.0.1"},"peerDependencies":{"is-ip":"^5.0.1","react":"^18.0.0 || ^19.0.0","react-router":"^7.0.0","@oslojs/crypto":"^1.0.1","@oslojs/encoding":"^1.1.0","@edgefirst-dev/jwt":"^1.2.0","@standard-schema/spec":"^1.0.0","@edgefirst-dev/batcher":"^1.0.0","intl-parse-accept-language":"^1.0.0","@edgefirst-dev/server-timing":"^0.0.1"},"peerDependenciesMeta":{"is-ip":{"optional":true},"react":{"optional":true},"react-router":{"optional":true},"@oslojs/crypto":{"optional":true},"@oslojs/encoding":{"optional":true},"@edgefirst-dev/jwt":{"optional":true},"@standard-schema/spec":{"optional":true},"@edgefirst-dev/batcher":{"optional":true},"intl-parse-accept-language":{"optional":true},"@edgefirst-dev/server-timing":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/remix-utils_9.1.0_1772263905569_0.36262978660977274","host":"s3://npm-registry-packages-npm-production"}},"9.2.0":{"name":"remix-utils","version":"9.2.0","keywords":["remix","remix.run","react","utils","request","response","csrf","redirect-back","client-only","hydrated","server-only","cors","rolling cookie","safe redirect","typed cookie","typed session","client IP address","client locale","json hash","prefetch","named action"],"author":{"url":"https://sergiodxa.com","name":"Sergio Xalambrí","email":"hello@sergiodxa.com"},"license":"MIT","_id":"remix-utils@9.2.0","maintainers":[{"name":"sergiodxa","email":"hello@sergiodxa.com"}],"homepage":"https://github.com/sergiodxa/remix-utils#readme","bugs":{"url":"https://github.com/sergiodxa/remix-utils/issues"},"dist":{"shasum":"6d8f7013dbb5d71366410f843af327824448bbd1","tarball":"https://registry.npmjs.org/remix-utils/-/remix-utils-9.2.0.tgz","fileCount":174,"integrity":"sha512-QFrgQQz4lSoZ3KkwN314ctIVR9XEXJlu/AWUzvo/KqqZ0FS2vij6D9Folh3QlcLuCBSmPTDDhf0cDhY8D1FcUw==","signatures":[{"sig":"MEUCIQDXWcA1OiCWPyLz2wbAHEWlrjpYtLU6DbHLtFRu6dVMzQIgbafKNg0xnl/qojVHliw6BE+Q/t0eUAjYJI0Y1K2thyA=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/remix-utils@9.2.0","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":446726},"type":"module","engines":{"node":">=20.0.0"},"exports":{"./cors":{"types":"./build/server/cors.d.ts","default":"./build/server/cors.js"},"./timers":{"types":"./build/common/timers.d.ts","default":"./build/common/timers.js"},"./promise":{"types":"./build/common/promise.d.ts","default":"./build/common/promise.js"},"./json-hash":{"types":"./build/server/json-hash.d.ts","default":"./build/server/json-hash.js"},"./responses":{"types":"./build/server/responses.d.ts","default":"./build/server/responses.js"},"./sec-fetch":{"types":"./build/server/sec-fetch.d.ts","default":"./build/server/sec-fetch.js"},"./sse/react":{"types":"./build/react/use-event-source.d.ts","default":"./build/react/use-event-source.js"},"./csrf/react":{"types":"./build/react/authenticity-token.d.ts","default":"./build/react/authenticity-token.js"},"./respond-to":{"types":"./build/server/respond-to.d.ts","default":"./build/server/respond-to.js"},"./sse/server":{"types":"./build/server/event-stream.d.ts","default":"./build/server/event-stream.js"},"./client-only":{"types":"./build/react/client-only.d.ts","default":"./build/react/client-only.js"},"./csrf/server":{"types":"./build/server/csrf.d.ts","default":"./build/server/csrf.js"},"./is-prefetch":{"types":"./build/server/is-prefetch.d.ts","default":"./build/server/is-prefetch.js"},"./server-only":{"types":"./build/react/server-only.d.ts","default":"./build/react/server-only.js"},"./cache-assets":{"types":"./build/client/cache-assets.d.ts","default":"./build/client/cache-assets.js"},"./fetcher-type":{"types":"./build/react/fetcher-type.d.ts","default":"./build/react/fetcher-type.js"},"./named-action":{"types":"./build/server/named-action.d.ts","default":"./build/server/named-action.js"},"./package.json":"./package.json","./typed-cookie":{"types":"./build/server/typed-cookie.d.ts","default":"./build/server/typed-cookie.js"},"./use-hydrated":{"types":"./build/react/use-hydrated.d.ts","default":"./build/react/use-hydrated.js"},"./locales/react":{"types":"./build/react/use-locales.d.ts","default":"./build/react/use-locales.js"},"./redirect-back":{"types":"./build/server/redirect-back.d.ts","default":"./build/server/redirect-back.js"},"./safe-redirect":{"types":"./build/server/safe-redirect.d.ts","default":"./build/server/safe-redirect.js"},"./honeypot/react":{"types":"./build/react/honeypot.d.ts","default":"./build/react/honeypot.js"},"./locales/server":{"types":"./build/server/get-client-locales.d.ts","default":"./build/server/get-client-locales.js"},"./rolling-cookie":{"types":"./build/server/rolling-cookie.d.ts","default":"./build/server/rolling-cookie.js"},"./honeypot/server":{"types":"./build/server/honeypot.d.ts","default":"./build/server/honeypot.js"},"./middleware/cors":{"types":"./build/server/middleware/cors.d.ts","default":"./build/server/middleware/cors.js"},"./middleware/csrf":{"types":"./build/server/middleware/csrf.d.ts","default":"./build/server/middleware/csrf.js"},"./external-scripts":{"types":"./build/react/external-scripts.d.ts","default":"./build/react/external-scripts.js"},"./middleware/logger":{"types":"./build/server/middleware/logger.d.ts","default":"./build/server/middleware/logger.js"},"./middleware/batcher":{"types":"./build/server/middleware/batcher.d.ts","default":"./build/server/middleware/batcher.js"},"./middleware/session":{"types":"./build/server/middleware/session.d.ts","default":"./build/server/middleware/session.js"},"./use-should-hydrate":{"types":"./build/react/use-should-hydrate.d.ts","default":"./build/react/use-should-hydrate.js"},"./middleware/honeypot":{"types":"./build/server/middleware/honeypot.d.ts","default":"./build/server/middleware/honeypot.js"},"./middleware/jwk-auth":{"types":"./build/server/middleware/jwk-auth.d.ts","default":"./build/server/middleware/jwk-auth.js"},"./parse-accept-header":{"types":"./build/server/parse-accept-header.d.ts","default":"./build/server/parse-accept-header.js"},"./use-debounce-submit":{"types":"./build/react/use-debounce-submit.d.ts","default":"./build/react/use-debounce-submit.js"},"./middleware/singleton":{"types":"./build/server/middleware/singleton.d.ts","default":"./build/server/middleware/singleton.js"},"./preload-route-assets":{"types":"./build/server/preload-route-assets.d.ts","default":"./build/server/preload-route-assets.js"},"./use-debounce-fetcher":{"types":"./build/react/use-debounce-fetcher.d.ts","default":"./build/react/use-debounce-fetcher.js"},"./get-client-ip-address":{"types":"./build/server/get-client-ip-address.d.ts","default":"./build/server/get-client-ip-address.js"},"./middleware/basic-auth":{"types":"./build/server/middleware/basic-auth.d.ts","default":"./build/server/middleware/basic-auth.js"},"./middleware/csrf-token":{"types":"./build/server/middleware/csrf-token.d.ts","default":"./build/server/middleware/csrf-token.js"},"./middleware/request-id":{"types":"./build/server/middleware/request-id.d.ts","default":"./build/server/middleware/request-id.js"},"./use-delegated-anchors":{"types":"./build/react/use-delegated-anchors.d.ts","default":"./build/react/use-delegated-anchors.js"},"./existing-search-params":{"types":"./build/react/existing-search-params.d.ts","default":"./build/react/existing-search-params.js"},"./middleware/server-timing":{"types":"./build/server/middleware/server-timing.d.ts","default":"./build/server/middleware/server-timing.js"},"./middleware/rolling-cookie":{"types":"./build/server/middleware/rolling-cookie.d.ts","default":"./build/server/middleware/rolling-cookie.js"},"./middleware/secure-headers":{"types":"./build/server/middleware/secure-headers.d.ts","default":"./build/server/middleware/secure-headers.js"},"./middleware/context-storage":{"types":"./build/server/middleware/context-storage.d.ts","default":"./build/server/middleware/context-storage.js"},"./use-global-navigation-state":{"types":"./build/react/use-global-navigation-state.d.ts","default":"./build/react/use-global-navigation-state.js"}},"funding":["https://github.com/sponsors/sergiodxa"],"gitHead":"19bc6598e73a063aa72e21e822891e8415301e8a","scripts":{"build":"tsc","exports":"bun run ./scripts/exports.ts","quality":"biome check .","typecheck":"tsc --noEmit","quality:fix":"biome check . --write --unsafe"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:fa0665cd-01bc-4461-8821-82da60eb6f73"}},"repository":{"url":"git+https://github.com/sergiodxa/remix-utils.git","type":"git"},"_npmVersion":"11.9.0","description":"This package contains simple utility functions to use with [React Router](https://reactrouter.com/).","directories":{},"sideEffects":false,"_nodeVersion":"24.14.0","dependencies":{"type-fest":"^4.41.0"},"_hasShrinkwrap":false,"devDependencies":{"msw":"^2.11.1","zod":"^4.1.5","is-ip":"5.0.1","react":"^19.1.1","ts-node":"^10.9.1","typedoc":"^0.28.12","react-dom":"^19.1.1","@types/bun":"^1.2.21","typescript":"^5.9.2","@types/react":"^19.1.12","react-router":"^7.9.0","@biomejs/biome":"^2.2.2","@oslojs/crypto":"^1.0.1","@oslojs/encoding":"^1.1.0","@edgefirst-dev/jwt":"^1.3.0","@arethetypeswrong/cli":"^0.18.2","@standard-schema/spec":"^1.0.0","@edgefirst-dev/batcher":"^1.0.1","@testing-library/react":"^16.3.0","@remix-run/file-storage":"^0.9.0","typedoc-plugin-mdn-links":"^5.0.9","@testing-library/jest-dom":"^6.8.0","@total-typescript/tsconfig":"^1.0.4","intl-parse-accept-language":"^1.0.0","@testing-library/user-event":"^14.6.1","@edgefirst-dev/server-timing":"^0.0.1","@happy-dom/global-registrator":"^18.0.1"},"peerDependencies":{"is-ip":"^5.0.1","react":"^18.0.0 || ^19.0.0","react-router":"^7.0.0","@oslojs/crypto":"^1.0.1","@oslojs/encoding":"^1.1.0","@edgefirst-dev/jwt":"^1.2.0","@standard-schema/spec":"^1.0.0","@edgefirst-dev/batcher":"^1.0.0","intl-parse-accept-language":"^1.0.0","@edgefirst-dev/server-timing":"^0.0.1"},"peerDependenciesMeta":{"is-ip":{"optional":true},"react":{"optional":true},"react-router":{"optional":true},"@oslojs/crypto":{"optional":true},"@oslojs/encoding":{"optional":true},"@edgefirst-dev/jwt":{"optional":true},"@standard-schema/spec":{"optional":true},"@edgefirst-dev/batcher":{"optional":true},"intl-parse-accept-language":{"optional":true},"@edgefirst-dev/server-timing":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/remix-utils_9.2.0_1772769569160_0.5905536671047724","host":"s3://npm-registry-packages-npm-production"}},"9.3.0":{"name":"remix-utils","version":"9.3.0","keywords":["client IP address","client locale","client-only","cors","csrf","hydrated","json hash","named action","prefetch","react","redirect-back","remix","remix.run","request","response","rolling cookie","safe redirect","server-only","typed cookie","typed session","utils"],"author":{"url":"https://sergiodxa.com","name":"Sergio Xalambrí","email":"hello@sergiodxa.com"},"license":"MIT","_id":"remix-utils@9.3.0","maintainers":[{"name":"sergiodxa","email":"hello@sergiodxa.com"}],"homepage":"https://github.com/sergiodxa/remix-utils#readme","bugs":{"url":"https://github.com/sergiodxa/remix-utils/issues"},"dist":{"shasum":"711aea4a2f937fab2f245eb1407dccd6f3d65da5","tarball":"https://registry.npmjs.org/remix-utils/-/remix-utils-9.3.0.tgz","fileCount":174,"integrity":"sha512-xrLRW6Xbm3/QT97Pt8W7Au2605iFkiq9X0THpuGnY93uc7BJefNLpSok8ORFgRzbHIbpp3rCJr19r05k861YZQ==","signatures":[{"sig":"MEUCIQDmFWY8b6NxFI/8bp7m+dHOKOiXN5ZHIsosZilcCwcX0wIgV4Fz+IiD3wiiRelbC4aU4t+4kuMzvbwuyB6D/CRbb4U=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/remix-utils@9.3.0","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":445370},"type":"module","engines":{"node":">=20.0.0"},"exports":{"./cors":{"types":"./build/server/cors.d.ts","default":"./build/server/cors.js"},"./timers":{"types":"./build/common/timers.d.ts","default":"./build/common/timers.js"},"./promise":{"types":"./build/common/promise.d.ts","default":"./build/common/promise.js"},"./json-hash":{"types":"./build/server/json-hash.d.ts","default":"./build/server/json-hash.js"},"./responses":{"types":"./build/server/responses.d.ts","default":"./build/server/responses.js"},"./sec-fetch":{"types":"./build/server/sec-fetch.d.ts","default":"./build/server/sec-fetch.js"},"./sse/react":{"types":"./build/react/use-event-source.d.ts","default":"./build/react/use-event-source.js"},"./csrf/react":{"types":"./build/react/authenticity-token.d.ts","default":"./build/react/authenticity-token.js"},"./respond-to":{"types":"./build/server/respond-to.d.ts","default":"./build/server/respond-to.js"},"./sse/server":{"types":"./build/server/event-stream.d.ts","default":"./build/server/event-stream.js"},"./client-only":{"types":"./build/react/client-only.d.ts","default":"./build/react/client-only.js"},"./csrf/server":{"types":"./build/server/csrf.d.ts","default":"./build/server/csrf.js"},"./is-prefetch":{"types":"./build/server/is-prefetch.d.ts","default":"./build/server/is-prefetch.js"},"./server-only":{"types":"./build/react/server-only.d.ts","default":"./build/react/server-only.js"},"./cache-assets":{"types":"./build/client/cache-assets.d.ts","default":"./build/client/cache-assets.js"},"./fetcher-type":{"types":"./build/react/fetcher-type.d.ts","default":"./build/react/fetcher-type.js"},"./named-action":{"types":"./build/server/named-action.d.ts","default":"./build/server/named-action.js"},"./package.json":"./package.json","./typed-cookie":{"types":"./build/server/typed-cookie.d.ts","default":"./build/server/typed-cookie.js"},"./use-hydrated":{"types":"./build/react/use-hydrated.d.ts","default":"./build/react/use-hydrated.js"},"./locales/react":{"types":"./build/react/use-locales.d.ts","default":"./build/react/use-locales.js"},"./redirect-back":{"types":"./build/server/redirect-back.d.ts","default":"./build/server/redirect-back.js"},"./safe-redirect":{"types":"./build/server/safe-redirect.d.ts","default":"./build/server/safe-redirect.js"},"./honeypot/react":{"types":"./build/react/honeypot.d.ts","default":"./build/react/honeypot.js"},"./locales/server":{"types":"./build/server/get-client-locales.d.ts","default":"./build/server/get-client-locales.js"},"./rolling-cookie":{"types":"./build/server/rolling-cookie.d.ts","default":"./build/server/rolling-cookie.js"},"./honeypot/server":{"types":"./build/server/honeypot.d.ts","default":"./build/server/honeypot.js"},"./middleware/cors":{"types":"./build/server/middleware/cors.d.ts","default":"./build/server/middleware/cors.js"},"./middleware/csrf":{"types":"./build/server/middleware/csrf.d.ts","default":"./build/server/middleware/csrf.js"},"./external-scripts":{"types":"./build/react/external-scripts.d.ts","default":"./build/react/external-scripts.js"},"./middleware/logger":{"types":"./build/server/middleware/logger.d.ts","default":"./build/server/middleware/logger.js"},"./middleware/batcher":{"types":"./build/server/middleware/batcher.d.ts","default":"./build/server/middleware/batcher.js"},"./middleware/session":{"types":"./build/server/middleware/session.d.ts","default":"./build/server/middleware/session.js"},"./use-should-hydrate":{"types":"./build/react/use-should-hydrate.d.ts","default":"./build/react/use-should-hydrate.js"},"./middleware/honeypot":{"types":"./build/server/middleware/honeypot.d.ts","default":"./build/server/middleware/honeypot.js"},"./middleware/jwk-auth":{"types":"./build/server/middleware/jwk-auth.d.ts","default":"./build/server/middleware/jwk-auth.js"},"./parse-accept-header":{"types":"./build/server/parse-accept-header.d.ts","default":"./build/server/parse-accept-header.js"},"./use-debounce-submit":{"types":"./build/react/use-debounce-submit.d.ts","default":"./build/react/use-debounce-submit.js"},"./middleware/singleton":{"types":"./build/server/middleware/singleton.d.ts","default":"./build/server/middleware/singleton.js"},"./preload-route-assets":{"types":"./build/server/preload-route-assets.d.ts","default":"./build/server/preload-route-assets.js"},"./use-debounce-fetcher":{"types":"./build/react/use-debounce-fetcher.d.ts","default":"./build/react/use-debounce-fetcher.js"},"./get-client-ip-address":{"types":"./build/server/get-client-ip-address.d.ts","default":"./build/server/get-client-ip-address.js"},"./middleware/basic-auth":{"types":"./build/server/middleware/basic-auth.d.ts","default":"./build/server/middleware/basic-auth.js"},"./middleware/csrf-token":{"types":"./build/server/middleware/csrf-token.d.ts","default":"./build/server/middleware/csrf-token.js"},"./middleware/request-id":{"types":"./build/server/middleware/request-id.d.ts","default":"./build/server/middleware/request-id.js"},"./use-delegated-anchors":{"types":"./build/react/use-delegated-anchors.d.ts","default":"./build/react/use-delegated-anchors.js"},"./existing-search-params":{"types":"./build/react/existing-search-params.d.ts","default":"./build/react/existing-search-params.js"},"./middleware/server-timing":{"types":"./build/server/middleware/server-timing.d.ts","default":"./build/server/middleware/server-timing.js"},"./middleware/rolling-cookie":{"types":"./build/server/middleware/rolling-cookie.d.ts","default":"./build/server/middleware/rolling-cookie.js"},"./middleware/secure-headers":{"types":"./build/server/middleware/secure-headers.d.ts","default":"./build/server/middleware/secure-headers.js"},"./middleware/context-storage":{"types":"./build/server/middleware/context-storage.d.ts","default":"./build/server/middleware/context-storage.js"},"./use-global-navigation-state":{"types":"./build/react/use-global-navigation-state.d.ts","default":"./build/react/use-global-navigation-state.js"}},"funding":["https://github.com/sponsors/sergiodxa"],"gitHead":"545baa16a5306f7acc27fc982ceb420fe557cb2b","scripts":{"lint":"oxlint --ignore-path .gitignore --deny-warnings .","build":"tsc","format":"oxfmt --check .","exports":"bun run ./scripts/exports.ts","quality":"bun run lint && bun run format","lint:fix":"oxlint --ignore-path .gitignore --deny-warnings --fix .","typecheck":"tsc --noEmit","build:docs":"typedoc && shadcn build --output pages/r","format:fix":"oxfmt .","quality:fix":"bun run lint:fix && bun run format:fix","build:registry":"shadcn build"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:fa0665cd-01bc-4461-8821-82da60eb6f73"}},"repository":{"url":"git+https://github.com/sergiodxa/remix-utils.git","type":"git"},"_npmVersion":"11.9.0","description":"This package contains simple utility functions to use with [React Router](https://reactrouter.com/).","directories":{},"sideEffects":false,"_nodeVersion":"24.14.0","dependencies":{"type-fest":"^5.4.4"},"_hasShrinkwrap":false,"devDependencies":{"msw":"^2.12.10","zod":"^4.3.6","is-ip":"5.0.1","oxfmt":"^0.37.0","react":"^19.2.4","oxlint":"^1.52.0","shadcn":"^4.0.3","ts-node":"^10.9.2","typedoc":"^0.28.17","react-dom":"^19.2.4","@types/bun":"^1.3.10","typescript":"^5.9.3","@types/react":"^19.2.14","react-router":"^7.13.1","@oslojs/crypto":"^1.0.1","@oslojs/encoding":"^1.1.0","@edgefirst-dev/jwt":"^1.3.0","@arethetypeswrong/cli":"^0.18.2","@standard-schema/spec":"^1.1.0","@edgefirst-dev/batcher":"^1.0.1","@testing-library/react":"^16.3.2","@remix-run/file-storage":"^0.13.3","typedoc-plugin-mdn-links":"^5.1.1","@testing-library/jest-dom":"^6.9.1","@total-typescript/tsconfig":"^1.0.4","intl-parse-accept-language":"^1.0.0","@testing-library/user-event":"^14.6.1","@edgefirst-dev/server-timing":"^0.0.1","@happy-dom/global-registrator":"^20.8.3"},"peerDependencies":{"is-ip":"^5.0.1","react":"^18.0.0 || ^19.0.0","react-router":"^7.0.0","@oslojs/crypto":"^1.0.1","@oslojs/encoding":"^1.1.0","@edgefirst-dev/jwt":"^1.2.0","@standard-schema/spec":"^1.0.0","@edgefirst-dev/batcher":"^1.0.0","intl-parse-accept-language":"^1.0.0","@edgefirst-dev/server-timing":"^0.0.1"},"peerDependenciesMeta":{"is-ip":{"optional":true},"react":{"optional":true},"react-router":{"optional":true},"@oslojs/crypto":{"optional":true},"@oslojs/encoding":{"optional":true},"@edgefirst-dev/jwt":{"optional":true},"@standard-schema/spec":{"optional":true},"@edgefirst-dev/batcher":{"optional":true},"intl-parse-accept-language":{"optional":true},"@edgefirst-dev/server-timing":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/remix-utils_9.3.0_1773207283975_0.5266774185566845","host":"s3://npm-registry-packages-npm-production"}},"9.3.1":{"name":"remix-utils","version":"9.3.1","keywords":["client IP address","client locale","client-only","cors","csrf","hydrated","json hash","named action","prefetch","react","redirect-back","remix","remix.run","request","response","rolling cookie","safe redirect","server-only","typed cookie","typed session","utils"],"author":{"url":"https://sergiodxa.com","name":"Sergio Xalambrí","email":"hello@sergiodxa.com"},"license":"MIT","_id":"remix-utils@9.3.1","maintainers":[{"name":"sergiodxa","email":"hello@sergiodxa.com"}],"homepage":"https://github.com/sergiodxa/remix-utils#readme","bugs":{"url":"https://github.com/sergiodxa/remix-utils/issues"},"dist":{"shasum":"2eff403f137982038e3c64600a8700a206a63e60","tarball":"https://registry.npmjs.org/remix-utils/-/remix-utils-9.3.1.tgz","fileCount":174,"integrity":"sha512-Z/CVE9mPKYOKxhSV5q2IeXd5W4zl/B4q9YLQfuR3EYNSOop8riQso6QXGJXd+71S96Ox8/haMl34GyV/WBnoVg==","signatures":[{"sig":"MEUCICHZETs31W5ULOdCZ0E8T1vTgT7nEnaK2d1U4CM2Uq+VAiEAtzb57N1WbH4yHnsQjxL+mrT9r77EJ7d9wQhd7ukk21M=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/remix-utils@9.3.1","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":644455},"type":"module","engines":{"node":">=20.0.0"},"exports":{"./cors":{"types":"./build/server/cors.d.ts","default":"./build/server/cors.js"},"./timers":{"types":"./build/common/timers.d.ts","default":"./build/common/timers.js"},"./promise":{"types":"./build/common/promise.d.ts","default":"./build/common/promise.js"},"./json-hash":{"types":"./build/server/json-hash.d.ts","default":"./build/server/json-hash.js"},"./responses":{"types":"./build/server/responses.d.ts","default":"./build/server/responses.js"},"./sec-fetch":{"types":"./build/server/sec-fetch.d.ts","default":"./build/server/sec-fetch.js"},"./sse/react":{"types":"./build/react/use-event-source.d.ts","default":"./build/react/use-event-source.js"},"./csrf/react":{"types":"./build/react/authenticity-token.d.ts","default":"./build/react/authenticity-token.js"},"./respond-to":{"types":"./build/server/respond-to.d.ts","default":"./build/server/respond-to.js"},"./sse/server":{"types":"./build/server/event-stream.d.ts","default":"./build/server/event-stream.js"},"./client-only":{"types":"./build/react/client-only.d.ts","default":"./build/react/client-only.js"},"./csrf/server":{"types":"./build/server/csrf.d.ts","default":"./build/server/csrf.js"},"./is-prefetch":{"types":"./build/server/is-prefetch.d.ts","default":"./build/server/is-prefetch.js"},"./server-only":{"types":"./build/react/server-only.d.ts","default":"./build/react/server-only.js"},"./cache-assets":{"types":"./build/client/cache-assets.d.ts","default":"./build/client/cache-assets.js"},"./fetcher-type":{"types":"./build/react/fetcher-type.d.ts","default":"./build/react/fetcher-type.js"},"./named-action":{"types":"./build/server/named-action.d.ts","default":"./build/server/named-action.js"},"./package.json":"./package.json","./typed-cookie":{"types":"./build/server/typed-cookie.d.ts","default":"./build/server/typed-cookie.js"},"./use-hydrated":{"types":"./build/react/use-hydrated.d.ts","default":"./build/react/use-hydrated.js"},"./locales/react":{"types":"./build/react/use-locales.d.ts","default":"./build/react/use-locales.js"},"./redirect-back":{"types":"./build/server/redirect-back.d.ts","default":"./build/server/redirect-back.js"},"./safe-redirect":{"types":"./build/server/safe-redirect.d.ts","default":"./build/server/safe-redirect.js"},"./honeypot/react":{"types":"./build/react/honeypot.d.ts","default":"./build/react/honeypot.js"},"./locales/server":{"types":"./build/server/get-client-locales.d.ts","default":"./build/server/get-client-locales.js"},"./rolling-cookie":{"types":"./build/server/rolling-cookie.d.ts","default":"./build/server/rolling-cookie.js"},"./honeypot/server":{"types":"./build/server/honeypot.d.ts","default":"./build/server/honeypot.js"},"./middleware/cors":{"types":"./build/server/middleware/cors.d.ts","default":"./build/server/middleware/cors.js"},"./middleware/csrf":{"types":"./build/server/middleware/csrf.d.ts","default":"./build/server/middleware/csrf.js"},"./external-scripts":{"types":"./build/react/external-scripts.d.ts","default":"./build/react/external-scripts.js"},"./middleware/logger":{"types":"./build/server/middleware/logger.d.ts","default":"./build/server/middleware/logger.js"},"./middleware/batcher":{"types":"./build/server/middleware/batcher.d.ts","default":"./build/server/middleware/batcher.js"},"./middleware/session":{"types":"./build/server/middleware/session.d.ts","default":"./build/server/middleware/session.js"},"./use-should-hydrate":{"types":"./build/react/use-should-hydrate.d.ts","default":"./build/react/use-should-hydrate.js"},"./middleware/honeypot":{"types":"./build/server/middleware/honeypot.d.ts","default":"./build/server/middleware/honeypot.js"},"./middleware/jwk-auth":{"types":"./build/server/middleware/jwk-auth.d.ts","default":"./build/server/middleware/jwk-auth.js"},"./parse-accept-header":{"types":"./build/server/parse-accept-header.d.ts","default":"./build/server/parse-accept-header.js"},"./use-debounce-submit":{"types":"./build/react/use-debounce-submit.d.ts","default":"./build/react/use-debounce-submit.js"},"./middleware/singleton":{"types":"./build/server/middleware/singleton.d.ts","default":"./build/server/middleware/singleton.js"},"./preload-route-assets":{"types":"./build/server/preload-route-assets.d.ts","default":"./build/server/preload-route-assets.js"},"./use-debounce-fetcher":{"types":"./build/react/use-debounce-fetcher.d.ts","default":"./build/react/use-debounce-fetcher.js"},"./get-client-ip-address":{"types":"./build/server/get-client-ip-address.d.ts","default":"./build/server/get-client-ip-address.js"},"./middleware/basic-auth":{"types":"./build/server/middleware/basic-auth.d.ts","default":"./build/server/middleware/basic-auth.js"},"./middleware/csrf-token":{"types":"./build/server/middleware/csrf-token.d.ts","default":"./build/server/middleware/csrf-token.js"},"./middleware/request-id":{"types":"./build/server/middleware/request-id.d.ts","default":"./build/server/middleware/request-id.js"},"./use-delegated-anchors":{"types":"./build/react/use-delegated-anchors.d.ts","default":"./build/react/use-delegated-anchors.js"},"./existing-search-params":{"types":"./build/react/existing-search-params.d.ts","default":"./build/react/existing-search-params.js"},"./middleware/server-timing":{"types":"./build/server/middleware/server-timing.d.ts","default":"./build/server/middleware/server-timing.js"},"./middleware/rolling-cookie":{"types":"./build/server/middleware/rolling-cookie.d.ts","default":"./build/server/middleware/rolling-cookie.js"},"./middleware/secure-headers":{"types":"./build/server/middleware/secure-headers.d.ts","default":"./build/server/middleware/secure-headers.js"},"./middleware/context-storage":{"types":"./build/server/middleware/context-storage.d.ts","default":"./build/server/middleware/context-storage.js"},"./use-global-navigation-state":{"types":"./build/react/use-global-navigation-state.d.ts","default":"./build/react/use-global-navigation-state.js"}},"funding":["https://github.com/sponsors/sergiodxa"],"gitHead":"83765f9ee119a5818685830d0492322387ffe98b","scripts":{"lint":"oxlint --ignore-path .gitignore --deny-warnings .","build":"tsc","format":"oxfmt --check .","exports":"bun run ./scripts/exports.ts","quality":"bun run lint && bun run format","lint:fix":"oxlint --ignore-path .gitignore --deny-warnings --fix .","typecheck":"tsc --noEmit","build:docs":"typedoc && shadcn build --output pages/r","format:fix":"oxfmt .","quality:fix":"bun run lint:fix && bun run format:fix","build:registry":"shadcn build"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:fa0665cd-01bc-4461-8821-82da60eb6f73"}},"repository":{"url":"git+https://github.com/sergiodxa/remix-utils.git","type":"git"},"_npmVersion":"11.9.0","description":"This package contains simple utility functions to use with [React Router](https://reactrouter.com/).","directories":{},"sideEffects":false,"_nodeVersion":"24.14.0","dependencies":{"type-fest":"^5.4.4"},"_hasShrinkwrap":false,"devDependencies":{"msw":"^2.12.10","zod":"^4.3.6","is-ip":"5.0.1","oxfmt":"^0.37.0","react":"^19.2.4","oxlint":"^1.52.0","shadcn":"^4.0.3","ts-node":"^10.9.2","typedoc":"^0.28.17","react-dom":"^19.2.4","@types/bun":"^1.3.10","typescript":"^5.9.3","@types/react":"^19.2.14","react-router":"^7.13.1","@oslojs/crypto":"^1.0.1","@oslojs/encoding":"^1.1.0","@edgefirst-dev/jwt":"^1.3.0","@arethetypeswrong/cli":"^0.18.2","@standard-schema/spec":"^1.1.0","@edgefirst-dev/batcher":"^1.0.1","@testing-library/react":"^16.3.2","@remix-run/file-storage":"^0.13.3","typedoc-plugin-mdn-links":"^5.1.1","@testing-library/jest-dom":"^6.9.1","@total-typescript/tsconfig":"^1.0.4","intl-parse-accept-language":"^1.0.0","@testing-library/user-event":"^14.6.1","@edgefirst-dev/server-timing":"^0.0.1","@happy-dom/global-registrator":"^20.8.3"},"peerDependencies":{"is-ip":"^5.0.1","react":"^18.0.0 || ^19.0.0","react-router":"^7.0.0","@oslojs/crypto":"^1.0.1","@oslojs/encoding":"^1.1.0","@edgefirst-dev/jwt":"^1.2.0","@standard-schema/spec":"^1.0.0","@edgefirst-dev/batcher":"^1.0.0","intl-parse-accept-language":"^1.0.0","@edgefirst-dev/server-timing":"^0.0.1"},"peerDependenciesMeta":{"is-ip":{"optional":true},"react":{"optional":true},"react-router":{"optional":true},"@oslojs/crypto":{"optional":true},"@oslojs/encoding":{"optional":true},"@edgefirst-dev/jwt":{"optional":true},"@standard-schema/spec":{"optional":true},"@edgefirst-dev/batcher":{"optional":true},"intl-parse-accept-language":{"optional":true},"@edgefirst-dev/server-timing":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/remix-utils_9.3.1_1773244808036_0.9317262269891426","host":"s3://npm-registry-packages-npm-production"}},"10.0.0":{"name":"remix-utils","version":"10.0.0","keywords":["client IP address","client locale","client-only","cors","csrf","hydrated","json hash","named action","prefetch","react","redirect-back","remix","remix.run","request","response","rolling cookie","safe redirect","server-only","typed cookie","typed session","utils"],"license":"MIT","author":{"name":"Sergio Xalambrí","email":"hello@sergiodxa.com","url":"https://sergiodxa.com"},"repository":{"type":"git","url":"git+https://github.com/sergiodxa/remix-utils.git"},"funding":["https://github.com/sponsors/sergiodxa"],"type":"module","sideEffects":false,"exports":{"./package.json":"./package.json","./middleware/basic-auth":{"types":"./build/server/middleware/basic-auth.d.ts","default":"./build/server/middleware/basic-auth.js"},"./middleware/batcher":{"types":"./build/server/middleware/batcher.d.ts","default":"./build/server/middleware/batcher.js"},"./middleware/context-storage":{"types":"./build/server/middleware/context-storage.d.ts","default":"./build/server/middleware/context-storage.js"},"./middleware/cors":{"types":"./build/server/middleware/cors.d.ts","default":"./build/server/middleware/cors.js"},"./middleware/csrf":{"types":"./build/server/middleware/csrf.d.ts","default":"./build/server/middleware/csrf.js"},"./middleware/csrf-token":{"types":"./build/server/middleware/csrf-token.d.ts","default":"./build/server/middleware/csrf-token.js"},"./middleware/honeypot":{"types":"./build/server/middleware/honeypot.d.ts","default":"./build/server/middleware/honeypot.js"},"./middleware/jwk-auth":{"types":"./build/server/middleware/jwk-auth.d.ts","default":"./build/server/middleware/jwk-auth.js"},"./middleware/logger":{"types":"./build/server/middleware/logger.d.ts","default":"./build/server/middleware/logger.js"},"./middleware/request-id":{"types":"./build/server/middleware/request-id.d.ts","default":"./build/server/middleware/request-id.js"},"./middleware/rolling-cookie":{"types":"./build/server/middleware/rolling-cookie.d.ts","default":"./build/server/middleware/rolling-cookie.js"},"./middleware/secure-headers":{"types":"./build/server/middleware/secure-headers.d.ts","default":"./build/server/middleware/secure-headers.js"},"./middleware/server-timing":{"types":"./build/server/middleware/server-timing.d.ts","default":"./build/server/middleware/server-timing.js"},"./middleware/session":{"types":"./build/server/middleware/session.d.ts","default":"./build/server/middleware/session.js"},"./middleware/singleton":{"types":"./build/server/middleware/singleton.d.ts","default":"./build/server/middleware/singleton.js"},"./promise":{"types":"./build/common/promise.d.ts","default":"./build/common/promise.js"},"./cache-assets":{"types":"./build/client/cache-assets.d.ts","default":"./build/client/cache-assets.js"},"./cors":{"types":"./build/server/cors.d.ts","default":"./build/server/cors.js"},"./get-client-ip-address":{"types":"./build/server/get-client-ip-address.d.ts","default":"./build/server/get-client-ip-address.js"},"./is-prefetch":{"types":"./build/server/is-prefetch.d.ts","default":"./build/server/is-prefetch.js"},"./json-hash":{"types":"./build/server/json-hash.d.ts","default":"./build/server/json-hash.js"},"./named-action":{"types":"./build/server/named-action.d.ts","default":"./build/server/named-action.js"},"./parse-accept-header":{"types":"./build/server/parse-accept-header.d.ts","default":"./build/server/parse-accept-header.js"},"./preload-route-assets":{"types":"./build/server/preload-route-assets.d.ts","default":"./build/server/preload-route-assets.js"},"./redirect-back":{"types":"./build/server/redirect-back.d.ts","default":"./build/server/redirect-back.js"},"./respond-to":{"types":"./build/server/respond-to.d.ts","default":"./build/server/respond-to.js"},"./responses":{"types":"./build/server/responses.d.ts","default":"./build/server/responses.js"},"./rolling-cookie":{"types":"./build/server/rolling-cookie.d.ts","default":"./build/server/rolling-cookie.js"},"./safe-redirect":{"types":"./build/server/safe-redirect.d.ts","default":"./build/server/safe-redirect.js"},"./typed-cookie":{"types":"./build/server/typed-cookie.d.ts","default":"./build/server/typed-cookie.js"},"./client-only":{"types":"./build/react/client-only.d.ts","default":"./build/react/client-only.js"},"./existing-search-params":{"types":"./build/react/existing-search-params.d.ts","default":"./build/react/existing-search-params.js"},"./external-scripts":{"types":"./build/react/external-scripts.d.ts","default":"./build/react/external-scripts.js"},"./fetcher-type":{"types":"./build/react/fetcher-type.d.ts","default":"./build/react/fetcher-type.js"},"./server-only":{"types":"./build/react/server-only.d.ts","default":"./build/react/server-only.js"},"./use-debounce-fetcher":{"types":"./build/react/use-debounce-fetcher.d.ts","default":"./build/react/use-debounce-fetcher.js"},"./use-debounce-submit":{"types":"./build/react/use-debounce-submit.d.ts","default":"./build/react/use-debounce-submit.js"},"./use-delegated-anchors":{"types":"./build/react/use-delegated-anchors.d.ts","default":"./build/react/use-delegated-anchors.js"},"./use-global-navigation-state":{"types":"./build/react/use-global-navigation-state.d.ts","default":"./build/react/use-global-navigation-state.js"},"./use-hydrated":{"types":"./build/react/use-hydrated.d.ts","default":"./build/react/use-hydrated.js"},"./use-should-hydrate":{"types":"./build/react/use-should-hydrate.d.ts","default":"./build/react/use-should-hydrate.js"},"./sse/server":{"types":"./build/server/event-stream.d.ts","default":"./build/server/event-stream.js"},"./sse/react":{"types":"./build/react/use-event-source.d.ts","default":"./build/react/use-event-source.js"},"./locales/server":{"types":"./build/server/get-client-locales.d.ts","default":"./build/server/get-client-locales.js"},"./locales/react":{"types":"./build/react/use-locales.d.ts","default":"./build/react/use-locales.js"},"./honeypot/server":{"types":"./build/server/honeypot.d.ts","default":"./build/server/honeypot.js"},"./honeypot/react":{"types":"./build/react/honeypot.d.ts","default":"./build/react/honeypot.js"},"./csrf/server":{"types":"./build/server/csrf.d.ts","default":"./build/server/csrf.js"},"./csrf/react":{"types":"./build/react/authenticity-token.d.ts","default":"./build/react/authenticity-token.js"},"./sec-fetch":{"types":"./build/server/sec-fetch.d.ts","default":"./build/server/sec-fetch.js"},"./timers":{"types":"./build/common/timers.d.ts","default":"./build/common/timers.js"}},"scripts":{"build":"tsc","build:registry":"shadcn build","build:docs":"typedoc && shadcn build --output pages/r","typecheck":"tsc --noEmit","lint":"oxlint --ignore-path .gitignore --deny-warnings .","lint:fix":"oxlint --ignore-path .gitignore --deny-warnings --fix .","format":"oxfmt --check .","format:fix":"oxfmt .","quality":"bun run lint && bun run format","quality:fix":"bun run lint:fix && bun run format:fix","exports":"bun run ./scripts/exports.ts"},"devDependencies":{"@arethetypeswrong/cli":"^0.18.2","@edgefirst-dev/batcher":"^1.0.1","@edgefirst-dev/jwt":"^1.3.0","@edgefirst-dev/server-timing":"^0.0.1","@happy-dom/global-registrator":"^20.8.3","@oslojs/crypto":"^1.0.1","@oslojs/encoding":"^1.1.0","@remix-run/file-storage":"^0.13.3","@standard-schema/spec":"^1.1.0","@testing-library/jest-dom":"^6.9.1","@testing-library/react":"^16.3.2","@testing-library/user-event":"^14.6.1","@total-typescript/tsconfig":"^1.0.4","@types/bun":"^1.3.10","@types/react":"^19.2.14","intl-parse-accept-language":"^1.0.0","is-ip":"5.0.1","msw":"^2.12.10","oxfmt":"^0.37.0","oxlint":"^1.52.0","react":"^19.2.7","react-dom":"^19.2.7","react-router":"^8.0.0","shadcn":"^4.0.3","ts-node":"^10.9.2","typedoc":"^0.28.17","typedoc-plugin-mdn-links":"^5.1.1","typescript":"^5.9.3","zod":"^4.3.6"},"peerDependencies":{"@edgefirst-dev/batcher":"^1.0.0","@edgefirst-dev/jwt":"^1.2.0","@edgefirst-dev/server-timing":"^0.0.1","@oslojs/crypto":"^1.0.1","@oslojs/encoding":"^1.1.0","@standard-schema/spec":"^1.0.0","intl-parse-accept-language":"^1.0.0","is-ip":"^5.0.1","react":">=19.2.7","react-router":"^8.0.0"},"peerDependenciesMeta":{"@edgefirst-dev/batcher":{"optional":true},"@edgefirst-dev/jwt":{"optional":true},"@edgefirst-dev/server-timing":{"optional":true},"@oslojs/crypto":{"optional":true},"@oslojs/encoding":{"optional":true},"@standard-schema/spec":{"optional":true},"react-router":{"optional":true},"intl-parse-accept-language":{"optional":true},"is-ip":{"optional":true},"react":{"optional":true}},"engines":{"node":">=22.22.0"},"gitHead":"5b9ec11b61b7ae6e4a51321b8ba6a4fed9f62702","_id":"remix-utils@10.0.0","description":"This package contains simple utility functions to use with [React Router](https://reactrouter.com/).","bugs":{"url":"https://github.com/sergiodxa/remix-utils/issues"},"homepage":"https://github.com/sergiodxa/remix-utils#readme","_nodeVersion":"24.16.0","_npmVersion":"11.13.0","dist":{"integrity":"sha512-v5voIsJQof6e/1m8te4qyH5YXATWxv+zEgbxd98CwtVxRLCXVc+P9rQ2uDRRYPLCvF9A2ZBOizK0ZTUfm4qJpw==","shasum":"c9dd3c0d89484a84748efb44df9bcf36bbdc2d79","tarball":"https://registry.npmjs.org/remix-utils/-/remix-utils-10.0.0.tgz","fileCount":174,"unpackedSize":663767,"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/remix-utils@10.0.0","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"signatures":[{"keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U","sig":"MEYCIQCdhaNXcRKQfsj9Z0ts/DELQ8VyjTmGjR7FAT8a5weSUgIhAORSAIt0GLp+DRiJgyooFmIPAbAXp1/ewx74gV0Eb5VW"}]},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:fa0665cd-01bc-4461-8821-82da60eb6f73"}},"directories":{},"maintainers":[{"name":"sergiodxa","email":"hello@sergiodxa.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages-npm-production","tmp":"tmp/remix-utils_10.0.0_1781934809286_0.10624946328347895"},"_hasShrinkwrap":false}},"time":{"created":"2021-05-03T20:24:11.701Z","modified":"2026-06-20T05:53:29.718Z","1.0.2":"2021-05-03T20:24:11.857Z","2.0.0":"2021-11-04T18:31:33.454Z","2.0.1":"2021-11-09T17:05:00.902Z","2.1.0":"2021-11-23T07:30:36.978Z","2.1.1":"2021-11-25T04:09:49.817Z","2.1.2":"2021-11-26T23:13:19.507Z","2.1.3":"2021-11-26T23:20:20.661Z","2.2.0":"2021-12-18T07:55:25.675Z","2.3.0":"2021-12-22T23:24:19.095Z","2.4.0":"2021-12-30T02:50:30.431Z","2.5.0":"2022-02-06T04:12:58.862Z","2.6.0":"2022-03-03T19:19:31.732Z","2.7.0":"2022-03-03T20:00:51.315Z","2.8.0":"2022-03-10T21:02:35.776Z","2.9.0":"2022-03-16T19:36:05.090Z","2.10.0":"2022-03-21T19:51:32.774Z","2.11.0":"2022-03-25T22:20:27.100Z","2.11.1":"2022-03-25T22:43:16.872Z","3.0.0":"2022-04-06T22:52:30.409Z","3.1.0":"2022-04-29T06:03:35.925Z","3.2.0":"2022-05-11T17:51:09.409Z","3.3.0":"2022-06-04T16:56:40.704Z","3.4.0":"2022-10-22T17:31:35.427Z","4.0.0":"2022-11-10T17:02:58.412Z","4.1.0":"2022-11-14T17:22:04.682Z","4.2.0":"2022-11-25T21:47:31.979Z","4.2.1":"2022-11-25T23:09:52.858Z","4.3.0":"2022-12-01T20:26:01.821Z","4.4.0":"2022-12-09T22:22:40.891Z","5.0.0":"2022-12-10T21:31:17.283Z","5.0.1":"2022-12-12T15:37:41.571Z","5.1.0":"2022-12-13T04:44:47.942Z","5.2.0":"2023-01-06T00:44:24.673Z","5.2.1":"2023-01-06T19:44:38.618Z","5.3.0":"2023-01-12T06:57:58.189Z","6.0.0":"2023-01-12T22:57:08.343Z","6.1.0":"2023-04-03T17:19:31.455Z","6.3.0":"2023-05-02T20:09:11.700Z","6.4.0":"2023-06-09T22:06:31.928Z","6.4.1":"2023-06-13T03:07:07.705Z","6.5.0":"2023-06-28T23:45:56.436Z","6.6.0":"2023-07-03T22:19:07.565Z","7.0.0":"2023-08-24T21:36:53.832Z","7.0.0-pre.1":"2023-08-25T17:28:55.541Z","7.0.0-pre.2":"2023-08-25T21:38:34.373Z","7.0.0-pre.3":"2023-08-28T05:20:31.787Z","7.0.0-pre.4":"2023-10-04T21:21:59.945Z","7.0.0-pre.5":"2023-10-06T04:46:47.451Z","7.0.0-pre.6":"2023-10-06T05:50:13.303Z","7.0.0-pre.7":"2023-10-06T05:51:36.407Z","7.0.1":"2023-10-06T06:02:56.270Z","7.0.2":"2023-10-06T18:18:07.924Z","7.1.0":"2023-10-13T23:50:08.923Z","7.2.0":"2023-11-24T16:46:36.523Z","7.3.0":"2023-11-25T06:19:51.714Z","7.4.0":"2023-12-19T05:39:33.697Z","7.5.0":"2023-12-31T02:42:59.597Z","7.6.0":"2024-04-08T17:36:34.755Z","7.7.0":"2024-09-20T06:49:50.691Z","8.0.0":"2024-12-12T23:44:35.134Z","8.1.0":"2025-01-20T22:11:06.719Z","8.1.1":"2025-03-04T18:12:38.938Z","8.2.0":"2025-03-08T07:47:30.692Z","8.3.0":"2025-03-11T06:07:50.952Z","8.3.1":"2025-03-11T06:51:51.439Z","8.4.0":"2025-03-13T15:48:43.582Z","8.4.1":"2025-03-17T18:35:00.665Z","8.5.0":"2025-03-18T04:46:40.748Z","8.6.0":"2025-05-10T01:24:20.951Z","8.7.0":"2025-05-10T05:02:25.838Z","8.8.0":"2025-07-31T18:14:00.302Z","9.0.0":"2025-09-22T05:45:16.851Z","9.0.1":"2026-01-29T17:18:48.420Z","9.1.0":"2026-02-28T07:31:45.767Z","9.2.0":"2026-03-06T03:59:29.410Z","9.3.0":"2026-03-11T05:34:44.126Z","9.3.1":"2026-03-11T16:00:08.229Z","10.0.0":"2026-06-20T05:53:29.446Z"},"bugs":{"url":"https://github.com/sergiodxa/remix-utils/issues"},"author":{"name":"Sergio Xalambrí","email":"hello@sergiodxa.com","url":"https://sergiodxa.com"},"license":"MIT","homepage":"https://github.com/sergiodxa/remix-utils#readme","keywords":["client IP address","client locale","client-only","cors","csrf","hydrated","json hash","named action","prefetch","react","redirect-back","remix","remix.run","request","response","rolling cookie","safe redirect","server-only","typed cookie","typed session","utils"],"repository":{"type":"git","url":"git+https://github.com/sergiodxa/remix-utils.git"},"description":"This package contains simple utility functions to use with [React Router](https://reactrouter.com/).","maintainers":[{"name":"sergiodxa","email":"hello@sergiodxa.com"}],"readme":"# Remix Utils\n\nThis package contains simple utility functions to use with [React Router](https://reactrouter.com/).\n\n## Installation\n\n```bash\nnpm install remix-utils\n```\n\n### Shadcn Registry\n\nAdd this to your `components.json`:\n\n```json\n{\n\t\"registries\": {\n\t\t\"@remix-utils\": \"https://sergiodxa.github.io/remix-utils/r/{name}.json\"\n\t}\n}\n```\n\nThen install any utility with `bunx shadcn@latest add @remix-utils/<item>`.\n\nAdditional optional dependencies may be needed, all optional dependencies are:\n\n- `react-router`\n- `@edgefirst-dev/batcher`\n- `@edgefirst-dev/jwt`\n- `@edgefirst-dev/server-timing`\n- `@oslojs/crypto`\n- `@oslojs/encoding`\n- `is-ip`\n- `intl-parse-accept-language`\n- `react`\n\n> [!NOTE]\n> Install optional dependencies only when needed. Use `npm add <dependency>`, for example `npm add react-router`.\n\nThe utils that require an extra optional dependency mention it in their documentation.\n\nIf you want to install them all run:\n\n```sh\nnpm add @edgefirst-dev/batcher @edgefirst-dev/jwt @edgefirst-dev/server-timing @oslojs/crypto @oslojs/encoding is-ip intl-parse-accept-language\n```\n\nReact and React Router packages should be already installed in your project.\n\n> [!IMPORTANT]\n> Remix Utils requires **React Router v8**, which itself requires **React ≥19.2.7** and **Node ≥22.22.0**. If your app is still on React Router v7, stay on Remix Utils 9.x.\n\n## Upgrade from Remix Utils v6\n\nCheck the [v6 to v7 upgrade guide](./docs/v6-to-v7.md).\n\n## API Reference\n\n### promiseHash\n\n> [!NOTE]\n> Install using `bunx shadcn@latest add @remix-utils/promise`.\n\nThe `promiseHash` function is not directly related to Remix but it's a useful function when working with loaders and actions.\n\nThis function is an object version of `Promise.all` which lets you pass an object with promises and get an object with the same keys with the resolved values.\n\n```ts\nimport { promiseHash } from \"remix-utils/promise\";\n\nexport async function loader({ request }: Route.LoaderArgs) {\n\treturn json(\n\t\tawait promiseHash({\n\t\t\tuser: getUser(request),\n\t\t\tposts: getPosts(request),\n\t\t}),\n\t);\n}\n```\n\nYou can use nested `promiseHash` to get a nested object with resolved values.\n\n```ts\nimport { promiseHash } from \"remix-utils/promise\";\n\nexport async function loader({ request }: Route.LoaderArgs) {\n\treturn json(\n\t\tawait promiseHash({\n\t\t\tuser: getUser(request),\n\t\t\tposts: promiseHash({\n\t\t\t\tlist: getPosts(request),\n\t\t\t\tcomments: promiseHash({\n\t\t\t\t\tlist: getComments(request),\n\t\t\t\t\tlikes: getLikes(request),\n\t\t\t\t}),\n\t\t\t}),\n\t\t}),\n\t);\n}\n```\n\n### timeout\n\n> [!NOTE]\n> Install using `bunx shadcn@latest add @remix-utils/promise`.\n\nThe `timeout` function lets you attach a timeout to any promise, if the promise doesn't resolve or reject before the timeout, it will reject with a `TimeoutError`.\n\n```ts\nimport { timeout } from \"remix-utils/promise\";\n\ntry {\n\tlet result = await timeout(fetch(\"https://example.com\"), { ms: 100 });\n} catch (error) {\n\tif (error instanceof TimeoutError) {\n\t\t// Handle timeout\n\t}\n}\n```\n\nHere the fetch needs to happen in less than 100ms, otherwise it will throw a `TimeoutError`.\n\nIf the promise is cancellable with an AbortSignal you can pass the AbortController to the `timeout` function.\n\n```ts\nimport { timeout } from \"remix-utils/promise\";\n\ntry {\n\tlet controller = new AbortController();\n\tlet result = await timeout(fetch(\"https://example.com\", { signal: controller.signal }), {\n\t\tms: 100,\n\t\tcontroller,\n\t});\n} catch (error) {\n\tif (error instanceof TimeoutError) {\n\t\t// Handle timeout\n\t}\n}\n```\n\nHere after 100ms, `timeout` will call `controller.abort()` which will mark the `controller.signal` as aborted.\n\n### cacheAssets\n\n> [!NOTE]\n> Install using `bunx shadcn@latest add @remix-utils/cache-assets`.\n\n> [!NOTE]\n> This can only be run inside `entry.client`.\n\nThis function lets you easily cache inside the [browser's Cache Storage](https://developer.mozilla.org/en-US/docs/Web/API/CacheStorage) every JS file built by Remix.\n\nTo use it, open your `entry.client` file and add this:\n\n```ts\nimport { cacheAssets } from \"remix-utils/cache-assets\";\n\ncacheAssets().catch((error) => {\n\t// do something with the error, or not\n});\n```\n\nThe function receives an optional options object with two options:\n\n- `cacheName` is the name of the [Cache object](https://developer.mozilla.org/en-US/docs/Web/API/Cache) to use, the default value is `assets`.\n- `buildPath` is the pathname prefix for all Remix built assets, the default value is `/build/` which is the default build path of Remix itself.\n\nIt's important that if you changed your build path in `remix.config.js` you pass the same value to `cacheAssets` or it will not find your JS files.\n\nThe `cacheName` can be left as is unless you're adding a Service Worker to your app and want to share the cache.\n\n```ts\nimport { cacheAssets } from \"remix-utils/cache-assets\";\n\ncacheAssests({ cacheName: \"assets\", buildPath: \"/build/\" }).catch((error) => {\n\t// do something with the error, or not\n});\n```\n\n### ClientOnly\n\n> [!NOTE]\n> Install using `bunx shadcn@latest add @remix-utils/client-only`.\n\n> [!NOTE]\n> This depends on `react`.\n\nThe ClientOnly component lets you render the children element only on the client-side, avoiding rendering it the server-side.\n\nYou can provide a fallback component to be used on SSR, and while optional, it's highly recommended to provide one to avoid content layout shift issues.\n\n```tsx\nimport { ClientOnly } from \"remix-utils/client-only\";\n\nexport default function Component() {\n\treturn (\n\t\t<ClientOnly fallback={<SimplerStaticVersion />}>\n\t\t\t{() => <ComplexComponentNeedingBrowserEnvironment />}\n\t\t</ClientOnly>\n\t);\n}\n```\n\nThis component is handy when you have some complex component that needs a browser environment to work, like a chart or a map. This way, you can avoid rendering it server-side and instead use a simpler static version like an SVG or even a loading UI.\n\nThe rendering flow will be:\n\n- SSR: Always render the fallback.\n- CSR First Render: Always render the fallback.\n- CSR Update: Update to render the actual component.\n- CSR Future Renders: Always render the actual component, don't bother to render the fallback.\n\nThis component uses the `useHydrated` hook internally.\n\n### ServerOnly\n\n> [!NOTE]\n> Install using `bunx shadcn@latest add @remix-utils/server-only`.\n\n> [!NOTE]\n> This depends on `react`.\n\nThe ServerOnly component is the opposite of the ClientOnly component, it lets you render the children element only on the server-side, avoiding rendering it the client-side.\n\nYou can provide a fallback component to be used on CSR, and while optional, it's highly recommended to provide one to avoid content layout shift issues, unless you only render visually hidden elements.\n\n```tsx\nimport { ServerOnly } from \"remix-utils/server-only\";\n\nexport default function Component() {\n\treturn (\n\t\t<ServerOnly fallback={<ComplexComponentNeedingBrowserEnvironment />}>\n\t\t\t{() => <SimplerStaticVersion />}\n\t\t</ServerOnly>\n\t);\n}\n```\n\nThis component is handy to render some content only on the server-side, like a hidden input you can later use to know if JS has loaded.\n\nConsider it like the `<noscript>` HTML tag but it can work even if JS failed to load but it's enabled on the browser.\n\nThe rendering flow will be:\n\n- SSR: Always render the children.\n- CSR First Render: Always render the children.\n- CSR Update: Update to render the fallback component (if defined).\n- CSR Future Renders: Always render the fallback component, don't bother to render the children.\n\nThis component uses the `useHydrated` hook internally.\n\n### CORS\n\n> [!NOTE]\n> Install using `bunx shadcn@latest add @remix-utils/cors`.\n\nThe CORS function let you implement CORS headers on your loaders and actions so you can use them as an API for other client-side applications.\n\nThere are two main ways to use the `cors` function.\n\n1. Use it on each loader/action where you want to enable it.\n2. Use it globally on entry.server handleRequest and handleDataRequest export.\n\nIf you want to use it on every loader/action, you can do it like this:\n\n```ts\nimport { cors } from \"remix-utils/cors\";\n\nexport async function loader({ request }: Route.LoaderArgs) {\n\tlet data = await getData(request);\n\tlet response = json<LoaderData>(data);\n\treturn await cors(request, response);\n}\n```\n\nYou could also do the `json` and `cors` call in one line.\n\n```ts\nimport { cors } from \"remix-utils/cors\";\n\nexport async function loader({ request }: Route.LoaderArgs) {\n\tlet data = await getData(request);\n\treturn await cors(request, json<LoaderData>(data));\n}\n```\n\nAnd because `cors` mutates the response, you can also call it and later return.\n\n```ts\nimport { cors } from \"remix-utils/cors\";\n\nexport async function loader({ request }: Route.LoaderArgs) {\n\tlet data = await getData(request);\n\tlet response = json<LoaderData>(data);\n\tawait cors(request, response); // this mutates the Response object\n\treturn response; // so you can return it here\n}\n```\n\nIf you want to setup it globally once, you can do it like this in `entry.server`\n\n```tsx\nimport { cors } from \"remix-utils/cors\";\n\nconst ABORT_DELAY = 5000;\n\nexport default function handleRequest(\n\trequest: Request,\n\tresponseStatusCode: number,\n\tresponseHeaders: Headers,\n\tremixContext: EntryContext,\n) {\n\tlet callbackName = isbot(request.headers.get(\"user-agent\")) ? \"onAllReady\" : \"onShellReady\";\n\n\treturn new Promise((resolve, reject) => {\n\t\tlet didError = false;\n\n\t\tlet { pipe, abort } = renderToPipeableStream(\n\t\t\t<RemixServer context={remixContext} url={request.url} />,\n\t\t\t{\n\t\t\t\t[callbackName]: () => {\n\t\t\t\t\tlet body = new PassThrough();\n\n\t\t\t\t\tresponseHeaders.set(\"Content-Type\", \"text/html\");\n\n\t\t\t\t\tcors(\n\t\t\t\t\t\trequest,\n\t\t\t\t\t\tnew Response(body, {\n\t\t\t\t\t\t\theaders: responseHeaders,\n\t\t\t\t\t\t\tstatus: didError ? 500 : responseStatusCode,\n\t\t\t\t\t\t}),\n\t\t\t\t\t).then((response) => {\n\t\t\t\t\t\tresolve(response);\n\t\t\t\t\t});\n\n\t\t\t\t\tpipe(body);\n\t\t\t\t},\n\t\t\t\tonShellError: (err: unknown) => {\n\t\t\t\t\treject(err);\n\t\t\t\t},\n\t\t\t\tonError: (error: unknown) => {\n\t\t\t\t\tdidError = true;\n\n\t\t\t\t\tconsole.error(error);\n\t\t\t\t},\n\t\t\t},\n\t\t);\n\n\t\tsetTimeout(abort, ABORT_DELAY);\n\t});\n}\n\nexport let handleDataRequest: HandleDataRequestFunction = async (response, { request }) => {\n\treturn await cors(request, response);\n};\n```\n\n#### Options\n\nAdditionally, the `cors` function accepts a `options` object as a third optional argument. These are the options.\n\n- `origin`: Configures the **Access-Control-Allow-Origin** CORS header.\n  Possible values are:\n  - `true`: Enable CORS for any origin (same as \"\\*\")\n  - `false`: Don't setup CORS\n  - `string`: Set to a specific origin, if set to \"\\*\" it will allow any origin\n  - `RegExp`: Set to a RegExp to match against the origin\n  - `Array<string | RegExp>`: Set to an array of origins to match against the\n    string or RegExp\n  - `Function`: Set to a function that will be called with the request origin\n    and should return a boolean indicating if the origin is allowed or not.\n    The default value is `true`.\n- `methods`: Configures the **Access-Control-Allow-Methods** CORS header.\n  The default value is `[\"GET\", \"HEAD\", \"PUT\", \"PATCH\", \"POST\", \"DELETE\"]`.\n- `allowedHeaders`: Configures the **Access-Control-Allow-Headers** CORS header.\n- `exposedHeaders`: Configures the **Access-Control-Expose-Headers** CORS header.\n- `credentials`: Configures the **Access-Control-Allow-Credentials** CORS header.\n- `maxAge`: Configures the **Access-Control-Max-Age** CORS header.\n\n### CSRF\n\n> [!NOTE]\n> Install using `bunx shadcn@latest add @remix-utils/csrf-server` and `bunx shadcn@latest add @remix-utils/csrf-react`.\n\n> [!NOTE]\n> This depends on `react`, `@oslojs/crypto`, `@oslojs/encoding`, and React Router.\n\nThe CSRF related functions let you implement CSRF protection on your application.\n\nThis part of Remix Utils needs React and server-side code.\n\nFirst create a new CSRF instance.\n\n```ts\n// app/utils/csrf.server.ts\nimport { CSRF } from \"remix-utils/csrf/server\";\nimport { createCookie } from \"react-router\"; // or cloudflare/deno\n\nexport const cookie = createCookie(\"csrf\", {\n\tpath: \"/\",\n\thttpOnly: true,\n\tsecure: process.env.NODE_ENV === \"production\",\n\tsameSite: \"lax\",\n\tsecrets: [\"s3cr3t\"],\n});\n\nexport const csrf = new CSRF({\n\tcookie,\n\t// what key in FormData objects will be used for the token, defaults to `csrf`\n\tformDataKey: \"csrf\",\n\t// an optional secret used to sign the token, recommended for extra safety\n\tsecret: \"s3cr3t\",\n});\n```\n\nThen you can use `csrf` to generate a new token.\n\n```ts\nimport { csrf } from \"~/utils/csrf.server\";\n\nexport async function loader({ request }: Route.LoaderArgs) {\n\tlet token = csrf.generate();\n}\n```\n\nYou can customize the token size by passing the byte size, the default one is 32 bytes which will give you a string with a length of 43 after encoding.\n\n```ts\nlet token = csrf.generate(64); // customize token length\n```\n\nYou will need to save this token in a cookie and also return it from the loader. For convenience, you can use the `CSRF#commitToken` helper.\n\n```ts\nimport { csrf } from \"~/utils/csrf.server\";\n\nexport async function loader({ request }: Route.LoaderArgs) {\n\tlet [token, cookieHeader] = await csrf.commitToken(request);\n\treturn json({ token }, { headers: { \"set-cookie\": cookieHeader } });\n}\n```\n\n> [!NOTE]\n> You could do this on any route, but I recommend you to do it on the `root` loader.\n\nNow that you returned the token and set it in a cookie, you can use the `AuthenticityTokenProvider` component to provide the token to your React components.\n\n```tsx\nimport { AuthenticityTokenProvider } from \"remix-utils/csrf/react\";\n\nlet { csrf } = useLoaderData<LoaderData>();\nreturn (\n\t<AuthenticityTokenProvider token={csrf}>\n\t\t<Outlet />\n\t</AuthenticityTokenProvider>\n);\n```\n\nRender it in your `root` component and wrap the `Outlet` with it.\n\nWhen you create a form in some route, you can use the `AuthenticityTokenInput` component to add the authenticity token to the form.\n\n```tsx\nimport { Form } from \"react-router\";\nimport { AuthenticityTokenInput } from \"remix-utils/csrf/react\";\n\nexport default function Component() {\n\treturn (\n\t\t<Form method=\"post\">\n\t\t\t<AuthenticityTokenInput />\n\t\t\t<input type=\"text\" name=\"something\" />\n\t\t</Form>\n\t);\n}\n```\n\nNote that the authenticity token is only really needed for a form that mutates the data somehow. If you have a search form making a GET request, you don't need to add the authenticity token there.\n\nThis `AuthenticityTokenInput` will get the authenticity token from the `AuthenticityTokenProvider` component and add it to the form as the value of a hidden input with the name `csrf`. You can customize the field name using the `name` prop.\n\n```tsx\n<AuthenticityTokenInput name=\"customName\" />\n```\n\nYou should only customize the name if you also changed it on `createAuthenticityToken`.\n\nIf you need to use `useFetcher` (or `useSubmit`) instead of `Form` you can also get the authenticity token with the `useAuthenticityToken` hook.\n\n```tsx\nimport { useFetcher } from \"react-router\";\nimport { useAuthenticityToken } from \"remix-utils/csrf/react\";\n\nexport function useMarkAsRead() {\n\tlet fetcher = useFetcher();\n\tlet csrf = useAuthenticityToken();\n\treturn function submit(data) {\n\t\tfetcher.submit({ csrf, ...data }, { action: \"/api/mark-as-read\", method: \"post\" });\n\t};\n}\n```\n\nFinally, you need to validate the authenticity token in the action that received the request.\n\n```ts\nimport { CSRFError } from \"remix-utils/csrf/server\";\nimport { redirectBack } from \"remix-utils/redirect-back\";\nimport { csrf } from \"~/utils/csrf.server\";\n\nexport async function action({ request }: Route.ActionArgs) {\n\ttry {\n\t\tawait csrf.validate(request);\n\t} catch (error) {\n\t\tif (error instanceof CSRFError) {\n\t\t\t// handle CSRF errors\n\t\t}\n\t\t// handle other possible errors\n\t}\n\n\t// here you know the request is valid\n\treturn redirectBack(request, { fallback: \"/fallback\" });\n}\n```\n\nIf you need to parse the body as FormData yourself (e.g. to support file uploads) you can also call `CSRF#validate` with the FormData and Headers objects.\n\n```ts\nlet formData = await parseMultiPartFormData(request);\ntry {\n\tawait csrf.validate(formData, request.headers);\n} catch (error) {\n\t// handle errors\n}\n```\n\n> [!WARNING]\n> If you call `CSRF#validate` with the request instance, but you already read its body, it will throw an error.\n\nIn case the CSRF validation fails, it will throw a `CSRFError` which can be used to correctly identify it against other possible errors that may get thrown.\n\nThe list of possible error messages are:\n\n- `missing_token_in_cookie`: The request is missing the CSRF token in the cookie.\n- `invalid_token_in_cookie`: The CSRF token is not valid (is not a string).\n- `tampered_token_in_cookie`: The CSRF token doesn't match the signature.\n- `missing_token_in_body`: The request is missing the CSRF token in the body (FormData).\n- `mismatched_token`: The CSRF token in the cookie and the body don't match.\n\nYou can use `error.code` to check one of the error codes above, and `error.message` to get a human friendly description.\n\n> [!WARNING]\n> Don't send those error messages to the end-user, they are meant to be used for debugging purposes only.\n\n### Existing Search Params\n\n> [!NOTE]\n> Install using `bunx shadcn@latest add @remix-utils/existing-search-params`.\n\n```ts\nimport { ExistingSearchParams } from \"remix-utils/existing-search-params\";\n```\n\n> [!NOTE]\n> This depends on `react` and `react-router`\n\nWhen you submit a GET form, the browser will replace all of the search params in the URL with your form data. This component copies existing search params into hidden inputs so they will not be overwritten.\n\nThe `exclude` prop accepts an array of search params to exclude from the hidden inputs\n\n- add params handled by this form to this list\n- add params from other forms you want to clear on submit\n\nFor example, imagine a table of data with separate form components for pagination and filtering and searching. Changing the page number should not affect the search or filter params.\n\n```tsx\n<Form>\n\t<ExistingSearchParams exclude={[\"page\"]} />\n\t<button type=\"submit\" name=\"page\" value=\"1\">\n\t\t1\n\t</button>\n\t<button type=\"submit\" name=\"page\" value=\"2\">\n\t\t2\n\t</button>\n\t<button type=\"submit\" name=\"page\" value=\"3\">\n\t\t3\n\t</button>\n</Form>\n```\n\nBy excluding the `page` param, from the search form, the user will return to the first page of search result.\n\n```tsx\n<Form>\n\t<ExistingSearchParams exclude={[\"q\", \"page\"]} />\n\t<input type=\"search\" name=\"q\" />\n\t<button type=\"submit\">Search</button>\n</Form>\n```\n\n### External Scripts\n\n> [!NOTE]\n> Install using `bunx shadcn@latest add @remix-utils/external-scripts`.\n\n> [!NOTE]\n> This depends on `react`, and `react-router`.\n\nIf you need to load different external scripts on certain routes, you can use the `ExternalScripts` component together with the `ExternalScriptsFunction` and `ScriptDescriptor` types.\n\nIn the route you want to load the script add a `handle` export with a `scripts` method, type the `handle` to be `ExternalScriptsHandle`. This interface is let's you define `scripts` as either a function or an array.\n\nIf you want to define what scripts to load based on the loader data, you can use `scripts` as a function:\n\n```ts\nimport { ExternalScriptsHandle } from \"remix-utils/external-scripts\";\n\ntype LoaderData = SerializeFrom<typeof loader>;\n\nexport let handle: ExternalScriptsHandle<LoaderData> = {\n  scripts({ id, data, params, matches, location, parentsData }) {\n    return [\n      {\n        src: \"https://unpkg.com/htmx.org@1.9.6\",\n        integrity: \"sha384-FhXw7b6AlE/jyjlZH5iHa/tTe9EpJ1Y55RjcgPbjeWMskSxZt1v9qkxLJWNJaGni\",\n        crossOrigin: 'anonymous\"\n      }\n    ];\n  },\n};\n```\n\nIf the list of scripts to load is static you can define `scripts` as an array directly.\n\n```ts\nimport { ExternalScriptsHandle } from \"remix-utils/external-scripts\";\n\nexport let handle: ExternalScriptsHandle = {\n  scripts: [\n    {\n      src: \"https://unpkg.com/htmx.org@1.9.6\",\n      integrity: \"sha384-FhXw7b6AlE/jyjlZH5iHa/tTe9EpJ1Y55RjcgPbjeWMskSxZt1v9qkxLJWNJaGni\",\n      crossOrigin: 'anonymous\",\n      preload: true, // use it to render a <link rel=\"preload\"> for this script\n    }\n  ],\n};\n```\n\nYou can also import `ExternalScriptsFunction` and `ScriptDescriptor` interfaces yourself to build a custom handle type.\n\n```ts\nimport { ExternalScriptsFunction, ScriptDescriptor } from \"remix-utils/external-scripts\";\n\ninterface AppHandle<LoaderData = unknown> {\n\tscripts?: ExternalScriptsFunction<LoaderData> | ScriptDescriptor[];\n}\n\nexport let handle: AppHandle<LoaderData> = {\n\tscripts, // define scripts as a function or array here\n};\n```\n\nOr you can extend the `ExternalScriptsHandle` interface.\n\n```ts\nimport { ExternalScriptsHandle } from \"remix-utils/external-scripts\";\n\ninterface AppHandle<LoaderData = unknown> extends ExternalScriptsHandle<LoaderData> {\n\t// more handle properties here\n}\n\nexport let handle: AppHandle<LoaderData> = {\n\tscripts, // define scripts as a function or array here\n};\n```\n\n---\n\nThen, in the root route, add the `ExternalScripts` component somewhere, usually you want to load it either inside `<head>` or at the bottom of `<body>`, either before or after the Remix's `<Scripts>` component.\n\nIf your app uses a CSP, pass a `nonce` prop to `ExternalScripts`.\n\nWhere exactly to place `<ExternalScripts />` will depend on your app, but a safe place is at the end of `<body>`.\n\n```tsx\nimport { Links, LiveReload, Meta, Scripts, ScrollRestoration, useNonce } from \"remix\";\nimport { ExternalScripts } from \"remix-utils/external-scripts\";\n\ntype Props = { children: React.ReactNode; title?: string };\n\nexport function Document({ children, title }: Props) {\n\tlet nonce = useNonce();\n\treturn (\n\t\t<html lang=\"en\">\n\t\t\t<head>\n\t\t\t\t<meta charSet=\"utf-8\" />\n\t\t\t\t<meta name=\"viewport\" content=\"width=device-width,initial-scale=1\" />\n\t\t\t\t{title ? <title>{title}</title> : null}\n\t\t\t\t<Meta />\n\t\t\t\t<Links />\n\t\t\t</head>\n\t\t\t<body>\n\t\t\t\t{children}\n\t\t\t\t<ScrollRestoration />\n\t\t\t\t<ExternalScripts nonce={nonce} />\n\t\t\t\t<Scripts />\n\t\t\t\t<LiveReload />\n\t\t\t</body>\n\t\t</html>\n\t);\n}\n```\n\nNow, any script you defined in the ScriptsFunction will be added to the HTML.\n\nYou could use this util together with `useShouldHydrate` to disable Remix scripts in certain routes but still load scripts for analytics or small features that need JS but don't need the full app JS to be enabled.\n\n```tsx\nlet nonce = useNonce();\nlet shouldHydrate = useShouldHydrate();\n\nreturn (\n\t<html lang=\"en\">\n\t\t<head>\n\t\t\t<meta charSet=\"utf-8\" />\n\t\t\t<meta name=\"viewport\" content=\"width=device-width,initial-scale=1\" />\n\t\t\t{title ? <title>{title}</title> : null}\n\t\t\t<Meta />\n\t\t\t<Links />\n\t\t</head>\n\t\t<body>\n\t\t\t{children}\n\t\t\t<ScrollRestoration />\n\t\t\t{shouldHydrate ? <Scripts /> : <ExternalScripts nonce={nonce} />}\n\t\t\t<LiveReload />\n\t\t</body>\n\t</html>\n);\n```\n\n### useGlobalNavigationState\n\n> [!NOTE]\n> Install using `bunx shadcn@latest add @remix-utils/use-global-navigation-state`.\n\n> [!NOTE]\n> This depends on `react`, and `react-router`.\n\nThis hook allows you to read the value of `transition.state`, every `fetcher.state` in the app, and `revalidator.state`.\n\n```ts\nimport { useGlobalNavigationState } from \"remix-utils/use-global-navigation-state\";\n\nexport function GlobalPendingUI() {\n\tlet states = useGlobalNavigationState();\n\n\tif (state.includes(\"loading\")) {\n\t\t// The app is loading.\n\t}\n\n\tif (state.includes(\"submitting\")) {\n\t\t// The app is submitting.\n\t}\n\n\t// The app is idle\n}\n```\n\nThe return value of `useGlobalNavigationState` can be `\"idle\"`, `\"loading\"` or `\"submitting\"`\n\n> [!NOTE]\n> This is used by the hooks below to determine if the app is loading, submitting or both (pending).\n\n### useGlobalPendingState\n\n> [!NOTE]\n> Install using `bunx shadcn@latest add @remix-utils/use-global-navigation-state`.\n\n> [!NOTE]\n> This depends on `react`, and `react-router`.\n\nThis hook lets you know if the global navigation, if one of any active fetchers is either loading or submitting, or if the revalidator is running.\n\n```ts\nimport { useGlobalPendingState } from \"remix-utils/use-global-navigation-state\";\n\nexport function GlobalPendingUI() {\n  let globalState = useGlobalPendingState();\n\n  if (globalState === \"idle\") return null;\n  return <Spinner />;\n}\n```\n\nThe return value of `useGlobalPendingState` is either `\"idle\"` or `\"pending\"`.\n\n> [!NOTE]\n> This hook combines the `useGlobalSubmittingState` and `useGlobalLoadingState` hooks to determine if the app is pending.\n\n> [!NOTE]\n> The `pending` state is a combination of the `loading` and `submitting` states introduced by this hook.\n\n### useGlobalSubmittingState\n\n> [!NOTE]\n> Install using `bunx shadcn@latest add @remix-utils/use-global-navigation-state`.\n\n> [!NOTE]\n> This depends on `react`, and `react-router`.\n\nThis hook lets you know if the global transition or if one of any active fetchers is submitting.\n\n```ts\nimport { useGlobalSubmittingState } from \"remix-utils/use-global-navigation-state\";\n\nexport function GlobalPendingUI() {\n  let globalState = useGlobalSubmittingState();\n\n  if (globalState === \"idle\") return null;\n  return <Spinner />;\n}\n```\n\nThe return value of `useGlobalSubmittingState` is either `\"idle\"` or `\"submitting\"`.\n\n### useGlobalLoadingState\n\n> [!NOTE]\n> Install using `bunx shadcn@latest add @remix-utils/use-global-navigation-state`.\n\n> [!NOTE]\n> This depends on `react`, and `react-router`.\n\nThis hook lets you know if the global transition, if one of any active fetchers is loading, or if the revalidator is running\n\n```ts\nimport { useGlobalLoadingState } from \"remix-utils/use-global-navigation-state\";\n\nexport function GlobalPendingUI() {\n  let globalState = useGlobalLoadingState();\n\n  if (globalState === \"idle\") return null;\n  return <Spinner />;\n}\n```\n\nThe return value of `useGlobalLoadingState` is either `\"idle\"` or `\"loading\"`.\n\n### useHydrated\n\n> [!NOTE]\n> Install using `bunx shadcn@latest add @remix-utils/use-hydrated`.\n\n> [!NOTE]\n> This depends on `react`.\n\nThis hook lets you detect if your component is already hydrated. This means the JS for the element loaded client-side and React is running.\n\nWith useHydrated, you can render different things on the server and client while ensuring the hydration will not have a mismatched HTML.\n\n```ts\nimport { useHydrated } from \"remix-utils/use-hydrated\";\n\nexport function Component() {\n  let isHydrated = useHydrated();\n\n  if (isHydrated) {\n    return <ClientOnlyComponent />;\n  }\n\n  return <ServerFallback />;\n}\n```\n\nWhen doing SSR, the value of `isHydrated` will always be `false`. The first client-side render `isHydrated` will still be false, and then it will change to `true`.\n\nAfter the first client-side render, future components rendered calling this hook will receive `true` as the value of `isHydrated`. This way, your server fallback UI will never be rendered on a route transition.\n\n### useLocales\n\n> [!NOTE]\n> Install using `bunx shadcn@latest add @remix-utils/locales-react`.\n\n> [!NOTE]\n> This depends on `react`.\n\nThis hook lets you get the locales returned by the root loader. It follows a simple convention, your root loader return value should be an object with the key `locales`.\n\nYou can combine it with `getClientLocal` to get the locales on the root loader and return that. The return value of `useLocales` is a `Locales` type which is `string | string[] | undefined`.\n\n```ts\nimport { useLocales } from \"remix-utils/locales/react\";\nimport { getClientLocales } from \"remix-utils/locales/server\";\n\n// in the root loader\nexport async function loader({ request }: Route.LoaderArgs) {\n  let locales = getClientLocales(request);\n  return json({ locales });\n}\n\n// in any route (including root!)\nexport default function Component() {\n  let locales = useLocales();\n  let date = new Date();\n  let dateTime = date.toISOString;\n  let formattedDate = date.toLocaleDateString(locales, options);\n  return <time dateTime={dateTime}>{formattedDate}</time>;\n}\n```\n\nThe return type of `useLocales` is ready to be used with the Intl API.\n\n### useShouldHydrate\n\n> [!NOTE]\n> Install using `bunx shadcn@latest add @remix-utils/use-should-hydrate`.\n\n> [!NOTE]\n> This depends on `react-router` and `react`.\n\nIf you are building a Remix application where most routes are static, and you want to avoid loading client-side JS, you can use this hook, plus some conventions, to detect if one or more active routes needs JS and only render the Scripts component in that case.\n\nIn your document component, you can call this hook to dynamically render the Scripts component if needed.\n\n```tsx\nimport type { ReactNode } from \"react\";\nimport { Links, LiveReload, Meta, Scripts } from \"react-router\";\nimport { useShouldHydrate } from \"remix-utils/use-should-hydrate\";\n\ninterface DocumentProps {\n\tchildren: ReactNode;\n\ttitle?: string;\n}\n\nexport function Document({ children, title }: DocumentProps) {\n\tlet shouldHydrate = useShouldHydrate();\n\treturn (\n\t\t<html lang=\"en\">\n\t\t\t<head>\n\t\t\t\t<meta charSet=\"utf-8\" />\n\t\t\t\t<link rel=\"icon\" href=\"/favicon.png\" type=\"image/png\" />\n\t\t\t\t{title ? <title>{title}</title> : null}\n\t\t\t\t<Meta />\n\t\t\t\t<Links />\n\t\t\t</head>\n\t\t\t<body>\n\t\t\t\t{children}\n\t\t\t\t{shouldHydrate && <Scripts />}\n\t\t\t\t<LiveReload />\n\t\t\t</body>\n\t\t</html>\n\t);\n}\n```\n\nNow, you can export a `handle` object with the `hydrate` property as `true` in any route module.\n\n```ts\nexport let handle = { hydrate: true };\n```\n\nThis will mark the route as requiring JS hydration.\n\nIn some cases, a route may need JS based on the data the loader returned. For example, if you have a component to purchase a product, but only authenticated users can see it, you don't need JS until the user is authenticated. In that case, you can make `hydrate` be a function receiving your loader data.\n\n```ts\nexport let handle = {\n\thydrate(data: LoaderData) {\n\t\treturn data.user.isAuthenticated;\n\t},\n};\n```\n\nThe `useShouldHydrate` hook will detect `hydrate` as a function and call it using the route data.\n\n### getClientIPAddress\n\n> [!NOTE]\n> Install using `bunx shadcn@latest add @remix-utils/get-client-ip-address`.\n\n> [!NOTE]\n> This depends on `is-ip`.\n\nThis function receives a Request or Headers objects and will try to get the IP address of the client (the user) who originated the request.\n\n```ts\nimport { getClientIPAddress } from \"remix-utils/get-client-ip-address\";\n\nexport async function loader({ request }: Route.LoaderArgs) {\n\t// using the request\n\tlet ipAddress = getClientIPAddress(request);\n\t// or using the headers\n\tlet ipAddress = getClientIPAddress(request.headers);\n}\n```\n\nIf it can't find he IP address the return value will be `null`. Remember to check if it was able to find it before using it.\n\nThe function uses the following list of headers, in order of preference:\n\n- X-Client-IP\n- X-Forwarded-For\n- HTTP-X-Forwarded-For\n- Fly-Client-IP\n- CF-Connecting-IP\n- Fastly-Client-Ip\n- True-Client-Ip\n- X-Real-IP\n- X-Cluster-Client-IP\n- X-Forwarded\n- Forwarded-For\n- Forwarded\n- DO-Connecting-IP\n- oxygen-buyer-ip\n\nWhen a header is found that contains a valid IP address, it will return without checking the other headers.\n\n> [!WARNING]\n> On local development the function is most likely to return `null`. This is because the browser doesn't send any of the above headers, if you want to simulate those headers you will need to either add it to the request Remix receives in your HTTP server or run a reverse proxy like NGINX that can add them for you.\n\n### getClientLocales\n\n> [!NOTE]\n> Install using `bunx shadcn@latest add @remix-utils/locales-server`.\n\n> [!NOTE]\n> This depends on `intl-parse-accept-language`.\n\nThis function let you get the locales of the client (the user) who originated the request.\n\n```ts\nimport { getClientLocales } from \"remix-utils/locales/server\";\n\nexport async function loader({ request }: Route.LoaderArgs) {\n\t// using the request\n\tlet locales = getClientLocales(request);\n\t// or using the headers\n\tlet locales = getClientLocales(request.headers);\n}\n```\n\nThe return value is a Locales type, which is `string | string[] | undefined`.\n\nThe returned locales can be directly used on the Intl API when formatting dates, numbers, etc.\n\n```ts\nimport { getClientLocales } from \"remix-utils/locales/server\";\nexport async function loader({ request }: Route.LoaderArgs) {\n\tlet locales = getClientLocales(request);\n\tlet nowDate = new Date();\n\tlet formatter = new Intl.DateTimeFormat(locales, {\n\t\tyear: \"numeric\",\n\t\tmonth: \"long\",\n\t\tday: \"numeric\",\n\t});\n\treturn json({ now: formatter.format(nowDate) });\n}\n```\n\nThe value could also be returned by the loader and used on the UI to ensure the user's locales is used on both server and client formatted dates.\n\n### isPrefetch\n\n> [!NOTE]\n> Install using `bunx shadcn@latest add @remix-utils/is-prefetch`.\n\nThis function let you identify if a request was created because of a prefetch triggered by using `<Link prefetch=\"intent\">` or `<Link prefetch=\"render\">`.\n\nThis will let you implement a short cache only for prefetch requests so you [avoid the double data request](https://sergiodxa.com/articles/fix-double-data-request-when-prefetching-in-remix).\n\n```ts\nimport { isPrefetch } from \"remix-utils/is-prefetch\";\n\nexport async function loader({ request }: Route.LoaderArgs) {\n\tlet data = await getData(request);\n\tlet headers = new Headers();\n\n\tif (isPrefetch(request)) {\n\t\theaders.set(\"Cache-Control\", \"private, max-age=5, smax-age=0\");\n\t}\n\n\treturn json(data, { headers });\n}\n```\n\n### Responses\n\n> [!NOTE]\n> Install using `bunx shadcn@latest add @remix-utils/responses`.\n\n#### Redirect Back\n\n> [!NOTE]\n> Install using `bunx shadcn@latest add @remix-utils/redirect-back`.\n\nThis function is a wrapper of the `redirect` helper from Remix. Unlike Remix's version, this one receives the whole request object as the first value and an object with the response init and a fallback URL.\n\nThe response created with this function will have the `Location` header pointing to the `Referer` header from the request, or if not available, the fallback URL provided in the second argument.\n\n```ts\nimport { redirectBack } from \"remix-utils/redirect-back\";\n\nexport async function action({ request }: Route.ActionArgs) {\n\tthrow redirectBack(request, { fallback: \"/\" });\n}\n```\n\nThis helper is most useful when used in a generic action to send the user to the same URL it was before.\n\n#### Not Modified\n\n> [!NOTE]\n> Install using `bunx shadcn@latest add @remix-utils/responses`.\n\nHelper function to create a Not Modified (304) response without a body and any header.\n\n```ts\nimport { notModified } from \"remix-utils/responses\";\n\nexport async function loader({ request }: Route.LoaderArgs) {\n\treturn notModified();\n}\n```\n\n#### JavaScript\n\n> [!NOTE]\n> Install using `bunx shadcn@latest add @remix-utils/responses`.\n\nHelper function to create a JavaScript file response with any header.\n\nThis is useful to create JS files based on data inside a Resource Route.\n\n```ts\nimport { javascript } from \"remix-utils/responses\";\n\nexport async function loader({ request }: Route.LoaderArgs) {\n\treturn javascript(\"console.log('Hello World')\");\n}\n```\n\n#### Stylesheet\n\n> [!NOTE]\n> Install using `bunx shadcn@latest add @remix-utils/responses`.\n\nHelper function to create a CSS file response with any header.\n\nThis is useful to create CSS files based on data inside a Resource Route.\n\n```ts\nimport { stylesheet } from \"remix-utils/responses\";\n\nexport async function loader({ request }: Route.LoaderArgs) {\n\treturn stylesheet(\"body { color: red; }\");\n}\n```\n\n#### PDF\n\n> [!NOTE]\n> Install using `bunx shadcn@latest add @remix-utils/responses`.\n\nHelper function to create a PDF file response with any header.\n\nThis is useful to create PDF files based on data inside a Resource Route.\n\n```ts\nimport { pdf } from \"remix-utils/responses\";\n\nexport async function loader({ request }: Route.LoaderArgs) {\n\treturn pdf(await generatePDF(request.formData()));\n}\n```\n\n#### HTML\n\n> [!NOTE]\n> Install using `bunx shadcn@latest add @remix-utils/responses`.\n\nHelper function to create a HTML file response with any header.\n\nThis is useful to create HTML files based on data inside a Resource Route.\n\n```ts\nimport { html } from \"remix-utils/responses\";\n\nexport async function loader({ request }: Route.LoaderArgs) {\n\treturn html(\"<h1>Hello World</h1>\");\n}\n```\n\n#### XML\n\n> [!NOTE]\n> Install using `bunx shadcn@latest add @remix-utils/responses`.\n\nHelper function to create a XML file response with any header.\n\nThis is useful to create XML files based on data inside a Resource Route.\n\n```ts\nimport { xml } from \"remix-utils/responses\";\n\nexport async function loader({ request }: Route.LoaderArgs) {\n\treturn xml(\"<?xml version='1.0'?><catalog></catalog>\");\n}\n```\n\n#### Plain Text\n\n> [!NOTE]\n> Install using `bunx shadcn@latest add @remix-utils/responses`.\n\nHelper function to create a TXT file response with any header.\n\nThis is useful to create TXT files based on data inside a Resource Route.\n\n```ts\nimport { txt } from \"remix-utils/responses\";\n\nexport async function loader({ request }: Route.LoaderArgs) {\n\treturn txt(`\n    User-agent: *\n    Allow: /\n  `);\n}\n```\n\n### Typed Cookies\n\n> [!NOTE]\n> Install using `bunx shadcn@latest add @remix-utils/typed-cookie`.\n\n> [!NOTE]\n> This depends on `@standard-schema/spec`, and React Router.\n\nCookie objects in Remix allows any type, the typed cookies from Remix Utils lets you use any Standard Schema compatible library to parse the cookie values and ensure they conform to a schema.\n\n```ts\nimport { createCookie } from \"react-router\";\nimport { createTypedCookie } from \"remix-utils/typed-cookie\";\nimport { z } from \"zod\"; //or another Standard Schema compatible library\n\nlet cookie = createCookie(\"returnTo\", cookieOptions);\n// I recommend you to always add `nullable` to your schema, if a cookie didn't\n// come with the request Cookie header Remix will return null, and it can be\n// useful to remove it later when clearing the cookie\nlet schema = z.string().url().nullable();\n\n// pass the cookie and the schema\nlet typedCookie = createTypedCookie({ cookie, schema });\n\n// this will be a string and also a URL\nlet returnTo = await typedCookie.parse(request.headers.get(\"Cookie\"));\n\n// this will not pass the schema validation and throw a ZodError\nawait typedCookie.serialize(\"a random string that's not a URL\");\n// this will make TS yell because it's not a string, if you ignore it it will\n// throw a ZodError\nawait typedCookie.serialize(123);\n```\n\nYou could also use typed cookies with any sessionStorage mechanism from Remix.\n\n```ts\nlet cookie = createCookie(\"session\", cookieOptions);\nlet schema = z.object({ token: z.string().nullish() }).nullable();\n\nlet sessionStorage = createCookieSessionStorage({\n\tcookie: createTypedCookie({ cookie, schema }),\n});\n\n// if this works then the correct data is stored in the session\nlet session = sessionStorage.getSession(request.headers.get(\"Cookie\"));\n\nsession.unset(\"token\"); // remove a required key from the session\n\n// this will throw a ZodError because the session is missing the required key\nawait sessionStorage.commitSession(session);\n```\n\nNow Zod will ensure the data you try to save to the session is valid removing any extra field and throwing if you don't set the correct data in the session.\n\n> [!IMPORTANT]\n> The session object is not really typed so doing session.get will not return the correct type, you can do `schema.parse(session.data)` to get the typed version of the session data.\n\nYou can also use async refinements in your schemas because typed cookies uses parseAsync method from Zod.\n\n```ts\nlet cookie = createCookie(\"session\", cookieOptions);\n\nlet schema = z\n\t.object({\n\t\ttoken: z.string().refine(async (token) => {\n\t\t\tlet user = await getUserByToken(token);\n\t\t\treturn user !== null;\n\t\t}, \"INVALID_TOKEN\"),\n\t})\n\t.nullable();\n\nlet sessionTypedCookie = createTypedCookie({ cookie, schema });\n\n// this will throw if the token stored in the cookie is not valid anymore\nsessionTypedCookie.parse(request.headers.get(\"Cookie\"));\n```\n\nFinally, to be able to delete a cookie, you can add `.nullable()` to your schema and serialize it with `null` as value.\n\n```ts\n// Set the value as null and expires as current date - 1 second so the browser expires the cookie\nawait typedCookie.serialize(null, { expires: new Date(Date.now() - 1) });\n```\n\nIf you didn't add `.nullable()` to your schema, you will need to provide a mock value and set the expires date to the past.\n\n```ts\nlet cookie = createCookie(\"returnTo\", cookieOptions);\nlet schema = z.string().url().nullable();\n\nlet typedCookie = createTypedCookie({ cookie, schema });\n\nawait typedCookie.serialize(\"some fake url to pass schema validation\", {\n\texpires: new Date(Date.now() - 1),\n});\n```\n\n### Server-Sent Events\n\n> [!NOTE]\n> Install using `bunx shadcn@latest add @remix-utils/sse-server` and `bunx shadcn@latest add @remix-utils/sse-react`.\n\n> [!NOTE]\n> This depends on `react`.\n\nServer-Sent Events are a way to send data from the server to the client without the need for the client to request it. This is useful for things like chat applications, live updates, and more.\n\nThere are two utils provided to help with the usage inside Remix:\n\n- `eventStream`\n- `useEventSource`\n\nThe `eventStream` function is used to create a new event stream response needed to send events to the client. This must live in a [Resource Route](https://remix.run/docs/en/1.18.1/guides/resource-routes).\n\n```ts\n// app/routes/sse.time.ts\nimport { eventStream } from \"remix-utils/sse/server\";\n\nexport async function loader({ request }: Route.LoaderArgs) {\n\treturn eventStream(request.signal, function setup(send) {\n\t\tlet intervalId = setInterval(() => {\n\t\t\tsend({ event: \"time\", data: new Date().toISOString() });\n\t\t}, 1000);\n\n\t\treturn () => void clearInterval(intervalId); // Cleanup function\n\t});\n}\n```\n\nThen, inside any component, you can use the `useEventSource` hook to connect to the event stream.\n\n```tsx\n// app/components/counter.ts\nimport { useEventSource } from \"remix-utils/sse/react\";\n\nfunction Counter() {\n\t// Here `/sse/time` is the resource route returning an eventStream response\n\tlet time = useEventSource(\"/sse/time\", { event: \"time\" });\n\n\tif (!time) return null;\n\n\treturn (\n\t\t<time dateTime={time}>\n\t\t\t{new Date(time).toLocaleTimeString(\"en\", {\n\t\t\t\tminute: \"2-digit\",\n\t\t\t\tsecond: \"2-digit\",\n\t\t\t\thour: \"2-digit\",\n\t\t\t})}\n\t\t</time>\n\t);\n}\n```\n\nThe `event` name in both the event stream and the hook is optional, in which case it will default to `message`, if defined you must use the same event name in both sides, this also allows you to emit different events from the same event stream.\n\nFor Server-Sent Events to work, your server must support HTTP streaming. If you don't get SSE to work check if your deployment platform has support for it.\n\nBecause SSE count towards the limit of HTTP connections per domain, the `useEventSource` hook keeps a global map of connections based on the provided URL and options. As long as they are the same, the hook will open a single SSE connection and share it between instances of the hook.\n\nOnce there are no more instances of the hook re-using a connection, it will be closed and removed from the map.\n\nYou can use the `<EventSourceProvider />` component to control the map.\n\n```tsx\nlet map: EventSourceMap = new Map();\nreturn (\n\t<EventSourceProvider value={map}>\n\t\t<YourAppOrPartOfIt />\n\t</EventSourceProvider>\n);\n```\n\nThis way, you can overwrite the map with a new one for a specific part of your app. Note that this provider is optional and a default map will be used if you don't provide one.\n\n### Rolling Cookies\n\n> [!NOTE]\n> Install using `bunx shadcn@latest add @remix-utils/rolling-cookie`.\n\n> [!NOTE]\n> This depends on `zod`, and React Router.\n\nRolling cookies allows you to prolong the expiration of a cookie by updating the expiration date of every cookie.\n\nThe `rollingCookie` function is prepared to be used in `entry.server` exported function to update the expiration date of a cookie if no loader set it.\n\nFor document request you can use it on the `handleRequest` function:\n\n```ts\nimport { rollingCookie } from \"remix-utils/rolling-cookie\";\n\nimport { sessionCookie } from \"~/session.server\";\n\nexport default function handleRequest(\n\trequest: Request,\n\tresponseStatusCode: number,\n\tresponseHeaders: Headers,\n\tremixContext: EntryContext,\n) {\n\tawait rollingCookie(sessionCookie, request, responseHeaders);\n\n\treturn isbot(request.headers.get(\"user-agent\"))\n\t\t? handleBotRequest(request, responseStatusCode, responseHeaders, remixContext)\n\t\t: handleBrowserRequest(request, responseStatusCode, responseHeaders, remixContext);\n}\n```\n\nAnd for data request you can do it on the `handleDataRequest` function:\n\n```ts\nimport { rollingCookie } from \"remix-utils/rolling-cookie\";\n\nexport let handleDataRequest: HandleDataRequestFunction = async (\n\tresponse: Response,\n\t{ request },\n) => {\n\tlet cookieValue = await sessionCookie.parse(responseHeaders.get(\"set-cookie\"));\n\tif (!cookieValue) {\n\t\tcookieValue = await sessionCookie.parse(request.headers.get(\"cookie\"));\n\t\tresponseHeaders.append(\"Set-Cookie\", await sessionCookie.serialize(cookieValue));\n\t}\n\n\treturn response;\n};\n```\n\n> [!NOTE] > [Read more about rolling cookies in Remix](https://sergiodxa.com/articles/add-rolling-sessions-to-remix).\n\n### Named actions\n\n> [!NOTE]\n> Install using `bunx shadcn@latest add @remix-utils/named-action`.\n\n> [!NOTE]\n> This depends on React Router.\n\nIt's common to need to handle more than one action in the same route, there are many options here like [sending the form to a resource route](https://sergiodxa.com/articles/multiple-forms-per-route-in-remix#using-resource-routes) or using an [action reducer](https://sergiodxa.com/articles/multiple-forms-per-route-in-remix#the-action-reducer-pattern), the `namedAction` function uses some conventions to implement the action reducer pattern.\n\n```tsx\nimport { namedAction } from \"remix-utils/named-action\";\n\nexport async function action({ request }: Route.ActionArgs) {\n\treturn namedAction(await request.formData(), {\n\t\tasync create() {\n\t\t\t// do create\n\t\t},\n\t\tasync update() {\n\t\t\t// do update\n\t\t},\n\t\tasync delete() {\n\t\t\t// do delete\n\t\t},\n\t});\n}\n\nexport default function Component() {\n\treturn (\n\t\t<>\n\t\t\t<Form method=\"post\">\n\t\t\t\t<input type=\"hidden\" name=\"intent\" value=\"create\" />\n\t\t\t\t...\n\t\t\t</Form>\n\n\t\t\t<Form method=\"post\">\n\t\t\t\t<input type=\"hidden\" name=\"intent\" value=\"update\" />\n\t\t\t\t...\n\t\t\t</Form>\n\n\t\t\t<Form method=\"post\">\n\t\t\t\t<input type=\"hidden\" name=\"intent\" value=\"delete\" />\n\t\t\t\t...\n\t\t\t</Form>\n\t\t</>\n\t);\n}\n```\n\nThis function can follow this convention:\n\nYou can pass a FormData object to the `namedAction`, then it will try to find a field named `intent` and use the value as the action name.\n\nIf, in any case, the action name is not found, the `actionName` then the library will try to call an action named `default`, similar to a `switch` in JavaScript.\n\nIf the `default` is not defined it will throw a ReferenceError with the message `Action \"${name}\" not found`.\n\nIf the library couldn't found the name at all, it will throw a ReferenceError with the message `Action name not found`\n\n### Preload Route Assets\n\n> [!NOTE]\n> Install using `bunx shadcn@latest add @remix-utils/preload-route-assets`.\n\n> [!CAUTION]\n> This can potentialy create big `Link` header and can cause extremely hard to debug issues. Some provider's load balancers have set certain buffer for parsing outgoing response's headers and thanks to `preloadRouteAssets` you can easily reach that in a medium sized application.\n> Your load balancer can randomly stop responding or start throwing 502 error.\n> To overcome this either don't use `preloadRouteAssets`, set bigger buffer for processing response headers if you own the loadbalancer or use the `experimentalMinChunkSize` option in Vite config (this does not solve the issue permanently, only delays it)\n\nThe `Link` header allows responses to push to the browser assets that are needed for the document, this is useful to improve the performance of the application by sending those assets earlier.\n\nOnce Early Hints is supported this will also allows you to send the assets even before the document is ready, but for now you can benefit to send assets to preload before the browser parse the HTML.\n\nYou can do this with the functions `preloadRouteAssets`, `preloadLinkedAssets` and `preloadModuleAssets`.\n\nAll functions follows the same signature:\n\n```ts\nimport {\n  preloadRouteAssets,\n  preloadLinkedAssets,\n  preloadModuleAssets,\n} from \"remix-utils/preload-route-assets\";\n\n// entry.server.tsx\nexport default function handleRequest(\n  request: Request,\n  statusCode: number,\n  headers: Headers,\n  context: EntryContext,\n) {\n  let markup = renderToString(\n    <RemixServer context={context} url={request.url} />,\n  );\n  headers.set(\"Content-Type\", \"text/html\");\n\n  preloadRouteAssets(context, headers); // add this line\n  // preloadLinkedAssets(context, headers);\n  // preloadModuleAssets(context, headers);\n\n  return new Response(\"<!DOCTYPE html>\" + markup, {\n    status: statusCode,\n    headers: headers,\n  });\n}\n```\n\nThe `preloadRouteAssets` is a combination of both `preloadLinkedAssets` and `preloadModuleAssets` so you can use it to preload all assets for a route, if you use this one you don't need the other two\n\nThe `preloadLinkedAssets` function will preload any link with `rel: \"preload\"` added with the Remix's `LinkFunction`, so you can configure assets to preload in your route and send them in the headers automatically. It will additionally preload any linked stylesheet file (with `rel: \"stylesheet\"`) even if not preloaded so it will load faster.\n\nThe `preloadModuleAssets` function will preload all the JS files Remix adds to the page when hydrating it, Remix already renders a `<link rel=\"modulepreload\">` for each now before the `<script type=\"module\">` used to start the application, this will use Link headers to preload those assets.\n\n### Safe Redirects\n\n> [!NOTE]\n> Install using `bunx shadcn@latest add @remix-utils/safe-redirect`.\n\nWhen performing a redirect, if the URL is user provided we can't trust it, if you do you're opening a vulnerability to phishing scam by allowing bad actors to redirect the user to malicious websites.\n\n```\nhttps://remix.utills/?redirectTo=https://malicious.app\n```\n\nTo help you prevent this Remix Utils gives you a `safeRedirect` function which can be used to check if the URL is \"safe\".\n\n> [!NOTE]\n> In this context, safe means the URL starts with `/` but not `//`, this means the URL is a pathname inside the same app and not an external link.\n\n```ts\nimport { safeRedirect } from \"remix-utils/safe-redirect\";\n\nexport async function loader({ request }: Route.LoaderArgs) {\n\tlet { searchParams } = new URL(request.url);\n\tlet redirectTo = searchParams.get(\"redirectTo\");\n\treturn redirect(safeRedirect(redirectTo, \"/home\"));\n}\n```\n\nThe second argumento of `safeRedirect` is the default redirect which by when not configured is `/`, this lets you tell `safeRedirect` where to redirect the user if the value is not safe.\n\n### JSON Hash Response\n\n> [!NOTE]\n> Install using `bunx shadcn@latest add @remix-utils/json-hash`.\n\nWhen returning a `json` from a `loader` function, you may need to get data from different DB queries or API requests, typically you would something like this\n\n```ts\nexport async function loader({ params }: LoaderData) {\n\tlet postId = z.string().parse(params.postId);\n\tlet [post, comments] = await Promise.all([getPost(), getComments()]);\n\treturn json({ post, comments });\n\n\tasync function getPost() {\n\t\t/* … */\n\t}\n\tasync function getComments() {\n\t\t/* … */\n\t}\n}\n```\n\nThe `jsonHash` function lets you define those functions directly in the `json`, reducing the need to create extra functions and variables.\n\n```ts\nimport { jsonHash } from \"remix-utils/json-hash\";\n\nexport async function loader({ params }: LoaderData) {\n\tlet postId = z.string().parse(params.postId);\n\treturn jsonHash({\n\t\tasync post() {\n\t\t\t// Implement me\n\t\t},\n\t\tasync comments() {\n\t\t\t// Implement me\n\t\t},\n\t});\n}\n```\n\nIt also calls your functions using `Promise.all` so you can be sure the data is retrieved in parallel.\n\nAdditionally, you can pass non-async functions, values and promises.\n\n```ts\nimport { jsonHash } from \"remix-utils/json-hash\";\n\nexport async function loader({ params }: LoaderData) {\n\tlet postId = z.string().parse(params.postId);\n\treturn jsonHash({\n\t\tpostId, // value\n\t\tcomments: getComments(), // Promise\n\t\tslug() {\n\t\t\t// Non-async function\n\t\t\treturn postId.split(\"-\").at(1); // get slug from postId param\n\t\t},\n\t\tasync post() {\n\t\t\t// Async function\n\t\t\treturn await getPost(postId);\n\t\t},\n\t});\n\n\tasync function getComments() {\n\t\t/* … */\n\t}\n}\n```\n\nThe result of `jsonHash` is a `TypedResponse` and it's correctly typed so using it with `typeof loader` works flawlessly.\n\n```ts\nexport default function Component() {\n\t// all correctly typed\n\tlet { postId, comments, slug, post } = useLoaderData<typeof loader>();\n\n\t// more code…\n}\n```\n\n### Delegate Anchors to Remix\n\n> [!NOTE]\n> Install using `bunx shadcn@latest add @remix-utils/use-delegated-anchors`.\n\nWhen using Remix, you can use the `<Link>` component to navigate between pages. However, if you have a `<a href>` that links to a page in your app, it will cause a full page refresh. This can be what you want, but sometimes you want to use client-side navigation here instead.\n\nThe `useDelegatedAnchors` hook lets you add client-side navigation to anchor tags in a portion of your app. This can be specially useful when working with dynamic content like HTML or Markdown from a CMS.\n\n```tsx\nimport { useDelegatedAnchors } from \"remix-utils/use-delegated-anchors\";\n\nexport async function loader() {\n\tlet content = await fetchContentFromCMS();\n\treturn json({ content });\n}\n\nexport default function Component() {\n\tlet { content } = useLoaderData<typeof loader>();\n\n\tlet ref = useRef<HTMLDivElement>(null);\n\tuseDelegatedAnchors(ref);\n\n\treturn <article ref={ref} dangerouslySetInnerHTML={{ __html: content }} />;\n}\n```\n\n### Prefetch Anchors\n\n> [!NOTE]\n> Install using `bunx shadcn@latest add @remix-utils/use-delegated-anchors`.\n\nIf additionally you want to be able to prefetch your anchors you can use the `PrefetchPageAnchors` components.\n\nThis components wraps your content with anchors inside, it detects any hovered anchor to prefetch it, and it delegates them to Remix.\n\n```tsx\nimport { PrefetchPageAnchors } from \"remix-utils/use-delegated-anchors\";\n\nexport async function loader() {\n\tlet content = await fetchContentFromCMS();\n\treturn json({ content });\n}\n\nexport default function Component() {\n\tlet { content } = useLoaderData<typeof loader>();\n\n\treturn (\n\t\t<PrefetchPageAnchors>\n\t\t\t<article ref={ref} dangerouslySetInnerHTML={{ __html: content }} />\n\t\t</PrefetchPageAnchors>\n\t);\n}\n```\n\nNow you can see in your DevTools that when the user hovers an anchor it will prefetch it, and when the user clicks it will do a client-side navigation.\n\n### Debounced Fetcher and Submit\n\n> [!NOTE]\n> Install using `bunx shadcn@latest add @remix-utils/use-debounce-fetcher` and `bunx shadcn@latest add @remix-utils/use-debounce-submit`.\n\n> [!NOTE]\n> This depends on `react`, and `react-router`.\n\n> [!WARN]\n> These hooks are marked as deprecated, instead of debouncing at the component-level, do it at the route-level. See https://sergiodxa.com/tutorials/debounce-loaders-and-actions-in-react-router.\n\n`useDebounceFetcher` and `useDebounceSubmit` are wrappers of `useFetcher` and `useSubmit` that add debounce support.\n\nThese hooks are based on [@JacobParis](https://github.com/JacobParis)' [article](https://www.jacobparis.com/content/use-debounce-fetcher).\n\n```tsx\nimport { useDebounceFetcher } from \"remix-utils/use-debounce-fetcher\";\n\nexport function Component({ data }) {\n\tlet fetcher = useDebounceFetcher<Type>();\n\n\tfunction handleClick() {\n\t\tfetcher.submit(data, { debounceTimeout: 1000 });\n\t}\n\n\treturn (\n\t\t<button type=\"button\" onClick={handleClick}>\n\t\t\tDo Something\n\t\t</button>\n\t);\n}\n```\n\nUsage with `useDebounceSubmit` is similar.\n\n```tsx\nimport { useDebounceSubmit } from \"remix-utils/use-debounce-submit\";\n\nexport function Component({ name }) {\n\tlet submit = useDebounceSubmit();\n\n\treturn (\n\t\t<input\n\t\t\tname={name}\n\t\t\ttype=\"text\"\n\t\t\tonChange={(event) => {\n\t\t\t\tsubmit(event.target.form, {\n\t\t\t\t\tnavigate: false, // use a fetcher instead of a page navigation\n\t\t\t\t\tfetcherKey: name, // cancel any previous fetcher with the same key\n\t\t\t\t\tdebounceTimeout: 1000,\n\t\t\t\t});\n\t\t\t}}\n\t\t\tonBlur={() => {\n\t\t\t\tsubmit(event.target.form, {\n\t\t\t\t\tnavigate: false,\n\t\t\t\t\tfetcherKey: name,\n\t\t\t\t\tdebounceTimeout: 0, // submit immediately, canceling any pending fetcher\n\t\t\t\t});\n\t\t\t}}\n\t\t/>\n\t);\n}\n```\n\n### Derive Fetcher Type\n\n> [!NOTE]\n> Install using `bunx shadcn@latest add @remix-utils/fetcher-type`.\n\n> [!NOTE]\n> This depends on `@remix-route/react`.\n\nDerive the value of the deprecated `fetcher.type` from the fetcher and navigation data.\n\n```ts\nimport { getFetcherType } from \"remix-utils/fetcher-type\";\n\nfunction Component() {\n\tlet fetcher = useFetcher();\n\tlet navigation = useNavigation();\n\tlet fetcherType = getFetcherType(fetcher, navigation);\n\tuseEffect(() => {\n\t\tif (fetcherType === \"done\") {\n\t\t\t// do something once the fetcher is done submitting the data\n\t\t}\n\t}, [fetcherType]);\n}\n```\n\nYou can also use the React Hook API which let's you avoid calling `useNavigation`.\n\n```ts\nimport { useFetcherType } from \"remix-utils/fetcher-type\";\n\nfunction Component() {\n\tlet fetcher = useFetcher();\n\tlet fetcherType = useFetcherType(fetcher);\n\tuseEffect(() => {\n\t\tif (fetcherType === \"done\") {\n\t\t\t// do something once the fetcher is done submitting the data\n\t\t}\n\t}, [fetcherType]);\n}\n```\n\nIf you need to pass the fetcher type around, you can also import `FetcherType` type.\n\n```ts\nimport { type FetcherType } from \"remix-utils/fetcher-type\";\n\nfunction useCallbackOnDone(type: FetcherType, cb) {\n\tuseEffect(() => {\n\t\tif (type === \"done\") cb();\n\t}, [type, cb]);\n}\n```\n\n### respondTo for Content Negotiation\n\n> [!NOTE]\n> Install using `bunx shadcn@latest add @remix-utils/respond-to` and `bunx shadcn@latest add @remix-utils/parse-accept-header`.\n\nIf you're building a resource route and wants to send a different response based on what content type the client requested (e.g. send the same data as PDF or XML or JSON), you will need to implement content negotiation, this can be done with the `respondTo` header.\n\n```ts\nimport { respondTo } from \"remix-utils/respond-to\";\n\nexport async function loader({ request }: Route.LoaderArgs) {\n  // do any work independent of the response type before respondTo\n  let data = await getData(request);\n\n  let headers = new Headers({ vary: \"accept\" });\n\n  // Here we will decide how to respond to different content types\n  return respondTo(request, {\n    // The handler can be a subtype handler, in `text/html` html is the subtype\n    html() {\n      // We can call any function only really need to respond to this\n      // content-type\n      let body = ReactDOMServer.renderToString(<UI {...data} />);\n      headers.append(\"content-type\", \"text/html\");\n      return new Response(body, { headers });\n    },\n    // It can also be a highly specific type\n    async \"application/rss+xml\"() {\n      // we can do more async work inside this code if needed\n      let body = await generateRSSFeed(data);\n      headers.append(\"content-type\", \"application/rss+xml\");\n      return new Response(body, { headers });\n    },\n    // Or a generic type\n    async text() {\n      // To respond to any text type, e.g. text/plain, text/csv, etc.\n      let body = generatePlain(data);\n      headers.append(\"content-type\", \"text/plain\");\n      return new Response(body, { headers });\n    },\n    // The default will be used if the accept header doesn't match any of the\n    // other handlers\n    default() {\n      // Here we could have a default type of response, e.g. use json by\n      // default, or we can return a 406 which means the server can't respond\n      // with any of the requested content types\n      return new Response(\"Not Acceptable\", { status: 406 });\n    },\n  });\n}\n```\n\nNow, the `respondTo` function will check the `Accept` header and call the correct handler, to know which one to call it will use the `parseAcceptHeader` function also exported from Remix Utils\n\n```ts\nimport { parseAcceptHeader } from \"remix-utils/parse-accept-header\";\n\nlet parsed = parseAcceptHeader(\n\t\"text/html, application/xhtml+xml, application/xml;q=0.9, image/webp, image/*, */*;q=0.8\",\n);\n```\n\nThe result is an array with the type, subtype and extra params (e.g. the `q` value). The order will be the same encountered in the header, in the example aabove `text/html` will be the first, followed by `application/xhtml+xml`.\n\nThis means that the `respondTo` helper will prioritize any handler that match `text/html`, in our example above, that will be the `html` handler, but if we remove it then the `text` handler will be called instead.67\n\n### Form Honeypot\n\n> [!NOTE]\n> Install using `bunx shadcn@latest add @remix-utils/honeypot-server` and `bunx shadcn@latest add @remix-utils/honeypot-react`.\n\n> [!NOTE]\n> This depends on `react` and `@oslojs/crypto`, and `@oslojs/encoding`.\n\nHoneypot is a simple technique to prevent spam bots from submitting forms. It works by adding a hidden field to the form that bots will fill, but humans won't.\n\nThere's a pair of utils in Remix Utils to help you implement this.\n\nFirst, create a `honeypot.server.ts` where you will instantiate and configure your Honeypot.\n\n```tsx\nimport { Honeypot } from \"remix-utils/honeypot/server\";\n\n// Create a new Honeypot instance, the values here are the defaults, you can\n// customize them\nexport const honeypot = new Honeypot({\n\trandomizeNameFieldName: false,\n\tnameFieldName: \"name__confirm\",\n\tvalidFromFieldName: \"from__confirm\", // null to disable it\n\tencryptionSeed: undefined, // Ideally it should be unique even between processes\n});\n```\n\nThen, in your `app/root` loader, call `honeypot.getInputProps()` and return it.\n\n```ts\n// app/root.tsx\nimport { honeypot } from \"~/honeypot.server\";\n\nexport async function loader() {\n\t// more code here\n\treturn json({ honeypotInputProps: honeypot.getInputProps() });\n}\n```\n\nAnd in the `app/root` component render the `HoneypotProvider` component wrapping the rest of the UI.\n\n```tsx\nimport { HoneypotProvider } from \"remix-utils/honeypot/react\";\n\nexport default function Component() {\n\t// more code here\n\treturn (\n\t\t// some JSX\n\t\t<HoneypotProvider {...honeypotInputProps}>\n\t\t\t<Outlet />\n\t\t</HoneypotProvider>\n\t\t// end that JSX\n\t);\n}\n```\n\nNow, in every public form you want protect against spam (like a login form), render the `HoneypotInputs` component.\n\n```tsx\nimport { HoneypotInputs } from \"remix-utils/honeypot/react\";\n\nfunction SomePublicForm() {\n\treturn (\n\t\t<Form method=\"post\">\n\t\t\t<HoneypotInputs label=\"Please leave this field blank\" />\n\t\t\t{/* more inputs and some buttons */}\n\t\t</Form>\n\t);\n}\n```\n\n> [!NOTE]\n> The label value above is the default one, use it to allow the label to be localized, or remove it if you don't want to change it.\n\nHide the honeypot using a `className` in the main stylesheet to make it harder for bots to detect that inputs are hidden.\n\n```tsx\nfunction SomePublicForm() {\n\treturn (\n\t\t<Form method=\"post\">\n\t\t\t<HoneypotInputs label=\"Please leave this field blank\" className=\"your-css-class\" />\n\t\t\t{/* more inputs and some buttons */}\n\t\t</Form>\n\t);\n}\n```\n\n```CSS\n.your-css-class { display: none }\n```\n\nFinally, in the action the form submits to, you can call `honeypot.check`.\n\n```ts\nimport { SpamError } from \"remix-utils/honeypot/server\";\nimport { honeypot } from \"~/honeypot.server\";\n\nexport async function action({ request }) {\n\tlet formData = await request.formData();\n\ttry {\n\t\thoneypot.check(formData);\n\t} catch (error) {\n\t\tif (error instanceof SpamError) {\n\t\t\t// handle spam requests here\n\t\t}\n\t\t// handle any other possible error here, e.g. re-throw since nothing else\n\t\t// should be thrown\n\t}\n\t// the rest of your action\n}\n```\n\n### Sec-Fetch Parsers\n\n> [!NOTE]\n> Install using `bunx shadcn@latest add @remix-utils/sec-fetch`.\n\n> [!NOTE]\n> This depends on `zod`.\n\nThe `Sec-Fetch` headers include information about the request, e.g. where is the data going to be used, or if it was initiated by the user.\n\nYou can use the `remix-utils/sec-fetch` utils to parse those headers and get the information you need.\n\n```ts\nimport { fetchDest, fetchMode, fetchSite, isUserInitiated } from \"remix-utils/sec-fetch\";\n```\n\n#### Sec-Fetch-Dest\n\nThe `Sec-Fetch-Dest` header indicates the destination of the request, e.g. `document`, `image`, `script`, etc.\n\nIf the value is `empty` it means it will be used by a `fetch` call, this means you can differentiate between a request made with and without JS by checking if it's `document` (no JS) or `empty` (JS enabled).\n\n```ts\nimport { fetchDest } from \"remix-utils/sec-fetch\";\n\nexport async function action({ request }: Route.ActionArgs) {\n\tlet data = await getDataSomehow();\n\n\t// if the request was made with JS, we can just return json\n\tif (fetchDest(request) === \"empty\") return json(data);\n\t// otherwise we redirect to avoid a reload to trigger a new submission\n\treturn redirect(destination);\n}\n```\n\n#### Sec-Fetch-Mode\n\nThe `Sec-Fetch-Mode` header indicates how the request was initiated, e.g. if the value is `navigate` it was triggered by the user loading the page, if the value is `no-cors` it could be an image being loaded.\n\n```ts\nimport { fetchMode } from \"remix-utils/sec-fetch\";\n\nexport async function loader({ request }: Route.LoaderArgs) {\n\tlet mode = fetchMode(request);\n\t// do something based on the mode value\n}\n```\n\n#### Sec-Fetch-Site\n\nThe `Sec-Fetch-Site` header indicates where the request is being made, e.g. `same-origin` means the request is being made to the same domain, `cross-site` means the request is being made to a different domain.\n\n```ts\nimport { fetchSite } from \"remix-utils/sec-f","readmeFilename":"README.md"}