├── .assets
├── use-0-white.svg
└── use-0.svg
├── .eslintrc.js
├── .github
└── workflows
│ └── main.yml
├── .gitignore
├── .npmignore
├── LICENSE
├── README.md
├── docs
├── .eslintrc.js
├── .github
│ └── screenshot.png
├── .gitignore
├── LICENSE
├── README.md
├── components
│ ├── RebloomLogo.tsx
│ ├── counters.module.css
│ ├── counters.tsx
│ └── examples
│ │ ├── GetListenExample.tsx
│ │ └── GetUseExample.tsx
├── globals.css
├── next-env.d.ts
├── next.config.js
├── package-lock.json
├── package.json
├── pages
│ ├── _app.tsx
│ ├── _meta.json
│ ├── about.mdx
│ ├── advanced.mdx
│ ├── advanced
│ │ └── satori.mdx
│ ├── another.mdx
│ ├── guides
│ │ ├── async-requests.mdx
│ │ ├── cross-linked.mdx
│ │ ├── entity-based.mdx
│ │ └── hooks.mdx
│ ├── index.mdx
│ ├── rebloom-api.mdx
│ ├── rebloom-api
│ │ ├── create-record.mdx
│ │ ├── get-listen.mdx
│ │ └── get-use.mdx
│ └── static-class.mdx
├── postcss.config.js
├── tailwind.config.js
├── theme.config.tsx
└── tsconfig.json
├── package-lock.json
├── package.json
├── src
├── changeMap.ts
├── createRecord.ts
├── getListen.ts
├── getUse.ts
├── index.ts
├── listenOne.ts
├── symbols.ts
└── types.ts
├── test
├── createRecord.test.ts
├── getListen.test.ts
├── getUse.test.ts
├── index.ts
├── listenOne.test.ts
└── post-publish.cjs
├── tsconfig.eslint.json
└── tsconfig.json
/.assets/use-0-white.svg:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
--------------------------------------------------------------------------------
/.assets/use-0.svg:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
--------------------------------------------------------------------------------
/.eslintrc.js:
--------------------------------------------------------------------------------
1 | module.exports = {
2 | ignorePatterns: ['dist/*', 'docs/*'], // disable docs temporarily
3 | extends: [
4 | 'airbnb',
5 | 'airbnb-typescript',
6 | 'airbnb/hooks',
7 | 'plugin:@typescript-eslint/recommended',
8 | 'plugin:@typescript-eslint/recommended-requiring-type-checking',
9 | ],
10 | rules: {
11 | 'max-len': ['error', { code: 120 }],
12 | 'import/prefer-default-export': 'off',
13 | 'react-hooks/rules-of-hooks': 'off',
14 | 'no-restricted-syntax': 'off',
15 | 'max-len': 'off',
16 | },
17 | parserOptions: {
18 | ecmaVersion: 2020,
19 | sourceType: 'module',
20 | project: './tsconfig.eslint.json',
21 | // eslint-disable-next-line @typescript-eslint/no-unsafe-assignment
22 | tsconfigRootDir: __dirname,
23 | createDefaultProgram: true,
24 | },
25 | };
26 |
--------------------------------------------------------------------------------
/.github/workflows/main.yml:
--------------------------------------------------------------------------------
1 | # This is a basic workflow to help you get started with Actions
2 |
3 | name: CI
4 |
5 | # Controls when the action will run.
6 | on:
7 | # Triggers the workflow on push or pull request events but only for the main branch
8 | push:
9 | branches: [ main ]
10 | pull_request:
11 | branches: [ main ]
12 |
13 | # Allows you to run this workflow manually from the Actions tab
14 | workflow_dispatch:
15 |
16 | # A workflow run is made up of one or more jobs that can run sequentially or in parallel
17 | jobs:
18 | # This workflow contains a single job called "build"
19 | test:
20 | # The type of runner that the job will run on
21 | runs-on: ubuntu-latest
22 |
23 | # Steps represent a sequence of tasks that will be executed as part of the job
24 | steps:
25 | # Checks-out your repository under $GITHUB_WORKSPACE, so your job can access it
26 | - uses: actions/checkout@v2
27 |
28 | - name: Setup Node.js environment
29 | uses: actions/setup-node@v2.1.5
30 |
31 | - name: Install deps
32 | run: npm ci --legacy-peer-deps
33 |
34 | - name: Test
35 | run: npm t
36 |
--------------------------------------------------------------------------------
/.gitignore:
--------------------------------------------------------------------------------
1 | # Logs
2 | logs
3 | *.log
4 | npm-debug.log*
5 | yarn-debug.log*
6 | yarn-error.log*
7 | lerna-debug.log*
8 |
9 | # Diagnostic reports (https://nodejs.org/api/report.html)
10 | report.[0-9]*.[0-9]*.[0-9]*.[0-9]*.json
11 |
12 | # Runtime data
13 | pids
14 | *.pid
15 | *.seed
16 | *.pid.lock
17 |
18 | # Directory for instrumented libs generated by jscoverage/JSCover
19 | lib-cov
20 |
21 | # Coverage directory used by tools like istanbul
22 | coverage
23 | *.lcov
24 |
25 | # nyc test coverage
26 | .nyc_output
27 |
28 | # Grunt intermediate storage (https://gruntjs.com/creating-plugins#storing-task-files)
29 | .grunt
30 |
31 | # Bower dependency directory (https://bower.io/)
32 | bower_components
33 |
34 | # node-waf configuration
35 | .lock-wscript
36 |
37 | .DS_Store
38 |
39 | # Compiled binary addons (https://nodejs.org/api/addons.html)
40 | build/Release
41 |
42 | # Dependency directories
43 | node_modules/
44 | jspm_packages/
45 |
46 | # TypeScript v1 declaration files
47 | typings/
48 |
49 | # TypeScript cache
50 | *.tsbuildinfo
51 |
52 | # Optional npm cache directory
53 | .npm
54 |
55 | # Optional eslint cache
56 | .eslintcache
57 |
58 | # Microbundle cache
59 | .rpt2_cache/
60 | .rts2_cache_cjs/
61 | .rts2_cache_es/
62 | .rts2_cache_umd/
63 |
64 | # Optional REPL history
65 | .node_repl_history
66 |
67 | # Output of 'npm pack'
68 | *.tgz
69 |
70 | # Yarn Integrity file
71 | .yarn-integrity
72 |
73 | # dotenv environment variables file
74 | .env
75 | .env.test
76 |
77 | # parcel-bundler cache (https://parceljs.org/)
78 | .cache
79 |
80 | # Next.js build output
81 | .next
82 |
83 | # Nuxt.js build / generate output
84 | .nuxt
85 | dist
86 |
87 | # Gatsby files
88 | .cache/
89 | # Comment in the public line in if your project uses Gatsby and *not* Next.js
90 | # https://nextjs.org/blog/next-9-1#public-directory-support
91 | # public
92 |
93 | # vuepress build output
94 | .vuepress/dist
95 |
96 | # Serverless directories
97 | .serverless/
98 |
99 | # FuseBox cache
100 | .fusebox/
101 |
102 | # DynamoDB Local files
103 | .dynamodb/
104 |
105 | # TernJS port file
106 | .tern-port
107 |
108 | # Etc
109 | .DS_Stor
--------------------------------------------------------------------------------
/.npmignore:
--------------------------------------------------------------------------------
1 | .assets
2 | src
3 | test
4 | post-publish-test
5 | .github
6 | .eslintrc.js
7 | tsconfig.json
8 | tsconfig.eslint.json
--------------------------------------------------------------------------------
/LICENSE:
--------------------------------------------------------------------------------
1 | MIT License
2 |
3 | Copyright (c) 2021-present Andrii Gubanov
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 | # 🌼 rebloom (WIP)
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 | **rebloom** exports the `getUse` function that turns any object into a use-able object whose properties are listened to by the `use` property hook inside React components.
11 |
12 | ```ts
13 | // appState.ts
14 | import { getUse } from 'rebloom';
15 |
16 | class AppState {
17 | // define "use"
18 | readonly use = getUse();
19 |
20 | // define other properties
21 | count = 0;
22 | ids: number[] = [];
23 |
24 | // define methods
25 | readonly increment = () => this.count++;
26 | readonly decrement = () => this.count--;
27 | }
28 |
29 | // instantiate the class and export the instance
30 | const appState = new AppState();
31 |
32 | export default appState;
33 | ```
34 |
35 | ```ts
36 | // MyComponent.ts
37 | import appState from './appState';
38 |
39 | const MyComponent = () => {
40 | // the component is re-rendered when 'count' or 'ids' are reassigned
41 | const count = appState.use('count');
42 | const ids = appState.use('ids');
43 |
44 | return (
45 | appState.count++}>Clicks: {count}
46 | )
47 | }
48 |
49 | export default MyComponent;
50 | ```
51 |
52 | A use-able object is a regular object, and all its properties and methods are used in the traditional way. Properties need to maintain immutability to invoke the [property accessor](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/defineProperty). The `readonly` prefix protects properties from being reassigned.
53 |
54 |
55 | ```ts
56 | appState.count++;
57 | appState.ids = [...state.users.ids, 4];
58 | appState.increment();
59 | appState.increment = () => {}; // error because of the "readonly" prefix
60 | ```
61 |
62 | ## Other ways to invoke
63 |
64 | ### Plain object
65 |
66 | ```ts
67 | // appState.ts
68 | import { type WithUse, getUse } from 'rebloom';
69 |
70 | type AppState = WithUse<{
71 | count: number;
72 | ids: number[];
73 | }>;
74 |
75 | const appState: AppState = {
76 | use: getUse(),
77 | count: 0,
78 | ids: [],
79 | }
80 | ```
81 |
82 | ### Static class
83 |
84 | Use the same principle as with an instantiable class, but all class members are defined with the `static` prefix, and the class isn't instantiated but used directly as an object.
85 |
86 |
87 | ```ts
88 | // appState.ts
89 | import { getUse } from 'rebloom';
90 |
91 | export default class AppState {
92 | // define "use"
93 | static readonly use = getUse();
94 |
95 | // define other properties
96 | static count = 0;
97 | static ids: number[] = [];
98 |
99 | // define methods
100 | static readonly increment = () => this.count++;
101 | static readonly decrement = () => this.count--;
102 | }
103 | ```
104 |
105 | ```ts
106 | // MyComponent.ts
107 | import AppState from './appState';
108 |
109 | const MyComponent = () => {
110 | const count = AppState.use('count');
111 | const ids = AppState.use('ids');
112 |
113 | return (
114 | AppState.count++}>Clicks: {count}
115 | )
116 | }
117 |
118 | export default MyComponent;
119 | ```
120 |
121 | That's not it. More docs are coming soon.
122 |
--------------------------------------------------------------------------------
/docs/.eslintrc.js:
--------------------------------------------------------------------------------
1 | module.exports = {
2 | extends: '../.eslintrc.js'
3 | }
--------------------------------------------------------------------------------
/docs/.github/screenshot.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/finom/rebloom/a71ed77da5721cc58b996d2a84a6eea3e807378a/docs/.github/screenshot.png
--------------------------------------------------------------------------------
/docs/.gitignore:
--------------------------------------------------------------------------------
1 | .next
2 | node_modules
3 |
--------------------------------------------------------------------------------
/docs/LICENSE:
--------------------------------------------------------------------------------
1 | MIT License
2 |
3 | Copyright (c) 2022 Shu Ding
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 |
--------------------------------------------------------------------------------
/docs/README.md:
--------------------------------------------------------------------------------
1 | # Nextra Docs Template
2 |
3 | This is a template for creating documentation with [Nextra](https://nextra.site).
4 |
5 | [**Live Demo →**](https://nextra-docs-template.vercel.app)
6 |
7 | [](https://nextra-docs-template.vercel.app)
8 |
9 | ## Quick Start
10 |
11 | Click the button to clone this repository and deploy it on Vercel:
12 |
13 | [](https://vercel.com/new/clone?s=https%3A%2F%2Fgithub.com%2Fshuding%2Fnextra-docs-template&showOptionalTeamCreation=false)
14 |
15 | ## Local Development
16 |
17 | First, run `pnpm i` to install the dependencies.
18 |
19 | Then, run `pnpm dev` to start the development server and visit localhost:3000.
20 |
21 | ## License
22 |
23 | This project is licensed under the MIT License.
24 |
--------------------------------------------------------------------------------
/docs/components/RebloomLogo.tsx:
--------------------------------------------------------------------------------
1 | const RebloomLogo = ({ className }: { className?: string }) => {
2 | return
3 | 🌼 rebloom
4 |
5 | }
6 |
7 | export default RebloomLogo
--------------------------------------------------------------------------------
/docs/components/counters.module.css:
--------------------------------------------------------------------------------
1 | .counter {
2 | border: 1px solid #ccc;
3 | border-radius: 5px;
4 | padding: 2px 6px;
5 | margin: 12px 0 0;
6 | }
7 |
--------------------------------------------------------------------------------
/docs/components/counters.tsx:
--------------------------------------------------------------------------------
1 | // Example from https://beta.reactjs.org/learn
2 |
3 | import { useState } from 'react'
4 | import styles from './counters.module.css'
5 |
6 | function MyButton() {
7 | const [count, setCount] = useState(0)
8 |
9 | function handleClick() {
10 | setCount(count + 1)
11 | }
12 |
13 | return (
14 |
15 |
16 | Clicked {count} times
17 |
18 |
19 | )
20 | }
21 |
22 | export default function MyApp() {
23 | return
24 | }
25 |
--------------------------------------------------------------------------------
/docs/components/examples/GetListenExample.tsx:
--------------------------------------------------------------------------------
1 | import { init } from "next/dist/compiled/webpack/webpack";
2 | import { getListen, getUse } from "rebloom"
3 |
4 | abstract class HelloExample {
5 | static use = getUse();
6 |
7 | static listen = getListen();
8 |
9 | static count = 0;
10 |
11 | static init() {
12 | this.listen('count', (count) => {
13 | alert(count);
14 | });
15 | }
16 | }
17 |
18 | HelloExample.init();
19 |
20 | const GetListenExample = () => {
21 | const count = HelloExample.use('count');
22 |
23 | return (
24 | HelloExample.count += 1}>
25 | Click me {count}
26 |
27 | )
28 | }
29 |
30 | export default GetListenExample
--------------------------------------------------------------------------------
/docs/components/examples/GetUseExample.tsx:
--------------------------------------------------------------------------------
1 | import { getListen, getUse } from "rebloom"
2 |
3 | class HelloExample {
4 | static use = getUse();
5 |
6 | static listen = getListen();
7 |
8 | static count = 0;
9 | }
10 |
11 | const GetUseExample = () => {
12 | const count = HelloExample.use('count');
13 |
14 | return (
15 | HelloExample.count += 1}>
16 | Click me {count}
17 |
18 | )
19 | }
20 |
21 | export default GetUseExample
--------------------------------------------------------------------------------
/docs/globals.css:
--------------------------------------------------------------------------------
1 | @tailwind base;
2 | @tailwind components;
3 | @tailwind utilities;
4 |
5 |
--------------------------------------------------------------------------------
/docs/next-env.d.ts:
--------------------------------------------------------------------------------
1 | ///
2 | ///
3 |
4 | // NOTE: This file should not be edited
5 | // see https://nextjs.org/docs/basic-features/typescript for more information.
6 |
--------------------------------------------------------------------------------
/docs/next.config.js:
--------------------------------------------------------------------------------
1 | const withNextra = require('nextra')({
2 | theme: 'nextra-theme-docs',
3 | themeConfig: './theme.config.tsx',
4 | })
5 |
6 | module.exports = withNextra()
7 |
--------------------------------------------------------------------------------
/docs/package.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "nextra-docs-template",
3 | "version": "0.0.1",
4 | "description": "Nextra docs template",
5 | "scripts": {
6 | "dev": "next dev",
7 | "build": "next build",
8 | "start": "next start"
9 | },
10 | "repository": {
11 | "type": "git",
12 | "url": "git+https://github.com/shuding/nextra-docs-template.git"
13 | },
14 | "author": "Shu Ding ",
15 | "license": "MIT",
16 | "bugs": {
17 | "url": "https://github.com/shuding/nextra-docs-template/issues"
18 | },
19 | "homepage": "https://github.com/shuding/nextra-docs-template#readme",
20 | "dependencies": {
21 | "next": "^13.0.6",
22 | "nextra": "latest",
23 | "nextra-theme-docs": "latest",
24 | "react": "^18.2.0",
25 | "react-dom": "^18.2.0",
26 | "rebloom": "^0.0.15"
27 | },
28 | "devDependencies": {
29 | "@types/node": "18.11.10",
30 | "autoprefixer": "^10.4.19",
31 | "postcss": "^8.4.38",
32 | "tailwindcss": "^3.4.3",
33 | "typescript": "^4.9.3"
34 | }
35 | }
36 |
--------------------------------------------------------------------------------
/docs/pages/_app.tsx:
--------------------------------------------------------------------------------
1 | import '../globals.css';
2 |
3 | // This default export is required in a new `pages/_app.js` file.
4 | export default function MyApp({ Component, pageProps }: any) {
5 | return ;
6 | }
7 |
--------------------------------------------------------------------------------
/docs/pages/_meta.json:
--------------------------------------------------------------------------------
1 | {
2 | "index": "Introduction",
3 | "api": "API",
4 | "another": "Another Page",
5 | "advanced": "Advanced (A Folder)",
6 | "about": {
7 | "title": "About",
8 | "type": "page"
9 | },
10 | "contact": {
11 | "title": "Contact ↗",
12 | "type": "page",
13 | "href": "https://twitter.com/shuding_",
14 | "newWindow": true
15 | }
16 | }
17 |
--------------------------------------------------------------------------------
/docs/pages/about.mdx:
--------------------------------------------------------------------------------
1 | # About
2 |
3 | This is the about page! This page is shown on the navbar.
4 |
5 |
6 |
--------------------------------------------------------------------------------
/docs/pages/advanced.mdx:
--------------------------------------------------------------------------------
1 | # Advanced
2 |
3 | This is the index page for the Advanced folder!
4 |
--------------------------------------------------------------------------------
/docs/pages/advanced/satori.mdx:
--------------------------------------------------------------------------------
1 | # Satori
2 |
3 | Satori (悟り) is a Japanese Buddhist term for awakening, "comprehension; understanding".
4 |
--------------------------------------------------------------------------------
/docs/pages/another.mdx:
--------------------------------------------------------------------------------
1 | # Another Page
2 |
3 | ```js filename="demo.js" {3} copy
4 | let a = 1;
5 |
6 | console.log(a);
7 | ```
8 |
9 | ## Component
10 |
11 | import { useState } from 'react'
12 |
13 | {/* Import CSS modules */}
14 | import styles from '../components/counters.module.css'
15 |
16 | export const Counter = () => {
17 | const [count, setCount] = useState(0);
18 | return (
19 |
20 | setCount(count + 1)} className={styles.counter}>Clicked {count} times
21 |
22 | );
23 | };
24 |
25 |
26 |
27 | ## External Component
28 |
29 | import Counters from '../components/counters'
30 |
31 |
32 |
--------------------------------------------------------------------------------
/docs/pages/guides/async-requests.mdx:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/finom/rebloom/a71ed77da5721cc58b996d2a84a6eea3e807378a/docs/pages/guides/async-requests.mdx
--------------------------------------------------------------------------------
/docs/pages/guides/cross-linked.mdx:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/finom/rebloom/a71ed77da5721cc58b996d2a84a6eea3e807378a/docs/pages/guides/cross-linked.mdx
--------------------------------------------------------------------------------
/docs/pages/guides/entity-based.mdx:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/finom/rebloom/a71ed77da5721cc58b996d2a84a6eea3e807378a/docs/pages/guides/entity-based.mdx
--------------------------------------------------------------------------------
/docs/pages/guides/hooks.mdx:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/finom/rebloom/a71ed77da5721cc58b996d2a84a6eea3e807378a/docs/pages/guides/hooks.mdx
--------------------------------------------------------------------------------
/docs/pages/index.mdx:
--------------------------------------------------------------------------------
1 | # Introduction
2 |
3 | Welcome to Nextra! This is a basic docs template. You can use it as a starting point for your own project :)
4 |
5 | ## What is Nextra?
6 |
7 | A **simple**, **powerful** and **flexible** site generation framework with everything you love from Next.js.
8 |
9 | ## Documentation
10 |
11 | The documentation is available at [https://nextra.site](https://nextra.site).
12 |
--------------------------------------------------------------------------------
/docs/pages/rebloom-api.mdx:
--------------------------------------------------------------------------------
1 | # Hello
--------------------------------------------------------------------------------
/docs/pages/rebloom-api/create-record.mdx:
--------------------------------------------------------------------------------
1 | # createRecord
2 |
3 | ## use
4 |
5 | ## listen
6 |
7 | ## useAll
8 |
9 | ## listenAll
10 |
11 | ## toJSON
--------------------------------------------------------------------------------
/docs/pages/rebloom-api/get-listen.mdx:
--------------------------------------------------------------------------------
1 | import GetListenExample from '../../components/examples/GetListenExample';
2 |
3 | # getListen
4 |
5 |
--------------------------------------------------------------------------------
/docs/pages/rebloom-api/get-use.mdx:
--------------------------------------------------------------------------------
1 | import { getUse } from 'rebloom';
2 | import GetUseExample from '../../components/examples/GetUseExample';
3 |
4 | # Hello
5 |
6 | Hello
7 |
8 |
9 |
10 |
11 |
12 |
13 | ## Examples
14 |
15 | - Todo list
--------------------------------------------------------------------------------
/docs/pages/static-class.mdx:
--------------------------------------------------------------------------------
1 | import RebloomLogo from '../components/RebloomLogo'
2 |
3 | # Why Static Classes
4 |
5 | State objects in can be defined 3 equally correct ways.
6 |
7 | ## Object Literal
8 |
9 | ```ts
10 | const use = getUse();
11 |
12 | const state = {
13 | get use() {
14 | return use;
15 | },
16 | x: 1,
17 | y: '2',
18 | };
19 |
20 | Object.defineProperty(state, 'use', { enumerable: false });
21 | ```
22 |
23 | ## Class Instance
24 |
25 | ```ts
26 | class State {
27 | use = getUse();
28 |
29 | x = 1;
30 |
31 | y = '2';
32 | }
33 |
34 | const state = new State();
35 | ```
36 |
37 | ## Static Class
38 |
39 | ```ts
40 | class State {
41 | static use = getUse();
42 |
43 | static x = 1;
44 |
45 | static y = '2';
46 | }
47 | ```
--------------------------------------------------------------------------------
/docs/postcss.config.js:
--------------------------------------------------------------------------------
1 | module.exports = {
2 | plugins: {
3 | tailwindcss: {},
4 | autoprefixer: {},
5 | },
6 | }
7 |
--------------------------------------------------------------------------------
/docs/tailwind.config.js:
--------------------------------------------------------------------------------
1 | /** @type {import('tailwindcss').Config} */
2 | module.exports = {
3 | content: [
4 | './pages/**/*.{js,jsx,ts,tsx,md,mdx}',
5 | './components/**/*.{js,jsx,ts,tsx,md,mdx}',
6 | './theme.config.tsx',
7 |
8 | // Or if using `src` directory:
9 | './src/**/*.{js,jsx,ts,tsx,md,mdx}',
10 | ],
11 | theme: {
12 | extend: {}
13 | },
14 | plugins: []
15 | }
--------------------------------------------------------------------------------
/docs/theme.config.tsx:
--------------------------------------------------------------------------------
1 | import React from 'react'
2 | import { DocsThemeConfig } from 'nextra-theme-docs'
3 | import RebloomLogo from './components/RebloomLogo'
4 |
5 | const config: DocsThemeConfig = {
6 | logo: ,
7 | project: {
8 | link: 'https://github.com/shuding/nextra-docs-template',
9 | },
10 | chat: {
11 | link: 'https://discord.com',
12 | },
13 | docsRepositoryBase: 'https://github.com/shuding/nextra-docs-template',
14 | footer: {
15 | text: 'Nextra Docs Template',
16 | },
17 | }
18 |
19 | export default config
20 |
--------------------------------------------------------------------------------
/docs/tsconfig.json:
--------------------------------------------------------------------------------
1 | {
2 | "compilerOptions": {
3 | "target": "es5",
4 | "lib": ["dom", "dom.iterable", "esnext"],
5 | "allowJs": true,
6 | "skipLibCheck": true,
7 | "strict": false,
8 | "forceConsistentCasingInFileNames": true,
9 | "noEmit": true,
10 | "incremental": true,
11 | "esModuleInterop": true,
12 | "module": "esnext",
13 | "moduleResolution": "node",
14 | "resolveJsonModule": true,
15 | "isolatedModules": true,
16 | "jsx": "preserve"
17 | },
18 | "include": ["next-env.d.ts", "**/*.ts", "**/*.tsx"],
19 | "exclude": ["node_modules"]
20 | }
21 |
--------------------------------------------------------------------------------
/package-lock.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "rebloom",
3 | "version": "0.0.20",
4 | "lockfileVersion": 3,
5 | "requires": true,
6 | "packages": {
7 | "": {
8 | "name": "rebloom",
9 | "version": "0.0.20",
10 | "license": "MIT",
11 | "devDependencies": {
12 | "@testing-library/react-hooks": "^8.0.1",
13 | "@types/node": "^20.12.7",
14 | "@types/react": "^18.2.75",
15 | "@typescript-eslint/eslint-plugin": "^7.6.0",
16 | "@typescript-eslint/parser": "^7.6.0",
17 | "eslint": "^8.57.0",
18 | "eslint-config-airbnb": "^19.0.4",
19 | "eslint-config-airbnb-typescript": "^18.0.0",
20 | "eslint-plugin-import": "^2.29.1",
21 | "eslint-plugin-jsx-a11y": "^6.8.0",
22 | "eslint-plugin-react": "^7.34.1",
23 | "eslint-plugin-react-hooks": "^4.6.0",
24 | "react": "^18.2.0",
25 | "react-test-renderer": "^18.2.0",
26 | "ts-node": "^10.9.2",
27 | "typescript": "^5.4.5"
28 | },
29 | "peerDependencies": {
30 | "react": "*"
31 | }
32 | },
33 | "node_modules/@aashutoshrathi/word-wrap": {
34 | "version": "1.2.6",
35 | "dev": true,
36 | "license": "MIT",
37 | "engines": {
38 | "node": ">=0.10.0"
39 | }
40 | },
41 | "node_modules/@babel/runtime": {
42 | "version": "7.23.6",
43 | "dev": true,
44 | "license": "MIT",
45 | "dependencies": {
46 | "regenerator-runtime": "^0.14.0"
47 | },
48 | "engines": {
49 | "node": ">=6.9.0"
50 | }
51 | },
52 | "node_modules/@cspotcode/source-map-support": {
53 | "version": "0.8.1",
54 | "dev": true,
55 | "license": "MIT",
56 | "dependencies": {
57 | "@jridgewell/trace-mapping": "0.3.9"
58 | },
59 | "engines": {
60 | "node": ">=12"
61 | }
62 | },
63 | "node_modules/@eslint-community/eslint-utils": {
64 | "version": "4.4.0",
65 | "dev": true,
66 | "license": "MIT",
67 | "dependencies": {
68 | "eslint-visitor-keys": "^3.3.0"
69 | },
70 | "engines": {
71 | "node": "^12.22.0 || ^14.17.0 || >=16.0.0"
72 | },
73 | "peerDependencies": {
74 | "eslint": "^6.0.0 || ^7.0.0 || >=8.0.0"
75 | }
76 | },
77 | "node_modules/@eslint-community/regexpp": {
78 | "version": "4.10.0",
79 | "dev": true,
80 | "license": "MIT",
81 | "engines": {
82 | "node": "^12.0.0 || ^14.0.0 || >=16.0.0"
83 | }
84 | },
85 | "node_modules/@eslint/eslintrc": {
86 | "version": "2.1.4",
87 | "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-2.1.4.tgz",
88 | "integrity": "sha512-269Z39MS6wVJtsoUl10L60WdkhJVdPG24Q4eZTH3nnF6lpvSShEK3wQjDX9JRWAUPvPh7COouPpU9IrqaZFvtQ==",
89 | "dev": true,
90 | "dependencies": {
91 | "ajv": "^6.12.4",
92 | "debug": "^4.3.2",
93 | "espree": "^9.6.0",
94 | "globals": "^13.19.0",
95 | "ignore": "^5.2.0",
96 | "import-fresh": "^3.2.1",
97 | "js-yaml": "^4.1.0",
98 | "minimatch": "^3.1.2",
99 | "strip-json-comments": "^3.1.1"
100 | },
101 | "engines": {
102 | "node": "^12.22.0 || ^14.17.0 || >=16.0.0"
103 | },
104 | "funding": {
105 | "url": "https://opencollective.com/eslint"
106 | }
107 | },
108 | "node_modules/@eslint/js": {
109 | "version": "8.57.0",
110 | "resolved": "https://registry.npmjs.org/@eslint/js/-/js-8.57.0.tgz",
111 | "integrity": "sha512-Ys+3g2TaW7gADOJzPt83SJtCDhMjndcDMFVQ/Tj9iA1BfJzFKD9mAUXT3OenpuPHbI6P/myECxRJrofUsDx/5g==",
112 | "dev": true,
113 | "engines": {
114 | "node": "^12.22.0 || ^14.17.0 || >=16.0.0"
115 | }
116 | },
117 | "node_modules/@humanwhocodes/config-array": {
118 | "version": "0.11.14",
119 | "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.11.14.tgz",
120 | "integrity": "sha512-3T8LkOmg45BV5FICb15QQMsyUSWrQ8AygVfC7ZG32zOalnqrilm018ZVCw0eapXux8FtA33q8PSRSstjee3jSg==",
121 | "dev": true,
122 | "dependencies": {
123 | "@humanwhocodes/object-schema": "^2.0.2",
124 | "debug": "^4.3.1",
125 | "minimatch": "^3.0.5"
126 | },
127 | "engines": {
128 | "node": ">=10.10.0"
129 | }
130 | },
131 | "node_modules/@humanwhocodes/module-importer": {
132 | "version": "1.0.1",
133 | "dev": true,
134 | "license": "Apache-2.0",
135 | "engines": {
136 | "node": ">=12.22"
137 | },
138 | "funding": {
139 | "type": "github",
140 | "url": "https://github.com/sponsors/nzakas"
141 | }
142 | },
143 | "node_modules/@humanwhocodes/object-schema": {
144 | "version": "2.0.3",
145 | "resolved": "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-2.0.3.tgz",
146 | "integrity": "sha512-93zYdMES/c1D69yZiKDBj0V24vqNzB/koF26KPaagAfd3P/4gUlh3Dys5ogAK+Exi9QyzlD8x/08Zt7wIKcDcA==",
147 | "dev": true
148 | },
149 | "node_modules/@jridgewell/resolve-uri": {
150 | "version": "3.1.1",
151 | "dev": true,
152 | "license": "MIT",
153 | "engines": {
154 | "node": ">=6.0.0"
155 | }
156 | },
157 | "node_modules/@jridgewell/sourcemap-codec": {
158 | "version": "1.4.15",
159 | "dev": true,
160 | "license": "MIT"
161 | },
162 | "node_modules/@jridgewell/trace-mapping": {
163 | "version": "0.3.9",
164 | "dev": true,
165 | "license": "MIT",
166 | "dependencies": {
167 | "@jridgewell/resolve-uri": "^3.0.3",
168 | "@jridgewell/sourcemap-codec": "^1.4.10"
169 | }
170 | },
171 | "node_modules/@nodelib/fs.scandir": {
172 | "version": "2.1.5",
173 | "dev": true,
174 | "license": "MIT",
175 | "dependencies": {
176 | "@nodelib/fs.stat": "2.0.5",
177 | "run-parallel": "^1.1.9"
178 | },
179 | "engines": {
180 | "node": ">= 8"
181 | }
182 | },
183 | "node_modules/@nodelib/fs.stat": {
184 | "version": "2.0.5",
185 | "dev": true,
186 | "license": "MIT",
187 | "engines": {
188 | "node": ">= 8"
189 | }
190 | },
191 | "node_modules/@nodelib/fs.walk": {
192 | "version": "1.2.8",
193 | "dev": true,
194 | "license": "MIT",
195 | "dependencies": {
196 | "@nodelib/fs.scandir": "2.1.5",
197 | "fastq": "^1.6.0"
198 | },
199 | "engines": {
200 | "node": ">= 8"
201 | }
202 | },
203 | "node_modules/@testing-library/react-hooks": {
204 | "version": "8.0.1",
205 | "dev": true,
206 | "license": "MIT",
207 | "dependencies": {
208 | "@babel/runtime": "^7.12.5",
209 | "react-error-boundary": "^3.1.0"
210 | },
211 | "engines": {
212 | "node": ">=12"
213 | },
214 | "peerDependencies": {
215 | "@types/react": "^16.9.0 || ^17.0.0",
216 | "react": "^16.9.0 || ^17.0.0",
217 | "react-dom": "^16.9.0 || ^17.0.0",
218 | "react-test-renderer": "^16.9.0 || ^17.0.0"
219 | },
220 | "peerDependenciesMeta": {
221 | "@types/react": {
222 | "optional": true
223 | },
224 | "react-dom": {
225 | "optional": true
226 | },
227 | "react-test-renderer": {
228 | "optional": true
229 | }
230 | }
231 | },
232 | "node_modules/@tsconfig/node10": {
233 | "version": "1.0.9",
234 | "dev": true,
235 | "license": "MIT"
236 | },
237 | "node_modules/@tsconfig/node12": {
238 | "version": "1.0.11",
239 | "dev": true,
240 | "license": "MIT"
241 | },
242 | "node_modules/@tsconfig/node14": {
243 | "version": "1.0.3",
244 | "dev": true,
245 | "license": "MIT"
246 | },
247 | "node_modules/@tsconfig/node16": {
248 | "version": "1.0.4",
249 | "dev": true,
250 | "license": "MIT"
251 | },
252 | "node_modules/@types/json-schema": {
253 | "version": "7.0.15",
254 | "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.15.tgz",
255 | "integrity": "sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==",
256 | "dev": true
257 | },
258 | "node_modules/@types/json5": {
259 | "version": "0.0.29",
260 | "dev": true,
261 | "license": "MIT"
262 | },
263 | "node_modules/@types/node": {
264 | "version": "20.12.7",
265 | "resolved": "https://registry.npmjs.org/@types/node/-/node-20.12.7.tgz",
266 | "integrity": "sha512-wq0cICSkRLVaf3UGLMGItu/PtdY7oaXaI/RVU+xliKVOtRna3PRY57ZDfztpDL0n11vfymMUnXv8QwYCO7L1wg==",
267 | "dev": true,
268 | "dependencies": {
269 | "undici-types": "~5.26.4"
270 | }
271 | },
272 | "node_modules/@types/prop-types": {
273 | "version": "15.7.11",
274 | "dev": true,
275 | "license": "MIT"
276 | },
277 | "node_modules/@types/react": {
278 | "version": "18.2.75",
279 | "resolved": "https://registry.npmjs.org/@types/react/-/react-18.2.75.tgz",
280 | "integrity": "sha512-+DNnF7yc5y0bHkBTiLKqXFe+L4B3nvOphiMY3tuA5X10esmjqk7smyBZzbGTy2vsiy/Bnzj8yFIBL8xhRacoOg==",
281 | "dev": true,
282 | "dependencies": {
283 | "@types/prop-types": "*",
284 | "csstype": "^3.0.2"
285 | }
286 | },
287 | "node_modules/@types/semver": {
288 | "version": "7.5.8",
289 | "resolved": "https://registry.npmjs.org/@types/semver/-/semver-7.5.8.tgz",
290 | "integrity": "sha512-I8EUhyrgfLrcTkzV3TSsGyl1tSuPrEDzr0yd5m90UgNxQkyDXULk3b6MlQqTCpZpNtWe1K0hzclnZkTcLBe2UQ==",
291 | "dev": true
292 | },
293 | "node_modules/@typescript-eslint/eslint-plugin": {
294 | "version": "7.6.0",
295 | "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-7.6.0.tgz",
296 | "integrity": "sha512-gKmTNwZnblUdnTIJu3e9kmeRRzV2j1a/LUO27KNNAnIC5zjy1aSvXSRp4rVNlmAoHlQ7HzX42NbKpcSr4jF80A==",
297 | "dev": true,
298 | "dependencies": {
299 | "@eslint-community/regexpp": "^4.10.0",
300 | "@typescript-eslint/scope-manager": "7.6.0",
301 | "@typescript-eslint/type-utils": "7.6.0",
302 | "@typescript-eslint/utils": "7.6.0",
303 | "@typescript-eslint/visitor-keys": "7.6.0",
304 | "debug": "^4.3.4",
305 | "graphemer": "^1.4.0",
306 | "ignore": "^5.3.1",
307 | "natural-compare": "^1.4.0",
308 | "semver": "^7.6.0",
309 | "ts-api-utils": "^1.3.0"
310 | },
311 | "engines": {
312 | "node": "^18.18.0 || >=20.0.0"
313 | },
314 | "funding": {
315 | "type": "opencollective",
316 | "url": "https://opencollective.com/typescript-eslint"
317 | },
318 | "peerDependencies": {
319 | "@typescript-eslint/parser": "^7.0.0",
320 | "eslint": "^8.56.0"
321 | },
322 | "peerDependenciesMeta": {
323 | "typescript": {
324 | "optional": true
325 | }
326 | }
327 | },
328 | "node_modules/@typescript-eslint/eslint-plugin/node_modules/semver": {
329 | "version": "7.6.0",
330 | "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.0.tgz",
331 | "integrity": "sha512-EnwXhrlwXMk9gKu5/flx5sv/an57AkRplG3hTK68W7FRDN+k+OWBj65M7719OkA82XLBxrcX0KSHj+X5COhOVg==",
332 | "dev": true,
333 | "dependencies": {
334 | "lru-cache": "^6.0.0"
335 | },
336 | "bin": {
337 | "semver": "bin/semver.js"
338 | },
339 | "engines": {
340 | "node": ">=10"
341 | }
342 | },
343 | "node_modules/@typescript-eslint/parser": {
344 | "version": "7.6.0",
345 | "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-7.6.0.tgz",
346 | "integrity": "sha512-usPMPHcwX3ZoPWnBnhhorc14NJw9J4HpSXQX4urF2TPKG0au0XhJoZyX62fmvdHONUkmyUe74Hzm1//XA+BoYg==",
347 | "dev": true,
348 | "dependencies": {
349 | "@typescript-eslint/scope-manager": "7.6.0",
350 | "@typescript-eslint/types": "7.6.0",
351 | "@typescript-eslint/typescript-estree": "7.6.0",
352 | "@typescript-eslint/visitor-keys": "7.6.0",
353 | "debug": "^4.3.4"
354 | },
355 | "engines": {
356 | "node": "^18.18.0 || >=20.0.0"
357 | },
358 | "funding": {
359 | "type": "opencollective",
360 | "url": "https://opencollective.com/typescript-eslint"
361 | },
362 | "peerDependencies": {
363 | "eslint": "^8.56.0"
364 | },
365 | "peerDependenciesMeta": {
366 | "typescript": {
367 | "optional": true
368 | }
369 | }
370 | },
371 | "node_modules/@typescript-eslint/scope-manager": {
372 | "version": "7.6.0",
373 | "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-7.6.0.tgz",
374 | "integrity": "sha512-ngttyfExA5PsHSx0rdFgnADMYQi+Zkeiv4/ZxGYUWd0nLs63Ha0ksmp8VMxAIC0wtCFxMos7Lt3PszJssG/E6w==",
375 | "dev": true,
376 | "dependencies": {
377 | "@typescript-eslint/types": "7.6.0",
378 | "@typescript-eslint/visitor-keys": "7.6.0"
379 | },
380 | "engines": {
381 | "node": "^18.18.0 || >=20.0.0"
382 | },
383 | "funding": {
384 | "type": "opencollective",
385 | "url": "https://opencollective.com/typescript-eslint"
386 | }
387 | },
388 | "node_modules/@typescript-eslint/type-utils": {
389 | "version": "7.6.0",
390 | "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-7.6.0.tgz",
391 | "integrity": "sha512-NxAfqAPNLG6LTmy7uZgpK8KcuiS2NZD/HlThPXQRGwz6u7MDBWRVliEEl1Gj6U7++kVJTpehkhZzCJLMK66Scw==",
392 | "dev": true,
393 | "dependencies": {
394 | "@typescript-eslint/typescript-estree": "7.6.0",
395 | "@typescript-eslint/utils": "7.6.0",
396 | "debug": "^4.3.4",
397 | "ts-api-utils": "^1.3.0"
398 | },
399 | "engines": {
400 | "node": "^18.18.0 || >=20.0.0"
401 | },
402 | "funding": {
403 | "type": "opencollective",
404 | "url": "https://opencollective.com/typescript-eslint"
405 | },
406 | "peerDependencies": {
407 | "eslint": "^8.56.0"
408 | },
409 | "peerDependenciesMeta": {
410 | "typescript": {
411 | "optional": true
412 | }
413 | }
414 | },
415 | "node_modules/@typescript-eslint/types": {
416 | "version": "7.6.0",
417 | "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-7.6.0.tgz",
418 | "integrity": "sha512-h02rYQn8J+MureCvHVVzhl69/GAfQGPQZmOMjG1KfCl7o3HtMSlPaPUAPu6lLctXI5ySRGIYk94clD/AUMCUgQ==",
419 | "dev": true,
420 | "engines": {
421 | "node": "^18.18.0 || >=20.0.0"
422 | },
423 | "funding": {
424 | "type": "opencollective",
425 | "url": "https://opencollective.com/typescript-eslint"
426 | }
427 | },
428 | "node_modules/@typescript-eslint/typescript-estree": {
429 | "version": "7.6.0",
430 | "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-7.6.0.tgz",
431 | "integrity": "sha512-+7Y/GP9VuYibecrCQWSKgl3GvUM5cILRttpWtnAu8GNL9j11e4tbuGZmZjJ8ejnKYyBRb2ddGQ3rEFCq3QjMJw==",
432 | "dev": true,
433 | "dependencies": {
434 | "@typescript-eslint/types": "7.6.0",
435 | "@typescript-eslint/visitor-keys": "7.6.0",
436 | "debug": "^4.3.4",
437 | "globby": "^11.1.0",
438 | "is-glob": "^4.0.3",
439 | "minimatch": "^9.0.4",
440 | "semver": "^7.6.0",
441 | "ts-api-utils": "^1.3.0"
442 | },
443 | "engines": {
444 | "node": "^18.18.0 || >=20.0.0"
445 | },
446 | "funding": {
447 | "type": "opencollective",
448 | "url": "https://opencollective.com/typescript-eslint"
449 | },
450 | "peerDependenciesMeta": {
451 | "typescript": {
452 | "optional": true
453 | }
454 | }
455 | },
456 | "node_modules/@typescript-eslint/typescript-estree/node_modules/brace-expansion": {
457 | "version": "2.0.1",
458 | "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz",
459 | "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==",
460 | "dev": true,
461 | "dependencies": {
462 | "balanced-match": "^1.0.0"
463 | }
464 | },
465 | "node_modules/@typescript-eslint/typescript-estree/node_modules/minimatch": {
466 | "version": "9.0.4",
467 | "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.4.tgz",
468 | "integrity": "sha512-KqWh+VchfxcMNRAJjj2tnsSJdNbHsVgnkBhTNrW7AjVo6OvLtxw8zfT9oLw1JSohlFzJ8jCoTgaoXvJ+kHt6fw==",
469 | "dev": true,
470 | "dependencies": {
471 | "brace-expansion": "^2.0.1"
472 | },
473 | "engines": {
474 | "node": ">=16 || 14 >=14.17"
475 | },
476 | "funding": {
477 | "url": "https://github.com/sponsors/isaacs"
478 | }
479 | },
480 | "node_modules/@typescript-eslint/typescript-estree/node_modules/semver": {
481 | "version": "7.6.0",
482 | "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.0.tgz",
483 | "integrity": "sha512-EnwXhrlwXMk9gKu5/flx5sv/an57AkRplG3hTK68W7FRDN+k+OWBj65M7719OkA82XLBxrcX0KSHj+X5COhOVg==",
484 | "dev": true,
485 | "dependencies": {
486 | "lru-cache": "^6.0.0"
487 | },
488 | "bin": {
489 | "semver": "bin/semver.js"
490 | },
491 | "engines": {
492 | "node": ">=10"
493 | }
494 | },
495 | "node_modules/@typescript-eslint/utils": {
496 | "version": "7.6.0",
497 | "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-7.6.0.tgz",
498 | "integrity": "sha512-x54gaSsRRI+Nwz59TXpCsr6harB98qjXYzsRxGqvA5Ue3kQH+FxS7FYU81g/omn22ML2pZJkisy6Q+ElK8pBCA==",
499 | "dev": true,
500 | "dependencies": {
501 | "@eslint-community/eslint-utils": "^4.4.0",
502 | "@types/json-schema": "^7.0.15",
503 | "@types/semver": "^7.5.8",
504 | "@typescript-eslint/scope-manager": "7.6.0",
505 | "@typescript-eslint/types": "7.6.0",
506 | "@typescript-eslint/typescript-estree": "7.6.0",
507 | "semver": "^7.6.0"
508 | },
509 | "engines": {
510 | "node": "^18.18.0 || >=20.0.0"
511 | },
512 | "funding": {
513 | "type": "opencollective",
514 | "url": "https://opencollective.com/typescript-eslint"
515 | },
516 | "peerDependencies": {
517 | "eslint": "^8.56.0"
518 | }
519 | },
520 | "node_modules/@typescript-eslint/utils/node_modules/semver": {
521 | "version": "7.6.0",
522 | "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.0.tgz",
523 | "integrity": "sha512-EnwXhrlwXMk9gKu5/flx5sv/an57AkRplG3hTK68W7FRDN+k+OWBj65M7719OkA82XLBxrcX0KSHj+X5COhOVg==",
524 | "dev": true,
525 | "dependencies": {
526 | "lru-cache": "^6.0.0"
527 | },
528 | "bin": {
529 | "semver": "bin/semver.js"
530 | },
531 | "engines": {
532 | "node": ">=10"
533 | }
534 | },
535 | "node_modules/@typescript-eslint/visitor-keys": {
536 | "version": "7.6.0",
537 | "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-7.6.0.tgz",
538 | "integrity": "sha512-4eLB7t+LlNUmXzfOu1VAIAdkjbu5xNSerURS9X/S5TUKWFRpXRQZbmtPqgKmYx8bj3J0irtQXSiWAOY82v+cgw==",
539 | "dev": true,
540 | "dependencies": {
541 | "@typescript-eslint/types": "7.6.0",
542 | "eslint-visitor-keys": "^3.4.3"
543 | },
544 | "engines": {
545 | "node": "^18.18.0 || >=20.0.0"
546 | },
547 | "funding": {
548 | "type": "opencollective",
549 | "url": "https://opencollective.com/typescript-eslint"
550 | }
551 | },
552 | "node_modules/@ungap/structured-clone": {
553 | "version": "1.2.0",
554 | "resolved": "https://registry.npmjs.org/@ungap/structured-clone/-/structured-clone-1.2.0.tgz",
555 | "integrity": "sha512-zuVdFrMJiuCDQUMCzQaD6KL28MjnqqN8XnAqiEq9PNm/hCPTSGfrXCOfwj1ow4LFb/tNymJPwsNbVePc1xFqrQ==",
556 | "dev": true
557 | },
558 | "node_modules/acorn": {
559 | "version": "8.11.3",
560 | "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.11.3.tgz",
561 | "integrity": "sha512-Y9rRfJG5jcKOE0CLisYbojUjIrIEE7AGMzA/Sm4BslANhbS+cDMpgBdcPT91oJ7OuJ9hYJBx59RjbhxVnrF8Xg==",
562 | "dev": true,
563 | "bin": {
564 | "acorn": "bin/acorn"
565 | },
566 | "engines": {
567 | "node": ">=0.4.0"
568 | }
569 | },
570 | "node_modules/acorn-jsx": {
571 | "version": "5.3.2",
572 | "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz",
573 | "integrity": "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==",
574 | "dev": true,
575 | "peerDependencies": {
576 | "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0"
577 | }
578 | },
579 | "node_modules/acorn-walk": {
580 | "version": "8.3.1",
581 | "dev": true,
582 | "license": "MIT",
583 | "engines": {
584 | "node": ">=0.4.0"
585 | }
586 | },
587 | "node_modules/ajv": {
588 | "version": "6.12.6",
589 | "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz",
590 | "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==",
591 | "dev": true,
592 | "dependencies": {
593 | "fast-deep-equal": "^3.1.1",
594 | "fast-json-stable-stringify": "^2.0.0",
595 | "json-schema-traverse": "^0.4.1",
596 | "uri-js": "^4.2.2"
597 | },
598 | "funding": {
599 | "type": "github",
600 | "url": "https://github.com/sponsors/epoberezkin"
601 | }
602 | },
603 | "node_modules/ansi-regex": {
604 | "version": "5.0.1",
605 | "dev": true,
606 | "license": "MIT",
607 | "engines": {
608 | "node": ">=8"
609 | }
610 | },
611 | "node_modules/ansi-styles": {
612 | "version": "4.3.0",
613 | "dev": true,
614 | "license": "MIT",
615 | "dependencies": {
616 | "color-convert": "^2.0.1"
617 | },
618 | "engines": {
619 | "node": ">=8"
620 | },
621 | "funding": {
622 | "url": "https://github.com/chalk/ansi-styles?sponsor=1"
623 | }
624 | },
625 | "node_modules/arg": {
626 | "version": "4.1.3",
627 | "dev": true,
628 | "license": "MIT"
629 | },
630 | "node_modules/argparse": {
631 | "version": "2.0.1",
632 | "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz",
633 | "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==",
634 | "dev": true
635 | },
636 | "node_modules/aria-query": {
637 | "version": "5.3.0",
638 | "dev": true,
639 | "license": "Apache-2.0",
640 | "dependencies": {
641 | "dequal": "^2.0.3"
642 | }
643 | },
644 | "node_modules/array-buffer-byte-length": {
645 | "version": "1.0.1",
646 | "resolved": "https://registry.npmjs.org/array-buffer-byte-length/-/array-buffer-byte-length-1.0.1.tgz",
647 | "integrity": "sha512-ahC5W1xgou+KTXix4sAO8Ki12Q+jf4i0+tmk3sC+zgcynshkHxzpXdImBehiUYKKKDwvfFiJl1tZt6ewscS1Mg==",
648 | "dev": true,
649 | "dependencies": {
650 | "call-bind": "^1.0.5",
651 | "is-array-buffer": "^3.0.4"
652 | },
653 | "engines": {
654 | "node": ">= 0.4"
655 | },
656 | "funding": {
657 | "url": "https://github.com/sponsors/ljharb"
658 | }
659 | },
660 | "node_modules/array-includes": {
661 | "version": "3.1.7",
662 | "dev": true,
663 | "license": "MIT",
664 | "dependencies": {
665 | "call-bind": "^1.0.2",
666 | "define-properties": "^1.2.0",
667 | "es-abstract": "^1.22.1",
668 | "get-intrinsic": "^1.2.1",
669 | "is-string": "^1.0.7"
670 | },
671 | "engines": {
672 | "node": ">= 0.4"
673 | },
674 | "funding": {
675 | "url": "https://github.com/sponsors/ljharb"
676 | }
677 | },
678 | "node_modules/array-union": {
679 | "version": "2.1.0",
680 | "resolved": "https://registry.npmjs.org/array-union/-/array-union-2.1.0.tgz",
681 | "integrity": "sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==",
682 | "dev": true,
683 | "engines": {
684 | "node": ">=8"
685 | }
686 | },
687 | "node_modules/array.prototype.findlast": {
688 | "version": "1.2.4",
689 | "resolved": "https://registry.npmjs.org/array.prototype.findlast/-/array.prototype.findlast-1.2.4.tgz",
690 | "integrity": "sha512-BMtLxpV+8BD+6ZPFIWmnUBpQoy+A+ujcg4rhp2iwCRJYA7PEh2MS4NL3lz8EiDlLrJPp2hg9qWihr5pd//jcGw==",
691 | "dev": true,
692 | "dependencies": {
693 | "call-bind": "^1.0.5",
694 | "define-properties": "^1.2.1",
695 | "es-abstract": "^1.22.3",
696 | "es-errors": "^1.3.0",
697 | "es-shim-unscopables": "^1.0.2"
698 | },
699 | "engines": {
700 | "node": ">= 0.4"
701 | },
702 | "funding": {
703 | "url": "https://github.com/sponsors/ljharb"
704 | }
705 | },
706 | "node_modules/array.prototype.findlastindex": {
707 | "version": "1.2.3",
708 | "dev": true,
709 | "license": "MIT",
710 | "dependencies": {
711 | "call-bind": "^1.0.2",
712 | "define-properties": "^1.2.0",
713 | "es-abstract": "^1.22.1",
714 | "es-shim-unscopables": "^1.0.0",
715 | "get-intrinsic": "^1.2.1"
716 | },
717 | "engines": {
718 | "node": ">= 0.4"
719 | },
720 | "funding": {
721 | "url": "https://github.com/sponsors/ljharb"
722 | }
723 | },
724 | "node_modules/array.prototype.flat": {
725 | "version": "1.3.2",
726 | "dev": true,
727 | "license": "MIT",
728 | "dependencies": {
729 | "call-bind": "^1.0.2",
730 | "define-properties": "^1.2.0",
731 | "es-abstract": "^1.22.1",
732 | "es-shim-unscopables": "^1.0.0"
733 | },
734 | "engines": {
735 | "node": ">= 0.4"
736 | },
737 | "funding": {
738 | "url": "https://github.com/sponsors/ljharb"
739 | }
740 | },
741 | "node_modules/array.prototype.flatmap": {
742 | "version": "1.3.2",
743 | "dev": true,
744 | "license": "MIT",
745 | "dependencies": {
746 | "call-bind": "^1.0.2",
747 | "define-properties": "^1.2.0",
748 | "es-abstract": "^1.22.1",
749 | "es-shim-unscopables": "^1.0.0"
750 | },
751 | "engines": {
752 | "node": ">= 0.4"
753 | },
754 | "funding": {
755 | "url": "https://github.com/sponsors/ljharb"
756 | }
757 | },
758 | "node_modules/array.prototype.toreversed": {
759 | "version": "1.1.2",
760 | "resolved": "https://registry.npmjs.org/array.prototype.toreversed/-/array.prototype.toreversed-1.1.2.tgz",
761 | "integrity": "sha512-wwDCoT4Ck4Cz7sLtgUmzR5UV3YF5mFHUlbChCzZBQZ+0m2cl/DH3tKgvphv1nKgFsJ48oCSg6p91q2Vm0I/ZMA==",
762 | "dev": true,
763 | "dependencies": {
764 | "call-bind": "^1.0.2",
765 | "define-properties": "^1.2.0",
766 | "es-abstract": "^1.22.1",
767 | "es-shim-unscopables": "^1.0.0"
768 | }
769 | },
770 | "node_modules/array.prototype.tosorted": {
771 | "version": "1.1.3",
772 | "resolved": "https://registry.npmjs.org/array.prototype.tosorted/-/array.prototype.tosorted-1.1.3.tgz",
773 | "integrity": "sha512-/DdH4TiTmOKzyQbp/eadcCVexiCb36xJg7HshYOYJnNZFDj33GEv0P7GxsynpShhq4OLYJzbGcBDkLsDt7MnNg==",
774 | "dev": true,
775 | "dependencies": {
776 | "call-bind": "^1.0.5",
777 | "define-properties": "^1.2.1",
778 | "es-abstract": "^1.22.3",
779 | "es-errors": "^1.1.0",
780 | "es-shim-unscopables": "^1.0.2"
781 | }
782 | },
783 | "node_modules/arraybuffer.prototype.slice": {
784 | "version": "1.0.3",
785 | "resolved": "https://registry.npmjs.org/arraybuffer.prototype.slice/-/arraybuffer.prototype.slice-1.0.3.tgz",
786 | "integrity": "sha512-bMxMKAjg13EBSVscxTaYA4mRc5t1UAXa2kXiGTNfZ079HIWXEkKmkgFrh/nJqamaLSrXO5H4WFFkPEaLJWbs3A==",
787 | "dev": true,
788 | "dependencies": {
789 | "array-buffer-byte-length": "^1.0.1",
790 | "call-bind": "^1.0.5",
791 | "define-properties": "^1.2.1",
792 | "es-abstract": "^1.22.3",
793 | "es-errors": "^1.2.1",
794 | "get-intrinsic": "^1.2.3",
795 | "is-array-buffer": "^3.0.4",
796 | "is-shared-array-buffer": "^1.0.2"
797 | },
798 | "engines": {
799 | "node": ">= 0.4"
800 | },
801 | "funding": {
802 | "url": "https://github.com/sponsors/ljharb"
803 | }
804 | },
805 | "node_modules/ast-types-flow": {
806 | "version": "0.0.8",
807 | "dev": true,
808 | "license": "MIT"
809 | },
810 | "node_modules/asynciterator.prototype": {
811 | "version": "1.0.0",
812 | "dev": true,
813 | "license": "MIT",
814 | "dependencies": {
815 | "has-symbols": "^1.0.3"
816 | }
817 | },
818 | "node_modules/available-typed-arrays": {
819 | "version": "1.0.7",
820 | "resolved": "https://registry.npmjs.org/available-typed-arrays/-/available-typed-arrays-1.0.7.tgz",
821 | "integrity": "sha512-wvUjBtSGN7+7SjNpq/9M2Tg350UZD3q62IFZLbRAR1bSMlCo1ZaeW+BJ+D090e4hIIZLBcTDWe4Mh4jvUDajzQ==",
822 | "dev": true,
823 | "dependencies": {
824 | "possible-typed-array-names": "^1.0.0"
825 | },
826 | "engines": {
827 | "node": ">= 0.4"
828 | },
829 | "funding": {
830 | "url": "https://github.com/sponsors/ljharb"
831 | }
832 | },
833 | "node_modules/axe-core": {
834 | "version": "4.7.0",
835 | "dev": true,
836 | "license": "MPL-2.0",
837 | "engines": {
838 | "node": ">=4"
839 | }
840 | },
841 | "node_modules/axobject-query": {
842 | "version": "3.2.1",
843 | "dev": true,
844 | "license": "Apache-2.0",
845 | "dependencies": {
846 | "dequal": "^2.0.3"
847 | }
848 | },
849 | "node_modules/balanced-match": {
850 | "version": "1.0.2",
851 | "dev": true,
852 | "license": "MIT"
853 | },
854 | "node_modules/brace-expansion": {
855 | "version": "1.1.11",
856 | "dev": true,
857 | "license": "MIT",
858 | "dependencies": {
859 | "balanced-match": "^1.0.0",
860 | "concat-map": "0.0.1"
861 | }
862 | },
863 | "node_modules/braces": {
864 | "version": "3.0.2",
865 | "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz",
866 | "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==",
867 | "dev": true,
868 | "dependencies": {
869 | "fill-range": "^7.0.1"
870 | },
871 | "engines": {
872 | "node": ">=8"
873 | }
874 | },
875 | "node_modules/call-bind": {
876 | "version": "1.0.7",
877 | "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.7.tgz",
878 | "integrity": "sha512-GHTSNSYICQ7scH7sZ+M2rFopRoLh8t2bLSW6BbgrtLsahOIB5iyAVJf9GjWK3cYTDaMj4XdBpM1cA6pIS0Kv2w==",
879 | "dev": true,
880 | "dependencies": {
881 | "es-define-property": "^1.0.0",
882 | "es-errors": "^1.3.0",
883 | "function-bind": "^1.1.2",
884 | "get-intrinsic": "^1.2.4",
885 | "set-function-length": "^1.2.1"
886 | },
887 | "engines": {
888 | "node": ">= 0.4"
889 | },
890 | "funding": {
891 | "url": "https://github.com/sponsors/ljharb"
892 | }
893 | },
894 | "node_modules/callsites": {
895 | "version": "3.1.0",
896 | "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz",
897 | "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==",
898 | "dev": true,
899 | "engines": {
900 | "node": ">=6"
901 | }
902 | },
903 | "node_modules/chalk": {
904 | "version": "4.1.2",
905 | "dev": true,
906 | "license": "MIT",
907 | "dependencies": {
908 | "ansi-styles": "^4.1.0",
909 | "supports-color": "^7.1.0"
910 | },
911 | "engines": {
912 | "node": ">=10"
913 | },
914 | "funding": {
915 | "url": "https://github.com/chalk/chalk?sponsor=1"
916 | }
917 | },
918 | "node_modules/color-convert": {
919 | "version": "2.0.1",
920 | "dev": true,
921 | "license": "MIT",
922 | "dependencies": {
923 | "color-name": "~1.1.4"
924 | },
925 | "engines": {
926 | "node": ">=7.0.0"
927 | }
928 | },
929 | "node_modules/color-name": {
930 | "version": "1.1.4",
931 | "dev": true,
932 | "license": "MIT"
933 | },
934 | "node_modules/concat-map": {
935 | "version": "0.0.1",
936 | "dev": true,
937 | "license": "MIT"
938 | },
939 | "node_modules/confusing-browser-globals": {
940 | "version": "1.0.11",
941 | "dev": true,
942 | "license": "MIT"
943 | },
944 | "node_modules/create-require": {
945 | "version": "1.1.1",
946 | "dev": true,
947 | "license": "MIT"
948 | },
949 | "node_modules/cross-spawn": {
950 | "version": "7.0.3",
951 | "dev": true,
952 | "license": "MIT",
953 | "dependencies": {
954 | "path-key": "^3.1.0",
955 | "shebang-command": "^2.0.0",
956 | "which": "^2.0.1"
957 | },
958 | "engines": {
959 | "node": ">= 8"
960 | }
961 | },
962 | "node_modules/csstype": {
963 | "version": "3.1.3",
964 | "dev": true,
965 | "license": "MIT"
966 | },
967 | "node_modules/damerau-levenshtein": {
968 | "version": "1.0.8",
969 | "dev": true,
970 | "license": "BSD-2-Clause"
971 | },
972 | "node_modules/debug": {
973 | "version": "4.3.4",
974 | "dev": true,
975 | "license": "MIT",
976 | "dependencies": {
977 | "ms": "2.1.2"
978 | },
979 | "engines": {
980 | "node": ">=6.0"
981 | },
982 | "peerDependenciesMeta": {
983 | "supports-color": {
984 | "optional": true
985 | }
986 | }
987 | },
988 | "node_modules/deep-is": {
989 | "version": "0.1.4",
990 | "dev": true,
991 | "license": "MIT"
992 | },
993 | "node_modules/define-data-property": {
994 | "version": "1.1.4",
995 | "resolved": "https://registry.npmjs.org/define-data-property/-/define-data-property-1.1.4.tgz",
996 | "integrity": "sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A==",
997 | "dev": true,
998 | "dependencies": {
999 | "es-define-property": "^1.0.0",
1000 | "es-errors": "^1.3.0",
1001 | "gopd": "^1.0.1"
1002 | },
1003 | "engines": {
1004 | "node": ">= 0.4"
1005 | },
1006 | "funding": {
1007 | "url": "https://github.com/sponsors/ljharb"
1008 | }
1009 | },
1010 | "node_modules/define-properties": {
1011 | "version": "1.2.1",
1012 | "dev": true,
1013 | "license": "MIT",
1014 | "dependencies": {
1015 | "define-data-property": "^1.0.1",
1016 | "has-property-descriptors": "^1.0.0",
1017 | "object-keys": "^1.1.1"
1018 | },
1019 | "engines": {
1020 | "node": ">= 0.4"
1021 | },
1022 | "funding": {
1023 | "url": "https://github.com/sponsors/ljharb"
1024 | }
1025 | },
1026 | "node_modules/dequal": {
1027 | "version": "2.0.3",
1028 | "dev": true,
1029 | "license": "MIT",
1030 | "engines": {
1031 | "node": ">=6"
1032 | }
1033 | },
1034 | "node_modules/diff": {
1035 | "version": "4.0.2",
1036 | "dev": true,
1037 | "license": "BSD-3-Clause",
1038 | "engines": {
1039 | "node": ">=0.3.1"
1040 | }
1041 | },
1042 | "node_modules/dir-glob": {
1043 | "version": "3.0.1",
1044 | "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz",
1045 | "integrity": "sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==",
1046 | "dev": true,
1047 | "dependencies": {
1048 | "path-type": "^4.0.0"
1049 | },
1050 | "engines": {
1051 | "node": ">=8"
1052 | }
1053 | },
1054 | "node_modules/doctrine": {
1055 | "version": "2.1.0",
1056 | "dev": true,
1057 | "license": "Apache-2.0",
1058 | "dependencies": {
1059 | "esutils": "^2.0.2"
1060 | },
1061 | "engines": {
1062 | "node": ">=0.10.0"
1063 | }
1064 | },
1065 | "node_modules/emoji-regex": {
1066 | "version": "9.2.2",
1067 | "dev": true,
1068 | "license": "MIT"
1069 | },
1070 | "node_modules/es-abstract": {
1071 | "version": "1.22.5",
1072 | "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.22.5.tgz",
1073 | "integrity": "sha512-oW69R+4q2wG+Hc3KZePPZxOiisRIqfKBVo/HLx94QcJeWGU/8sZhCvc829rd1kS366vlJbzBfXf9yWwf0+Ko7w==",
1074 | "dev": true,
1075 | "dependencies": {
1076 | "array-buffer-byte-length": "^1.0.1",
1077 | "arraybuffer.prototype.slice": "^1.0.3",
1078 | "available-typed-arrays": "^1.0.7",
1079 | "call-bind": "^1.0.7",
1080 | "es-define-property": "^1.0.0",
1081 | "es-errors": "^1.3.0",
1082 | "es-set-tostringtag": "^2.0.3",
1083 | "es-to-primitive": "^1.2.1",
1084 | "function.prototype.name": "^1.1.6",
1085 | "get-intrinsic": "^1.2.4",
1086 | "get-symbol-description": "^1.0.2",
1087 | "globalthis": "^1.0.3",
1088 | "gopd": "^1.0.1",
1089 | "has-property-descriptors": "^1.0.2",
1090 | "has-proto": "^1.0.3",
1091 | "has-symbols": "^1.0.3",
1092 | "hasown": "^2.0.1",
1093 | "internal-slot": "^1.0.7",
1094 | "is-array-buffer": "^3.0.4",
1095 | "is-callable": "^1.2.7",
1096 | "is-negative-zero": "^2.0.3",
1097 | "is-regex": "^1.1.4",
1098 | "is-shared-array-buffer": "^1.0.3",
1099 | "is-string": "^1.0.7",
1100 | "is-typed-array": "^1.1.13",
1101 | "is-weakref": "^1.0.2",
1102 | "object-inspect": "^1.13.1",
1103 | "object-keys": "^1.1.1",
1104 | "object.assign": "^4.1.5",
1105 | "regexp.prototype.flags": "^1.5.2",
1106 | "safe-array-concat": "^1.1.0",
1107 | "safe-regex-test": "^1.0.3",
1108 | "string.prototype.trim": "^1.2.8",
1109 | "string.prototype.trimend": "^1.0.7",
1110 | "string.prototype.trimstart": "^1.0.7",
1111 | "typed-array-buffer": "^1.0.2",
1112 | "typed-array-byte-length": "^1.0.1",
1113 | "typed-array-byte-offset": "^1.0.2",
1114 | "typed-array-length": "^1.0.5",
1115 | "unbox-primitive": "^1.0.2",
1116 | "which-typed-array": "^1.1.14"
1117 | },
1118 | "engines": {
1119 | "node": ">= 0.4"
1120 | },
1121 | "funding": {
1122 | "url": "https://github.com/sponsors/ljharb"
1123 | }
1124 | },
1125 | "node_modules/es-define-property": {
1126 | "version": "1.0.0",
1127 | "resolved": "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.0.tgz",
1128 | "integrity": "sha512-jxayLKShrEqqzJ0eumQbVhTYQM27CfT1T35+gCgDFoL82JLsXqTJ76zv6A0YLOgEnLUMvLzsDsGIrl8NFpT2gQ==",
1129 | "dev": true,
1130 | "dependencies": {
1131 | "get-intrinsic": "^1.2.4"
1132 | },
1133 | "engines": {
1134 | "node": ">= 0.4"
1135 | }
1136 | },
1137 | "node_modules/es-errors": {
1138 | "version": "1.3.0",
1139 | "resolved": "https://registry.npmjs.org/es-errors/-/es-errors-1.3.0.tgz",
1140 | "integrity": "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==",
1141 | "dev": true,
1142 | "engines": {
1143 | "node": ">= 0.4"
1144 | }
1145 | },
1146 | "node_modules/es-iterator-helpers": {
1147 | "version": "1.0.17",
1148 | "resolved": "https://registry.npmjs.org/es-iterator-helpers/-/es-iterator-helpers-1.0.17.tgz",
1149 | "integrity": "sha512-lh7BsUqelv4KUbR5a/ZTaGGIMLCjPGPqJ6q+Oq24YP0RdyptX1uzm4vvaqzk7Zx3bpl/76YLTTDj9L7uYQ92oQ==",
1150 | "dev": true,
1151 | "dependencies": {
1152 | "asynciterator.prototype": "^1.0.0",
1153 | "call-bind": "^1.0.7",
1154 | "define-properties": "^1.2.1",
1155 | "es-abstract": "^1.22.4",
1156 | "es-errors": "^1.3.0",
1157 | "es-set-tostringtag": "^2.0.2",
1158 | "function-bind": "^1.1.2",
1159 | "get-intrinsic": "^1.2.4",
1160 | "globalthis": "^1.0.3",
1161 | "has-property-descriptors": "^1.0.2",
1162 | "has-proto": "^1.0.1",
1163 | "has-symbols": "^1.0.3",
1164 | "internal-slot": "^1.0.7",
1165 | "iterator.prototype": "^1.1.2",
1166 | "safe-array-concat": "^1.1.0"
1167 | },
1168 | "engines": {
1169 | "node": ">= 0.4"
1170 | }
1171 | },
1172 | "node_modules/es-set-tostringtag": {
1173 | "version": "2.0.3",
1174 | "resolved": "https://registry.npmjs.org/es-set-tostringtag/-/es-set-tostringtag-2.0.3.tgz",
1175 | "integrity": "sha512-3T8uNMC3OQTHkFUsFq8r/BwAXLHvU/9O9mE0fBc/MY5iq/8H7ncvO947LmYA6ldWw9Uh8Yhf25zu6n7nML5QWQ==",
1176 | "dev": true,
1177 | "dependencies": {
1178 | "get-intrinsic": "^1.2.4",
1179 | "has-tostringtag": "^1.0.2",
1180 | "hasown": "^2.0.1"
1181 | },
1182 | "engines": {
1183 | "node": ">= 0.4"
1184 | }
1185 | },
1186 | "node_modules/es-shim-unscopables": {
1187 | "version": "1.0.2",
1188 | "dev": true,
1189 | "license": "MIT",
1190 | "dependencies": {
1191 | "hasown": "^2.0.0"
1192 | }
1193 | },
1194 | "node_modules/es-to-primitive": {
1195 | "version": "1.2.1",
1196 | "dev": true,
1197 | "license": "MIT",
1198 | "dependencies": {
1199 | "is-callable": "^1.1.4",
1200 | "is-date-object": "^1.0.1",
1201 | "is-symbol": "^1.0.2"
1202 | },
1203 | "engines": {
1204 | "node": ">= 0.4"
1205 | },
1206 | "funding": {
1207 | "url": "https://github.com/sponsors/ljharb"
1208 | }
1209 | },
1210 | "node_modules/escape-string-regexp": {
1211 | "version": "4.0.0",
1212 | "dev": true,
1213 | "license": "MIT",
1214 | "engines": {
1215 | "node": ">=10"
1216 | },
1217 | "funding": {
1218 | "url": "https://github.com/sponsors/sindresorhus"
1219 | }
1220 | },
1221 | "node_modules/eslint": {
1222 | "version": "8.57.0",
1223 | "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.57.0.tgz",
1224 | "integrity": "sha512-dZ6+mexnaTIbSBZWgou51U6OmzIhYM2VcNdtiTtI7qPNZm35Akpr0f6vtw3w1Kmn5PYo+tZVfh13WrhpS6oLqQ==",
1225 | "dev": true,
1226 | "dependencies": {
1227 | "@eslint-community/eslint-utils": "^4.2.0",
1228 | "@eslint-community/regexpp": "^4.6.1",
1229 | "@eslint/eslintrc": "^2.1.4",
1230 | "@eslint/js": "8.57.0",
1231 | "@humanwhocodes/config-array": "^0.11.14",
1232 | "@humanwhocodes/module-importer": "^1.0.1",
1233 | "@nodelib/fs.walk": "^1.2.8",
1234 | "@ungap/structured-clone": "^1.2.0",
1235 | "ajv": "^6.12.4",
1236 | "chalk": "^4.0.0",
1237 | "cross-spawn": "^7.0.2",
1238 | "debug": "^4.3.2",
1239 | "doctrine": "^3.0.0",
1240 | "escape-string-regexp": "^4.0.0",
1241 | "eslint-scope": "^7.2.2",
1242 | "eslint-visitor-keys": "^3.4.3",
1243 | "espree": "^9.6.1",
1244 | "esquery": "^1.4.2",
1245 | "esutils": "^2.0.2",
1246 | "fast-deep-equal": "^3.1.3",
1247 | "file-entry-cache": "^6.0.1",
1248 | "find-up": "^5.0.0",
1249 | "glob-parent": "^6.0.2",
1250 | "globals": "^13.19.0",
1251 | "graphemer": "^1.4.0",
1252 | "ignore": "^5.2.0",
1253 | "imurmurhash": "^0.1.4",
1254 | "is-glob": "^4.0.0",
1255 | "is-path-inside": "^3.0.3",
1256 | "js-yaml": "^4.1.0",
1257 | "json-stable-stringify-without-jsonify": "^1.0.1",
1258 | "levn": "^0.4.1",
1259 | "lodash.merge": "^4.6.2",
1260 | "minimatch": "^3.1.2",
1261 | "natural-compare": "^1.4.0",
1262 | "optionator": "^0.9.3",
1263 | "strip-ansi": "^6.0.1",
1264 | "text-table": "^0.2.0"
1265 | },
1266 | "bin": {
1267 | "eslint": "bin/eslint.js"
1268 | },
1269 | "engines": {
1270 | "node": "^12.22.0 || ^14.17.0 || >=16.0.0"
1271 | },
1272 | "funding": {
1273 | "url": "https://opencollective.com/eslint"
1274 | }
1275 | },
1276 | "node_modules/eslint-config-airbnb": {
1277 | "version": "19.0.4",
1278 | "dev": true,
1279 | "license": "MIT",
1280 | "dependencies": {
1281 | "eslint-config-airbnb-base": "^15.0.0",
1282 | "object.assign": "^4.1.2",
1283 | "object.entries": "^1.1.5"
1284 | },
1285 | "engines": {
1286 | "node": "^10.12.0 || ^12.22.0 || ^14.17.0 || >=16.0.0"
1287 | },
1288 | "peerDependencies": {
1289 | "eslint": "^7.32.0 || ^8.2.0",
1290 | "eslint-plugin-import": "^2.25.3",
1291 | "eslint-plugin-jsx-a11y": "^6.5.1",
1292 | "eslint-plugin-react": "^7.28.0",
1293 | "eslint-plugin-react-hooks": "^4.3.0"
1294 | }
1295 | },
1296 | "node_modules/eslint-config-airbnb-base": {
1297 | "version": "15.0.0",
1298 | "dev": true,
1299 | "license": "MIT",
1300 | "dependencies": {
1301 | "confusing-browser-globals": "^1.0.10",
1302 | "object.assign": "^4.1.2",
1303 | "object.entries": "^1.1.5",
1304 | "semver": "^6.3.0"
1305 | },
1306 | "engines": {
1307 | "node": "^10.12.0 || >=12.0.0"
1308 | },
1309 | "peerDependencies": {
1310 | "eslint": "^7.32.0 || ^8.2.0",
1311 | "eslint-plugin-import": "^2.25.2"
1312 | }
1313 | },
1314 | "node_modules/eslint-config-airbnb-typescript": {
1315 | "version": "18.0.0",
1316 | "resolved": "https://registry.npmjs.org/eslint-config-airbnb-typescript/-/eslint-config-airbnb-typescript-18.0.0.tgz",
1317 | "integrity": "sha512-oc+Lxzgzsu8FQyFVa4QFaVKiitTYiiW3frB9KYW5OWdPrqFc7FzxgB20hP4cHMlr+MBzGcLl3jnCOVOydL9mIg==",
1318 | "dev": true,
1319 | "dependencies": {
1320 | "eslint-config-airbnb-base": "^15.0.0"
1321 | },
1322 | "peerDependencies": {
1323 | "@typescript-eslint/eslint-plugin": "^7.0.0",
1324 | "@typescript-eslint/parser": "^7.0.0",
1325 | "eslint": "^8.56.0"
1326 | }
1327 | },
1328 | "node_modules/eslint-import-resolver-node": {
1329 | "version": "0.3.9",
1330 | "dev": true,
1331 | "license": "MIT",
1332 | "dependencies": {
1333 | "debug": "^3.2.7",
1334 | "is-core-module": "^2.13.0",
1335 | "resolve": "^1.22.4"
1336 | }
1337 | },
1338 | "node_modules/eslint-import-resolver-node/node_modules/debug": {
1339 | "version": "3.2.7",
1340 | "dev": true,
1341 | "license": "MIT",
1342 | "dependencies": {
1343 | "ms": "^2.1.1"
1344 | }
1345 | },
1346 | "node_modules/eslint-import-resolver-node/node_modules/ms": {
1347 | "version": "2.1.3",
1348 | "dev": true,
1349 | "license": "MIT"
1350 | },
1351 | "node_modules/eslint-import-resolver-node/node_modules/resolve": {
1352 | "version": "1.22.8",
1353 | "dev": true,
1354 | "license": "MIT",
1355 | "dependencies": {
1356 | "is-core-module": "^2.13.0",
1357 | "path-parse": "^1.0.7",
1358 | "supports-preserve-symlinks-flag": "^1.0.0"
1359 | },
1360 | "bin": {
1361 | "resolve": "bin/resolve"
1362 | },
1363 | "funding": {
1364 | "url": "https://github.com/sponsors/ljharb"
1365 | }
1366 | },
1367 | "node_modules/eslint-module-utils": {
1368 | "version": "2.8.0",
1369 | "dev": true,
1370 | "license": "MIT",
1371 | "dependencies": {
1372 | "debug": "^3.2.7"
1373 | },
1374 | "engines": {
1375 | "node": ">=4"
1376 | },
1377 | "peerDependenciesMeta": {
1378 | "eslint": {
1379 | "optional": true
1380 | }
1381 | }
1382 | },
1383 | "node_modules/eslint-module-utils/node_modules/debug": {
1384 | "version": "3.2.7",
1385 | "dev": true,
1386 | "license": "MIT",
1387 | "dependencies": {
1388 | "ms": "^2.1.1"
1389 | }
1390 | },
1391 | "node_modules/eslint-module-utils/node_modules/ms": {
1392 | "version": "2.1.3",
1393 | "dev": true,
1394 | "license": "MIT"
1395 | },
1396 | "node_modules/eslint-plugin-import": {
1397 | "version": "2.29.1",
1398 | "dev": true,
1399 | "license": "MIT",
1400 | "dependencies": {
1401 | "array-includes": "^3.1.7",
1402 | "array.prototype.findlastindex": "^1.2.3",
1403 | "array.prototype.flat": "^1.3.2",
1404 | "array.prototype.flatmap": "^1.3.2",
1405 | "debug": "^3.2.7",
1406 | "doctrine": "^2.1.0",
1407 | "eslint-import-resolver-node": "^0.3.9",
1408 | "eslint-module-utils": "^2.8.0",
1409 | "hasown": "^2.0.0",
1410 | "is-core-module": "^2.13.1",
1411 | "is-glob": "^4.0.3",
1412 | "minimatch": "^3.1.2",
1413 | "object.fromentries": "^2.0.7",
1414 | "object.groupby": "^1.0.1",
1415 | "object.values": "^1.1.7",
1416 | "semver": "^6.3.1",
1417 | "tsconfig-paths": "^3.15.0"
1418 | },
1419 | "engines": {
1420 | "node": ">=4"
1421 | },
1422 | "peerDependencies": {
1423 | "eslint": "^2 || ^3 || ^4 || ^5 || ^6 || ^7.2.0 || ^8"
1424 | }
1425 | },
1426 | "node_modules/eslint-plugin-import/node_modules/debug": {
1427 | "version": "3.2.7",
1428 | "dev": true,
1429 | "license": "MIT",
1430 | "dependencies": {
1431 | "ms": "^2.1.1"
1432 | }
1433 | },
1434 | "node_modules/eslint-plugin-import/node_modules/ms": {
1435 | "version": "2.1.3",
1436 | "dev": true,
1437 | "license": "MIT"
1438 | },
1439 | "node_modules/eslint-plugin-jsx-a11y": {
1440 | "version": "6.8.0",
1441 | "dev": true,
1442 | "license": "MIT",
1443 | "dependencies": {
1444 | "@babel/runtime": "^7.23.2",
1445 | "aria-query": "^5.3.0",
1446 | "array-includes": "^3.1.7",
1447 | "array.prototype.flatmap": "^1.3.2",
1448 | "ast-types-flow": "^0.0.8",
1449 | "axe-core": "=4.7.0",
1450 | "axobject-query": "^3.2.1",
1451 | "damerau-levenshtein": "^1.0.8",
1452 | "emoji-regex": "^9.2.2",
1453 | "es-iterator-helpers": "^1.0.15",
1454 | "hasown": "^2.0.0",
1455 | "jsx-ast-utils": "^3.3.5",
1456 | "language-tags": "^1.0.9",
1457 | "minimatch": "^3.1.2",
1458 | "object.entries": "^1.1.7",
1459 | "object.fromentries": "^2.0.7"
1460 | },
1461 | "engines": {
1462 | "node": ">=4.0"
1463 | },
1464 | "peerDependencies": {
1465 | "eslint": "^3 || ^4 || ^5 || ^6 || ^7 || ^8"
1466 | }
1467 | },
1468 | "node_modules/eslint-plugin-react": {
1469 | "version": "7.34.1",
1470 | "resolved": "https://registry.npmjs.org/eslint-plugin-react/-/eslint-plugin-react-7.34.1.tgz",
1471 | "integrity": "sha512-N97CxlouPT1AHt8Jn0mhhN2RrADlUAsk1/atcT2KyA/l9Q/E6ll7OIGwNumFmWfZ9skV3XXccYS19h80rHtgkw==",
1472 | "dev": true,
1473 | "dependencies": {
1474 | "array-includes": "^3.1.7",
1475 | "array.prototype.findlast": "^1.2.4",
1476 | "array.prototype.flatmap": "^1.3.2",
1477 | "array.prototype.toreversed": "^1.1.2",
1478 | "array.prototype.tosorted": "^1.1.3",
1479 | "doctrine": "^2.1.0",
1480 | "es-iterator-helpers": "^1.0.17",
1481 | "estraverse": "^5.3.0",
1482 | "jsx-ast-utils": "^2.4.1 || ^3.0.0",
1483 | "minimatch": "^3.1.2",
1484 | "object.entries": "^1.1.7",
1485 | "object.fromentries": "^2.0.7",
1486 | "object.hasown": "^1.1.3",
1487 | "object.values": "^1.1.7",
1488 | "prop-types": "^15.8.1",
1489 | "resolve": "^2.0.0-next.5",
1490 | "semver": "^6.3.1",
1491 | "string.prototype.matchall": "^4.0.10"
1492 | },
1493 | "engines": {
1494 | "node": ">=4"
1495 | },
1496 | "peerDependencies": {
1497 | "eslint": "^3 || ^4 || ^5 || ^6 || ^7 || ^8"
1498 | }
1499 | },
1500 | "node_modules/eslint-plugin-react-hooks": {
1501 | "version": "4.6.0",
1502 | "dev": true,
1503 | "license": "MIT",
1504 | "engines": {
1505 | "node": ">=10"
1506 | },
1507 | "peerDependencies": {
1508 | "eslint": "^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0-0"
1509 | }
1510 | },
1511 | "node_modules/eslint-scope": {
1512 | "version": "7.2.2",
1513 | "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-7.2.2.tgz",
1514 | "integrity": "sha512-dOt21O7lTMhDM+X9mB4GX+DZrZtCUJPL/wlcTqxyrx5IvO0IYtILdtrQGQp+8n5S0gwSVmOf9NQrjMOgfQZlIg==",
1515 | "dev": true,
1516 | "dependencies": {
1517 | "esrecurse": "^4.3.0",
1518 | "estraverse": "^5.2.0"
1519 | },
1520 | "engines": {
1521 | "node": "^12.22.0 || ^14.17.0 || >=16.0.0"
1522 | },
1523 | "funding": {
1524 | "url": "https://opencollective.com/eslint"
1525 | }
1526 | },
1527 | "node_modules/eslint-visitor-keys": {
1528 | "version": "3.4.3",
1529 | "dev": true,
1530 | "license": "Apache-2.0",
1531 | "engines": {
1532 | "node": "^12.22.0 || ^14.17.0 || >=16.0.0"
1533 | },
1534 | "funding": {
1535 | "url": "https://opencollective.com/eslint"
1536 | }
1537 | },
1538 | "node_modules/eslint/node_modules/doctrine": {
1539 | "version": "3.0.0",
1540 | "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-3.0.0.tgz",
1541 | "integrity": "sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==",
1542 | "dev": true,
1543 | "dependencies": {
1544 | "esutils": "^2.0.2"
1545 | },
1546 | "engines": {
1547 | "node": ">=6.0.0"
1548 | }
1549 | },
1550 | "node_modules/espree": {
1551 | "version": "9.6.1",
1552 | "resolved": "https://registry.npmjs.org/espree/-/espree-9.6.1.tgz",
1553 | "integrity": "sha512-oruZaFkjorTpF32kDSI5/75ViwGeZginGGy2NoOSg3Q9bnwlnmDm4HLnkl0RE3n+njDXR037aY1+x58Z/zFdwQ==",
1554 | "dev": true,
1555 | "dependencies": {
1556 | "acorn": "^8.9.0",
1557 | "acorn-jsx": "^5.3.2",
1558 | "eslint-visitor-keys": "^3.4.1"
1559 | },
1560 | "engines": {
1561 | "node": "^12.22.0 || ^14.17.0 || >=16.0.0"
1562 | },
1563 | "funding": {
1564 | "url": "https://opencollective.com/eslint"
1565 | }
1566 | },
1567 | "node_modules/esquery": {
1568 | "version": "1.5.0",
1569 | "dev": true,
1570 | "license": "BSD-3-Clause",
1571 | "dependencies": {
1572 | "estraverse": "^5.1.0"
1573 | },
1574 | "engines": {
1575 | "node": ">=0.10"
1576 | }
1577 | },
1578 | "node_modules/esrecurse": {
1579 | "version": "4.3.0",
1580 | "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz",
1581 | "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==",
1582 | "dev": true,
1583 | "dependencies": {
1584 | "estraverse": "^5.2.0"
1585 | },
1586 | "engines": {
1587 | "node": ">=4.0"
1588 | }
1589 | },
1590 | "node_modules/estraverse": {
1591 | "version": "5.3.0",
1592 | "dev": true,
1593 | "license": "BSD-2-Clause",
1594 | "engines": {
1595 | "node": ">=4.0"
1596 | }
1597 | },
1598 | "node_modules/esutils": {
1599 | "version": "2.0.3",
1600 | "dev": true,
1601 | "license": "BSD-2-Clause",
1602 | "engines": {
1603 | "node": ">=0.10.0"
1604 | }
1605 | },
1606 | "node_modules/fast-deep-equal": {
1607 | "version": "3.1.3",
1608 | "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz",
1609 | "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==",
1610 | "dev": true
1611 | },
1612 | "node_modules/fast-glob": {
1613 | "version": "3.3.2",
1614 | "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.2.tgz",
1615 | "integrity": "sha512-oX2ruAFQwf/Orj8m737Y5adxDQO0LAB7/S5MnxCdTNDd4p6BsyIVsv9JQsATbTSq8KHRpLwIHbVlUNatxd+1Ow==",
1616 | "dev": true,
1617 | "dependencies": {
1618 | "@nodelib/fs.stat": "^2.0.2",
1619 | "@nodelib/fs.walk": "^1.2.3",
1620 | "glob-parent": "^5.1.2",
1621 | "merge2": "^1.3.0",
1622 | "micromatch": "^4.0.4"
1623 | },
1624 | "engines": {
1625 | "node": ">=8.6.0"
1626 | }
1627 | },
1628 | "node_modules/fast-glob/node_modules/glob-parent": {
1629 | "version": "5.1.2",
1630 | "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz",
1631 | "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==",
1632 | "dev": true,
1633 | "dependencies": {
1634 | "is-glob": "^4.0.1"
1635 | },
1636 | "engines": {
1637 | "node": ">= 6"
1638 | }
1639 | },
1640 | "node_modules/fast-json-stable-stringify": {
1641 | "version": "2.1.0",
1642 | "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz",
1643 | "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==",
1644 | "dev": true
1645 | },
1646 | "node_modules/fast-levenshtein": {
1647 | "version": "2.0.6",
1648 | "dev": true,
1649 | "license": "MIT"
1650 | },
1651 | "node_modules/fastq": {
1652 | "version": "1.16.0",
1653 | "dev": true,
1654 | "license": "ISC",
1655 | "dependencies": {
1656 | "reusify": "^1.0.4"
1657 | }
1658 | },
1659 | "node_modules/file-entry-cache": {
1660 | "version": "6.0.1",
1661 | "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-6.0.1.tgz",
1662 | "integrity": "sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==",
1663 | "dev": true,
1664 | "dependencies": {
1665 | "flat-cache": "^3.0.4"
1666 | },
1667 | "engines": {
1668 | "node": "^10.12.0 || >=12.0.0"
1669 | }
1670 | },
1671 | "node_modules/fill-range": {
1672 | "version": "7.0.1",
1673 | "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz",
1674 | "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==",
1675 | "dev": true,
1676 | "dependencies": {
1677 | "to-regex-range": "^5.0.1"
1678 | },
1679 | "engines": {
1680 | "node": ">=8"
1681 | }
1682 | },
1683 | "node_modules/find-up": {
1684 | "version": "5.0.0",
1685 | "dev": true,
1686 | "license": "MIT",
1687 | "dependencies": {
1688 | "locate-path": "^6.0.0",
1689 | "path-exists": "^4.0.0"
1690 | },
1691 | "engines": {
1692 | "node": ">=10"
1693 | },
1694 | "funding": {
1695 | "url": "https://github.com/sponsors/sindresorhus"
1696 | }
1697 | },
1698 | "node_modules/flat-cache": {
1699 | "version": "3.2.0",
1700 | "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-3.2.0.tgz",
1701 | "integrity": "sha512-CYcENa+FtcUKLmhhqyctpclsq7QF38pKjZHsGNiSQF5r4FtoKDWabFDl3hzaEQMvT1LHEysw5twgLvpYYb4vbw==",
1702 | "dev": true,
1703 | "dependencies": {
1704 | "flatted": "^3.2.9",
1705 | "keyv": "^4.5.3",
1706 | "rimraf": "^3.0.2"
1707 | },
1708 | "engines": {
1709 | "node": "^10.12.0 || >=12.0.0"
1710 | }
1711 | },
1712 | "node_modules/flatted": {
1713 | "version": "3.3.1",
1714 | "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.3.1.tgz",
1715 | "integrity": "sha512-X8cqMLLie7KsNUDSdzeN8FYK9rEt4Dt67OsG/DNGnYTSDBG4uFAJFBnUeiV+zCVAvwFy56IjM9sH51jVaEhNxw==",
1716 | "dev": true
1717 | },
1718 | "node_modules/for-each": {
1719 | "version": "0.3.3",
1720 | "dev": true,
1721 | "license": "MIT",
1722 | "dependencies": {
1723 | "is-callable": "^1.1.3"
1724 | }
1725 | },
1726 | "node_modules/fs.realpath": {
1727 | "version": "1.0.0",
1728 | "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz",
1729 | "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==",
1730 | "dev": true
1731 | },
1732 | "node_modules/function-bind": {
1733 | "version": "1.1.2",
1734 | "dev": true,
1735 | "license": "MIT",
1736 | "funding": {
1737 | "url": "https://github.com/sponsors/ljharb"
1738 | }
1739 | },
1740 | "node_modules/function.prototype.name": {
1741 | "version": "1.1.6",
1742 | "dev": true,
1743 | "license": "MIT",
1744 | "dependencies": {
1745 | "call-bind": "^1.0.2",
1746 | "define-properties": "^1.2.0",
1747 | "es-abstract": "^1.22.1",
1748 | "functions-have-names": "^1.2.3"
1749 | },
1750 | "engines": {
1751 | "node": ">= 0.4"
1752 | },
1753 | "funding": {
1754 | "url": "https://github.com/sponsors/ljharb"
1755 | }
1756 | },
1757 | "node_modules/functions-have-names": {
1758 | "version": "1.2.3",
1759 | "dev": true,
1760 | "license": "MIT",
1761 | "funding": {
1762 | "url": "https://github.com/sponsors/ljharb"
1763 | }
1764 | },
1765 | "node_modules/get-intrinsic": {
1766 | "version": "1.2.4",
1767 | "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.4.tgz",
1768 | "integrity": "sha512-5uYhsJH8VJBTv7oslg4BznJYhDoRI6waYCxMmCdnTrcCrHA/fCFKoTFz2JKKE0HdDFUF7/oQuhzumXJK7paBRQ==",
1769 | "dev": true,
1770 | "dependencies": {
1771 | "es-errors": "^1.3.0",
1772 | "function-bind": "^1.1.2",
1773 | "has-proto": "^1.0.1",
1774 | "has-symbols": "^1.0.3",
1775 | "hasown": "^2.0.0"
1776 | },
1777 | "engines": {
1778 | "node": ">= 0.4"
1779 | },
1780 | "funding": {
1781 | "url": "https://github.com/sponsors/ljharb"
1782 | }
1783 | },
1784 | "node_modules/get-symbol-description": {
1785 | "version": "1.0.2",
1786 | "resolved": "https://registry.npmjs.org/get-symbol-description/-/get-symbol-description-1.0.2.tgz",
1787 | "integrity": "sha512-g0QYk1dZBxGwk+Ngc+ltRH2IBp2f7zBkBMBJZCDerh6EhlhSR6+9irMCuT/09zD6qkarHUSn529sK/yL4S27mg==",
1788 | "dev": true,
1789 | "dependencies": {
1790 | "call-bind": "^1.0.5",
1791 | "es-errors": "^1.3.0",
1792 | "get-intrinsic": "^1.2.4"
1793 | },
1794 | "engines": {
1795 | "node": ">= 0.4"
1796 | },
1797 | "funding": {
1798 | "url": "https://github.com/sponsors/ljharb"
1799 | }
1800 | },
1801 | "node_modules/glob": {
1802 | "version": "7.2.3",
1803 | "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz",
1804 | "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==",
1805 | "dev": true,
1806 | "dependencies": {
1807 | "fs.realpath": "^1.0.0",
1808 | "inflight": "^1.0.4",
1809 | "inherits": "2",
1810 | "minimatch": "^3.1.1",
1811 | "once": "^1.3.0",
1812 | "path-is-absolute": "^1.0.0"
1813 | },
1814 | "engines": {
1815 | "node": "*"
1816 | },
1817 | "funding": {
1818 | "url": "https://github.com/sponsors/isaacs"
1819 | }
1820 | },
1821 | "node_modules/glob-parent": {
1822 | "version": "6.0.2",
1823 | "dev": true,
1824 | "license": "ISC",
1825 | "dependencies": {
1826 | "is-glob": "^4.0.3"
1827 | },
1828 | "engines": {
1829 | "node": ">=10.13.0"
1830 | }
1831 | },
1832 | "node_modules/globals": {
1833 | "version": "13.24.0",
1834 | "resolved": "https://registry.npmjs.org/globals/-/globals-13.24.0.tgz",
1835 | "integrity": "sha512-AhO5QUcj8llrbG09iWhPU2B204J1xnPeL8kQmVorSsy+Sjj1sk8gIyh6cUocGmH4L0UuhAJy+hJMRA4mgA4mFQ==",
1836 | "dev": true,
1837 | "dependencies": {
1838 | "type-fest": "^0.20.2"
1839 | },
1840 | "engines": {
1841 | "node": ">=8"
1842 | },
1843 | "funding": {
1844 | "url": "https://github.com/sponsors/sindresorhus"
1845 | }
1846 | },
1847 | "node_modules/globalthis": {
1848 | "version": "1.0.3",
1849 | "dev": true,
1850 | "license": "MIT",
1851 | "dependencies": {
1852 | "define-properties": "^1.1.3"
1853 | },
1854 | "engines": {
1855 | "node": ">= 0.4"
1856 | },
1857 | "funding": {
1858 | "url": "https://github.com/sponsors/ljharb"
1859 | }
1860 | },
1861 | "node_modules/globby": {
1862 | "version": "11.1.0",
1863 | "resolved": "https://registry.npmjs.org/globby/-/globby-11.1.0.tgz",
1864 | "integrity": "sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==",
1865 | "dev": true,
1866 | "dependencies": {
1867 | "array-union": "^2.1.0",
1868 | "dir-glob": "^3.0.1",
1869 | "fast-glob": "^3.2.9",
1870 | "ignore": "^5.2.0",
1871 | "merge2": "^1.4.1",
1872 | "slash": "^3.0.0"
1873 | },
1874 | "engines": {
1875 | "node": ">=10"
1876 | },
1877 | "funding": {
1878 | "url": "https://github.com/sponsors/sindresorhus"
1879 | }
1880 | },
1881 | "node_modules/gopd": {
1882 | "version": "1.0.1",
1883 | "dev": true,
1884 | "license": "MIT",
1885 | "dependencies": {
1886 | "get-intrinsic": "^1.1.3"
1887 | },
1888 | "funding": {
1889 | "url": "https://github.com/sponsors/ljharb"
1890 | }
1891 | },
1892 | "node_modules/graphemer": {
1893 | "version": "1.4.0",
1894 | "dev": true,
1895 | "license": "MIT"
1896 | },
1897 | "node_modules/has-bigints": {
1898 | "version": "1.0.2",
1899 | "dev": true,
1900 | "license": "MIT",
1901 | "funding": {
1902 | "url": "https://github.com/sponsors/ljharb"
1903 | }
1904 | },
1905 | "node_modules/has-flag": {
1906 | "version": "4.0.0",
1907 | "dev": true,
1908 | "license": "MIT",
1909 | "engines": {
1910 | "node": ">=8"
1911 | }
1912 | },
1913 | "node_modules/has-property-descriptors": {
1914 | "version": "1.0.2",
1915 | "resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.2.tgz",
1916 | "integrity": "sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg==",
1917 | "dev": true,
1918 | "dependencies": {
1919 | "es-define-property": "^1.0.0"
1920 | },
1921 | "funding": {
1922 | "url": "https://github.com/sponsors/ljharb"
1923 | }
1924 | },
1925 | "node_modules/has-proto": {
1926 | "version": "1.0.3",
1927 | "resolved": "https://registry.npmjs.org/has-proto/-/has-proto-1.0.3.tgz",
1928 | "integrity": "sha512-SJ1amZAJUiZS+PhsVLf5tGydlaVB8EdFpaSO4gmiUKUOxk8qzn5AIy4ZeJUmh22znIdk/uMAUT2pl3FxzVUH+Q==",
1929 | "dev": true,
1930 | "engines": {
1931 | "node": ">= 0.4"
1932 | },
1933 | "funding": {
1934 | "url": "https://github.com/sponsors/ljharb"
1935 | }
1936 | },
1937 | "node_modules/has-symbols": {
1938 | "version": "1.0.3",
1939 | "dev": true,
1940 | "license": "MIT",
1941 | "engines": {
1942 | "node": ">= 0.4"
1943 | },
1944 | "funding": {
1945 | "url": "https://github.com/sponsors/ljharb"
1946 | }
1947 | },
1948 | "node_modules/has-tostringtag": {
1949 | "version": "1.0.2",
1950 | "resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.2.tgz",
1951 | "integrity": "sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==",
1952 | "dev": true,
1953 | "dependencies": {
1954 | "has-symbols": "^1.0.3"
1955 | },
1956 | "engines": {
1957 | "node": ">= 0.4"
1958 | },
1959 | "funding": {
1960 | "url": "https://github.com/sponsors/ljharb"
1961 | }
1962 | },
1963 | "node_modules/hasown": {
1964 | "version": "2.0.2",
1965 | "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz",
1966 | "integrity": "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==",
1967 | "dev": true,
1968 | "dependencies": {
1969 | "function-bind": "^1.1.2"
1970 | },
1971 | "engines": {
1972 | "node": ">= 0.4"
1973 | }
1974 | },
1975 | "node_modules/ignore": {
1976 | "version": "5.3.1",
1977 | "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.1.tgz",
1978 | "integrity": "sha512-5Fytz/IraMjqpwfd34ke28PTVMjZjJG2MPn5t7OE4eUCUNf8BAa7b5WUS9/Qvr6mwOQS7Mk6vdsMno5he+T8Xw==",
1979 | "dev": true,
1980 | "engines": {
1981 | "node": ">= 4"
1982 | }
1983 | },
1984 | "node_modules/import-fresh": {
1985 | "version": "3.3.0",
1986 | "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz",
1987 | "integrity": "sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==",
1988 | "dev": true,
1989 | "dependencies": {
1990 | "parent-module": "^1.0.0",
1991 | "resolve-from": "^4.0.0"
1992 | },
1993 | "engines": {
1994 | "node": ">=6"
1995 | },
1996 | "funding": {
1997 | "url": "https://github.com/sponsors/sindresorhus"
1998 | }
1999 | },
2000 | "node_modules/imurmurhash": {
2001 | "version": "0.1.4",
2002 | "dev": true,
2003 | "license": "MIT",
2004 | "engines": {
2005 | "node": ">=0.8.19"
2006 | }
2007 | },
2008 | "node_modules/inflight": {
2009 | "version": "1.0.6",
2010 | "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz",
2011 | "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==",
2012 | "dev": true,
2013 | "dependencies": {
2014 | "once": "^1.3.0",
2015 | "wrappy": "1"
2016 | }
2017 | },
2018 | "node_modules/inherits": {
2019 | "version": "2.0.4",
2020 | "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz",
2021 | "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==",
2022 | "dev": true
2023 | },
2024 | "node_modules/internal-slot": {
2025 | "version": "1.0.7",
2026 | "resolved": "https://registry.npmjs.org/internal-slot/-/internal-slot-1.0.7.tgz",
2027 | "integrity": "sha512-NGnrKwXzSms2qUUih/ILZ5JBqNTSa1+ZmP6flaIp6KmSElgE9qdndzS3cqjrDovwFdmwsGsLdeFgB6suw+1e9g==",
2028 | "dev": true,
2029 | "dependencies": {
2030 | "es-errors": "^1.3.0",
2031 | "hasown": "^2.0.0",
2032 | "side-channel": "^1.0.4"
2033 | },
2034 | "engines": {
2035 | "node": ">= 0.4"
2036 | }
2037 | },
2038 | "node_modules/is-array-buffer": {
2039 | "version": "3.0.4",
2040 | "resolved": "https://registry.npmjs.org/is-array-buffer/-/is-array-buffer-3.0.4.tgz",
2041 | "integrity": "sha512-wcjaerHw0ydZwfhiKbXJWLDY8A7yV7KhjQOpb83hGgGfId/aQa4TOvwyzn2PuswW2gPCYEL/nEAiSVpdOj1lXw==",
2042 | "dev": true,
2043 | "dependencies": {
2044 | "call-bind": "^1.0.2",
2045 | "get-intrinsic": "^1.2.1"
2046 | },
2047 | "engines": {
2048 | "node": ">= 0.4"
2049 | },
2050 | "funding": {
2051 | "url": "https://github.com/sponsors/ljharb"
2052 | }
2053 | },
2054 | "node_modules/is-async-function": {
2055 | "version": "2.0.0",
2056 | "dev": true,
2057 | "license": "MIT",
2058 | "dependencies": {
2059 | "has-tostringtag": "^1.0.0"
2060 | },
2061 | "engines": {
2062 | "node": ">= 0.4"
2063 | },
2064 | "funding": {
2065 | "url": "https://github.com/sponsors/ljharb"
2066 | }
2067 | },
2068 | "node_modules/is-bigint": {
2069 | "version": "1.0.4",
2070 | "dev": true,
2071 | "license": "MIT",
2072 | "dependencies": {
2073 | "has-bigints": "^1.0.1"
2074 | },
2075 | "funding": {
2076 | "url": "https://github.com/sponsors/ljharb"
2077 | }
2078 | },
2079 | "node_modules/is-boolean-object": {
2080 | "version": "1.1.2",
2081 | "dev": true,
2082 | "license": "MIT",
2083 | "dependencies": {
2084 | "call-bind": "^1.0.2",
2085 | "has-tostringtag": "^1.0.0"
2086 | },
2087 | "engines": {
2088 | "node": ">= 0.4"
2089 | },
2090 | "funding": {
2091 | "url": "https://github.com/sponsors/ljharb"
2092 | }
2093 | },
2094 | "node_modules/is-callable": {
2095 | "version": "1.2.7",
2096 | "dev": true,
2097 | "license": "MIT",
2098 | "engines": {
2099 | "node": ">= 0.4"
2100 | },
2101 | "funding": {
2102 | "url": "https://github.com/sponsors/ljharb"
2103 | }
2104 | },
2105 | "node_modules/is-core-module": {
2106 | "version": "2.13.1",
2107 | "dev": true,
2108 | "license": "MIT",
2109 | "dependencies": {
2110 | "hasown": "^2.0.0"
2111 | },
2112 | "funding": {
2113 | "url": "https://github.com/sponsors/ljharb"
2114 | }
2115 | },
2116 | "node_modules/is-date-object": {
2117 | "version": "1.0.5",
2118 | "dev": true,
2119 | "license": "MIT",
2120 | "dependencies": {
2121 | "has-tostringtag": "^1.0.0"
2122 | },
2123 | "engines": {
2124 | "node": ">= 0.4"
2125 | },
2126 | "funding": {
2127 | "url": "https://github.com/sponsors/ljharb"
2128 | }
2129 | },
2130 | "node_modules/is-extglob": {
2131 | "version": "2.1.1",
2132 | "dev": true,
2133 | "license": "MIT",
2134 | "engines": {
2135 | "node": ">=0.10.0"
2136 | }
2137 | },
2138 | "node_modules/is-finalizationregistry": {
2139 | "version": "1.0.2",
2140 | "dev": true,
2141 | "license": "MIT",
2142 | "dependencies": {
2143 | "call-bind": "^1.0.2"
2144 | },
2145 | "funding": {
2146 | "url": "https://github.com/sponsors/ljharb"
2147 | }
2148 | },
2149 | "node_modules/is-generator-function": {
2150 | "version": "1.0.10",
2151 | "dev": true,
2152 | "license": "MIT",
2153 | "dependencies": {
2154 | "has-tostringtag": "^1.0.0"
2155 | },
2156 | "engines": {
2157 | "node": ">= 0.4"
2158 | },
2159 | "funding": {
2160 | "url": "https://github.com/sponsors/ljharb"
2161 | }
2162 | },
2163 | "node_modules/is-glob": {
2164 | "version": "4.0.3",
2165 | "dev": true,
2166 | "license": "MIT",
2167 | "dependencies": {
2168 | "is-extglob": "^2.1.1"
2169 | },
2170 | "engines": {
2171 | "node": ">=0.10.0"
2172 | }
2173 | },
2174 | "node_modules/is-map": {
2175 | "version": "2.0.2",
2176 | "dev": true,
2177 | "license": "MIT",
2178 | "funding": {
2179 | "url": "https://github.com/sponsors/ljharb"
2180 | }
2181 | },
2182 | "node_modules/is-negative-zero": {
2183 | "version": "2.0.3",
2184 | "resolved": "https://registry.npmjs.org/is-negative-zero/-/is-negative-zero-2.0.3.tgz",
2185 | "integrity": "sha512-5KoIu2Ngpyek75jXodFvnafB6DJgr3u8uuK0LEZJjrU19DrMD3EVERaR8sjz8CCGgpZvxPl9SuE1GMVPFHx1mw==",
2186 | "dev": true,
2187 | "engines": {
2188 | "node": ">= 0.4"
2189 | },
2190 | "funding": {
2191 | "url": "https://github.com/sponsors/ljharb"
2192 | }
2193 | },
2194 | "node_modules/is-number": {
2195 | "version": "7.0.0",
2196 | "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz",
2197 | "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==",
2198 | "dev": true,
2199 | "engines": {
2200 | "node": ">=0.12.0"
2201 | }
2202 | },
2203 | "node_modules/is-number-object": {
2204 | "version": "1.0.7",
2205 | "dev": true,
2206 | "license": "MIT",
2207 | "dependencies": {
2208 | "has-tostringtag": "^1.0.0"
2209 | },
2210 | "engines": {
2211 | "node": ">= 0.4"
2212 | },
2213 | "funding": {
2214 | "url": "https://github.com/sponsors/ljharb"
2215 | }
2216 | },
2217 | "node_modules/is-path-inside": {
2218 | "version": "3.0.3",
2219 | "dev": true,
2220 | "license": "MIT",
2221 | "engines": {
2222 | "node": ">=8"
2223 | }
2224 | },
2225 | "node_modules/is-regex": {
2226 | "version": "1.1.4",
2227 | "dev": true,
2228 | "license": "MIT",
2229 | "dependencies": {
2230 | "call-bind": "^1.0.2",
2231 | "has-tostringtag": "^1.0.0"
2232 | },
2233 | "engines": {
2234 | "node": ">= 0.4"
2235 | },
2236 | "funding": {
2237 | "url": "https://github.com/sponsors/ljharb"
2238 | }
2239 | },
2240 | "node_modules/is-set": {
2241 | "version": "2.0.2",
2242 | "dev": true,
2243 | "license": "MIT",
2244 | "funding": {
2245 | "url": "https://github.com/sponsors/ljharb"
2246 | }
2247 | },
2248 | "node_modules/is-shared-array-buffer": {
2249 | "version": "1.0.3",
2250 | "resolved": "https://registry.npmjs.org/is-shared-array-buffer/-/is-shared-array-buffer-1.0.3.tgz",
2251 | "integrity": "sha512-nA2hv5XIhLR3uVzDDfCIknerhx8XUKnstuOERPNNIinXG7v9u+ohXF67vxm4TPTEPU6lm61ZkwP3c9PCB97rhg==",
2252 | "dev": true,
2253 | "dependencies": {
2254 | "call-bind": "^1.0.7"
2255 | },
2256 | "engines": {
2257 | "node": ">= 0.4"
2258 | },
2259 | "funding": {
2260 | "url": "https://github.com/sponsors/ljharb"
2261 | }
2262 | },
2263 | "node_modules/is-string": {
2264 | "version": "1.0.7",
2265 | "dev": true,
2266 | "license": "MIT",
2267 | "dependencies": {
2268 | "has-tostringtag": "^1.0.0"
2269 | },
2270 | "engines": {
2271 | "node": ">= 0.4"
2272 | },
2273 | "funding": {
2274 | "url": "https://github.com/sponsors/ljharb"
2275 | }
2276 | },
2277 | "node_modules/is-symbol": {
2278 | "version": "1.0.4",
2279 | "dev": true,
2280 | "license": "MIT",
2281 | "dependencies": {
2282 | "has-symbols": "^1.0.2"
2283 | },
2284 | "engines": {
2285 | "node": ">= 0.4"
2286 | },
2287 | "funding": {
2288 | "url": "https://github.com/sponsors/ljharb"
2289 | }
2290 | },
2291 | "node_modules/is-typed-array": {
2292 | "version": "1.1.13",
2293 | "resolved": "https://registry.npmjs.org/is-typed-array/-/is-typed-array-1.1.13.tgz",
2294 | "integrity": "sha512-uZ25/bUAlUY5fR4OKT4rZQEBrzQWYV9ZJYGGsUmEJ6thodVJ1HX64ePQ6Z0qPWP+m+Uq6e9UugrE38jeYsDSMw==",
2295 | "dev": true,
2296 | "dependencies": {
2297 | "which-typed-array": "^1.1.14"
2298 | },
2299 | "engines": {
2300 | "node": ">= 0.4"
2301 | },
2302 | "funding": {
2303 | "url": "https://github.com/sponsors/ljharb"
2304 | }
2305 | },
2306 | "node_modules/is-weakmap": {
2307 | "version": "2.0.1",
2308 | "dev": true,
2309 | "license": "MIT",
2310 | "funding": {
2311 | "url": "https://github.com/sponsors/ljharb"
2312 | }
2313 | },
2314 | "node_modules/is-weakref": {
2315 | "version": "1.0.2",
2316 | "dev": true,
2317 | "license": "MIT",
2318 | "dependencies": {
2319 | "call-bind": "^1.0.2"
2320 | },
2321 | "funding": {
2322 | "url": "https://github.com/sponsors/ljharb"
2323 | }
2324 | },
2325 | "node_modules/is-weakset": {
2326 | "version": "2.0.2",
2327 | "dev": true,
2328 | "license": "MIT",
2329 | "dependencies": {
2330 | "call-bind": "^1.0.2",
2331 | "get-intrinsic": "^1.1.1"
2332 | },
2333 | "funding": {
2334 | "url": "https://github.com/sponsors/ljharb"
2335 | }
2336 | },
2337 | "node_modules/isarray": {
2338 | "version": "2.0.5",
2339 | "dev": true,
2340 | "license": "MIT"
2341 | },
2342 | "node_modules/isexe": {
2343 | "version": "2.0.0",
2344 | "dev": true,
2345 | "license": "ISC"
2346 | },
2347 | "node_modules/iterator.prototype": {
2348 | "version": "1.1.2",
2349 | "dev": true,
2350 | "license": "MIT",
2351 | "dependencies": {
2352 | "define-properties": "^1.2.1",
2353 | "get-intrinsic": "^1.2.1",
2354 | "has-symbols": "^1.0.3",
2355 | "reflect.getprototypeof": "^1.0.4",
2356 | "set-function-name": "^2.0.1"
2357 | }
2358 | },
2359 | "node_modules/js-tokens": {
2360 | "version": "4.0.0",
2361 | "dev": true,
2362 | "license": "MIT"
2363 | },
2364 | "node_modules/js-yaml": {
2365 | "version": "4.1.0",
2366 | "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz",
2367 | "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==",
2368 | "dev": true,
2369 | "dependencies": {
2370 | "argparse": "^2.0.1"
2371 | },
2372 | "bin": {
2373 | "js-yaml": "bin/js-yaml.js"
2374 | }
2375 | },
2376 | "node_modules/json-buffer": {
2377 | "version": "3.0.1",
2378 | "resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.1.tgz",
2379 | "integrity": "sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==",
2380 | "dev": true
2381 | },
2382 | "node_modules/json-schema-traverse": {
2383 | "version": "0.4.1",
2384 | "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz",
2385 | "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==",
2386 | "dev": true
2387 | },
2388 | "node_modules/json-stable-stringify-without-jsonify": {
2389 | "version": "1.0.1",
2390 | "dev": true,
2391 | "license": "MIT"
2392 | },
2393 | "node_modules/json5": {
2394 | "version": "1.0.2",
2395 | "dev": true,
2396 | "license": "MIT",
2397 | "dependencies": {
2398 | "minimist": "^1.2.0"
2399 | },
2400 | "bin": {
2401 | "json5": "lib/cli.js"
2402 | }
2403 | },
2404 | "node_modules/jsx-ast-utils": {
2405 | "version": "3.3.5",
2406 | "dev": true,
2407 | "license": "MIT",
2408 | "dependencies": {
2409 | "array-includes": "^3.1.6",
2410 | "array.prototype.flat": "^1.3.1",
2411 | "object.assign": "^4.1.4",
2412 | "object.values": "^1.1.6"
2413 | },
2414 | "engines": {
2415 | "node": ">=4.0"
2416 | }
2417 | },
2418 | "node_modules/keyv": {
2419 | "version": "4.5.4",
2420 | "resolved": "https://registry.npmjs.org/keyv/-/keyv-4.5.4.tgz",
2421 | "integrity": "sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==",
2422 | "dev": true,
2423 | "dependencies": {
2424 | "json-buffer": "3.0.1"
2425 | }
2426 | },
2427 | "node_modules/language-subtag-registry": {
2428 | "version": "0.3.22",
2429 | "dev": true,
2430 | "license": "CC0-1.0"
2431 | },
2432 | "node_modules/language-tags": {
2433 | "version": "1.0.9",
2434 | "dev": true,
2435 | "license": "MIT",
2436 | "dependencies": {
2437 | "language-subtag-registry": "^0.3.20"
2438 | },
2439 | "engines": {
2440 | "node": ">=0.10"
2441 | }
2442 | },
2443 | "node_modules/levn": {
2444 | "version": "0.4.1",
2445 | "dev": true,
2446 | "license": "MIT",
2447 | "dependencies": {
2448 | "prelude-ls": "^1.2.1",
2449 | "type-check": "~0.4.0"
2450 | },
2451 | "engines": {
2452 | "node": ">= 0.8.0"
2453 | }
2454 | },
2455 | "node_modules/locate-path": {
2456 | "version": "6.0.0",
2457 | "dev": true,
2458 | "license": "MIT",
2459 | "dependencies": {
2460 | "p-locate": "^5.0.0"
2461 | },
2462 | "engines": {
2463 | "node": ">=10"
2464 | },
2465 | "funding": {
2466 | "url": "https://github.com/sponsors/sindresorhus"
2467 | }
2468 | },
2469 | "node_modules/lodash.merge": {
2470 | "version": "4.6.2",
2471 | "dev": true,
2472 | "license": "MIT"
2473 | },
2474 | "node_modules/loose-envify": {
2475 | "version": "1.4.0",
2476 | "dev": true,
2477 | "license": "MIT",
2478 | "dependencies": {
2479 | "js-tokens": "^3.0.0 || ^4.0.0"
2480 | },
2481 | "bin": {
2482 | "loose-envify": "cli.js"
2483 | }
2484 | },
2485 | "node_modules/lru-cache": {
2486 | "version": "6.0.0",
2487 | "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz",
2488 | "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==",
2489 | "dev": true,
2490 | "dependencies": {
2491 | "yallist": "^4.0.0"
2492 | },
2493 | "engines": {
2494 | "node": ">=10"
2495 | }
2496 | },
2497 | "node_modules/make-error": {
2498 | "version": "1.3.6",
2499 | "dev": true,
2500 | "license": "ISC"
2501 | },
2502 | "node_modules/merge2": {
2503 | "version": "1.4.1",
2504 | "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz",
2505 | "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==",
2506 | "dev": true,
2507 | "engines": {
2508 | "node": ">= 8"
2509 | }
2510 | },
2511 | "node_modules/micromatch": {
2512 | "version": "4.0.5",
2513 | "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.5.tgz",
2514 | "integrity": "sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==",
2515 | "dev": true,
2516 | "dependencies": {
2517 | "braces": "^3.0.2",
2518 | "picomatch": "^2.3.1"
2519 | },
2520 | "engines": {
2521 | "node": ">=8.6"
2522 | }
2523 | },
2524 | "node_modules/minimatch": {
2525 | "version": "3.1.2",
2526 | "dev": true,
2527 | "license": "ISC",
2528 | "dependencies": {
2529 | "brace-expansion": "^1.1.7"
2530 | },
2531 | "engines": {
2532 | "node": "*"
2533 | }
2534 | },
2535 | "node_modules/minimist": {
2536 | "version": "1.2.8",
2537 | "dev": true,
2538 | "license": "MIT",
2539 | "funding": {
2540 | "url": "https://github.com/sponsors/ljharb"
2541 | }
2542 | },
2543 | "node_modules/ms": {
2544 | "version": "2.1.2",
2545 | "dev": true,
2546 | "license": "MIT"
2547 | },
2548 | "node_modules/natural-compare": {
2549 | "version": "1.4.0",
2550 | "dev": true,
2551 | "license": "MIT"
2552 | },
2553 | "node_modules/object-assign": {
2554 | "version": "4.1.1",
2555 | "dev": true,
2556 | "license": "MIT",
2557 | "engines": {
2558 | "node": ">=0.10.0"
2559 | }
2560 | },
2561 | "node_modules/object-inspect": {
2562 | "version": "1.13.1",
2563 | "dev": true,
2564 | "license": "MIT",
2565 | "funding": {
2566 | "url": "https://github.com/sponsors/ljharb"
2567 | }
2568 | },
2569 | "node_modules/object-keys": {
2570 | "version": "1.1.1",
2571 | "dev": true,
2572 | "license": "MIT",
2573 | "engines": {
2574 | "node": ">= 0.4"
2575 | }
2576 | },
2577 | "node_modules/object.assign": {
2578 | "version": "4.1.5",
2579 | "dev": true,
2580 | "license": "MIT",
2581 | "dependencies": {
2582 | "call-bind": "^1.0.5",
2583 | "define-properties": "^1.2.1",
2584 | "has-symbols": "^1.0.3",
2585 | "object-keys": "^1.1.1"
2586 | },
2587 | "engines": {
2588 | "node": ">= 0.4"
2589 | },
2590 | "funding": {
2591 | "url": "https://github.com/sponsors/ljharb"
2592 | }
2593 | },
2594 | "node_modules/object.entries": {
2595 | "version": "1.1.7",
2596 | "dev": true,
2597 | "license": "MIT",
2598 | "dependencies": {
2599 | "call-bind": "^1.0.2",
2600 | "define-properties": "^1.2.0",
2601 | "es-abstract": "^1.22.1"
2602 | },
2603 | "engines": {
2604 | "node": ">= 0.4"
2605 | }
2606 | },
2607 | "node_modules/object.fromentries": {
2608 | "version": "2.0.7",
2609 | "dev": true,
2610 | "license": "MIT",
2611 | "dependencies": {
2612 | "call-bind": "^1.0.2",
2613 | "define-properties": "^1.2.0",
2614 | "es-abstract": "^1.22.1"
2615 | },
2616 | "engines": {
2617 | "node": ">= 0.4"
2618 | },
2619 | "funding": {
2620 | "url": "https://github.com/sponsors/ljharb"
2621 | }
2622 | },
2623 | "node_modules/object.groupby": {
2624 | "version": "1.0.1",
2625 | "dev": true,
2626 | "license": "MIT",
2627 | "dependencies": {
2628 | "call-bind": "^1.0.2",
2629 | "define-properties": "^1.2.0",
2630 | "es-abstract": "^1.22.1",
2631 | "get-intrinsic": "^1.2.1"
2632 | }
2633 | },
2634 | "node_modules/object.hasown": {
2635 | "version": "1.1.3",
2636 | "dev": true,
2637 | "license": "MIT",
2638 | "dependencies": {
2639 | "define-properties": "^1.2.0",
2640 | "es-abstract": "^1.22.1"
2641 | },
2642 | "funding": {
2643 | "url": "https://github.com/sponsors/ljharb"
2644 | }
2645 | },
2646 | "node_modules/object.values": {
2647 | "version": "1.1.7",
2648 | "dev": true,
2649 | "license": "MIT",
2650 | "dependencies": {
2651 | "call-bind": "^1.0.2",
2652 | "define-properties": "^1.2.0",
2653 | "es-abstract": "^1.22.1"
2654 | },
2655 | "engines": {
2656 | "node": ">= 0.4"
2657 | },
2658 | "funding": {
2659 | "url": "https://github.com/sponsors/ljharb"
2660 | }
2661 | },
2662 | "node_modules/once": {
2663 | "version": "1.4.0",
2664 | "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz",
2665 | "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==",
2666 | "dev": true,
2667 | "dependencies": {
2668 | "wrappy": "1"
2669 | }
2670 | },
2671 | "node_modules/optionator": {
2672 | "version": "0.9.3",
2673 | "dev": true,
2674 | "license": "MIT",
2675 | "dependencies": {
2676 | "@aashutoshrathi/word-wrap": "^1.2.3",
2677 | "deep-is": "^0.1.3",
2678 | "fast-levenshtein": "^2.0.6",
2679 | "levn": "^0.4.1",
2680 | "prelude-ls": "^1.2.1",
2681 | "type-check": "^0.4.0"
2682 | },
2683 | "engines": {
2684 | "node": ">= 0.8.0"
2685 | }
2686 | },
2687 | "node_modules/p-limit": {
2688 | "version": "3.1.0",
2689 | "dev": true,
2690 | "license": "MIT",
2691 | "dependencies": {
2692 | "yocto-queue": "^0.1.0"
2693 | },
2694 | "engines": {
2695 | "node": ">=10"
2696 | },
2697 | "funding": {
2698 | "url": "https://github.com/sponsors/sindresorhus"
2699 | }
2700 | },
2701 | "node_modules/p-locate": {
2702 | "version": "5.0.0",
2703 | "dev": true,
2704 | "license": "MIT",
2705 | "dependencies": {
2706 | "p-limit": "^3.0.2"
2707 | },
2708 | "engines": {
2709 | "node": ">=10"
2710 | },
2711 | "funding": {
2712 | "url": "https://github.com/sponsors/sindresorhus"
2713 | }
2714 | },
2715 | "node_modules/parent-module": {
2716 | "version": "1.0.1",
2717 | "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz",
2718 | "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==",
2719 | "dev": true,
2720 | "dependencies": {
2721 | "callsites": "^3.0.0"
2722 | },
2723 | "engines": {
2724 | "node": ">=6"
2725 | }
2726 | },
2727 | "node_modules/path-exists": {
2728 | "version": "4.0.0",
2729 | "dev": true,
2730 | "license": "MIT",
2731 | "engines": {
2732 | "node": ">=8"
2733 | }
2734 | },
2735 | "node_modules/path-is-absolute": {
2736 | "version": "1.0.1",
2737 | "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz",
2738 | "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==",
2739 | "dev": true,
2740 | "engines": {
2741 | "node": ">=0.10.0"
2742 | }
2743 | },
2744 | "node_modules/path-key": {
2745 | "version": "3.1.1",
2746 | "dev": true,
2747 | "license": "MIT",
2748 | "engines": {
2749 | "node": ">=8"
2750 | }
2751 | },
2752 | "node_modules/path-parse": {
2753 | "version": "1.0.7",
2754 | "dev": true,
2755 | "license": "MIT"
2756 | },
2757 | "node_modules/path-type": {
2758 | "version": "4.0.0",
2759 | "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz",
2760 | "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==",
2761 | "dev": true,
2762 | "engines": {
2763 | "node": ">=8"
2764 | }
2765 | },
2766 | "node_modules/picomatch": {
2767 | "version": "2.3.1",
2768 | "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz",
2769 | "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==",
2770 | "dev": true,
2771 | "engines": {
2772 | "node": ">=8.6"
2773 | },
2774 | "funding": {
2775 | "url": "https://github.com/sponsors/jonschlinkert"
2776 | }
2777 | },
2778 | "node_modules/possible-typed-array-names": {
2779 | "version": "1.0.0",
2780 | "resolved": "https://registry.npmjs.org/possible-typed-array-names/-/possible-typed-array-names-1.0.0.tgz",
2781 | "integrity": "sha512-d7Uw+eZoloe0EHDIYoe+bQ5WXnGMOpmiZFTuMWCwpjzzkL2nTjcKiAk4hh8TjnGye2TwWOk3UXucZ+3rbmBa8Q==",
2782 | "dev": true,
2783 | "engines": {
2784 | "node": ">= 0.4"
2785 | }
2786 | },
2787 | "node_modules/prelude-ls": {
2788 | "version": "1.2.1",
2789 | "dev": true,
2790 | "license": "MIT",
2791 | "engines": {
2792 | "node": ">= 0.8.0"
2793 | }
2794 | },
2795 | "node_modules/prop-types": {
2796 | "version": "15.8.1",
2797 | "dev": true,
2798 | "license": "MIT",
2799 | "dependencies": {
2800 | "loose-envify": "^1.4.0",
2801 | "object-assign": "^4.1.1",
2802 | "react-is": "^16.13.1"
2803 | }
2804 | },
2805 | "node_modules/prop-types/node_modules/react-is": {
2806 | "version": "16.13.1",
2807 | "dev": true,
2808 | "license": "MIT"
2809 | },
2810 | "node_modules/punycode": {
2811 | "version": "2.3.1",
2812 | "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz",
2813 | "integrity": "sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==",
2814 | "dev": true,
2815 | "engines": {
2816 | "node": ">=6"
2817 | }
2818 | },
2819 | "node_modules/queue-microtask": {
2820 | "version": "1.2.3",
2821 | "dev": true,
2822 | "funding": [
2823 | {
2824 | "type": "github",
2825 | "url": "https://github.com/sponsors/feross"
2826 | },
2827 | {
2828 | "type": "patreon",
2829 | "url": "https://www.patreon.com/feross"
2830 | },
2831 | {
2832 | "type": "consulting",
2833 | "url": "https://feross.org/support"
2834 | }
2835 | ],
2836 | "license": "MIT"
2837 | },
2838 | "node_modules/react": {
2839 | "version": "18.2.0",
2840 | "dev": true,
2841 | "license": "MIT",
2842 | "dependencies": {
2843 | "loose-envify": "^1.1.0"
2844 | },
2845 | "engines": {
2846 | "node": ">=0.10.0"
2847 | }
2848 | },
2849 | "node_modules/react-error-boundary": {
2850 | "version": "3.1.4",
2851 | "dev": true,
2852 | "license": "MIT",
2853 | "dependencies": {
2854 | "@babel/runtime": "^7.12.5"
2855 | },
2856 | "engines": {
2857 | "node": ">=10",
2858 | "npm": ">=6"
2859 | },
2860 | "peerDependencies": {
2861 | "react": ">=16.13.1"
2862 | }
2863 | },
2864 | "node_modules/react-is": {
2865 | "version": "18.2.0",
2866 | "dev": true,
2867 | "license": "MIT"
2868 | },
2869 | "node_modules/react-shallow-renderer": {
2870 | "version": "16.15.0",
2871 | "dev": true,
2872 | "license": "MIT",
2873 | "dependencies": {
2874 | "object-assign": "^4.1.1",
2875 | "react-is": "^16.12.0 || ^17.0.0 || ^18.0.0"
2876 | },
2877 | "peerDependencies": {
2878 | "react": "^16.0.0 || ^17.0.0 || ^18.0.0"
2879 | }
2880 | },
2881 | "node_modules/react-test-renderer": {
2882 | "version": "18.2.0",
2883 | "dev": true,
2884 | "license": "MIT",
2885 | "dependencies": {
2886 | "react-is": "^18.2.0",
2887 | "react-shallow-renderer": "^16.15.0",
2888 | "scheduler": "^0.23.0"
2889 | },
2890 | "peerDependencies": {
2891 | "react": "^18.2.0"
2892 | }
2893 | },
2894 | "node_modules/reflect.getprototypeof": {
2895 | "version": "1.0.4",
2896 | "dev": true,
2897 | "license": "MIT",
2898 | "dependencies": {
2899 | "call-bind": "^1.0.2",
2900 | "define-properties": "^1.2.0",
2901 | "es-abstract": "^1.22.1",
2902 | "get-intrinsic": "^1.2.1",
2903 | "globalthis": "^1.0.3",
2904 | "which-builtin-type": "^1.1.3"
2905 | },
2906 | "engines": {
2907 | "node": ">= 0.4"
2908 | },
2909 | "funding": {
2910 | "url": "https://github.com/sponsors/ljharb"
2911 | }
2912 | },
2913 | "node_modules/regenerator-runtime": {
2914 | "version": "0.14.1",
2915 | "dev": true,
2916 | "license": "MIT"
2917 | },
2918 | "node_modules/regexp.prototype.flags": {
2919 | "version": "1.5.2",
2920 | "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.5.2.tgz",
2921 | "integrity": "sha512-NcDiDkTLuPR+++OCKB0nWafEmhg/Da8aUPLPMQbK+bxKKCm1/S5he+AqYa4PlMCVBalb4/yxIRub6qkEx5yJbw==",
2922 | "dev": true,
2923 | "dependencies": {
2924 | "call-bind": "^1.0.6",
2925 | "define-properties": "^1.2.1",
2926 | "es-errors": "^1.3.0",
2927 | "set-function-name": "^2.0.1"
2928 | },
2929 | "engines": {
2930 | "node": ">= 0.4"
2931 | },
2932 | "funding": {
2933 | "url": "https://github.com/sponsors/ljharb"
2934 | }
2935 | },
2936 | "node_modules/resolve": {
2937 | "version": "2.0.0-next.5",
2938 | "dev": true,
2939 | "license": "MIT",
2940 | "dependencies": {
2941 | "is-core-module": "^2.13.0",
2942 | "path-parse": "^1.0.7",
2943 | "supports-preserve-symlinks-flag": "^1.0.0"
2944 | },
2945 | "bin": {
2946 | "resolve": "bin/resolve"
2947 | },
2948 | "funding": {
2949 | "url": "https://github.com/sponsors/ljharb"
2950 | }
2951 | },
2952 | "node_modules/resolve-from": {
2953 | "version": "4.0.0",
2954 | "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz",
2955 | "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==",
2956 | "dev": true,
2957 | "engines": {
2958 | "node": ">=4"
2959 | }
2960 | },
2961 | "node_modules/reusify": {
2962 | "version": "1.0.4",
2963 | "dev": true,
2964 | "license": "MIT",
2965 | "engines": {
2966 | "iojs": ">=1.0.0",
2967 | "node": ">=0.10.0"
2968 | }
2969 | },
2970 | "node_modules/rimraf": {
2971 | "version": "3.0.2",
2972 | "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz",
2973 | "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==",
2974 | "dev": true,
2975 | "dependencies": {
2976 | "glob": "^7.1.3"
2977 | },
2978 | "bin": {
2979 | "rimraf": "bin.js"
2980 | },
2981 | "funding": {
2982 | "url": "https://github.com/sponsors/isaacs"
2983 | }
2984 | },
2985 | "node_modules/run-parallel": {
2986 | "version": "1.2.0",
2987 | "dev": true,
2988 | "funding": [
2989 | {
2990 | "type": "github",
2991 | "url": "https://github.com/sponsors/feross"
2992 | },
2993 | {
2994 | "type": "patreon",
2995 | "url": "https://www.patreon.com/feross"
2996 | },
2997 | {
2998 | "type": "consulting",
2999 | "url": "https://feross.org/support"
3000 | }
3001 | ],
3002 | "license": "MIT",
3003 | "dependencies": {
3004 | "queue-microtask": "^1.2.2"
3005 | }
3006 | },
3007 | "node_modules/safe-array-concat": {
3008 | "version": "1.1.2",
3009 | "resolved": "https://registry.npmjs.org/safe-array-concat/-/safe-array-concat-1.1.2.tgz",
3010 | "integrity": "sha512-vj6RsCsWBCf19jIeHEfkRMw8DPiBb+DMXklQ/1SGDHOMlHdPUkZXFQ2YdplS23zESTijAcurb1aSgJA3AgMu1Q==",
3011 | "dev": true,
3012 | "dependencies": {
3013 | "call-bind": "^1.0.7",
3014 | "get-intrinsic": "^1.2.4",
3015 | "has-symbols": "^1.0.3",
3016 | "isarray": "^2.0.5"
3017 | },
3018 | "engines": {
3019 | "node": ">=0.4"
3020 | },
3021 | "funding": {
3022 | "url": "https://github.com/sponsors/ljharb"
3023 | }
3024 | },
3025 | "node_modules/safe-regex-test": {
3026 | "version": "1.0.3",
3027 | "resolved": "https://registry.npmjs.org/safe-regex-test/-/safe-regex-test-1.0.3.tgz",
3028 | "integrity": "sha512-CdASjNJPvRa7roO6Ra/gLYBTzYzzPyyBXxIMdGW3USQLyjWEls2RgW5UBTXaQVp+OrpeCK3bLem8smtmheoRuw==",
3029 | "dev": true,
3030 | "dependencies": {
3031 | "call-bind": "^1.0.6",
3032 | "es-errors": "^1.3.0",
3033 | "is-regex": "^1.1.4"
3034 | },
3035 | "engines": {
3036 | "node": ">= 0.4"
3037 | },
3038 | "funding": {
3039 | "url": "https://github.com/sponsors/ljharb"
3040 | }
3041 | },
3042 | "node_modules/scheduler": {
3043 | "version": "0.23.0",
3044 | "dev": true,
3045 | "license": "MIT",
3046 | "dependencies": {
3047 | "loose-envify": "^1.1.0"
3048 | }
3049 | },
3050 | "node_modules/semver": {
3051 | "version": "6.3.1",
3052 | "dev": true,
3053 | "license": "ISC",
3054 | "bin": {
3055 | "semver": "bin/semver.js"
3056 | }
3057 | },
3058 | "node_modules/set-function-length": {
3059 | "version": "1.2.2",
3060 | "resolved": "https://registry.npmjs.org/set-function-length/-/set-function-length-1.2.2.tgz",
3061 | "integrity": "sha512-pgRc4hJ4/sNjWCSS9AmnS40x3bNMDTknHgL5UaMBTMyJnU90EgWh1Rz+MC9eFu4BuN/UwZjKQuY/1v3rM7HMfg==",
3062 | "dev": true,
3063 | "dependencies": {
3064 | "define-data-property": "^1.1.4",
3065 | "es-errors": "^1.3.0",
3066 | "function-bind": "^1.1.2",
3067 | "get-intrinsic": "^1.2.4",
3068 | "gopd": "^1.0.1",
3069 | "has-property-descriptors": "^1.0.2"
3070 | },
3071 | "engines": {
3072 | "node": ">= 0.4"
3073 | }
3074 | },
3075 | "node_modules/set-function-name": {
3076 | "version": "2.0.1",
3077 | "dev": true,
3078 | "license": "MIT",
3079 | "dependencies": {
3080 | "define-data-property": "^1.0.1",
3081 | "functions-have-names": "^1.2.3",
3082 | "has-property-descriptors": "^1.0.0"
3083 | },
3084 | "engines": {
3085 | "node": ">= 0.4"
3086 | }
3087 | },
3088 | "node_modules/shebang-command": {
3089 | "version": "2.0.0",
3090 | "dev": true,
3091 | "license": "MIT",
3092 | "dependencies": {
3093 | "shebang-regex": "^3.0.0"
3094 | },
3095 | "engines": {
3096 | "node": ">=8"
3097 | }
3098 | },
3099 | "node_modules/shebang-regex": {
3100 | "version": "3.0.0",
3101 | "dev": true,
3102 | "license": "MIT",
3103 | "engines": {
3104 | "node": ">=8"
3105 | }
3106 | },
3107 | "node_modules/side-channel": {
3108 | "version": "1.0.4",
3109 | "dev": true,
3110 | "license": "MIT",
3111 | "dependencies": {
3112 | "call-bind": "^1.0.0",
3113 | "get-intrinsic": "^1.0.2",
3114 | "object-inspect": "^1.9.0"
3115 | },
3116 | "funding": {
3117 | "url": "https://github.com/sponsors/ljharb"
3118 | }
3119 | },
3120 | "node_modules/slash": {
3121 | "version": "3.0.0",
3122 | "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz",
3123 | "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==",
3124 | "dev": true,
3125 | "engines": {
3126 | "node": ">=8"
3127 | }
3128 | },
3129 | "node_modules/string.prototype.matchall": {
3130 | "version": "4.0.10",
3131 | "dev": true,
3132 | "license": "MIT",
3133 | "dependencies": {
3134 | "call-bind": "^1.0.2",
3135 | "define-properties": "^1.2.0",
3136 | "es-abstract": "^1.22.1",
3137 | "get-intrinsic": "^1.2.1",
3138 | "has-symbols": "^1.0.3",
3139 | "internal-slot": "^1.0.5",
3140 | "regexp.prototype.flags": "^1.5.0",
3141 | "set-function-name": "^2.0.0",
3142 | "side-channel": "^1.0.4"
3143 | },
3144 | "funding": {
3145 | "url": "https://github.com/sponsors/ljharb"
3146 | }
3147 | },
3148 | "node_modules/string.prototype.trim": {
3149 | "version": "1.2.8",
3150 | "dev": true,
3151 | "license": "MIT",
3152 | "dependencies": {
3153 | "call-bind": "^1.0.2",
3154 | "define-properties": "^1.2.0",
3155 | "es-abstract": "^1.22.1"
3156 | },
3157 | "engines": {
3158 | "node": ">= 0.4"
3159 | },
3160 | "funding": {
3161 | "url": "https://github.com/sponsors/ljharb"
3162 | }
3163 | },
3164 | "node_modules/string.prototype.trimend": {
3165 | "version": "1.0.7",
3166 | "dev": true,
3167 | "license": "MIT",
3168 | "dependencies": {
3169 | "call-bind": "^1.0.2",
3170 | "define-properties": "^1.2.0",
3171 | "es-abstract": "^1.22.1"
3172 | },
3173 | "funding": {
3174 | "url": "https://github.com/sponsors/ljharb"
3175 | }
3176 | },
3177 | "node_modules/string.prototype.trimstart": {
3178 | "version": "1.0.7",
3179 | "dev": true,
3180 | "license": "MIT",
3181 | "dependencies": {
3182 | "call-bind": "^1.0.2",
3183 | "define-properties": "^1.2.0",
3184 | "es-abstract": "^1.22.1"
3185 | },
3186 | "funding": {
3187 | "url": "https://github.com/sponsors/ljharb"
3188 | }
3189 | },
3190 | "node_modules/strip-ansi": {
3191 | "version": "6.0.1",
3192 | "dev": true,
3193 | "license": "MIT",
3194 | "dependencies": {
3195 | "ansi-regex": "^5.0.1"
3196 | },
3197 | "engines": {
3198 | "node": ">=8"
3199 | }
3200 | },
3201 | "node_modules/strip-bom": {
3202 | "version": "3.0.0",
3203 | "dev": true,
3204 | "license": "MIT",
3205 | "engines": {
3206 | "node": ">=4"
3207 | }
3208 | },
3209 | "node_modules/strip-json-comments": {
3210 | "version": "3.1.1",
3211 | "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz",
3212 | "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==",
3213 | "dev": true,
3214 | "engines": {
3215 | "node": ">=8"
3216 | },
3217 | "funding": {
3218 | "url": "https://github.com/sponsors/sindresorhus"
3219 | }
3220 | },
3221 | "node_modules/supports-color": {
3222 | "version": "7.2.0",
3223 | "dev": true,
3224 | "license": "MIT",
3225 | "dependencies": {
3226 | "has-flag": "^4.0.0"
3227 | },
3228 | "engines": {
3229 | "node": ">=8"
3230 | }
3231 | },
3232 | "node_modules/supports-preserve-symlinks-flag": {
3233 | "version": "1.0.0",
3234 | "dev": true,
3235 | "license": "MIT",
3236 | "engines": {
3237 | "node": ">= 0.4"
3238 | },
3239 | "funding": {
3240 | "url": "https://github.com/sponsors/ljharb"
3241 | }
3242 | },
3243 | "node_modules/text-table": {
3244 | "version": "0.2.0",
3245 | "dev": true,
3246 | "license": "MIT"
3247 | },
3248 | "node_modules/to-regex-range": {
3249 | "version": "5.0.1",
3250 | "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz",
3251 | "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==",
3252 | "dev": true,
3253 | "dependencies": {
3254 | "is-number": "^7.0.0"
3255 | },
3256 | "engines": {
3257 | "node": ">=8.0"
3258 | }
3259 | },
3260 | "node_modules/ts-api-utils": {
3261 | "version": "1.3.0",
3262 | "resolved": "https://registry.npmjs.org/ts-api-utils/-/ts-api-utils-1.3.0.tgz",
3263 | "integrity": "sha512-UQMIo7pb8WRomKR1/+MFVLTroIvDVtMX3K6OUir8ynLyzB8Jeriont2bTAtmNPa1ekAgN7YPDyf6V+ygrdU+eQ==",
3264 | "dev": true,
3265 | "engines": {
3266 | "node": ">=16"
3267 | },
3268 | "peerDependencies": {
3269 | "typescript": ">=4.2.0"
3270 | }
3271 | },
3272 | "node_modules/ts-node": {
3273 | "version": "10.9.2",
3274 | "dev": true,
3275 | "license": "MIT",
3276 | "dependencies": {
3277 | "@cspotcode/source-map-support": "^0.8.0",
3278 | "@tsconfig/node10": "^1.0.7",
3279 | "@tsconfig/node12": "^1.0.7",
3280 | "@tsconfig/node14": "^1.0.0",
3281 | "@tsconfig/node16": "^1.0.2",
3282 | "acorn": "^8.4.1",
3283 | "acorn-walk": "^8.1.1",
3284 | "arg": "^4.1.0",
3285 | "create-require": "^1.1.0",
3286 | "diff": "^4.0.1",
3287 | "make-error": "^1.1.1",
3288 | "v8-compile-cache-lib": "^3.0.1",
3289 | "yn": "3.1.1"
3290 | },
3291 | "bin": {
3292 | "ts-node": "dist/bin.js",
3293 | "ts-node-cwd": "dist/bin-cwd.js",
3294 | "ts-node-esm": "dist/bin-esm.js",
3295 | "ts-node-script": "dist/bin-script.js",
3296 | "ts-node-transpile-only": "dist/bin-transpile.js",
3297 | "ts-script": "dist/bin-script-deprecated.js"
3298 | },
3299 | "peerDependencies": {
3300 | "@swc/core": ">=1.2.50",
3301 | "@swc/wasm": ">=1.2.50",
3302 | "@types/node": "*",
3303 | "typescript": ">=2.7"
3304 | },
3305 | "peerDependenciesMeta": {
3306 | "@swc/core": {
3307 | "optional": true
3308 | },
3309 | "@swc/wasm": {
3310 | "optional": true
3311 | }
3312 | }
3313 | },
3314 | "node_modules/tsconfig-paths": {
3315 | "version": "3.15.0",
3316 | "dev": true,
3317 | "license": "MIT",
3318 | "dependencies": {
3319 | "@types/json5": "^0.0.29",
3320 | "json5": "^1.0.2",
3321 | "minimist": "^1.2.6",
3322 | "strip-bom": "^3.0.0"
3323 | }
3324 | },
3325 | "node_modules/type-check": {
3326 | "version": "0.4.0",
3327 | "dev": true,
3328 | "license": "MIT",
3329 | "dependencies": {
3330 | "prelude-ls": "^1.2.1"
3331 | },
3332 | "engines": {
3333 | "node": ">= 0.8.0"
3334 | }
3335 | },
3336 | "node_modules/type-fest": {
3337 | "version": "0.20.2",
3338 | "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz",
3339 | "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==",
3340 | "dev": true,
3341 | "engines": {
3342 | "node": ">=10"
3343 | },
3344 | "funding": {
3345 | "url": "https://github.com/sponsors/sindresorhus"
3346 | }
3347 | },
3348 | "node_modules/typed-array-buffer": {
3349 | "version": "1.0.2",
3350 | "resolved": "https://registry.npmjs.org/typed-array-buffer/-/typed-array-buffer-1.0.2.tgz",
3351 | "integrity": "sha512-gEymJYKZtKXzzBzM4jqa9w6Q1Jjm7x2d+sh19AdsD4wqnMPDYyvwpsIc2Q/835kHuo3BEQ7CjelGhfTsoBb2MQ==",
3352 | "dev": true,
3353 | "dependencies": {
3354 | "call-bind": "^1.0.7",
3355 | "es-errors": "^1.3.0",
3356 | "is-typed-array": "^1.1.13"
3357 | },
3358 | "engines": {
3359 | "node": ">= 0.4"
3360 | }
3361 | },
3362 | "node_modules/typed-array-byte-length": {
3363 | "version": "1.0.1",
3364 | "resolved": "https://registry.npmjs.org/typed-array-byte-length/-/typed-array-byte-length-1.0.1.tgz",
3365 | "integrity": "sha512-3iMJ9q0ao7WE9tWcaYKIptkNBuOIcZCCT0d4MRvuuH88fEoEH62IuQe0OtraD3ebQEoTRk8XCBoknUNc1Y67pw==",
3366 | "dev": true,
3367 | "dependencies": {
3368 | "call-bind": "^1.0.7",
3369 | "for-each": "^0.3.3",
3370 | "gopd": "^1.0.1",
3371 | "has-proto": "^1.0.3",
3372 | "is-typed-array": "^1.1.13"
3373 | },
3374 | "engines": {
3375 | "node": ">= 0.4"
3376 | },
3377 | "funding": {
3378 | "url": "https://github.com/sponsors/ljharb"
3379 | }
3380 | },
3381 | "node_modules/typed-array-byte-offset": {
3382 | "version": "1.0.2",
3383 | "resolved": "https://registry.npmjs.org/typed-array-byte-offset/-/typed-array-byte-offset-1.0.2.tgz",
3384 | "integrity": "sha512-Ous0vodHa56FviZucS2E63zkgtgrACj7omjwd/8lTEMEPFFyjfixMZ1ZXenpgCFBBt4EC1J2XsyVS2gkG0eTFA==",
3385 | "dev": true,
3386 | "dependencies": {
3387 | "available-typed-arrays": "^1.0.7",
3388 | "call-bind": "^1.0.7",
3389 | "for-each": "^0.3.3",
3390 | "gopd": "^1.0.1",
3391 | "has-proto": "^1.0.3",
3392 | "is-typed-array": "^1.1.13"
3393 | },
3394 | "engines": {
3395 | "node": ">= 0.4"
3396 | },
3397 | "funding": {
3398 | "url": "https://github.com/sponsors/ljharb"
3399 | }
3400 | },
3401 | "node_modules/typed-array-length": {
3402 | "version": "1.0.5",
3403 | "resolved": "https://registry.npmjs.org/typed-array-length/-/typed-array-length-1.0.5.tgz",
3404 | "integrity": "sha512-yMi0PlwuznKHxKmcpoOdeLwxBoVPkqZxd7q2FgMkmD3bNwvF5VW0+UlUQ1k1vmktTu4Yu13Q0RIxEP8+B+wloA==",
3405 | "dev": true,
3406 | "dependencies": {
3407 | "call-bind": "^1.0.7",
3408 | "for-each": "^0.3.3",
3409 | "gopd": "^1.0.1",
3410 | "has-proto": "^1.0.3",
3411 | "is-typed-array": "^1.1.13",
3412 | "possible-typed-array-names": "^1.0.0"
3413 | },
3414 | "engines": {
3415 | "node": ">= 0.4"
3416 | },
3417 | "funding": {
3418 | "url": "https://github.com/sponsors/ljharb"
3419 | }
3420 | },
3421 | "node_modules/typescript": {
3422 | "version": "5.4.5",
3423 | "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.4.5.tgz",
3424 | "integrity": "sha512-vcI4UpRgg81oIRUFwR0WSIHKt11nJ7SAVlYNIu+QpqeyXP+gpQJy/Z4+F0aGxSE4MqwjyXvW/TzgkLAx2AGHwQ==",
3425 | "dev": true,
3426 | "bin": {
3427 | "tsc": "bin/tsc",
3428 | "tsserver": "bin/tsserver"
3429 | },
3430 | "engines": {
3431 | "node": ">=14.17"
3432 | }
3433 | },
3434 | "node_modules/unbox-primitive": {
3435 | "version": "1.0.2",
3436 | "dev": true,
3437 | "license": "MIT",
3438 | "dependencies": {
3439 | "call-bind": "^1.0.2",
3440 | "has-bigints": "^1.0.2",
3441 | "has-symbols": "^1.0.3",
3442 | "which-boxed-primitive": "^1.0.2"
3443 | },
3444 | "funding": {
3445 | "url": "https://github.com/sponsors/ljharb"
3446 | }
3447 | },
3448 | "node_modules/undici-types": {
3449 | "version": "5.26.5",
3450 | "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-5.26.5.tgz",
3451 | "integrity": "sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA==",
3452 | "dev": true
3453 | },
3454 | "node_modules/uri-js": {
3455 | "version": "4.4.1",
3456 | "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz",
3457 | "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==",
3458 | "dev": true,
3459 | "dependencies": {
3460 | "punycode": "^2.1.0"
3461 | }
3462 | },
3463 | "node_modules/v8-compile-cache-lib": {
3464 | "version": "3.0.1",
3465 | "dev": true,
3466 | "license": "MIT"
3467 | },
3468 | "node_modules/which": {
3469 | "version": "2.0.2",
3470 | "dev": true,
3471 | "license": "ISC",
3472 | "dependencies": {
3473 | "isexe": "^2.0.0"
3474 | },
3475 | "bin": {
3476 | "node-which": "bin/node-which"
3477 | },
3478 | "engines": {
3479 | "node": ">= 8"
3480 | }
3481 | },
3482 | "node_modules/which-boxed-primitive": {
3483 | "version": "1.0.2",
3484 | "dev": true,
3485 | "license": "MIT",
3486 | "dependencies": {
3487 | "is-bigint": "^1.0.1",
3488 | "is-boolean-object": "^1.1.0",
3489 | "is-number-object": "^1.0.4",
3490 | "is-string": "^1.0.5",
3491 | "is-symbol": "^1.0.3"
3492 | },
3493 | "funding": {
3494 | "url": "https://github.com/sponsors/ljharb"
3495 | }
3496 | },
3497 | "node_modules/which-builtin-type": {
3498 | "version": "1.1.3",
3499 | "dev": true,
3500 | "license": "MIT",
3501 | "dependencies": {
3502 | "function.prototype.name": "^1.1.5",
3503 | "has-tostringtag": "^1.0.0",
3504 | "is-async-function": "^2.0.0",
3505 | "is-date-object": "^1.0.5",
3506 | "is-finalizationregistry": "^1.0.2",
3507 | "is-generator-function": "^1.0.10",
3508 | "is-regex": "^1.1.4",
3509 | "is-weakref": "^1.0.2",
3510 | "isarray": "^2.0.5",
3511 | "which-boxed-primitive": "^1.0.2",
3512 | "which-collection": "^1.0.1",
3513 | "which-typed-array": "^1.1.9"
3514 | },
3515 | "engines": {
3516 | "node": ">= 0.4"
3517 | },
3518 | "funding": {
3519 | "url": "https://github.com/sponsors/ljharb"
3520 | }
3521 | },
3522 | "node_modules/which-collection": {
3523 | "version": "1.0.1",
3524 | "dev": true,
3525 | "license": "MIT",
3526 | "dependencies": {
3527 | "is-map": "^2.0.1",
3528 | "is-set": "^2.0.1",
3529 | "is-weakmap": "^2.0.1",
3530 | "is-weakset": "^2.0.1"
3531 | },
3532 | "funding": {
3533 | "url": "https://github.com/sponsors/ljharb"
3534 | }
3535 | },
3536 | "node_modules/which-typed-array": {
3537 | "version": "1.1.15",
3538 | "resolved": "https://registry.npmjs.org/which-typed-array/-/which-typed-array-1.1.15.tgz",
3539 | "integrity": "sha512-oV0jmFtUky6CXfkqehVvBP/LSWJ2sy4vWMioiENyJLePrBO/yKyV9OyJySfAKosh+RYkIl5zJCNZ8/4JncrpdA==",
3540 | "dev": true,
3541 | "dependencies": {
3542 | "available-typed-arrays": "^1.0.7",
3543 | "call-bind": "^1.0.7",
3544 | "for-each": "^0.3.3",
3545 | "gopd": "^1.0.1",
3546 | "has-tostringtag": "^1.0.2"
3547 | },
3548 | "engines": {
3549 | "node": ">= 0.4"
3550 | },
3551 | "funding": {
3552 | "url": "https://github.com/sponsors/ljharb"
3553 | }
3554 | },
3555 | "node_modules/wrappy": {
3556 | "version": "1.0.2",
3557 | "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz",
3558 | "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==",
3559 | "dev": true
3560 | },
3561 | "node_modules/yallist": {
3562 | "version": "4.0.0",
3563 | "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz",
3564 | "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==",
3565 | "dev": true
3566 | },
3567 | "node_modules/yn": {
3568 | "version": "3.1.1",
3569 | "dev": true,
3570 | "license": "MIT",
3571 | "engines": {
3572 | "node": ">=6"
3573 | }
3574 | },
3575 | "node_modules/yocto-queue": {
3576 | "version": "0.1.0",
3577 | "dev": true,
3578 | "license": "MIT",
3579 | "engines": {
3580 | "node": ">=10"
3581 | },
3582 | "funding": {
3583 | "url": "https://github.com/sponsors/sindresorhus"
3584 | }
3585 | }
3586 | }
3587 | }
3588 |
--------------------------------------------------------------------------------
/package.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "rebloom",
3 | "version": "0.0.20",
4 | "description": "Type-safe React application state library with zero setup",
5 | "main": "dist/index.js",
6 | "scripts": {
7 | "test": "npm run unit && npm run lint && tsc --noemit",
8 | "unit": "ts-node test/index.ts",
9 | "build": "rm -r dist && tsc",
10 | "lint-pure": "eslint . --ext .ts,.tsx",
11 | "lint": "npm run lint-pure -- --fix",
12 | "postpublish": "node test/post-publish.cjs",
13 | "patch": "npm t && npm version patch && npm run build && npm publish && git push && git push --tags",
14 | "minor": "npm t && npm version minor && npm run build && npm publish && git push && git push --tags",
15 | "beta": "npm t && npm version prerelease --preid=beta && npm run build && npm publish --tag beta && git push && git push --tags",
16 | "BREAKING-major": "npm t && npm version major && npm run build && npm publish && git push && git push --tags",
17 | "toc": "./gh-md-toc --insert README.md && rm README.md.*",
18 | "upgrade": "npx npm-check-updates -u && npm i --legacy-peer-deps"
19 | },
20 | "repository": {
21 | "type": "git",
22 | "url": "git+https://github.com/finom/rebloom.git"
23 | },
24 | "keywords": [
25 | "hook",
26 | "react",
27 | "redux",
28 | "mobx",
29 | "use",
30 | "state",
31 | "store",
32 | "useState"
33 | ],
34 | "author": "Andrii Gubanov",
35 | "license": "MIT",
36 | "bugs": {
37 | "url": "https://github.com/finom/rebloom/issues"
38 | },
39 | "homepage": "https://github.com/finom/rebloom#readme",
40 | "devDependencies": {
41 | "@testing-library/react-hooks": "^8.0.1",
42 | "@types/node": "^20.12.7",
43 | "@types/react": "^18.2.75",
44 | "@typescript-eslint/eslint-plugin": "^7.6.0",
45 | "@typescript-eslint/parser": "^7.6.0",
46 | "eslint": "^8.57.0",
47 | "eslint-config-airbnb": "^19.0.4",
48 | "eslint-config-airbnb-typescript": "^18.0.0",
49 | "eslint-plugin-import": "^2.29.1",
50 | "eslint-plugin-jsx-a11y": "^6.8.0",
51 | "eslint-plugin-react": "^7.34.1",
52 | "eslint-plugin-react-hooks": "^4.6.0",
53 | "react": "^18.2.0",
54 | "react-test-renderer": "^18.2.0",
55 | "ts-node": "^10.9.2",
56 | "typescript": "^5.4.5"
57 | },
58 | "peerDependencies": {
59 | "react": "*"
60 | }
61 | }
62 |
--------------------------------------------------------------------------------
/src/changeMap.ts:
--------------------------------------------------------------------------------
1 | /* eslint-disable no-underscore-dangle */
2 | import type { Handler, KnownAny } from './types';
3 |
4 | // allow to use one global WeakMap to support multiple instances of rebloom
5 | // for example two different scripts that both use their own rebloom instance
6 | // and they share one object to listen to
7 | const globalObject = typeof window !== 'undefined'
8 | ? (window as { __rebloomObjectMap?: WeakMap[]>> })
9 | : {};
10 |
11 | const changeMap = globalObject.__rebloomObjectMap
12 | || new WeakMap[]>>();
13 |
14 | globalObject.__rebloomObjectMap = changeMap;
15 |
16 | export default changeMap;
17 |
--------------------------------------------------------------------------------
/src/createRecord.ts:
--------------------------------------------------------------------------------
1 | /* eslint-disable @typescript-eslint/no-unsafe-assignment */
2 | /* eslint-disable @typescript-eslint/no-unsafe-return */
3 | import {
4 | useEffect, useMemo, useRef, useState,
5 | } from 'react';
6 | import getUse from './getUse';
7 | import { extendedTimesSymbol } from './symbols';
8 | import getListen from './getListen';
9 | import listenOne from './listenOne';
10 | import { KnownAny } from './types';
11 |
12 | type Symbols = { [extendedTimesSymbol]: number };
13 |
14 | type RebloomRecordRaw = {
15 | [extendedTimesSymbol]: number;
16 | use: ReturnType>;
17 | listen: ReturnType>;
18 | useAll: {
19 | KnownAny>(f: F, deps?: KnownAny[]): ReturnType;
20 | (): T;
21 | };
22 | listenAll: (h: (o: T, keysChanged: (keyof T)[], prev: T) => void) => () => void;
23 | toJSON: () => T;
24 | };
25 |
26 | type RebloomRecord = T & RebloomRecordRaw;
27 |
28 | // document this:
29 | // [record] = useState(() => createRecord({ x: 1, y: '2' }))
30 |
31 | export default function createRecord(init?: T) {
32 | let keysChanged: (keyof T)[] = [];
33 | let prev: T = { ...init } as T;
34 | const target: RebloomRecord = {
35 | ...init as T,
36 | [extendedTimesSymbol]: 0,
37 | use: getUse(),
38 | listen: getListen(),
39 | useAll(this: RebloomRecord, transform?: (o: T, keysChanged: (keyof T)[], prev: T) => KnownAny, deps?: KnownAny[]) {
40 | // eslint-disable-next-line react-hooks/exhaustive-deps
41 | const memoTransform = useMemo(() => transform, deps ?? []);
42 | const [state, setState] = useState(() => (memoTransform ? memoTransform({ ...this }, keysChanged, prev) : { ...this }));
43 | const stateRef = useRef(state); // workaround to reduce # of renders when the same value is returned
44 |
45 | useEffect(() => {
46 | const handler = () => {
47 | const newState = memoTransform ? memoTransform({ ...this }, keysChanged, prev) : { ...this };
48 | if (newState !== stateRef.current) {
49 | stateRef.current = newState;
50 | setState(newState);
51 | }
52 | };
53 |
54 | return listenOne(target, extendedTimesSymbol, handler);
55 | }, [memoTransform]);
56 |
57 | useEffect(() => {
58 | if (!deps) return;
59 | const newState = memoTransform ? memoTransform({ ...this }, keysChanged, prev) : { ...this };
60 | if (newState !== stateRef.current) {
61 | stateRef.current = newState;
62 | setState(newState);
63 | }
64 | // eslint-disable-next-line react-hooks/exhaustive-deps
65 | }, [memoTransform]);
66 |
67 | return state;
68 | },
69 | listenAll(this: RebloomRecord, h: (o: T, keysChanged: (keyof T)[], prev: T) => void) {
70 | return listenOne(target, extendedTimesSymbol, () => {
71 | h({ ...this }, keysChanged, prev);
72 | });
73 | },
74 | toJSON(this: RebloomRecord) {
75 | return { ...this };
76 | },
77 | };
78 |
79 | let timeout: NodeJS.Timeout | null = null;
80 |
81 | target.use = target.use.bind(target) as ReturnType>;
82 | target.useAll = target.useAll.bind(target);
83 | target.listen = target.listen.bind(target) as ReturnType>;
84 | target.listenAll = target.listenAll.bind(target);
85 | target.toJSON = target.toJSON.bind(target);
86 |
87 | Object.defineProperties(target, {
88 | [extendedTimesSymbol]: { enumerable: false, writable: true, configurable: true },
89 | use: { enumerable: false, writable: false, configurable: false },
90 | listen: { enumerable: false, writable: false, configurable: false },
91 | useAll: { enumerable: false, writable: false, configurable: false },
92 | listenAll: { enumerable: false, writable: false, configurable: false },
93 | toJSON: { enumerable: false, writable: false, configurable: false },
94 | });
95 |
96 | return new Proxy(target, {
97 | set: (obj, prop, value) => {
98 | if (target[prop as keyof T] !== value) {
99 | prev[prop as keyof T] = target[prop as keyof T];
100 | // eslint-disable-next-line @typescript-eslint/no-unsafe-assignment
101 | target[prop as keyof T] = value;
102 | keysChanged.push(prop as keyof T); // TODO: Turn into Set
103 |
104 | if (!timeout) {
105 | timeout = setTimeout(() => {
106 | timeout = null;
107 | target[extendedTimesSymbol] += 1;
108 | keysChanged = [];
109 | prev = { ...target };
110 | }, 10);
111 | }
112 | }
113 |
114 | return true;
115 | },
116 |
117 | deleteProperty: (obj, prop) => {
118 | if (prop in target) {
119 | prev[prop as keyof T] = target[prop as keyof T];
120 | // eslint-disable-next-line @typescript-eslint/no-unsafe-member-access
121 | delete target[prop as keyof T];
122 | keysChanged.push(prop as keyof T);
123 |
124 | if (!timeout) {
125 | timeout = setTimeout(() => {
126 | timeout = null;
127 | target[extendedTimesSymbol] += 1;
128 | keysChanged = [];
129 | prev = { ...target };
130 | }, 10);
131 | }
132 | }
133 |
134 | return true;
135 | },
136 | });
137 | }
138 |
--------------------------------------------------------------------------------
/src/getListen.ts:
--------------------------------------------------------------------------------
1 | /* eslint-disable @typescript-eslint/no-explicit-any */
2 | import listenOne from './listenOne';
3 |
4 | type Value = TState[TKey & keyof TState];
5 |
6 | /*
7 | o.listen('x', (x, key, prevObject) => ...);
8 | o.listen(['x', 'y'], ([x, y], key, prevObject) => ...);
9 | o.listenAll((o, key, prevObject) => ...);
10 | */
11 | /*
12 | export type Listen = {
13 | (this: TState, key: TKey, f: (val: Value, key: TKey, prevState: TState) => void): () => void;
14 | (this: TState, keys: readonly [...TKeys], f: (val: { [K in keyof TKeys]: Value }, key: TKeys[number], prevState: TState) => void): () => void;
15 | };
16 | */
17 |
18 | export default function getListen() {
19 | function listen(this: TState, key: TKey, f: (val: Value, key: TKey, prevState: TState) => void): () => void;
20 | function listen(this: TState, keys: readonly [...TKeys], f: (val: { [K in keyof TKeys]: Value }, key: TKeys[number], prevState: TState) => void): () => void;
21 | function listen(this: TState, givenKeys: keyof TState | readonly (keyof TState)[], f: (val: any, key: keyof TState, prevState: TState) => void) {
22 | const keys = givenKeys instanceof Array ? givenKeys : [givenKeys];
23 |
24 | const unlisten = keys.map((key) => {
25 | const handler = (val: unknown, prev: unknown) => {
26 | const prevState = { ...this, [key]: prev };
27 | if (givenKeys instanceof Array) {
28 | f(keys.map((k) => this[k]), key, prevState);
29 | } else {
30 | f(val, key, prevState);
31 | }
32 | };
33 |
34 | return listenOne(this, key, handler);
35 | });
36 |
37 | return () => {
38 | unlisten.forEach((u) => u());
39 | };
40 | }
41 |
42 | return listen;
43 | }
44 |
--------------------------------------------------------------------------------
/src/getUse.ts:
--------------------------------------------------------------------------------
1 | import {
2 | useCallback, useEffect, useMemo, useState,
3 | } from 'react';
4 | import listenOne from './listenOne';
5 | import { KnownAny } from './types';
6 |
7 | // type UseFKey> = TKey extends null | undefined | keyof TState ? TKey : keyof TState;
8 |
9 | // that.use(['x', 'y'] as ['x', 'y'] | null, ([x, y], keyChanged, prev) => [x, y]);
10 | export default function getUse() {
11 | // function use (this: TState, keys: TKey): { [K in keyof TKey]: TState[TKey[K] & keyof TState] };
12 | // g function use (keys: TKey): TKey extends null | undefined ? undefined : { [K in keyof TKey]: TState[TKey[K] & keyof TState] };
13 | // function use (this: TState, key: TKey): undefined;
14 | // g function use (key: TKey): TKey extends null | undefined ? undefined : TState[TKey & keyof TState];
15 | // function use (this: TState, keys: readonly [...TKeys]): { [K in keyof TKeys]: TState[TKeys[K] & keyof TState] };
16 | /* function use (this: TState, key: TKey): TKey extends null | undefined ? undefined
17 | : TKey extends readonly (keyof TState)[] ? { [K in keyof TKey]: TState[TKey[K] & keyof TState] }
18 | : TState[TKey & keyof TState];
19 | function use , R>(this: TState, key: TKey, f: (val: UseResult, key: TKey, prev: TState) => R): R; */
20 | function use (this: TState, key: TKey): undefined;
21 | function use KnownAny>(this: TState, key: TKey, f: F, deps?: KnownAny[]): ReturnType;
22 |
23 | function use (this: TState, key: TKey): TState[TKey & keyof TState];
24 | function use KnownAny>(this: TState, key: TKey, f: F, deps?: KnownAny[]): ReturnType;
25 |
26 | function use (this: TState, key: TKey): undefined | TState[TKey & keyof TState];
27 | function use KnownAny>(this: TState, key: TKey, f: F, deps?: KnownAny[]): ReturnType;
28 |
29 | function use (this: TState, keys: readonly [...TKeys]): { [K in keyof TKeys]: TState[TKeys[K] & keyof TState] };
30 | function use KnownAny>(this: TState, keys: readonly [...TKeys], f: F, deps?: KnownAny[]): ReturnType;
31 |
32 | function use (this: TState, keys: TKeys): TKeys extends null | undefined ? undefined : { [K in keyof TKeys]: TState[TKeys[K] & keyof TState] };
33 | function use KnownAny>(this: TState, keys: TKeys, f: F, deps?: KnownAny[]): ReturnType;
34 |
35 | // function use , F extends (val: UseResult, key: TKey, prev: TState) => KnownAny>(this: TState, key: TKey, f: F): ReturnType;
36 | function use(this: TState, keys: null | undefined | keyof TState | readonly (keyof TState)[], transform?: (...args: KnownAny) => unknown, deps?: KnownAny[]): KnownAny {
37 | // eslint-disable-next-line react-hooks/exhaustive-deps, @typescript-eslint/no-unsafe-assignment
38 | const memoKeys = useMemo(() => keys, [JSON.stringify(keys)]);
39 | // eslint-disable-next-line react-hooks/exhaustive-deps, @typescript-eslint/no-unsafe-assignment
40 | const memoTransform = useMemo(() => transform, deps ?? []);
41 |
42 | const getRawState = useCallback(() => {
43 | if (memoKeys === null || memoKeys === undefined) {
44 | return undefined;
45 | }
46 |
47 | if (memoKeys instanceof Array) {
48 | const value = memoKeys.map((key) => this[key]);
49 | return value;
50 | }
51 |
52 | const value = this[memoKeys];
53 | return value;
54 | }, [memoKeys]);
55 |
56 | const getState = useCallback((key: keyof TState | null, prevValue?: unknown) => {
57 | const rawState = getRawState();
58 | if (typeof memoTransform === 'function') {
59 | return memoTransform(rawState, key ?? null, key !== null ? {
60 | ...this,
61 | [key]: prevValue,
62 | } : { ...this });
63 | }
64 |
65 | return rawState;
66 | }, [getRawState, memoTransform]);
67 |
68 | const [stateInfo, setStateInfo] = useState<{
69 | key: keyof TState | null,
70 | prevValue: unknown,
71 | }>({
72 | key: null,
73 | prevValue: undefined,
74 | });
75 |
76 | useEffect(() => {
77 | const handler = (key: keyof TState | null, prevValue: unknown) => setStateInfo({
78 | key,
79 | prevValue,
80 | });
81 |
82 | const unsubscribe = (memoKeys instanceof Array ? memoKeys : [memoKeys])
83 | .filter((key) => key !== null && key !== undefined)
84 | .map((key) => listenOne(this, key!, (_v, prevValue) => handler(key!, prevValue)));
85 | return () => {
86 | unsubscribe.forEach((u) => u());
87 | };
88 | }, [memoKeys]);
89 |
90 | return useMemo(() => getState(stateInfo.key, stateInfo.prevValue), [getState, stateInfo]);
91 | }
92 |
93 | return use;
94 | }
95 |
--------------------------------------------------------------------------------
/src/index.ts:
--------------------------------------------------------------------------------
1 | import getUse from './getUse';
2 | import getListen from './getListen';
3 | import createRecord from './createRecord';
4 | import { extendedTimesSymbol } from './symbols';
5 |
6 | export {
7 | getUse, getListen, createRecord, extendedTimesSymbol,
8 | };
9 |
--------------------------------------------------------------------------------
/src/listenOne.ts:
--------------------------------------------------------------------------------
1 | import changeMap from './changeMap';
2 | import type { Handler } from './types';
3 |
4 | export default function listenOne(
5 | givenObject: TState,
6 | key: TKey,
7 | handler: Handler,
8 | ): () => void {
9 | const all: Record[]> = changeMap.get(givenObject) ?? {};
10 | const existingDescriptor = Object.getOwnPropertyDescriptor(givenObject, key);
11 |
12 | if (!existingDescriptor?.get) {
13 | let value = givenObject[key];
14 |
15 | Object.defineProperty(givenObject, key, {
16 | enumerable: existingDescriptor?.enumerable ?? true,
17 | configurable: true,
18 | get: () => value,
19 | set: (newValue: TState[TKey]) => {
20 | const prevValue = value;
21 |
22 | if (prevValue !== newValue) {
23 | value = newValue;
24 |
25 | all[key]?.forEach((h) => {
26 | h(newValue, prevValue);
27 | });
28 | }
29 | },
30 | });
31 | }
32 |
33 | changeMap.set(givenObject, all);
34 |
35 | const handlers = all[key] || [];
36 |
37 | if (!handlers.includes(handler)) {
38 | handlers.push(handler);
39 | }
40 |
41 | all[key] = handlers;
42 |
43 | return () => {
44 | all[key] = all[key].filter((h) => h !== handler);
45 | };
46 | }
47 |
--------------------------------------------------------------------------------
/src/symbols.ts:
--------------------------------------------------------------------------------
1 | export const extendedTimesSymbol = Symbol('extendedTimes');
2 |
--------------------------------------------------------------------------------
/src/types.ts:
--------------------------------------------------------------------------------
1 | // eslint-disable-next-line @typescript-eslint/no-explicit-any
2 | export type KnownAny = any;
3 |
4 | export type Handler = (
5 | value: TValue,
6 | prev: TValue
7 | ) => KnownAny;
8 |
--------------------------------------------------------------------------------
/test/createRecord.test.ts:
--------------------------------------------------------------------------------
1 | /* eslint-disable @typescript-eslint/no-floating-promises */
2 | /* eslint-disable max-classes-per-file */
3 | import { renderHook, act } from '@testing-library/react-hooks';
4 | import { it, describe } from 'node:test';
5 | import assert from 'node:assert';
6 | import { createRecord, extendedTimesSymbol } from '../src';
7 |
8 | describe('createRecord', () => {
9 | it('use', () => {
10 | const state = createRecord({
11 | x: 1,
12 | y: '2',
13 | });
14 |
15 | let renderedTimes = 0;
16 | const { result } = renderHook(() => {
17 | renderedTimes += 1;
18 |
19 | return state.use('x');
20 | });
21 |
22 | assert.strictEqual(result.current satisfies number, 1);
23 | assert.strictEqual(state.x, 1);
24 | assert.strictEqual(renderedTimes, 1);
25 |
26 | act(() => { state.x = 2; });
27 |
28 | assert.strictEqual(result.current, 2);
29 | assert.strictEqual(state.x, 2);
30 | assert.strictEqual(renderedTimes, 2);
31 | });
32 |
33 | it('useAll set property', async () => {
34 | const state = createRecord({
35 | x: 1,
36 | y: '2',
37 | });
38 |
39 | let renderedTimes = 0;
40 | const { result } = renderHook(() => {
41 | renderedTimes += 1;
42 |
43 | return state.useAll();
44 | });
45 |
46 | act(() => {
47 | state.x = 2;
48 | state.y = '3';
49 | });
50 |
51 | await new Promise((resolve) => { setTimeout(resolve, 10); });
52 |
53 | assert.deepStrictEqual(result.current satisfies {
54 | x: number,
55 | y: string,
56 | }, { x: 2, y: '3' });
57 | assert.strictEqual(state[extendedTimesSymbol], 1);
58 | assert.strictEqual(state.x, 2);
59 | assert.strictEqual(renderedTimes, 2);
60 |
61 | act(() => {
62 | state.x = 2;
63 | state.y = '3';
64 | });
65 |
66 | await new Promise((resolve) => { setTimeout(resolve, 10); });
67 |
68 | assert.deepStrictEqual(result.current, { x: 2, y: '3' });
69 | assert.strictEqual(state[extendedTimesSymbol], 1);
70 | assert.strictEqual(state.x, 2);
71 | assert.strictEqual(renderedTimes, 2);
72 |
73 | act(() => {
74 | state.x = 3;
75 | state.y = '4';
76 | });
77 |
78 | await new Promise((resolve) => { setTimeout(resolve, 10); });
79 |
80 | assert.deepStrictEqual(result.current, { x: 3, y: '4' });
81 | assert.strictEqual(state[extendedTimesSymbol], 2);
82 | assert.strictEqual(state.x, 3);
83 | assert.strictEqual(renderedTimes, 3);
84 |
85 | assert.deepStrictEqual(state, { x: 3, y: '4' });
86 |
87 | act(() => {
88 | Object.assign(state, { x: 4, y: '5' });
89 | });
90 |
91 | await new Promise((resolve) => { setTimeout(resolve, 10); });
92 |
93 | assert.deepStrictEqual(result.current, { x: 4, y: '5' });
94 | assert.strictEqual(state[extendedTimesSymbol], 3);
95 | assert.strictEqual(state.x, 4);
96 | assert.strictEqual(renderedTimes, 4);
97 | });
98 |
99 | it('useAll delete property', async () => {
100 | const state = createRecord<{
101 | x?: number;
102 | y: string;
103 | }>({
104 | x: 1,
105 | y: '2',
106 | });
107 |
108 | let renderedTimes = 0;
109 | const { result } = renderHook(() => {
110 | renderedTimes += 1;
111 |
112 | return state.useAll();
113 | });
114 |
115 | act(() => {
116 | delete state.x;
117 | });
118 |
119 | await new Promise((resolve) => { setTimeout(resolve, 10); });
120 |
121 | assert.deepStrictEqual(result.current satisfies {
122 | x?: number,
123 | y: string,
124 | }, { y: '2' });
125 | assert.strictEqual(state[extendedTimesSymbol], 1);
126 | assert.strictEqual(state.x, undefined);
127 | assert.strictEqual(renderedTimes, 2);
128 | });
129 |
130 | it('useAll with function', async () => {
131 | const state = createRecord({
132 | x: 1,
133 | y: '2',
134 | });
135 |
136 | let foo = 'bar1';
137 |
138 | let renderedTimes = 0;
139 | const { result } = renderHook(() => {
140 | renderedTimes += 1;
141 |
142 | return state.useAll((s) => ({ ...s, foo }));
143 | });
144 |
145 | act(() => {
146 | state.x = 2;
147 | state.y = '3';
148 | });
149 |
150 | await new Promise((resolve) => { setTimeout(resolve, 10); });
151 |
152 | assert.deepStrictEqual(result.current satisfies {
153 | x: number,
154 | y: string,
155 | foo: string,
156 | }, { x: 2, y: '3', foo: 'bar1' });
157 | assert.strictEqual(state[extendedTimesSymbol], 1);
158 | assert.strictEqual(state.x, 2);
159 | assert.strictEqual(renderedTimes, 2);
160 |
161 | foo = 'bar2';
162 |
163 | act(() => {
164 | // not changed
165 | state.x = 2;
166 | state.y = '3';
167 | });
168 |
169 | await new Promise((resolve) => { setTimeout(resolve, 10); });
170 |
171 | assert.deepStrictEqual(result.current, { x: 2, y: '3', foo: 'bar1' });
172 | assert.strictEqual(state[extendedTimesSymbol], 1);
173 | assert.strictEqual(state.x, 2);
174 | assert.strictEqual(renderedTimes, 2);
175 |
176 | act(() => {
177 | state.x = 3;
178 | state.y = '4';
179 | });
180 |
181 | await new Promise((resolve) => { setTimeout(resolve, 10); });
182 |
183 | assert.deepStrictEqual(result.current, { x: 3, y: '4', foo: 'bar2' });
184 | assert.strictEqual(state[extendedTimesSymbol], 2);
185 | assert.strictEqual(state.x, 3);
186 | assert.strictEqual(renderedTimes, 3);
187 |
188 | assert.deepStrictEqual(state, { x: 3, y: '4' });
189 |
190 | foo = 'bar3';
191 |
192 | act(() => {
193 | Object.assign(state, { x: 4, y: '5' });
194 | });
195 |
196 | await new Promise((resolve) => { setTimeout(resolve, 10); });
197 |
198 | assert.deepStrictEqual(result.current, { x: 4, y: '5', foo: 'bar3' });
199 | assert.strictEqual(state[extendedTimesSymbol], 3);
200 | assert.strictEqual(state.x, 4);
201 | assert.strictEqual(renderedTimes, 4);
202 | });
203 | /*
204 | it('use with function and deps', () => {
205 | const use = getUse();
206 |
207 | const state = {
208 | get use() {
209 | return use;
210 | },
211 | x: 1,
212 | };
213 |
214 | Object.defineProperty(state, 'use', { enumerable: false });
215 |
216 | let renderedTimes = 0;
217 | let invokedTimes = 0;
218 | const { result, rerender } = renderHook(({ y }: { y: number }) => {
219 | renderedTimes += 1;
220 |
221 | return state.use('x', (x) => {
222 | invokedTimes += 1;
223 | return x + (y ?? 10);
224 | }, [y]);
225 | });
226 |
227 | assert.strictEqual(result.current, 1);
228 | assert.strictEqual(state.x, 1);
229 | assert.strictEqual(renderedTimes, 1);
230 | assert.strictEqual(invokedTimes, 1);
231 |
232 | rerender({ y: 10 });
233 |
234 | assert.strictEqual(result.current, 11);
235 | assert.strictEqual(state.x, 1);
236 | assert.strictEqual(renderedTimes, 2);
237 | assert.strictEqual(invokedTimes, 2);
238 |
239 | rerender({ y: 10 });
240 |
241 | assert.strictEqual(result.current, 11);
242 | assert.strictEqual(state.x, 1);
243 | assert.strictEqual(renderedTimes, 3);
244 | assert.strictEqual(invokedTimes, 2);
245 | });
246 | */
247 | it('useAll with function and deps', async () => {
248 | const state = createRecord({
249 | x: 1,
250 | });
251 |
252 | let renderedTimes = 0;
253 | let invokedTimes = 0;
254 | const { result, rerender } = renderHook(({ y }: { y: number } = { y: 0 }) => {
255 | renderedTimes += 1;
256 |
257 | return state.useAll((s) => {
258 | invokedTimes += 1;
259 | return (s.x + y);
260 | }, [y]);
261 | });
262 |
263 | assert.strictEqual(result.current, 1);
264 | assert.strictEqual(state.x, 1);
265 | assert.strictEqual(renderedTimes, 1);
266 | assert.strictEqual(invokedTimes, 2);
267 |
268 | rerender({ y: 10 });
269 |
270 | assert.strictEqual(result.current, 11);
271 | assert.strictEqual(state.x, 1);
272 | assert.strictEqual(renderedTimes, 3);
273 | assert.strictEqual(invokedTimes, 3);
274 |
275 | rerender({ y: 10 });
276 |
277 | assert.strictEqual(result.current, 11);
278 | assert.strictEqual(state.x, 1);
279 | assert.strictEqual(renderedTimes, 4);
280 | assert.strictEqual(invokedTimes, 3);
281 |
282 | act(() => {
283 | state.x = 2;
284 | });
285 |
286 | await new Promise((resolve) => { setTimeout(resolve, 10); });
287 |
288 | assert.strictEqual(result.current, 12);
289 | assert.strictEqual(state.x, 2);
290 | assert.strictEqual(renderedTimes, 5);
291 | assert.strictEqual(invokedTimes, 4);
292 |
293 | rerender({ y: 10 });
294 |
295 | assert.strictEqual(result.current, 12);
296 | assert.strictEqual(state.x, 2);
297 | assert.strictEqual(renderedTimes, 6);
298 | assert.strictEqual(invokedTimes, 4);
299 |
300 | rerender({ y: 11 });
301 |
302 | assert.strictEqual(result.current, 13);
303 | assert.strictEqual(state.x, 2);
304 | assert.strictEqual(renderedTimes, 8);
305 | assert.strictEqual(invokedTimes, 5);
306 | });
307 |
308 | it('useAll with function that returns the same value', async () => {
309 | const state = createRecord({
310 | x: 1,
311 | y: 2,
312 | });
313 |
314 | let renderedTimes = 0;
315 | let keysChanged: (keyof typeof state)[] = [];
316 | let prev = { ...state };
317 | const { result } = renderHook(() => {
318 | renderedTimes += 1;
319 |
320 | return state.useAll((s, keysChangedArg, prevArg) => {
321 | assert.deepStrictEqual(keysChangedArg, keysChanged);
322 | assert.deepStrictEqual(prevArg, prev);
323 | return s.x + s.y;
324 | });
325 | });
326 |
327 | assert.strictEqual(result.current, 3);
328 |
329 | // -----
330 | keysChanged = ['x'];
331 | prev = { ...state };
332 |
333 | act(() => {
334 | // y is still 2
335 | state.x = 3;
336 | });
337 |
338 | await new Promise((resolve) => { setTimeout(resolve, 10); });
339 |
340 | assert.strictEqual(state[extendedTimesSymbol], 1);
341 | assert.strictEqual(renderedTimes, 2);
342 | assert.strictEqual(result.current, 5);
343 |
344 | // -----
345 | keysChanged = ['x', 'y'];
346 | prev = { ...state };
347 |
348 | act(() => {
349 | state.x = 2;
350 | state.y = 3;
351 | });
352 |
353 | await new Promise((resolve) => { setTimeout(resolve, 10); });
354 |
355 | assert.strictEqual(state[extendedTimesSymbol], 2);
356 | assert.strictEqual(renderedTimes, 2);
357 | assert.strictEqual(result.current, 5);
358 | });
359 |
360 | it('listen', () => {
361 | const state = createRecord({
362 | x: 1,
363 | y: '2',
364 | });
365 |
366 | let prev: number;
367 | let triggerTimes = 0;
368 |
369 | const unlisten = state.listen('x', (x, key, prevObject) => {
370 | triggerTimes += 1;
371 | assert.strictEqual(x satisfies number, state.x);
372 | assert.strictEqual(prevObject[key], prev);
373 | });
374 |
375 | prev = state.x;
376 | state.x = 2;
377 | assert.strictEqual(triggerTimes, 1);
378 | prev = state.x;
379 | state.x = 3;
380 | assert.strictEqual(triggerTimes, 2);
381 | unlisten();
382 | prev = state.x;
383 | state.x = 4;
384 | assert.strictEqual(triggerTimes, 2);
385 | prev = state.x;
386 | state.x = 5;
387 | assert.strictEqual(triggerTimes, 2);
388 | });
389 |
390 | it('listenAll', async () => {
391 | const state = createRecord({
392 | x: 1,
393 | y: '2',
394 | });
395 |
396 | let prev: number;
397 | let triggerTimes = 0;
398 |
399 | const unlisten = state.listenAll((o, keysChanged, prevObject) => {
400 | triggerTimes += 1;
401 | assert.strictEqual(o.x, state.x);
402 | assert.strictEqual(o.y, state.y);
403 | assert.deepStrictEqual(keysChanged, ['x']);
404 | assert.strictEqual(prevObject.x, prev);
405 | assert.strictEqual(prevObject.y, state.y);
406 | });
407 |
408 | prev = state.x;
409 | state.x = 2;
410 |
411 | await new Promise((resolve) => { setTimeout(resolve, 10); });
412 |
413 | assert.strictEqual(triggerTimes, 1);
414 | prev = state.x;
415 | state.x = 3;
416 |
417 | await new Promise((resolve) => { setTimeout(resolve, 10); });
418 |
419 | assert.strictEqual(triggerTimes, 2);
420 | unlisten();
421 | prev = state.x;
422 | state.x = 4;
423 |
424 | await new Promise((resolve) => { setTimeout(resolve, 10); });
425 |
426 | assert.strictEqual(triggerTimes, 2);
427 | prev = state.x;
428 | state.x = 5;
429 |
430 | await new Promise((resolve) => { setTimeout(resolve, 10); });
431 |
432 | assert.strictEqual(triggerTimes, 2);
433 | });
434 |
435 | it('toJSON', () => {
436 | // TODO: what else to test here?
437 | const state = createRecord({
438 | x: 1,
439 | y: '2',
440 | });
441 |
442 | assert.deepStrictEqual(state.toJSON(), { x: 1, y: '2' });
443 |
444 | act(() => {
445 | state.x = 2;
446 | state.y = '3';
447 | });
448 |
449 | assert.deepStrictEqual(state.toJSON(), { x: 2, y: '3' });
450 | });
451 | });
452 |
--------------------------------------------------------------------------------
/test/getListen.test.ts:
--------------------------------------------------------------------------------
1 | /* eslint-disable max-classes-per-file */
2 | /* eslint-disable @typescript-eslint/no-floating-promises */
3 | import { it, describe } from 'node:test';
4 | import assert from 'node:assert';
5 | import { getListen } from '../src';
6 |
7 | describe('getListen', () => {
8 | it('Extends class', () => {
9 | class State {
10 | listen = getListen();
11 |
12 | x = 1;
13 |
14 | y = '2';
15 | }
16 |
17 | const state = new State();
18 | let prev: number;
19 | let triggerTimes = 0;
20 |
21 | const unlisten = state.listen('x', (x, key, prevObject) => {
22 | triggerTimes += 1;
23 | assert.strictEqual(x satisfies number, state.x);
24 | assert.strictEqual(prevObject[key], prev);
25 | });
26 |
27 | prev = state.x;
28 | state.x = 2;
29 | assert.strictEqual(triggerTimes, 1);
30 | prev = state.x;
31 | state.x = 3;
32 | assert.strictEqual(triggerTimes, 2);
33 | unlisten();
34 | prev = state.x;
35 | state.x = 4;
36 | assert.strictEqual(triggerTimes, 2);
37 | prev = state.x;
38 | state.x = 5;
39 | assert.strictEqual(triggerTimes, 2);
40 | });
41 |
42 | it('Extends static class', () => {
43 | class State {
44 | static listen = getListen();
45 |
46 | static x = 1;
47 |
48 | static y = '2';
49 | }
50 |
51 | let prev: number;
52 | let triggerTimes = 0;
53 |
54 | const unlisten = State.listen('x', (x, key, prevObject) => {
55 | triggerTimes += 1;
56 | assert.strictEqual(x satisfies number, State.x);
57 | assert.strictEqual(prevObject[key], prev);
58 | });
59 |
60 | prev = State.x;
61 | State.x = 2;
62 | assert.strictEqual(triggerTimes, 1);
63 | prev = State.x;
64 | State.x = 3;
65 | assert.strictEqual(triggerTimes, 2);
66 | unlisten();
67 | prev = State.x;
68 | State.x = 4;
69 | assert.strictEqual(triggerTimes, 2);
70 | prev = State.x;
71 | State.x = 5;
72 | assert.strictEqual(triggerTimes, 2);
73 | });
74 |
75 | it('Extends object', () => {
76 | const listen = getListen();
77 |
78 | const state = {
79 | get listen() {
80 | return listen;
81 | },
82 | x: 1,
83 | y: '2',
84 | };
85 |
86 | let prev: number;
87 | let triggerTimes = 0;
88 |
89 | const unlisten = state.listen('x', (x, key, prevObject) => {
90 | triggerTimes += 1;
91 | assert.strictEqual(x satisfies number, state.x);
92 | assert.strictEqual(prevObject[key], prev);
93 | });
94 |
95 | prev = state.x;
96 | state.x = 2;
97 | assert.strictEqual(triggerTimes, 1);
98 | prev = state.x;
99 | state.x = 3;
100 | assert.strictEqual(triggerTimes, 2);
101 | unlisten();
102 | prev = state.x;
103 | state.x = 4;
104 | assert.strictEqual(triggerTimes, 2);
105 | prev = state.x;
106 | state.x = 5;
107 | assert.strictEqual(triggerTimes, 2);
108 | });
109 |
110 | it('Works with arrays', () => {
111 | class State {
112 | listen = getListen();
113 |
114 | x = 1;
115 |
116 | y = '2';
117 | }
118 |
119 | const state = new State();
120 |
121 | let prev: number;
122 | let triggerTimes = 0;
123 |
124 | const unlisten = state.listen(['x', 'y'], ([x, y], key, prevObject) => {
125 | triggerTimes += 1;
126 | assert.strictEqual(x satisfies number, state.x);
127 | assert.strictEqual(y satisfies string, state.y);
128 | assert.strictEqual(prevObject[key], prev);
129 | });
130 |
131 | prev = state.x;
132 | state.x = 2;
133 | assert.strictEqual(triggerTimes, 1);
134 | prev = state.x;
135 | state.x = 3;
136 | assert.strictEqual(triggerTimes, 2);
137 | unlisten();
138 | prev = state.x;
139 | state.x = 4;
140 | assert.strictEqual(triggerTimes, 2);
141 | prev = state.x;
142 | state.x = 5;
143 | assert.strictEqual(triggerTimes, 2);
144 | });
145 |
146 | it('Supports symbols', () => {
147 | const x = Symbol('x');
148 | const y = Symbol('y');
149 |
150 | class State {
151 | listen = getListen();
152 |
153 | [x] = 1;
154 |
155 | [y] = '2';
156 | }
157 |
158 | const state = new State();
159 |
160 | let prev: number;
161 | let triggerTimes = 0;
162 |
163 | const unlisten = state.listen(x, (xVal, key, prevObject) => {
164 | triggerTimes += 1;
165 | assert.strictEqual(xVal satisfies number, state[x]);
166 | assert.strictEqual(prevObject[key], prev);
167 | });
168 |
169 | prev = state[x];
170 | state[x] = 2;
171 | assert.strictEqual(triggerTimes, 1);
172 | prev = state[x];
173 | state[x] = 3;
174 | assert.strictEqual(triggerTimes, 2);
175 | unlisten();
176 | prev = state[x];
177 | state[x] = 4;
178 | assert.strictEqual(triggerTimes, 2);
179 | prev = state[x];
180 | state[x] = 5;
181 | assert.strictEqual(triggerTimes, 2);
182 | });
183 | });
184 |
--------------------------------------------------------------------------------
/test/getUse.test.ts:
--------------------------------------------------------------------------------
1 | /* eslint-disable max-classes-per-file */
2 | /* eslint-disable @typescript-eslint/no-floating-promises */
3 | import { renderHook, act } from '@testing-library/react-hooks';
4 | import { it, describe } from 'node:test';
5 | import assert from 'node:assert';
6 | import { getUse } from '../src';
7 |
8 | describe('getUse', () => {
9 | it('Extends class', () => {
10 | class State {
11 | use = getUse();
12 |
13 | x = 1;
14 |
15 | y = '2';
16 | }
17 |
18 | const state = new State();
19 |
20 | let renderedTimes = 0;
21 | const { result } = renderHook(() => {
22 | renderedTimes += 1;
23 |
24 | return state.use('x');
25 | });
26 |
27 | assert.strictEqual(result.current, 1);
28 | assert.strictEqual(state.x, 1);
29 | assert.strictEqual(renderedTimes, 1);
30 |
31 | act(() => { state.x = 2; });
32 |
33 | assert.strictEqual(result.current, 2);
34 | assert.strictEqual(state.x, 2);
35 | assert.strictEqual(renderedTimes, 2);
36 | });
37 |
38 | it('Extends static class', () => {
39 | class State {
40 | static use = getUse();
41 |
42 | static x = 1;
43 | }
44 |
45 | const state = State;
46 |
47 | let renderedTimes = 0;
48 | const { result } = renderHook(() => {
49 | renderedTimes += 1;
50 |
51 | return state.use('x');
52 | });
53 |
54 | assert.strictEqual(result.current, 1);
55 | assert.strictEqual(state.x, 1);
56 | assert.strictEqual(renderedTimes, 1);
57 |
58 | act(() => { state.x = 2; });
59 |
60 | assert.strictEqual(result.current, 2);
61 | assert.strictEqual(state.x, 2);
62 | assert.strictEqual(renderedTimes, 2);
63 | });
64 |
65 | it('Extends object', () => {
66 | const use = getUse();
67 |
68 | const state = {
69 | get use() {
70 | return use;
71 | },
72 | x: 1,
73 | y: '2',
74 | };
75 |
76 | /*
77 | const state = {
78 | get use() {
79 | return getUse(state);
80 | },
81 | x: 1,
82 | y: '2',
83 | };
84 | */
85 |
86 | Object.defineProperty(state, 'use', { enumerable: false });
87 |
88 | let renderedTimes = 0;
89 | const { result } = renderHook(() => {
90 | renderedTimes += 1;
91 |
92 | return state.use('x');
93 | });
94 |
95 | assert.strictEqual(result.current satisfies number, 1);
96 | assert.strictEqual(state.x, 1);
97 | assert.strictEqual(renderedTimes, 1);
98 |
99 | act(() => { state.x = 2; });
100 |
101 | assert.strictEqual(result.current, 2);
102 | assert.strictEqual(state.x, 2);
103 | assert.strictEqual(renderedTimes, 2);
104 | });
105 |
106 | it('Utilises built-in batching', () => {
107 | const use = getUse();
108 |
109 | const state = {
110 | get use() {
111 | return use;
112 | },
113 | x: 1,
114 | y: 2,
115 | z: 3,
116 | };
117 |
118 | Object.defineProperty(state, 'use', { enumerable: false });
119 |
120 | let renderedTimes = 0;
121 | const { result } = renderHook(() => {
122 | renderedTimes += 1;
123 |
124 | return [state.use('x'), state.use('y'), state.use('z')] as const;
125 | });
126 |
127 | assert.deepStrictEqual(result.current satisfies (readonly [number, number, number]), [1, 2, 3]);
128 | assert.strictEqual(renderedTimes, 1);
129 |
130 | act(() => {
131 | state.x += 1;
132 | state.y += 1;
133 | state.z += 1;
134 | });
135 |
136 | assert.deepStrictEqual(result.current satisfies (readonly [number, number, number]), [2, 3, 4]);
137 |
138 | assert.strictEqual(renderedTimes, 2);
139 |
140 | // one more time
141 | act(() => {
142 | state.x += 1;
143 | state.y += 1;
144 | state.z += 1;
145 | });
146 |
147 | assert.deepStrictEqual(result.current satisfies (readonly [number, number, number]), [3, 4, 5]);
148 |
149 | assert.strictEqual(renderedTimes, 3);
150 | });
151 |
152 | it('Works with readonly arrays', () => {
153 | class State {
154 | use = getUse();
155 |
156 | x = 1;
157 |
158 | y = '2';
159 | }
160 |
161 | const state = new State();
162 |
163 | let renderedTimes = 0;
164 | const { result } = renderHook(() => {
165 | renderedTimes += 1;
166 |
167 | return state.use(['x', 'y']);
168 | });
169 |
170 | assert.deepStrictEqual(result.current satisfies [number, string], [1, '2']);
171 | assert.strictEqual(state.x, 1);
172 | assert.strictEqual(renderedTimes, 1);
173 |
174 | act(() => { state.x = 2; });
175 |
176 | assert.deepStrictEqual(result.current, [2, '2']);
177 | assert.strictEqual(state.x, 2);
178 | assert.strictEqual(renderedTimes, 2);
179 |
180 | act(() => { state.y = '3'; });
181 |
182 | assert.deepStrictEqual(result.current, [2, '3']);
183 | assert.strictEqual(state.y, '3');
184 | assert.strictEqual(renderedTimes, 3);
185 | });
186 |
187 | it('Works with regular arrays', () => {
188 | class State {
189 | use = getUse();
190 |
191 | x = 1;
192 |
193 | y = '2';
194 | }
195 |
196 | const state = new State();
197 |
198 | let renderedTimes = 0;
199 | const { result } = renderHook(() => {
200 | renderedTimes += 1;
201 |
202 | const keys = Array>();
203 | keys.push('x');
204 | keys.push('y');
205 |
206 | return state.use(keys);
207 | });
208 |
209 | assert.deepStrictEqual(result.current satisfies (string | number)[], [1, '2']);
210 | assert.strictEqual(state.x, 1);
211 | assert.strictEqual(renderedTimes, 1);
212 |
213 | act(() => { state.x = 2; });
214 |
215 | assert.deepStrictEqual(result.current, [2, '2']);
216 | assert.strictEqual(state.x, 2);
217 | assert.strictEqual(renderedTimes, 2);
218 |
219 | act(() => { state.y = '3'; });
220 |
221 | assert.deepStrictEqual(result.current, [2, '3']);
222 | assert.strictEqual(state.y, '3');
223 | assert.strictEqual(renderedTimes, 3);
224 | });
225 |
226 | it('Supports symbols', () => {
227 | const x = Symbol('x');
228 | const y = Symbol('y');
229 |
230 | class State {
231 | use = getUse();
232 |
233 | [x] = 1;
234 |
235 | [y] = '2';
236 | }
237 |
238 | const state = new State();
239 |
240 | let renderedTimes = 0;
241 | const { result } = renderHook(() => {
242 | renderedTimes += 1;
243 |
244 | return state.use(x);
245 | });
246 |
247 | assert.strictEqual(result.current, 1);
248 | assert.strictEqual(state[x], 1);
249 | assert.strictEqual(renderedTimes, 1);
250 |
251 | act(() => { state[x] = 2; });
252 |
253 | assert.strictEqual(result.current, 2);
254 | assert.strictEqual(state[x], 2);
255 | assert.strictEqual(renderedTimes, 2);
256 | });
257 |
258 | it('use with function', () => {
259 | const use = getUse();
260 |
261 | const state = {
262 | get use() {
263 | return use;
264 | },
265 | x: 1,
266 | y: '2',
267 | };
268 |
269 | Object.defineProperty(state, 'use', { enumerable: false });
270 |
271 | let renderedTimes = 0;
272 | const { result } = renderHook(() => {
273 | renderedTimes += 1;
274 |
275 | return state.use('x', (x, key, prev) => [x, key, prev] as const);
276 | });
277 |
278 | assert.deepStrictEqual(result.current satisfies readonly [number, 'x' | null, typeof state], [1, null, state]);
279 | assert.strictEqual(state.x, 1);
280 | assert.strictEqual(renderedTimes, 1);
281 |
282 | act(() => { state.x = 2; });
283 |
284 | assert.deepStrictEqual(result.current satisfies readonly [number, 'x' | null, typeof state], [2, 'x', {
285 | ...state,
286 | x: 1,
287 | }]);
288 | assert.strictEqual(state.x, 2);
289 | assert.strictEqual(renderedTimes, 2);
290 |
291 | act(() => { state.y = '3'; }); // not invoking the hook
292 |
293 | assert.deepStrictEqual(result.current satisfies readonly [number, 'x' | null, typeof state], [2, 'x', {
294 | ...state,
295 | y: '2',
296 | x: 1,
297 | }]);
298 | assert.strictEqual(state.y, '3');
299 | assert.strictEqual(renderedTimes, 2);
300 | });
301 |
302 | it('use with function and deps', () => {
303 | const use = getUse();
304 |
305 | const state = {
306 | get use() {
307 | return use;
308 | },
309 | x: 1,
310 | };
311 |
312 | Object.defineProperty(state, 'use', { enumerable: false });
313 |
314 | let renderedTimes = 0;
315 | let invokedTimes = 0;
316 | const { result, rerender } = renderHook(({ y }: { y: number } = { y: 0 }) => {
317 | renderedTimes += 1;
318 |
319 | return state.use('x', (x) => {
320 | invokedTimes += 1;
321 | return x + y;
322 | }, [y]);
323 | });
324 |
325 | assert.strictEqual(result.current, 1);
326 | assert.strictEqual(state.x, 1);
327 | assert.strictEqual(renderedTimes, 1);
328 | assert.strictEqual(invokedTimes, 1);
329 |
330 | rerender({ y: 10 });
331 |
332 | assert.strictEqual(result.current, 11);
333 | assert.strictEqual(state.x, 1);
334 | assert.strictEqual(renderedTimes, 2);
335 | assert.strictEqual(invokedTimes, 2);
336 |
337 | rerender({ y: 10 });
338 |
339 | assert.strictEqual(result.current, 11);
340 | assert.strictEqual(state.x, 1);
341 | assert.strictEqual(renderedTimes, 3);
342 | assert.strictEqual(invokedTimes, 2);
343 | });
344 |
345 | it('use with array and function', () => {
346 | const use = getUse();
347 |
348 | const state = {
349 | get use() {
350 | return use;
351 | },
352 | x: 1,
353 | y: '2',
354 | };
355 |
356 | Object.defineProperty(state, 'use', { enumerable: false });
357 |
358 | let renderedTimes = 0;
359 | let prev = { ...state };
360 |
361 | const { result } = renderHook(() => {
362 | renderedTimes += 1;
363 |
364 | return state.use(['x', 'y'], (values, key, prevArg) => {
365 | assert.ok(key === 'x' || key === null);
366 | assert.deepStrictEqual(prevArg, prev);
367 | return values;
368 | });
369 | });
370 |
371 | assert.strictEqual(renderedTimes, 1);
372 | assert.deepStrictEqual(result.current satisfies [number, string], [1, '2']);
373 |
374 | // -----
375 | prev = { ...state };
376 | act(() => {
377 | state.x = 2;
378 | });
379 |
380 | assert.strictEqual(renderedTimes, 2);
381 | assert.deepStrictEqual(result.current satisfies [number, string], [2, '2']);
382 | });
383 |
384 | it.skip('*** Overloads (supposed to be skipped)', () => {
385 | const use = getUse();
386 |
387 | const state = {
388 | get use() {
389 | return use;
390 | },
391 | x: 1,
392 | y: '2',
393 | };
394 |
395 | state.use('x') satisfies number;
396 | state.use('x', (val, key, prev) => {
397 | val satisfies number;
398 | key satisfies 'x' | null;
399 | prev satisfies typeof state;
400 | return val satisfies number;
401 | }) satisfies number;
402 | state.use(['x', 'y']) satisfies [number, string];
403 | state.use(['x', 'y'], (val, key, prevArg) => {
404 | key satisfies 'use' | 'x' | 'y' | null;
405 | prevArg satisfies typeof state;
406 | return val satisfies [number, string];
407 | }) satisfies [number, string];
408 | state.use(null) satisfies undefined;
409 | state.use(null, (val, key, prev) => {
410 | key satisfies null;
411 | prev satisfies typeof state;
412 | return val satisfies undefined;
413 | });
414 | state.use(undefined) satisfies undefined;
415 | state.use(undefined, (val, key, prev) => {
416 | key satisfies null;
417 | prev satisfies typeof state;
418 | return val satisfies undefined;
419 | }) satisfies undefined;
420 | state.use('x' as 'x' | null) satisfies number | undefined;
421 | // @ts-expect-error expected
422 | state.use('x' as 'x' | null) satisfies number;
423 | state.use('x' as 'x' | null, (val, key, prev) => {
424 | key satisfies 'x' | null;
425 | prev satisfies typeof state;
426 | // @ts-expect-error expected
427 | val satisfies number;
428 | return val satisfies number | undefined;
429 | }) satisfies number | undefined;
430 | state.use(['x', 'y'] as ['x', 'y'] | null) satisfies [number, string] | undefined;
431 | // @ts-expect-error expected
432 | state.use(['x', 'y'] as ['x', 'y'] | null) satisfies [number, string];
433 | state.use(['x', 'y'] as ['x', 'y'] | null, (val, key, prevArg) => {
434 | key satisfies 'use' | 'x' | 'y' | null;
435 | prevArg satisfies typeof state;
436 | // @ts-expect-error expected
437 | val satisfies [number, string];
438 | return val satisfies [number, string] | undefined;
439 | }) satisfies [number, string] | undefined;
440 | });
441 | });
442 |
--------------------------------------------------------------------------------
/test/index.ts:
--------------------------------------------------------------------------------
1 | import './createRecord.test';
2 | import './getUse.test';
3 | import './getListen.test';
4 | import './listenOne.test';
5 |
--------------------------------------------------------------------------------
/test/listenOne.test.ts:
--------------------------------------------------------------------------------
1 | /* eslint-disable @typescript-eslint/no-floating-promises */
2 |
3 | import { it, describe } from 'node:test';
4 | import assert from 'node:assert';
5 | import listenOne from '../src/listenOne';
6 |
7 | describe('listenOne (inner)', () => {
8 | it('listen and returned unlisten', () => {
9 | const state = { x: 1 };
10 | let prev: number;
11 | let triggerTimes = 0;
12 |
13 | const unlisten = listenOne(state, 'x', (x, previous) => {
14 | triggerTimes += 1;
15 | assert.strictEqual(x satisfies number, state.x);
16 | assert.strictEqual(previous satisfies number, prev);
17 | });
18 |
19 | prev = state.x;
20 | state.x = 2;
21 | assert.strictEqual(triggerTimes, 1);
22 | prev = state.x;
23 | state.x = 3;
24 | assert.strictEqual(triggerTimes, 2);
25 | unlisten();
26 | prev = state.x;
27 | state.x = 4;
28 | assert.strictEqual(triggerTimes, 2);
29 | prev = state.x;
30 | state.x = 5;
31 | assert.strictEqual(triggerTimes, 2);
32 | });
33 | });
34 |
--------------------------------------------------------------------------------
/test/post-publish.cjs:
--------------------------------------------------------------------------------
1 | /* eslint-disable */
2 | const { execSync } = require('child_process');
3 | const { it, describe } = require('node:test');
4 | const assert = require('node:assert');
5 |
6 | execSync('rm -rf ../node_modules && npm --prefix .. --legacy-peer-deps --no-package-lock --no-save i rebloom@latest', { cwd: __dirname });
7 |
8 | const { getUse, getListen, createRecord } = require('rebloom');
9 |
10 | describe('Post-publish', () => {
11 | it('Published properly', () => {
12 | assert.strictEqual(typeof getUse === 'function', true);
13 | assert.strictEqual(typeof getListen === 'function', true);
14 | assert.strictEqual(typeof createRecord === 'function', true);
15 | });
16 | });
17 |
18 | // return main dependencies back
19 | execSync('npm --prefix .. --no-package-lock --legacy-peer-deps --no-save un rebloom', { cwd: __dirname });
20 | execSync('npm --prefix .. ci --legacy-peer-deps', { cwd: __dirname });
21 |
--------------------------------------------------------------------------------
/tsconfig.eslint.json:
--------------------------------------------------------------------------------
1 | {
2 | "extends": "./tsconfig.json",
3 | "include": ["src", "test", "post-publish-test"]
4 | }
5 |
--------------------------------------------------------------------------------
/tsconfig.json:
--------------------------------------------------------------------------------
1 | {
2 | "compilerOptions": {
3 | "target": "es2016", /* Specify ECMAScript target version: 'ES3' (default), 'ES5', 'ES2015', 'ES2016', 'ES2017', 'ES2018', 'ES2019', 'ES2020', or 'ESNEXT'. */
4 | "module": "commonjs", /* Specify module code generation: 'none', 'commonjs', 'amd', 'system', 'umd', 'es2015', 'es2020', or 'ESNext'. */
5 | "declaration": true, /* Generates corresponding '.d.ts' file. */
6 | "outDir": "./dist", /* Redirect output structure to the directory. */
7 | "strict": true, /* Enable all strict type-checking options. */
8 | "esModuleInterop": true, /* Enables emit interoperability between CommonJS and ES Modules via creation of namespace objects for all imports. Implies 'allowSyntheticDefaultImports'. */
9 |
10 | "skipLibCheck": true, /* Skip type checking of declaration files. */
11 | "forceConsistentCasingInFileNames": true /* Disallow inconsistently-cased references to the same file. */
12 | },
13 | "include": ["src"]
14 | }
15 |
--------------------------------------------------------------------------------