├── .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 |
--------------------------------------------------------------------------------