├── .editorconfig ├── .gitattributes ├── .github └── workflows │ ├── build_linux.yml │ ├── build_macos.yml │ ├── build_windows.yml │ ├── publish.yml │ └── publish_prerelease.yml ├── .gitignore ├── .npmignore ├── .ocamlformat ├── .vscode └── settings.json ├── CHANGELOG.md ├── LICENSE ├── README.md ├── bin ├── bin.ml └── dune ├── bsconfig.json ├── dune ├── dune-project ├── dune-workspace ├── package.json ├── postInstall.js ├── ppx ├── ppx.cmd ├── res_tailwindcss.opam ├── rescript ├── __tests__ │ ├── test.js │ └── test.res ├── css │ └── tailwind.css ├── package.json ├── pnpm-lock.yaml ├── rescript.json └── src │ ├── View.js │ └── View.res └── src ├── configs.ml ├── dune ├── lexer.mll ├── parser.mly ├── prelude.ml ├── res_tailwindcss.ml ├── spelling_corrector.ml ├── types.ml └── util.ml /.editorconfig: -------------------------------------------------------------------------------- 1 | # EditorConfig is awesome: https://EditorConfig.org 2 | 3 | # Unix-style newlines with a newline ending every file 4 | [*] 5 | end_of_line = lf 6 | insert_final_newline = true 7 | -------------------------------------------------------------------------------- /.gitattributes: -------------------------------------------------------------------------------- 1 | test/** linguist-documentation 2 | rescript/** linguist-generated 3 | -------------------------------------------------------------------------------- /.github/workflows/build_linux.yml: -------------------------------------------------------------------------------- 1 | name: Build Linux 2 | 3 | on: [workflow_dispatch] 4 | 5 | jobs: 6 | build_linux: 7 | name: ${{ matrix.os }} 8 | runs-on: ${{ matrix.os }} 9 | strategy: 10 | matrix: 11 | os: [ubuntu-latest] 12 | ocaml-compiler: 13 | - 4.14.0 14 | container: 15 | image: ocaml/opam:alpine-3.16-ocaml-4.14 16 | options: --user root 17 | 18 | steps: 19 | - uses: actions/checkout@v3 20 | 21 | - name: Opam init 22 | run: opam init -a --disable-sandboxing --compiler=4.14.0 23 | 24 | - name: Install deps 25 | run: opam install . --deps-only --with-test 26 | 27 | - name: Build 28 | run: opam exec -- dune build --profile static 29 | 30 | - name: Copy built PPX file 31 | run: | 32 | mv ./_build/default/bin/bin.exe ppx.exe 33 | 34 | - name: (only on release) Upload artifacts ${{ matrix.os }} 35 | uses: actions/upload-artifact@master 36 | with: 37 | name: ${{ matrix.os }} 38 | path: ppx.exe 39 | if-no-files-found: error 40 | -------------------------------------------------------------------------------- /.github/workflows/build_macos.yml: -------------------------------------------------------------------------------- 1 | name: Build MacOS 2 | 3 | on: [workflow_dispatch] 4 | 5 | jobs: 6 | build_macos: 7 | name: ${{ matrix.os }} 8 | runs-on: ${{ matrix.os }} 9 | strategy: 10 | matrix: 11 | os: [macOS-latest] 12 | ocaml-compiler: 13 | - 4.14.0 14 | 15 | steps: 16 | - uses: actions/checkout@v3 17 | 18 | - name: Use OCaml ${{ matrix.ocaml-version}} 19 | uses: ocaml/setup-ocaml@v2 20 | with: 21 | ocaml-compiler: ${{ matrix.ocaml-compiler }} 22 | 23 | - name: Install deps 24 | run: opam install . --deps-only --with-test 25 | 26 | - name: Build 27 | run: opam exec -- dune build 28 | 29 | - name: Copy built PPX file 30 | run: | 31 | mv ./_build/default/bin/bin.exe ppx.exe 32 | 33 | - name: (only on release) Upload artifacts ${{ matrix.os }} 34 | uses: actions/upload-artifact@master 35 | with: 36 | name: ${{ matrix.os }} 37 | path: ppx.exe 38 | if-no-files-found: error 39 | -------------------------------------------------------------------------------- /.github/workflows/build_windows.yml: -------------------------------------------------------------------------------- 1 | name: Build Windows 2 | 3 | on: [workflow_dispatch] 4 | 5 | jobs: 6 | build_windows: 7 | name: ${{ matrix.os }} 8 | runs-on: ${{ matrix.os }} 9 | strategy: 10 | matrix: 11 | os: [windows-latest] 12 | ocaml-compiler: 13 | - 4.14.0 14 | 15 | steps: 16 | - uses: actions/checkout@v3 17 | 18 | - name: Use OCaml ${{ matrix.ocaml-compiler}} 19 | uses: ocaml/setup-ocaml@v2 20 | with: 21 | ocaml-compiler: ${{ matrix.ocaml-compiler }} 22 | 23 | - name: Install deps 24 | run: opam install . --deps-only --with-test 25 | 26 | - name: Build 27 | run: opam exec -- dune build 28 | 29 | - name: Copy built PPX file 30 | run: | 31 | mv ./_build/default/bin/bin.exe ppx.exe 32 | 33 | - name: (only on release) Upload artifacts ${{ matrix.os }} 34 | uses: actions/upload-artifact@master 35 | with: 36 | name: ${{ matrix.os }} 37 | path: ppx.exe 38 | if-no-files-found: error 39 | -------------------------------------------------------------------------------- /.github/workflows/publish.yml: -------------------------------------------------------------------------------- 1 | name: Publish to NPM 2 | 3 | on: [workflow_dispatch] 4 | 5 | jobs: 6 | build_linux: 7 | name: ${{ matrix.os }} 8 | runs-on: ${{ matrix.os }} 9 | strategy: 10 | matrix: 11 | os: [ubuntu-latest] 12 | ocaml-compiler: 13 | - 4.14.0 14 | container: 15 | image: ocaml/opam:alpine-3.16-ocaml-4.14 16 | options: --user root 17 | 18 | steps: 19 | - uses: actions/checkout@v3 20 | 21 | - name: Opam init 22 | run: opam init -a --disable-sandboxing --compiler=4.14.0 23 | 24 | - name: Install deps 25 | run: opam install . --deps-only --with-test 26 | 27 | - name: Build 28 | run: opam exec -- dune build --profile static 29 | 30 | - name: Copy built PPX file 31 | run: | 32 | mv ./_build/default/bin/bin.exe ppx.exe 33 | 34 | - name: (only on release) Upload artifacts ${{ matrix.os }} 35 | uses: actions/upload-artifact@master 36 | with: 37 | name: ${{ matrix.os }} 38 | path: ppx.exe 39 | if-no-files-found: error 40 | 41 | build_macos: 42 | name: ${{ matrix.os }} 43 | runs-on: ${{ matrix.os }} 44 | strategy: 45 | matrix: 46 | os: [macOS-latest] 47 | ocaml-compiler: 48 | - 4.14.0 49 | 50 | steps: 51 | - uses: actions/checkout@v3 52 | 53 | - name: Use OCaml ${{ matrix.ocaml-compiler}} 54 | uses: ocaml/setup-ocaml@v2 55 | with: 56 | ocaml-compiler: ${{ matrix.ocaml-compiler }} 57 | 58 | - name: Install deps 59 | run: opam install . --deps-only --with-test 60 | 61 | - name: Build 62 | run: opam exec -- dune build 63 | 64 | - name: Copy built PPX file 65 | run: | 66 | mv ./_build/default/bin/bin.exe ppx.exe 67 | 68 | - name: (only on release) Upload artifacts ${{ matrix.os }} 69 | uses: actions/upload-artifact@master 70 | with: 71 | name: ${{ matrix.os }} 72 | path: ppx.exe 73 | if-no-files-found: error 74 | 75 | build_windows: 76 | name: ${{ matrix.os }} 77 | runs-on: ${{ matrix.os }} 78 | strategy: 79 | matrix: 80 | os: [windows-latest] 81 | ocaml-compiler: 82 | - 4.14.0 83 | 84 | steps: 85 | - uses: actions/checkout@v3 86 | 87 | - name: Use OCaml ${{ matrix.ocaml-compiler}} 88 | uses: ocaml/setup-ocaml@v2 89 | with: 90 | ocaml-compiler: ${{ matrix.ocaml-compiler }} 91 | 92 | - name: Install deps 93 | run: opam install . --deps-only --with-test 94 | 95 | - name: Build 96 | run: opam exec -- dune build 97 | 98 | - name: Copy built PPX file 99 | run: | 100 | mv ./_build/default/bin/bin.exe ppx.exe 101 | 102 | - name: (only on release) Upload artifacts ${{ matrix.os }} 103 | uses: actions/upload-artifact@master 104 | with: 105 | name: ${{ matrix.os }} 106 | path: ppx.exe 107 | if-no-files-found: error 108 | 109 | publish: 110 | needs: [build_linux, build_macos, build_windows] 111 | name: (only on release) Publish 112 | runs-on: ubuntu-latest 113 | steps: 114 | - uses: actions/checkout@v3 115 | - uses: actions/setup-node@v3 116 | with: 117 | node-version: 16 118 | registry-url: "https://registry.npmjs.org" 119 | 120 | - name: Download linux artifacts 121 | if: success() 122 | uses: actions/download-artifact@master 123 | with: 124 | name: ubuntu-latest 125 | path: binaries/linux 126 | 127 | - name: Download macOS artifacts 128 | if: success() 129 | uses: actions/download-artifact@master 130 | with: 131 | name: macOS-latest 132 | path: binaries/darwin 133 | 134 | - name: Download windows artifacts 135 | if: success() 136 | uses: actions/download-artifact@master 137 | with: 138 | name: windows-latest 139 | path: binaries/windows 140 | 141 | - name: Move artifacts 142 | if: success() 143 | run: | 144 | mkdir -p bin 145 | mv binaries/linux/ppx.exe ppx-linux.exe 146 | mv binaries/darwin/ppx.exe ppx-osx.exe 147 | mv binaries/windows/ppx.exe ppx-windows.exe 148 | 149 | - name: Publish 150 | if: success() 151 | run: npm publish 152 | env: 153 | NODE_AUTH_TOKEN: ${{ secrets.NPM_AUTH_TOKEN }} 154 | -------------------------------------------------------------------------------- /.github/workflows/publish_prerelease.yml: -------------------------------------------------------------------------------- 1 | name: Publish Pre-release to NPM 2 | 3 | on: 4 | workflow_dispatch: 5 | inputs: 6 | release_version: 7 | description: "change npm release version" 8 | required: true 9 | default: "" 10 | 11 | jobs: 12 | build_linux: 13 | name: ${{ matrix.os }} 14 | runs-on: ${{ matrix.os }} 15 | strategy: 16 | matrix: 17 | os: [ubuntu-latest] 18 | ocaml-compiler: 19 | - 4.14.0 20 | container: 21 | image: ocaml/opam:alpine-3.16-ocaml-4.14 22 | options: --user root 23 | 24 | steps: 25 | - uses: actions/checkout@v3 26 | 27 | - name: Opam init 28 | run: opam init -a --disable-sandboxing --compiler=4.14.0 29 | 30 | - name: Install deps 31 | run: opam install . --deps-only --with-test 32 | 33 | - name: Build 34 | run: opam exec -- dune build --profile static 35 | 36 | - name: Copy built PPX file 37 | run: | 38 | mv ./_build/default/bin/bin.exe ppx.exe 39 | 40 | - name: (only on release) Upload artifacts ${{ matrix.os }} 41 | uses: actions/upload-artifact@master 42 | with: 43 | name: ${{ matrix.os }} 44 | path: ppx.exe 45 | if-no-files-found: error 46 | 47 | build_macos: 48 | name: ${{ matrix.os }} 49 | runs-on: ${{ matrix.os }} 50 | strategy: 51 | matrix: 52 | os: [macOS-latest] 53 | ocaml-compiler: 54 | - 4.14.0 55 | 56 | steps: 57 | - uses: actions/checkout@v3 58 | 59 | - name: Use OCaml ${{ matrix.ocaml-compiler}} 60 | uses: ocaml/setup-ocaml@v2 61 | with: 62 | ocaml-compiler: ${{ matrix.ocaml-compiler }} 63 | 64 | - name: Install deps 65 | run: opam install . --deps-only --with-test 66 | 67 | - name: Build 68 | run: opam exec -- dune build 69 | 70 | - name: Copy built PPX file 71 | run: | 72 | mv ./_build/default/bin/bin.exe ppx.exe 73 | 74 | - name: (only on release) Upload artifacts ${{ matrix.os }} 75 | uses: actions/upload-artifact@master 76 | with: 77 | name: ${{ matrix.os }} 78 | path: ppx.exe 79 | if-no-files-found: error 80 | 81 | build_windows: 82 | name: ${{ matrix.os }} 83 | runs-on: ${{ matrix.os }} 84 | strategy: 85 | matrix: 86 | os: [windows-latest] 87 | ocaml-compiler: 88 | - 4.14.0 89 | 90 | steps: 91 | - uses: actions/checkout@v3 92 | 93 | - name: Use OCaml ${{ matrix.ocaml-compiler}} 94 | uses: ocaml/setup-ocaml@v2 95 | with: 96 | ocaml-compiler: ${{ matrix.ocaml-compiler }} 97 | 98 | - name: Install deps 99 | run: opam install . --deps-only --with-test 100 | 101 | - name: Build 102 | run: opam exec -- dune build 103 | 104 | - name: Copy built PPX file 105 | run: | 106 | mv ./_build/default/bin/bin.exe ppx.exe 107 | 108 | - name: (only on release) Upload artifacts ${{ matrix.os }} 109 | uses: actions/upload-artifact@master 110 | with: 111 | name: ${{ matrix.os }} 112 | path: ppx.exe 113 | if-no-files-found: error 114 | 115 | publish: 116 | needs: [build_linux, build_macos, build_windows] 117 | name: (only on release) Publish 118 | runs-on: ubuntu-latest 119 | steps: 120 | - uses: actions/checkout@v3 121 | - uses: actions/setup-node@v3 122 | with: 123 | node-version: 16 124 | registry-url: "https://registry.npmjs.org" 125 | 126 | - name: Download linux artifacts 127 | if: success() 128 | uses: actions/download-artifact@master 129 | with: 130 | name: ubuntu-latest 131 | path: binaries/linux 132 | 133 | - name: Download macOS artifacts 134 | if: success() 135 | uses: actions/download-artifact@master 136 | with: 137 | name: macOS-latest 138 | path: binaries/darwin 139 | 140 | - name: Download windows artifacts 141 | if: success() 142 | uses: actions/download-artifact@master 143 | with: 144 | name: windows-latest 145 | path: binaries/windows 146 | 147 | - name: Move artifacts 148 | if: success() 149 | run: | 150 | mkdir -p bin 151 | mv binaries/linux/ppx.exe ppx-linux.exe 152 | mv binaries/darwin/ppx.exe ppx-osx.exe 153 | mv binaries/windows/ppx.exe ppx-windows.exe 154 | 155 | - name: Change npm release version 156 | if: success() 157 | uses: reedyuk/npm-version@1.1.1 158 | with: 159 | version: ${{ github.event.inputs.release_version }} 160 | 161 | - name: Pack package 162 | if: success() 163 | run: npm pack 164 | 165 | - name: Publish 166 | if: success() 167 | run: npm publish greenlabs-res-tailwindcss-${{ github.event.inputs.release_version }}.tgz --tag next 168 | env: 169 | NODE_AUTH_TOKEN: ${{ secrets.NPM_AUTH_TOKEN }} 170 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | lib 2 | .merlin 3 | node_modules 4 | _build 5 | .bsb.lock 6 | res_tailwindcss.install 7 | _esy 8 | _opam 9 | -------------------------------------------------------------------------------- /.npmignore: -------------------------------------------------------------------------------- 1 | test/ 2 | _build 3 | .github 4 | -------------------------------------------------------------------------------- /.ocamlformat: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/green-labs/res_tailwindcss/1bb2f3a06b147c78a64e6ed22551f6b01be532bb/.ocamlformat -------------------------------------------------------------------------------- /.vscode/settings.json: -------------------------------------------------------------------------------- 1 | { 2 | "ocaml.sandbox": { 3 | "kind": "opam", 4 | "switch": "${workspaceFolder:res_tailwindcss}" 5 | } 6 | } 7 | -------------------------------------------------------------------------------- /CHANGELOG.md: -------------------------------------------------------------------------------- 1 | # CHANGELOG 2 | 3 | # 0.1.14 4 | 5 | - Fix the project root finder in projects that use `rescript.json` 6 | 7 | # 0.1.13 8 | 9 | - Support the descendant combinator 10 | 11 | # 0.1.12 12 | 13 | - Build the executable with static linking for Linux with musl 14 | 15 | # 0.1.11 16 | 17 | - Build the executable with static linking for Linux 18 | 19 | # 0.1.10 20 | 21 | #### :rocket: New Feature 22 | 23 | - Add Windows platform support 24 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) 2021 Greenlabs 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. 22 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # ReScript Tailwindcss 2 | 3 | A ReScript PPX, which validates the tailwindcss class names 4 | 5 | ## Motivation 6 | 7 | The [tailwind-ppx](https://github.com/dylanirlbeck/tailwind-ppx) is the only ppx to validate the tailwindcss class names in compile time. But, it was archived, and written by `ocaml-migrate-parsetree`. My team considered taking over the repository and maintaining it but decided to rewrite it from the scratch with `ppxlib` and `menhir`. Additionally, we improve the logic to find the invalid class name with [Spelling Corrector](https://norvig.com/spell-correct.html) algorithm. 8 | 9 | Plus, the arbitrary values in the JIT mode of Tailwindcss are supported! 10 | 11 | ```html 12 | 13 |
...
14 |
...
15 |
...
16 |
...
17 |
...
18 |
...
19 |
...
20 |
...
21 |
svg]:rotate-180")> ...
22 | ``` 23 | 24 | ## Install 25 | 26 | ``` 27 | yarn add -D @greenlabs/res-tailwindcss 28 | ``` 29 | 30 | `` should be replaced with the relative location of your generated tailwindcss file from your project root in which the `bsconfig.json` file is located. 31 | 32 | ``` 33 | // bsconfig.json 34 | 35 | "ppx-flags": [ 36 | ..., 37 | ["@greenlabs/res-tailwindcss/ppx", "--path "] 38 | ], 39 | ``` 40 | 41 | ## Example 42 | 43 | ```rescript 44 | 45 |
svg]:rotate-180")> 46 | ... 47 | 48 |
49 | ``` 50 | 51 | ## Development 52 | 53 | 1. Create a sandbox with opam 54 | 55 | ``` 56 | opam switch create tailwindcss 4.14.0 57 | ``` 58 | 59 | 2. Install dependencies 60 | 61 | ``` 62 | opam install . --deps-only --with-test 63 | ``` 64 | 65 | 3. Build 66 | 67 | ``` 68 | opam exec -- dune build 69 | ``` 70 | 71 | 4. Test 72 | 73 | ``` 74 | cd rescript 75 | 76 | (install dependencies) 77 | yarn 78 | 79 | (build --watch) 80 | yarn res:clean && yarn res:watch 81 | 82 | (run test --watch) 83 | yarn test:watch 84 | ``` 85 | -------------------------------------------------------------------------------- /bin/bin.ml: -------------------------------------------------------------------------------- 1 | let () = Ppxlib.Driver.run_as_ppx_rewriter () 2 | -------------------------------------------------------------------------------- /bin/dune: -------------------------------------------------------------------------------- 1 | (env 2 | (static 3 | (flags 4 | (:standard -ccopt -static)))) 5 | 6 | (executable 7 | (package res_tailwindcss) 8 | (name bin) 9 | (public_name res_tailwindcss) 10 | (libraries res_tailwindcss)) 11 | -------------------------------------------------------------------------------- /bsconfig.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "@greenlabs/res-tailwindcss", 3 | "sources": [ 4 | { 5 | "dir": "test", 6 | "type": "dev" 7 | } 8 | ], 9 | "refmt": 3, 10 | "ppx-flags": ["./ppx"], 11 | "warnings": { 12 | "number": "+A-9-40-42" 13 | }, 14 | "bsc-flags": ["-bs-super-errors"] 15 | } 16 | -------------------------------------------------------------------------------- /dune: -------------------------------------------------------------------------------- 1 | (dirs src bin) 2 | -------------------------------------------------------------------------------- /dune-project: -------------------------------------------------------------------------------- 1 | (lang dune 2.8) 2 | (name res_tailwindcss) 3 | (using menhir 2.1) 4 | -------------------------------------------------------------------------------- /dune-workspace: -------------------------------------------------------------------------------- 1 | (lang dune 1.1) 2 | -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "@greenlabs/res-tailwindcss", 3 | "version": "0.1.14", 4 | "description": "ReScript PPX validates the tailwindcss class names", 5 | "license": "MIT", 6 | "author": "Greenlabs Dev ", 7 | "repository": { 8 | "type": "git", 9 | "url": "git+https://github.com/green-labs/res_tailwindcss.git" 10 | }, 11 | "bugs": { 12 | "url": "https://github.com/green-labs/res_tailwindcss/issues" 13 | }, 14 | "keywords": [ 15 | "ReScript", 16 | "ppx", 17 | "tailwindcss" 18 | ], 19 | "scripts": { 20 | "postinstall": "node ./postInstall.js" 21 | } 22 | } -------------------------------------------------------------------------------- /postInstall.js: -------------------------------------------------------------------------------- 1 | const path = require("path"); 2 | const fs = require("fs"); 3 | 4 | const installMacLinuxBinary = (binary) => { 5 | const source = path.join(__dirname, binary); 6 | if (fs.existsSync(source)) { 7 | // mac and linux support extension-less executables 8 | // so just overwrite the shell script 9 | const target = path.join(__dirname, "ppx"); 10 | fs.renameSync(source, target); 11 | 12 | // The ppx should be executable in the bundle, but just in case 13 | fs.chmodSync(target, 0777); 14 | } else { 15 | // assume we're in dev mode - nothing will break if the script 16 | // isn't overwritten, it will just be slower 17 | } 18 | }; 19 | 20 | const installWindowsBinary = () => { 21 | const source = path.join(__dirname, "ppx-windows.exe"); 22 | if (fs.existsSync(source)) { 23 | const target = path.join(__dirname, "ppx.exe"); 24 | fs.renameSync(source, target); 25 | 26 | // windows scripts use a different file extension to executables 27 | // so we delete the script to make sure windows uses the exe now 28 | const windowsScript = path.join(__dirname, "ppx.cmd"); 29 | fs.unlinkSync(windowsScript); 30 | } else { 31 | // assume we're in dev mode - nothing will break if the script 32 | // isn't overwritten, it will just be slower 33 | } 34 | }; 35 | 36 | switch (process.platform) { 37 | case "linux": 38 | installMacLinuxBinary("ppx-linux.exe"); 39 | break; 40 | case "darwin": 41 | installMacLinuxBinary("ppx-osx.exe"); 42 | break; 43 | case "win32": 44 | installWindowsBinary(); 45 | break; 46 | default: 47 | // This won't break the installation because the `ppx` shell script remains 48 | // but that script will throw an error in this case anyway 49 | console.warn(`No release available for "${process.platform}"`); 50 | process.exit(1); 51 | } 52 | -------------------------------------------------------------------------------- /ppx: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env sh 2 | 3 | # Get the directory of the script to work from. 4 | DIR=$(dirname "$0") 5 | 6 | if [ -f $DIR/_build/default/bin/bin.exe ]; then 7 | # Use the dev build 8 | $DIR/_build/default/bin/bin.exe $@ 9 | elif [ "$(uname)" = "Darwin" ]; then 10 | # Run the Mac PPX 11 | $DIR/ppx-osx.exe $@ 12 | elif [ "$(expr substr $(uname -s) 1 5)" = "Linux" ]; then 13 | # Run the Linux PPX 14 | $DIR/ppx-linux.exe $@ 15 | else 16 | echo "No release available for '$(uname)'" 17 | exit 1 18 | fi 19 | -------------------------------------------------------------------------------- /ppx.cmd: -------------------------------------------------------------------------------- 1 | @echo off 2 | REM no need to branch on OS here, it will only be used on windows 3 | %~dp0\ppx-windows.exe %* 4 | -------------------------------------------------------------------------------- /res_tailwindcss.opam: -------------------------------------------------------------------------------- 1 | opam-version: "2.0" 2 | name: "res_tailwindcss" 3 | version: "0.1.14" 4 | synopsis: "PPX validates the tailwindcss class names" 5 | description: """ 6 | ppx_tailwindcss validates the tailwindcss class names in compile time. 7 | """ 8 | maintainer: "Greenlabs Dev " 9 | authors: "Greenlabs Dev " 10 | license: "MIT" 11 | homepage: "https://github.com/green-labs/res_tailwindcss" 12 | bug-reports: "https://github.com/green-labs/res_tailwindcss/issues" 13 | dev-repo: "git+https://github.com/green-labs/res_tailwindcss.git" 14 | depends: [ 15 | "ocaml" { = "4.14.0"} 16 | "dune" { >= "2.8"} 17 | "ppxlib" { = "0.24.0"} 18 | "base" {< "v0.15"} 19 | "ppx_inline_test" 20 | "ppx_expect" 21 | "ppx_deriving" 22 | "menhir" { >= "20211230"} 23 | ] 24 | build: [ 25 | ["dune" "build" "-p" name "-j" jobs] 26 | ] 27 | -------------------------------------------------------------------------------- /rescript/__tests__/test.js: -------------------------------------------------------------------------------- 1 | // Generated by ReScript, PLEASE EDIT WITH CARE 2 | 'use strict'; 3 | 4 | var Jest = require("@glennsl/rescript-jest/src/jest.js"); 5 | var View = require("../src/View.js"); 6 | 7 | Jest.describe("", (function () { 8 | Jest.test("", (function () { 9 | return Jest.Expect.toEqual(Jest.Expect.expect(View.header), "py-1.5"); 10 | })); 11 | Jest.test("content", (function () { 12 | return Jest.Expect.toEqual(Jest.Expect.expect(View.header10), "before:content-['']"); 13 | })); 14 | Jest.test("self & children selector", (function () { 15 | return Jest.Expect.toEqual(Jest.Expect.expect(View.header11), "peer-checked:[&>svg]:rotate-180"); 16 | })); 17 | Jest.test("descendant combinator", (function () { 18 | return Jest.Expect.toEqual(Jest.Expect.expect(View.header12), "[&_a]:tw-mt-4"); 19 | })); 20 | })); 21 | 22 | /* Not a pure module */ 23 | -------------------------------------------------------------------------------- /rescript/__tests__/test.res: -------------------------------------------------------------------------------- 1 | open Jest 2 | open Expect 3 | 4 | describe("", _ => { 5 | test("", _ => { 6 | let header = View.header 7 | expect(header)->toEqual("py-1.5") 8 | }) 9 | 10 | test("content", _ => { 11 | let header10 = View.header10 12 | expect(header10)->toEqual("before:content-['']") 13 | }) 14 | 15 | test("self & children selector", _ => { 16 | let header11 = View.header11 17 | expect(header11)->toEqual("peer-checked:[&>svg]:rotate-180") 18 | }) 19 | 20 | test("descendant combinator", _ => { 21 | let header12 = View.header12 22 | expect(header12)->toEqual("[&_a]:tw-mt-4") 23 | }) 24 | }) 25 | -------------------------------------------------------------------------------- /rescript/css/tailwind.css: -------------------------------------------------------------------------------- 1 | /* 2 | ! tailwindcss v3.0.8 | MIT License | https://tailwindcss.com 3 | */ 4 | 5 | /* 6 | 1. Prevent padding and border from affecting element width. (https://github.com/mozdevs/cssremedy/issues/4) 7 | 2. Allow adding a border to an element by just adding a border-width. (https://github.com/tailwindcss/tailwindcss/pull/116) 8 | */ 9 | 10 | *, 11 | ::before, 12 | ::after { 13 | box-sizing: border-box; 14 | /* 1 */ 15 | border-width: 0; 16 | /* 2 */ 17 | border-style: solid; 18 | /* 2 */ 19 | border-color: currentColor; 20 | /* 2 */ 21 | } 22 | 23 | ::before, 24 | ::after { 25 | --tw-content: ""; 26 | } 27 | 28 | /* 29 | 1. Use a consistent sensible line-height in all browsers. 30 | 2. Prevent adjustments of font size after orientation changes in iOS. 31 | 3. Use a more readable tab size. 32 | 4. Use the user's configured `sans` font-family by default. 33 | */ 34 | 35 | html { 36 | line-height: 1.5; 37 | /* 1 */ 38 | -webkit-text-size-adjust: 100%; 39 | /* 2 */ 40 | -moz-tab-size: 4; 41 | /* 3 */ 42 | -o-tab-size: 4; 43 | tab-size: 4; 44 | /* 3 */ 45 | font-family: Noto Sans KR, -apple-system, BlinkMacSystemFont, Helvetica Neue, 46 | Arial, sans-serif; 47 | /* 4 */ 48 | } 49 | 50 | /* 51 | 1. Remove the margin in all browsers. 52 | 2. Inherit line-height from `html` so users can set them as a class directly on the `html` element. 53 | */ 54 | 55 | body { 56 | margin: 0; 57 | /* 1 */ 58 | line-height: inherit; 59 | /* 2 */ 60 | } 61 | 62 | /* 63 | 1. Add the correct height in Firefox. 64 | 2. Correct the inheritance of border color in Firefox. (https://bugzilla.mozilla.org/show_bug.cgi?id=190655) 65 | 3. Ensure horizontal rules are visible by default. 66 | */ 67 | 68 | hr { 69 | height: 0; 70 | /* 1 */ 71 | color: inherit; 72 | /* 2 */ 73 | border-top-width: 1px; 74 | /* 3 */ 75 | } 76 | 77 | /* 78 | Add the correct text decoration in Chrome, Edge, and Safari. 79 | */ 80 | 81 | abbr:where([title]) { 82 | -webkit-text-decoration: underline dotted; 83 | text-decoration: underline dotted; 84 | } 85 | 86 | /* 87 | Remove the default font size and weight for headings. 88 | */ 89 | 90 | h1, 91 | h2, 92 | h3, 93 | h4, 94 | h5, 95 | h6 { 96 | font-size: inherit; 97 | font-weight: inherit; 98 | } 99 | 100 | /* 101 | Reset links to optimize for opt-in styling instead of opt-out. 102 | */ 103 | 104 | a { 105 | color: inherit; 106 | text-decoration: inherit; 107 | } 108 | 109 | /* 110 | Add the correct font weight in Edge and Safari. 111 | */ 112 | 113 | b, 114 | strong { 115 | font-weight: bolder; 116 | } 117 | 118 | /* 119 | 1. Use the user's configured `mono` font family by default. 120 | 2. Correct the odd `em` font sizing in all browsers. 121 | */ 122 | 123 | code, 124 | kbd, 125 | samp, 126 | pre { 127 | font-family: Menlo, Monaco, Consolas, Roboto Mono, SFMono-Regular, Segoe UI, 128 | Courier, monospace; 129 | /* 1 */ 130 | font-size: 1em; 131 | /* 2 */ 132 | } 133 | 134 | /* 135 | Add the correct font size in all browsers. 136 | */ 137 | 138 | small { 139 | font-size: 80%; 140 | } 141 | 142 | /* 143 | Prevent `sub` and `sup` elements from affecting the line height in all browsers. 144 | */ 145 | 146 | sub, 147 | sup { 148 | font-size: 75%; 149 | line-height: 0; 150 | position: relative; 151 | vertical-align: baseline; 152 | } 153 | 154 | sub { 155 | bottom: -0.25em; 156 | } 157 | 158 | sup { 159 | top: -0.5em; 160 | } 161 | 162 | /* 163 | 1. Remove text indentation from table contents in Chrome and Safari. (https://bugs.chromium.org/p/chromium/issues/detail?id=999088, https://bugs.webkit.org/show_bug.cgi?id=201297) 164 | 2. Correct table border color inheritance in all Chrome and Safari. (https://bugs.chromium.org/p/chromium/issues/detail?id=935729, https://bugs.webkit.org/show_bug.cgi?id=195016) 165 | 3. Remove gaps between table borders by default. 166 | */ 167 | 168 | table { 169 | text-indent: 0; 170 | /* 1 */ 171 | border-color: inherit; 172 | /* 2 */ 173 | border-collapse: collapse; 174 | /* 3 */ 175 | } 176 | 177 | /* 178 | 1. Change the font styles in all browsers. 179 | 2. Remove the margin in Firefox and Safari. 180 | 3. Remove default padding in all browsers. 181 | */ 182 | 183 | button, 184 | input, 185 | optgroup, 186 | select, 187 | textarea { 188 | font-family: inherit; 189 | /* 1 */ 190 | font-size: 100%; 191 | /* 1 */ 192 | line-height: inherit; 193 | /* 1 */ 194 | color: inherit; 195 | /* 1 */ 196 | margin: 0; 197 | /* 2 */ 198 | padding: 0; 199 | /* 3 */ 200 | } 201 | 202 | /* 203 | Remove the inheritance of text transform in Edge and Firefox. 204 | */ 205 | 206 | button, 207 | select { 208 | text-transform: none; 209 | } 210 | 211 | /* 212 | 1. Correct the inability to style clickable types in iOS and Safari. 213 | 2. Remove default button styles. 214 | */ 215 | 216 | button, 217 | [type="button"], 218 | [type="reset"], 219 | [type="submit"] { 220 | -webkit-appearance: button; 221 | /* 1 */ 222 | background-color: transparent; 223 | /* 2 */ 224 | background-image: none; 225 | /* 2 */ 226 | } 227 | 228 | /* 229 | Use the modern Firefox focus style for all focusable elements. 230 | */ 231 | 232 | :-moz-focusring { 233 | outline: auto; 234 | } 235 | 236 | /* 237 | Remove the additional `:invalid` styles in Firefox. (https://github.com/mozilla/gecko-dev/blob/2f9eacd9d3d995c937b4251a5557d95d494c9be1/layout/style/res/forms.css#L728-L737) 238 | */ 239 | 240 | :-moz-ui-invalid { 241 | box-shadow: none; 242 | } 243 | 244 | /* 245 | Add the correct vertical alignment in Chrome and Firefox. 246 | */ 247 | 248 | progress { 249 | vertical-align: baseline; 250 | } 251 | 252 | /* 253 | Correct the cursor style of increment and decrement buttons in Safari. 254 | */ 255 | 256 | ::-webkit-inner-spin-button, 257 | ::-webkit-outer-spin-button { 258 | height: auto; 259 | } 260 | 261 | /* 262 | 1. Correct the odd appearance in Chrome and Safari. 263 | 2. Correct the outline style in Safari. 264 | */ 265 | 266 | [type="search"] { 267 | -webkit-appearance: textfield; 268 | /* 1 */ 269 | outline-offset: -2px; 270 | /* 2 */ 271 | } 272 | 273 | /* 274 | Remove the inner padding in Chrome and Safari on macOS. 275 | */ 276 | 277 | ::-webkit-search-decoration { 278 | -webkit-appearance: none; 279 | } 280 | 281 | /* 282 | 1. Correct the inability to style clickable types in iOS and Safari. 283 | 2. Change font properties to `inherit` in Safari. 284 | */ 285 | 286 | ::-webkit-file-upload-button { 287 | -webkit-appearance: button; 288 | /* 1 */ 289 | font: inherit; 290 | /* 2 */ 291 | } 292 | 293 | /* 294 | Add the correct display in Chrome and Safari. 295 | */ 296 | 297 | summary { 298 | display: list-item; 299 | } 300 | 301 | /* 302 | Removes the default spacing and border for appropriate elements. 303 | */ 304 | 305 | blockquote, 306 | dl, 307 | dd, 308 | h1, 309 | h2, 310 | h3, 311 | h4, 312 | h5, 313 | h6, 314 | hr, 315 | figure, 316 | p, 317 | pre { 318 | margin: 0; 319 | } 320 | 321 | fieldset { 322 | margin: 0; 323 | padding: 0; 324 | } 325 | 326 | legend { 327 | padding: 0; 328 | } 329 | 330 | ol, 331 | ul, 332 | menu { 333 | list-style: none; 334 | margin: 0; 335 | padding: 0; 336 | } 337 | 338 | /* 339 | Prevent resizing textareas horizontally by default. 340 | */ 341 | 342 | textarea { 343 | resize: vertical; 344 | } 345 | 346 | /* 347 | 1. Reset the default placeholder opacity in Firefox. (https://github.com/tailwindlabs/tailwindcss/issues/3300) 348 | 2. Set the default placeholder color to the user's configured gray 400 color. 349 | */ 350 | 351 | input::-moz-placeholder, 352 | textarea::-moz-placeholder { 353 | opacity: 1; 354 | /* 1 */ 355 | color: #b2b2b2; 356 | /* 2 */ 357 | } 358 | 359 | input:-ms-input-placeholder, 360 | textarea:-ms-input-placeholder { 361 | opacity: 1; 362 | /* 1 */ 363 | color: #b2b2b2; 364 | /* 2 */ 365 | } 366 | 367 | input::placeholder, 368 | textarea::placeholder { 369 | opacity: 1; 370 | /* 1 */ 371 | color: #b2b2b2; 372 | /* 2 */ 373 | } 374 | 375 | /* 376 | Set the default cursor for buttons. 377 | */ 378 | 379 | button, 380 | [role="button"] { 381 | cursor: pointer; 382 | } 383 | 384 | /* 385 | Make sure disabled buttons don't get the pointer cursor. 386 | */ 387 | 388 | :disabled { 389 | cursor: default; 390 | } 391 | 392 | /* 393 | 1. Make replaced elements `display: block` by default. (https://github.com/mozdevs/cssremedy/issues/14) 394 | 2. Add `vertical-align: middle` to align replaced elements more sensibly by default. (https://github.com/jensimmons/cssremedy/issues/14#issuecomment-634934210) 395 | This can trigger a poorly considered lint error in some tools but is included by design. 396 | */ 397 | 398 | img, 399 | svg, 400 | video, 401 | canvas, 402 | audio, 403 | iframe, 404 | embed, 405 | object { 406 | display: block; 407 | /* 1 */ 408 | vertical-align: middle; 409 | /* 2 */ 410 | } 411 | 412 | /* 413 | Constrain images and videos to the parent width and preserve their intrinsic aspect ratio. (https://github.com/mozdevs/cssremedy/issues/14) 414 | */ 415 | 416 | img, 417 | video { 418 | max-width: 100%; 419 | height: auto; 420 | } 421 | 422 | /* 423 | Ensure the default browser behavior of the `hidden` attribute. 424 | */ 425 | 426 | [hidden] { 427 | display: none; 428 | } 429 | 430 | *, 431 | ::before, 432 | ::after { 433 | --tw-translate-x: 0; 434 | --tw-translate-y: 0; 435 | --tw-rotate: 0; 436 | --tw-skew-x: 0; 437 | --tw-skew-y: 0; 438 | --tw-scale-x: 1; 439 | --tw-scale-y: 1; 440 | --tw-transform: translateX(var(--tw-translate-x)) 441 | translateY(var(--tw-translate-y)) rotate(var(--tw-rotate)) 442 | skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) 443 | scaleY(var(--tw-scale-y)); 444 | --tw-border-opacity: 1; 445 | border-color: rgb(229 229 229 / var(--tw-border-opacity)); 446 | --tw-ring-inset: var(--tw-empty, /*!*/ /*!*/); 447 | --tw-ring-offset-width: 0px; 448 | --tw-ring-offset-color: #fff; 449 | --tw-ring-color: rgb(39 81 196 / 0.5); 450 | --tw-ring-offset-shadow: 0 0 #0000; 451 | --tw-ring-shadow: 0 0 #0000; 452 | --tw-shadow: 0 0 #0000; 453 | --tw-shadow-colored: 0 0 #0000; 454 | --tw-blur: var(--tw-empty, /*!*/ /*!*/); 455 | --tw-brightness: var(--tw-empty, /*!*/ /*!*/); 456 | --tw-contrast: var(--tw-empty, /*!*/ /*!*/); 457 | --tw-grayscale: var(--tw-empty, /*!*/ /*!*/); 458 | --tw-hue-rotate: var(--tw-empty, /*!*/ /*!*/); 459 | --tw-invert: var(--tw-empty, /*!*/ /*!*/); 460 | --tw-saturate: var(--tw-empty, /*!*/ /*!*/); 461 | --tw-sepia: var(--tw-empty, /*!*/ /*!*/); 462 | --tw-drop-shadow: var(--tw-empty, /*!*/ /*!*/); 463 | --tw-filter: var(--tw-blur) var(--tw-brightness) var(--tw-contrast) 464 | var(--tw-grayscale) var(--tw-hue-rotate) var(--tw-invert) var(--tw-saturate) 465 | var(--tw-sepia) var(--tw-drop-shadow); 466 | } 467 | 468 | .container { 469 | width: 100%; 470 | } 471 | 472 | @media (min-width: 640px) { 473 | .container { 474 | max-width: 640px; 475 | } 476 | } 477 | 478 | @media (min-width: 768px) { 479 | .container { 480 | max-width: 768px; 481 | } 482 | } 483 | 484 | @media (min-width: 1024px) { 485 | .container { 486 | max-width: 1024px; 487 | } 488 | } 489 | 490 | @media (min-width: 1280px) { 491 | .container { 492 | max-width: 1280px; 493 | } 494 | } 495 | 496 | @media (min-width: 1536px) { 497 | .container { 498 | max-width: 1536px; 499 | } 500 | } 501 | 502 | .static { 503 | position: static; 504 | } 505 | 506 | .fixed { 507 | position: fixed; 508 | } 509 | 510 | .absolute { 511 | position: absolute; 512 | } 513 | 514 | .relative { 515 | position: relative; 516 | } 517 | 518 | .sticky { 519 | position: -webkit-sticky; 520 | position: sticky; 521 | } 522 | 523 | .bottom-0 { 524 | bottom: 0px; 525 | } 526 | 527 | .left-1\/2 { 528 | left: 50%; 529 | } 530 | 531 | .left-\[calc\(90px\)\] { 532 | left: calc(90px); 533 | } 534 | 535 | .top-\[calc\(12px\)\] { 536 | top: calc(12px); 537 | } 538 | 539 | .right-\[calc\(12px\)\] { 540 | right: calc(12px); 541 | } 542 | 543 | .top-\[calc\(48px\)\] { 544 | top: calc(48px); 545 | } 546 | 547 | .bottom-5 { 548 | bottom: 1.25rem; 549 | } 550 | 551 | .z-10 { 552 | z-index: 10; 553 | } 554 | 555 | .-mt-px { 556 | margin-top: -1px; 557 | } 558 | 559 | .mb-10 { 560 | margin-bottom: 2.5rem; 561 | } 562 | 563 | .mb-5 { 564 | margin-bottom: 1.25rem; 565 | } 566 | 567 | .mb-3 { 568 | margin-bottom: 0.75rem; 569 | } 570 | 571 | .mr-2 { 572 | margin-right: 0.5rem; 573 | } 574 | 575 | .mt-3 { 576 | margin-top: 0.75rem; 577 | } 578 | 579 | .mt-\[calc\(34px\)\] { 580 | margin-top: calc(34px); 581 | } 582 | 583 | .mt-\[calc\(44px\)\] { 584 | margin-top: calc(44px); 585 | } 586 | 587 | .box-border { 588 | box-sizing: border-box; 589 | } 590 | 591 | .block { 592 | display: block; 593 | } 594 | 595 | .flex { 596 | display: flex; 597 | } 598 | 599 | .table { 600 | display: table; 601 | } 602 | 603 | .grid { 604 | display: grid; 605 | } 606 | 607 | .contents { 608 | display: contents; 609 | } 610 | 611 | .hidden { 612 | display: none; 613 | } 614 | 615 | .h-full { 616 | height: 100%; 617 | } 618 | 619 | .h-14 { 620 | height: 3.5rem; 621 | } 622 | 623 | .h-5 { 624 | height: 1.25rem; 625 | } 626 | 627 | .h-4 { 628 | height: 1rem; 629 | } 630 | 631 | .w-1\/4 { 632 | width: 25%; 633 | } 634 | 635 | .w-full { 636 | width: 100%; 637 | } 638 | 639 | .w-\[calc\(124px\)\] { 640 | width: calc(124px); 641 | } 642 | 643 | .w-\[calc\(100\%-40px\)\] { 644 | width: calc(100% - 40px); 645 | } 646 | 647 | .w-\[100\%-40px\] { 648 | width: 100% - 40px; 649 | } 650 | 651 | .w-\[100\%-\] { 652 | width: 100% -; 653 | } 654 | 655 | .w-\[100\%\] { 656 | width: 100%; 657 | } 658 | 659 | .w-\[15px\] { 660 | width: 15px; 661 | } 662 | 663 | .w-\[100vh\] { 664 | width: 100vh; 665 | } 666 | 667 | .w-\[calc\(5px\)\] { 668 | width: calc(5px); 669 | } 670 | 671 | .w-\[calc\(5\%\)\] { 672 | width: calc(5%); 673 | } 674 | 675 | .w-\[100px\] { 676 | width: 100px; 677 | } 678 | 679 | .max-w-screen-sm { 680 | max-width: 640px; 681 | } 682 | 683 | .-translate-x-2\/4 { 684 | --tw-translate-x: -50%; 685 | transform: var(--tw-transform); 686 | } 687 | 688 | .transform { 689 | transform: var(--tw-transform); 690 | } 691 | 692 | .resize { 693 | resize: both; 694 | } 695 | 696 | .appearance-none { 697 | -webkit-appearance: none; 698 | -moz-appearance: none; 699 | appearance: none; 700 | } 701 | 702 | .flex-col { 703 | flex-direction: column; 704 | } 705 | 706 | .items-center { 707 | align-items: center; 708 | } 709 | 710 | .justify-start { 711 | justify-content: flex-start; 712 | } 713 | 714 | .justify-center { 715 | justify-content: center; 716 | } 717 | 718 | .justify-between { 719 | justify-content: space-between; 720 | } 721 | 722 | .divide-y > :not([hidden]) ~ :not([hidden]) { 723 | --tw-divide-y-reverse: 0; 724 | border-top-width: calc(1px * calc(1 - var(--tw-divide-y-reverse))); 725 | border-bottom-width: calc(1px * var(--tw-divide-y-reverse)); 726 | } 727 | 728 | .rounded-\[calc\(10px\)\] { 729 | border-radius: calc(10px); 730 | } 731 | 732 | .rounded-default { 733 | border-radius: 12px; 734 | } 735 | 736 | .border { 737 | border-width: 1px; 738 | } 739 | 740 | .border-solid { 741 | border-style: solid; 742 | } 743 | 744 | .border-gray-300 { 745 | --tw-border-opacity: 1; 746 | border-color: rgb(204 204 204 / var(--tw-border-opacity)); 747 | } 748 | 749 | .bg-white { 750 | --tw-bg-opacity: 1; 751 | background-color: rgb(255 255 255 / var(--tw-bg-opacity)); 752 | } 753 | 754 | .bg-gray-100 { 755 | --tw-bg-opacity: 1; 756 | background-color: rgb(242 242 242 / var(--tw-bg-opacity)); 757 | } 758 | 759 | .bg-gray-50 { 760 | --tw-bg-opacity: 1; 761 | background-color: rgb(247 247 247 / var(--tw-bg-opacity)); 762 | } 763 | 764 | .bg-green-500 { 765 | --tw-bg-opacity: 1; 766 | background-color: rgb(18 181 100 / var(--tw-bg-opacity)); 767 | } 768 | 769 | .fill-current { 770 | fill: currentColor; 771 | } 772 | 773 | .p-5 { 774 | padding: 1.25rem; 775 | } 776 | 777 | .p-3 { 778 | padding: 0.75rem; 779 | } 780 | 781 | .px-5 { 782 | padding-left: 1.25rem; 783 | padding-right: 1.25rem; 784 | } 785 | 786 | .py-6 { 787 | padding-top: 1.5rem; 788 | padding-bottom: 1.5rem; 789 | } 790 | 791 | .py-875 { 792 | padding-top: 14px; 793 | padding-bottom: 14px; 794 | } 795 | 796 | .py-1\.5 { 797 | padding-top: 0.375rem; 798 | padding-bottom: 0.375rem; 799 | } 800 | 801 | .py-1 { 802 | padding-top: 0.25rem; 803 | padding-bottom: 0.25rem; 804 | } 805 | 806 | .pb-20 { 807 | padding-bottom: 5rem; 808 | } 809 | 810 | .pb-2 { 811 | padding-bottom: 0.5rem; 812 | } 813 | 814 | .pb-75 { 815 | padding-bottom: 75px; 816 | } 817 | 818 | .pl-5 { 819 | padding-left: 1.25rem; 820 | } 821 | 822 | .pr-5 { 823 | padding-right: 1.25rem; 824 | } 825 | 826 | .pt-6 { 827 | padding-top: 1.5rem; 828 | } 829 | 830 | .pb-1\.5 { 831 | padding-bottom: 0.375rem; 832 | } 833 | 834 | .pb-1 { 835 | padding-bottom: 0.25rem; 836 | } 837 | 838 | .pr-2 { 839 | padding-right: 0.5rem; 840 | } 841 | 842 | .text-menu { 843 | font-size: 0.8125rem; 844 | } 845 | 846 | .text-sm { 847 | font-size: 0.875rem; 848 | } 849 | 850 | .text-17 { 851 | font-size: 17px; 852 | } 853 | 854 | .text-base { 855 | font-size: 1rem; 856 | } 857 | 858 | .text-lg { 859 | font-size: 1.125rem; 860 | } 861 | 862 | .font-normal { 863 | font-weight: 400; 864 | } 865 | 866 | .font-bold { 867 | font-weight: 700; 868 | } 869 | 870 | .leading-6 { 871 | line-height: 1.5rem; 872 | } 873 | 874 | .text-primary { 875 | --tw-text-opacity: 1; 876 | color: rgb(18 181 100 / var(--tw-text-opacity)); 877 | } 878 | 879 | .text-gray-500 { 880 | --tw-text-opacity: 1; 881 | color: rgb(153 153 153 / var(--tw-text-opacity)); 882 | } 883 | 884 | .text-gray-600 { 885 | --tw-text-opacity: 1; 886 | color: rgb(114 114 114 / var(--tw-text-opacity)); 887 | } 888 | 889 | .text-gray-800 { 890 | --tw-text-opacity: 1; 891 | color: rgb(38 38 38 / var(--tw-text-opacity)); 892 | } 893 | 894 | .text-red-500 { 895 | --tw-text-opacity: 1; 896 | color: rgb(255 43 53 / var(--tw-text-opacity)); 897 | } 898 | 899 | .text-blue-500 { 900 | --tw-text-opacity: 1; 901 | color: rgb(39 81 196 / var(--tw-text-opacity)); 902 | } 903 | 904 | .text-white { 905 | --tw-text-opacity: 1; 906 | color: rgb(255 255 255 / var(--tw-text-opacity)); 907 | } 908 | 909 | .text-\[\#212121\] { 910 | --tw-text-opacity: 1; 911 | color: rgb(33 33 33 / var(--tw-text-opacity)); 912 | } 913 | 914 | .underline { 915 | -webkit-text-decoration-line: underline; 916 | text-decoration-line: underline; 917 | } 918 | 919 | .placeholder-gray-400::-moz-placeholder { 920 | --tw-placeholder-opacity: 1; 921 | color: rgb(178 178 178 / var(--tw-placeholder-opacity)); 922 | } 923 | 924 | .placeholder-gray-400:-ms-input-placeholder { 925 | --tw-placeholder-opacity: 1; 926 | color: rgb(178 178 178 / var(--tw-placeholder-opacity)); 927 | } 928 | 929 | .placeholder-gray-400::placeholder { 930 | --tw-placeholder-opacity: 1; 931 | color: rgb(178 178 178 / var(--tw-placeholder-opacity)); 932 | } 933 | 934 | .shadow-fnb { 935 | --tw-shadow: rgb(0 0 0 / 5%) 0px -5px 10px 0px; 936 | --tw-shadow-colored: 0px -5px 10px 0px var(--tw-shadow-color); 937 | box-shadow: var(--tw-ring-offset-shadow, 0 0 #0000), 938 | var(--tw-ring-shadow, 0 0 #0000), var(--tw-shadow); 939 | } 940 | 941 | .shadow-select { 942 | --tw-shadow: 0 2px 6px rgba(0, 0, 0, 0.08); 943 | --tw-shadow-colored: 0 2px 6px var(--tw-shadow-color); 944 | box-shadow: var(--tw-ring-offset-shadow, 0 0 #0000), 945 | var(--tw-ring-shadow, 0 0 #0000), var(--tw-shadow); 946 | } 947 | 948 | .outline-none { 949 | outline: 2px solid transparent; 950 | outline-offset: 2px; 951 | } 952 | 953 | .blur { 954 | --tw-blur: blur(8px); 955 | filter: var(--tw-filter); 956 | } 957 | 958 | .filter { 959 | filter: var(--tw-filter); 960 | } 961 | 962 | .transition { 963 | transition-property: color, background-color, border-color, fill, stroke, 964 | opacity, box-shadow, transform, filter, -webkit-text-decoration-color, 965 | -webkit-backdrop-filter; 966 | transition-property: color, background-color, border-color, 967 | text-decoration-color, fill, stroke, opacity, box-shadow, transform, filter, 968 | backdrop-filter; 969 | transition-property: color, background-color, border-color, 970 | text-decoration-color, fill, stroke, opacity, box-shadow, transform, filter, 971 | backdrop-filter, -webkit-text-decoration-color, -webkit-backdrop-filter; 972 | transition-timing-function: cubic-bezier(0.4, 0, 0.2, 1); 973 | transition-duration: 150ms; 974 | } 975 | 976 | audio, 977 | canvas, 978 | embed, 979 | iframe, 980 | img, 981 | object, 982 | svg, 983 | video { 984 | display: initial; 985 | vertical-align: initial; 986 | } 987 | 988 | /* 버튼 스타일 medium */ 989 | 990 | .btn-level1 { 991 | width: 100%; 992 | white-space: nowrap; 993 | border-radius: 0.75rem; 994 | --tw-bg-opacity: 1; 995 | background-color: rgb(18 181 100 / var(--tw-bg-opacity)); 996 | font-weight: 700; 997 | --tw-text-opacity: 1; 998 | color: rgb(255 255 255 / var(--tw-text-opacity)); 999 | } 1000 | 1001 | .btn-level1:focus { 1002 | outline: 2px solid transparent; 1003 | outline-offset: 2px; 1004 | --tw-ring-offset-shadow: var(--tw-ring-inset) 0 0 0 1005 | var(--tw-ring-offset-width) var(--tw-ring-offset-color); 1006 | --tw-ring-shadow: var(--tw-ring-inset) 0 0 0 1007 | calc(2px + var(--tw-ring-offset-width)) var(--tw-ring-color); 1008 | box-shadow: var(--tw-ring-offset-shadow), var(--tw-ring-shadow), 1009 | var(--tw-shadow, 0 0 #0000); 1010 | --tw-ring-opacity: 1; 1011 | --tw-ring-color: rgb(13 155 99 / var(--tw-ring-opacity)); 1012 | --tw-ring-offset-width: 1px; 1013 | } 1014 | 1015 | .btn-level1-disabled { 1016 | width: 100%; 1017 | white-space: nowrap; 1018 | border-radius: 0.75rem; 1019 | --tw-bg-opacity: 1; 1020 | background-color: rgb(204 204 204 / var(--tw-bg-opacity)); 1021 | font-weight: 700; 1022 | --tw-text-opacity: 1; 1023 | color: rgb(255 255 255 / var(--tw-text-opacity)); 1024 | } 1025 | 1026 | .btn-level1-disabled:focus { 1027 | outline: 2px solid transparent; 1028 | outline-offset: 2px; 1029 | --tw-ring-offset-shadow: var(--tw-ring-inset) 0 0 0 1030 | var(--tw-ring-offset-width) var(--tw-ring-offset-color); 1031 | --tw-ring-shadow: var(--tw-ring-inset) 0 0 0 1032 | calc(2px + var(--tw-ring-offset-width)) var(--tw-ring-color); 1033 | box-shadow: var(--tw-ring-offset-shadow), var(--tw-ring-shadow), 1034 | var(--tw-shadow, 0 0 #0000); 1035 | --tw-ring-opacity: 1; 1036 | --tw-ring-color: rgb(204 204 204 / var(--tw-ring-opacity)); 1037 | --tw-ring-offset-width: 1px; 1038 | } 1039 | 1040 | .btn-level4 { 1041 | width: 100%; 1042 | white-space: nowrap; 1043 | border-radius: 0.75rem; 1044 | --tw-bg-opacity: 1; 1045 | background-color: rgb(255 234 225 / var(--tw-bg-opacity)); 1046 | font-weight: 700; 1047 | --tw-text-opacity: 1; 1048 | color: rgb(255 43 53 / var(--tw-text-opacity)); 1049 | } 1050 | 1051 | .btn-level4:focus { 1052 | outline: 2px solid transparent; 1053 | outline-offset: 2px; 1054 | --tw-ring-offset-shadow: var(--tw-ring-inset) 0 0 0 1055 | var(--tw-ring-offset-width) var(--tw-ring-offset-color); 1056 | --tw-ring-shadow: var(--tw-ring-inset) 0 0 0 1057 | calc(2px + var(--tw-ring-offset-width)) var(--tw-ring-color); 1058 | box-shadow: var(--tw-ring-offset-shadow), var(--tw-ring-shadow), 1059 | var(--tw-shadow, 0 0 #0000); 1060 | --tw-ring-opacity: 1; 1061 | --tw-ring-color: rgb(255 218 206 / var(--tw-ring-opacity)); 1062 | --tw-ring-offset-width: 1px; 1063 | } 1064 | 1065 | .btn-level4-disabled { 1066 | width: 100%; 1067 | white-space: nowrap; 1068 | border-radius: 0.75rem; 1069 | --tw-bg-opacity: 1; 1070 | background-color: rgb(242 242 242 / var(--tw-bg-opacity)); 1071 | font-weight: 700; 1072 | --tw-text-opacity: 1; 1073 | color: rgb(204 204 204 / var(--tw-text-opacity)); 1074 | } 1075 | 1076 | .btn-level4-disabled:focus { 1077 | outline: 2px solid transparent; 1078 | outline-offset: 2px; 1079 | --tw-ring-offset-shadow: var(--tw-ring-inset) 0 0 0 1080 | var(--tw-ring-offset-width) var(--tw-ring-offset-color); 1081 | --tw-ring-shadow: var(--tw-ring-inset) 0 0 0 1082 | calc(2px + var(--tw-ring-offset-width)) var(--tw-ring-color); 1083 | box-shadow: var(--tw-ring-offset-shadow), var(--tw-ring-shadow), 1084 | var(--tw-shadow, 0 0 #0000); 1085 | --tw-ring-opacity: 1; 1086 | --tw-ring-color: rgb(114 114 114 / var(--tw-ring-opacity)); 1087 | --tw-ring-offset-width: 1px; 1088 | } 1089 | 1090 | .btn-level6 { 1091 | width: 100%; 1092 | white-space: nowrap; 1093 | border-radius: 0.75rem; 1094 | --tw-bg-opacity: 1; 1095 | background-color: rgb(242 242 242 / var(--tw-bg-opacity)); 1096 | --tw-text-opacity: 1; 1097 | color: rgb(38 38 38 / var(--tw-text-opacity)); 1098 | } 1099 | 1100 | .btn-level6:focus { 1101 | outline: 2px solid transparent; 1102 | outline-offset: 2px; 1103 | --tw-ring-offset-shadow: var(--tw-ring-inset) 0 0 0 1104 | var(--tw-ring-offset-width) var(--tw-ring-offset-color); 1105 | --tw-ring-shadow: var(--tw-ring-inset) 0 0 0 1106 | calc(2px + var(--tw-ring-offset-width)) var(--tw-ring-color); 1107 | box-shadow: var(--tw-ring-offset-shadow), var(--tw-ring-shadow), 1108 | var(--tw-shadow, 0 0 #0000); 1109 | --tw-ring-opacity: 1; 1110 | --tw-ring-color: rgb(236 236 236 / var(--tw-ring-opacity)); 1111 | --tw-ring-offset-width: 1px; 1112 | } 1113 | 1114 | .btn-level6-disabled { 1115 | width: 100%; 1116 | white-space: nowrap; 1117 | border-radius: 0.75rem; 1118 | --tw-bg-opacity: 1; 1119 | background-color: rgb(242 242 242 / var(--tw-bg-opacity)); 1120 | --tw-text-opacity: 1; 1121 | color: rgb(178 178 178 / var(--tw-text-opacity)); 1122 | } 1123 | 1124 | .btn-level6-disabled:focus { 1125 | outline: 2px solid transparent; 1126 | outline-offset: 2px; 1127 | --tw-ring-offset-shadow: var(--tw-ring-inset) 0 0 0 1128 | var(--tw-ring-offset-width) var(--tw-ring-offset-color); 1129 | --tw-ring-shadow: var(--tw-ring-inset) 0 0 0 1130 | calc(2px + var(--tw-ring-offset-width)) var(--tw-ring-color); 1131 | box-shadow: var(--tw-ring-offset-shadow), var(--tw-ring-shadow), 1132 | var(--tw-shadow, 0 0 #0000); 1133 | --tw-ring-opacity: 1; 1134 | --tw-ring-color: rgb(242 242 242 / var(--tw-ring-opacity)); 1135 | --tw-ring-offset-width: 1px; 1136 | } 1137 | 1138 | /* 버튼 스타일 small */ 1139 | 1140 | .btn-level1-small { 1141 | width: 100%; 1142 | white-space: nowrap; 1143 | border-radius: 0.5rem; 1144 | --tw-bg-opacity: 1; 1145 | background-color: rgb(18 181 100 / var(--tw-bg-opacity)); 1146 | --tw-text-opacity: 1; 1147 | color: rgb(255 255 255 / var(--tw-text-opacity)); 1148 | } 1149 | 1150 | .btn-level1-small:focus { 1151 | outline: 2px solid transparent; 1152 | outline-offset: 2px; 1153 | --tw-ring-offset-shadow: var(--tw-ring-inset) 0 0 0 1154 | var(--tw-ring-offset-width) var(--tw-ring-offset-color); 1155 | --tw-ring-shadow: var(--tw-ring-inset) 0 0 0 1156 | calc(2px + var(--tw-ring-offset-width)) var(--tw-ring-color); 1157 | box-shadow: var(--tw-ring-offset-shadow), var(--tw-ring-shadow), 1158 | var(--tw-shadow, 0 0 #0000); 1159 | --tw-ring-opacity: 1; 1160 | --tw-ring-color: rgb(13 155 99 / var(--tw-ring-opacity)); 1161 | --tw-ring-offset-width: 1px; 1162 | } 1163 | 1164 | .btn-level1-small-disabled { 1165 | width: 100%; 1166 | white-space: nowrap; 1167 | border-radius: 0.5rem; 1168 | --tw-bg-opacity: 1; 1169 | background-color: rgb(204 204 204 / var(--tw-bg-opacity)); 1170 | --tw-text-opacity: 1; 1171 | color: rgb(255 255 255 / var(--tw-text-opacity)); 1172 | } 1173 | 1174 | .btn-level1-small-disabled:focus { 1175 | outline: 2px solid transparent; 1176 | outline-offset: 2px; 1177 | --tw-ring-offset-shadow: var(--tw-ring-inset) 0 0 0 1178 | var(--tw-ring-offset-width) var(--tw-ring-offset-color); 1179 | --tw-ring-shadow: var(--tw-ring-inset) 0 0 0 1180 | calc(2px + var(--tw-ring-offset-width)) var(--tw-ring-color); 1181 | box-shadow: var(--tw-ring-offset-shadow), var(--tw-ring-shadow), 1182 | var(--tw-shadow, 0 0 #0000); 1183 | --tw-ring-opacity: 1; 1184 | --tw-ring-color: rgb(204 204 204 / var(--tw-ring-opacity)); 1185 | --tw-ring-offset-width: 1px; 1186 | } 1187 | 1188 | .btn-level6-small { 1189 | width: 100%; 1190 | white-space: nowrap; 1191 | border-radius: 0.5rem; 1192 | --tw-bg-opacity: 1; 1193 | background-color: rgb(242 242 242 / var(--tw-bg-opacity)); 1194 | --tw-text-opacity: 1; 1195 | color: rgb(38 38 38 / var(--tw-text-opacity)); 1196 | } 1197 | 1198 | .btn-level6-small:focus { 1199 | outline: 2px solid transparent; 1200 | outline-offset: 2px; 1201 | --tw-ring-offset-shadow: var(--tw-ring-inset) 0 0 0 1202 | var(--tw-ring-offset-width) var(--tw-ring-offset-color); 1203 | --tw-ring-shadow: var(--tw-ring-inset) 0 0 0 1204 | calc(2px + var(--tw-ring-offset-width)) var(--tw-ring-color); 1205 | box-shadow: var(--tw-ring-offset-shadow), var(--tw-ring-shadow), 1206 | var(--tw-shadow, 0 0 #0000); 1207 | --tw-ring-opacity: 1; 1208 | --tw-ring-color: rgb(236 236 236 / var(--tw-ring-opacity)); 1209 | --tw-ring-offset-width: 1px; 1210 | } 1211 | 1212 | .btn-level6-small-disabled { 1213 | width: 100%; 1214 | white-space: nowrap; 1215 | border-radius: 0.5rem; 1216 | --tw-bg-opacity: 1; 1217 | background-color: rgb(242 242 242 / var(--tw-bg-opacity)); 1218 | --tw-text-opacity: 1; 1219 | color: rgb(178 178 178 / var(--tw-text-opacity)); 1220 | } 1221 | 1222 | .btn-level6-small-disabled:focus { 1223 | outline: 2px solid transparent; 1224 | outline-offset: 2px; 1225 | --tw-ring-offset-shadow: var(--tw-ring-inset) 0 0 0 1226 | var(--tw-ring-offset-width) var(--tw-ring-offset-color); 1227 | --tw-ring-shadow: var(--tw-ring-inset) 0 0 0 1228 | calc(2px + var(--tw-ring-offset-width)) var(--tw-ring-color); 1229 | box-shadow: var(--tw-ring-offset-shadow), var(--tw-ring-shadow), 1230 | var(--tw-shadow, 0 0 #0000); 1231 | --tw-ring-opacity: 1; 1232 | --tw-ring-color: rgb(242 242 242 / var(--tw-ring-opacity)); 1233 | --tw-ring-offset-width: 1px; 1234 | } 1235 | 1236 | /* 드랍다운 애니메이션 */ 1237 | 1238 | @-webkit-keyframes slide-down-and-fade { 1239 | 0% { 1240 | opacity: 0; 1241 | transform: translateY(-2px); 1242 | } 1243 | 1244 | 100% { 1245 | opacity: 1; 1246 | transform: translateY(0); 1247 | } 1248 | } 1249 | 1250 | @keyframes slide-down-and-fade { 1251 | 0% { 1252 | opacity: 0; 1253 | transform: translateY(-2px); 1254 | } 1255 | 1256 | 100% { 1257 | opacity: 1; 1258 | transform: translateY(0); 1259 | } 1260 | } 1261 | 1262 | .dropdown-content[data-state="open"] { 1263 | -webkit-animation: slide-down-and-fade 0.7s cubic-bezier(0.16, 1, 0.3, 1); 1264 | animation: slide-down-and-fade 0.7s cubic-bezier(0.16, 1, 0.3, 1); 1265 | } 1266 | 1267 | /* 다이얼로그 애니메이션 */ 1268 | 1269 | @-webkit-keyframes dialog-overlay-show { 1270 | 0% { 1271 | opacity: 0; 1272 | } 1273 | 1274 | 100% { 1275 | opacity: 0.5; 1276 | } 1277 | } 1278 | 1279 | @keyframes dialog-overlay-show { 1280 | 0% { 1281 | opacity: 0; 1282 | } 1283 | 1284 | 100% { 1285 | opacity: 0.5; 1286 | } 1287 | } 1288 | 1289 | .dialog-overlay[data-state="open"] { 1290 | background-color: black; 1291 | opacity: 0.5; 1292 | position: fixed; 1293 | inset: 0; 1294 | -webkit-animation: dialog-overlay-show 0.15s cubic-bezier(0.16, 1, 0.3, 1); 1295 | animation: dialog-overlay-show 0.15s cubic-bezier(0.16, 1, 0.3, 1); 1296 | } 1297 | 1298 | @-webkit-keyframes dialog-content-show { 1299 | 0% { 1300 | opacity: 0; 1301 | transform: translate(-50%, -48%) scale(0.96); 1302 | } 1303 | 1304 | 100% { 1305 | opacity: 1; 1306 | transform: translate(-50%, -50%) scale(1); 1307 | } 1308 | } 1309 | 1310 | @keyframes dialog-content-show { 1311 | 0% { 1312 | opacity: 0; 1313 | transform: translate(-50%, -48%) scale(0.96); 1314 | } 1315 | 1316 | 100% { 1317 | opacity: 1; 1318 | transform: translate(-50%, -50%) scale(1); 1319 | } 1320 | } 1321 | 1322 | .dialog-content[data-state="open"] { 1323 | background-color: white; 1324 | position: fixed; 1325 | top: 50%; 1326 | left: 50%; 1327 | transform: translate(-50%, -50%); 1328 | width: 90vw; 1329 | max-width: 450px; 1330 | max-height: 85vh; 1331 | -webkit-animation: dialog-content-show 150ms cubic-bezier(0.16, 1, 0.3, 1); 1332 | animation: dialog-content-show 150ms cubic-bezier(0.16, 1, 0.3, 1); 1333 | } 1334 | 1335 | .dialog-content-detail[data-state="open"] { 1336 | background-color: white; 1337 | position: fixed; 1338 | top: 50%; 1339 | left: 50%; 1340 | transform: translate(-50%, -50%); 1341 | width: 90vw; 1342 | max-width: 600px; 1343 | max-height: 85vh; 1344 | -webkit-animation: dialog-content-show 150ms cubic-bezier(0.16, 1, 0.3, 1); 1345 | animation: dialog-content-show 150ms cubic-bezier(0.16, 1, 0.3, 1); 1346 | } 1347 | 1348 | /* 아코디언 애니메이션 */ 1349 | 1350 | @-webkit-keyframes accordian-open { 1351 | from { 1352 | height: 0; 1353 | } 1354 | 1355 | to { 1356 | height: var(--radix-accordion-content-height); 1357 | } 1358 | } 1359 | 1360 | @keyframes accordian-open { 1361 | from { 1362 | height: 0; 1363 | } 1364 | 1365 | to { 1366 | height: var(--radix-accordion-content-height); 1367 | } 1368 | } 1369 | 1370 | @-webkit-keyframes accordian-close { 1371 | from { 1372 | height: var(--radix-accordion-content-height); 1373 | } 1374 | 1375 | to { 1376 | height: 0; 1377 | } 1378 | } 1379 | 1380 | @keyframes accordian-close { 1381 | from { 1382 | height: var(--radix-accordion-content-height); 1383 | } 1384 | 1385 | to { 1386 | height: 0; 1387 | } 1388 | } 1389 | 1390 | .accordian-content[data-state="open"] { 1391 | overflow: hidden; 1392 | -webkit-animation: accordian-open 300ms ease-out; 1393 | animation: accordian-open 300ms ease-out; 1394 | } 1395 | 1396 | .accordian-content[data-state="closed"] { 1397 | overflow: hidden; 1398 | -webkit-animation: accordian-close 300ms ease-out; 1399 | animation: accordian-close 300ms ease-out; 1400 | } 1401 | 1402 | .accordian-trigger[data-state="open"] .accordian-icon { 1403 | transition: transform 300ms cubic-bezier(0.87, 0, 0.13, 1); 1404 | transform: rotate(180deg); 1405 | } 1406 | 1407 | /* 인풋 라디오 스타일 */ 1408 | 1409 | .radio-item { 1410 | all: unset; 1411 | background-color: white; 1412 | width: 20px; 1413 | height: 20px; 1414 | border-radius: 100%; 1415 | border: 1.5px solid #d9d9d9; 1416 | position: relative; 1417 | top: 1px; 1418 | } 1419 | 1420 | .radio-item:hover { 1421 | background-color: #f7f7f7; 1422 | } 1423 | 1424 | .radio-item:focus { 1425 | border: 1.5px solid #12b564; 1426 | outline: none; 1427 | } 1428 | 1429 | .radio-indicator { 1430 | display: flex; 1431 | align-items: center; 1432 | justify-content: center; 1433 | width: 100%; 1434 | height: 100%; 1435 | position: relative; 1436 | } 1437 | 1438 | .radio-indicator::after { 1439 | content: ""; 1440 | display: block; 1441 | width: 10px; 1442 | height: 10px; 1443 | border-radius: 100%; 1444 | background-color: #12b564; 1445 | } 1446 | 1447 | /* 구분선 스타일 */ 1448 | 1449 | .separator { 1450 | background-color: #d9d9d9; 1451 | } 1452 | 1453 | .separator[data-orientation="horizontal"] { 1454 | height: 1px; 1455 | width: 100%; 1456 | } 1457 | 1458 | .separator[data-orientation="vertical"] { 1459 | height: 100%; 1460 | width: 1px; 1461 | } 1462 | 1463 | .focus\:border-gray-800:focus { 1464 | --tw-border-opacity: 1; 1465 | border-color: rgb(38 38 38 / var(--tw-border-opacity)); 1466 | } 1467 | 1468 | .focus\:shadow-select:focus { 1469 | --tw-shadow: 0 2px 6px rgba(0, 0, 0, 0.08); 1470 | --tw-shadow-colored: 0 2px 6px var(--tw-shadow-color); 1471 | box-shadow: var(--tw-ring-offset-shadow, 0 0 #0000), 1472 | var(--tw-ring-shadow, 0 0 #0000), var(--tw-shadow); 1473 | } 1474 | 1475 | .focus\:outline-none:focus { 1476 | outline: 2px solid transparent; 1477 | outline-offset: 2px; 1478 | } 1479 | 1480 | .disabled\:bg-gray-150:disabled { 1481 | --tw-bg-opacity: 1; 1482 | background-color: rgb(236 236 236 / var(--tw-bg-opacity)); 1483 | } 1484 | 1485 | .disabled\:bg-gray-300:disabled { 1486 | --tw-bg-opacity: 1; 1487 | background-color: rgb(204 204 204 / var(--tw-bg-opacity)); 1488 | } 1489 | 1490 | .disabled\:text-opacity-80:disabled { 1491 | --tw-text-opacity: 0.8; 1492 | } 1493 | 1494 | @media (min-width: 1280px) { 1495 | .xl\:min-w-1\/5 { 1496 | min-width: 20%; 1497 | } 1498 | } 1499 | 1500 | .w-\[calc\(100\%-40px\)\] { 1501 | width: calc(100% - 40px); 1502 | } 1503 | 1504 | .w-\[100\%-40px\] { 1505 | width: 100% - 40px; 1506 | } 1507 | 1508 | .w-\[100\%\] { 1509 | width: 100%; 1510 | } 1511 | 1512 | .translate-x-\[calc\(-50\%\+27px\)\] { 1513 | --tw-translate-x: calc(-50% + 27px); 1514 | transform: var(--tw-transform); 1515 | } 1516 | 1517 | .\!pb-\[270px\] { 1518 | padding-bottom: 270px !important; 1519 | } 1520 | 1521 | .translate-x-2\/4, 1522 | .translate-x-\[50\%\] { 1523 | --tw-translate-x: 50%; 1524 | transform: var(--tw-transform); 1525 | } 1526 | 1527 | .before\:content-\[\'\'\]::before { 1528 | --tw-content: ""; 1529 | content: var(--tw-content); 1530 | } 1531 | 1532 | .peer:checked ~ .peer-checked\:\[\&\>svg\]\:rotate-180>svg { 1533 | --tw-rotate: 180deg; 1534 | transform: translate(var(--tw-translate-x), var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y)); 1535 | } 1536 | 1537 | .\[\&_a\]\:tw-mt-4 a { 1538 | margin-top: 4px 1539 | } 1540 | -------------------------------------------------------------------------------- /rescript/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "res-tailwindcss-test", 3 | "version": "0.0.1", 4 | "description": "Test res_tailwindcss", 5 | "license": "MIT", 6 | "devDependencies": { 7 | "@glennsl/rescript-jest": "^0.11.0", 8 | "jest": "^27.3.1", 9 | "rescript": "^11.1.4" 10 | }, 11 | "scripts": { 12 | "res:build": "rescript", 13 | "res:clean": "rescript clean", 14 | "res:watch": "rescript build -w", 15 | "test": "jest", 16 | "test:watch": "jest --watchAll" 17 | } 18 | } 19 | -------------------------------------------------------------------------------- /rescript/pnpm-lock.yaml: -------------------------------------------------------------------------------- 1 | lockfileVersion: '6.0' 2 | 3 | settings: 4 | autoInstallPeers: true 5 | excludeLinksFromLockfile: false 6 | 7 | devDependencies: 8 | '@glennsl/rescript-jest': 9 | specifier: ^0.11.0 10 | version: 0.11.0 11 | jest: 12 | specifier: ^27.3.1 13 | version: 27.5.1 14 | rescript: 15 | specifier: ^11.1.4 16 | version: 11.1.4 17 | 18 | packages: 19 | 20 | /@ampproject/remapping@2.3.0: 21 | resolution: {integrity: sha512-30iZtAPgz+LTIYoeivqYo853f02jBYSd5uGnGpkFV0M3xOt9aN73erkgYAmZU43x4VfqcnLxW9Kpg3R5LC4YYw==} 22 | engines: {node: '>=6.0.0'} 23 | dependencies: 24 | '@jridgewell/gen-mapping': 0.3.5 25 | '@jridgewell/trace-mapping': 0.3.25 26 | dev: true 27 | 28 | /@babel/code-frame@7.25.7: 29 | resolution: {integrity: sha512-0xZJFNE5XMpENsgfHYTw8FbX4kv53mFLn2i3XPoq69LyhYSCBJtitaHx9QnsVTrsogI4Z3+HtEfZ2/GFPOtf5g==} 30 | engines: {node: '>=6.9.0'} 31 | dependencies: 32 | '@babel/highlight': 7.25.7 33 | picocolors: 1.1.1 34 | dev: true 35 | 36 | /@babel/compat-data@7.25.8: 37 | resolution: {integrity: sha512-ZsysZyXY4Tlx+Q53XdnOFmqwfB9QDTHYxaZYajWRoBLuLEAwI2UIbtxOjWh/cFaa9IKUlcB+DDuoskLuKu56JA==} 38 | engines: {node: '>=6.9.0'} 39 | dev: true 40 | 41 | /@babel/core@7.25.8: 42 | resolution: {integrity: sha512-Oixnb+DzmRT30qu9d3tJSQkxuygWm32DFykT4bRoORPa9hZ/L4KhVB/XiRm6KG+roIEM7DBQlmg27kw2HZkdZg==} 43 | engines: {node: '>=6.9.0'} 44 | dependencies: 45 | '@ampproject/remapping': 2.3.0 46 | '@babel/code-frame': 7.25.7 47 | '@babel/generator': 7.25.7 48 | '@babel/helper-compilation-targets': 7.25.7 49 | '@babel/helper-module-transforms': 7.25.7(@babel/core@7.25.8) 50 | '@babel/helpers': 7.25.7 51 | '@babel/parser': 7.25.8 52 | '@babel/template': 7.25.7 53 | '@babel/traverse': 7.25.7 54 | '@babel/types': 7.25.8 55 | convert-source-map: 2.0.0 56 | debug: 4.3.7 57 | gensync: 1.0.0-beta.2 58 | json5: 2.2.3 59 | semver: 6.3.1 60 | transitivePeerDependencies: 61 | - supports-color 62 | dev: true 63 | 64 | /@babel/generator@7.25.7: 65 | resolution: {integrity: sha512-5Dqpl5fyV9pIAD62yK9P7fcA768uVPUyrQmqpqstHWgMma4feF1x/oFysBCVZLY5wJ2GkMUCdsNDnGZrPoR6rA==} 66 | engines: {node: '>=6.9.0'} 67 | dependencies: 68 | '@babel/types': 7.25.8 69 | '@jridgewell/gen-mapping': 0.3.5 70 | '@jridgewell/trace-mapping': 0.3.25 71 | jsesc: 3.0.2 72 | dev: true 73 | 74 | /@babel/helper-compilation-targets@7.25.7: 75 | resolution: {integrity: sha512-DniTEax0sv6isaw6qSQSfV4gVRNtw2rte8HHM45t9ZR0xILaufBRNkpMifCRiAPyvL4ACD6v0gfCwCmtOQaV4A==} 76 | engines: {node: '>=6.9.0'} 77 | dependencies: 78 | '@babel/compat-data': 7.25.8 79 | '@babel/helper-validator-option': 7.25.7 80 | browserslist: 4.24.0 81 | lru-cache: 5.1.1 82 | semver: 6.3.1 83 | dev: true 84 | 85 | /@babel/helper-module-imports@7.25.7: 86 | resolution: {integrity: sha512-o0xCgpNmRohmnoWKQ0Ij8IdddjyBFE4T2kagL/x6M3+4zUgc+4qTOUBoNe4XxDskt1HPKO007ZPiMgLDq2s7Kw==} 87 | engines: {node: '>=6.9.0'} 88 | dependencies: 89 | '@babel/traverse': 7.25.7 90 | '@babel/types': 7.25.8 91 | transitivePeerDependencies: 92 | - supports-color 93 | dev: true 94 | 95 | /@babel/helper-module-transforms@7.25.7(@babel/core@7.25.8): 96 | resolution: {integrity: sha512-k/6f8dKG3yDz/qCwSM+RKovjMix563SLxQFo0UhRNo239SP6n9u5/eLtKD6EAjwta2JHJ49CsD8pms2HdNiMMQ==} 97 | engines: {node: '>=6.9.0'} 98 | peerDependencies: 99 | '@babel/core': ^7.0.0 100 | dependencies: 101 | '@babel/core': 7.25.8 102 | '@babel/helper-module-imports': 7.25.7 103 | '@babel/helper-simple-access': 7.25.7 104 | '@babel/helper-validator-identifier': 7.25.7 105 | '@babel/traverse': 7.25.7 106 | transitivePeerDependencies: 107 | - supports-color 108 | dev: true 109 | 110 | /@babel/helper-plugin-utils@7.25.7: 111 | resolution: {integrity: sha512-eaPZai0PiqCi09pPs3pAFfl/zYgGaE6IdXtYvmf0qlcDTd3WCtO7JWCcRd64e0EQrcYgiHibEZnOGsSY4QSgaw==} 112 | engines: {node: '>=6.9.0'} 113 | dev: true 114 | 115 | /@babel/helper-simple-access@7.25.7: 116 | resolution: {integrity: sha512-FPGAkJmyoChQeM+ruBGIDyrT2tKfZJO8NcxdC+CWNJi7N8/rZpSxK7yvBJ5O/nF1gfu5KzN7VKG3YVSLFfRSxQ==} 117 | engines: {node: '>=6.9.0'} 118 | dependencies: 119 | '@babel/traverse': 7.25.7 120 | '@babel/types': 7.25.8 121 | transitivePeerDependencies: 122 | - supports-color 123 | dev: true 124 | 125 | /@babel/helper-string-parser@7.25.7: 126 | resolution: {integrity: sha512-CbkjYdsJNHFk8uqpEkpCvRs3YRp9tY6FmFY7wLMSYuGYkrdUi7r2lc4/wqsvlHoMznX3WJ9IP8giGPq68T/Y6g==} 127 | engines: {node: '>=6.9.0'} 128 | dev: true 129 | 130 | /@babel/helper-validator-identifier@7.25.7: 131 | resolution: {integrity: sha512-AM6TzwYqGChO45oiuPqwL2t20/HdMC1rTPAesnBCgPCSF1x3oN9MVUwQV2iyz4xqWrctwK5RNC8LV22kaQCNYg==} 132 | engines: {node: '>=6.9.0'} 133 | dev: true 134 | 135 | /@babel/helper-validator-option@7.25.7: 136 | resolution: {integrity: sha512-ytbPLsm+GjArDYXJ8Ydr1c/KJuutjF2besPNbIZnZ6MKUxi/uTA22t2ymmA4WFjZFpjiAMO0xuuJPqK2nvDVfQ==} 137 | engines: {node: '>=6.9.0'} 138 | dev: true 139 | 140 | /@babel/helpers@7.25.7: 141 | resolution: {integrity: sha512-Sv6pASx7Esm38KQpF/U/OXLwPPrdGHNKoeblRxgZRLXnAtnkEe4ptJPDtAZM7fBLadbc1Q07kQpSiGQ0Jg6tRA==} 142 | engines: {node: '>=6.9.0'} 143 | dependencies: 144 | '@babel/template': 7.25.7 145 | '@babel/types': 7.25.8 146 | dev: true 147 | 148 | /@babel/highlight@7.25.7: 149 | resolution: {integrity: sha512-iYyACpW3iW8Fw+ZybQK+drQre+ns/tKpXbNESfrhNnPLIklLbXr7MYJ6gPEd0iETGLOK+SxMjVvKb/ffmk+FEw==} 150 | engines: {node: '>=6.9.0'} 151 | dependencies: 152 | '@babel/helper-validator-identifier': 7.25.7 153 | chalk: 2.4.2 154 | js-tokens: 4.0.0 155 | picocolors: 1.1.1 156 | dev: true 157 | 158 | /@babel/parser@7.25.8: 159 | resolution: {integrity: sha512-HcttkxzdPucv3nNFmfOOMfFf64KgdJVqm1KaCm25dPGMLElo9nsLvXeJECQg8UzPuBGLyTSA0ZzqCtDSzKTEoQ==} 160 | engines: {node: '>=6.0.0'} 161 | hasBin: true 162 | dependencies: 163 | '@babel/types': 7.25.8 164 | dev: true 165 | 166 | /@babel/plugin-syntax-async-generators@7.8.4(@babel/core@7.25.8): 167 | resolution: {integrity: sha512-tycmZxkGfZaxhMRbXlPXuVFpdWlXpir2W4AMhSJgRKzk/eDlIXOhb2LHWoLpDF7TEHylV5zNhykX6KAgHJmTNw==} 168 | peerDependencies: 169 | '@babel/core': ^7.0.0-0 170 | dependencies: 171 | '@babel/core': 7.25.8 172 | '@babel/helper-plugin-utils': 7.25.7 173 | dev: true 174 | 175 | /@babel/plugin-syntax-bigint@7.8.3(@babel/core@7.25.8): 176 | resolution: {integrity: sha512-wnTnFlG+YxQm3vDxpGE57Pj0srRU4sHE/mDkt1qv2YJJSeUAec2ma4WLUnUPeKjyrfntVwe/N6dCXpU+zL3Npg==} 177 | peerDependencies: 178 | '@babel/core': ^7.0.0-0 179 | dependencies: 180 | '@babel/core': 7.25.8 181 | '@babel/helper-plugin-utils': 7.25.7 182 | dev: true 183 | 184 | /@babel/plugin-syntax-class-properties@7.12.13(@babel/core@7.25.8): 185 | resolution: {integrity: sha512-fm4idjKla0YahUNgFNLCB0qySdsoPiZP3iQE3rky0mBUtMZ23yDJ9SJdg6dXTSDnulOVqiF3Hgr9nbXvXTQZYA==} 186 | peerDependencies: 187 | '@babel/core': ^7.0.0-0 188 | dependencies: 189 | '@babel/core': 7.25.8 190 | '@babel/helper-plugin-utils': 7.25.7 191 | dev: true 192 | 193 | /@babel/plugin-syntax-class-static-block@7.14.5(@babel/core@7.25.8): 194 | resolution: {integrity: sha512-b+YyPmr6ldyNnM6sqYeMWE+bgJcJpO6yS4QD7ymxgH34GBPNDM/THBh8iunyvKIZztiwLH4CJZ0RxTk9emgpjw==} 195 | engines: {node: '>=6.9.0'} 196 | peerDependencies: 197 | '@babel/core': ^7.0.0-0 198 | dependencies: 199 | '@babel/core': 7.25.8 200 | '@babel/helper-plugin-utils': 7.25.7 201 | dev: true 202 | 203 | /@babel/plugin-syntax-import-attributes@7.25.7(@babel/core@7.25.8): 204 | resolution: {integrity: sha512-AqVo+dguCgmpi/3mYBdu9lkngOBlQ2w2vnNpa6gfiCxQZLzV4ZbhsXitJ2Yblkoe1VQwtHSaNmIaGll/26YWRw==} 205 | engines: {node: '>=6.9.0'} 206 | peerDependencies: 207 | '@babel/core': ^7.0.0-0 208 | dependencies: 209 | '@babel/core': 7.25.8 210 | '@babel/helper-plugin-utils': 7.25.7 211 | dev: true 212 | 213 | /@babel/plugin-syntax-import-meta@7.10.4(@babel/core@7.25.8): 214 | resolution: {integrity: sha512-Yqfm+XDx0+Prh3VSeEQCPU81yC+JWZ2pDPFSS4ZdpfZhp4MkFMaDC1UqseovEKwSUpnIL7+vK+Clp7bfh0iD7g==} 215 | peerDependencies: 216 | '@babel/core': ^7.0.0-0 217 | dependencies: 218 | '@babel/core': 7.25.8 219 | '@babel/helper-plugin-utils': 7.25.7 220 | dev: true 221 | 222 | /@babel/plugin-syntax-json-strings@7.8.3(@babel/core@7.25.8): 223 | resolution: {integrity: sha512-lY6kdGpWHvjoe2vk4WrAapEuBR69EMxZl+RoGRhrFGNYVK8mOPAW8VfbT/ZgrFbXlDNiiaxQnAtgVCZ6jv30EA==} 224 | peerDependencies: 225 | '@babel/core': ^7.0.0-0 226 | dependencies: 227 | '@babel/core': 7.25.8 228 | '@babel/helper-plugin-utils': 7.25.7 229 | dev: true 230 | 231 | /@babel/plugin-syntax-logical-assignment-operators@7.10.4(@babel/core@7.25.8): 232 | resolution: {integrity: sha512-d8waShlpFDinQ5MtvGU9xDAOzKH47+FFoney2baFIoMr952hKOLp1HR7VszoZvOsV/4+RRszNY7D17ba0te0ig==} 233 | peerDependencies: 234 | '@babel/core': ^7.0.0-0 235 | dependencies: 236 | '@babel/core': 7.25.8 237 | '@babel/helper-plugin-utils': 7.25.7 238 | dev: true 239 | 240 | /@babel/plugin-syntax-nullish-coalescing-operator@7.8.3(@babel/core@7.25.8): 241 | resolution: {integrity: sha512-aSff4zPII1u2QD7y+F8oDsz19ew4IGEJg9SVW+bqwpwtfFleiQDMdzA/R+UlWDzfnHFCxxleFT0PMIrR36XLNQ==} 242 | peerDependencies: 243 | '@babel/core': ^7.0.0-0 244 | dependencies: 245 | '@babel/core': 7.25.8 246 | '@babel/helper-plugin-utils': 7.25.7 247 | dev: true 248 | 249 | /@babel/plugin-syntax-numeric-separator@7.10.4(@babel/core@7.25.8): 250 | resolution: {integrity: sha512-9H6YdfkcK/uOnY/K7/aA2xpzaAgkQn37yzWUMRK7OaPOqOpGS1+n0H5hxT9AUw9EsSjPW8SVyMJwYRtWs3X3ug==} 251 | peerDependencies: 252 | '@babel/core': ^7.0.0-0 253 | dependencies: 254 | '@babel/core': 7.25.8 255 | '@babel/helper-plugin-utils': 7.25.7 256 | dev: true 257 | 258 | /@babel/plugin-syntax-object-rest-spread@7.8.3(@babel/core@7.25.8): 259 | resolution: {integrity: sha512-XoqMijGZb9y3y2XskN+P1wUGiVwWZ5JmoDRwx5+3GmEplNyVM2s2Dg8ILFQm8rWM48orGy5YpI5Bl8U1y7ydlA==} 260 | peerDependencies: 261 | '@babel/core': ^7.0.0-0 262 | dependencies: 263 | '@babel/core': 7.25.8 264 | '@babel/helper-plugin-utils': 7.25.7 265 | dev: true 266 | 267 | /@babel/plugin-syntax-optional-catch-binding@7.8.3(@babel/core@7.25.8): 268 | resolution: {integrity: sha512-6VPD0Pc1lpTqw0aKoeRTMiB+kWhAoT24PA+ksWSBrFtl5SIRVpZlwN3NNPQjehA2E/91FV3RjLWoVTglWcSV3Q==} 269 | peerDependencies: 270 | '@babel/core': ^7.0.0-0 271 | dependencies: 272 | '@babel/core': 7.25.8 273 | '@babel/helper-plugin-utils': 7.25.7 274 | dev: true 275 | 276 | /@babel/plugin-syntax-optional-chaining@7.8.3(@babel/core@7.25.8): 277 | resolution: {integrity: sha512-KoK9ErH1MBlCPxV0VANkXW2/dw4vlbGDrFgz8bmUsBGYkFRcbRwMh6cIJubdPrkxRwuGdtCk0v/wPTKbQgBjkg==} 278 | peerDependencies: 279 | '@babel/core': ^7.0.0-0 280 | dependencies: 281 | '@babel/core': 7.25.8 282 | '@babel/helper-plugin-utils': 7.25.7 283 | dev: true 284 | 285 | /@babel/plugin-syntax-private-property-in-object@7.14.5(@babel/core@7.25.8): 286 | resolution: {integrity: sha512-0wVnp9dxJ72ZUJDV27ZfbSj6iHLoytYZmh3rFcxNnvsJF3ktkzLDZPy/mA17HGsaQT3/DQsWYX1f1QGWkCoVUg==} 287 | engines: {node: '>=6.9.0'} 288 | peerDependencies: 289 | '@babel/core': ^7.0.0-0 290 | dependencies: 291 | '@babel/core': 7.25.8 292 | '@babel/helper-plugin-utils': 7.25.7 293 | dev: true 294 | 295 | /@babel/plugin-syntax-top-level-await@7.14.5(@babel/core@7.25.8): 296 | resolution: {integrity: sha512-hx++upLv5U1rgYfwe1xBQUhRmU41NEvpUvrp8jkrSCdvGSnM5/qdRMtylJ6PG5OFkBaHkbTAKTnd3/YyESRHFw==} 297 | engines: {node: '>=6.9.0'} 298 | peerDependencies: 299 | '@babel/core': ^7.0.0-0 300 | dependencies: 301 | '@babel/core': 7.25.8 302 | '@babel/helper-plugin-utils': 7.25.7 303 | dev: true 304 | 305 | /@babel/plugin-syntax-typescript@7.25.7(@babel/core@7.25.8): 306 | resolution: {integrity: sha512-rR+5FDjpCHqqZN2bzZm18bVYGaejGq5ZkpVCJLXor/+zlSrSoc4KWcHI0URVWjl/68Dyr1uwZUz/1njycEAv9g==} 307 | engines: {node: '>=6.9.0'} 308 | peerDependencies: 309 | '@babel/core': ^7.0.0-0 310 | dependencies: 311 | '@babel/core': 7.25.8 312 | '@babel/helper-plugin-utils': 7.25.7 313 | dev: true 314 | 315 | /@babel/template@7.25.7: 316 | resolution: {integrity: sha512-wRwtAgI3bAS+JGU2upWNL9lSlDcRCqD05BZ1n3X2ONLH1WilFP6O1otQjeMK/1g0pvYcXC7b/qVUB1keofjtZA==} 317 | engines: {node: '>=6.9.0'} 318 | dependencies: 319 | '@babel/code-frame': 7.25.7 320 | '@babel/parser': 7.25.8 321 | '@babel/types': 7.25.8 322 | dev: true 323 | 324 | /@babel/traverse@7.25.7: 325 | resolution: {integrity: sha512-jatJPT1Zjqvh/1FyJs6qAHL+Dzb7sTb+xr7Q+gM1b+1oBsMsQQ4FkVKb6dFlJvLlVssqkRzV05Jzervt9yhnzg==} 326 | engines: {node: '>=6.9.0'} 327 | dependencies: 328 | '@babel/code-frame': 7.25.7 329 | '@babel/generator': 7.25.7 330 | '@babel/parser': 7.25.8 331 | '@babel/template': 7.25.7 332 | '@babel/types': 7.25.8 333 | debug: 4.3.7 334 | globals: 11.12.0 335 | transitivePeerDependencies: 336 | - supports-color 337 | dev: true 338 | 339 | /@babel/types@7.25.8: 340 | resolution: {integrity: sha512-JWtuCu8VQsMladxVz/P4HzHUGCAwpuqacmowgXFs5XjxIgKuNjnLokQzuVjlTvIzODaDmpjT3oxcC48vyk9EWg==} 341 | engines: {node: '>=6.9.0'} 342 | dependencies: 343 | '@babel/helper-string-parser': 7.25.7 344 | '@babel/helper-validator-identifier': 7.25.7 345 | to-fast-properties: 2.0.0 346 | dev: true 347 | 348 | /@bcoe/v8-coverage@0.2.3: 349 | resolution: {integrity: sha512-0hYQ8SB4Db5zvZB4axdMHGwEaQjkZzFjQiN9LVYvIFB2nSUHW9tYpxWriPrWDASIxiaXax83REcLxuSdnGPZtw==} 350 | dev: true 351 | 352 | /@glennsl/rescript-jest@0.11.0: 353 | resolution: {integrity: sha512-eQLKqin80v7wviUu0ZX3zZreKkllYet3YqC1QC6Sap8tLltfBiR7U3nAA8LAkM6K+uFVsTAtOjZt6dy2TrujEQ==} 354 | dependencies: 355 | jest: 27.5.1 356 | transitivePeerDependencies: 357 | - bufferutil 358 | - canvas 359 | - node-notifier 360 | - supports-color 361 | - ts-node 362 | - utf-8-validate 363 | dev: true 364 | 365 | /@istanbuljs/load-nyc-config@1.1.0: 366 | resolution: {integrity: sha512-VjeHSlIzpv/NyD3N0YuHfXOPDIixcA1q2ZV98wsMqcYlPmv2n3Yb2lYP9XMElnaFVXg5A7YLTeLu6V84uQDjmQ==} 367 | engines: {node: '>=8'} 368 | dependencies: 369 | camelcase: 5.3.1 370 | find-up: 4.1.0 371 | get-package-type: 0.1.0 372 | js-yaml: 3.14.1 373 | resolve-from: 5.0.0 374 | dev: true 375 | 376 | /@istanbuljs/schema@0.1.3: 377 | resolution: {integrity: sha512-ZXRY4jNvVgSVQ8DL3LTcakaAtXwTVUxE81hslsyD2AtoXW/wVob10HkOJ1X/pAlcI7D+2YoZKg5do8G/w6RYgA==} 378 | engines: {node: '>=8'} 379 | dev: true 380 | 381 | /@jest/console@27.5.1: 382 | resolution: {integrity: sha512-kZ/tNpS3NXn0mlXXXPNuDZnb4c0oZ20r4K5eemM2k30ZC3G0T02nXUvyhf5YdbXWHPEJLc9qGLxEZ216MdL+Zg==} 383 | engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} 384 | dependencies: 385 | '@jest/types': 27.5.1 386 | '@types/node': 22.7.7 387 | chalk: 4.1.2 388 | jest-message-util: 27.5.1 389 | jest-util: 27.5.1 390 | slash: 3.0.0 391 | dev: true 392 | 393 | /@jest/core@27.5.1: 394 | resolution: {integrity: sha512-AK6/UTrvQD0Cd24NSqmIA6rKsu0tKIxfiCducZvqxYdmMisOYAsdItspT+fQDQYARPf8XgjAFZi0ogW2agH5nQ==} 395 | engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} 396 | peerDependencies: 397 | node-notifier: ^8.0.1 || ^9.0.0 || ^10.0.0 398 | peerDependenciesMeta: 399 | node-notifier: 400 | optional: true 401 | dependencies: 402 | '@jest/console': 27.5.1 403 | '@jest/reporters': 27.5.1 404 | '@jest/test-result': 27.5.1 405 | '@jest/transform': 27.5.1 406 | '@jest/types': 27.5.1 407 | '@types/node': 22.7.7 408 | ansi-escapes: 4.3.2 409 | chalk: 4.1.2 410 | emittery: 0.8.1 411 | exit: 0.1.2 412 | graceful-fs: 4.2.11 413 | jest-changed-files: 27.5.1 414 | jest-config: 27.5.1 415 | jest-haste-map: 27.5.1 416 | jest-message-util: 27.5.1 417 | jest-regex-util: 27.5.1 418 | jest-resolve: 27.5.1 419 | jest-resolve-dependencies: 27.5.1 420 | jest-runner: 27.5.1 421 | jest-runtime: 27.5.1 422 | jest-snapshot: 27.5.1 423 | jest-util: 27.5.1 424 | jest-validate: 27.5.1 425 | jest-watcher: 27.5.1 426 | micromatch: 4.0.8 427 | rimraf: 3.0.2 428 | slash: 3.0.0 429 | strip-ansi: 6.0.1 430 | transitivePeerDependencies: 431 | - bufferutil 432 | - canvas 433 | - supports-color 434 | - ts-node 435 | - utf-8-validate 436 | dev: true 437 | 438 | /@jest/environment@27.5.1: 439 | resolution: {integrity: sha512-/WQjhPJe3/ghaol/4Bq480JKXV/Rfw8nQdN7f41fM8VDHLcxKXou6QyXAh3EFr9/bVG3x74z1NWDkP87EiY8gA==} 440 | engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} 441 | dependencies: 442 | '@jest/fake-timers': 27.5.1 443 | '@jest/types': 27.5.1 444 | '@types/node': 22.7.7 445 | jest-mock: 27.5.1 446 | dev: true 447 | 448 | /@jest/fake-timers@27.5.1: 449 | resolution: {integrity: sha512-/aPowoolwa07k7/oM3aASneNeBGCmGQsc3ugN4u6s4C/+s5M64MFo/+djTdiwcbQlRfFElGuDXWzaWj6QgKObQ==} 450 | engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} 451 | dependencies: 452 | '@jest/types': 27.5.1 453 | '@sinonjs/fake-timers': 8.1.0 454 | '@types/node': 22.7.7 455 | jest-message-util: 27.5.1 456 | jest-mock: 27.5.1 457 | jest-util: 27.5.1 458 | dev: true 459 | 460 | /@jest/globals@27.5.1: 461 | resolution: {integrity: sha512-ZEJNB41OBQQgGzgyInAv0UUfDDj3upmHydjieSxFvTRuZElrx7tXg/uVQ5hYVEwiXs3+aMsAeEc9X7xiSKCm4Q==} 462 | engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} 463 | dependencies: 464 | '@jest/environment': 27.5.1 465 | '@jest/types': 27.5.1 466 | expect: 27.5.1 467 | dev: true 468 | 469 | /@jest/reporters@27.5.1: 470 | resolution: {integrity: sha512-cPXh9hWIlVJMQkVk84aIvXuBB4uQQmFqZiacloFuGiP3ah1sbCxCosidXFDfqG8+6fO1oR2dTJTlsOy4VFmUfw==} 471 | engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} 472 | peerDependencies: 473 | node-notifier: ^8.0.1 || ^9.0.0 || ^10.0.0 474 | peerDependenciesMeta: 475 | node-notifier: 476 | optional: true 477 | dependencies: 478 | '@bcoe/v8-coverage': 0.2.3 479 | '@jest/console': 27.5.1 480 | '@jest/test-result': 27.5.1 481 | '@jest/transform': 27.5.1 482 | '@jest/types': 27.5.1 483 | '@types/node': 22.7.7 484 | chalk: 4.1.2 485 | collect-v8-coverage: 1.0.2 486 | exit: 0.1.2 487 | glob: 7.2.3 488 | graceful-fs: 4.2.11 489 | istanbul-lib-coverage: 3.2.2 490 | istanbul-lib-instrument: 5.2.1 491 | istanbul-lib-report: 3.0.1 492 | istanbul-lib-source-maps: 4.0.1 493 | istanbul-reports: 3.1.7 494 | jest-haste-map: 27.5.1 495 | jest-resolve: 27.5.1 496 | jest-util: 27.5.1 497 | jest-worker: 27.5.1 498 | slash: 3.0.0 499 | source-map: 0.6.1 500 | string-length: 4.0.2 501 | terminal-link: 2.1.1 502 | v8-to-istanbul: 8.1.1 503 | transitivePeerDependencies: 504 | - supports-color 505 | dev: true 506 | 507 | /@jest/source-map@27.5.1: 508 | resolution: {integrity: sha512-y9NIHUYF3PJRlHk98NdC/N1gl88BL08aQQgu4k4ZopQkCw9t9cV8mtl3TV8b/YCB8XaVTFrmUTAJvjsntDireg==} 509 | engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} 510 | dependencies: 511 | callsites: 3.1.0 512 | graceful-fs: 4.2.11 513 | source-map: 0.6.1 514 | dev: true 515 | 516 | /@jest/test-result@27.5.1: 517 | resolution: {integrity: sha512-EW35l2RYFUcUQxFJz5Cv5MTOxlJIQs4I7gxzi2zVU7PJhOwfYq1MdC5nhSmYjX1gmMmLPvB3sIaC+BkcHRBfag==} 518 | engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} 519 | dependencies: 520 | '@jest/console': 27.5.1 521 | '@jest/types': 27.5.1 522 | '@types/istanbul-lib-coverage': 2.0.6 523 | collect-v8-coverage: 1.0.2 524 | dev: true 525 | 526 | /@jest/test-sequencer@27.5.1: 527 | resolution: {integrity: sha512-LCheJF7WB2+9JuCS7VB/EmGIdQuhtqjRNI9A43idHv3E4KltCTsPsLxvdaubFHSYwY/fNjMWjl6vNRhDiN7vpQ==} 528 | engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} 529 | dependencies: 530 | '@jest/test-result': 27.5.1 531 | graceful-fs: 4.2.11 532 | jest-haste-map: 27.5.1 533 | jest-runtime: 27.5.1 534 | transitivePeerDependencies: 535 | - supports-color 536 | dev: true 537 | 538 | /@jest/transform@27.5.1: 539 | resolution: {integrity: sha512-ipON6WtYgl/1329g5AIJVbUuEh0wZVbdpGwC99Jw4LwuoBNS95MVphU6zOeD9pDkon+LLbFL7lOQRapbB8SCHw==} 540 | engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} 541 | dependencies: 542 | '@babel/core': 7.25.8 543 | '@jest/types': 27.5.1 544 | babel-plugin-istanbul: 6.1.1 545 | chalk: 4.1.2 546 | convert-source-map: 1.9.0 547 | fast-json-stable-stringify: 2.1.0 548 | graceful-fs: 4.2.11 549 | jest-haste-map: 27.5.1 550 | jest-regex-util: 27.5.1 551 | jest-util: 27.5.1 552 | micromatch: 4.0.8 553 | pirates: 4.0.6 554 | slash: 3.0.0 555 | source-map: 0.6.1 556 | write-file-atomic: 3.0.3 557 | transitivePeerDependencies: 558 | - supports-color 559 | dev: true 560 | 561 | /@jest/types@27.5.1: 562 | resolution: {integrity: sha512-Cx46iJ9QpwQTjIdq5VJu2QTMMs3QlEjI0x1QbBP5W1+nMzyc2XmimiRR/CbX9TO0cPTeUlxWMOu8mslYsJ8DEw==} 563 | engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} 564 | dependencies: 565 | '@types/istanbul-lib-coverage': 2.0.6 566 | '@types/istanbul-reports': 3.0.4 567 | '@types/node': 22.7.7 568 | '@types/yargs': 16.0.9 569 | chalk: 4.1.2 570 | dev: true 571 | 572 | /@jridgewell/gen-mapping@0.3.5: 573 | resolution: {integrity: sha512-IzL8ZoEDIBRWEzlCcRhOaCupYyN5gdIK+Q6fbFdPDg6HqX6jpkItn7DFIpW9LQzXG6Df9sA7+OKnq0qlz/GaQg==} 574 | engines: {node: '>=6.0.0'} 575 | dependencies: 576 | '@jridgewell/set-array': 1.2.1 577 | '@jridgewell/sourcemap-codec': 1.5.0 578 | '@jridgewell/trace-mapping': 0.3.25 579 | dev: true 580 | 581 | /@jridgewell/resolve-uri@3.1.2: 582 | resolution: {integrity: sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==} 583 | engines: {node: '>=6.0.0'} 584 | dev: true 585 | 586 | /@jridgewell/set-array@1.2.1: 587 | resolution: {integrity: sha512-R8gLRTZeyp03ymzP/6Lil/28tGeGEzhx1q2k703KGWRAI1VdvPIXdG70VJc2pAMw3NA6JKL5hhFu1sJX0Mnn/A==} 588 | engines: {node: '>=6.0.0'} 589 | dev: true 590 | 591 | /@jridgewell/sourcemap-codec@1.5.0: 592 | resolution: {integrity: sha512-gv3ZRaISU3fjPAgNsriBRqGWQL6quFx04YMPW/zD8XMLsU32mhCCbfbO6KZFLjvYpCZ8zyDEgqsgf+PwPaM7GQ==} 593 | dev: true 594 | 595 | /@jridgewell/trace-mapping@0.3.25: 596 | resolution: {integrity: sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ==} 597 | dependencies: 598 | '@jridgewell/resolve-uri': 3.1.2 599 | '@jridgewell/sourcemap-codec': 1.5.0 600 | dev: true 601 | 602 | /@sinonjs/commons@1.8.6: 603 | resolution: {integrity: sha512-Ky+XkAkqPZSm3NLBeUng77EBQl3cmeJhITaGHdYH8kjVB+aun3S4XBRti2zt17mtt0mIUDiNxYeoJm6drVvBJQ==} 604 | dependencies: 605 | type-detect: 4.0.8 606 | dev: true 607 | 608 | /@sinonjs/fake-timers@8.1.0: 609 | resolution: {integrity: sha512-OAPJUAtgeINhh/TAlUID4QTs53Njm7xzddaVlEs/SXwgtiD1tW22zAB/W1wdqfrpmikgaWQ9Fw6Ws+hsiRm5Vg==} 610 | dependencies: 611 | '@sinonjs/commons': 1.8.6 612 | dev: true 613 | 614 | /@tootallnate/once@1.1.2: 615 | resolution: {integrity: sha512-RbzJvlNzmRq5c3O09UipeuXno4tA1FE6ikOjxZK0tuxVv3412l64l5t1W5pj4+rJq9vpkm/kwiR07aZXnsKPxw==} 616 | engines: {node: '>= 6'} 617 | dev: true 618 | 619 | /@types/babel__core@7.20.5: 620 | resolution: {integrity: sha512-qoQprZvz5wQFJwMDqeseRXWv3rqMvhgpbXFfVyWhbx9X47POIA6i/+dXefEmZKoAgOaTdaIgNSMqMIU61yRyzA==} 621 | dependencies: 622 | '@babel/parser': 7.25.8 623 | '@babel/types': 7.25.8 624 | '@types/babel__generator': 7.6.8 625 | '@types/babel__template': 7.4.4 626 | '@types/babel__traverse': 7.20.6 627 | dev: true 628 | 629 | /@types/babel__generator@7.6.8: 630 | resolution: {integrity: sha512-ASsj+tpEDsEiFr1arWrlN6V3mdfjRMZt6LtK/Vp/kreFLnr5QH5+DhvD5nINYZXzwJvXeGq+05iUXcAzVrqWtw==} 631 | dependencies: 632 | '@babel/types': 7.25.8 633 | dev: true 634 | 635 | /@types/babel__template@7.4.4: 636 | resolution: {integrity: sha512-h/NUaSyG5EyxBIp8YRxo4RMe2/qQgvyowRwVMzhYhBCONbW8PUsg4lkFMrhgZhUe5z3L3MiLDuvyJ/CaPa2A8A==} 637 | dependencies: 638 | '@babel/parser': 7.25.8 639 | '@babel/types': 7.25.8 640 | dev: true 641 | 642 | /@types/babel__traverse@7.20.6: 643 | resolution: {integrity: sha512-r1bzfrm0tomOI8g1SzvCaQHo6Lcv6zu0EA+W2kHrt8dyrHQxGzBBL4kdkzIS+jBMV+EYcMAEAqXqYaLJq5rOZg==} 644 | dependencies: 645 | '@babel/types': 7.25.8 646 | dev: true 647 | 648 | /@types/graceful-fs@4.1.9: 649 | resolution: {integrity: sha512-olP3sd1qOEe5dXTSaFvQG+02VdRXcdytWLAZsAq1PecU8uqQAhkrnbli7DagjtXKW/Bl7YJbUsa8MPcuc8LHEQ==} 650 | dependencies: 651 | '@types/node': 22.7.7 652 | dev: true 653 | 654 | /@types/istanbul-lib-coverage@2.0.6: 655 | resolution: {integrity: sha512-2QF/t/auWm0lsy8XtKVPG19v3sSOQlJe/YHZgfjb/KBBHOGSV+J2q/S671rcq9uTBrLAXmZpqJiaQbMT+zNU1w==} 656 | dev: true 657 | 658 | /@types/istanbul-lib-report@3.0.3: 659 | resolution: {integrity: sha512-NQn7AHQnk/RSLOxrBbGyJM/aVQ+pjj5HCgasFxc0K/KhoATfQ/47AyUl15I2yBUpihjmas+a+VJBOqecrFH+uA==} 660 | dependencies: 661 | '@types/istanbul-lib-coverage': 2.0.6 662 | dev: true 663 | 664 | /@types/istanbul-reports@3.0.4: 665 | resolution: {integrity: sha512-pk2B1NWalF9toCRu6gjBzR69syFjP4Od8WRAX+0mmf9lAjCRicLOWc+ZrxZHx/0XRjotgkF9t6iaMJ+aXcOdZQ==} 666 | dependencies: 667 | '@types/istanbul-lib-report': 3.0.3 668 | dev: true 669 | 670 | /@types/node@22.7.7: 671 | resolution: {integrity: sha512-SRxCrrg9CL/y54aiMCG3edPKdprgMVGDXjA3gB8UmmBW5TcXzRUYAh8EWzTnSJFAd1rgImPELza+A3bJ+qxz8Q==} 672 | dependencies: 673 | undici-types: 6.19.8 674 | dev: true 675 | 676 | /@types/prettier@2.7.3: 677 | resolution: {integrity: sha512-+68kP9yzs4LMp7VNh8gdzMSPZFL44MLGqiHWvttYJe+6qnuVr4Ek9wSBQoveqY/r+LwjCcU29kNVkidwim+kYA==} 678 | dev: true 679 | 680 | /@types/stack-utils@2.0.3: 681 | resolution: {integrity: sha512-9aEbYZ3TbYMznPdcdr3SmIrLXwC/AKZXQeCf9Pgao5CKb8CyHuEX5jzWPTkvregvhRJHcpRO6BFoGW9ycaOkYw==} 682 | dev: true 683 | 684 | /@types/yargs-parser@21.0.3: 685 | resolution: {integrity: sha512-I4q9QU9MQv4oEOz4tAHJtNz1cwuLxn2F3xcc2iV5WdqLPpUnj30aUuxt1mAxYTG+oe8CZMV/+6rU4S4gRDzqtQ==} 686 | dev: true 687 | 688 | /@types/yargs@16.0.9: 689 | resolution: {integrity: sha512-tHhzvkFXZQeTECenFoRljLBYPZJ7jAVxqqtEI0qTLOmuultnFp4I9yKE17vTuhf7BkhCu7I4XuemPgikDVuYqA==} 690 | dependencies: 691 | '@types/yargs-parser': 21.0.3 692 | dev: true 693 | 694 | /abab@2.0.6: 695 | resolution: {integrity: sha512-j2afSsaIENvHZN2B8GOpF566vZ5WVk5opAiMTvWgaQT8DkbOqsTfvNAvHoRGU2zzP8cPoqys+xHTRDWW8L+/BA==} 696 | deprecated: Use your platform's native atob() and btoa() methods instead 697 | dev: true 698 | 699 | /acorn-globals@6.0.0: 700 | resolution: {integrity: sha512-ZQl7LOWaF5ePqqcX4hLuv/bLXYQNfNWw2c0/yX/TsPRKamzHcTGQnlCjHT3TsmkOUVEPS3crCxiPfdzE/Trlhg==} 701 | dependencies: 702 | acorn: 7.4.1 703 | acorn-walk: 7.2.0 704 | dev: true 705 | 706 | /acorn-walk@7.2.0: 707 | resolution: {integrity: sha512-OPdCF6GsMIP+Az+aWfAAOEt2/+iVDKE7oy6lJ098aoe59oAmK76qV6Gw60SbZ8jHuG2wH058GF4pLFbYamYrVA==} 708 | engines: {node: '>=0.4.0'} 709 | dev: true 710 | 711 | /acorn@7.4.1: 712 | resolution: {integrity: sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A==} 713 | engines: {node: '>=0.4.0'} 714 | hasBin: true 715 | dev: true 716 | 717 | /acorn@8.13.0: 718 | resolution: {integrity: sha512-8zSiw54Oxrdym50NlZ9sUusyO1Z1ZchgRLWRaK6c86XJFClyCgFKetdowBg5bKxyp/u+CDBJG4Mpp0m3HLZl9w==} 719 | engines: {node: '>=0.4.0'} 720 | hasBin: true 721 | dev: true 722 | 723 | /agent-base@6.0.2: 724 | resolution: {integrity: sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==} 725 | engines: {node: '>= 6.0.0'} 726 | dependencies: 727 | debug: 4.3.7 728 | transitivePeerDependencies: 729 | - supports-color 730 | dev: true 731 | 732 | /ansi-escapes@4.3.2: 733 | resolution: {integrity: sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ==} 734 | engines: {node: '>=8'} 735 | dependencies: 736 | type-fest: 0.21.3 737 | dev: true 738 | 739 | /ansi-regex@5.0.1: 740 | resolution: {integrity: sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==} 741 | engines: {node: '>=8'} 742 | dev: true 743 | 744 | /ansi-styles@3.2.1: 745 | resolution: {integrity: sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==} 746 | engines: {node: '>=4'} 747 | dependencies: 748 | color-convert: 1.9.3 749 | dev: true 750 | 751 | /ansi-styles@4.3.0: 752 | resolution: {integrity: sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==} 753 | engines: {node: '>=8'} 754 | dependencies: 755 | color-convert: 2.0.1 756 | dev: true 757 | 758 | /ansi-styles@5.2.0: 759 | resolution: {integrity: sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==} 760 | engines: {node: '>=10'} 761 | dev: true 762 | 763 | /anymatch@3.1.3: 764 | resolution: {integrity: sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==} 765 | engines: {node: '>= 8'} 766 | dependencies: 767 | normalize-path: 3.0.0 768 | picomatch: 2.3.1 769 | dev: true 770 | 771 | /argparse@1.0.10: 772 | resolution: {integrity: sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==} 773 | dependencies: 774 | sprintf-js: 1.0.3 775 | dev: true 776 | 777 | /asynckit@0.4.0: 778 | resolution: {integrity: sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==} 779 | dev: true 780 | 781 | /babel-jest@27.5.1(@babel/core@7.25.8): 782 | resolution: {integrity: sha512-cdQ5dXjGRd0IBRATiQ4mZGlGlRE8kJpjPOixdNRdT+m3UcNqmYWN6rK6nvtXYfY3D76cb8s/O1Ss8ea24PIwcg==} 783 | engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} 784 | peerDependencies: 785 | '@babel/core': ^7.8.0 786 | dependencies: 787 | '@babel/core': 7.25.8 788 | '@jest/transform': 27.5.1 789 | '@jest/types': 27.5.1 790 | '@types/babel__core': 7.20.5 791 | babel-plugin-istanbul: 6.1.1 792 | babel-preset-jest: 27.5.1(@babel/core@7.25.8) 793 | chalk: 4.1.2 794 | graceful-fs: 4.2.11 795 | slash: 3.0.0 796 | transitivePeerDependencies: 797 | - supports-color 798 | dev: true 799 | 800 | /babel-plugin-istanbul@6.1.1: 801 | resolution: {integrity: sha512-Y1IQok9821cC9onCx5otgFfRm7Lm+I+wwxOx738M/WLPZ9Q42m4IG5W0FNX8WLL2gYMZo3JkuXIH2DOpWM+qwA==} 802 | engines: {node: '>=8'} 803 | dependencies: 804 | '@babel/helper-plugin-utils': 7.25.7 805 | '@istanbuljs/load-nyc-config': 1.1.0 806 | '@istanbuljs/schema': 0.1.3 807 | istanbul-lib-instrument: 5.2.1 808 | test-exclude: 6.0.0 809 | transitivePeerDependencies: 810 | - supports-color 811 | dev: true 812 | 813 | /babel-plugin-jest-hoist@27.5.1: 814 | resolution: {integrity: sha512-50wCwD5EMNW4aRpOwtqzyZHIewTYNxLA4nhB+09d8BIssfNfzBRhkBIHiaPv1Si226TQSvp8gxAJm2iY2qs2hQ==} 815 | engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} 816 | dependencies: 817 | '@babel/template': 7.25.7 818 | '@babel/types': 7.25.8 819 | '@types/babel__core': 7.20.5 820 | '@types/babel__traverse': 7.20.6 821 | dev: true 822 | 823 | /babel-preset-current-node-syntax@1.1.0(@babel/core@7.25.8): 824 | resolution: {integrity: sha512-ldYss8SbBlWva1bs28q78Ju5Zq1F+8BrqBZZ0VFhLBvhh6lCpC2o3gDJi/5DRLs9FgYZCnmPYIVFU4lRXCkyUw==} 825 | peerDependencies: 826 | '@babel/core': ^7.0.0 827 | dependencies: 828 | '@babel/core': 7.25.8 829 | '@babel/plugin-syntax-async-generators': 7.8.4(@babel/core@7.25.8) 830 | '@babel/plugin-syntax-bigint': 7.8.3(@babel/core@7.25.8) 831 | '@babel/plugin-syntax-class-properties': 7.12.13(@babel/core@7.25.8) 832 | '@babel/plugin-syntax-class-static-block': 7.14.5(@babel/core@7.25.8) 833 | '@babel/plugin-syntax-import-attributes': 7.25.7(@babel/core@7.25.8) 834 | '@babel/plugin-syntax-import-meta': 7.10.4(@babel/core@7.25.8) 835 | '@babel/plugin-syntax-json-strings': 7.8.3(@babel/core@7.25.8) 836 | '@babel/plugin-syntax-logical-assignment-operators': 7.10.4(@babel/core@7.25.8) 837 | '@babel/plugin-syntax-nullish-coalescing-operator': 7.8.3(@babel/core@7.25.8) 838 | '@babel/plugin-syntax-numeric-separator': 7.10.4(@babel/core@7.25.8) 839 | '@babel/plugin-syntax-object-rest-spread': 7.8.3(@babel/core@7.25.8) 840 | '@babel/plugin-syntax-optional-catch-binding': 7.8.3(@babel/core@7.25.8) 841 | '@babel/plugin-syntax-optional-chaining': 7.8.3(@babel/core@7.25.8) 842 | '@babel/plugin-syntax-private-property-in-object': 7.14.5(@babel/core@7.25.8) 843 | '@babel/plugin-syntax-top-level-await': 7.14.5(@babel/core@7.25.8) 844 | dev: true 845 | 846 | /babel-preset-jest@27.5.1(@babel/core@7.25.8): 847 | resolution: {integrity: sha512-Nptf2FzlPCWYuJg41HBqXVT8ym6bXOevuCTbhxlUpjwtysGaIWFvDEjp4y+G7fl13FgOdjs7P/DmErqH7da0Ag==} 848 | engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} 849 | peerDependencies: 850 | '@babel/core': ^7.0.0 851 | dependencies: 852 | '@babel/core': 7.25.8 853 | babel-plugin-jest-hoist: 27.5.1 854 | babel-preset-current-node-syntax: 1.1.0(@babel/core@7.25.8) 855 | dev: true 856 | 857 | /balanced-match@1.0.2: 858 | resolution: {integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==} 859 | dev: true 860 | 861 | /brace-expansion@1.1.11: 862 | resolution: {integrity: sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==} 863 | dependencies: 864 | balanced-match: 1.0.2 865 | concat-map: 0.0.1 866 | dev: true 867 | 868 | /braces@3.0.3: 869 | resolution: {integrity: sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==} 870 | engines: {node: '>=8'} 871 | dependencies: 872 | fill-range: 7.1.1 873 | dev: true 874 | 875 | /browser-process-hrtime@1.0.0: 876 | resolution: {integrity: sha512-9o5UecI3GhkpM6DrXr69PblIuWxPKk9Y0jHBRhdocZ2y7YECBFCsHm79Pr3OyR2AvjhDkabFJaDJMYRazHgsow==} 877 | dev: true 878 | 879 | /browserslist@4.24.0: 880 | resolution: {integrity: sha512-Rmb62sR1Zpjql25eSanFGEhAxcFwfA1K0GuQcLoaJBAcENegrQut3hYdhXFF1obQfiDyqIW/cLM5HSJ/9k884A==} 881 | engines: {node: ^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7} 882 | hasBin: true 883 | dependencies: 884 | caniuse-lite: 1.0.30001669 885 | electron-to-chromium: 1.5.41 886 | node-releases: 2.0.18 887 | update-browserslist-db: 1.1.1(browserslist@4.24.0) 888 | dev: true 889 | 890 | /bser@2.1.1: 891 | resolution: {integrity: sha512-gQxTNE/GAfIIrmHLUE3oJyp5FO6HRBfhjnw4/wMmA63ZGDJnWBmgY/lyQBpnDUkGmAhbSe39tx2d/iTOAfglwQ==} 892 | dependencies: 893 | node-int64: 0.4.0 894 | dev: true 895 | 896 | /buffer-from@1.1.2: 897 | resolution: {integrity: sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==} 898 | dev: true 899 | 900 | /callsites@3.1.0: 901 | resolution: {integrity: sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==} 902 | engines: {node: '>=6'} 903 | dev: true 904 | 905 | /camelcase@5.3.1: 906 | resolution: {integrity: sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==} 907 | engines: {node: '>=6'} 908 | dev: true 909 | 910 | /camelcase@6.3.0: 911 | resolution: {integrity: sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==} 912 | engines: {node: '>=10'} 913 | dev: true 914 | 915 | /caniuse-lite@1.0.30001669: 916 | resolution: {integrity: sha512-DlWzFDJqstqtIVx1zeSpIMLjunf5SmwOw0N2Ck/QSQdS8PLS4+9HrLaYei4w8BIAL7IB/UEDu889d8vhCTPA0w==} 917 | dev: true 918 | 919 | /chalk@2.4.2: 920 | resolution: {integrity: sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==} 921 | engines: {node: '>=4'} 922 | dependencies: 923 | ansi-styles: 3.2.1 924 | escape-string-regexp: 1.0.5 925 | supports-color: 5.5.0 926 | dev: true 927 | 928 | /chalk@4.1.2: 929 | resolution: {integrity: sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==} 930 | engines: {node: '>=10'} 931 | dependencies: 932 | ansi-styles: 4.3.0 933 | supports-color: 7.2.0 934 | dev: true 935 | 936 | /char-regex@1.0.2: 937 | resolution: {integrity: sha512-kWWXztvZ5SBQV+eRgKFeh8q5sLuZY2+8WUIzlxWVTg+oGwY14qylx1KbKzHd8P6ZYkAg0xyIDU9JMHhyJMZ1jw==} 938 | engines: {node: '>=10'} 939 | dev: true 940 | 941 | /ci-info@3.9.0: 942 | resolution: {integrity: sha512-NIxF55hv4nSqQswkAeiOi1r83xy8JldOFDTWiug55KBu9Jnblncd2U6ViHmYgHf01TPZS77NJBhBMKdWj9HQMQ==} 943 | engines: {node: '>=8'} 944 | dev: true 945 | 946 | /cjs-module-lexer@1.4.1: 947 | resolution: {integrity: sha512-cuSVIHi9/9E/+821Qjdvngor+xpnlwnuwIyZOaLmHBVdXL+gP+I6QQB9VkO7RI77YIcTV+S1W9AreJ5eN63JBA==} 948 | dev: true 949 | 950 | /cliui@7.0.4: 951 | resolution: {integrity: sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==} 952 | dependencies: 953 | string-width: 4.2.3 954 | strip-ansi: 6.0.1 955 | wrap-ansi: 7.0.0 956 | dev: true 957 | 958 | /co@4.6.0: 959 | resolution: {integrity: sha512-QVb0dM5HvG+uaxitm8wONl7jltx8dqhfU33DcqtOZcLSVIKSDDLDi7+0LbAKiyI8hD9u42m2YxXSkMGWThaecQ==} 960 | engines: {iojs: '>= 1.0.0', node: '>= 0.12.0'} 961 | dev: true 962 | 963 | /collect-v8-coverage@1.0.2: 964 | resolution: {integrity: sha512-lHl4d5/ONEbLlJvaJNtsF/Lz+WvB07u2ycqTYbdrq7UypDXailES4valYb2eWiJFxZlVmpGekfqoxQhzyFdT4Q==} 965 | dev: true 966 | 967 | /color-convert@1.9.3: 968 | resolution: {integrity: sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==} 969 | dependencies: 970 | color-name: 1.1.3 971 | dev: true 972 | 973 | /color-convert@2.0.1: 974 | resolution: {integrity: sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==} 975 | engines: {node: '>=7.0.0'} 976 | dependencies: 977 | color-name: 1.1.4 978 | dev: true 979 | 980 | /color-name@1.1.3: 981 | resolution: {integrity: sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==} 982 | dev: true 983 | 984 | /color-name@1.1.4: 985 | resolution: {integrity: sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==} 986 | dev: true 987 | 988 | /combined-stream@1.0.8: 989 | resolution: {integrity: sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==} 990 | engines: {node: '>= 0.8'} 991 | dependencies: 992 | delayed-stream: 1.0.0 993 | dev: true 994 | 995 | /concat-map@0.0.1: 996 | resolution: {integrity: sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==} 997 | dev: true 998 | 999 | /convert-source-map@1.9.0: 1000 | resolution: {integrity: sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A==} 1001 | dev: true 1002 | 1003 | /convert-source-map@2.0.0: 1004 | resolution: {integrity: sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==} 1005 | dev: true 1006 | 1007 | /cross-spawn@7.0.3: 1008 | resolution: {integrity: sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==} 1009 | engines: {node: '>= 8'} 1010 | dependencies: 1011 | path-key: 3.1.1 1012 | shebang-command: 2.0.0 1013 | which: 2.0.2 1014 | dev: true 1015 | 1016 | /cssom@0.3.8: 1017 | resolution: {integrity: sha512-b0tGHbfegbhPJpxpiBPU2sCkigAqtM9O121le6bbOlgyV+NyGyCmVfJ6QW9eRjz8CpNfWEOYBIMIGRYkLwsIYg==} 1018 | dev: true 1019 | 1020 | /cssom@0.4.4: 1021 | resolution: {integrity: sha512-p3pvU7r1MyyqbTk+WbNJIgJjG2VmTIaB10rI93LzVPrmDJKkzKYMtxxyAvQXR/NS6otuzveI7+7BBq3SjBS2mw==} 1022 | dev: true 1023 | 1024 | /cssstyle@2.3.0: 1025 | resolution: {integrity: sha512-AZL67abkUzIuvcHqk7c09cezpGNcxUxU4Ioi/05xHk4DQeTkWmGYftIE6ctU6AEt+Gn4n1lDStOtj7FKycP71A==} 1026 | engines: {node: '>=8'} 1027 | dependencies: 1028 | cssom: 0.3.8 1029 | dev: true 1030 | 1031 | /data-urls@2.0.0: 1032 | resolution: {integrity: sha512-X5eWTSXO/BJmpdIKCRuKUgSCgAN0OwliVK3yPKbwIWU1Tdw5BRajxlzMidvh+gwko9AfQ9zIj52pzF91Q3YAvQ==} 1033 | engines: {node: '>=10'} 1034 | dependencies: 1035 | abab: 2.0.6 1036 | whatwg-mimetype: 2.3.0 1037 | whatwg-url: 8.7.0 1038 | dev: true 1039 | 1040 | /debug@4.3.7: 1041 | resolution: {integrity: sha512-Er2nc/H7RrMXZBFCEim6TCmMk02Z8vLC2Rbi1KEBggpo0fS6l0S1nnapwmIi3yW/+GOJap1Krg4w0Hg80oCqgQ==} 1042 | engines: {node: '>=6.0'} 1043 | peerDependencies: 1044 | supports-color: '*' 1045 | peerDependenciesMeta: 1046 | supports-color: 1047 | optional: true 1048 | dependencies: 1049 | ms: 2.1.3 1050 | dev: true 1051 | 1052 | /decimal.js@10.4.3: 1053 | resolution: {integrity: sha512-VBBaLc1MgL5XpzgIP7ny5Z6Nx3UrRkIViUkPUdtl9aya5amy3De1gsUUSB1g3+3sExYNjCAsAznmukyxCb1GRA==} 1054 | dev: true 1055 | 1056 | /dedent@0.7.0: 1057 | resolution: {integrity: sha512-Q6fKUPqnAHAyhiUgFU7BUzLiv0kd8saH9al7tnu5Q/okj6dnupxyTgFIBjVzJATdfIAm9NAsvXNzjaKa+bxVyA==} 1058 | dev: true 1059 | 1060 | /deepmerge@4.3.1: 1061 | resolution: {integrity: sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A==} 1062 | engines: {node: '>=0.10.0'} 1063 | dev: true 1064 | 1065 | /delayed-stream@1.0.0: 1066 | resolution: {integrity: sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==} 1067 | engines: {node: '>=0.4.0'} 1068 | dev: true 1069 | 1070 | /detect-newline@3.1.0: 1071 | resolution: {integrity: sha512-TLz+x/vEXm/Y7P7wn1EJFNLxYpUD4TgMosxY6fAVJUnJMbupHBOncxyWUG9OpTaH9EBD7uFI5LfEgmMOc54DsA==} 1072 | engines: {node: '>=8'} 1073 | dev: true 1074 | 1075 | /diff-sequences@27.5.1: 1076 | resolution: {integrity: sha512-k1gCAXAsNgLwEL+Y8Wvl+M6oEFj5bgazfZULpS5CneoPPXRaCCW7dm+q21Ky2VEE5X+VeRDBVg1Pcvvsr4TtNQ==} 1077 | engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} 1078 | dev: true 1079 | 1080 | /domexception@2.0.1: 1081 | resolution: {integrity: sha512-yxJ2mFy/sibVQlu5qHjOkf9J3K6zgmCxgJ94u2EdvDOV09H+32LtRswEcUsmUWN72pVLOEnTSRaIVVzVQgS0dg==} 1082 | engines: {node: '>=8'} 1083 | deprecated: Use your platform's native DOMException instead 1084 | dependencies: 1085 | webidl-conversions: 5.0.0 1086 | dev: true 1087 | 1088 | /electron-to-chromium@1.5.41: 1089 | resolution: {integrity: sha512-dfdv/2xNjX0P8Vzme4cfzHqnPm5xsZXwsolTYr0eyW18IUmNyG08vL+fttvinTfhKfIKdRoqkDIC9e9iWQCNYQ==} 1090 | dev: true 1091 | 1092 | /emittery@0.8.1: 1093 | resolution: {integrity: sha512-uDfvUjVrfGJJhymx/kz6prltenw1u7WrCg1oa94zYY8xxVpLLUu045LAT0dhDZdXG58/EpPL/5kA180fQ/qudg==} 1094 | engines: {node: '>=10'} 1095 | dev: true 1096 | 1097 | /emoji-regex@8.0.0: 1098 | resolution: {integrity: sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==} 1099 | dev: true 1100 | 1101 | /error-ex@1.3.2: 1102 | resolution: {integrity: sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==} 1103 | dependencies: 1104 | is-arrayish: 0.2.1 1105 | dev: true 1106 | 1107 | /escalade@3.2.0: 1108 | resolution: {integrity: sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==} 1109 | engines: {node: '>=6'} 1110 | dev: true 1111 | 1112 | /escape-string-regexp@1.0.5: 1113 | resolution: {integrity: sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==} 1114 | engines: {node: '>=0.8.0'} 1115 | dev: true 1116 | 1117 | /escape-string-regexp@2.0.0: 1118 | resolution: {integrity: sha512-UpzcLCXolUWcNu5HtVMHYdXJjArjsF9C0aNnquZYY4uW/Vu0miy5YoWvbV345HauVvcAUnpRuhMMcqTcGOY2+w==} 1119 | engines: {node: '>=8'} 1120 | dev: true 1121 | 1122 | /escodegen@2.1.0: 1123 | resolution: {integrity: sha512-2NlIDTwUWJN0mRPQOdtQBzbUHvdGY2P1VXSyU83Q3xKxM7WHX2Ql8dKq782Q9TgQUNOLEzEYu9bzLNj1q88I5w==} 1124 | engines: {node: '>=6.0'} 1125 | hasBin: true 1126 | dependencies: 1127 | esprima: 4.0.1 1128 | estraverse: 5.3.0 1129 | esutils: 2.0.3 1130 | optionalDependencies: 1131 | source-map: 0.6.1 1132 | dev: true 1133 | 1134 | /esprima@4.0.1: 1135 | resolution: {integrity: sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==} 1136 | engines: {node: '>=4'} 1137 | hasBin: true 1138 | dev: true 1139 | 1140 | /estraverse@5.3.0: 1141 | resolution: {integrity: sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==} 1142 | engines: {node: '>=4.0'} 1143 | dev: true 1144 | 1145 | /esutils@2.0.3: 1146 | resolution: {integrity: sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==} 1147 | engines: {node: '>=0.10.0'} 1148 | dev: true 1149 | 1150 | /execa@5.1.1: 1151 | resolution: {integrity: sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==} 1152 | engines: {node: '>=10'} 1153 | dependencies: 1154 | cross-spawn: 7.0.3 1155 | get-stream: 6.0.1 1156 | human-signals: 2.1.0 1157 | is-stream: 2.0.1 1158 | merge-stream: 2.0.0 1159 | npm-run-path: 4.0.1 1160 | onetime: 5.1.2 1161 | signal-exit: 3.0.7 1162 | strip-final-newline: 2.0.0 1163 | dev: true 1164 | 1165 | /exit@0.1.2: 1166 | resolution: {integrity: sha512-Zk/eNKV2zbjpKzrsQ+n1G6poVbErQxJ0LBOJXaKZ1EViLzH+hrLu9cdXI4zw9dBQJslwBEpbQ2P1oS7nDxs6jQ==} 1167 | engines: {node: '>= 0.8.0'} 1168 | dev: true 1169 | 1170 | /expect@27.5.1: 1171 | resolution: {integrity: sha512-E1q5hSUG2AmYQwQJ041nvgpkODHQvB+RKlB4IYdru6uJsyFTRyZAP463M+1lINorwbqAmUggi6+WwkD8lCS/Dw==} 1172 | engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} 1173 | dependencies: 1174 | '@jest/types': 27.5.1 1175 | jest-get-type: 27.5.1 1176 | jest-matcher-utils: 27.5.1 1177 | jest-message-util: 27.5.1 1178 | dev: true 1179 | 1180 | /fast-json-stable-stringify@2.1.0: 1181 | resolution: {integrity: sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==} 1182 | dev: true 1183 | 1184 | /fb-watchman@2.0.2: 1185 | resolution: {integrity: sha512-p5161BqbuCaSnB8jIbzQHOlpgsPmK5rJVDfDKO91Axs5NC1uu3HRQm6wt9cd9/+GtQQIO53JdGXXoyDpTAsgYA==} 1186 | dependencies: 1187 | bser: 2.1.1 1188 | dev: true 1189 | 1190 | /fill-range@7.1.1: 1191 | resolution: {integrity: sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==} 1192 | engines: {node: '>=8'} 1193 | dependencies: 1194 | to-regex-range: 5.0.1 1195 | dev: true 1196 | 1197 | /find-up@4.1.0: 1198 | resolution: {integrity: sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==} 1199 | engines: {node: '>=8'} 1200 | dependencies: 1201 | locate-path: 5.0.0 1202 | path-exists: 4.0.0 1203 | dev: true 1204 | 1205 | /form-data@3.0.2: 1206 | resolution: {integrity: sha512-sJe+TQb2vIaIyO783qN6BlMYWMw3WBOHA1Ay2qxsnjuafEOQFJ2JakedOQirT6D5XPRxDvS7AHYyem9fTpb4LQ==} 1207 | engines: {node: '>= 6'} 1208 | dependencies: 1209 | asynckit: 0.4.0 1210 | combined-stream: 1.0.8 1211 | mime-types: 2.1.35 1212 | dev: true 1213 | 1214 | /fs.realpath@1.0.0: 1215 | resolution: {integrity: sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==} 1216 | dev: true 1217 | 1218 | /fsevents@2.3.3: 1219 | resolution: {integrity: sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==} 1220 | engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0} 1221 | os: [darwin] 1222 | requiresBuild: true 1223 | dev: true 1224 | optional: true 1225 | 1226 | /function-bind@1.1.2: 1227 | resolution: {integrity: sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==} 1228 | dev: true 1229 | 1230 | /gensync@1.0.0-beta.2: 1231 | resolution: {integrity: sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==} 1232 | engines: {node: '>=6.9.0'} 1233 | dev: true 1234 | 1235 | /get-caller-file@2.0.5: 1236 | resolution: {integrity: sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==} 1237 | engines: {node: 6.* || 8.* || >= 10.*} 1238 | dev: true 1239 | 1240 | /get-package-type@0.1.0: 1241 | resolution: {integrity: sha512-pjzuKtY64GYfWizNAJ0fr9VqttZkNiK2iS430LtIHzjBEr6bX8Am2zm4sW4Ro5wjWW5cAlRL1qAMTcXbjNAO2Q==} 1242 | engines: {node: '>=8.0.0'} 1243 | dev: true 1244 | 1245 | /get-stream@6.0.1: 1246 | resolution: {integrity: sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==} 1247 | engines: {node: '>=10'} 1248 | dev: true 1249 | 1250 | /glob@7.2.3: 1251 | resolution: {integrity: sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==} 1252 | deprecated: Glob versions prior to v9 are no longer supported 1253 | dependencies: 1254 | fs.realpath: 1.0.0 1255 | inflight: 1.0.6 1256 | inherits: 2.0.4 1257 | minimatch: 3.1.2 1258 | once: 1.4.0 1259 | path-is-absolute: 1.0.1 1260 | dev: true 1261 | 1262 | /globals@11.12.0: 1263 | resolution: {integrity: sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==} 1264 | engines: {node: '>=4'} 1265 | dev: true 1266 | 1267 | /graceful-fs@4.2.11: 1268 | resolution: {integrity: sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==} 1269 | dev: true 1270 | 1271 | /has-flag@3.0.0: 1272 | resolution: {integrity: sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==} 1273 | engines: {node: '>=4'} 1274 | dev: true 1275 | 1276 | /has-flag@4.0.0: 1277 | resolution: {integrity: sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==} 1278 | engines: {node: '>=8'} 1279 | dev: true 1280 | 1281 | /hasown@2.0.2: 1282 | resolution: {integrity: sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==} 1283 | engines: {node: '>= 0.4'} 1284 | dependencies: 1285 | function-bind: 1.1.2 1286 | dev: true 1287 | 1288 | /html-encoding-sniffer@2.0.1: 1289 | resolution: {integrity: sha512-D5JbOMBIR/TVZkubHT+OyT2705QvogUW4IBn6nHd756OwieSF9aDYFj4dv6HHEVGYbHaLETa3WggZYWWMyy3ZQ==} 1290 | engines: {node: '>=10'} 1291 | dependencies: 1292 | whatwg-encoding: 1.0.5 1293 | dev: true 1294 | 1295 | /html-escaper@2.0.2: 1296 | resolution: {integrity: sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg==} 1297 | dev: true 1298 | 1299 | /http-proxy-agent@4.0.1: 1300 | resolution: {integrity: sha512-k0zdNgqWTGA6aeIRVpvfVob4fL52dTfaehylg0Y4UvSySvOq/Y+BOyPrgpUrA7HylqvU8vIZGsRuXmspskV0Tg==} 1301 | engines: {node: '>= 6'} 1302 | dependencies: 1303 | '@tootallnate/once': 1.1.2 1304 | agent-base: 6.0.2 1305 | debug: 4.3.7 1306 | transitivePeerDependencies: 1307 | - supports-color 1308 | dev: true 1309 | 1310 | /https-proxy-agent@5.0.1: 1311 | resolution: {integrity: sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA==} 1312 | engines: {node: '>= 6'} 1313 | dependencies: 1314 | agent-base: 6.0.2 1315 | debug: 4.3.7 1316 | transitivePeerDependencies: 1317 | - supports-color 1318 | dev: true 1319 | 1320 | /human-signals@2.1.0: 1321 | resolution: {integrity: sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==} 1322 | engines: {node: '>=10.17.0'} 1323 | dev: true 1324 | 1325 | /iconv-lite@0.4.24: 1326 | resolution: {integrity: sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==} 1327 | engines: {node: '>=0.10.0'} 1328 | dependencies: 1329 | safer-buffer: 2.1.2 1330 | dev: true 1331 | 1332 | /import-local@3.2.0: 1333 | resolution: {integrity: sha512-2SPlun1JUPWoM6t3F0dw0FkCF/jWY8kttcY4f599GLTSjh2OCuuhdTkJQsEcZzBqbXZGKMK2OqW1oZsjtf/gQA==} 1334 | engines: {node: '>=8'} 1335 | hasBin: true 1336 | dependencies: 1337 | pkg-dir: 4.2.0 1338 | resolve-cwd: 3.0.0 1339 | dev: true 1340 | 1341 | /imurmurhash@0.1.4: 1342 | resolution: {integrity: sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==} 1343 | engines: {node: '>=0.8.19'} 1344 | dev: true 1345 | 1346 | /inflight@1.0.6: 1347 | resolution: {integrity: sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==} 1348 | deprecated: This module is not supported, and leaks memory. Do not use it. Check out lru-cache if you want a good and tested way to coalesce async requests by a key value, which is much more comprehensive and powerful. 1349 | dependencies: 1350 | once: 1.4.0 1351 | wrappy: 1.0.2 1352 | dev: true 1353 | 1354 | /inherits@2.0.4: 1355 | resolution: {integrity: sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==} 1356 | dev: true 1357 | 1358 | /is-arrayish@0.2.1: 1359 | resolution: {integrity: sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==} 1360 | dev: true 1361 | 1362 | /is-core-module@2.15.1: 1363 | resolution: {integrity: sha512-z0vtXSwucUJtANQWldhbtbt7BnL0vxiFjIdDLAatwhDYty2bad6s+rijD6Ri4YuYJubLzIJLUidCh09e1djEVQ==} 1364 | engines: {node: '>= 0.4'} 1365 | dependencies: 1366 | hasown: 2.0.2 1367 | dev: true 1368 | 1369 | /is-fullwidth-code-point@3.0.0: 1370 | resolution: {integrity: sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==} 1371 | engines: {node: '>=8'} 1372 | dev: true 1373 | 1374 | /is-generator-fn@2.1.0: 1375 | resolution: {integrity: sha512-cTIB4yPYL/Grw0EaSzASzg6bBy9gqCofvWN8okThAYIxKJZC+udlRAmGbM0XLeniEJSs8uEgHPGuHSe1XsOLSQ==} 1376 | engines: {node: '>=6'} 1377 | dev: true 1378 | 1379 | /is-number@7.0.0: 1380 | resolution: {integrity: sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==} 1381 | engines: {node: '>=0.12.0'} 1382 | dev: true 1383 | 1384 | /is-potential-custom-element-name@1.0.1: 1385 | resolution: {integrity: sha512-bCYeRA2rVibKZd+s2625gGnGF/t7DSqDs4dP7CrLA1m7jKWz6pps0LpYLJN8Q64HtmPKJ1hrN3nzPNKFEKOUiQ==} 1386 | dev: true 1387 | 1388 | /is-stream@2.0.1: 1389 | resolution: {integrity: sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==} 1390 | engines: {node: '>=8'} 1391 | dev: true 1392 | 1393 | /is-typedarray@1.0.0: 1394 | resolution: {integrity: sha512-cyA56iCMHAh5CdzjJIa4aohJyeO1YbwLi3Jc35MmRU6poroFjIGZzUzupGiRPOjgHg9TLu43xbpwXk523fMxKA==} 1395 | dev: true 1396 | 1397 | /isexe@2.0.0: 1398 | resolution: {integrity: sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==} 1399 | dev: true 1400 | 1401 | /istanbul-lib-coverage@3.2.2: 1402 | resolution: {integrity: sha512-O8dpsF+r0WV/8MNRKfnmrtCWhuKjxrq2w+jpzBL5UZKTi2LeVWnWOmWRxFlesJONmc+wLAGvKQZEOanko0LFTg==} 1403 | engines: {node: '>=8'} 1404 | dev: true 1405 | 1406 | /istanbul-lib-instrument@5.2.1: 1407 | resolution: {integrity: sha512-pzqtp31nLv/XFOzXGuvhCb8qhjmTVo5vjVk19XE4CRlSWz0KoeJ3bw9XsA7nOp9YBf4qHjwBxkDzKcME/J29Yg==} 1408 | engines: {node: '>=8'} 1409 | dependencies: 1410 | '@babel/core': 7.25.8 1411 | '@babel/parser': 7.25.8 1412 | '@istanbuljs/schema': 0.1.3 1413 | istanbul-lib-coverage: 3.2.2 1414 | semver: 6.3.1 1415 | transitivePeerDependencies: 1416 | - supports-color 1417 | dev: true 1418 | 1419 | /istanbul-lib-report@3.0.1: 1420 | resolution: {integrity: sha512-GCfE1mtsHGOELCU8e/Z7YWzpmybrx/+dSTfLrvY8qRmaY6zXTKWn6WQIjaAFw069icm6GVMNkgu0NzI4iPZUNw==} 1421 | engines: {node: '>=10'} 1422 | dependencies: 1423 | istanbul-lib-coverage: 3.2.2 1424 | make-dir: 4.0.0 1425 | supports-color: 7.2.0 1426 | dev: true 1427 | 1428 | /istanbul-lib-source-maps@4.0.1: 1429 | resolution: {integrity: sha512-n3s8EwkdFIJCG3BPKBYvskgXGoy88ARzvegkitk60NxRdwltLOTaH7CUiMRXvwYorl0Q712iEjcWB+fK/MrWVw==} 1430 | engines: {node: '>=10'} 1431 | dependencies: 1432 | debug: 4.3.7 1433 | istanbul-lib-coverage: 3.2.2 1434 | source-map: 0.6.1 1435 | transitivePeerDependencies: 1436 | - supports-color 1437 | dev: true 1438 | 1439 | /istanbul-reports@3.1.7: 1440 | resolution: {integrity: sha512-BewmUXImeuRk2YY0PVbxgKAysvhRPUQE0h5QRM++nVWyubKGV0l8qQ5op8+B2DOmwSe63Jivj0BjkPQVf8fP5g==} 1441 | engines: {node: '>=8'} 1442 | dependencies: 1443 | html-escaper: 2.0.2 1444 | istanbul-lib-report: 3.0.1 1445 | dev: true 1446 | 1447 | /jest-changed-files@27.5.1: 1448 | resolution: {integrity: sha512-buBLMiByfWGCoMsLLzGUUSpAmIAGnbR2KJoMN10ziLhOLvP4e0SlypHnAel8iqQXTrcbmfEY9sSqae5sgUsTvw==} 1449 | engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} 1450 | dependencies: 1451 | '@jest/types': 27.5.1 1452 | execa: 5.1.1 1453 | throat: 6.0.2 1454 | dev: true 1455 | 1456 | /jest-circus@27.5.1: 1457 | resolution: {integrity: sha512-D95R7x5UtlMA5iBYsOHFFbMD/GVA4R/Kdq15f7xYWUfWHBto9NYRsOvnSauTgdF+ogCpJ4tyKOXhUifxS65gdw==} 1458 | engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} 1459 | dependencies: 1460 | '@jest/environment': 27.5.1 1461 | '@jest/test-result': 27.5.1 1462 | '@jest/types': 27.5.1 1463 | '@types/node': 22.7.7 1464 | chalk: 4.1.2 1465 | co: 4.6.0 1466 | dedent: 0.7.0 1467 | expect: 27.5.1 1468 | is-generator-fn: 2.1.0 1469 | jest-each: 27.5.1 1470 | jest-matcher-utils: 27.5.1 1471 | jest-message-util: 27.5.1 1472 | jest-runtime: 27.5.1 1473 | jest-snapshot: 27.5.1 1474 | jest-util: 27.5.1 1475 | pretty-format: 27.5.1 1476 | slash: 3.0.0 1477 | stack-utils: 2.0.6 1478 | throat: 6.0.2 1479 | transitivePeerDependencies: 1480 | - supports-color 1481 | dev: true 1482 | 1483 | /jest-cli@27.5.1: 1484 | resolution: {integrity: sha512-Hc6HOOwYq4/74/c62dEE3r5elx8wjYqxY0r0G/nFrLDPMFRu6RA/u8qINOIkvhxG7mMQ5EJsOGfRpI8L6eFUVw==} 1485 | engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} 1486 | hasBin: true 1487 | peerDependencies: 1488 | node-notifier: ^8.0.1 || ^9.0.0 || ^10.0.0 1489 | peerDependenciesMeta: 1490 | node-notifier: 1491 | optional: true 1492 | dependencies: 1493 | '@jest/core': 27.5.1 1494 | '@jest/test-result': 27.5.1 1495 | '@jest/types': 27.5.1 1496 | chalk: 4.1.2 1497 | exit: 0.1.2 1498 | graceful-fs: 4.2.11 1499 | import-local: 3.2.0 1500 | jest-config: 27.5.1 1501 | jest-util: 27.5.1 1502 | jest-validate: 27.5.1 1503 | prompts: 2.4.2 1504 | yargs: 16.2.0 1505 | transitivePeerDependencies: 1506 | - bufferutil 1507 | - canvas 1508 | - supports-color 1509 | - ts-node 1510 | - utf-8-validate 1511 | dev: true 1512 | 1513 | /jest-config@27.5.1: 1514 | resolution: {integrity: sha512-5sAsjm6tGdsVbW9ahcChPAFCk4IlkQUknH5AvKjuLTSlcO/wCZKyFdn7Rg0EkC+OGgWODEy2hDpWB1PgzH0JNA==} 1515 | engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} 1516 | peerDependencies: 1517 | ts-node: '>=9.0.0' 1518 | peerDependenciesMeta: 1519 | ts-node: 1520 | optional: true 1521 | dependencies: 1522 | '@babel/core': 7.25.8 1523 | '@jest/test-sequencer': 27.5.1 1524 | '@jest/types': 27.5.1 1525 | babel-jest: 27.5.1(@babel/core@7.25.8) 1526 | chalk: 4.1.2 1527 | ci-info: 3.9.0 1528 | deepmerge: 4.3.1 1529 | glob: 7.2.3 1530 | graceful-fs: 4.2.11 1531 | jest-circus: 27.5.1 1532 | jest-environment-jsdom: 27.5.1 1533 | jest-environment-node: 27.5.1 1534 | jest-get-type: 27.5.1 1535 | jest-jasmine2: 27.5.1 1536 | jest-regex-util: 27.5.1 1537 | jest-resolve: 27.5.1 1538 | jest-runner: 27.5.1 1539 | jest-util: 27.5.1 1540 | jest-validate: 27.5.1 1541 | micromatch: 4.0.8 1542 | parse-json: 5.2.0 1543 | pretty-format: 27.5.1 1544 | slash: 3.0.0 1545 | strip-json-comments: 3.1.1 1546 | transitivePeerDependencies: 1547 | - bufferutil 1548 | - canvas 1549 | - supports-color 1550 | - utf-8-validate 1551 | dev: true 1552 | 1553 | /jest-diff@27.5.1: 1554 | resolution: {integrity: sha512-m0NvkX55LDt9T4mctTEgnZk3fmEg3NRYutvMPWM/0iPnkFj2wIeF45O1718cMSOFO1vINkqmxqD8vE37uTEbqw==} 1555 | engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} 1556 | dependencies: 1557 | chalk: 4.1.2 1558 | diff-sequences: 27.5.1 1559 | jest-get-type: 27.5.1 1560 | pretty-format: 27.5.1 1561 | dev: true 1562 | 1563 | /jest-docblock@27.5.1: 1564 | resolution: {integrity: sha512-rl7hlABeTsRYxKiUfpHrQrG4e2obOiTQWfMEH3PxPjOtdsfLQO4ReWSZaQ7DETm4xu07rl4q/h4zcKXyU0/OzQ==} 1565 | engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} 1566 | dependencies: 1567 | detect-newline: 3.1.0 1568 | dev: true 1569 | 1570 | /jest-each@27.5.1: 1571 | resolution: {integrity: sha512-1Ff6p+FbhT/bXQnEouYy00bkNSY7OUpfIcmdl8vZ31A1UUaurOLPA8a8BbJOF2RDUElwJhmeaV7LnagI+5UwNQ==} 1572 | engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} 1573 | dependencies: 1574 | '@jest/types': 27.5.1 1575 | chalk: 4.1.2 1576 | jest-get-type: 27.5.1 1577 | jest-util: 27.5.1 1578 | pretty-format: 27.5.1 1579 | dev: true 1580 | 1581 | /jest-environment-jsdom@27.5.1: 1582 | resolution: {integrity: sha512-TFBvkTC1Hnnnrka/fUb56atfDtJ9VMZ94JkjTbggl1PEpwrYtUBKMezB3inLmWqQsXYLcMwNoDQwoBTAvFfsfw==} 1583 | engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} 1584 | dependencies: 1585 | '@jest/environment': 27.5.1 1586 | '@jest/fake-timers': 27.5.1 1587 | '@jest/types': 27.5.1 1588 | '@types/node': 22.7.7 1589 | jest-mock: 27.5.1 1590 | jest-util: 27.5.1 1591 | jsdom: 16.7.0 1592 | transitivePeerDependencies: 1593 | - bufferutil 1594 | - canvas 1595 | - supports-color 1596 | - utf-8-validate 1597 | dev: true 1598 | 1599 | /jest-environment-node@27.5.1: 1600 | resolution: {integrity: sha512-Jt4ZUnxdOsTGwSRAfKEnE6BcwsSPNOijjwifq5sDFSA2kesnXTvNqKHYgM0hDq3549Uf/KzdXNYn4wMZJPlFLw==} 1601 | engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} 1602 | dependencies: 1603 | '@jest/environment': 27.5.1 1604 | '@jest/fake-timers': 27.5.1 1605 | '@jest/types': 27.5.1 1606 | '@types/node': 22.7.7 1607 | jest-mock: 27.5.1 1608 | jest-util: 27.5.1 1609 | dev: true 1610 | 1611 | /jest-get-type@27.5.1: 1612 | resolution: {integrity: sha512-2KY95ksYSaK7DMBWQn6dQz3kqAf3BB64y2udeG+hv4KfSOb9qwcYQstTJc1KCbsix+wLZWZYN8t7nwX3GOBLRw==} 1613 | engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} 1614 | dev: true 1615 | 1616 | /jest-haste-map@27.5.1: 1617 | resolution: {integrity: sha512-7GgkZ4Fw4NFbMSDSpZwXeBiIbx+t/46nJ2QitkOjvwPYyZmqttu2TDSimMHP1EkPOi4xUZAN1doE5Vd25H4Jng==} 1618 | engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} 1619 | dependencies: 1620 | '@jest/types': 27.5.1 1621 | '@types/graceful-fs': 4.1.9 1622 | '@types/node': 22.7.7 1623 | anymatch: 3.1.3 1624 | fb-watchman: 2.0.2 1625 | graceful-fs: 4.2.11 1626 | jest-regex-util: 27.5.1 1627 | jest-serializer: 27.5.1 1628 | jest-util: 27.5.1 1629 | jest-worker: 27.5.1 1630 | micromatch: 4.0.8 1631 | walker: 1.0.8 1632 | optionalDependencies: 1633 | fsevents: 2.3.3 1634 | dev: true 1635 | 1636 | /jest-jasmine2@27.5.1: 1637 | resolution: {integrity: sha512-jtq7VVyG8SqAorDpApwiJJImd0V2wv1xzdheGHRGyuT7gZm6gG47QEskOlzsN1PG/6WNaCo5pmwMHDf3AkG2pQ==} 1638 | engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} 1639 | dependencies: 1640 | '@jest/environment': 27.5.1 1641 | '@jest/source-map': 27.5.1 1642 | '@jest/test-result': 27.5.1 1643 | '@jest/types': 27.5.1 1644 | '@types/node': 22.7.7 1645 | chalk: 4.1.2 1646 | co: 4.6.0 1647 | expect: 27.5.1 1648 | is-generator-fn: 2.1.0 1649 | jest-each: 27.5.1 1650 | jest-matcher-utils: 27.5.1 1651 | jest-message-util: 27.5.1 1652 | jest-runtime: 27.5.1 1653 | jest-snapshot: 27.5.1 1654 | jest-util: 27.5.1 1655 | pretty-format: 27.5.1 1656 | throat: 6.0.2 1657 | transitivePeerDependencies: 1658 | - supports-color 1659 | dev: true 1660 | 1661 | /jest-leak-detector@27.5.1: 1662 | resolution: {integrity: sha512-POXfWAMvfU6WMUXftV4HolnJfnPOGEu10fscNCA76KBpRRhcMN2c8d3iT2pxQS3HLbA+5X4sOUPzYO2NUyIlHQ==} 1663 | engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} 1664 | dependencies: 1665 | jest-get-type: 27.5.1 1666 | pretty-format: 27.5.1 1667 | dev: true 1668 | 1669 | /jest-matcher-utils@27.5.1: 1670 | resolution: {integrity: sha512-z2uTx/T6LBaCoNWNFWwChLBKYxTMcGBRjAt+2SbP929/Fflb9aa5LGma654Rz8z9HLxsrUaYzxE9T/EFIL/PAw==} 1671 | engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} 1672 | dependencies: 1673 | chalk: 4.1.2 1674 | jest-diff: 27.5.1 1675 | jest-get-type: 27.5.1 1676 | pretty-format: 27.5.1 1677 | dev: true 1678 | 1679 | /jest-message-util@27.5.1: 1680 | resolution: {integrity: sha512-rMyFe1+jnyAAf+NHwTclDz0eAaLkVDdKVHHBFWsBWHnnh5YeJMNWWsv7AbFYXfK3oTqvL7VTWkhNLu1jX24D+g==} 1681 | engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} 1682 | dependencies: 1683 | '@babel/code-frame': 7.25.7 1684 | '@jest/types': 27.5.1 1685 | '@types/stack-utils': 2.0.3 1686 | chalk: 4.1.2 1687 | graceful-fs: 4.2.11 1688 | micromatch: 4.0.8 1689 | pretty-format: 27.5.1 1690 | slash: 3.0.0 1691 | stack-utils: 2.0.6 1692 | dev: true 1693 | 1694 | /jest-mock@27.5.1: 1695 | resolution: {integrity: sha512-K4jKbY1d4ENhbrG2zuPWaQBvDly+iZ2yAW+T1fATN78hc0sInwn7wZB8XtlNnvHug5RMwV897Xm4LqmPM4e2Og==} 1696 | engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} 1697 | dependencies: 1698 | '@jest/types': 27.5.1 1699 | '@types/node': 22.7.7 1700 | dev: true 1701 | 1702 | /jest-pnp-resolver@1.2.3(jest-resolve@27.5.1): 1703 | resolution: {integrity: sha512-+3NpwQEnRoIBtx4fyhblQDPgJI0H1IEIkX7ShLUjPGA7TtUTvI1oiKi3SR4oBR0hQhQR80l4WAe5RrXBwWMA8w==} 1704 | engines: {node: '>=6'} 1705 | peerDependencies: 1706 | jest-resolve: '*' 1707 | peerDependenciesMeta: 1708 | jest-resolve: 1709 | optional: true 1710 | dependencies: 1711 | jest-resolve: 27.5.1 1712 | dev: true 1713 | 1714 | /jest-regex-util@27.5.1: 1715 | resolution: {integrity: sha512-4bfKq2zie+x16okqDXjXn9ql2B0dScQu+vcwe4TvFVhkVyuWLqpZrZtXxLLWoXYgn0E87I6r6GRYHF7wFZBUvg==} 1716 | engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} 1717 | dev: true 1718 | 1719 | /jest-resolve-dependencies@27.5.1: 1720 | resolution: {integrity: sha512-QQOOdY4PE39iawDn5rzbIePNigfe5B9Z91GDD1ae/xNDlu9kaat8QQ5EKnNmVWPV54hUdxCVwwj6YMgR2O7IOg==} 1721 | engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} 1722 | dependencies: 1723 | '@jest/types': 27.5.1 1724 | jest-regex-util: 27.5.1 1725 | jest-snapshot: 27.5.1 1726 | transitivePeerDependencies: 1727 | - supports-color 1728 | dev: true 1729 | 1730 | /jest-resolve@27.5.1: 1731 | resolution: {integrity: sha512-FFDy8/9E6CV83IMbDpcjOhumAQPDyETnU2KZ1O98DwTnz8AOBsW/Xv3GySr1mOZdItLR+zDZ7I/UdTFbgSOVCw==} 1732 | engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} 1733 | dependencies: 1734 | '@jest/types': 27.5.1 1735 | chalk: 4.1.2 1736 | graceful-fs: 4.2.11 1737 | jest-haste-map: 27.5.1 1738 | jest-pnp-resolver: 1.2.3(jest-resolve@27.5.1) 1739 | jest-util: 27.5.1 1740 | jest-validate: 27.5.1 1741 | resolve: 1.22.8 1742 | resolve.exports: 1.1.1 1743 | slash: 3.0.0 1744 | dev: true 1745 | 1746 | /jest-runner@27.5.1: 1747 | resolution: {integrity: sha512-g4NPsM4mFCOwFKXO4p/H/kWGdJp9V8kURY2lX8Me2drgXqG7rrZAx5kv+5H7wtt/cdFIjhqYx1HrlqWHaOvDaQ==} 1748 | engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} 1749 | dependencies: 1750 | '@jest/console': 27.5.1 1751 | '@jest/environment': 27.5.1 1752 | '@jest/test-result': 27.5.1 1753 | '@jest/transform': 27.5.1 1754 | '@jest/types': 27.5.1 1755 | '@types/node': 22.7.7 1756 | chalk: 4.1.2 1757 | emittery: 0.8.1 1758 | graceful-fs: 4.2.11 1759 | jest-docblock: 27.5.1 1760 | jest-environment-jsdom: 27.5.1 1761 | jest-environment-node: 27.5.1 1762 | jest-haste-map: 27.5.1 1763 | jest-leak-detector: 27.5.1 1764 | jest-message-util: 27.5.1 1765 | jest-resolve: 27.5.1 1766 | jest-runtime: 27.5.1 1767 | jest-util: 27.5.1 1768 | jest-worker: 27.5.1 1769 | source-map-support: 0.5.21 1770 | throat: 6.0.2 1771 | transitivePeerDependencies: 1772 | - bufferutil 1773 | - canvas 1774 | - supports-color 1775 | - utf-8-validate 1776 | dev: true 1777 | 1778 | /jest-runtime@27.5.1: 1779 | resolution: {integrity: sha512-o7gxw3Gf+H2IGt8fv0RiyE1+r83FJBRruoA+FXrlHw6xEyBsU8ugA6IPfTdVyA0w8HClpbK+DGJxH59UrNMx8A==} 1780 | engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} 1781 | dependencies: 1782 | '@jest/environment': 27.5.1 1783 | '@jest/fake-timers': 27.5.1 1784 | '@jest/globals': 27.5.1 1785 | '@jest/source-map': 27.5.1 1786 | '@jest/test-result': 27.5.1 1787 | '@jest/transform': 27.5.1 1788 | '@jest/types': 27.5.1 1789 | chalk: 4.1.2 1790 | cjs-module-lexer: 1.4.1 1791 | collect-v8-coverage: 1.0.2 1792 | execa: 5.1.1 1793 | glob: 7.2.3 1794 | graceful-fs: 4.2.11 1795 | jest-haste-map: 27.5.1 1796 | jest-message-util: 27.5.1 1797 | jest-mock: 27.5.1 1798 | jest-regex-util: 27.5.1 1799 | jest-resolve: 27.5.1 1800 | jest-snapshot: 27.5.1 1801 | jest-util: 27.5.1 1802 | slash: 3.0.0 1803 | strip-bom: 4.0.0 1804 | transitivePeerDependencies: 1805 | - supports-color 1806 | dev: true 1807 | 1808 | /jest-serializer@27.5.1: 1809 | resolution: {integrity: sha512-jZCyo6iIxO1aqUxpuBlwTDMkzOAJS4a3eYz3YzgxxVQFwLeSA7Jfq5cbqCY+JLvTDrWirgusI/0KwxKMgrdf7w==} 1810 | engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} 1811 | dependencies: 1812 | '@types/node': 22.7.7 1813 | graceful-fs: 4.2.11 1814 | dev: true 1815 | 1816 | /jest-snapshot@27.5.1: 1817 | resolution: {integrity: sha512-yYykXI5a0I31xX67mgeLw1DZ0bJB+gpq5IpSuCAoyDi0+BhgU/RIrL+RTzDmkNTchvDFWKP8lp+w/42Z3us5sA==} 1818 | engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} 1819 | dependencies: 1820 | '@babel/core': 7.25.8 1821 | '@babel/generator': 7.25.7 1822 | '@babel/plugin-syntax-typescript': 7.25.7(@babel/core@7.25.8) 1823 | '@babel/traverse': 7.25.7 1824 | '@babel/types': 7.25.8 1825 | '@jest/transform': 27.5.1 1826 | '@jest/types': 27.5.1 1827 | '@types/babel__traverse': 7.20.6 1828 | '@types/prettier': 2.7.3 1829 | babel-preset-current-node-syntax: 1.1.0(@babel/core@7.25.8) 1830 | chalk: 4.1.2 1831 | expect: 27.5.1 1832 | graceful-fs: 4.2.11 1833 | jest-diff: 27.5.1 1834 | jest-get-type: 27.5.1 1835 | jest-haste-map: 27.5.1 1836 | jest-matcher-utils: 27.5.1 1837 | jest-message-util: 27.5.1 1838 | jest-util: 27.5.1 1839 | natural-compare: 1.4.0 1840 | pretty-format: 27.5.1 1841 | semver: 7.6.3 1842 | transitivePeerDependencies: 1843 | - supports-color 1844 | dev: true 1845 | 1846 | /jest-util@27.5.1: 1847 | resolution: {integrity: sha512-Kv2o/8jNvX1MQ0KGtw480E/w4fBCDOnH6+6DmeKi6LZUIlKA5kwY0YNdlzaWTiVgxqAqik11QyxDOKk543aKXw==} 1848 | engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} 1849 | dependencies: 1850 | '@jest/types': 27.5.1 1851 | '@types/node': 22.7.7 1852 | chalk: 4.1.2 1853 | ci-info: 3.9.0 1854 | graceful-fs: 4.2.11 1855 | picomatch: 2.3.1 1856 | dev: true 1857 | 1858 | /jest-validate@27.5.1: 1859 | resolution: {integrity: sha512-thkNli0LYTmOI1tDB3FI1S1RTp/Bqyd9pTarJwL87OIBFuqEb5Apv5EaApEudYg4g86e3CT6kM0RowkhtEnCBQ==} 1860 | engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} 1861 | dependencies: 1862 | '@jest/types': 27.5.1 1863 | camelcase: 6.3.0 1864 | chalk: 4.1.2 1865 | jest-get-type: 27.5.1 1866 | leven: 3.1.0 1867 | pretty-format: 27.5.1 1868 | dev: true 1869 | 1870 | /jest-watcher@27.5.1: 1871 | resolution: {integrity: sha512-z676SuD6Z8o8qbmEGhoEUFOM1+jfEiL3DXHK/xgEiG2EyNYfFG60jluWcupY6dATjfEsKQuibReS1djInQnoVw==} 1872 | engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} 1873 | dependencies: 1874 | '@jest/test-result': 27.5.1 1875 | '@jest/types': 27.5.1 1876 | '@types/node': 22.7.7 1877 | ansi-escapes: 4.3.2 1878 | chalk: 4.1.2 1879 | jest-util: 27.5.1 1880 | string-length: 4.0.2 1881 | dev: true 1882 | 1883 | /jest-worker@27.5.1: 1884 | resolution: {integrity: sha512-7vuh85V5cdDofPyxn58nrPjBktZo0u9x1g8WtjQol+jZDaE+fhN+cIvTj11GndBnMnyfrUOG1sZQxCdjKh+DKg==} 1885 | engines: {node: '>= 10.13.0'} 1886 | dependencies: 1887 | '@types/node': 22.7.7 1888 | merge-stream: 2.0.0 1889 | supports-color: 8.1.1 1890 | dev: true 1891 | 1892 | /jest@27.5.1: 1893 | resolution: {integrity: sha512-Yn0mADZB89zTtjkPJEXwrac3LHudkQMR+Paqa8uxJHCBr9agxztUifWCyiYrjhMPBoUVBjyny0I7XH6ozDr7QQ==} 1894 | engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} 1895 | hasBin: true 1896 | peerDependencies: 1897 | node-notifier: ^8.0.1 || ^9.0.0 || ^10.0.0 1898 | peerDependenciesMeta: 1899 | node-notifier: 1900 | optional: true 1901 | dependencies: 1902 | '@jest/core': 27.5.1 1903 | import-local: 3.2.0 1904 | jest-cli: 27.5.1 1905 | transitivePeerDependencies: 1906 | - bufferutil 1907 | - canvas 1908 | - supports-color 1909 | - ts-node 1910 | - utf-8-validate 1911 | dev: true 1912 | 1913 | /js-tokens@4.0.0: 1914 | resolution: {integrity: sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==} 1915 | dev: true 1916 | 1917 | /js-yaml@3.14.1: 1918 | resolution: {integrity: sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==} 1919 | hasBin: true 1920 | dependencies: 1921 | argparse: 1.0.10 1922 | esprima: 4.0.1 1923 | dev: true 1924 | 1925 | /jsdom@16.7.0: 1926 | resolution: {integrity: sha512-u9Smc2G1USStM+s/x1ru5Sxrl6mPYCbByG1U/hUmqaVsm4tbNyS7CicOSRyuGQYZhTu0h84qkZZQ/I+dzizSVw==} 1927 | engines: {node: '>=10'} 1928 | peerDependencies: 1929 | canvas: ^2.5.0 1930 | peerDependenciesMeta: 1931 | canvas: 1932 | optional: true 1933 | dependencies: 1934 | abab: 2.0.6 1935 | acorn: 8.13.0 1936 | acorn-globals: 6.0.0 1937 | cssom: 0.4.4 1938 | cssstyle: 2.3.0 1939 | data-urls: 2.0.0 1940 | decimal.js: 10.4.3 1941 | domexception: 2.0.1 1942 | escodegen: 2.1.0 1943 | form-data: 3.0.2 1944 | html-encoding-sniffer: 2.0.1 1945 | http-proxy-agent: 4.0.1 1946 | https-proxy-agent: 5.0.1 1947 | is-potential-custom-element-name: 1.0.1 1948 | nwsapi: 2.2.13 1949 | parse5: 6.0.1 1950 | saxes: 5.0.1 1951 | symbol-tree: 3.2.4 1952 | tough-cookie: 4.1.4 1953 | w3c-hr-time: 1.0.2 1954 | w3c-xmlserializer: 2.0.0 1955 | webidl-conversions: 6.1.0 1956 | whatwg-encoding: 1.0.5 1957 | whatwg-mimetype: 2.3.0 1958 | whatwg-url: 8.7.0 1959 | ws: 7.5.10 1960 | xml-name-validator: 3.0.0 1961 | transitivePeerDependencies: 1962 | - bufferutil 1963 | - supports-color 1964 | - utf-8-validate 1965 | dev: true 1966 | 1967 | /jsesc@3.0.2: 1968 | resolution: {integrity: sha512-xKqzzWXDttJuOcawBt4KnKHHIf5oQ/Cxax+0PWFG+DFDgHNAdi+TXECADI+RYiFUMmx8792xsMbbgXj4CwnP4g==} 1969 | engines: {node: '>=6'} 1970 | hasBin: true 1971 | dev: true 1972 | 1973 | /json-parse-even-better-errors@2.3.1: 1974 | resolution: {integrity: sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==} 1975 | dev: true 1976 | 1977 | /json5@2.2.3: 1978 | resolution: {integrity: sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==} 1979 | engines: {node: '>=6'} 1980 | hasBin: true 1981 | dev: true 1982 | 1983 | /kleur@3.0.3: 1984 | resolution: {integrity: sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w==} 1985 | engines: {node: '>=6'} 1986 | dev: true 1987 | 1988 | /leven@3.1.0: 1989 | resolution: {integrity: sha512-qsda+H8jTaUaN/x5vzW2rzc+8Rw4TAQ/4KjB46IwK5VH+IlVeeeje/EoZRpiXvIqjFgK84QffqPztGI3VBLG1A==} 1990 | engines: {node: '>=6'} 1991 | dev: true 1992 | 1993 | /lines-and-columns@1.2.4: 1994 | resolution: {integrity: sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==} 1995 | dev: true 1996 | 1997 | /locate-path@5.0.0: 1998 | resolution: {integrity: sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==} 1999 | engines: {node: '>=8'} 2000 | dependencies: 2001 | p-locate: 4.1.0 2002 | dev: true 2003 | 2004 | /lodash@4.17.21: 2005 | resolution: {integrity: sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==} 2006 | dev: true 2007 | 2008 | /lru-cache@5.1.1: 2009 | resolution: {integrity: sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==} 2010 | dependencies: 2011 | yallist: 3.1.1 2012 | dev: true 2013 | 2014 | /make-dir@4.0.0: 2015 | resolution: {integrity: sha512-hXdUTZYIVOt1Ex//jAQi+wTZZpUpwBj/0QsOzqegb3rGMMeJiSEu5xLHnYfBrRV4RH2+OCSOO95Is/7x1WJ4bw==} 2016 | engines: {node: '>=10'} 2017 | dependencies: 2018 | semver: 7.6.3 2019 | dev: true 2020 | 2021 | /makeerror@1.0.12: 2022 | resolution: {integrity: sha512-JmqCvUhmt43madlpFzG4BQzG2Z3m6tvQDNKdClZnO3VbIudJYmxsT0FNJMeiB2+JTSlTQTSbU8QdesVmwJcmLg==} 2023 | dependencies: 2024 | tmpl: 1.0.5 2025 | dev: true 2026 | 2027 | /merge-stream@2.0.0: 2028 | resolution: {integrity: sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==} 2029 | dev: true 2030 | 2031 | /micromatch@4.0.8: 2032 | resolution: {integrity: sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==} 2033 | engines: {node: '>=8.6'} 2034 | dependencies: 2035 | braces: 3.0.3 2036 | picomatch: 2.3.1 2037 | dev: true 2038 | 2039 | /mime-db@1.52.0: 2040 | resolution: {integrity: sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==} 2041 | engines: {node: '>= 0.6'} 2042 | dev: true 2043 | 2044 | /mime-types@2.1.35: 2045 | resolution: {integrity: sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==} 2046 | engines: {node: '>= 0.6'} 2047 | dependencies: 2048 | mime-db: 1.52.0 2049 | dev: true 2050 | 2051 | /mimic-fn@2.1.0: 2052 | resolution: {integrity: sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==} 2053 | engines: {node: '>=6'} 2054 | dev: true 2055 | 2056 | /minimatch@3.1.2: 2057 | resolution: {integrity: sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==} 2058 | dependencies: 2059 | brace-expansion: 1.1.11 2060 | dev: true 2061 | 2062 | /ms@2.1.3: 2063 | resolution: {integrity: sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==} 2064 | dev: true 2065 | 2066 | /natural-compare@1.4.0: 2067 | resolution: {integrity: sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==} 2068 | dev: true 2069 | 2070 | /node-int64@0.4.0: 2071 | resolution: {integrity: sha512-O5lz91xSOeoXP6DulyHfllpq+Eg00MWitZIbtPfoSEvqIHdl5gfcY6hYzDWnj0qD5tz52PI08u9qUvSVeUBeHw==} 2072 | dev: true 2073 | 2074 | /node-releases@2.0.18: 2075 | resolution: {integrity: sha512-d9VeXT4SJ7ZeOqGX6R5EM022wpL+eWPooLI+5UpWn2jCT1aosUQEhQP214x33Wkwx3JQMvIm+tIoVOdodFS40g==} 2076 | dev: true 2077 | 2078 | /normalize-path@3.0.0: 2079 | resolution: {integrity: sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==} 2080 | engines: {node: '>=0.10.0'} 2081 | dev: true 2082 | 2083 | /npm-run-path@4.0.1: 2084 | resolution: {integrity: sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==} 2085 | engines: {node: '>=8'} 2086 | dependencies: 2087 | path-key: 3.1.1 2088 | dev: true 2089 | 2090 | /nwsapi@2.2.13: 2091 | resolution: {integrity: sha512-cTGB9ptp9dY9A5VbMSe7fQBcl/tt22Vcqdq8+eN93rblOuE0aCFu4aZ2vMwct/2t+lFnosm8RkQW1I0Omb1UtQ==} 2092 | dev: true 2093 | 2094 | /once@1.4.0: 2095 | resolution: {integrity: sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==} 2096 | dependencies: 2097 | wrappy: 1.0.2 2098 | dev: true 2099 | 2100 | /onetime@5.1.2: 2101 | resolution: {integrity: sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==} 2102 | engines: {node: '>=6'} 2103 | dependencies: 2104 | mimic-fn: 2.1.0 2105 | dev: true 2106 | 2107 | /p-limit@2.3.0: 2108 | resolution: {integrity: sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==} 2109 | engines: {node: '>=6'} 2110 | dependencies: 2111 | p-try: 2.2.0 2112 | dev: true 2113 | 2114 | /p-locate@4.1.0: 2115 | resolution: {integrity: sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==} 2116 | engines: {node: '>=8'} 2117 | dependencies: 2118 | p-limit: 2.3.0 2119 | dev: true 2120 | 2121 | /p-try@2.2.0: 2122 | resolution: {integrity: sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==} 2123 | engines: {node: '>=6'} 2124 | dev: true 2125 | 2126 | /parse-json@5.2.0: 2127 | resolution: {integrity: sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==} 2128 | engines: {node: '>=8'} 2129 | dependencies: 2130 | '@babel/code-frame': 7.25.7 2131 | error-ex: 1.3.2 2132 | json-parse-even-better-errors: 2.3.1 2133 | lines-and-columns: 1.2.4 2134 | dev: true 2135 | 2136 | /parse5@6.0.1: 2137 | resolution: {integrity: sha512-Ofn/CTFzRGTTxwpNEs9PP93gXShHcTq255nzRYSKe8AkVpZY7e1fpmTfOyoIvjP5HG7Z2ZM7VS9PPhQGW2pOpw==} 2138 | dev: true 2139 | 2140 | /path-exists@4.0.0: 2141 | resolution: {integrity: sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==} 2142 | engines: {node: '>=8'} 2143 | dev: true 2144 | 2145 | /path-is-absolute@1.0.1: 2146 | resolution: {integrity: sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==} 2147 | engines: {node: '>=0.10.0'} 2148 | dev: true 2149 | 2150 | /path-key@3.1.1: 2151 | resolution: {integrity: sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==} 2152 | engines: {node: '>=8'} 2153 | dev: true 2154 | 2155 | /path-parse@1.0.7: 2156 | resolution: {integrity: sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==} 2157 | dev: true 2158 | 2159 | /picocolors@1.1.1: 2160 | resolution: {integrity: sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==} 2161 | dev: true 2162 | 2163 | /picomatch@2.3.1: 2164 | resolution: {integrity: sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==} 2165 | engines: {node: '>=8.6'} 2166 | dev: true 2167 | 2168 | /pirates@4.0.6: 2169 | resolution: {integrity: sha512-saLsH7WeYYPiD25LDuLRRY/i+6HaPYr6G1OUlN39otzkSTxKnubR9RTxS3/Kk50s1g2JTgFwWQDQyplC5/SHZg==} 2170 | engines: {node: '>= 6'} 2171 | dev: true 2172 | 2173 | /pkg-dir@4.2.0: 2174 | resolution: {integrity: sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==} 2175 | engines: {node: '>=8'} 2176 | dependencies: 2177 | find-up: 4.1.0 2178 | dev: true 2179 | 2180 | /pretty-format@27.5.1: 2181 | resolution: {integrity: sha512-Qb1gy5OrP5+zDf2Bvnzdl3jsTf1qXVMazbvCoKhtKqVs4/YK4ozX4gKQJJVyNe+cajNPn0KoC0MC3FUmaHWEmQ==} 2182 | engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} 2183 | dependencies: 2184 | ansi-regex: 5.0.1 2185 | ansi-styles: 5.2.0 2186 | react-is: 17.0.2 2187 | dev: true 2188 | 2189 | /prompts@2.4.2: 2190 | resolution: {integrity: sha512-NxNv/kLguCA7p3jE8oL2aEBsrJWgAakBpgmgK6lpPWV+WuOmY6r2/zbAVnP+T8bQlA0nzHXSJSJW0Hq7ylaD2Q==} 2191 | engines: {node: '>= 6'} 2192 | dependencies: 2193 | kleur: 3.0.3 2194 | sisteransi: 1.0.5 2195 | dev: true 2196 | 2197 | /psl@1.9.0: 2198 | resolution: {integrity: sha512-E/ZsdU4HLs/68gYzgGTkMicWTLPdAftJLfJFlLUAAKZGkStNU72sZjT66SnMDVOfOWY/YAoiD7Jxa9iHvngcag==} 2199 | dev: true 2200 | 2201 | /punycode@2.3.1: 2202 | resolution: {integrity: sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==} 2203 | engines: {node: '>=6'} 2204 | dev: true 2205 | 2206 | /querystringify@2.2.0: 2207 | resolution: {integrity: sha512-FIqgj2EUvTa7R50u0rGsyTftzjYmv/a3hO345bZNrqabNqjtgiDMgmo4mkUjd+nzU5oF3dClKqFIPUKybUyqoQ==} 2208 | dev: true 2209 | 2210 | /react-is@17.0.2: 2211 | resolution: {integrity: sha512-w2GsyukL62IJnlaff/nRegPQR94C/XXamvMWmSHRJ4y7Ts/4ocGRmTHvOs8PSE6pB3dWOrD/nueuU5sduBsQ4w==} 2212 | dev: true 2213 | 2214 | /require-directory@2.1.1: 2215 | resolution: {integrity: sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==} 2216 | engines: {node: '>=0.10.0'} 2217 | dev: true 2218 | 2219 | /requires-port@1.0.0: 2220 | resolution: {integrity: sha512-KigOCHcocU3XODJxsu8i/j8T9tzT4adHiecwORRQ0ZZFcp7ahwXuRU1m+yuO90C5ZUyGeGfocHDI14M3L3yDAQ==} 2221 | dev: true 2222 | 2223 | /rescript@11.1.4: 2224 | resolution: {integrity: sha512-0bGU0bocihjSC6MsE3TMjHjY0EUpchyrREquLS8VsZ3ohSMD+VHUEwimEfB3kpBI1vYkw3UFZ3WD8R28guz/Vw==} 2225 | engines: {node: '>=10'} 2226 | hasBin: true 2227 | requiresBuild: true 2228 | dev: true 2229 | 2230 | /resolve-cwd@3.0.0: 2231 | resolution: {integrity: sha512-OrZaX2Mb+rJCpH/6CpSqt9xFVpN++x01XnN2ie9g6P5/3xelLAkXWVADpdz1IHD/KFfEXyE6V0U01OQ3UO2rEg==} 2232 | engines: {node: '>=8'} 2233 | dependencies: 2234 | resolve-from: 5.0.0 2235 | dev: true 2236 | 2237 | /resolve-from@5.0.0: 2238 | resolution: {integrity: sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==} 2239 | engines: {node: '>=8'} 2240 | dev: true 2241 | 2242 | /resolve.exports@1.1.1: 2243 | resolution: {integrity: sha512-/NtpHNDN7jWhAaQ9BvBUYZ6YTXsRBgfqWFWP7BZBaoMJO/I3G5OFzvTuWNlZC3aPjins1F+TNrLKsGbH4rfsRQ==} 2244 | engines: {node: '>=10'} 2245 | dev: true 2246 | 2247 | /resolve@1.22.8: 2248 | resolution: {integrity: sha512-oKWePCxqpd6FlLvGV1VU0x7bkPmmCNolxzjMf4NczoDnQcIWrAF+cPtZn5i6n+RfD2d9i0tzpKnG6Yk168yIyw==} 2249 | hasBin: true 2250 | dependencies: 2251 | is-core-module: 2.15.1 2252 | path-parse: 1.0.7 2253 | supports-preserve-symlinks-flag: 1.0.0 2254 | dev: true 2255 | 2256 | /rimraf@3.0.2: 2257 | resolution: {integrity: sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==} 2258 | deprecated: Rimraf versions prior to v4 are no longer supported 2259 | hasBin: true 2260 | dependencies: 2261 | glob: 7.2.3 2262 | dev: true 2263 | 2264 | /safer-buffer@2.1.2: 2265 | resolution: {integrity: sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==} 2266 | dev: true 2267 | 2268 | /saxes@5.0.1: 2269 | resolution: {integrity: sha512-5LBh1Tls8c9xgGjw3QrMwETmTMVk0oFgvrFSvWx62llR2hcEInrKNZ2GZCCuuy2lvWrdl5jhbpeqc5hRYKFOcw==} 2270 | engines: {node: '>=10'} 2271 | dependencies: 2272 | xmlchars: 2.2.0 2273 | dev: true 2274 | 2275 | /semver@6.3.1: 2276 | resolution: {integrity: sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==} 2277 | hasBin: true 2278 | dev: true 2279 | 2280 | /semver@7.6.3: 2281 | resolution: {integrity: sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A==} 2282 | engines: {node: '>=10'} 2283 | hasBin: true 2284 | dev: true 2285 | 2286 | /shebang-command@2.0.0: 2287 | resolution: {integrity: sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==} 2288 | engines: {node: '>=8'} 2289 | dependencies: 2290 | shebang-regex: 3.0.0 2291 | dev: true 2292 | 2293 | /shebang-regex@3.0.0: 2294 | resolution: {integrity: sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==} 2295 | engines: {node: '>=8'} 2296 | dev: true 2297 | 2298 | /signal-exit@3.0.7: 2299 | resolution: {integrity: sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==} 2300 | dev: true 2301 | 2302 | /sisteransi@1.0.5: 2303 | resolution: {integrity: sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg==} 2304 | dev: true 2305 | 2306 | /slash@3.0.0: 2307 | resolution: {integrity: sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==} 2308 | engines: {node: '>=8'} 2309 | dev: true 2310 | 2311 | /source-map-support@0.5.21: 2312 | resolution: {integrity: sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==} 2313 | dependencies: 2314 | buffer-from: 1.1.2 2315 | source-map: 0.6.1 2316 | dev: true 2317 | 2318 | /source-map@0.6.1: 2319 | resolution: {integrity: sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==} 2320 | engines: {node: '>=0.10.0'} 2321 | dev: true 2322 | 2323 | /source-map@0.7.4: 2324 | resolution: {integrity: sha512-l3BikUxvPOcn5E74dZiq5BGsTb5yEwhaTSzccU6t4sDOH8NWJCstKO5QT2CvtFoK6F0saL7p9xHAqHOlCPJygA==} 2325 | engines: {node: '>= 8'} 2326 | dev: true 2327 | 2328 | /sprintf-js@1.0.3: 2329 | resolution: {integrity: sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==} 2330 | dev: true 2331 | 2332 | /stack-utils@2.0.6: 2333 | resolution: {integrity: sha512-XlkWvfIm6RmsWtNJx+uqtKLS8eqFbxUg0ZzLXqY0caEy9l7hruX8IpiDnjsLavoBgqCCR71TqWO8MaXYheJ3RQ==} 2334 | engines: {node: '>=10'} 2335 | dependencies: 2336 | escape-string-regexp: 2.0.0 2337 | dev: true 2338 | 2339 | /string-length@4.0.2: 2340 | resolution: {integrity: sha512-+l6rNN5fYHNhZZy41RXsYptCjA2Igmq4EG7kZAYFQI1E1VTXarr6ZPXBg6eq7Y6eK4FEhY6AJlyuFIb/v/S0VQ==} 2341 | engines: {node: '>=10'} 2342 | dependencies: 2343 | char-regex: 1.0.2 2344 | strip-ansi: 6.0.1 2345 | dev: true 2346 | 2347 | /string-width@4.2.3: 2348 | resolution: {integrity: sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==} 2349 | engines: {node: '>=8'} 2350 | dependencies: 2351 | emoji-regex: 8.0.0 2352 | is-fullwidth-code-point: 3.0.0 2353 | strip-ansi: 6.0.1 2354 | dev: true 2355 | 2356 | /strip-ansi@6.0.1: 2357 | resolution: {integrity: sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==} 2358 | engines: {node: '>=8'} 2359 | dependencies: 2360 | ansi-regex: 5.0.1 2361 | dev: true 2362 | 2363 | /strip-bom@4.0.0: 2364 | resolution: {integrity: sha512-3xurFv5tEgii33Zi8Jtp55wEIILR9eh34FAW00PZf+JnSsTmV/ioewSgQl97JHvgjoRGwPShsWm+IdrxB35d0w==} 2365 | engines: {node: '>=8'} 2366 | dev: true 2367 | 2368 | /strip-final-newline@2.0.0: 2369 | resolution: {integrity: sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==} 2370 | engines: {node: '>=6'} 2371 | dev: true 2372 | 2373 | /strip-json-comments@3.1.1: 2374 | resolution: {integrity: sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==} 2375 | engines: {node: '>=8'} 2376 | dev: true 2377 | 2378 | /supports-color@5.5.0: 2379 | resolution: {integrity: sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==} 2380 | engines: {node: '>=4'} 2381 | dependencies: 2382 | has-flag: 3.0.0 2383 | dev: true 2384 | 2385 | /supports-color@7.2.0: 2386 | resolution: {integrity: sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==} 2387 | engines: {node: '>=8'} 2388 | dependencies: 2389 | has-flag: 4.0.0 2390 | dev: true 2391 | 2392 | /supports-color@8.1.1: 2393 | resolution: {integrity: sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==} 2394 | engines: {node: '>=10'} 2395 | dependencies: 2396 | has-flag: 4.0.0 2397 | dev: true 2398 | 2399 | /supports-hyperlinks@2.3.0: 2400 | resolution: {integrity: sha512-RpsAZlpWcDwOPQA22aCH4J0t7L8JmAvsCxfOSEwm7cQs3LshN36QaTkwd70DnBOXDWGssw2eUoc8CaRWT0XunA==} 2401 | engines: {node: '>=8'} 2402 | dependencies: 2403 | has-flag: 4.0.0 2404 | supports-color: 7.2.0 2405 | dev: true 2406 | 2407 | /supports-preserve-symlinks-flag@1.0.0: 2408 | resolution: {integrity: sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==} 2409 | engines: {node: '>= 0.4'} 2410 | dev: true 2411 | 2412 | /symbol-tree@3.2.4: 2413 | resolution: {integrity: sha512-9QNk5KwDF+Bvz+PyObkmSYjI5ksVUYtjW7AU22r2NKcfLJcXp96hkDWU3+XndOsUb+AQ9QhfzfCT2O+CNWT5Tw==} 2414 | dev: true 2415 | 2416 | /terminal-link@2.1.1: 2417 | resolution: {integrity: sha512-un0FmiRUQNr5PJqy9kP7c40F5BOfpGlYTrxonDChEZB7pzZxRNp/bt+ymiy9/npwXya9KH99nJ/GXFIiUkYGFQ==} 2418 | engines: {node: '>=8'} 2419 | dependencies: 2420 | ansi-escapes: 4.3.2 2421 | supports-hyperlinks: 2.3.0 2422 | dev: true 2423 | 2424 | /test-exclude@6.0.0: 2425 | resolution: {integrity: sha512-cAGWPIyOHU6zlmg88jwm7VRyXnMN7iV68OGAbYDk/Mh/xC/pzVPlQtY6ngoIH/5/tciuhGfvESU8GrHrcxD56w==} 2426 | engines: {node: '>=8'} 2427 | dependencies: 2428 | '@istanbuljs/schema': 0.1.3 2429 | glob: 7.2.3 2430 | minimatch: 3.1.2 2431 | dev: true 2432 | 2433 | /throat@6.0.2: 2434 | resolution: {integrity: sha512-WKexMoJj3vEuK0yFEapj8y64V0A6xcuPuK9Gt1d0R+dzCSJc0lHqQytAbSB4cDAK0dWh4T0E2ETkoLE2WZ41OQ==} 2435 | dev: true 2436 | 2437 | /tmpl@1.0.5: 2438 | resolution: {integrity: sha512-3f0uOEAQwIqGuWW2MVzYg8fV/QNnc/IpuJNG837rLuczAaLVHslWHZQj4IGiEl5Hs3kkbhwL9Ab7Hrsmuj+Smw==} 2439 | dev: true 2440 | 2441 | /to-fast-properties@2.0.0: 2442 | resolution: {integrity: sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog==} 2443 | engines: {node: '>=4'} 2444 | dev: true 2445 | 2446 | /to-regex-range@5.0.1: 2447 | resolution: {integrity: sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==} 2448 | engines: {node: '>=8.0'} 2449 | dependencies: 2450 | is-number: 7.0.0 2451 | dev: true 2452 | 2453 | /tough-cookie@4.1.4: 2454 | resolution: {integrity: sha512-Loo5UUvLD9ScZ6jh8beX1T6sO1w2/MpCRpEP7V280GKMVUQ0Jzar2U3UJPsrdbziLEMMhu3Ujnq//rhiFuIeag==} 2455 | engines: {node: '>=6'} 2456 | dependencies: 2457 | psl: 1.9.0 2458 | punycode: 2.3.1 2459 | universalify: 0.2.0 2460 | url-parse: 1.5.10 2461 | dev: true 2462 | 2463 | /tr46@2.1.0: 2464 | resolution: {integrity: sha512-15Ih7phfcdP5YxqiB+iDtLoaTz4Nd35+IiAv0kQ5FNKHzXgdWqPoTIqEDDJmXceQt4JZk6lVPT8lnDlPpGDppw==} 2465 | engines: {node: '>=8'} 2466 | dependencies: 2467 | punycode: 2.3.1 2468 | dev: true 2469 | 2470 | /type-detect@4.0.8: 2471 | resolution: {integrity: sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g==} 2472 | engines: {node: '>=4'} 2473 | dev: true 2474 | 2475 | /type-fest@0.21.3: 2476 | resolution: {integrity: sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w==} 2477 | engines: {node: '>=10'} 2478 | dev: true 2479 | 2480 | /typedarray-to-buffer@3.1.5: 2481 | resolution: {integrity: sha512-zdu8XMNEDepKKR+XYOXAVPtWui0ly0NtohUscw+UmaHiAWT8hrV1rr//H6V+0DvJ3OQ19S979M0laLfX8rm82Q==} 2482 | dependencies: 2483 | is-typedarray: 1.0.0 2484 | dev: true 2485 | 2486 | /undici-types@6.19.8: 2487 | resolution: {integrity: sha512-ve2KP6f/JnbPBFyobGHuerC9g1FYGn/F8n1LWTwNxCEzd6IfqTwUQcNXgEtmmQ6DlRrC1hrSrBnCZPokRrDHjw==} 2488 | dev: true 2489 | 2490 | /universalify@0.2.0: 2491 | resolution: {integrity: sha512-CJ1QgKmNg3CwvAv/kOFmtnEN05f0D/cn9QntgNOQlQF9dgvVTHj3t+8JPdjqawCHk7V/KA+fbUqzZ9XWhcqPUg==} 2492 | engines: {node: '>= 4.0.0'} 2493 | dev: true 2494 | 2495 | /update-browserslist-db@1.1.1(browserslist@4.24.0): 2496 | resolution: {integrity: sha512-R8UzCaa9Az+38REPiJ1tXlImTJXlVfgHZsglwBD/k6nj76ctsH1E3q4doGrukiLQd3sGQYu56r5+lo5r94l29A==} 2497 | hasBin: true 2498 | peerDependencies: 2499 | browserslist: '>= 4.21.0' 2500 | dependencies: 2501 | browserslist: 4.24.0 2502 | escalade: 3.2.0 2503 | picocolors: 1.1.1 2504 | dev: true 2505 | 2506 | /url-parse@1.5.10: 2507 | resolution: {integrity: sha512-WypcfiRhfeUP9vvF0j6rw0J3hrWrw6iZv3+22h6iRMJ/8z1Tj6XfLP4DsUix5MhMPnXpiHDoKyoZ/bdCkwBCiQ==} 2508 | dependencies: 2509 | querystringify: 2.2.0 2510 | requires-port: 1.0.0 2511 | dev: true 2512 | 2513 | /v8-to-istanbul@8.1.1: 2514 | resolution: {integrity: sha512-FGtKtv3xIpR6BYhvgH8MI/y78oT7d8Au3ww4QIxymrCtZEh5b8gCw2siywE+puhEmuWKDtmfrvF5UlB298ut3w==} 2515 | engines: {node: '>=10.12.0'} 2516 | dependencies: 2517 | '@types/istanbul-lib-coverage': 2.0.6 2518 | convert-source-map: 1.9.0 2519 | source-map: 0.7.4 2520 | dev: true 2521 | 2522 | /w3c-hr-time@1.0.2: 2523 | resolution: {integrity: sha512-z8P5DvDNjKDoFIHK7q8r8lackT6l+jo/Ye3HOle7l9nICP9lf1Ci25fy9vHd0JOWewkIFzXIEig3TdKT7JQ5fQ==} 2524 | deprecated: Use your platform's native performance.now() and performance.timeOrigin. 2525 | dependencies: 2526 | browser-process-hrtime: 1.0.0 2527 | dev: true 2528 | 2529 | /w3c-xmlserializer@2.0.0: 2530 | resolution: {integrity: sha512-4tzD0mF8iSiMiNs30BiLO3EpfGLZUT2MSX/G+o7ZywDzliWQ3OPtTZ0PTC3B3ca1UAf4cJMHB+2Bf56EriJuRA==} 2531 | engines: {node: '>=10'} 2532 | dependencies: 2533 | xml-name-validator: 3.0.0 2534 | dev: true 2535 | 2536 | /walker@1.0.8: 2537 | resolution: {integrity: sha512-ts/8E8l5b7kY0vlWLewOkDXMmPdLcVV4GmOQLyxuSswIJsweeFZtAsMF7k1Nszz+TYBQrlYRmzOnr398y1JemQ==} 2538 | dependencies: 2539 | makeerror: 1.0.12 2540 | dev: true 2541 | 2542 | /webidl-conversions@5.0.0: 2543 | resolution: {integrity: sha512-VlZwKPCkYKxQgeSbH5EyngOmRp7Ww7I9rQLERETtf5ofd9pGeswWiOtogpEO850jziPRarreGxn5QIiTqpb2wA==} 2544 | engines: {node: '>=8'} 2545 | dev: true 2546 | 2547 | /webidl-conversions@6.1.0: 2548 | resolution: {integrity: sha512-qBIvFLGiBpLjfwmYAaHPXsn+ho5xZnGvyGvsarywGNc8VyQJUMHJ8OBKGGrPER0okBeMDaan4mNBlgBROxuI8w==} 2549 | engines: {node: '>=10.4'} 2550 | dev: true 2551 | 2552 | /whatwg-encoding@1.0.5: 2553 | resolution: {integrity: sha512-b5lim54JOPN9HtzvK9HFXvBma/rnfFeqsic0hSpjtDbVxR3dJKLc+KB4V6GgiGOvl7CY/KNh8rxSo9DKQrnUEw==} 2554 | dependencies: 2555 | iconv-lite: 0.4.24 2556 | dev: true 2557 | 2558 | /whatwg-mimetype@2.3.0: 2559 | resolution: {integrity: sha512-M4yMwr6mAnQz76TbJm914+gPpB/nCwvZbJU28cUD6dR004SAxDLOOSUaB1JDRqLtaOV/vi0IC5lEAGFgrjGv/g==} 2560 | dev: true 2561 | 2562 | /whatwg-url@8.7.0: 2563 | resolution: {integrity: sha512-gAojqb/m9Q8a5IV96E3fHJM70AzCkgt4uXYX2O7EmuyOnLrViCQlsEBmF9UQIu3/aeAIp2U17rtbpZWNntQqdg==} 2564 | engines: {node: '>=10'} 2565 | dependencies: 2566 | lodash: 4.17.21 2567 | tr46: 2.1.0 2568 | webidl-conversions: 6.1.0 2569 | dev: true 2570 | 2571 | /which@2.0.2: 2572 | resolution: {integrity: sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==} 2573 | engines: {node: '>= 8'} 2574 | hasBin: true 2575 | dependencies: 2576 | isexe: 2.0.0 2577 | dev: true 2578 | 2579 | /wrap-ansi@7.0.0: 2580 | resolution: {integrity: sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==} 2581 | engines: {node: '>=10'} 2582 | dependencies: 2583 | ansi-styles: 4.3.0 2584 | string-width: 4.2.3 2585 | strip-ansi: 6.0.1 2586 | dev: true 2587 | 2588 | /wrappy@1.0.2: 2589 | resolution: {integrity: sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==} 2590 | dev: true 2591 | 2592 | /write-file-atomic@3.0.3: 2593 | resolution: {integrity: sha512-AvHcyZ5JnSfq3ioSyjrBkH9yW4m7Ayk8/9My/DD9onKeu/94fwrMocemO2QAJFAlnnDN+ZDS+ZjAR5ua1/PV/Q==} 2594 | dependencies: 2595 | imurmurhash: 0.1.4 2596 | is-typedarray: 1.0.0 2597 | signal-exit: 3.0.7 2598 | typedarray-to-buffer: 3.1.5 2599 | dev: true 2600 | 2601 | /ws@7.5.10: 2602 | resolution: {integrity: sha512-+dbF1tHwZpXcbOJdVOkzLDxZP1ailvSxM6ZweXTegylPny803bFhA+vqBYw4s31NSAk4S2Qz+AKXK9a4wkdjcQ==} 2603 | engines: {node: '>=8.3.0'} 2604 | peerDependencies: 2605 | bufferutil: ^4.0.1 2606 | utf-8-validate: ^5.0.2 2607 | peerDependenciesMeta: 2608 | bufferutil: 2609 | optional: true 2610 | utf-8-validate: 2611 | optional: true 2612 | dev: true 2613 | 2614 | /xml-name-validator@3.0.0: 2615 | resolution: {integrity: sha512-A5CUptxDsvxKJEU3yO6DuWBSJz/qizqzJKOMIfUJHETbBw/sFaDxgd6fxm1ewUaM0jZ444Fc5vC5ROYurg/4Pw==} 2616 | dev: true 2617 | 2618 | /xmlchars@2.2.0: 2619 | resolution: {integrity: sha512-JZnDKK8B0RCDw84FNdDAIpZK+JuJw+s7Lz8nksI7SIuU3UXJJslUthsi+uWBUYOwPFwW7W7PRLRfUKpxjtjFCw==} 2620 | dev: true 2621 | 2622 | /y18n@5.0.8: 2623 | resolution: {integrity: sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==} 2624 | engines: {node: '>=10'} 2625 | dev: true 2626 | 2627 | /yallist@3.1.1: 2628 | resolution: {integrity: sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==} 2629 | dev: true 2630 | 2631 | /yargs-parser@20.2.9: 2632 | resolution: {integrity: sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w==} 2633 | engines: {node: '>=10'} 2634 | dev: true 2635 | 2636 | /yargs@16.2.0: 2637 | resolution: {integrity: sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw==} 2638 | engines: {node: '>=10'} 2639 | dependencies: 2640 | cliui: 7.0.4 2641 | escalade: 3.2.0 2642 | get-caller-file: 2.0.5 2643 | require-directory: 2.1.1 2644 | string-width: 4.2.3 2645 | y18n: 5.0.8 2646 | yargs-parser: 20.2.9 2647 | dev: true 2648 | -------------------------------------------------------------------------------- /rescript/rescript.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "res-tailwindcss-test", 3 | "sources": [ 4 | { 5 | "dir": "__tests__", 6 | "type": "dev" 7 | }, 8 | { 9 | "dir": "src" 10 | } 11 | ], 12 | "package-specs": [ 13 | { 14 | "module": "commonjs", 15 | "in-source": true 16 | } 17 | ], 18 | "bs-dependencies": [], 19 | "bs-dev-dependencies": [ 20 | "@glennsl/rescript-jest" 21 | ], 22 | "ppx-flags": [ 23 | [ 24 | "../ppx", 25 | "--path ./css/tailwind.css" 26 | ] 27 | ], 28 | "warnings": { 29 | "error": true, 30 | "number": "-48" 31 | }, 32 | "generators": [], 33 | "bsc-flags": [ 34 | "-bs-super-errors" 35 | ] 36 | } -------------------------------------------------------------------------------- /rescript/src/View.js: -------------------------------------------------------------------------------- 1 | // Generated by ReScript, PLEASE EDIT WITH CARE 2 | 'use strict'; 3 | 4 | 5 | var header = "py-1.5"; 6 | 7 | var header2 = "divide-y"; 8 | 9 | var header3 = "xl:min-w-1/5"; 10 | 11 | var header4 = "focus:outline-none"; 12 | 13 | var header5 = "w-[100%]"; 14 | 15 | var header6 = "w-[calc(100%-40px)]"; 16 | 17 | var header7 = "translate-x-[calc(-50%+27px)]"; 18 | 19 | var header8 = "!pb-[270px]"; 20 | 21 | var header9 = "translate-x-2/4"; 22 | 23 | var header10 = "before:content-['']"; 24 | 25 | var header11 = "peer-checked:[&>svg]:rotate-180"; 26 | 27 | var header12 = "[&_a]:tw-mt-4"; 28 | 29 | exports.header = header; 30 | exports.header2 = header2; 31 | exports.header3 = header3; 32 | exports.header4 = header4; 33 | exports.header5 = header5; 34 | exports.header6 = header6; 35 | exports.header7 = header7; 36 | exports.header8 = header8; 37 | exports.header9 = header9; 38 | exports.header10 = header10; 39 | exports.header11 = header11; 40 | exports.header12 = header12; 41 | /* No side effect */ 42 | -------------------------------------------------------------------------------- /rescript/src/View.res: -------------------------------------------------------------------------------- 1 | let header = %twc("py-1.5") 2 | let header2 = %twc("divide-y") 3 | let header3 = %twc("xl:min-w-1/5") 4 | let header4 = %twc("focus:outline-none") 5 | let header5 = %twc("w-[100%]") 6 | let header6 = %twc("w-[calc(100%-40px)]") 7 | let header7 = %twc("translate-x-[calc(-50%+27px)]") 8 | let header8 = %twc("!pb-[270px]") 9 | let header9 = %twc("translate-x-2/4") 10 | let header10 = %twc("before:content-['']") 11 | let header11 = %twc("peer-checked:[&>svg]:rotate-180") 12 | let header12 = %twc("[&_a]:tw-mt-4") 13 | -------------------------------------------------------------------------------- /src/configs.ml: -------------------------------------------------------------------------------- 1 | (* default tailwindcss path *) 2 | let tailwindcss_path = ref "./tailwind.css" 3 | let set_tailwindcss_path path = tailwindcss_path := path 4 | let get_tailwindcss_path () = tailwindcss_path 5 | -------------------------------------------------------------------------------- /src/dune: -------------------------------------------------------------------------------- 1 | (menhir 2 | (modules parser)) 3 | 4 | (ocamllex lexer) 5 | 6 | (library 7 | (inline_tests 8 | (deps "tailwind.css")) 9 | (name res_tailwindcss) 10 | (public_name res_tailwindcss) 11 | (kind ppx_rewriter) 12 | (libraries base stdio ppxlib str) 13 | (flags 14 | (:standard -w -9)) 15 | ; 9 = labels not bound in record pattern 16 | (preprocess 17 | (pps ppxlib.metaquot ppx_inline_test ppx_expect ppx_deriving.show))) 18 | -------------------------------------------------------------------------------- /src/lexer.mll: -------------------------------------------------------------------------------- 1 | { 2 | open Base 3 | open Lexing 4 | open Parser 5 | 6 | exception SyntaxError of string 7 | 8 | let move_backward lexbuf n = 9 | let lcp = lexbuf.lex_curr_p in 10 | (* not sure how to move cursor of lexer engine backward *) 11 | lexbuf.lex_curr_pos <- lexbuf.lex_curr_pos - n; 12 | lexbuf.lex_curr_p <- 13 | { lcp with 14 | pos_cnum = lcp.pos_cnum - n; 15 | } 16 | } 17 | 18 | let white = [' ' '\t']+ 19 | let newline = '\r' | '\n' | "\r\n" 20 | let digit = ['0'-'9'] 21 | 22 | let l_comment = "/*" 23 | let r_comment = "*/" 24 | 25 | let dot = '.' 26 | let l_arbitrary_value = "\\[" 27 | let r_arbitrary_value = "\\]" 28 | let arbitrary_value_comma = "\\2c " 29 | let arbitrary_value_sharp = "\\#" 30 | let arbitrary_value_important = "\\!" 31 | let tailwindcss_pseudo_class = "\\:" 32 | let tailwindcss_dot = "\\." 33 | let tailwindcss_frac = "\\/" 34 | let tailwindcss_l_paren = "\\(" 35 | let tailwindcss_r_paren = "\\)" 36 | let tailwindcss_percentage = "\\%" 37 | let tailwindcss_plus = "\\+" 38 | let tailwindcss_minus = "\\-" 39 | let tailwindcss_single_quotation = "\\'" 40 | let tailwindcss_self_selector = "\\&" 41 | let tailwindcss_child_selector = "\\>" 42 | 43 | let pseudo_class = ':' 44 | let pseudo_element = "::" 45 | let l_attribute_selector = '[' 46 | let comma = ',' 47 | let end_of_class = comma | pseudo_class | pseudo_element | l_attribute_selector | dot | newline | '>' | '{' | white 48 | 49 | rule read = 50 | parse 51 | | white { read lexbuf } 52 | | newline { new_line lexbuf; read lexbuf } 53 | | l_comment { read_comment lexbuf} 54 | | dot { read_class (Buffer.create 17) lexbuf } 55 | | _ { read lexbuf } 56 | | eof { EOF } 57 | 58 | and read_comment = 59 | parse 60 | | r_comment { read lexbuf } 61 | | _ { read_comment lexbuf } 62 | | newline { new_line lexbuf; read_comment lexbuf } 63 | | eof { EOF } 64 | 65 | and read_class buf = 66 | parse 67 | | end_of_class { CLASS (Buffer.contents buf |> String.strip) } 68 | | digit 69 | (* if the first char following dot is a number, it is not valid class name. 70 | if the string length of Buffer is 0, this lexeme is the first char following dot.*) 71 | { if Buffer.contents buf |> String.length > 0 then 72 | (Buffer.add_string buf (Lexing.lexeme lexbuf); read_class buf lexbuf) 73 | else read lexbuf } 74 | | l_arbitrary_value { Buffer.add_string buf "["; read_class buf lexbuf } 75 | | r_arbitrary_value { Buffer.add_string buf "]"; read_class buf lexbuf } 76 | | arbitrary_value_comma { Buffer.add_string buf ","; read_class buf lexbuf } 77 | | arbitrary_value_sharp { Buffer.add_string buf "#"; read_class buf lexbuf } 78 | | arbitrary_value_important { Buffer.add_string buf "!"; read_class buf lexbuf } 79 | | tailwindcss_pseudo_class { Buffer.add_string buf ":"; read_class buf lexbuf } 80 | | tailwindcss_dot { Buffer.add_string buf "."; read_class buf lexbuf } 81 | | tailwindcss_frac { Buffer.add_string buf "/"; read_class buf lexbuf } 82 | | tailwindcss_l_paren { Buffer.add_string buf "("; read_class buf lexbuf } 83 | | tailwindcss_r_paren { Buffer.add_string buf ")"; read_class buf lexbuf } 84 | | tailwindcss_percentage { Buffer.add_string buf "%"; read_class buf lexbuf } 85 | | tailwindcss_plus { Buffer.add_string buf "+"; read_class buf lexbuf } 86 | | tailwindcss_minus { Buffer.add_string buf "-"; read_class buf lexbuf } 87 | | tailwindcss_self_selector { Buffer.add_string buf "&"; read_class buf lexbuf } 88 | | tailwindcss_child_selector { Buffer.add_string buf ">"; read_class buf lexbuf } 89 | | tailwindcss_single_quotation { Buffer.add_string buf "'"; read_class buf lexbuf } 90 | | _ { Buffer.add_string buf (Lexing.lexeme lexbuf); read_class buf lexbuf } 91 | | eof { EOF } 92 | 93 | -------------------------------------------------------------------------------- /src/parser.mly: -------------------------------------------------------------------------------- 1 | %{ open Types %} 2 | 3 | %token CLASS 4 | %token EOF 5 | 6 | %start prog 7 | %% 8 | 9 | prog: 10 | | s = selector { Some s } 11 | | EOF { None } ; 12 | 13 | selector: 14 | | c = CLASS { Class c } 15 | -------------------------------------------------------------------------------- /src/prelude.ml: -------------------------------------------------------------------------------- 1 | open Base 2 | 3 | module List = struct 4 | include List 5 | 6 | let sequence_opt xs = 7 | xs 8 | |> List.fold ~init:(Some []) ~f:(fun ys x -> 9 | match (ys, x) with 10 | | Some ys', Some x' -> Some (ys' @ [ x' ]) 11 | | None, _ -> None 12 | | Some _, None -> None) 13 | end 14 | 15 | module String = struct 16 | include String 17 | 18 | let string_to_chars s = List.init (String.length s) ~f:(String.get s) 19 | end 20 | -------------------------------------------------------------------------------- /src/res_tailwindcss.ml: -------------------------------------------------------------------------------- 1 | module Expansion_context = Ppxlib.Expansion_context 2 | module Ast_builder = Ppxlib.Ast_builder 3 | module Ast_pattern = Ppxlib.Ast_pattern 4 | module Extension = Ppxlib.Extension 5 | open Lexing 6 | open Base 7 | open Util 8 | open Spelling_corrector 9 | 10 | module Parser = struct 11 | let print_position outx lexbuf = 12 | let pos = lexbuf.lex_curr_p in 13 | Caml.Format.fprintf outx "%s:%d:%d" pos.pos_fname pos.pos_lnum 14 | (pos.pos_cnum - pos.pos_bol + 1) 15 | 16 | let parse_with_error lexbuf = 17 | try Parser.prog Lexer.read lexbuf with 18 | | Lexer.SyntaxError msg -> 19 | Caml.Format.fprintf Caml.Format.err_formatter "%a: %s\n" print_position 20 | lexbuf msg; 21 | Caml.exit (-1) 22 | | Parser.Error -> 23 | Caml.Format.fprintf Caml.Format.err_formatter "%a: syntax error\n" 24 | print_position lexbuf; 25 | Caml.exit (-1) 26 | 27 | let rec run lexbuf tailwindcss = 28 | match parse_with_error lexbuf with 29 | | Some (Class value) -> 30 | make_words tailwindcss value; 31 | run lexbuf tailwindcss 32 | | None -> tailwindcss 33 | end 34 | 35 | let loop filename classnames ~loc = 36 | let inx = Stdio.In_channel.create filename in 37 | let lexbuf = Lexing.from_channel inx in 38 | set_filename lexbuf filename; 39 | 40 | let init_words = init_words ~size:1000 in 41 | let tailwind_classnames = Parser.run lexbuf init_words in 42 | 43 | let is_valid = 44 | classnames |> List.for_all ~f:(Hashtbl.mem tailwind_classnames) 45 | in 46 | if is_valid then Stdio.In_channel.close inx 47 | else 48 | let not_found = 49 | classnames 50 | |> List.find_exn ~f:(fun c -> not (Hashtbl.mem tailwind_classnames c)) 51 | in 52 | let corrected = 53 | Spelling_corrector.correction tailwind_classnames not_found 54 | in 55 | let _ = 56 | (* if corrected is same to not found classname, this means we can not find the suggestion *) 57 | if String.equal not_found corrected then 58 | Location.raise_errorf ~loc "Class name not found: %s" not_found 59 | else 60 | Location.raise_errorf ~loc "Class name not found: %s, do you mean %s?" 61 | not_found corrected 62 | in 63 | Stdio.In_channel.close inx 64 | 65 | let expand ~ctxt label = 66 | let loc = Expansion_context.Extension.extension_point_loc ctxt in 67 | let stripped_label = String.strip label in 68 | (* if label is emtpy string then pass it *) 69 | if String.length stripped_label = 0 then 70 | Ast_builder.Default.estring ~loc label 71 | else 72 | let classnames = stripped_label |> Str.split (Str.regexp "[ \t]+") in 73 | let project_root = find_project_root @@ Stdlib.Sys.getcwd () in 74 | match project_root with 75 | | Ok project_root' -> 76 | let tailwindcss_path = 77 | Stdlib.Filename.concat project_root' 78 | !(Configs.get_tailwindcss_path ()) 79 | in 80 | loop tailwindcss_path classnames ~loc; 81 | Ast_builder.Default.estring ~loc label 82 | | Error msg -> 83 | Stdlib.Format.fprintf Stdlib.Format.err_formatter "%s\n" msg; 84 | Caml.exit (-1) 85 | 86 | let extension = 87 | Extension.V3.declare "twc" Extension.Context.expression 88 | Ast_pattern.(single_expr_payload (estring __)) 89 | expand 90 | 91 | let rule = Ppxlib.Context_free.Rule.extension extension 92 | 93 | (** Add command line arg "--path" to get a path of tailwindcss file *) 94 | let _ = 95 | Ppxlib.Driver.add_arg "--path" 96 | (Caml.Arg.String 97 | (fun tailwind_path -> Configs.set_tailwindcss_path tailwind_path)) 98 | ~doc:"" 99 | 100 | let () = Ppxlib.Driver.register_transformation ~rules:[ rule ] "res_tailwindcss" 101 | -------------------------------------------------------------------------------- /src/spelling_corrector.ml: -------------------------------------------------------------------------------- 1 | (* Spelling Corrector 2 | https://norvig.com/spell-correct.html *) 3 | open Base 4 | module StringSet = Stdlib.Set.Make (String) 5 | 6 | let letters = 7 | (* append digits and slash(/) in order to correct more accurately *) 8 | String.to_list "abcdefghijklmnopqrstuvwxyz0123456789/" 9 | |> List.map ~f:(fun x -> Char.to_string x) 10 | 11 | let init_words ~size = Hashtbl.create ~growth_allowed:true ~size (module String) 12 | 13 | let make_words words value = 14 | let freq = Hashtbl.find words value in 15 | match freq with 16 | | Some freq' -> Hashtbl.set words ~key:value ~data:(freq' + 1) 17 | | None -> Hashtbl.set words ~key:value ~data:1 18 | 19 | let splits word = 20 | let length = String.length word in 21 | let rec loop index acc = 22 | if index > length then acc 23 | else 24 | let lword = String.sub word ~pos:0 ~len:index in 25 | let rword = String.sub word ~pos:index ~len:(length - index) in 26 | loop (index + 1) ((lword, rword) :: acc) 27 | in 28 | loop 0 [] 29 | 30 | let deletes splits = 31 | splits 32 | |> List.filter_map ~f:(fun x -> 33 | let lword, rword = x in 34 | if String.length rword > 0 then 35 | Some (lword ^ String.drop_prefix rword 1) 36 | else None) 37 | 38 | let transposes splits = 39 | let get_char_to_string s index = String.get s index |> Char.to_string in 40 | splits 41 | |> List.filter_map ~f:(fun x -> 42 | let lword, rword = x in 43 | if String.length rword > 1 then 44 | Some 45 | (lword ^ get_char_to_string rword 1 ^ get_char_to_string rword 0 46 | ^ String.drop_prefix rword 2) 47 | else None) 48 | 49 | let replaces letters splits = 50 | splits 51 | |> List.filter_map ~f:(fun s -> 52 | let lword, rword = s in 53 | if String.length rword > 0 then 54 | Some 55 | (letters 56 | |> List.map ~f:(fun l -> lword ^ l ^ String.drop_prefix rword 1)) 57 | else None) 58 | |> List.concat 59 | 60 | let inserts letters splits = 61 | splits 62 | |> List.map ~f:(fun s -> 63 | let lword, rword = s in 64 | letters |> List.map ~f:(fun l -> lword ^ l ^ rword)) 65 | |> List.concat 66 | 67 | let edit1 word = 68 | let splited = splits word in 69 | let deleted = deletes splited in 70 | let transposed = transposes splited in 71 | let replaced = replaces letters splited in 72 | let inserted = inserts letters splited in 73 | let candidates = deleted @ transposed @ replaced @ inserted in 74 | List.fold_left candidates ~init:StringSet.empty ~f:(fun set s -> 75 | StringSet.add s set) 76 | |> StringSet.elements 77 | 78 | let edit2 word = 79 | let edit1s = edit1 word in 80 | let edit2s = List.map ~f:(fun s -> edit1 s) edit1s |> List.concat in 81 | edit1s @ edit2s 82 | 83 | let known words ws = 84 | ws 85 | |> List.filter ~f:(fun w -> Hashtbl.mem words w) 86 | |> List.fold_left ~init:StringSet.empty ~f:(fun set s -> StringSet.add s set) 87 | |> StringSet.elements 88 | 89 | let candidates words word = 90 | let known1 = known words [ word ] in 91 | if List.length known1 > 0 then known1 92 | else 93 | let known2 = known words (edit1 word) in 94 | if List.length known2 > 0 then known2 else known words (edit2 word) 95 | 96 | let correction words word = 97 | let candidates = candidates words word in 98 | let sorted_candidates = 99 | List.sort candidates ~compare:(fun a b -> 100 | let a' = Hashtbl.find words a in 101 | let b' = Hashtbl.find words b in 102 | match (a', b') with 103 | | Some a'', Some b'' -> b'' - a'' 104 | | Some _, None -> -1 105 | | None, Some _ -> 1 106 | | None, None -> 0) 107 | in 108 | if List.length sorted_candidates > 0 then List.hd_exn sorted_candidates 109 | else word 110 | -------------------------------------------------------------------------------- /src/types.ml: -------------------------------------------------------------------------------- 1 | type selector = Class of string 2 | [@@deriving show] -------------------------------------------------------------------------------- /src/util.ml: -------------------------------------------------------------------------------- 1 | let rec find_project_root dir = 2 | let bsconfig = "bsconfig.json" in 3 | let rescript = "rescript.json" in 4 | match (Filename.concat dir bsconfig |> Sys.file_exists) || 5 | (Filename.concat dir rescript |> Sys.file_exists) with 6 | | true -> Ok dir 7 | | false -> 8 | let parent = dir |> Filename.dirname in 9 | if String.equal parent dir then Error "can't find the project root" 10 | else find_project_root parent 11 | --------------------------------------------------------------------------------