From 73993df10c916f4bd97afdac378f5feabaeab522 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Sergio=20Xalambr=C3=AD?= Date: Fri, 3 May 2024 01:59:45 -0500 Subject: [PATCH] Switch to Biome (#361) --- .eslintrc.cjs | 54 ---- .github/workflows/bump.yml | 10 +- .github/workflows/ci.yml | 18 +- .github/workflows/docs.yml | 2 +- .github/workflows/publish.yml | 2 +- .npmignore | 2 +- .vscode/extensions.json | 14 + .vscode/settings.json | 70 +++++ biome.json | 55 ++++ bun.lockb | Bin 297149 -> 182700 bytes package.json | 342 +++++++++++----------- prettier.config.js | 6 - scripts/check-pkg-exports.ts | 27 +- scripts/tsconfig.json | 7 - src/common/promise.ts | 40 ++- src/react/existing-search-params.tsx | 2 +- src/react/external-scripts.tsx | 8 +- src/react/handle-conventions.ts | 2 +- src/react/use-debounce-fetcher.ts | 6 +- src/react/use-debounce-submit.ts | 6 +- src/react/use-delegated-anchors.tsx | 2 +- src/react/use-event-source.ts | 2 +- src/react/use-global-navigation-state.ts | 2 +- src/react/use-hydrated.ts | 1 + src/server/cors.ts | 2 +- src/server/csrf.ts | 6 +- src/server/event-stream.ts | 19 +- src/server/get-client-ip-address.ts | 1 - src/server/honeypot.ts | 6 +- src/server/named-action.ts | 2 +- src/server/respond-to.ts | 1 - src/server/safe-redirect.ts | 12 +- src/server/typed-session.ts | 2 +- test/common/promise.test.ts | 2 +- test/common/timers.test.ts | 4 +- test/react.test.tsx | 4 +- test/react/fetcher-type.test.tsx | 8 +- test/react/use-delegated-anchors.test.tsx | 8 +- test/react/use-locales.test.tsx | 4 +- test/server/cors.test.ts | 2 +- test/server/csrf.test.ts | 2 +- test/server/event-stream.test.ts | 8 +- test/server/get-client-id-address.test.ts | 2 +- test/server/get-client-locales.test.ts | 2 +- test/server/honeypot.test.ts | 3 +- test/server/is-prefetch.test.ts | 2 +- test/server/json-hash.test.ts | 2 +- test/server/named-action.test.ts | 4 +- test/server/parse-accept-header.test.ts | 2 +- test/server/preload-route-assets.test.ts | 4 +- test/server/redirect-back.test.ts | 2 +- test/server/respond-to.test.ts | 2 +- test/server/responses.test.ts | 8 +- test/server/rolling-cookie.test.ts | 2 +- test/server/safe-redirect.test.ts | 2 +- test/server/typed-cookie.test.ts | 4 +- test/server/typed-session.test.ts | 8 +- vitest.config.ts | 20 +- vitest.setup.ts | 228 +++++++-------- 59 files changed, 561 insertions(+), 509 deletions(-) delete mode 100644 .eslintrc.cjs create mode 100644 .vscode/extensions.json create mode 100644 .vscode/settings.json create mode 100644 biome.json delete mode 100644 prettier.config.js delete mode 100644 scripts/tsconfig.json diff --git a/.eslintrc.cjs b/.eslintrc.cjs deleted file mode 100644 index ad835aa9..00000000 --- a/.eslintrc.cjs +++ /dev/null @@ -1,54 +0,0 @@ -/* eslint-disable unicorn/prefer-module */ -module.exports = { - root: true, - parser: "@typescript-eslint/parser", - plugins: [ - "@typescript-eslint", - "import", - "jsx-a11y", - "prettier", - "promise", - "react-hooks", - "react", - "unicorn", - ], - extends: [ - "plugin:@typescript-eslint/recommended", - "plugin:import/errors", - "plugin:import/typescript", - "plugin:import/warnings", - "plugin:jsx-a11y/recommended", - "plugin:prettier/recommended", - "plugin:promise/recommended", - "plugin:react-hooks/recommended", - "plugin:react/recommended", - "plugin:unicorn/recommended", - ], - settings: { - react: { version: "detect" }, - "import/resolver": { typescript: {} }, - }, - rules: { - "@typescript-eslint/explicit-module-boundary-types": "off", - "no-unused-vars": "off", - "no-var": "off", - "prefer-const": "off", - "react/prop-types": "off", - "react/button-has-type": "error", - "react/function-component-definition": [ - "error", - { - namedComponents: "function-declaration", - unnamedComponents: "arrow-function", - }, - ], - "react/jsx-uses-react": "off", - "react/react-in-jsx-scope": "off", - "react-hooks/rules-of-hooks": "error", - "react-hooks/exhaustive-deps": "error", - "unicorn/filename-case": "off", - "unicorn/no-null": "off", - "unicorn/prefer-node-protocol": "off", - "unicorn/prevent-abbreviations": "off", - }, -}; diff --git a/.github/workflows/bump.yml b/.github/workflows/bump.yml index a9c9fdbe..9bd0356e 100644 --- a/.github/workflows/bump.yml +++ b/.github/workflows/bump.yml @@ -4,13 +4,13 @@ on: workflow_dispatch: inputs: version: - description: 'Semver type of new version (major / minor / patch)' + description: "Semver type of new version (major / minor / patch)" required: true type: choice options: - - major - - minor - - patch + - major + - minor + - patch jobs: bump-version: @@ -22,7 +22,7 @@ jobs: ssh-key: ${{ secrets.DEPLOY_KEY }} - uses: oven-sh/setup-bun@v1 - - run: bun install + - run: bun install --frozen-lockfile - uses: actions/setup-node@v4 with: diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index c6280914..5d278993 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -13,7 +13,7 @@ jobs: steps: - uses: actions/checkout@v4 - uses: oven-sh/setup-bun@v1 - - run: bun install + - run: bun install --frozen-lockfile - run: bun run build exports: @@ -22,7 +22,7 @@ jobs: steps: - uses: actions/checkout@v4 - uses: oven-sh/setup-bun@v1 - - run: bun install + - run: bun install --frozen-lockfile - run: bun run test:exports typecheck: @@ -31,23 +31,23 @@ jobs: steps: - uses: actions/checkout@v4 - uses: oven-sh/setup-bun@v1 - - run: bun install + - run: bun install --frozen-lockfile - run: bun run typecheck test: - name: Unit and Integration Tests + name: Tests runs-on: ubuntu-latest steps: - uses: actions/checkout@v4 - uses: oven-sh/setup-bun@v1 - - run: bun install + - run: bun install --frozen-lockfile - run: bun run test - lint: - name: Linter + quality: + name: Code Quality runs-on: ubuntu-latest steps: - uses: actions/checkout@v4 - uses: oven-sh/setup-bun@v1 - - run: bun install - - run: bun run lint + - run: bun install --frozen-lockfile + - run: bun run check diff --git a/.github/workflows/docs.yml b/.github/workflows/docs.yml index 32aa6016..4ab85671 100644 --- a/.github/workflows/docs.yml +++ b/.github/workflows/docs.yml @@ -23,7 +23,7 @@ jobs: steps: - uses: actions/checkout@v4 - uses: oven-sh/setup-bun@v1 - - run: bun install ----frozen-lockfile && bunx typedoc + - run: bun install --frozen-lockfile && bunx typedoc - uses: actions/configure-pages@v5 - uses: actions/upload-pages-artifact@v3 with: diff --git a/.github/workflows/publish.yml b/.github/workflows/publish.yml index bd00783d..594f6e13 100644 --- a/.github/workflows/publish.yml +++ b/.github/workflows/publish.yml @@ -11,7 +11,7 @@ jobs: steps: - uses: actions/checkout@v4 - uses: oven-sh/setup-bun@v1 - - run: bun install + - run: bun install --frozen-lockfile - run: bun run build - run: bun run test:exports diff --git a/.npmignore b/.npmignore index 9a1dfa2b..d1955704 100644 --- a/.npmignore +++ b/.npmignore @@ -6,8 +6,8 @@ .gitignore .npmignore .npmrc +biome.json bun.lockb -prettier.config.js tsconfig.json vitest.config.ts vitest.setup.ts \ No newline at end of file diff --git a/.vscode/extensions.json b/.vscode/extensions.json new file mode 100644 index 00000000..e1216880 --- /dev/null +++ b/.vscode/extensions.json @@ -0,0 +1,14 @@ +{ + "recommendations": [ + "bierner.jsdoc-markdown-highlighting", + "biomejs.biome", + "bradlc.vscode-tailwindcss", + "csstools.postcss", + "formulahendry.auto-close-tag", + "formulahendry.auto-rename-tag", + "github.vscode-github-actions", + "vitest.explorer", + "vscode-icons-team.vscode-icons", + "waderyan.gitblame" + ] +} diff --git a/.vscode/settings.json b/.vscode/settings.json new file mode 100644 index 00000000..bb5495b7 --- /dev/null +++ b/.vscode/settings.json @@ -0,0 +1,70 @@ +{ + "[javascript]": { + "editor.defaultFormatter": "biomejs.biome" + }, + "[javascriptreact]": { + "editor.defaultFormatter": "biomejs.biome" + }, + "[json]": { + "editor.defaultFormatter": "biomejs.biome" + }, + "[jsonc]": { + "editor.defaultFormatter": "biomejs.biome" + }, + "[typescript]": { + "editor.defaultFormatter": "biomejs.biome" + }, + "[typescriptreact]": { + "editor.defaultFormatter": "biomejs.biome" + }, + "[markdown]": { + "editor.wordWrap": "on" + }, + "editor.codeActionsOnSave": { + "source.organizeImports.biome": "explicit", + "quickfix.biome": "explicit" + }, + "editor.formatOnPaste": true, + "editor.formatOnSave": true, + "editor.inlineSuggest.enabled": true, + "editor.multiCursorModifier": "ctrlCmd", + "editor.renderWhitespace": "all", + "editor.tabSize": 2, + "editor.wordWrap": "wordWrapColumn", + "editor.wordWrapColumn": 80, + "files.associations": { + "*.js": "javascriptreact", + "*.ts": "typescriptreact" + }, + "files.defaultLanguage": "markdown", + "tailwindCSS.classAttributes": ["class", "className", "cn", "tv"], + "workbench.editor.customLabels.enabled": true, + "workbench.editor.customLabels.patterns": { + "**/.github/workflows/*.yml": "${filename} - GitHub Action", + "**/app/**/*.stories.tsx": "${dirname}/${filename} - Story", + "**/app/**/*.test.ts": "${dirname}/${filename} - Unit Test", + "**/app/**/*.test.tsx": "${dirname}/${filename} - Component Test", + "**/app/components/**/*.tsx": "${dirname}/${filename} - Component", + "**/app/entry.client.tsx": "${dirname}/${filename} - Entry Client", + "**/app/entry.server.tsx": "${dirname}/${filename} - Entry Server", + "**/app/helpers/**/*.ts": "${dirname}/${filename} - Helper", + "**/app/helpers/**/*.tsx": "${dirname}/${filename} - Helper", + "**/app/hooks/**/*.ts": "${dirname}/${filename} - Hook", + "**/app/hooks/**/*.tsx": "${dirname}/${filename} - Hook", + "**/app/modules/**/*.ts": "${filename} - Module", + "**/app/routes/*.ts": "${dirname}/${filename} - Resource Route", + "**/app/routes/*.tsx": "${dirname}/${filename} - UI Route", + "**/app/routes/**/route.ts": "${dirname} - Resource Route", + "**/app/routes/**/route.tsx": "${dirname} - UI Route", + "**/app/ui/**/*.tsx": "${dirname}/${filename} - UI Kit", + "**/config/*.ts": "${filename} - Config", + "**/db/migrations/*.sql": "${filename} - Migration", + "**/db/schema.ts": "Database Schema", + "**/e2e/**/*.test.ts": "${filename} - E2E Test", + "**/locales/**/*.ts": "${dirname}/${filename} - Locale", + "**/scripts/**/*.ts": "${filename} - CLI", + "**/server/modules/**/*.ts": "${filename} - Server Module", + "**/types/**/*.d.ts": "${filename} - Type" + }, + "workbench.iconTheme": "vscode-icons" +} diff --git a/biome.json b/biome.json new file mode 100644 index 00000000..d6a3498a --- /dev/null +++ b/biome.json @@ -0,0 +1,55 @@ +{ + "$schema": "https://biomejs.dev/schemas/1.7.1/schema.json", + "organizeImports": { + "enabled": true + }, + "files": { + "ignore": ["src/server/json-hash.ts"] + }, + "linter": { + "enabled": true, + "rules": { + "recommended": true, + "correctness": { + "useHookAtTopLevel": "error" + }, + "performance": { + "noBarrelFile": "error", + "noReExportAll": "error" + }, + "style": { + "noNegationElse": "error", + "useConst": "off", + "useExportType": "off", + "useImportType": "off" + }, + "suspicious": { + "noConsoleLog": "warn", + "noEmptyBlockStatements": "warn", + "noSkippedTests": "error" + }, + "nursery": { + "useSortedClasses": { + "level": "error", + "options": { + "attributes": ["className", "class"], + "functions": ["cn", "tv"] + } + } + } + } + }, + "formatter": { "enabled": true }, + "vcs": { + "enabled": true, + "clientKind": "git", + "defaultBranch": "main", + "useIgnoreFile": true + }, + "overrides": [ + { + "include": ["**/*.md"], + "formatter": { "indentStyle": "tab" } + } + ] +} diff --git a/bun.lockb b/bun.lockb index 8b42aebdd6ba2e04199a7963ebb8271db4866c4b..77740751570f374da48c6582319fcb0793b53498 100755 GIT binary patch delta 36391 zcmeIb2UJv77e9LE&I~dtf(nQT3RWz11QZ#&Vnb9=L_v`{N|TNSu(w#RdK4?R*lQGf z@4Y69Vz05cM3boRw{H<*$oJ)Y@BQCeZ>`MY$3FXa_G$Z+d+wbJXV3IXYlU*toEjWG zsk!IeYO;H?sey%#!4Db?OOHz&Yc|i@FZ8H$y6@9dHYa$FK37%KgRAF!xTq2}=~p?9 z%Z&n|gB+3=DU#`i)ToqHj&qgy4r-1wMZ6beC9+RQHKZD%QdS~c6X+QlNhU{yN2EF$ zQZ7TMe2>YzpyjxV(Bl%*lA?l8L=__`!9dwyrL6abUIB&+kTGSDYDmaRNy_4;LMJ{c zJT*27>60Ae4Dp6kuC1|THwQU;_M;v%`;=8_}ZK~_e*8zg>m?PR{Ztbar##XrI?a{MJovfBe` z3AswvXFyira=6@Ka)bdAKe<8pMG0C%QU=blUKNruFoMKS?rTI^Ko&ug{V_<2-y-Yz zkod`sj2e&@gARyK!7qFw!XrePj)t1mfkAx)%0oVfKk$iEj=`jy(zYi*~7zj!_Be zoShs$+)m=-zmp zF}@-kqZ3TQQ+sISISz`-Qp@^p_EJI5A*n+5AgQOXLQ*~%v4)6Ps`GuY`NsmHSFNfnw< zUy8q3Uzn(=oAarm6#W*G>KAE9C_UB?gil8c_cv9@(I1VE@ZV(Ds<}KOBhNn12$A!lf%Jyd< zX+-RXteAtqDg-J+c4{ikA*BFk=(KvwLp&8ckrF^|_mT9~vXolFf?+&4Y)Ur8{RN?sW zK~av8hUAo}`1Gh`j$7SP?t<{RI0LSfqhLqN=T9A^{MSIINjxe?j!>pcGIVl%=r_D~ z7in}qhNO(j!c#OTfAN`A!rBQv7?RclUr6%c3fayJ z5)I9vg}>D4vZt5S!oQoILlIA1V1tb9A^ngc=>suPBT&I_Jth~JtE7`Eg84rO2`eCB z79?G?r}UL-nhZ&!KNvg}@NJ*I#HgiF{V+^&xuRc#PGjTI#3!T^&lyqivzj#V#|CC5}|DC#N7f6l+A*&Nl^BaW6?6I7!`oBxU0PI z#=LIM|CwFWKi)LuU_rmx#pdAq9YW|Un_$~U{01@IG%kQtEFv&m7B*lKfJaypF= zjOD!ukY}SHX$;0CMuw-LSCmQC5DBTrm%?e3kxQnePk^K$))_qYXfsH%>yE{gdQ!P` zJb_O6Uxg$)>z2Fsz`h?c7hm$Nu%L^ za%un3Qj0o{k!t1#otFApD3mfP8Y?Y`2O+CLUkyp|Ga;$Kp^)VANJv_tJInE&ay;rK zR^;^r$;0vC$%CTM)PRXCBv-YYDD{!gB&j9YkW^4qeBwYuoMC_~bm~KUNOJv6WJLO% z?}X$kbvx!ymeg-|4Ub_)4m=J?_1rU6swdsBVBDt6hfd36H1;|)E3>9pKW7?5%`p_4gZFba>FyWJc|KLO=sQ zVY|JbFsDJLaK5IWVAjx1SlrOg?xa!uJ)K-eyc_x~=FIp?PirncH79G)z>9|I&LNZQ zZuM;<>~H8GI5;@i-R$oXIL_nVc+Iwp)%tQtbuB;FY`bs6r77iCpFiJJGe36AF8&Cppwt~ew}BW681Yz%L!iF_l*GY>#DgpKb8XH{TlMU~BU!XZq?#Cnop~skU#* z;wkgyp0pkuzr7q+^U0V=d(Y1=e!Q&u{yVF$1g}0i zY2(;m%bZB>zjbY}+1pWORq7@-)+I;SIGdCedO6kiTQWax<={hg*9T2)F>-y!yR~-a zMOn3wH{aR{%&sx9cHod$TnZ9MSYv|7{zTml~)xNWD!qygA zHa_r+|Aj5NPF5MF6_|Y06&sERg(g=mFdYzS)i4wvk}%uIHnTgb;|WMnayuUi-?34}?leMCV#pQiT0bGQX)}!!Kw&Qtk`i>r6heI7qQQ5Rzi&A=Ft+`{*m@jK$4gvGPqlj?0O(1*99RlKmL}rkk?YrSF9!!Likn_ ztXt`|aabx_h+|}JH6gE+o;S7;3c>fWQN|9l5kgw)`R6u5UTeLsp{+E8R6_n5ZS-jF{yQ{p zF^(+VYe|`DMavXu#c^xoII(@Yr_iXL($Y|;w$wgx4r*hdH4_&2`RJA+L?vU%aQD)d zt;2C{f~~uct{H{EOL-+gqh&_Y4nS-5HD`5QsSX(09$vgpU7@hEUN;IPjeaaHZN2z? zb%l^FdcI{nA+L*GcdniiM>D*fgJA8i=Lb6oA^v(@fdd8*(xIQRl6-*{AQXA{@LlT* z)?M}5IrV8AhTdvsj6fUF4js$;HV_KCB98`wb%37l)=&ru(Ccb7;yC=!l=JY?bww~h z)bjnjbc>)#lQaL4w=onKL}_S{Xv<+w)rQK{c16fZ2yNq|8;%f}8w>fny^W!e$5euS zS1;YKUp4Cg#!ff9 zxAx-A+=aZJdfhO0sp>`owfmr~!35f8Xg$TM&`KPL^+_*;`upf+AVgKfT!80pK$H4D zA9JW?>3`3WdG(x+25{ zAP$ac=fyjE2_YeR?O-odSXj{BN4E|kDp*BV72R8CG&00q()nQ2gUB@#!h3k>lA+OH z#q??ErP~aR#zq-2-7nDaBe_xM)P&=jL*uFQ`1mG5USGX#B}l5UIQRL7O$6&uy)G0D zqFKucce;9M7eGU;0-G5l5GdJVfI8wb?JE?u@!<#h2q9s5?NJa-g(B3R1`PScSe&SH zWz9&e(_X>z3vR++9D3l#IUS{MpAOjBXo3kXq~@m3!#xm#4geO2#x$IP3`JPg#M;n z;PdX#$gfy5(!GtLP^IAzM7@DV&6C!lrl?gL$q)_7hDKS!665D6G#I1O`Mtc2TS>_< zDY49UfJQaJa9k!v^@Sqt3v@-YA=-~=Ql&M`d)jK;LWpvc)<#zpO0_`V81jSK2-dNB z?QW3G*oYwBT{u5mXAF&IMHwN#Cl+tGh^i*~MLP+a3wqT@w+kU^HzqX(`AcY0wltpV zV-QOIBF~1)8Z4u|baSB<_vBB|sB)YTj@DIaFQwxItaG|pXlRpE0>8SwP`FdCb4OjM zV?^g`bD+ftML9nFLq8#8m!9v@LCD*s*G}z#N(-T3KDv7dNmmW(R#!~YuS1(p?T~GHLInE8k68 z)+7_ZZi4jzJ_dSKY!+PGcmrytyle*W}GEm|LXyj6O9TUm|iKsKhxvlL2EkIa+zFB|}jWF;b zUb^ehq)~Jy%1dY4Tk-;?3|5Zby@kRYy>>pxC>ljtRS1m5`gRTxLXPNl*&r|=Xksq* z(jA8;^$>Mpg+7AyQN6Z%A32S7CPFQQqMbh4%Lw7h0Ebq>1nn<|Rv{ED=B)}9@{Z~G zKA}S4F}?2hP^s^*E@19A4pVkc(D*@NLf%;Hj>3dOh>(7Q^*AiP{V*0#CoH~Wz4)j7 zguHRsCH5BzAx8HXtjFv5WBr8?h^pa29z=hL<9hAha9R=;phq=3pC0M^~JWNRjd%Q5gX=MA#bBzcQ=;fu#V6Qfl(7`5c1CH`DX^9@SI-P zV&K<_jfH$HG%5k>nVXmPCNvC)mOi@bgOqWHs%k@^c?k>7`Dmvj)RIE{#X&;e1--U% z99+nxun0l*xEJAWF2uV4cCoA~{BP4N)5t8zIhLDuPEd_H=%x@S%lHFm1Bs;TI zg$qVVbeV1zLd9$MDQL7lV0Fc6p-%g{4q$iE7MiC}G}uQs6d@Y-nBjxHbX%d}QiefI zSD@dZ(VhuAC|sRf(-qIs9wZwYUAd&2h2zku-=*DyCPOMq+K9Hx5DKqjUkTFfYl8LA znY|*TUpa|xub`or3eRTf07%Gx6I%E+v zsUkF;i=erPadh3c9-(wTT@sR^QI|`dwHBI_sNqtsEhJ02nbFyd{5pJa)75XJP&iAk zTL4l@dgnWD4U|B-L-keAdJ+pc*gQo>oJbwg1%}i zq0tDDEPsX8>8sXiJjdbUFUJYcs07LKHnie&&J#+c2iXseJdPGE^3we-Yh}fL^PDOTY1E~_OZOwR5Lil&?_8!yrHj4D$4(Op zpXhakAmz!3CA`9PA>`+#IdwRWBhaU$w1$rPe{0DVf68t|A9q8+YR;-{okf$1po zBuU3u5I>MLMWVAzl$2zMfx&UYx}U4$kcL4cen@HoEG6PaJzQk*{1CDdfc0AZ{J$tM z|MB@>G96nr=r7ppM6h9>;wR}22@iW9& zNfJK`C?ga-lR9((G_qPK%SDj%A;|;zq~PTK!p4`egu>`aMA7bPYfsNXelk z2>L#U`$3HUv!nvH$~;NZx5@fHkyL>la=M*zx}8)$Wwc8s{*xrT-2e^w1F}6yYS9r{ zFHKUqqX5ZcvfWoHwO@*;h{&t5!T$+K6}Sdamt2?2$)Nzb<|aS}w`6%6l0LTq;_m=7 zsow%+fZqW6l$4auCxGlf1N8YXGUrbQlz|GVNopV|BdsirNWtg-iKLbr%lYZV{NR5n zP`Wfi0#g`L!isVQN|O{{S&k=Z0^JUh8d6K4nI}oXy0T7^g7svb zBn2I0og`JL0VGwx5t5>u=+`$=T+p56i2o!jAfYepD8m+zl%yqoQ9<f={;oqKS`=kkZd0eNlALkGDMd2ejq{Z=!!4s<-$=()LBuQTkNex^k^RmqO6G4W{Wdo8F{9e{cQars@M{*S;MXkXv^2`=ezL8}2 zgUpj8eXDH0N957}QsDodqz%tuWJL0mn4u&ocm}_y#TOu{;EQtnpCpaHk_6dYmJLfv zqJG3L%IGIKzN93cUZJE0#SVbDXp9T-fqGz|K4tvcAH7#g?PH`{(HMg-uMT1k-r4o=<<60kjz)R1|3>A zr2Xm1DVa6vC2t5SFtJvxbY~|1s!po8thc|a7Yp`RnXo-X%wxK)AdI_$i0=ww0oy^u zb|P#8KrCX001&YOAkGkx&#HCw1CM%03eDfr!vx5Cv>iFo>1GAWV9L*ui@D1`*sF#2zAc zFAt3g!9Yky=!nO~Heaz4YL~I`rXNWk!s`dq8)fdF@z90^<6GR**!Z8%Y z5tbDSA~O_35fR5&{V)&?VIU@lfjGgg5pk6W-+mxYu?hV^jPD2HIT2@All~yQ`-51} zAH+HKgowvPbO{G>fz1sEF((|vCn7Gf4g)~=4FIuj0EjE>BM~2nX#A6^6aN#(M*gJg z$yP>yc|goHj_n)@CO8tz@E9bz&Q8Q2k#Q7=J&7QSm@Wy#b|T`FK-^+Gh=`2_QHPS; zVHF31u!;eZHW<0y}Ef>sVVrJ!ndCjrA#LS5UvyN=u za_qP3VEp32gx&!2o@1+TfcZd-NfDS|ITlg`W@Q4HJ;Z$ESlOFkf)l~S-vskJyhV(0 z5*XWCU_Nnd;4LuQi8({e7miuq1`|6N%<$V_R4R6o7^`G3j(5PQRcy!|Fvp20B1WrX z4eo-;OaU|bE|@YZR!EFPDj45;V00=r@gA6~#Kdm~Q%=S15;HyxOxyclOjK;feK6kX zVBQmBs$#7kfO$;J@&{lls@NN1=45~gdI+YniY<8v#xE00)EIQB1=}6&v_77>67%XNak< zV%AT=TqS1sQ!owTbz;WnQa;mBK}WV@Ix6Trg0h(b!kHOnfOt&A86sR+RRP4Dk(7x5 z!kwKU!fzA^$C=2rv5M7vhFm`oGv*l>FBQ8;%*xSV8b1fqM8&$l0TVn1%+@zxd{m5o z3&waXn5eg^PF?7$LFJ>F)qc;~E%v!CvnCv$yN$bdzgC^X7ccxb9B&@xJH2lEPYydR z4E)6J2F&5w<~%HHYg}#K;W{!oxF!3?V?Px zKN&u(E;0?cG09&Wf1&P|8ydGsW7b$YScZkTbxIA~Z@zVOfN5Q4)5$$+?^-r?!<|9t zPF+h>uceA@CU;tmhdV9a!NILnY`{A($B8*YOj{MJ^d3y+1Tc+HgK4i~BTs{ImQ!#UR$TT>DWIE;z$qcwb&BG0OsQzR%--*wH8;A*> z2gX+eW+>dC0b@KL%yVLf!wp(6+lg7A1(O3e5EHuqOcx_`hczHfR)AQ= zdanR+m55pSAl9%=M2uex!f`c-b?o&H5Z>!3kFyw?8*s^@iaaK!tr@De370H0Fmu*} zc~8t1T(T;H@!J4qc}2cc&eoC((v$kG?{4}`Og?{R{GK)|b#qKtH-g;JU;FIeRd2n0QfpfFsD%fuij5rkYtiO0~rJ=u@=ja=D<)fLl zqUwYvyE^J$)oO3(RVk|B#=V^bT~5EevF%aL@v4I-sO{@^dzomqY)h~GY{i!e_|x@1 z4e}xvmi>6=?VVah%^JR=FRAfkOc@uH%=lPnxn&X6mo+`r>2Z3Oh5Nb|EMAs*w87Q! zw+GD_ePj6?b6xLukGF2>_x@@1>c$OMF0_pLlDu}H#eiLXj$}OFUL$K0y>+3&mu8gl z_L3RL1k9+aYC3G#$A`L_=0iVKKCMwLo0(D2zJui^Kf90@Ph;l~S!I8(+Fswod*hQX z#2jrD@VssEl`HRVRlMY3e)#O@5*6N2GT%LEZr>i@AYoz;GoXcx`ehF?7z|PLuSX?2@j9)AxKk zOJ-blM`+DQ<0ifz9TFo<+fc1b`qHfIj4H>swcAm<;FxJlEyuGRUmf{UapHRG&&_`A zfH$Hm9_c#z=c+kB2p&gn77dThm1|5H?<$#bK&wZM=1pjN_|z{kx$8gvVRV(5v`N<2 zPp{NGdg!28%R1d0dc-XK`<#SRrjN>Oztnnm$Euw!bLE}KJ$h0!yWfIe=}8e)I2ZZS zTNcVkGu@(S=Gq%MJvN)PZd0l_$x4`qh>8W;W z)7u1%wA}DW*#5oUPpjt!`k4B;_NEsU@MD~d9QTyWcxCGIW##n7SL<-)^13?ujxB7^ z-TM5AqDL9+#`@nqv(h(pT<<8?;N8JJ`{i#~So!{`Q5}A9bXos>pUCSu%NL*XNNdg3 zZB|*aPnaG2KCJIph*|6w%$IeQz#PB|PmI+MU_vW{IfOO7GMMAUn3#h(f>queOy*WF zdx$xPMau$=!!|JS7GO?b(IVz5F}9XqPGQlq1T($>%o$?NV9}}q#(O)M;Z?w#!=gpZ zV`3bwz+AwhWd&x=4lqT;T*9JN6^!3bFq5l-xq?NDm=DDGT7&rsiET=VjAY+&l_9X;*C7K zm?b7q{!L%MN(KJ@{Leh)%m?vowLSlfwt+p~Z!6f;8ar&0SGA>ortur38AFaSEH{wX zFo)W_3-4Kvh1BLZ^DYevD%8O>Pb>aUG`7wje;f?{^=3^tD4h5yemxZRQ@4SN$zE6K}S!X7d>U7{9mCD(I|lO znkv@*RcGWc_7`!di2LW=#a`R+)&5&g85KLw!(@OVk^XTD_hyXTqNP-#NqA~1{z`=7 zhD?APrCf7+pkgi!NLMPx`UZjv#h10^S;abhwSv)syi1>QEiOs(^c9BR;ro0GymI+P z`cRgG5lQj%dKrBbot#E51JEZ~wxMU4)kQ{nla118fSNLwD%;VEA_pl0e9~l&9tlZr zvtaS3*WW0f9&}BR4V5?F=p_$&jgCH9a$60sSn0WNxI)(W|?7rCRm87mu_Bm4qk`izq~3xu!B+<2Lzcdn>n^qBxj+0g6j zR5AKYk~u4c6J?Ix7^GlTAW7nKxG4xwV(MS&Z~9Dwq+m6`9|3aZbeXe3SWl7o%#b-- zgz2`5+$+c&jg5-3-AqU-qXtk`=4Oj_=zlwq^dd2Rm`IBMr-$1pQQRDvs|kG?K<=Fj zjxwwTv<1k$^JESynfS6H1h+uu>L9!tVe;A{Nc_-$F5`|-f0Nr5%Va%-srB^9honLr z0BSvbl-DHdBTR#o+`CM+!~Eki5GME1>yebUAwV;Ryt`878X?>cVe(`S)e1kHBVa)R zeAdXE6T(&qlPlNCoHN2(5T;hrPJ{|^0mvg%`3*9MC7H{UxlJcIod@M*BBrdQ(?3Lq=G#GYCYvado29W-^qzDmy$hgkI0TjKDnJZ z+JO+)1X!$UDMjuDi68o-9*zp81p8#p2Vp9N66}{byQ>J`Q~Q>RO?}SW(_+LnJm&{D zp-1X_fqlS!-~d3&&mn+b1KS1^0Na5bz)oNnu$xVO&)3MAh+qal?@+!6egQrJAA#S1 z-+^1eZQvU46F_yLMJg6B00V(RfHU9%xB_kfEn2ilH3mEZFTfjU0yG7D=vCR~Xh{p8 zCEx(EK5z%&yTCo*KJWl|2s{EF13v>#foH&T;05p!cn#1Zb_1Y=>o{-%I0>8rP6KCv zv%opvJiTLd0fCFaC4m0IVK1-`=n2qD7Yy_UX!_7VqM1OWoW>804H{%L9%u!m{-!ZP zV}iPr-cq{;TnCB(BQ&lIKySlc0uJZk*Ad`2a02L!$ZSaBa{+qsZym4^*aU0_=<6hU z#W4wZ3;Q=fB*Ia^BZQv-&jDIh3xVrEE*}$f0F;96-zLM1YpjD*!E_ zv}6tj`UBy>WVEO!WDj6E!d)TrA?fiKt&k0XhCm~rE>IDu1n7XWz+2e91KtC_03R@h z7ro-O6^}qU02~Ak0f*W1x4g4%1cD=hQ7r8(U$1Qng5f{}5D7#9(Lf9k3mAZbz#t$F zhzAmYL?8(m3?#E1Z~1CD^AKDEtOeEq>wyixMqm@L8Q20W0hR)bfW<&JpbO9$Xa%$e zZt~a%pmoN;Z_s}S{s8FB#w!55B6$`#2b>2&Xw*+ffL`XLcWE~w;Y;8(Pz2D*cNjPV z90h0rp}P%QGiZ&VHG!7w>A-9t3m6JS0t0~7KpUVf&>rvuoB&6lGGIZQfGP-B1JwW< zpayUhwcZ940Na5dfYm@dAOO(9hThMlmpx|y0&o)CDd0442Ivg50(QcF2hahS1-sb* z1LgqvIWVACTUP`0PVGEkK0vR-t^gJS%Yb}f3GgfIUm>GCKpo&HxM9EuU^4I>;)8%b zKo@{6;mv`1z%AHc1=4_NKpP;ZEq>9PrLSOc16U2L0geI3flMGB$N=bS)(vO}v;Zst zE5HokfUOYi0lyM*3-}*^b-)Q=E|3Sz0aB>{Q>DP4WJhpyfLg#}Uy`jb>t+Bg z*EFDi0)7NEz!l(3f$eX64Ye(;thCDR0;t<*2$550_-tXJpKz5~h2UI(cHYY%X-+Kx z@`3pP&Br`oF+g*T{w8lBKyega4y-7le~<7=nN#K~jW!y&R5Z@`4(vr^d^2>S!S0UrTHr)7?K z;%I@V3p*`=pP_#OtbsDnwLp#rzj)vaNSZS$K&gxxVd4lsLl{9)C26-n8RII!)r71L z)CcMUbpXn|Hc$beLQDXvba}{fKv_Uem&4gYp-T~6l4#;8HKPQk&?y6|KxJ8)Ln;-c z<eFid5X}gK$$o53~Si z{iG32BfSg4ZGl$6Oy~m88evM)2B37*2(qIKKu3UPQwK;tpnE&~S_q;X&>rDV04>sE z0ZK#(#sEP8B^nLn0`jf;mjF4O1DOrrdy}y8YRk^U5e^0{kuNoH7{Wt=J_rwi>9}osqLp09gR}g=%I68A0nHIdBv(0vHLbKm^VHlGlLo;4{EcPftX60-*Fd z=?ecH!ip`82!)>kemXD>m-0RAj3JpEMO);1vALmKprq3AiD*? zB48nK2R7>=*8yvR#lRY1HLwy`3giPzfMvkBJ6Kt5%{NuCo0Zj_ZCaxx7|yv) zkG2^d9iMX*iQOq%cT8^9&RiXBLlXg0GgtZ7zr0wmH|k``v*WPf?Re&5p|;}d^Q@zV z+Kq3_vusG4=GYRNP?ZlYxw*9Yv-L>n=H%k!f>n)Yr!CZ-J%eCT85TBmtv3uG)cBQX z;YN*$MGX1#;j2z}{p$xAc$KSDV{#Oi&NF{YwUy^sSWvwVX5QX)s`IC`VhegPkkW2j zd)0gNFuTLWF$;J$A8GlOJgZ;_xs_+L8?x$OIXog4qQ zh+5mk$rG&_s9~3p2cMx~W>eMXc1Xw_(@5T1kU2Cuc=#~?V(ZHq*31glf|ey&Az$S% zp^lrc`Dov5%M-omLW5?d5nE=39#Y!d)|l0;3LQN(rK&p5ytH<+X4YyuzM_tWS*vq- zt&>mq$=zjcSt)et+>sg;MjwrD?gt%ns)qhh&IIa~_u@s1#TPyoTPUXn8Kqu~ zj63_5FOD%O%Z4GXjdISA_p6~@E0~SDP;AkuEZa!AD<>0u2%DSjG5_S3VhiQ$qK7T( z7{71b=5TS$`m*dZrBzNlnlZwrcXs-FhhhumJfy&z`|`)V8)01>V^)rJwn5F56O?R+ zbX7eVb|tsiqFp(b3k!ZgIhJShb<|sVDo1TJys|X;!l2E4(HodgH0tv!iBB4HZ{FOu zV2#_JCK{EClN)}p3RYq^wkS)`&snat%A0t@JR8e^?w7 zRGB@anknZgEm@U4@P%=mi^UehDl@z4$Xz;u38y{eo7oSR;ItRKwhw@WRDrCoD^lGpAa=e>tM>G?&4tLPS#-kVZjf#V=gr@ zLigLT_4b&{lJ3S|wP#6gY74D9?tSc8HcV`u+e?eh^4SZYY3=&AM1>kli`Q@VtXVWN zQP*UrDKpcWEGZhrE9XV+?QS^4f4($LY=YR>x;5Eeq+p$Esr~sowb}ey>dyQRb=c3f z)D3v6dd#x6x+$Mkk9Dt&Y-kHf7raGvavL=q6E(n0HL{*~8;5h9*y7q>Yj0(vocAGvr=dwSWsr0_IAT)OQcJ(z=HNf?aKDhSYKw2B+ z)SRr>Td!VkzB`-x*q#29E|=uY%<7>uX)Ib+cToiKajPXq3dOW}>BL=$F4w6X?orqXwP{@GpjQ?(YkH>N&XUZDmh^ zRnBud<#FAq&qX8ZF?VTD&2wc=4oIt<4D~U;@-f>4^#NF52xCj+As!xuT(iqv3rn*) z;)fVF>`PFqGp=kH((;9_Y_kI zob(hHu1+3gp&WTtE!TFB4i;S>y@?*ltB)Ova@y7g!*eCq82b|BR}nS7U)1fG;kj*?7$a`o#Eg*|R|y8RJkIZTddNsWv9nY*PqJw21s8 zTiPh6W(8e(R(nXIS#Ma#`w{FP>>463)T_S}@={J3v#oij)_z^h9kBG2>SN-`5@6}6 z92s^Yc=h=X?-o7aRoQ5nlLxlM*rm|U$=~_llBy>UnTz!h`)Qds+uabYc5cdEQ69?a zUzgK7qKEItmo3!SXdU+b7%SwtKlQb^Pn3Jmrqmw9c;GmtpZ=pI#slt1eAxa*G-7B&kD5+t#%@v# z|9**8M#FcFStIly|4om2{(X;@vYW?Tp<9q#JzGzCUBzyGB9`ylPFTK2w_q;L=)5y6 zq~SJoLVo+zyT&D>vhu*Zh8Qz+-azdmqsk2VrfH0w>X}7{>8HyX&9pa{f6aI zYi6Df%NlK%A4y!khNUC#QZ6|(F>oP~FF7{Kk#5S#FVbZi)#Du6vS(hnG$OC2-pJFv zElYs3`nx{g4ij}?#6<5Xk?WN;# z>Ks|oqh7Uv8YQg<_oY4ijI_MHAFD7FjZ+SD%bb+Dr}DGkCc{#`f1A^qb-Oo_l*p%9V;vC17%qA0g$yYLs2TnF)0mMid zSZHy*`^Koc2d5kqcjxn&^$s2;b5J>X`YIW@aB>DUkb!c{+YcYB7f#DvxLs*=V{W!T zv&(|Vlmp@F+F5$l7#2i#XQEHtIpyrRu^sfCmcASRNs6IG{}+Fjkfm-=TisO}Vx{*B zZ7igIF=ywq)EXP*a5~%R9TOrJ3mN>^3;&j`>=i0wqa1VRd(_yWhw-tk#TF$q;_tU- z`XTVtH$BI9ZO^_V9>)7iNYB#y9?K5;9?u*xjg=#aq&9k>jml_HPHh{$yGO3ifpM~b zXlb3~&&)=mG)&sQG;WlW=sIrwa{FfA+d)cRZk%5aHVqb@%8_#(!zRypGi>us#n+yk za!6h8Ax422q4A2Wyk2yWqO{Ar^WepWny)4@eN`wD9ckhW(5=WGAuon zGeHLouI<~RoGC3NuDCp5_5SN6pB6UUGAPRg3v7&+E9oCz>SkuX>qWR%|R=bq7@#FdXa;wNRB7h!HF$K zfccxD;`#R-ubhn-cI}mu|6=P2N-f;EDSg>q3^PyV{Kvm`{NGO{X`)zS%cKlexrUy~ z(TGQFDt}(^#MDYE&mCQ*9G>`eP1N#*7Z+_Sj(Hi%rcmp!-mV;ht*LSjqx+1AAqN&L z9?q-QhDmpIM(OCGvO}#x}OXMZZ!j^r`GnPvzam z#5w0ov&VO4W~y%eqzm?6i<*ZRde(O&j15CZyp*w}#vN}-xb*uph_b zK1CfVm7*MIM$hlW>vbvnu58+OVO%O_LMn%!VTbCC2ZpXLNF(lNcx8X1ieeSUV{#~m zLZ0+Dp8vSk$hPDZx`TG%YDF>qI1Dg6BW*NWZKe9mCXG{9wc+u|zapBr=eu|9%wJ|5 zEnbs1MX~*q03*-_n{!?+f^Qwo0!R;xX065}J}jCoBt0dXO`|F(=TVw193z|@anS@- zaHBoC8z*n`X(r=QUn4ECu59=~bu~}r5K86LHY7qEt;5RUhZ`HT)gSEEp4KrBX@`vp z-9&*@kq=Z69|LPN0XizwZUVL-Z4GQDq)mW9>P5@WH!Xf*wm4bvm|aZQ;wI=3lSS$^+q3 zs4-b=h+G-AtpD$;iY=}f*b6HE4lJmYKf=mxe_J!6gvD05W`n06O0L@|Cad_yA05+d zGMrU!AWNEzJpTTnvU1kwuu#p0%#@)8G*O7!){DL&83vN@+0O3{LwhJ zcdB~4@<917kDSf$sGZ%IhDSp3vSU-~15|PAipQj#r=xdDdra!ugl^36m^2p_r9LK= zEJ}M!D#cW-%+69;=gNP5Oe$HF_Lx+P!DCXJ8K_xlk4Ys9JSGi*MX8TTC5zG?lS(mo zOuCTLmiCxbvMB8_sTA`O4{)hwr9CEqJiid1qP?4m%1y{*t!80pVm(ivg_Ws$7IR@}@PA7A z=ckh9bjvE<)JoTc&Nj+9uut{-7uCz&@eIwtlL2~qurrIzoDCN!N64(T0p&U&+Z+F82eb%O?VvLyf z%TRV2X>F9lZQo8ysP)_HNmwVudwV>*kSge@oN_z*%hrXzTUnr+mCQ?Rqu48Zhcka_ zTvRrTn+qvdl;4%j=FdSdmC0e}A#Id{Xq8hx<-9S;^K;n#{%Q*i?y|SBia~128gQL* zP_A+)soWaW)h?GU?1q9obJ_V`*yEh-wr$Q4uS zBs<3D@B7woG+SK4bvA$B$NfjM7i5_mC5&|PiIZCxSMmgG7Ic&8!MmhXfIgVA1>4Acj^MREUTZyCvnN9bWRLU^V@G(con`&7qZ-B!GYUKV!uQb!uhB0F6F9eQQx%LnzD6y3h1&3-S*1Lh}qc4?7%m-P2j z15=#EzoWvR0jvGg1JV-M*~MyGRy$u^m-SnsPQt%MxP47sv*7g-b&zwxl#A+H6$@-T zYXViw^rN~dyL}Shn;m_k9>g}kRR2nx6}ud*smWHoQm-!<+(l!eVqN=dtXPX)nzAh0 zUo(zPQ)_xN7nPUJ=)Gt^YpgCKn zY(!#Ylw)*qczhH~3D#_5k0Uf@TI}_3&(Na1#;d@qx2A%ctq;{yW8GDnj;!KCwK*Go z4>`Ru(&!5It2F0TtaD#YHrw+_?N;!%uV#pvxt7z^V>LeE3Esl~nvjCva+>$JmHJvS z)U#}XS-7UBs$gg|o+7gSg=(!OJml=?jNguQ&*tis8Z(5PwkTR-Uys<-tfZ(E*+LA9 zcAjL{LW;{^74;e$)_;J;sJwFq*=D3T;$DuuiqX_(H*cxU)VSkdch17I!(%iKCIi9; zM8!ELrzND~pmH|7rN+EqS&YU`RZY$?JlPQLI5;gTIjcCt>{@Fq3Tn5~bi*HCwm^Su zY_9PT%VZvHHNH|am$uN%Ew~k{i8ZNeNT7r09aB=14GA&yJIPU^*z3z`dlvMEI*N6& zg?o>b)wC)Ykgi$B<9kGnhHV_9sl?7KQP(ao&C+zymN%q0h9}3Q#Ur;AmhYyqr~rl< z9tl1S(FDOvFY65}L??YGwG znWwGB!Xzdt6}6+PrWhhvx9`<8Se&&cnDNy#p6sVG8Yfoao?6FRR?{?LJ?%BNWl#mm zo85j0(<%1Ir~mJ24a+9`)ApJ`cBQtaE!DOs)3>Lkt* zcISJwZH_o!lzBs4O@D`oZpL**>}Dk%e?IA$VMuUybIkPgXz^DzJURXwJ~BKR3I1X( z)3SXe6^G&}`#3{FTIOHuCHAk`f3x1v34UJryEbJC(F9=~p>H zNlHo6pp-PlMHKg$V*jT$NCTi`8%i)r3ipyFd>t}!mA>k*mWNoRAtjYfzlceflB?-x G{C@!r{i*x_ literal 297149 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 diff --git a/package.json b/package.json index 216b66e9..aad37713 100644 --- a/package.json +++ b/package.json @@ -1,180 +1,166 @@ { - "name": "remix-utils", - "version": "7.6.0", - "license": "MIT", - "engines": { - "node": ">=18.0.0" - }, - "type": "module", - "exports": { - "./package.json": "./package.json", - "./promise": "./build/common/promise.js", - "./cache-assets": "./build/client/cache-assets.js", - "./cors": "./build/server/cors.js", - "./get-client-ip-address": "./build/server/get-client-ip-address.js", - "./is-prefetch": "./build/server/is-prefetch.js", - "./json-hash": "./build/server/json-hash.js", - "./named-action": "./build/server/named-action.js", - "./parse-accept-header": "./build/server/parse-accept-header.js", - "./preload-route-assets": "./build/server/preload-route-assets.js", - "./redirect-back": "./build/server/redirect-back.js", - "./respond-to": "./build/server/respond-to.js", - "./responses": "./build/server/responses.js", - "./rolling-cookie": "./build/server/rolling-cookie.js", - "./safe-redirect": "./build/server/safe-redirect.js", - "./typed-cookie": "./build/server/typed-cookie.js", - "./typed-session": "./build/server/typed-session.js", - "./client-only": "./build/react/client-only.js", - "./existing-search-params": "./build/react/existing-search-params.js", - "./external-scripts": "./build/react/external-scripts.js", - "./fetcher-type": "./build/react/fetcher-type.js", - "./server-only": "./build/react/server-only.js", - "./use-debounce-fetcher": "./build/react/use-debounce-fetcher.js", - "./use-debounce-submit": "./build/react/use-debounce-submit.js", - "./use-delegated-anchors": "./build/react/use-delegated-anchors.js", - "./use-global-navigation-state": "./build/react/use-global-navigation-state.js", - "./use-hydrated": "./build/react/use-hydrated.js", - "./use-should-hydrate": "./build/react/use-should-hydrate.js", - "./sse/server": "./build/server/event-stream.js", - "./sse/react": "./build/react/use-event-source.js", - "./locales/server": "./build/server/get-client-locales.js", - "./locales/react": "./build/react/use-locales.js", - "./honeypot/server": "./build/server/honeypot.js", - "./honeypot/react": "./build/react/honeypot.js", - "./csrf/server": "./build/server/csrf.js", - "./csrf/react": "./build/react/authenticity-token.js", - "./sec-fetch": "./build/server/sec-fetch.js", - "./timers": "./build/common/timers.js" - }, - "sideEffects": false, - "scripts": { - "prepare": "npm run build", - "build": "tsc --project tsconfig.json --outDir ./build", - "postbuild": "prettier --write \"build/**/*.js\" \"build/**/*.d.ts\"", - "format": "prettier --write \"src/**/*.ts\" \"src/**/*.tsx\" \"test/**/*.ts\" \"test/**/*.tsx\" \"*.md\" \"package.json\"", - "typecheck": "tsc --project tsconfig.json --noEmit", - "lint": "eslint --ext .ts,.tsx src/", - "test": "vitest --run", - "test:watch": "vitest", - "test:coverage": "vitest --coverage", - "test:exports": "bun scripts/check-pkg-exports.ts" - }, - "author": { - "name": "Sergio Xalambrí", - "url": "https://sergiodxa.com", - "email": "hello@sergiodxa.com" - }, - "repository": { - "type": "git", - "url": "https://github.com/sergiodxa/remix-utils" - }, - "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" - ], - "peerDependencies": { - "@remix-run/cloudflare": "^2.0.0", - "@remix-run/node": "^2.0.0", - "@remix-run/react": "^2.0.0", - "@remix-run/router": "^1.7.2", - "crypto-js": "^4.1.1", - "intl-parse-accept-language": "^1.0.0", - "is-ip": "^5.0.1", - "react": "^18.0.0", - "zod": "^3.22.4" - }, - "peerDependenciesMeta": { - "@remix-run/cloudflare": { - "optional": true - }, - "@remix-run/node": { - "optional": true - }, - "@remix-run/react": { - "optional": true - }, - "@remix-run/router": { - "optional": true - }, - "crypto-js": { - "optional": true - }, - "intl-parse-accept-language": { - "optional": true - }, - "is-ip": { - "optional": true - }, - "react": { - "optional": true - }, - "zod": { - "optional": true - } - }, - "devDependencies": { - "@arethetypeswrong/cli": "^0.15.0", - "@remix-run/node": "^2.0.0", - "@remix-run/react": "^2.0.0", - "@remix-run/router": "^1.7.2", - "@remix-run/testing": "^2.0.0", - "@testing-library/jest-dom": "^6.1.3", - "@testing-library/react": "^15.0.2", - "@types/crypto-js": "^4.1.2", - "@types/react": "^18.2.78", - "@typescript-eslint/eslint-plugin": "^7.0.2", - "@typescript-eslint/parser": "^7.0.1", - "@vitejs/plugin-react": "^4.2.1", - "@vitest/coverage-v8": "^1.5.0", - "crypto-js": "^4.1.1", - "eslint": "^8.12.0", - "eslint-config-prettier": "^9.0.0", - "eslint-import-resolver-typescript": "^3.6.1", - "eslint-plugin-cypress": "^2.15.1", - "eslint-plugin-import": "^2.28.1", - "eslint-plugin-jest-dom": "^5.1.0", - "eslint-plugin-jsx-a11y": "^6.7.1", - "eslint-plugin-prettier": "^5.0.0", - "eslint-plugin-promise": "^6.1.1", - "eslint-plugin-react": "^7.33.2", - "eslint-plugin-react-hooks": "^4.6.0", - "eslint-plugin-testing-library": "^6.2.2", - "eslint-plugin-unicorn": "^52.0.0", - "happy-dom": "^14.7.1", - "intl-parse-accept-language": "^1.0.0", - "is-ip": "5.0.1", - "msw": "^2.2.13", - "prettier": "^3.0.3", - "react": "^18.0.0", - "react-dom": "^18.0.0", - "ts-node": "^10.9.1", - "typedoc": "^0.25.13", - "typedoc-plugin-mdn-links": "^3.1.23", - "typescript": "^5.2.2", - "vite": "^5.2.8", - "vitest": "^1.4.0", - "zod": "^3.22.4" - }, - "dependencies": { - "type-fest": "^4.18.1" - } + "name": "remix-utils", + "version": "7.6.0", + "license": "MIT", + "engines": { + "node": ">=18.0.0" + }, + "type": "module", + "exports": { + "./package.json": "./package.json", + "./promise": "./build/common/promise.js", + "./cache-assets": "./build/client/cache-assets.js", + "./cors": "./build/server/cors.js", + "./get-client-ip-address": "./build/server/get-client-ip-address.js", + "./is-prefetch": "./build/server/is-prefetch.js", + "./json-hash": "./build/server/json-hash.js", + "./named-action": "./build/server/named-action.js", + "./parse-accept-header": "./build/server/parse-accept-header.js", + "./preload-route-assets": "./build/server/preload-route-assets.js", + "./redirect-back": "./build/server/redirect-back.js", + "./respond-to": "./build/server/respond-to.js", + "./responses": "./build/server/responses.js", + "./rolling-cookie": "./build/server/rolling-cookie.js", + "./safe-redirect": "./build/server/safe-redirect.js", + "./typed-cookie": "./build/server/typed-cookie.js", + "./typed-session": "./build/server/typed-session.js", + "./client-only": "./build/react/client-only.js", + "./existing-search-params": "./build/react/existing-search-params.js", + "./external-scripts": "./build/react/external-scripts.js", + "./fetcher-type": "./build/react/fetcher-type.js", + "./server-only": "./build/react/server-only.js", + "./use-debounce-fetcher": "./build/react/use-debounce-fetcher.js", + "./use-debounce-submit": "./build/react/use-debounce-submit.js", + "./use-delegated-anchors": "./build/react/use-delegated-anchors.js", + "./use-global-navigation-state": "./build/react/use-global-navigation-state.js", + "./use-hydrated": "./build/react/use-hydrated.js", + "./use-should-hydrate": "./build/react/use-should-hydrate.js", + "./sse/server": "./build/server/event-stream.js", + "./sse/react": "./build/react/use-event-source.js", + "./locales/server": "./build/server/get-client-locales.js", + "./locales/react": "./build/react/use-locales.js", + "./honeypot/server": "./build/server/honeypot.js", + "./honeypot/react": "./build/react/honeypot.js", + "./csrf/server": "./build/server/csrf.js", + "./csrf/react": "./build/react/authenticity-token.js", + "./sec-fetch": "./build/server/sec-fetch.js", + "./timers": "./build/common/timers.js" + }, + "sideEffects": false, + "scripts": { + "prepare": "npm run build", + "build": "tsc --project tsconfig.json --outDir ./build", + "format": "biome format --write .", + "typecheck": "tsc --project tsconfig.json --noEmit", + "check": "biome check .", + "lint": "biome lint .", + "test": "vitest --run", + "test:watch": "vitest", + "test:coverage": "vitest --coverage", + "test:exports": "bun scripts/check-pkg-exports.ts" + }, + "author": { + "name": "Sergio Xalambrí", + "url": "https://sergiodxa.com", + "email": "hello@sergiodxa.com" + }, + "repository": { + "type": "git", + "url": "https://github.com/sergiodxa/remix-utils" + }, + "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" + ], + "peerDependencies": { + "@remix-run/cloudflare": "^2.0.0", + "@remix-run/node": "^2.0.0", + "@remix-run/react": "^2.0.0", + "@remix-run/router": "^1.7.2", + "crypto-js": "^4.1.1", + "intl-parse-accept-language": "^1.0.0", + "is-ip": "^5.0.1", + "react": "^18.0.0", + "zod": "^3.22.4" + }, + "peerDependenciesMeta": { + "@remix-run/cloudflare": { + "optional": true + }, + "@remix-run/node": { + "optional": true + }, + "@remix-run/react": { + "optional": true + }, + "@remix-run/router": { + "optional": true + }, + "crypto-js": { + "optional": true + }, + "intl-parse-accept-language": { + "optional": true + }, + "is-ip": { + "optional": true + }, + "react": { + "optional": true + }, + "zod": { + "optional": true + } + }, + "devDependencies": { + "@arethetypeswrong/cli": "^0.15.0", + "@biomejs/biome": "^1.7.2", + "@remix-run/node": "^2.0.0", + "@remix-run/react": "^2.0.0", + "@remix-run/router": "^1.7.2", + "@remix-run/testing": "^2.0.0", + "@testing-library/jest-dom": "^6.1.3", + "@testing-library/react": "^15.0.2", + "@types/bun": "^1.1.1", + "@types/crypto-js": "^4.1.2", + "@types/react": "^18.2.78", + "@vitejs/plugin-react": "^4.2.1", + "@vitest/coverage-v8": "^1.5.0", + "crypto-js": "^4.1.1", + "happy-dom": "^14.7.1", + "intl-parse-accept-language": "^1.0.0", + "is-ip": "5.0.1", + "msw": "^2.2.13", + "react": "^18.0.0", + "react-dom": "^18.0.0", + "ts-node": "^10.9.1", + "typedoc": "^0.25.13", + "typedoc-plugin-mdn-links": "^3.1.23", + "typescript": "^5.2.2", + "vite": "^5.2.8", + "vitest": "^1.4.0", + "zod": "^3.22.4" + }, + "dependencies": { + "type-fest": "^4.18.1" + } } diff --git a/prettier.config.js b/prettier.config.js deleted file mode 100644 index 9953c75d..00000000 --- a/prettier.config.js +++ /dev/null @@ -1,6 +0,0 @@ -/* eslint-disable unicorn/prefer-module */ -/** @type {import("prettier").Config} */ -export default { - trailingComma: "all", - useTabs: true, -}; diff --git a/scripts/check-pkg-exports.ts b/scripts/check-pkg-exports.ts index da596d89..5a3e8249 100644 --- a/scripts/check-pkg-exports.ts +++ b/scripts/check-pkg-exports.ts @@ -1,7 +1,7 @@ -/* eslint-disable unicorn/no-process-exit */ +import { file, spawn } from "bun"; async function main() { - const proc = Bun.spawn([ + let proc = spawn([ "bunx", "attw", "-f", @@ -11,9 +11,9 @@ async function main() { "--pack", ]); - const text = await new Response(proc.stdout).text(); + let text = await new Response(proc.stdout).text(); - const entrypointLines = text + let entrypointLines = text .slice(text.indexOf('"remix-utils/')) .split("\n") .filter(Boolean) @@ -26,9 +26,9 @@ async function main() { .replaceAll(/│$/g, ""), ); - const pkg = await Bun.file("package.json").json(); - const entrypoints = entrypointLines.map((entrypointLine) => { - const [entrypoint, ...resolutionColumns] = entrypointLine.split("│"); + let pkg = await file("package.json").json(); + let entrypoints = entrypointLines.map((entrypointLine) => { + let [entrypoint, ...resolutionColumns] = entrypointLine.split("│"); return { entrypoint: entrypoint.replace(pkg.name, ".").trim(), esm: resolutionColumns[2].trim(), @@ -36,22 +36,13 @@ async function main() { }; }); - const entrypointsWithProblems = entrypoints.filter( + let entrypointsWithProblems = entrypoints.filter( (item) => item.esm.includes("fail") || item.bundler.includes("fail"), ); + if (entrypointsWithProblems.length > 0) { console.error("Entrypoints with problems:"); - console.log( - `---\n${entrypointsWithProblems - .map( - ({ entrypoint, esm, bundler }) => - `entrypoint: ${entrypoint}\nesm: ${esm}\nbundler: ${bundler}`, - ) - .join("\n---\n")}\n---`, - ); process.exit(1); - } else { - console.log("No problems found."); } } diff --git a/scripts/tsconfig.json b/scripts/tsconfig.json deleted file mode 100644 index 69cb6e2c..00000000 --- a/scripts/tsconfig.json +++ /dev/null @@ -1,7 +0,0 @@ -{ - "extends": "../tsconfig.json", - "compilerOptions": { - "types": ["bun-types"] - }, - "include": ["./*.ts"] -} diff --git a/src/common/promise.ts b/src/common/promise.ts index 5e391a88..38bc0907 100644 --- a/src/common/promise.ts +++ b/src/common/promise.ts @@ -84,34 +84,32 @@ let TIMEOUT = Symbol("TIMEOUT"); * } * } */ -export function timeout( +export async function timeout( promise: Promise, options: { controller?: AbortController; ms: number }, ): Promise { - return new Promise(async (resolve, reject) => { - let timer: NodeJS.Timeout | null = null; + let timer: Timer | null = null; - try { - let result = await Promise.race([ - promise, - new Promise((resolve) => { - timer = setTimeout(() => resolve(TIMEOUT), options.ms); - }), - ]); + try { + let result = await Promise.race([ + promise, + new Promise((resolve) => { + timer = setTimeout(() => resolve(TIMEOUT), options.ms); + }), + ]); - if (timer) clearTimeout(timer); + if (timer) clearTimeout(timer); - if (result === TIMEOUT) { - if (options.controller) options.controller.abort(); - return reject(new TimeoutError(`Timed out after ${options.ms}ms`)); - } - - return resolve(result as Awaited); - } catch (error) { - if (timer) clearTimeout(timer); - reject(error); + if (result === TIMEOUT) { + if (options.controller) options.controller.abort(); + throw new TimeoutError(`Timed out after ${options.ms}ms`); } - }); + + return result as Awaited; + } catch (error) { + if (timer) clearTimeout(timer); + throw error; + } } /** diff --git a/src/react/existing-search-params.tsx b/src/react/existing-search-params.tsx index ec8f7caf..bd621ec8 100644 --- a/src/react/existing-search-params.tsx +++ b/src/react/existing-search-params.tsx @@ -1,5 +1,5 @@ -import * as React from "react"; import { useSearchParams } from "@remix-run/react"; +import * as React from "react"; type Props = { /** diff --git a/src/react/external-scripts.tsx b/src/react/external-scripts.tsx index b07200ed..73e8b480 100644 --- a/src/react/external-scripts.tsx +++ b/src/react/external-scripts.tsx @@ -1,5 +1,5 @@ -import * as React from "react"; import { useLocation, useMatches } from "@remix-run/react"; +import * as React from "react"; import { HandleConventionArguments } from "./handle-conventions.js"; import { useHydrated } from "./use-hydrated.js"; @@ -58,9 +58,9 @@ export type ScriptDescriptor = { type?: ScriptType; }; -export interface ExternalScriptsFunction { - (args: HandleConventionArguments): ScriptDescriptor[]; -} +export type ExternalScriptsFunction = ( + args: HandleConventionArguments, +) => ScriptDescriptor[]; /** * Define the shape of the `handle` export if you want to use `scripts`. Combine diff --git a/src/react/handle-conventions.ts b/src/react/handle-conventions.ts index bec2f032..a67d7c07 100644 --- a/src/react/handle-conventions.ts +++ b/src/react/handle-conventions.ts @@ -1,5 +1,5 @@ -import type { RouterState } from "@remix-run/router"; import type { Location, Params, useMatches } from "@remix-run/react"; +import type { RouterState } from "@remix-run/router"; export type HandleConventionArguments = { id: string; diff --git a/src/react/use-debounce-fetcher.ts b/src/react/use-debounce-fetcher.ts index 95978fe8..e4beb3ff 100644 --- a/src/react/use-debounce-fetcher.ts +++ b/src/react/use-debounce-fetcher.ts @@ -1,7 +1,7 @@ import type { - SubmitOptions, FetcherWithComponents, SubmitFunction, + SubmitOptions, } from "@remix-run/react"; import { useFetcher } from "@remix-run/react"; import { useCallback, useEffect, useRef } from "react"; @@ -35,7 +35,7 @@ type DebouncedFetcher = Omit< > & { submit: DebounceSubmitFunction }; export function useDebounceFetcher() { - let timeoutRef = useRef(); + let timeoutRef = useRef(); useEffect(() => { // no initialize step required since timeoutRef defaults undefined @@ -43,7 +43,7 @@ export function useDebounceFetcher() { return () => { if (timeout) clearTimeout(timeout); }; - }, [timeoutRef]); + }, []); let fetcher = useFetcher() as DebouncedFetcher; diff --git a/src/react/use-debounce-submit.ts b/src/react/use-debounce-submit.ts index 6d4e020d..680b23a5 100644 --- a/src/react/use-debounce-submit.ts +++ b/src/react/use-debounce-submit.ts @@ -1,11 +1,11 @@ -import type { SubmitOptions, SubmitFunction } from "@remix-run/react"; +import type { SubmitFunction, SubmitOptions } from "@remix-run/react"; import { useSubmit } from "@remix-run/react"; import { useCallback, useEffect, useRef } from "react"; type SubmitTarget = Parameters["0"]; export function useDebounceSubmit() { - let timeoutRef = useRef(); + let timeoutRef = useRef(); useEffect(() => { // no initialize step required since timeoutRef defaults undefined @@ -13,7 +13,7 @@ export function useDebounceSubmit() { return () => { if (timeout) clearTimeout(timeout); }; - }, [timeoutRef]); + }, []); // Clone the original submit to avoid a recursive loop const originalSubmit = useSubmit(); diff --git a/src/react/use-delegated-anchors.tsx b/src/react/use-delegated-anchors.tsx index 2896bc7e..6d314a60 100644 --- a/src/react/use-delegated-anchors.tsx +++ b/src/react/use-delegated-anchors.tsx @@ -6,7 +6,7 @@ const context = React.createContext(false); export function isLinkEvent(event: MouseEvent) { if (!(event.target instanceof HTMLElement)) return; let a = event.target.closest("a"); - if (a && a.hasAttribute("href") && a.host === window.location.host) return a; + if (a?.hasAttribute("href") && a.host === window.location.host) return a; return; } diff --git a/src/react/use-event-source.ts b/src/react/use-event-source.ts index 09ee0dcc..30f3a200 100644 --- a/src/react/use-event-source.ts +++ b/src/react/use-event-source.ts @@ -1,4 +1,4 @@ -import { useEffect, useState, createContext, useContext } from "react"; +import { createContext, useContext, useEffect, useState } from "react"; export interface EventSourceOptions { init?: EventSourceInit; diff --git a/src/react/use-global-navigation-state.ts b/src/react/use-global-navigation-state.ts index 6d7d8f0a..dc2b6407 100644 --- a/src/react/use-global-navigation-state.ts +++ b/src/react/use-global-navigation-state.ts @@ -1,4 +1,4 @@ -import { useNavigation, useFetchers, useRevalidator } from "@remix-run/react"; +import { useFetchers, useNavigation, useRevalidator } from "@remix-run/react"; import { useMemo } from "react"; /** diff --git a/src/react/use-hydrated.ts b/src/react/use-hydrated.ts index ef68c1bd..82646ec1 100644 --- a/src/react/use-hydrated.ts +++ b/src/react/use-hydrated.ts @@ -1,6 +1,7 @@ import { useSyncExternalStore } from "react"; function subscribe() { + // biome-ignore lint/suspicious/noEmptyBlockStatements: Mock function return () => {}; } diff --git a/src/server/cors.ts b/src/server/cors.ts index 0e9135a5..5ee4b4d6 100644 --- a/src/server/cors.ts +++ b/src/server/cors.ts @@ -87,7 +87,7 @@ class CORS { } private configureMaxAge(headers: Headers) { - var { maxAge } = this.options; + const { maxAge } = this.options; if (!this.isNumber(maxAge)) return headers; diff --git a/src/server/csrf.ts b/src/server/csrf.ts index 6100a2bd..95b089ab 100644 --- a/src/server/csrf.ts +++ b/src/server/csrf.ts @@ -184,9 +184,9 @@ export class CSRF { } private parseCookie(data: FormData | Request, headers?: Headers) { - if (data instanceof Request) headers = data.headers; - if (!headers) return null; - return this.cookie.parse(headers.get("cookie")); + let _headers = data instanceof Request ? data.headers : headers; + if (!_headers) return null; + return this.cookie.parse(_headers.get("cookie")); } private sign(token: string) { diff --git a/src/server/event-stream.ts b/src/server/event-stream.ts index 34b3a493..0597d67f 100644 --- a/src/server/event-stream.ts +++ b/src/server/event-stream.ts @@ -6,21 +6,16 @@ interface SendFunctionArgs { data: string; } -interface SendFunction { - (args: SendFunctionArgs): void; -} +type SendFunction = (args: SendFunctionArgs) => void; -interface CleanupFunction { - (): void; -} +type CleanupFunction = () => void; -interface AbortFunction { - (): void; -} +type AbortFunction = () => void; -interface InitFunction { - (send: SendFunction, abort: AbortFunction): CleanupFunction; -} +type InitFunction = ( + send: SendFunction, + abort: AbortFunction, +) => CleanupFunction; /** * A response helper to use Server Sent Events server-side diff --git a/src/server/get-client-ip-address.ts b/src/server/get-client-ip-address.ts index d28a83f3..93d7895e 100644 --- a/src/server/get-client-ip-address.ts +++ b/src/server/get-client-ip-address.ts @@ -77,7 +77,6 @@ function parseForwardedHeader(value: string | null): string | null { if (!value) return null; for (let part of value.split(";")) { if (part.startsWith("for=")) return part.slice(4); - continue; } return null; } diff --git a/src/server/honeypot.ts b/src/server/honeypot.ts index 23a83d06..be3ee306 100644 --- a/src/server/honeypot.ts +++ b/src/server/honeypot.ts @@ -55,7 +55,11 @@ const DEFAULT_VALID_FROM_FIELD_NAME = "from__confirm"; export class Honeypot { private generatedEncryptionSeed = this.randomValue(); - constructor(protected config: HoneypotConfig = {}) {} + protected config: HoneypotConfig; + + constructor(config: HoneypotConfig = {}) { + this.config = config; + } /** * Get the HoneypotInputProps to be used in your forms. diff --git a/src/server/named-action.ts b/src/server/named-action.ts index 032f54a9..d06d2201 100644 --- a/src/server/named-action.ts +++ b/src/server/named-action.ts @@ -48,7 +48,7 @@ export async function namedAction( } if (name === null && "default" in actions) { - return actions["default"]() as unknown as TypedResponse< + return actions.default() as unknown as TypedResponse< ResponsesUnion >; } diff --git a/src/server/respond-to.ts b/src/server/respond-to.ts index 2f51a55b..c8bd5cb7 100644 --- a/src/server/respond-to.ts +++ b/src/server/respond-to.ts @@ -67,7 +67,6 @@ export function respondTo( if (handler) return handler(); handler = handlers[type]; if (handler) return handler(); - continue; } return handlers.default(); diff --git a/src/server/safe-redirect.ts b/src/server/safe-redirect.ts index 4735951d..f365aa5f 100644 --- a/src/server/safe-redirect.ts +++ b/src/server/safe-redirect.ts @@ -15,16 +15,16 @@ export function safeRedirect( ) { if (!to || typeof to !== "string") return defaultRedirect; - to = to.trim(); + let trimmedTo = to.trim(); if ( - !to.startsWith("/") || - to.startsWith("//") || - to.startsWith("/\\") || - to.includes("..") + !trimmedTo.startsWith("/") || + trimmedTo.startsWith("//") || + trimmedTo.startsWith("/\\") || + trimmedTo.includes("..") ) { return defaultRedirect; } - return to; + return trimmedTo; } diff --git a/src/server/typed-session.ts b/src/server/typed-session.ts index 8444545f..a99d9837 100644 --- a/src/server/typed-session.ts +++ b/src/server/typed-session.ts @@ -1,9 +1,9 @@ import { CookieParseOptions, CookieSerializeOptions, - isSession, Session, SessionStorage, + isSession, } from "@remix-run/server-runtime"; import { z } from "zod"; diff --git a/test/common/promise.test.ts b/test/common/promise.test.ts index cc5db600..7a6c2187 100644 --- a/test/common/promise.test.ts +++ b/test/common/promise.test.ts @@ -1,5 +1,5 @@ +import { describe, expect, test } from "vitest"; import { promiseHash, timeout } from "../../src/common/promise"; -import { describe, test, expect } from "vitest"; describe(promiseHash, () => { test("should await all promises in a hash and return them with the same name", async () => { diff --git a/test/common/timers.test.ts b/test/common/timers.test.ts index acfd22da..b4359ca3 100644 --- a/test/common/timers.test.ts +++ b/test/common/timers.test.ts @@ -1,5 +1,5 @@ -import { wait, interval, TimersError } from "../../src/common/timers"; -import { describe, test, expect, beforeAll, vi, afterAll } from "vitest"; +import { afterAll, beforeAll, describe, expect, test, vi } from "vitest"; +import { TimersError, interval, wait } from "../../src/common/timers"; describe("Timers", () => { beforeAll(() => { diff --git a/test/react.test.tsx b/test/react.test.tsx index 6a0cbff5..aef4d575 100644 --- a/test/react.test.tsx +++ b/test/react.test.tsx @@ -1,7 +1,7 @@ -// @vitest-environment happy-dom -import { describe, test } from "vitest"; import { render } from "@testing-library/react"; import * as React from "react"; +// @vitest-environment happy-dom +import { describe, test } from "vitest"; import { AuthenticityTokenInput, AuthenticityTokenProvider, diff --git a/test/react/fetcher-type.test.tsx b/test/react/fetcher-type.test.tsx index d853297f..94e98c97 100644 --- a/test/react/fetcher-type.test.tsx +++ b/test/react/fetcher-type.test.tsx @@ -1,11 +1,11 @@ -// @vitest-environment happy-dom -import * as React from "react"; -import { describe, test, expect } from "vitest"; import { unstable_createRemixStub as createRemixStub } from "@remix-run/testing"; import { render, screen } from "@testing-library/react"; +// @vitest-environment happy-dom +import * as React from "react"; +import { describe, expect, test } from "vitest"; -import { getFetcherType, useFetcherType } from "../../src/react/fetcher-type"; import { useFetcher } from "@remix-run/react"; +import { getFetcherType, useFetcherType } from "../../src/react/fetcher-type"; describe(getFetcherType, () => { test("returns done", () => { diff --git a/test/react/use-delegated-anchors.test.tsx b/test/react/use-delegated-anchors.test.tsx index 40e3b3b0..5f2c4424 100644 --- a/test/react/use-delegated-anchors.test.tsx +++ b/test/react/use-delegated-anchors.test.tsx @@ -1,9 +1,9 @@ +import { useNavigate } from "@remix-run/react"; +import { fireEvent, render, screen } from "@testing-library/react"; // @vitest-environment happy-dom import * as React from "react"; -import { vi, beforeAll, afterEach, test, expect, MockedFunction } from "vitest"; +import { MockedFunction, afterEach, beforeAll, expect, test, vi } from "vitest"; import { PrefetchPageAnchors } from "../../src/react/use-delegated-anchors"; -import { render, screen, fireEvent } from "@testing-library/react"; -import { useNavigate } from "@remix-run/react"; // vi.mock("@remix-run/react"); @@ -134,7 +134,7 @@ describe.skip(PrefetchPageAnchors.name, () => { test("ignores links with target=_blank", () => { render( - + A link , diff --git a/test/react/use-locales.test.tsx b/test/react/use-locales.test.tsx index 8d517d35..0e1e4526 100644 --- a/test/react/use-locales.test.tsx +++ b/test/react/use-locales.test.tsx @@ -1,9 +1,9 @@ // @vitest-environment happy-dom import { RouteData } from "@remix-run/router/dist/utils"; +import { afterEach, describe, expect, test, vi } from "vitest"; import { useLocales } from "../../src/react/use-locales"; import { fakeMatch } from "../helpers/fake-match"; import { mockMatches } from "../helpers/mock-match"; -import { vi, describe, test, expect, afterEach } from "vitest"; describe.skip(useLocales, () => { afterEach(() => { @@ -56,7 +56,7 @@ describe.skip(useLocales, () => { expect(useLocales()).toBeUndefined(); }); - test.only("String", () => { + test("String", () => { mockMatches.mockReturnValue([fakeMatch({ locales: "en" })]); // mockMatches([fakeMatch({ locales: "en" })]); expect(useLocales()).toBe("en"); diff --git a/test/server/cors.test.ts b/test/server/cors.test.ts index 6de64a78..0b23679b 100644 --- a/test/server/cors.test.ts +++ b/test/server/cors.test.ts @@ -1,4 +1,4 @@ -import { describe, test, expect } from "vitest"; +import { describe, expect, test } from "vitest"; import { cors } from "../../src/server/cors"; diff --git a/test/server/csrf.test.ts b/test/server/csrf.test.ts index 8705a996..c7844751 100644 --- a/test/server/csrf.test.ts +++ b/test/server/csrf.test.ts @@ -1,5 +1,5 @@ -import { describe, test, expect } from "vitest"; import { createCookie } from "@remix-run/node"; +import { describe, expect, test } from "vitest"; import { CSRF, CSRFError } from "../../src/server/csrf"; describe("CSRF", () => { diff --git a/test/server/event-stream.test.ts b/test/server/event-stream.test.ts index 0a2b3ad2..6990cb82 100644 --- a/test/server/event-stream.test.ts +++ b/test/server/event-stream.test.ts @@ -1,11 +1,12 @@ /* eslint-disable @typescript-eslint/no-empty-function */ -import { vi, describe, test, expect } from "vitest"; +import { describe, expect, test, vi } from "vitest"; import { eventStream } from "../../src/server/event-stream"; describe(eventStream, () => { test("returns a response", () => { let controller = new AbortController(); let response = eventStream(controller.signal, (_, __) => { + // biome-ignore lint/suspicious/noEmptyBlockStatements: Test return () => {}; }); controller.abort(); @@ -15,6 +16,7 @@ describe(eventStream, () => { test("response is a readable stream", async () => { let controller = new AbortController(); let response = eventStream(controller.signal, (_, __) => { + // biome-ignore lint/suspicious/noEmptyBlockStatements: Test return () => {}; }); controller.abort(); @@ -28,6 +30,7 @@ describe(eventStream, () => { let controller = new AbortController(); let response = eventStream(controller.signal, (send, _) => { send({ data: "hello" }); + // biome-ignore lint/suspicious/noEmptyBlockStatements: Test return () => {}; }); @@ -49,6 +52,7 @@ describe(eventStream, () => { describe("Headers Overrides", () => { test("overrrides Content-Type header", () => { + // biome-ignore lint/suspicious/noEmptyBlockStatements: Test let spy = vi.spyOn(console, "warn").mockImplementation(() => {}); let response = eventStream( @@ -67,6 +71,7 @@ describe(eventStream, () => { }); test("overrides Cache-Control", () => { + // biome-ignore lint/suspicious/noEmptyBlockStatements: Test let spy = vi.spyOn(console, "warn").mockImplementation(() => {}); let response = eventStream( @@ -85,6 +90,7 @@ describe(eventStream, () => { }); test("overrides Connection", () => { + // biome-ignore lint/suspicious/noEmptyBlockStatements: Test let spy = vi.spyOn(console, "warn").mockImplementation(() => {}); let response = eventStream( diff --git a/test/server/get-client-id-address.test.ts b/test/server/get-client-id-address.test.ts index f7130da7..3662e2e3 100644 --- a/test/server/get-client-id-address.test.ts +++ b/test/server/get-client-id-address.test.ts @@ -1,4 +1,4 @@ -import { describe, test, expect } from "vitest"; +import { describe, expect, test } from "vitest"; import { getClientIPAddress } from "../../src/server/get-client-ip-address"; const VALID_IP = "192.168.0.1"; diff --git a/test/server/get-client-locales.test.ts b/test/server/get-client-locales.test.ts index 20afb7a2..c96660f9 100644 --- a/test/server/get-client-locales.test.ts +++ b/test/server/get-client-locales.test.ts @@ -1,4 +1,4 @@ -import { describe, test, expect } from "vitest"; +import { describe, expect, test } from "vitest"; import { getClientLocales } from "../../src/server/get-client-locales"; describe(getClientLocales, () => { diff --git a/test/server/honeypot.test.ts b/test/server/honeypot.test.ts index 36c5069a..07d5f370 100644 --- a/test/server/honeypot.test.ts +++ b/test/server/honeypot.test.ts @@ -1,8 +1,9 @@ -import { describe } from "vitest"; import CryptoJS from "crypto-js"; +import { describe, expect, test } from "vitest"; import { Honeypot, SpamError } from "../../src/server/honeypot"; +// biome-ignore lint/suspicious/noExplicitAny: Test function invariant(condition: any, message: string): asserts condition { if (!condition) throw new Error(message); } diff --git a/test/server/is-prefetch.test.ts b/test/server/is-prefetch.test.ts index b3349e74..ddb6814a 100644 --- a/test/server/is-prefetch.test.ts +++ b/test/server/is-prefetch.test.ts @@ -1,4 +1,4 @@ -import { describe, test, expect } from "vitest"; +import { describe, expect, test } from "vitest"; import { isPrefetch } from "../../src/server/is-prefetch"; describe(isPrefetch, () => { diff --git a/test/server/json-hash.test.ts b/test/server/json-hash.test.ts index 101ded8f..3bb87365 100644 --- a/test/server/json-hash.test.ts +++ b/test/server/json-hash.test.ts @@ -1,4 +1,4 @@ -import { describe, test, expect } from "vitest"; +import { describe, expect, test } from "vitest"; import { jsonHash } from "../../src/server/json-hash"; describe(jsonHash.name, () => { diff --git a/test/server/named-action.test.ts b/test/server/named-action.test.ts index 6a198716..07d0df25 100644 --- a/test/server/named-action.test.ts +++ b/test/server/named-action.test.ts @@ -1,6 +1,6 @@ -/* eslint-disable unicorn/consistent-function-scoping */ -import { describe, test, expect } from "vitest"; import { ActionFunctionArgs, json } from "@remix-run/server-runtime"; +/* eslint-disable unicorn/consistent-function-scoping */ +import { describe, expect, test } from "vitest"; import { namedAction } from "../../src/server/named-action"; describe(namedAction.name, () => { diff --git a/test/server/parse-accept-header.test.ts b/test/server/parse-accept-header.test.ts index 5b194b6e..6340f7b7 100644 --- a/test/server/parse-accept-header.test.ts +++ b/test/server/parse-accept-header.test.ts @@ -1,4 +1,4 @@ -import { describe, test, expect } from "vitest"; +import { describe, expect, test } from "vitest"; import { parseAcceptHeader } from "../../src/server/parse-accept-header"; describe(parseAcceptHeader, () => { diff --git a/test/server/preload-route-assets.test.ts b/test/server/preload-route-assets.test.ts index 058a3ae5..fe9c1736 100644 --- a/test/server/preload-route-assets.test.ts +++ b/test/server/preload-route-assets.test.ts @@ -1,7 +1,7 @@ -import { describe, test, expect } from "vitest"; import type { EntryContext } from "@remix-run/server-runtime"; -import { preloadRouteAssets } from "../../src/server/preload-route-assets"; import { SerializedError } from "@remix-run/server-runtime/dist/errors"; +import { describe, expect, test } from "vitest"; +import { preloadRouteAssets } from "../../src/server/preload-route-assets"; describe(preloadRouteAssets.name, () => { let context: EntryContext = { diff --git a/test/server/redirect-back.test.ts b/test/server/redirect-back.test.ts index 41422f94..a31cdfab 100644 --- a/test/server/redirect-back.test.ts +++ b/test/server/redirect-back.test.ts @@ -1,4 +1,4 @@ -import { describe, test, expect } from "vitest"; +import { describe, expect, test } from "vitest"; import { redirectBack } from "../../src/server/redirect-back"; describe(redirectBack, () => { diff --git a/test/server/respond-to.test.ts b/test/server/respond-to.test.ts index 522d0971..cc05622a 100644 --- a/test/server/respond-to.test.ts +++ b/test/server/respond-to.test.ts @@ -1,4 +1,4 @@ -import { describe, test, expect } from "vitest"; +import { describe, expect, test } from "vitest"; import { respondTo } from "../../src/server/respond-to"; describe(respondTo, () => { diff --git a/test/server/responses.test.ts b/test/server/responses.test.ts index ecbc2f37..695b68c6 100644 --- a/test/server/responses.test.ts +++ b/test/server/responses.test.ts @@ -1,14 +1,14 @@ -import { describe, test, expect } from "vitest"; +import { describe, expect, test } from "vitest"; import { + ImageType, html, - xml, - txt, image, - ImageType, javascript, notModified, pdf, stylesheet, + txt, + xml, } from "../../src/server/responses"; let jsonContentType = "application/json; charset=utf-8"; diff --git a/test/server/rolling-cookie.test.ts b/test/server/rolling-cookie.test.ts index 7ca4bb53..4aff4296 100644 --- a/test/server/rolling-cookie.test.ts +++ b/test/server/rolling-cookie.test.ts @@ -1,5 +1,5 @@ -import { describe, test, expect } from "vitest"; import { createCookie } from "@remix-run/node"; +import { describe, expect, test } from "vitest"; import { z } from "zod"; import { rollingCookie } from "../../src/server/rolling-cookie"; import { createTypedCookie } from "../../src/server/typed-cookie"; diff --git a/test/server/safe-redirect.test.ts b/test/server/safe-redirect.test.ts index da55f25e..417d6a11 100644 --- a/test/server/safe-redirect.test.ts +++ b/test/server/safe-redirect.test.ts @@ -1,4 +1,4 @@ -import { describe, test, expect } from "vitest"; +import { describe, expect, test } from "vitest"; import { safeRedirect } from "../../src/server/safe-redirect"; describe(safeRedirect.name, () => { diff --git a/test/server/typed-cookie.test.ts b/test/server/typed-cookie.test.ts index 63093f69..d3b87dd8 100644 --- a/test/server/typed-cookie.test.ts +++ b/test/server/typed-cookie.test.ts @@ -1,10 +1,10 @@ -import { describe, test, expect } from "vitest"; import { createCookie, createCookieSessionStorage, isCookie, } from "@remix-run/node"; -import { z, ZodError } from "zod"; +import { describe, expect, test } from "vitest"; +import { ZodError, z } from "zod"; import { createTypedCookie, isTypedCookie, diff --git a/test/server/typed-session.test.ts b/test/server/typed-session.test.ts index a7b51a4b..29cb5c75 100644 --- a/test/server/typed-session.test.ts +++ b/test/server/typed-session.test.ts @@ -1,19 +1,19 @@ -import { describe, test, expect } from "vitest"; import { ActionFunctionArgs, + LoaderFunctionArgs, createCookie, createCookieSessionStorage, isSession, json, - LoaderFunctionArgs, } from "@remix-run/node"; +import { describe, expect, test } from "vitest"; import { z } from "zod"; +import { createTypedCookie } from "../../src/server/typed-cookie"; import { + TypedSessionStorage, createTypedSessionStorage, isTypedSession, - TypedSessionStorage, } from "../../src/server/typed-session"; -import { createTypedCookie } from "../../src/server/typed-cookie"; let cookie = createCookie("session", { secrets: ["secret"] }); let schema = z.object({ diff --git a/vitest.config.ts b/vitest.config.ts index c333e367..95939ca4 100644 --- a/vitest.config.ts +++ b/vitest.config.ts @@ -5,14 +5,14 @@ import react from "@vitejs/plugin-react"; import { defineConfig } from "vite"; export default defineConfig({ - plugins: [react()], - test: { - globals: true, - environment: "node", - setupFiles: ["./vitest.setup.ts"], - coverage: { - all: true, - include: ["src/**/*"], - }, - }, + plugins: [react()], + test: { + globals: true, + environment: "node", + setupFiles: ["./vitest.setup.ts"], + coverage: { + all: true, + include: ["src/**/*"], + }, + }, }); diff --git a/vitest.setup.ts b/vitest.setup.ts index ae5150ed..30c74398 100644 --- a/vitest.setup.ts +++ b/vitest.setup.ts @@ -1,140 +1,140 @@ -import { expect } from "vitest"; import { installGlobals } from "@remix-run/node"; +import { expect } from "vitest"; import "@testing-library/jest-dom"; installGlobals(); function validateIsResponse(response: Response) { - if (response instanceof Response === false) { - return { - pass: false, - message() { - return "The value to assert must be an instance of Response."; - }, - }; - } - return; + if (response instanceof Response === false) { + return { + pass: false, + message() { + return "The value to assert must be an instance of Response."; + }, + }; + } + return; } function toHaveStatus(response: Response, status: number) { - let isNotResponse = validateIsResponse(response); - if (isNotResponse) return isNotResponse; - - let pass = response.status === status; - - return { - pass, - message() { - if (pass) { - return `The status code of the Response should not be ${status}.`; - } - return `The status code of the Response should be ${status}, it was ${response.status}.`; - }, - }; + let isNotResponse = validateIsResponse(response); + if (isNotResponse) return isNotResponse; + + let pass = response.status === status; + + return { + pass, + message() { + if (pass) { + return `The status code of the Response should not be ${status}.`; + } + return `The status code of the Response should be ${status}, it was ${response.status}.`; + }, + }; } function toRedirect(response: Response | string, path?: string) { - if (typeof response === "string") { - return { - pass: response === path, - message() { - if (response === path) { - return `The Response should not redirect to ${path}`; - } - return `The response should redirect to ${path}`; - }, - }; - } - - let isNotResponse = validateIsResponse(response); - if (isNotResponse) return isNotResponse; - - let header = response.headers.get("Location"); - let status = response.status; - - let pass = status === 302 && path ? header === path : Boolean(header); - - return { - pass, - message() { - if (pass) { - return `The Response should not redirect to ${path}`; - } - return `The response should redirect to ${path}`; - }, - }; + if (typeof response === "string") { + return { + pass: response === path, + message() { + if (response === path) { + return `The Response should not redirect to ${path}`; + } + return `The response should redirect to ${path}`; + }, + }; + } + + let isNotResponse = validateIsResponse(response); + if (isNotResponse) return isNotResponse; + + let header = response.headers.get("Location"); + let status = response.status; + + let pass = status === 302 && path ? header === path : Boolean(header); + + return { + pass, + message() { + if (pass) { + return `The Response should not redirect to ${path}`; + } + return `The response should redirect to ${path}`; + }, + }; } function toSetACookie(response: Response) { - let isNotResponse = validateIsResponse(response); - if (isNotResponse) return isNotResponse; - - let hasSetCookie = response.headers.has("Set-Cookie"); - - return { - pass: hasSetCookie, - message() { - if (hasSetCookie) return "Expected the response to not set a cookie."; - return "Expected the response to set a cookie."; - }, - }; + let isNotResponse = validateIsResponse(response); + if (isNotResponse) return isNotResponse; + + let hasSetCookie = response.headers.has("Set-Cookie"); + + return { + pass: hasSetCookie, + message() { + if (hasSetCookie) return "Expected the response to not set a cookie."; + return "Expected the response to set a cookie."; + }, + }; } function toBeOk(response: Response) { - let isNotResponse = validateIsResponse(response); - if (isNotResponse) return isNotResponse; - - let pass = response.ok; - - return { - pass, - message() { - if (pass) return "It should not to be ok."; - return "It should be ok."; - }, - }; + let isNotResponse = validateIsResponse(response); + if (isNotResponse) return isNotResponse; + + let pass = response.ok; + + return { + pass, + message() { + if (pass) return "It should not to be ok."; + return "It should be ok."; + }, + }; } function toHaveHeader(response: Response, name: string, value?: string) { - let isNotResponse = validateIsResponse(response); - if (isNotResponse) return isNotResponse; - - let pass = response.headers.has(name); - - if (!Boolean(value)) { - return { - pass, - message() { - if (pass) return `It should not have the header ${name}`; - return `It should have the header ${name}`; - }, - }; - } - - if (Boolean(value)) { - pass = response.headers.get(name) === value; - } - - return { - pass, - message() { - if (pass) { - return `It should not have the header ${name} with value ${value}, it was ${response.headers.get( - name - )}`; - } - return `It should have the header ${name} with value ${value}, it was ${response.headers.get( - name - )}`; - }, - }; + let isNotResponse = validateIsResponse(response); + if (isNotResponse) return isNotResponse; + + let pass = response.headers.has(name); + + if (!value) { + return { + pass, + message() { + if (pass) return `It should not have the header ${name}`; + return `It should have the header ${name}`; + }, + }; + } + + if (value) { + pass = response.headers.get(name) === value; + } + + return { + pass, + message() { + if (pass) { + return `It should not have the header ${name} with value ${value}, it was ${response.headers.get( + name, + )}`; + } + return `It should have the header ${name} with value ${value}, it was ${response.headers.get( + name, + )}`; + }, + }; } expect.extend({ - toRedirect, - toSetACookie, - toHaveStatus, - toBeOk, - toHaveHeader, + toRedirect, + toSetACookie, + toHaveStatus, + toBeOk, + toHaveHeader, });