├── .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 | npm version 6 | TypeScript 7 | Build status 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 | [![](.github/screenshot.png)](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/button)](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 | 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 | 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 | 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 | 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 | --------------------------------------------------------------------------------