From 3725dd39fc8cd4985009c92cd53cb7708fa4fe78 Mon Sep 17 00:00:00 2001 From: Augustine Kim Date: Mon, 18 Mar 2024 14:16:21 -0700 Subject: [PATCH 01/13] Initial labs/redux setup --- .eslintignore | 6 + .prettierignore | 6 + package-lock.json | 77 +++++++++- packages/labs/redux/.gitignore | 5 + packages/labs/redux/CHANGELOG.md | 1 + packages/labs/redux/LICENSE | 28 ++++ packages/labs/redux/README.md | 19 +++ packages/labs/redux/package.json | 146 +++++++++++++++++++ packages/labs/redux/rollup.config.js | 14 ++ packages/labs/redux/src/index.ts | 9 ++ packages/labs/redux/src/lib/selector.ts | 115 +++++++++++++++ packages/labs/redux/src/lib/store-context.ts | 11 ++ packages/labs/redux/tsconfig.json | 29 ++++ rollup-common.js | 1 + 14 files changed, 464 insertions(+), 3 deletions(-) create mode 100644 packages/labs/redux/.gitignore create mode 100644 packages/labs/redux/CHANGELOG.md create mode 100644 packages/labs/redux/LICENSE create mode 100644 packages/labs/redux/README.md create mode 100644 packages/labs/redux/package.json create mode 100644 packages/labs/redux/rollup.config.js create mode 100644 packages/labs/redux/src/index.ts create mode 100644 packages/labs/redux/src/lib/selector.ts create mode 100644 packages/labs/redux/src/lib/store-context.ts create mode 100644 packages/labs/redux/tsconfig.json diff --git a/.eslintignore b/.eslintignore index bb0dc1e7b6..f60533e273 100644 --- a/.eslintignore +++ b/.eslintignore @@ -310,6 +310,12 @@ packages/labs/react/index.* packages/labs/react/create-component.* packages/labs/react/use-controller.* +packages/labs/redux/development/ +packages/labs/redux/lib/ +packages/labs/redux/test/ +packages/labs/redux/node_modules/ +packages/labs/redux/index.* + packages/labs/rollup-plugin-minify-html-literals/node_modules packages/labs/rollup-plugin-minify-html-literals/coverage packages/labs/rollup-plugin-minify-html-literals/.nyc_output diff --git a/.prettierignore b/.prettierignore index 6f5b3c0af7..7ab6b73c7c 100644 --- a/.prettierignore +++ b/.prettierignore @@ -298,6 +298,12 @@ packages/labs/react/index.* packages/labs/react/create-component.* packages/labs/react/use-controller.* +packages/labs/redux/development/ +packages/labs/redux/lib/ +packages/labs/redux/test/ +packages/labs/redux/node_modules/ +packages/labs/redux/index.* + packages/labs/rollup-plugin-minify-html-literals/node_modules packages/labs/rollup-plugin-minify-html-literals/coverage packages/labs/rollup-plugin-minify-html-literals/.nyc_output diff --git a/package-lock.json b/package-lock.json index 693c2b4efe..500d02b303 100644 --- a/package-lock.json +++ b/package-lock.json @@ -3468,6 +3468,10 @@ "resolved": "packages/labs/react", "link": true }, + "node_modules/@lit-labs/redux": { + "resolved": "packages/labs/redux", + "link": true + }, "node_modules/@lit-labs/rollup-plugin-minify-html-literals": { "resolved": "packages/labs/rollup-plugin-minify-html-literals", "link": true @@ -4720,6 +4724,30 @@ "integrity": "sha512-KtC/fZw+oqtwOLUFM9UtiitB0JsVX0zLKNyRTA332sqREqSALIIQQxdUCS1P3xR/jT1e2e8/5rwH6gdcMLEmsQ==", "dev": true }, + "node_modules/@reduxjs/toolkit": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/@reduxjs/toolkit/-/toolkit-2.2.1.tgz", + "integrity": "sha512-8CREoqJovQW/5I4yvvijm/emUiCCmcs4Ev4XPWd4mizSO+dD3g5G6w34QK5AGeNrSH7qM8Fl66j4vuV7dpOdkw==", + "peer": true, + "dependencies": { + "immer": "^10.0.3", + "redux": "^5.0.1", + "redux-thunk": "^3.1.0", + "reselect": "^5.0.1" + }, + "peerDependencies": { + "react": "^16.9.0 || ^17.0.0 || ^18", + "react-redux": "^7.2.1 || ^8.1.3 || ^9.0.0" + }, + "peerDependenciesMeta": { + "react": { + "optional": true + }, + "react-redux": { + "optional": true + } + } + }, "node_modules/@rollup/plugin-commonjs": { "version": "25.0.7", "resolved": "https://registry.npmjs.org/@rollup/plugin-commonjs/-/plugin-commonjs-25.0.7.tgz", @@ -15859,6 +15887,16 @@ "version": "3.0.6", "license": "MIT" }, + "node_modules/immer": { + "version": "10.0.4", + "resolved": "https://registry.npmjs.org/immer/-/immer-10.0.4.tgz", + "integrity": "sha512-cuBuGK40P/sk5IzWa9QPUaAdvPHjkk1c+xYsd9oZw+YQQEV+10G0P5uMpGctZZKnyQ+ibRO08bD25nWLmYi2pw==", + "peer": true, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/immer" + } + }, "node_modules/immutable": { "version": "3.8.2", "dev": true, @@ -22000,6 +22038,21 @@ "node": ">=6" } }, + "node_modules/redux": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/redux/-/redux-5.0.1.tgz", + "integrity": "sha512-M9/ELqF6fy8FwmkpnF0S3YKOqMyoWJ4+CS5Efg2ct3oY9daQvd/Pc71FpGZsVsbl3Cpb+IIcjBDUnnyBdQbq4w==", + "peer": true + }, + "node_modules/redux-thunk": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/redux-thunk/-/redux-thunk-3.1.0.tgz", + "integrity": "sha512-NW2r5T6ksUKXCabzhL9z+h206HQw/NJkcLm1GPImRQ8IzfXwRGqjVhKJGauHirT0DAuyy6hjdnMZaRoAcy0Klw==", + "peer": true, + "peerDependencies": { + "redux": "^5.0.0" + } + }, "node_modules/reflect.getprototypeof": { "version": "1.0.4", "license": "MIT", @@ -22278,6 +22331,12 @@ "dev": true, "license": "MIT" }, + "node_modules/reselect": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/reselect/-/reselect-5.1.0.tgz", + "integrity": "sha512-aw7jcGLDpSgNDyWBQLv2cedml85qd95/iszJjN988zX1t7AVRJi19d9kto5+W7oCfQ94gyo40dVbT6g2k4/kXg==", + "peer": true + }, "node_modules/resize-observer-polyfill": { "version": "1.5.1", "dev": true, @@ -28401,6 +28460,21 @@ "node": ">=12" } }, + "packages/labs/redux": { + "name": "@lit-labs/redux", + "version": "0.0.0", + "license": "BSD-3-Clause", + "dependencies": { + "@lit/context": "^1.1.0", + "@lit/reactive-element": "^1.0.0 || ^2.0.0" + }, + "devDependencies": { + "lit": "^3.0.0" + }, + "peerDependencies": { + "@reduxjs/toolkit": "^1.0.0 || ^2.0.0" + } + }, "packages/labs/rollup-plugin-minify-html-literals": { "name": "@lit-labs/rollup-plugin-minify-html-literals", "version": "0.0.0", @@ -29014,9 +29088,6 @@ "@lit/react": "1.0.5", "@types/node": "^20.11.25", "@types/react": "^18.0.27", - "@types/react-dom": "^18.0.10", - "lit": "^3.1.2", - "react": "^18.2.0", "react-dom": "^18.2.0", "uvu": "^0.5.6" }, diff --git a/packages/labs/redux/.gitignore b/packages/labs/redux/.gitignore new file mode 100644 index 0000000000..c2607903f2 --- /dev/null +++ b/packages/labs/redux/.gitignore @@ -0,0 +1,5 @@ +/development/ +/lib/ +/test/ +/node_modules/ +/index.* diff --git a/packages/labs/redux/CHANGELOG.md b/packages/labs/redux/CHANGELOG.md new file mode 100644 index 0000000000..420e6f23d0 --- /dev/null +++ b/packages/labs/redux/CHANGELOG.md @@ -0,0 +1 @@ +# Change Log diff --git a/packages/labs/redux/LICENSE b/packages/labs/redux/LICENSE new file mode 100644 index 0000000000..be7a97b60d --- /dev/null +++ b/packages/labs/redux/LICENSE @@ -0,0 +1,28 @@ +BSD 3-Clause License + +Copyright (c) 2017 Google LLC. All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are met: + +1. Redistributions of source code must retain the above copyright notice, this + list of conditions and the following disclaimer. + +2. Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + +3. Neither the name of the copyright holder nor the names of its + contributors may be used to endorse or promote products derived from + this software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE +FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR +SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER +CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, +OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. \ No newline at end of file diff --git a/packages/labs/redux/README.md b/packages/labs/redux/README.md new file mode 100644 index 0000000000..42c8cc9d9f --- /dev/null +++ b/packages/labs/redux/README.md @@ -0,0 +1,19 @@ +# @lit-labs/redux + +A reactive controller for subscribing to a Redux store. + +## Overview + +## Installation + +From inside your project folder, run: + +```bash +$ npm install @lit-labs/redux +``` + +## Usage + +## Contributing + +Please see [CONTRIBUTING.md](../../../CONTRIBUTING.md). diff --git a/packages/labs/redux/package.json b/packages/labs/redux/package.json new file mode 100644 index 0000000000..d0b505cd6f --- /dev/null +++ b/packages/labs/redux/package.json @@ -0,0 +1,146 @@ +{ + "private": true, + "name": "@lit-labs/redux", + "version": "0.0.0", + "description": "A reactive controller for subscribing to a Redux store.", + "license": "BSD-3-Clause", + "homepage": "https://lit.dev/", + "repository": { + "type": "git", + "url": "https://github.com/lit/lit.git", + "directory": "packages/labs/redux" + }, + "type": "module", + "main": "index.js", + "module": "index.js", + "typings": "index.d.ts", + "directories": { + "test": "test" + }, + "exports": { + ".": { + "types": "./index.d.ts", + "development": "./development/index.js", + "default": "./index.js" + } + }, + "files": [ + "/development/", + "!/development/test/", + "/lib/", + "/index.{d.ts,d.ts.map,js,js.map}" + ], + "scripts": { + "build": "wireit", + "build:ts": "wireit", + "build:rollup": "wireit", + "test": "wireit", + "test:dev": "wireit", + "test:prod": "wireit", + "checksize": "wireit" + }, + "wireit": { + "build": { + "dependencies": [ + "build:ts", + "build:rollup", + "../../lit:build", + "../../reactive-element:build" + ] + }, + "build:ts": { + "command": "tsc --build --pretty", + "dependencies": [ + "../../lit:build:ts:types", + "../../reactive-element:build:ts:types" + ], + "clean": "if-file-deleted", + "files": [ + "src/**/*.ts", + "tsconfig.json" + ], + "output": [ + "development/", + "tsconfig.tsbuildinfo", + "index.d.ts{,.map}", + "lib/**/*.d.ts{,.map}", + "test/**/*.d.ts{,.map}" + ] + }, + "build:rollup": { + "command": "rollup -c", + "dependencies": [ + "build:ts" + ], + "files": [ + "rollup.config.js", + "../../rollup-common.js" + ], + "output": [ + "index.js{,.map}", + "lib/**/*.js{,.map}", + "test/**/*.js{,.map}", + "test/**/*.js{,.map}" + ] + }, + "checksize": { + "command": "rollup -c --environment=CHECKSIZE", + "dependencies": [ + "build:ts" + ], + "files": [ + "rollup.config.js", + "../../rollup-common.js" + ], + "output": [] + }, + "test": { + "dependencies": [ + "test:dev", + "test:prod" + ] + }, + "test:dev": { + "command": "MODE=dev node ../tests/run-web-tests.js \"development/**/*_test.js\" --config ../tests/web-test-runner.config.js", + "dependencies": [ + "build", + "../../tests:build" + ], + "env": { + "BROWSERS": { + "external": true + } + }, + "files": [], + "output": [] + }, + "test:prod": { + "command": "MODE=prod node ../tests/run-web-tests.js \"development/**/*_test.js\" --config ../tests/web-test-runner.config.js", + "dependencies": [ + "build", + "../../tests:build" + ], + "env": { + "BROWSERS": { + "external": true + } + }, + "files": [], + "output": [] + } + }, + "author": "Google LLC", + "devDependencies": { + "lit": "^3.0.0" + }, + "dependencies": { + "@lit/context": "^1.1.0", + "@lit/reactive-element": "^1.0.0 || ^2.0.0" + }, + "peerDependencies": { + "@reduxjs/toolkit": "^1.0.0 || ^2.0.0" + }, + "publishConfig": { + "access": "public" + } +} diff --git a/packages/labs/redux/rollup.config.js b/packages/labs/redux/rollup.config.js new file mode 100644 index 0000000000..a05fc2f588 --- /dev/null +++ b/packages/labs/redux/rollup.config.js @@ -0,0 +1,14 @@ +/** + * @license + * Copyright 2018 Google LLC + * SPDX-License-Identifier: BSD-3-Clause + */ + +import {litProdConfig} from '../../../rollup-common.js'; +import {createRequire} from 'module'; + +export default litProdConfig({ + packageName: createRequire(import.meta.url)('./package.json').name, + entryPoints: ['index'], + external: ['@lit/context', '@reduxjs/toolkit'], +}); diff --git a/packages/labs/redux/src/index.ts b/packages/labs/redux/src/index.ts new file mode 100644 index 0000000000..31e613c4dc --- /dev/null +++ b/packages/labs/redux/src/index.ts @@ -0,0 +1,9 @@ +/** + * @license + * Copyright 2024 Google LLC + * SPDX-License-Identifier: BSD-3-Clause + */ + +export * from './lib/selector.js'; +export * from './lib/store-context.js'; +export {provide, ContextProvider} from '@lit/context'; diff --git a/packages/labs/redux/src/lib/selector.ts b/packages/labs/redux/src/lib/selector.ts new file mode 100644 index 0000000000..596a8ecd30 --- /dev/null +++ b/packages/labs/redux/src/lib/selector.ts @@ -0,0 +1,115 @@ +/** + * @license + * Copyright 2024 Google LLC + * SPDX-License-Identifier: BSD-3-Clause + */ + +import type { + ReactiveController, + ReactiveControllerHost, +} from '@lit/reactive-element'; +import type {Store} from '@reduxjs/toolkit'; +import {ContextConsumer} from '@lit/context'; +import {storeContext} from './store-context.js'; + +export type EqualityCheck = (a: unknown, b: unknown) => boolean; +export type SelectorFunction = (state: S) => V; + +export type SelectorOptions = { + selector: SelectorFunction, V>; + equalityCheck?: EqualityCheck; +}; + +export class Selector implements ReactiveController { + private _host: ReactiveControllerHost & HTMLElement; + private _store!: S; + private _selector: SelectorOptions['selector']; + private _equalityCheck: EqualityCheck; + private _unsubscribe!: () => void; + private _value!: V; + + static withStoreType(): new ( + host: ReactiveControllerHost & HTMLElement, + options: SelectorOptions + ) => Selector { + return this; + } + + get value(): V { + return this._value; + } + + get dispatch(): S['dispatch'] { + return (action) => this._store.dispatch(action); + } + + constructor( + host: ReactiveControllerHost & HTMLElement, + options: SelectorOptions + ) { + const {selector, equalityCheck = tripleEquals} = options; + this._host = (host.addController(this), host); + this._selector = selector; + this._equalityCheck = equalityCheck; + } + + hostConnected() { + new ContextConsumer(this._host, { + context: storeContext, + subscribe: true, + callback: (store) => { + this._store = store as S; + }, + }); + if (this._store === undefined) { + throw new Error( + 'Selector must be used in a component below a context provider that ' + + 'provides a Redux store.' + ); + } + this._value = this._selector(this._store.getState()); + this._unsubscribe = this._store.subscribe(() => { + const selected = this._selector(this._store.getState()); + if (!this._equalityCheck(this.value, selected)) { + this._value = selected; + this._host.requestUpdate(); + } + }); + } + + hostDisconnected() { + this._unsubscribe(); + } +} + +export const tripleEquals: EqualityCheck = (a, b) => a === b; + +export const shallowEquals: EqualityCheck = (a, b) => { + if (a === b) { + return true; + } + + if ( + typeof a !== 'object' || + typeof b !== 'object' || + a === null || + b === null + ) { + return false; + } + + const keys = Object.keys(a); + if (keys.length !== Object.keys(b).length) { + return false; + } + + for (const k of keys) { + if ( + (a as Record)[k] !== (b as Record)[k] + ) { + return false; + } + } + + return true; +}; diff --git a/packages/labs/redux/src/lib/store-context.ts b/packages/labs/redux/src/lib/store-context.ts new file mode 100644 index 0000000000..e14cdcf30b --- /dev/null +++ b/packages/labs/redux/src/lib/store-context.ts @@ -0,0 +1,11 @@ +/** + * @license + * Copyright 2024 Google LLC + * SPDX-License-Identifier: BSD-3-Clause + */ + +import {createContext} from '@lit/context'; +import type {Store} from '@reduxjs/toolkit'; + +export const storeContextKey = Symbol('redux-store'); +export const storeContext = createContext(storeContextKey); diff --git a/packages/labs/redux/tsconfig.json b/packages/labs/redux/tsconfig.json new file mode 100644 index 0000000000..f8f14a0938 --- /dev/null +++ b/packages/labs/redux/tsconfig.json @@ -0,0 +1,29 @@ +{ + "compilerOptions": { + "composite": true, + "target": "es2021", + "module": "NodeNext", + "lib": ["es2021", "DOM"], + "declaration": true, + "declarationMap": true, + "declarationDir": "./", + "sourceMap": true, + "inlineSources": true, + "outDir": "./development/", + "rootDir": "./src/", + "strict": true, + "noUnusedLocals": true, + "noUnusedParameters": true, + "noImplicitReturns": true, + "noFallthroughCasesInSwitch": true, + "noImplicitAny": true, + "noImplicitThis": true, + "moduleResolution": "NodeNext", + "allowSyntheticDefaultImports": true, + "experimentalDecorators": true, + "noImplicitOverride": true, + "types": ["mocha"] + }, + "include": ["src/**/*.ts"], + "exclude": [] +} diff --git a/rollup-common.js b/rollup-common.js index b9385a96fc..46a87f2ade 100644 --- a/rollup-common.js +++ b/rollup-common.js @@ -37,6 +37,7 @@ const PACKAGE_CLASS_PREFIXES = { '@lit/task': '_$P', '@lit/context': '_$Q', '@lit/react': '_$R', + '@lit-labs/redux': '_$S', }; // Validate prefix uniqueness From 7361a99281098dcd1d2d885bacb4b84c7aea865f Mon Sep 17 00:00:00 2001 From: Augustine Kim Date: Mon, 18 Mar 2024 17:30:36 -0700 Subject: [PATCH 02/13] Add redux example project --- examples/redux/.gitignore | 2 + examples/redux/README.md | 3 + examples/redux/assets/lit.svg | 6 + examples/redux/assets/redux.svg | 1 + examples/redux/index.html | 12 + examples/redux/package.json | 35 + examples/redux/src/app-selector.ts | 14 + examples/redux/src/counter-slice.ts | 35 + examples/redux/src/index.ts | 44 + examples/redux/src/my-counter.ts | 85 + examples/redux/src/store.ts | 18 + examples/redux/tsconfig.json | 24 + package-lock.json | 5605 +++++++++++++++++---------- 13 files changed, 3796 insertions(+), 2088 deletions(-) create mode 100644 examples/redux/.gitignore create mode 100644 examples/redux/README.md create mode 100644 examples/redux/assets/lit.svg create mode 100644 examples/redux/assets/redux.svg create mode 100644 examples/redux/index.html create mode 100644 examples/redux/package.json create mode 100644 examples/redux/src/app-selector.ts create mode 100644 examples/redux/src/counter-slice.ts create mode 100644 examples/redux/src/index.ts create mode 100644 examples/redux/src/my-counter.ts create mode 100644 examples/redux/src/store.ts create mode 100644 examples/redux/tsconfig.json diff --git a/examples/redux/.gitignore b/examples/redux/.gitignore new file mode 100644 index 0000000000..b0a5c349ca --- /dev/null +++ b/examples/redux/.gitignore @@ -0,0 +1,2 @@ +/node_modules/ +/dist/ diff --git a/examples/redux/README.md b/examples/redux/README.md new file mode 100644 index 0000000000..e62366c47e --- /dev/null +++ b/examples/redux/README.md @@ -0,0 +1,3 @@ +# Lit Labs Redux example + +Adaptation of the [Redux Counter Example App](https://redux.js.org/tutorials/essentials/part-2-app-structure#the-counter-example-app) built with Lit, using `@lit-labs/redux`. diff --git a/examples/redux/assets/lit.svg b/examples/redux/assets/lit.svg new file mode 100644 index 0000000000..6d08d32d22 --- /dev/null +++ b/examples/redux/assets/lit.svg @@ -0,0 +1,6 @@ + + + + + + diff --git a/examples/redux/assets/redux.svg b/examples/redux/assets/redux.svg new file mode 100644 index 0000000000..84667388ce --- /dev/null +++ b/examples/redux/assets/redux.svg @@ -0,0 +1 @@ + diff --git a/examples/redux/index.html b/examples/redux/index.html new file mode 100644 index 0000000000..741ba8a7df --- /dev/null +++ b/examples/redux/index.html @@ -0,0 +1,12 @@ + + Lit Labs Redux + + + + + + diff --git a/examples/redux/package.json b/examples/redux/package.json new file mode 100644 index 0000000000..e72544da22 --- /dev/null +++ b/examples/redux/package.json @@ -0,0 +1,35 @@ +{ + "name": "@lit-examples/redux", + "private": true, + "version": "0.0.0", + "type": "module", + "scripts": { + "dev": "wireit", + "build": "wireit", + "test": "wireit" + }, + "dependencies": { + "@lit-labs/redux": "^0.0.0", + "@reduxjs/toolkit": "^2.1.0", + "lit": "^3.0.0" + }, + "devDependencies": { + "vite": "^5.1.6" + }, + "wireit": { + "dev": { + "command": "vite", + "service": true, + "files": [ + "./src/", + "./index.html" + ] + }, + "build": { + "command": "tsc && vite build" + }, + "test": { + "command": "echo \"TODO\"" + } + } +} diff --git a/examples/redux/src/app-selector.ts b/examples/redux/src/app-selector.ts new file mode 100644 index 0000000000..599120b82f --- /dev/null +++ b/examples/redux/src/app-selector.ts @@ -0,0 +1,14 @@ +/** + * @license + * Copyright 2024 Google LLC + * SPDX-License-Identifier: BSD-3-Clause + */ + +import {Selector} from '@lit-labs/redux'; +import type {AppStore} from './store.js'; + +// Create a Selector controller providing the AppStore type for better type +// checks on selector functions and returned values. +// Similar idea as: +// https://redux.js.org/tutorials/typescript-quick-start#define-typed-hooks +export const AppSelector = Selector.withStoreType(); diff --git a/examples/redux/src/counter-slice.ts b/examples/redux/src/counter-slice.ts new file mode 100644 index 0000000000..c8e59fee76 --- /dev/null +++ b/examples/redux/src/counter-slice.ts @@ -0,0 +1,35 @@ +/** + * @license + * Copyright 2024 Google LLC + * SPDX-License-Identifier: BSD-3-Clause + */ + +import {PayloadAction, createSlice} from '@reduxjs/toolkit'; + +export type CounterState = { + value: number; +}; + +const initialState: CounterState = { + value: 0, +}; + +export const counterSlice = createSlice({ + name: 'counter', + initialState, + reducers: { + increment: (state) => { + state.value += 1; + }, + decrement: (state) => { + state.value -= 1; + }, + incrementByAmount: (state, action: PayloadAction) => { + state.value += action.payload; + }, + }, +}); + +export const {increment, decrement, incrementByAmount} = counterSlice.actions; + +export default counterSlice.reducer; diff --git a/examples/redux/src/index.ts b/examples/redux/src/index.ts new file mode 100644 index 0000000000..2c0f580224 --- /dev/null +++ b/examples/redux/src/index.ts @@ -0,0 +1,44 @@ +/** + * @license + * Copyright 2024 Google LLC + * SPDX-License-Identifier: BSD-3-Clause + */ + +import {html, css, LitElement} from 'lit'; +import {customElement} from 'lit/decorators.js'; +import {provide, storeContext} from '@lit-labs/redux'; +import {store} from './store.js'; +import './my-counter.js'; + +@customElement('my-app') +export class MyApp extends LitElement { + // Provide the Redux store in a context to any children of this component. + @provide({ + context: storeContext, + }) + _store = store; + + render() { + return html` +
+ Lit Logo + Redux Logo +
+ + `; + } + + static styles = css` + div { + display: flex; + justify-content: center; + gap: 2rem; + padding: 2rem; + } + + img { + max-height: 150px; + max-width: 150px; + } + `; +} diff --git a/examples/redux/src/my-counter.ts b/examples/redux/src/my-counter.ts new file mode 100644 index 0000000000..b5568dc72c --- /dev/null +++ b/examples/redux/src/my-counter.ts @@ -0,0 +1,85 @@ +/** + * @license + * Copyright 2024 Google LLC + * SPDX-License-Identifier: BSD-3-Clause + */ + +import {html, css, LitElement} from 'lit'; +import {customElement, state} from 'lit/decorators.js'; +import {AppSelector} from './app-selector.js'; +import {increment, decrement, incrementByAmount} from './counter-slice.js'; + +@customElement('my-counter') +export class MyCounter extends LitElement { + // Select the counter value from the Redux store from parent context. + _selected = new AppSelector(this, {selector: (state) => state.counter.value}); + + @state() + _incrementAmount = '2'; + + _incrementCount() { + this._selected.dispatch(increment()); + } + + _decrementCount() { + this._selected.dispatch(decrement()); + } + + _handleInput(e: InputEvent) { + this._incrementAmount = (e.target as HTMLInputElement).value; + } + + _incrementCountByAmount() { + this._selected.dispatch( + incrementByAmount(Number(this._incrementAmount) || 0) + ); + } + + render() { + return html` +
+
+ + ${this._selected.value} + +
+
+ + +
+
+ `; + } + + static styles = css` + :host { + font-size: 2rem; + } + + .container { + display: flex; + flex-direction: column; + align-items: center; + gap: 1rem; + } + + .row { + display: flex; + justify-content: center; + align-items: center; + gap: 1rem; + } + + button { + font-size: 1.5rem; + padding: 10px; + } + + input { + font-size: 1.5rem; + padding: 10px; + width: 100px; + text-align: center; + } + `; +} diff --git a/examples/redux/src/store.ts b/examples/redux/src/store.ts new file mode 100644 index 0000000000..f553c76b48 --- /dev/null +++ b/examples/redux/src/store.ts @@ -0,0 +1,18 @@ +/** + * @license + * Copyright 2024 Google LLC + * SPDX-License-Identifier: BSD-3-Clause + */ + +import {configureStore} from '@reduxjs/toolkit'; +import counterReducer from './counter-slice.js'; + +export const store = configureStore({ + reducer: { + counter: counterReducer, + }, +}); + +export type AppStore = typeof store; +export type RootState = ReturnType; +export type AppDispatch = typeof store.dispatch; diff --git a/examples/redux/tsconfig.json b/examples/redux/tsconfig.json new file mode 100644 index 0000000000..94c256cfc6 --- /dev/null +++ b/examples/redux/tsconfig.json @@ -0,0 +1,24 @@ +{ + "compilerOptions": { + "target": "ES2021", + "experimentalDecorators": true, + "useDefineForClassFields": false, + "module": "ESNext", + "lib": ["ES2021", "DOM", "DOM.Iterable"], + "skipLibCheck": true, + + /* Bundler mode */ + "moduleResolution": "bundler", + "allowImportingTsExtensions": true, + "resolveJsonModule": true, + "isolatedModules": true, + "noEmit": true, + + /* Linting */ + "strict": true, + "noUnusedLocals": true, + "noUnusedParameters": true, + "noFallthroughCasesInSwitch": true + }, + "include": ["src"] +} diff --git a/package-lock.json b/package-lock.json index 500d02b303..b5b247de41 100644 --- a/package-lock.json +++ b/package-lock.json @@ -586,1335 +586,1594 @@ "vite": "^4.3.2" } }, - "examples/preact/node_modules/@preact/preset-vite": { - "version": "2.5.0", + "examples/preact/node_modules/@esbuild/android-arm": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.18.20.tgz", + "integrity": "sha512-fyi7TDI/ijKKNZTUJAQqiG5T7YjJXgnzkURqmGj13C6dCqckZBLdl4h7bkhHt/t0WP+zO9/zwroDvANaOqO5Sw==", + "cpu": [ + "arm" + ], "dev": true, - "license": "MIT", - "dependencies": { - "@babel/plugin-transform-react-jsx": "^7.14.9", - "@babel/plugin-transform-react-jsx-development": "^7.16.7", - "@prefresh/vite": "^2.2.8", - "@rollup/pluginutils": "^4.1.1", - "babel-plugin-transform-hook-names": "^1.0.2", - "debug": "^4.3.1", - "kolorist": "^1.2.10", - "resolve": "^1.20.0" - }, - "peerDependencies": { - "@babel/core": "7.x", - "vite": "2.x || 3.x || 4.x" + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=12" } }, - "examples/preact/node_modules/@prefresh/vite": { - "version": "2.4.1", + "examples/preact/node_modules/@esbuild/android-arm64": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.18.20.tgz", + "integrity": "sha512-Nz4rJcchGDtENV0eMKUNa6L12zz2zBDXuhj/Vjh18zGqB44Bi7MBMSXjgunJgjRhCmKOjnPuZp4Mb6OKqtMHLQ==", + "cpu": [ + "arm64" + ], "dev": true, - "license": "MIT", - "dependencies": { - "@babel/core": "^7.22.1", - "@prefresh/babel-plugin": "0.5.0", - "@prefresh/core": "^1.5.1", - "@prefresh/utils": "^1.2.0", - "@rollup/pluginutils": "^4.2.1" - }, - "peerDependencies": { - "preact": "^10.4.0", - "vite": ">=2.0.0" + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=12" } }, - "examples/preact/node_modules/@rollup/pluginutils": { - "version": "4.2.1", + "examples/preact/node_modules/@esbuild/android-x64": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.18.20.tgz", + "integrity": "sha512-8GDdlePJA8D6zlZYJV/jnrRAi6rOiNaCC/JclcXpB+KIuvfBN4owLtgzY2bsxnx666XjJx2kDPUmnTtR8qKQUg==", + "cpu": [ + "x64" + ], "dev": true, - "license": "MIT", - "dependencies": { - "estree-walker": "^2.0.1", - "picomatch": "^2.2.2" - }, + "optional": true, + "os": [ + "android" + ], "engines": { - "node": ">= 8.0.0" + "node": ">=12" } }, - "examples/preact/node_modules/commander": { - "version": "2.20.3", + "examples/preact/node_modules/@esbuild/darwin-arm64": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.18.20.tgz", + "integrity": "sha512-bxRHW5kHU38zS2lPTPOyuyTm+S+eobPUnTNkdJEfAddYgEcll4xkT8DB9d2008DtTbl7uJag2HuE5NZAZgnNEA==", + "cpu": [ + "arm64" + ], "dev": true, - "license": "MIT", "optional": true, - "peer": true + "os": [ + "darwin" + ], + "engines": { + "node": ">=12" + } }, - "examples/preact/node_modules/esbuild": { + "examples/preact/node_modules/@esbuild/darwin-x64": { "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.18.20.tgz", + "integrity": "sha512-pc5gxlMDxzm513qPGbCbDukOdsGtKhfxD1zJKXjCCcU7ju50O7MeAZ8c4krSJcOIJGFR+qx21yMMVYwiQvyTyQ==", + "cpu": [ + "x64" + ], "dev": true, - "hasInstallScript": true, - "license": "MIT", - "bin": { - "esbuild": "bin/esbuild" - }, + "optional": true, + "os": [ + "darwin" + ], "engines": { "node": ">=12" - }, - "optionalDependencies": { - "@esbuild/android-arm": "0.18.20", - "@esbuild/android-arm64": "0.18.20", - "@esbuild/android-x64": "0.18.20", - "@esbuild/darwin-arm64": "0.18.20", - "@esbuild/darwin-x64": "0.18.20", - "@esbuild/freebsd-arm64": "0.18.20", - "@esbuild/freebsd-x64": "0.18.20", - "@esbuild/linux-arm": "0.18.20", - "@esbuild/linux-arm64": "0.18.20", - "@esbuild/linux-ia32": "0.18.20", - "@esbuild/linux-loong64": "0.18.20", - "@esbuild/linux-mips64el": "0.18.20", - "@esbuild/linux-ppc64": "0.18.20", - "@esbuild/linux-riscv64": "0.18.20", - "@esbuild/linux-s390x": "0.18.20", - "@esbuild/linux-x64": "0.18.20", - "@esbuild/netbsd-x64": "0.18.20", - "@esbuild/openbsd-x64": "0.18.20", - "@esbuild/sunos-x64": "0.18.20", - "@esbuild/win32-arm64": "0.18.20", - "@esbuild/win32-ia32": "0.18.20", - "@esbuild/win32-x64": "0.18.20" } }, - "examples/preact/node_modules/postcss": { - "version": "8.4.33", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.33.tgz", - "integrity": "sha512-Kkpbhhdjw2qQs2O2DGX+8m5OVqEcbB9HRBvuYM9pgrjEFUg30A9LmXNlTAUj4S9kgtGyrMbTzVjH7E+s5Re2yg==", + "examples/preact/node_modules/@esbuild/freebsd-arm64": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.18.20.tgz", + "integrity": "sha512-yqDQHy4QHevpMAaxhhIwYPMv1NECwOvIpGCZkECn8w2WFHXjEwrBn3CeNIYsibZ/iZEUemj++M26W3cNR5h+Tw==", + "cpu": [ + "arm64" + ], "dev": true, - "funding": [ - { - "type": "opencollective", - "url": "https://opencollective.com/postcss/" - }, - { - "type": "tidelift", - "url": "https://tidelift.com/funding/github/npm/postcss" - }, - { - "type": "github", - "url": "https://github.com/sponsors/ai" - } + "optional": true, + "os": [ + "freebsd" ], - "dependencies": { - "nanoid": "^3.3.7", - "picocolors": "^1.0.0", - "source-map-js": "^1.0.2" - }, "engines": { - "node": "^10 || ^12 || >=14" + "node": ">=12" } }, - "examples/preact/node_modules/terser": { - "version": "5.27.0", - "resolved": "https://registry.npmjs.org/terser/-/terser-5.27.0.tgz", - "integrity": "sha512-bi1HRwVRskAjheeYl291n3JC4GgO/Ty4z1nVs5AAsmonJulGxpSektecnNedrwK9C7vpvVtcX3cw00VSLt7U2A==", + "examples/preact/node_modules/@esbuild/freebsd-x64": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.18.20.tgz", + "integrity": "sha512-tgWRPPuQsd3RmBZwarGVHZQvtzfEBOreNuxEMKFcd5DaDn2PbBxfwLcj4+aenoh7ctXcbXmOQIn8HI6mCSw5MQ==", + "cpu": [ + "x64" + ], "dev": true, "optional": true, - "peer": true, - "dependencies": { - "@jridgewell/source-map": "^0.3.3", - "acorn": "^8.8.2", - "commander": "^2.20.0", - "source-map-support": "~0.5.20" - }, - "bin": { - "terser": "bin/terser" - }, + "os": [ + "freebsd" + ], "engines": { - "node": ">=10" + "node": ">=12" } }, - "examples/preact/node_modules/vite": { - "version": "4.4.9", + "examples/preact/node_modules/@esbuild/linux-arm": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.18.20.tgz", + "integrity": "sha512-/5bHkMWnq1EgKr1V+Ybz3s1hWXok7mDFUMQ4cG10AfW3wL02PSZi5kFpYKrptDsgb2WAJIvRcDm+qIvXf/apvg==", + "cpu": [ + "arm" + ], "dev": true, - "license": "MIT", - "dependencies": { - "esbuild": "^0.18.10", - "postcss": "^8.4.27", - "rollup": "^3.27.1" - }, - "bin": { - "vite": "bin/vite.js" - }, + "optional": true, + "os": [ + "linux" + ], "engines": { - "node": "^14.18.0 || >=16.0.0" - }, - "funding": { - "url": "https://github.com/vitejs/vite?sponsor=1" - }, - "optionalDependencies": { - "fsevents": "~2.3.2" - }, - "peerDependencies": { - "@types/node": ">= 14", - "less": "*", - "lightningcss": "^1.21.0", - "sass": "*", - "stylus": "*", - "sugarss": "*", - "terser": "^5.4.0" - }, - "peerDependenciesMeta": { - "@types/node": { - "optional": true - }, - "less": { - "optional": true - }, - "lightningcss": { - "optional": true - }, - "sass": { - "optional": true - }, - "stylus": { - "optional": true - }, - "sugarss": { - "optional": true - }, - "terser": { - "optional": true - } + "node": ">=12" } }, - "node_modules/@11ty/dependency-tree": { - "version": "2.0.1", + "examples/preact/node_modules/@esbuild/linux-arm64": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.18.20.tgz", + "integrity": "sha512-2YbscF+UL7SQAVIpnWvYwM+3LskyDmPhe31pE7/aoTMFKKzIc9lLbyGUpmmb8a8AixOL61sQ/mFh3jEjHYFvdA==", + "cpu": [ + "arm64" + ], "dev": true, - "license": "MIT" + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } }, - "node_modules/@11ty/eleventy": { - "version": "1.0.2", + "examples/preact/node_modules/@esbuild/linux-ia32": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.18.20.tgz", + "integrity": "sha512-P4etWwq6IsReT0E1KHU40bOnzMHoH73aXp96Fs8TIT6z9Hu8G6+0SHSw9i2isWrD2nbx2qo5yUqACgdfVGx7TA==", + "cpu": [ + "ia32" + ], "dev": true, - "license": "MIT", - "dependencies": { - "@11ty/dependency-tree": "^2.0.1", - "@11ty/eleventy-utils": "^1.0.1", - "@iarna/toml": "^2.2.5", - "@sindresorhus/slugify": "^1.1.2", - "browser-sync": "^2.27.10", - "chokidar": "^3.5.3", - "cross-spawn": "^7.0.3", - "debug": "^4.3.4", - "dependency-graph": "^0.11.0", - "ejs": "^3.1.8", - "fast-glob": "^3.2.11", - "graceful-fs": "^4.2.10", - "gray-matter": "^4.0.3", - "hamljs": "^0.6.2", - "handlebars": "^4.7.7", - "is-glob": "^4.0.3", - "kleur": "^4.1.5", - "liquidjs": "^9.40.0", - "lodash": "^4.17.21", - "luxon": "^2.5.0", - "markdown-it": "^12.3.2", - "minimist": "^1.2.6", - "moo": "^0.5.1", - "multimatch": "^5.0.0", - "mustache": "^4.2.0", - "normalize-path": "^3.0.0", - "nunjucks": "^3.2.3", - "path-to-regexp": "^6.2.1", - "please-upgrade-node": "^3.2.0", - "pretty": "^2.0.0", - "pug": "^3.0.2", - "recursive-copy": "^2.0.14", - "semver": "^7.3.7", - "slugify": "^1.6.5" - }, - "bin": { - "eleventy": "cmd.js" - }, + "optional": true, + "os": [ + "linux" + ], "engines": { "node": ">=12" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/11ty" } }, - "node_modules/@11ty/eleventy-plugin-syntaxhighlight": { - "version": "4.2.0", + "examples/preact/node_modules/@esbuild/linux-loong64": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.18.20.tgz", + "integrity": "sha512-nXW8nqBTrOpDLPgPY9uV+/1DjxoQ7DoB2N8eocyq8I9XuqJ7BiAMDMf9n1xZM9TgW0J8zrquIb/A7s3BJv7rjg==", + "cpu": [ + "loong64" + ], "dev": true, - "license": "MIT", - "dependencies": { - "linkedom": "^0.14.19", - "prismjs": "^1.29.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/11ty" + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" } }, - "node_modules/@11ty/eleventy-utils": { - "version": "1.0.1", + "examples/preact/node_modules/@esbuild/linux-mips64el": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.18.20.tgz", + "integrity": "sha512-d5NeaXZcHp8PzYy5VnXV3VSd2D328Zb+9dEq5HE6bw6+N86JVPExrA6O68OPwobntbNJ0pzCpUFZTo3w0GyetQ==", + "cpu": [ + "mips64el" + ], "dev": true, - "license": "MIT", - "dependencies": { - "normalize-path": "^3.0.0" - }, + "optional": true, + "os": [ + "linux" + ], "engines": { "node": ">=12" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/11ty" } }, - "node_modules/@11ty/eleventy/node_modules/lru-cache": { - "version": "6.0.0", + "examples/preact/node_modules/@esbuild/linux-ppc64": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.18.20.tgz", + "integrity": "sha512-WHPyeScRNcmANnLQkq6AfyXRFr5D6N2sKgkFo2FqguP44Nw2eyDlbTdZwd9GYk98DZG9QItIiTlFLHJHjxP3FA==", + "cpu": [ + "ppc64" + ], "dev": true, - "license": "ISC", - "dependencies": { - "yallist": "^4.0.0" - }, + "optional": true, + "os": [ + "linux" + ], "engines": { - "node": ">=10" + "node": ">=12" } }, - "node_modules/@11ty/eleventy/node_modules/semver": { - "version": "7.5.4", + "examples/preact/node_modules/@esbuild/linux-riscv64": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.18.20.tgz", + "integrity": "sha512-WSxo6h5ecI5XH34KC7w5veNnKkju3zBRLEQNY7mv5mtBmrP/MjNBCAlsM2u5hDBlS3NGcTQpoBvRzqBcRtpq1A==", + "cpu": [ + "riscv64" + ], "dev": true, - "license": "ISC", - "dependencies": { - "lru-cache": "^6.0.0" - }, - "bin": { - "semver": "bin/semver.js" - }, + "optional": true, + "os": [ + "linux" + ], "engines": { - "node": ">=10" + "node": ">=12" } }, - "node_modules/@11ty/eleventy/node_modules/yallist": { - "version": "4.0.0", + "examples/preact/node_modules/@esbuild/linux-s390x": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.18.20.tgz", + "integrity": "sha512-+8231GMs3mAEth6Ja1iK0a1sQ3ohfcpzpRLH8uuc5/KVDFneH6jtAJLFGafpzpMRO6DzJ6AvXKze9LfFMrIHVQ==", + "cpu": [ + "s390x" + ], "dev": true, - "license": "ISC" - }, - "node_modules/@aashutoshrathi/word-wrap": { - "version": "1.2.6", - "license": "MIT", + "optional": true, + "os": [ + "linux" + ], "engines": { - "node": ">=0.10.0" + "node": ">=12" } }, - "node_modules/@ampproject/remapping": { - "version": "2.2.0", + "examples/preact/node_modules/@esbuild/linux-x64": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.18.20.tgz", + "integrity": "sha512-UYqiqemphJcNsFEskc73jQ7B9jgwjWrSayxawS6UVFZGWrAAtkzjxSqnoclCXxWtfwLdzU+vTpcNYhpn43uP1w==", + "cpu": [ + "x64" + ], "dev": true, - "license": "Apache-2.0", - "dependencies": { - "@jridgewell/gen-mapping": "^0.1.0", - "@jridgewell/trace-mapping": "^0.3.9" - }, + "optional": true, + "os": [ + "linux" + ], "engines": { - "node": ">=6.0.0" + "node": ">=12" } }, - "node_modules/@babel/cli": { - "version": "7.22.10", + "examples/preact/node_modules/@esbuild/netbsd-x64": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.18.20.tgz", + "integrity": "sha512-iO1c++VP6xUBUmltHZoMtCUdPlnPGdBom6IrO4gyKPFFVBKioIImVooR5I83nTew5UOYrk3gIJhbZh8X44y06A==", + "cpu": [ + "x64" + ], "dev": true, - "license": "MIT", - "dependencies": { - "@jridgewell/trace-mapping": "^0.3.17", - "commander": "^4.0.1", - "convert-source-map": "^1.1.0", - "fs-readdir-recursive": "^1.1.0", - "glob": "^7.2.0", - "make-dir": "^2.1.0", - "slash": "^2.0.0" - }, - "bin": { - "babel": "bin/babel.js", - "babel-external-helpers": "bin/babel-external-helpers.js" - }, + "optional": true, + "os": [ + "netbsd" + ], "engines": { - "node": ">=6.9.0" - }, - "optionalDependencies": { - "@nicolo-ribaudo/chokidar-2": "2.1.8-no-fsevents.3", - "chokidar": "^3.4.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" + "node": ">=12" } }, - "node_modules/@babel/cli/node_modules/@jridgewell/trace-mapping": { - "version": "0.3.22", - "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.22.tgz", - "integrity": "sha512-Wf963MzWtA2sjrNt+g18IAln9lKnlRp+K2eH4jjIoF1wYeq3aMREpG09xhlhdzS0EjwU7qmUJYangWa+151vZw==", + "examples/preact/node_modules/@esbuild/openbsd-x64": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.18.20.tgz", + "integrity": "sha512-e5e4YSsuQfX4cxcygw/UCPIEP6wbIL+se3sxPdCiMbFLBWu0eiZOJ7WoD+ptCLrmjZBK1Wk7I6D/I3NglUGOxg==", + "cpu": [ + "x64" + ], "dev": true, - "dependencies": { - "@jridgewell/resolve-uri": "^3.1.0", - "@jridgewell/sourcemap-codec": "^1.4.14" + "optional": true, + "os": [ + "openbsd" + ], + "engines": { + "node": ">=12" } }, - "node_modules/@babel/cli/node_modules/make-dir": { - "version": "2.1.0", + "examples/preact/node_modules/@esbuild/sunos-x64": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.18.20.tgz", + "integrity": "sha512-kDbFRFp0YpTQVVrqUd5FTYmWo45zGaXe0X8E1G/LKFC0v8x0vWrhOWSLITcCn63lmZIxfOMXtCfti/RxN/0wnQ==", + "cpu": [ + "x64" + ], "dev": true, - "license": "MIT", - "dependencies": { - "pify": "^4.0.1", - "semver": "^5.6.0" - }, + "optional": true, + "os": [ + "sunos" + ], "engines": { - "node": ">=6" + "node": ">=12" } }, - "node_modules/@babel/cli/node_modules/semver": { - "version": "5.7.2", + "examples/preact/node_modules/@esbuild/win32-arm64": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.18.20.tgz", + "integrity": "sha512-ddYFR6ItYgoaq4v4JmQQaAI5s7npztfV4Ag6NrhiaW0RrnOXqBkgwZLofVTlq1daVTQNhtI5oieTvkRPfZrePg==", + "cpu": [ + "arm64" + ], "dev": true, - "license": "ISC", - "bin": { - "semver": "bin/semver" + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=12" } }, - "node_modules/@babel/cli/node_modules/slash": { - "version": "2.0.0", + "examples/preact/node_modules/@esbuild/win32-ia32": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.18.20.tgz", + "integrity": "sha512-Wv7QBi3ID/rROT08SABTS7eV4hX26sVduqDOTe1MvGMjNd3EjOz4b7zeexIR62GTIEKrfJXKL9LFxTYgkyeu7g==", + "cpu": [ + "ia32" + ], "dev": true, - "license": "MIT", + "optional": true, + "os": [ + "win32" + ], "engines": { - "node": ">=6" + "node": ">=12" } }, - "node_modules/@babel/code-frame": { - "version": "7.22.13", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.22.13.tgz", - "integrity": "sha512-XktuhWlJ5g+3TJXc5upd9Ks1HutSArik6jf2eAjYFyIOf4ej3RN+184cZbzDvbPnuTJIUhPKKJE3cIsYTiAT3w==", - "dependencies": { - "@babel/highlight": "^7.22.13", - "chalk": "^2.4.2" - }, + "examples/preact/node_modules/@esbuild/win32-x64": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.18.20.tgz", + "integrity": "sha512-kTdfRcSiDfQca/y9QIkng02avJ+NCaQvrMejlsB3RRv5sE9rRoeBPISaZpKxHELzRxZyLvNts1P27W3wV+8geQ==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ], "engines": { - "node": ">=6.9.0" + "node": ">=12" } }, - "node_modules/@babel/compat-data": { - "version": "7.22.9", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/core": { - "version": "7.22.11", + "examples/preact/node_modules/@preact/preset-vite": { + "version": "2.5.0", "dev": true, "license": "MIT", "dependencies": { - "@ampproject/remapping": "^2.2.0", - "@babel/code-frame": "^7.22.10", - "@babel/generator": "^7.22.10", - "@babel/helper-compilation-targets": "^7.22.10", - "@babel/helper-module-transforms": "^7.22.9", - "@babel/helpers": "^7.22.11", - "@babel/parser": "^7.22.11", - "@babel/template": "^7.22.5", - "@babel/traverse": "^7.22.11", - "@babel/types": "^7.22.11", - "convert-source-map": "^1.7.0", - "debug": "^4.1.0", - "gensync": "^1.0.0-beta.2", - "json5": "^2.2.3", - "semver": "^6.3.1" - }, - "engines": { - "node": ">=6.9.0" + "@babel/plugin-transform-react-jsx": "^7.14.9", + "@babel/plugin-transform-react-jsx-development": "^7.16.7", + "@prefresh/vite": "^2.2.8", + "@rollup/pluginutils": "^4.1.1", + "babel-plugin-transform-hook-names": "^1.0.2", + "debug": "^4.3.1", + "kolorist": "^1.2.10", + "resolve": "^1.20.0" }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/babel" + "peerDependencies": { + "@babel/core": "7.x", + "vite": "2.x || 3.x || 4.x" } }, - "node_modules/@babel/eslint-parser": { - "version": "7.19.1", + "examples/preact/node_modules/@prefresh/vite": { + "version": "2.4.1", "dev": true, "license": "MIT", "dependencies": { - "@nicolo-ribaudo/eslint-scope-5-internals": "5.1.1-v1", - "eslint-visitor-keys": "^2.1.0", - "semver": "^6.3.0" - }, - "engines": { - "node": "^10.13.0 || ^12.13.0 || >=14.0.0" + "@babel/core": "^7.22.1", + "@prefresh/babel-plugin": "0.5.0", + "@prefresh/core": "^1.5.1", + "@prefresh/utils": "^1.2.0", + "@rollup/pluginutils": "^4.2.1" }, "peerDependencies": { - "@babel/core": ">=7.11.0", - "eslint": "^7.5.0 || ^8.0.0" - } - }, - "node_modules/@babel/generator": { - "version": "7.23.0", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.23.0.tgz", - "integrity": "sha512-lN85QRR+5IbYrMWM6Y4pE/noaQtg4pNiqeNGX60eqOfo6gtEj6uw/JagelB8vVztSd7R6M5n1+PQkDbHbBRU4g==", - "dependencies": { - "@babel/types": "^7.23.0", - "@jridgewell/gen-mapping": "^0.3.2", - "@jridgewell/trace-mapping": "^0.3.17", - "jsesc": "^2.5.1" - }, - "engines": { - "node": ">=6.9.0" + "preact": "^10.4.0", + "vite": ">=2.0.0" } }, - "node_modules/@babel/generator/node_modules/@jridgewell/gen-mapping": { - "version": "0.3.3", + "examples/preact/node_modules/@rollup/pluginutils": { + "version": "4.2.1", + "dev": true, "license": "MIT", "dependencies": { - "@jridgewell/set-array": "^1.0.1", - "@jridgewell/sourcemap-codec": "^1.4.10", - "@jridgewell/trace-mapping": "^0.3.9" + "estree-walker": "^2.0.1", + "picomatch": "^2.2.2" }, "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/@babel/generator/node_modules/@jridgewell/trace-mapping": { - "version": "0.3.22", - "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.22.tgz", - "integrity": "sha512-Wf963MzWtA2sjrNt+g18IAln9lKnlRp+K2eH4jjIoF1wYeq3aMREpG09xhlhdzS0EjwU7qmUJYangWa+151vZw==", - "dependencies": { - "@jridgewell/resolve-uri": "^3.1.0", - "@jridgewell/sourcemap-codec": "^1.4.14" + "node": ">= 8.0.0" } }, - "node_modules/@babel/helper-annotate-as-pure": { - "version": "7.22.5", + "examples/preact/node_modules/commander": { + "version": "2.20.3", "dev": true, "license": "MIT", - "dependencies": { - "@babel/types": "^7.22.5" - }, - "engines": { - "node": ">=6.9.0" - } + "optional": true, + "peer": true }, - "node_modules/@babel/helper-builder-binary-assignment-operator-visitor": { - "version": "7.18.9", + "examples/preact/node_modules/esbuild": { + "version": "0.18.20", "dev": true, + "hasInstallScript": true, "license": "MIT", - "dependencies": { - "@babel/helper-explode-assignable-expression": "^7.18.6", - "@babel/types": "^7.18.9" + "bin": { + "esbuild": "bin/esbuild" }, "engines": { - "node": ">=6.9.0" + "node": ">=12" + }, + "optionalDependencies": { + "@esbuild/android-arm": "0.18.20", + "@esbuild/android-arm64": "0.18.20", + "@esbuild/android-x64": "0.18.20", + "@esbuild/darwin-arm64": "0.18.20", + "@esbuild/darwin-x64": "0.18.20", + "@esbuild/freebsd-arm64": "0.18.20", + "@esbuild/freebsd-x64": "0.18.20", + "@esbuild/linux-arm": "0.18.20", + "@esbuild/linux-arm64": "0.18.20", + "@esbuild/linux-ia32": "0.18.20", + "@esbuild/linux-loong64": "0.18.20", + "@esbuild/linux-mips64el": "0.18.20", + "@esbuild/linux-ppc64": "0.18.20", + "@esbuild/linux-riscv64": "0.18.20", + "@esbuild/linux-s390x": "0.18.20", + "@esbuild/linux-x64": "0.18.20", + "@esbuild/netbsd-x64": "0.18.20", + "@esbuild/openbsd-x64": "0.18.20", + "@esbuild/sunos-x64": "0.18.20", + "@esbuild/win32-arm64": "0.18.20", + "@esbuild/win32-ia32": "0.18.20", + "@esbuild/win32-x64": "0.18.20" } }, - "node_modules/@babel/helper-compilation-targets": { - "version": "7.22.10", + "examples/preact/node_modules/postcss": { + "version": "8.4.33", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.33.tgz", + "integrity": "sha512-Kkpbhhdjw2qQs2O2DGX+8m5OVqEcbB9HRBvuYM9pgrjEFUg30A9LmXNlTAUj4S9kgtGyrMbTzVjH7E+s5Re2yg==", "dev": true, - "license": "MIT", + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/postcss" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], "dependencies": { - "@babel/compat-data": "^7.22.9", - "@babel/helper-validator-option": "^7.22.5", - "browserslist": "^4.21.9", - "lru-cache": "^5.1.1", - "semver": "^6.3.1" + "nanoid": "^3.3.7", + "picocolors": "^1.0.0", + "source-map-js": "^1.0.2" }, "engines": { - "node": ">=6.9.0" + "node": "^10 || ^12 || >=14" } }, - "node_modules/@babel/helper-create-class-features-plugin": { - "version": "7.22.11", + "examples/preact/node_modules/terser": { + "version": "5.27.0", + "resolved": "https://registry.npmjs.org/terser/-/terser-5.27.0.tgz", + "integrity": "sha512-bi1HRwVRskAjheeYl291n3JC4GgO/Ty4z1nVs5AAsmonJulGxpSektecnNedrwK9C7vpvVtcX3cw00VSLt7U2A==", "dev": true, - "license": "MIT", + "optional": true, + "peer": true, "dependencies": { - "@babel/helper-annotate-as-pure": "^7.22.5", - "@babel/helper-environment-visitor": "^7.22.5", - "@babel/helper-function-name": "^7.22.5", - "@babel/helper-member-expression-to-functions": "^7.22.5", - "@babel/helper-optimise-call-expression": "^7.22.5", - "@babel/helper-replace-supers": "^7.22.9", - "@babel/helper-skip-transparent-expression-wrappers": "^7.22.5", - "@babel/helper-split-export-declaration": "^7.22.6", - "semver": "^6.3.1" + "@jridgewell/source-map": "^0.3.3", + "acorn": "^8.8.2", + "commander": "^2.20.0", + "source-map-support": "~0.5.20" }, - "engines": { - "node": ">=6.9.0" + "bin": { + "terser": "bin/terser" }, - "peerDependencies": { - "@babel/core": "^7.0.0" + "engines": { + "node": ">=10" } }, - "node_modules/@babel/helper-create-regexp-features-plugin": { - "version": "7.20.5", + "examples/preact/node_modules/vite": { + "version": "4.4.9", "dev": true, "license": "MIT", "dependencies": { - "@babel/helper-annotate-as-pure": "^7.18.6", - "regexpu-core": "^5.2.1" + "esbuild": "^0.18.10", + "postcss": "^8.4.27", + "rollup": "^3.27.1" + }, + "bin": { + "vite": "bin/vite.js" }, "engines": { - "node": ">=6.9.0" + "node": "^14.18.0 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/vitejs/vite?sponsor=1" + }, + "optionalDependencies": { + "fsevents": "~2.3.2" }, "peerDependencies": { - "@babel/core": "^7.0.0" + "@types/node": ">= 14", + "less": "*", + "lightningcss": "^1.21.0", + "sass": "*", + "stylus": "*", + "sugarss": "*", + "terser": "^5.4.0" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + }, + "less": { + "optional": true + }, + "lightningcss": { + "optional": true + }, + "sass": { + "optional": true + }, + "stylus": { + "optional": true + }, + "sugarss": { + "optional": true + }, + "terser": { + "optional": true + } } }, - "node_modules/@babel/helper-define-polyfill-provider": { - "version": "0.3.3", - "dev": true, - "license": "MIT", + "examples/redux": { + "name": "@lit-examples/redux", + "version": "0.0.0", "dependencies": { - "@babel/helper-compilation-targets": "^7.17.7", - "@babel/helper-plugin-utils": "^7.16.7", - "debug": "^4.1.1", - "lodash.debounce": "^4.0.8", - "resolve": "^1.14.2", - "semver": "^6.1.2" + "@lit-labs/redux": "^0.0.0", + "@reduxjs/toolkit": "^2.1.0", + "lit": "^3.0.0" }, - "peerDependencies": { - "@babel/core": "^7.4.0-0" + "devDependencies": { + "vite": "^5.1.6" } }, - "node_modules/@babel/helper-environment-visitor": { - "version": "7.22.20", - "resolved": "https://registry.npmjs.org/@babel/helper-environment-visitor/-/helper-environment-visitor-7.22.20.tgz", - "integrity": "sha512-zfedSIzFhat/gFhWfHtgWvlec0nqB9YEIVrpuwjruLlXfUSnA8cJB0miHKwqDnQ7d32aKo2xt88/xZptwxbfhA==", - "engines": { - "node": ">=6.9.0" - } + "examples/redux/node_modules/@rollup/rollup-android-arm-eabi": { + "version": "4.13.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.13.0.tgz", + "integrity": "sha512-5ZYPOuaAqEH/W3gYsRkxQATBW3Ii1MfaT4EQstTnLKViLi2gLSQmlmtTpGucNP3sXEpOiI5tdGhjdE111ekyEg==", + "cpu": [ + "arm" + ], + "dev": true, + "optional": true, + "os": [ + "android" + ] }, - "node_modules/@babel/helper-explode-assignable-expression": { - "version": "7.18.6", + "examples/redux/node_modules/@rollup/rollup-android-arm64": { + "version": "4.13.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.13.0.tgz", + "integrity": "sha512-BSbaCmn8ZadK3UAQdlauSvtaJjhlDEjS5hEVVIN3A4bbl3X+otyf/kOJV08bYiRxfejP3DXFzO2jz3G20107+Q==", + "cpu": [ + "arm64" + ], "dev": true, - "license": "MIT", - "dependencies": { - "@babel/types": "^7.18.6" - }, - "engines": { - "node": ">=6.9.0" - } + "optional": true, + "os": [ + "android" + ] }, - "node_modules/@babel/helper-function-name": { - "version": "7.23.0", - "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.23.0.tgz", - "integrity": "sha512-OErEqsrxjZTJciZ4Oo+eoZqeW9UIiOcuYKRJA4ZAgV9myA+pOXhhmpfNCKjEH/auVfEYVFJ6y1Tc4r0eIApqiw==", - "dependencies": { - "@babel/template": "^7.22.15", - "@babel/types": "^7.23.0" - }, - "engines": { - "node": ">=6.9.0" - } + "examples/redux/node_modules/@rollup/rollup-darwin-arm64": { + "version": "4.13.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.13.0.tgz", + "integrity": "sha512-Ovf2evVaP6sW5Ut0GHyUSOqA6tVKfrTHddtmxGQc1CTQa1Cw3/KMCDEEICZBbyppcwnhMwcDce9ZRxdWRpVd6g==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "darwin" + ] }, - "node_modules/@babel/helper-hoist-variables": { - "version": "7.22.5", - "license": "MIT", + "examples/redux/node_modules/@rollup/rollup-darwin-x64": { + "version": "4.13.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.13.0.tgz", + "integrity": "sha512-U+Jcxm89UTK592vZ2J9st9ajRv/hrwHdnvyuJpa5A2ngGSVHypigidkQJP+YiGL6JODiUeMzkqQzbCG3At81Gg==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "darwin" + ] + }, + "examples/redux/node_modules/@rollup/rollup-linux-arm-gnueabihf": { + "version": "4.13.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.13.0.tgz", + "integrity": "sha512-8wZidaUJUTIR5T4vRS22VkSMOVooG0F4N+JSwQXWSRiC6yfEsFMLTYRFHvby5mFFuExHa/yAp9juSphQQJAijQ==", + "cpu": [ + "arm" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ] + }, + "examples/redux/node_modules/@rollup/rollup-linux-arm64-gnu": { + "version": "4.13.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.13.0.tgz", + "integrity": "sha512-Iu0Kno1vrD7zHQDxOmvweqLkAzjxEVqNhUIXBsZ8hu8Oak7/5VTPrxOEZXYC1nmrBVJp0ZcL2E7lSuuOVaE3+w==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ] + }, + "examples/redux/node_modules/@rollup/rollup-linux-arm64-musl": { + "version": "4.13.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.13.0.tgz", + "integrity": "sha512-C31QrW47llgVyrRjIwiOwsHFcaIwmkKi3PCroQY5aVq4H0A5v/vVVAtFsI1nfBngtoRpeREvZOkIhmRwUKkAdw==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ] + }, + "examples/redux/node_modules/@rollup/rollup-linux-riscv64-gnu": { + "version": "4.13.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.13.0.tgz", + "integrity": "sha512-Oq90dtMHvthFOPMl7pt7KmxzX7E71AfyIhh+cPhLY9oko97Zf2C9tt/XJD4RgxhaGeAraAXDtqxvKE1y/j35lA==", + "cpu": [ + "riscv64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ] + }, + "examples/redux/node_modules/@rollup/rollup-linux-x64-gnu": { + "version": "4.13.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.13.0.tgz", + "integrity": "sha512-yUD/8wMffnTKuiIsl6xU+4IA8UNhQ/f1sAnQebmE/lyQ8abjsVyDkyRkWop0kdMhKMprpNIhPmYlCxgHrPoXoA==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ] + }, + "examples/redux/node_modules/@rollup/rollup-linux-x64-musl": { + "version": "4.13.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.13.0.tgz", + "integrity": "sha512-9RyNqoFNdF0vu/qqX63fKotBh43fJQeYC98hCaf89DYQpv+xu0D8QFSOS0biA7cGuqJFOc1bJ+m2rhhsKcw1hw==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ] + }, + "examples/redux/node_modules/@rollup/rollup-win32-arm64-msvc": { + "version": "4.13.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.13.0.tgz", + "integrity": "sha512-46ue8ymtm/5PUU6pCvjlic0z82qWkxv54GTJZgHrQUuZnVH+tvvSP0LsozIDsCBFO4VjJ13N68wqrKSeScUKdA==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ] + }, + "examples/redux/node_modules/@rollup/rollup-win32-ia32-msvc": { + "version": "4.13.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.13.0.tgz", + "integrity": "sha512-P5/MqLdLSlqxbeuJ3YDeX37srC8mCflSyTrUsgbU1c/U9j6l2g2GiIdYaGD9QjdMQPMSgYm7hgg0551wHyIluw==", + "cpu": [ + "ia32" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ] + }, + "examples/redux/node_modules/@rollup/rollup-win32-x64-msvc": { + "version": "4.13.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.13.0.tgz", + "integrity": "sha512-UKXUQNbO3DOhzLRwHSpa0HnhhCgNODvfoPWv2FCXme8N/ANFfhIPMGuOT+QuKd16+B5yxZ0HdpNlqPvTMS1qfw==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ] + }, + "examples/redux/node_modules/@types/node": { + "version": "20.11.29", + "resolved": "https://registry.npmjs.org/@types/node/-/node-20.11.29.tgz", + "integrity": "sha512-P99thMkD/1YkCvAtOd6/zGedKNA0p2fj4ZpjCzcNiSCBWgm3cNRTBfa/qjFnsKkkojxu4vVLtWpesnZ9+ap+gA==", + "dev": true, + "optional": true, + "peer": true, "dependencies": { - "@babel/types": "^7.22.5" - }, - "engines": { - "node": ">=6.9.0" + "undici-types": "~5.26.4" } }, - "node_modules/@babel/helper-member-expression-to-functions": { - "version": "7.22.5", + "examples/redux/node_modules/commander": { + "version": "2.20.3", + "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz", + "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==", "dev": true, - "license": "MIT", - "dependencies": { - "@babel/types": "^7.22.5" + "optional": true, + "peer": true + }, + "examples/redux/node_modules/esbuild": { + "version": "0.19.12", + "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.19.12.tgz", + "integrity": "sha512-aARqgq8roFBj054KvQr5f1sFu0D65G+miZRCuJyJ0G13Zwx7vRar5Zhn2tkQNzIXcBrNVsv/8stehpj+GAjgbg==", + "dev": true, + "hasInstallScript": true, + "bin": { + "esbuild": "bin/esbuild" }, "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-module-imports": { - "version": "7.22.15", - "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.22.15.tgz", - "integrity": "sha512-0pYVBnDKZO2fnSPCrgM/6WMc7eS20Fbok+0r88fp+YtWVLZrp4CkafFGIp+W0VKw4a22sgebPT99y+FDNMdP4w==", + "node": ">=12" + }, + "optionalDependencies": { + "@esbuild/aix-ppc64": "0.19.12", + "@esbuild/android-arm": "0.19.12", + "@esbuild/android-arm64": "0.19.12", + "@esbuild/android-x64": "0.19.12", + "@esbuild/darwin-arm64": "0.19.12", + "@esbuild/darwin-x64": "0.19.12", + "@esbuild/freebsd-arm64": "0.19.12", + "@esbuild/freebsd-x64": "0.19.12", + "@esbuild/linux-arm": "0.19.12", + "@esbuild/linux-arm64": "0.19.12", + "@esbuild/linux-ia32": "0.19.12", + "@esbuild/linux-loong64": "0.19.12", + "@esbuild/linux-mips64el": "0.19.12", + "@esbuild/linux-ppc64": "0.19.12", + "@esbuild/linux-riscv64": "0.19.12", + "@esbuild/linux-s390x": "0.19.12", + "@esbuild/linux-x64": "0.19.12", + "@esbuild/netbsd-x64": "0.19.12", + "@esbuild/openbsd-x64": "0.19.12", + "@esbuild/sunos-x64": "0.19.12", + "@esbuild/win32-arm64": "0.19.12", + "@esbuild/win32-ia32": "0.19.12", + "@esbuild/win32-x64": "0.19.12" + } + }, + "examples/redux/node_modules/postcss": { + "version": "8.4.36", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.36.tgz", + "integrity": "sha512-/n7eumA6ZjFHAsbX30yhHup/IMkOmlmvtEi7P+6RMYf+bGJSUHc3geH4a0NSZxAz/RJfiS9tooCTs9LAVYUZKw==", "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/postcss" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], "dependencies": { - "@babel/types": "^7.22.15" + "nanoid": "^3.3.7", + "picocolors": "^1.0.0", + "source-map-js": "^1.1.0" }, "engines": { - "node": ">=6.9.0" + "node": "^10 || ^12 || >=14" } }, - "node_modules/@babel/helper-module-transforms": { - "version": "7.22.9", + "examples/redux/node_modules/rollup": { + "version": "4.13.0", + "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.13.0.tgz", + "integrity": "sha512-3YegKemjoQnYKmsBlOHfMLVPPA5xLkQ8MHLLSw/fBrFaVkEayL51DilPpNNLq1exr98F2B1TzrV0FUlN3gWRPg==", "dev": true, - "license": "MIT", "dependencies": { - "@babel/helper-environment-visitor": "^7.22.5", - "@babel/helper-module-imports": "^7.22.5", - "@babel/helper-simple-access": "^7.22.5", - "@babel/helper-split-export-declaration": "^7.22.6", - "@babel/helper-validator-identifier": "^7.22.5" + "@types/estree": "1.0.5" + }, + "bin": { + "rollup": "dist/bin/rollup" }, "engines": { - "node": ">=6.9.0" + "node": ">=18.0.0", + "npm": ">=8.0.0" }, - "peerDependencies": { - "@babel/core": "^7.0.0" + "optionalDependencies": { + "@rollup/rollup-android-arm-eabi": "4.13.0", + "@rollup/rollup-android-arm64": "4.13.0", + "@rollup/rollup-darwin-arm64": "4.13.0", + "@rollup/rollup-darwin-x64": "4.13.0", + "@rollup/rollup-linux-arm-gnueabihf": "4.13.0", + "@rollup/rollup-linux-arm64-gnu": "4.13.0", + "@rollup/rollup-linux-arm64-musl": "4.13.0", + "@rollup/rollup-linux-riscv64-gnu": "4.13.0", + "@rollup/rollup-linux-x64-gnu": "4.13.0", + "@rollup/rollup-linux-x64-musl": "4.13.0", + "@rollup/rollup-win32-arm64-msvc": "4.13.0", + "@rollup/rollup-win32-ia32-msvc": "4.13.0", + "@rollup/rollup-win32-x64-msvc": "4.13.0", + "fsevents": "~2.3.2" } }, - "node_modules/@babel/helper-optimise-call-expression": { - "version": "7.22.5", + "examples/redux/node_modules/terser": { + "version": "5.29.2", + "resolved": "https://registry.npmjs.org/terser/-/terser-5.29.2.tgz", + "integrity": "sha512-ZiGkhUBIM+7LwkNjXYJq8svgkd+QK3UUr0wJqY4MieaezBSAIPgbSPZyIx0idM6XWK5CMzSWa8MJIzmRcB8Caw==", "dev": true, - "license": "MIT", + "optional": true, + "peer": true, "dependencies": { - "@babel/types": "^7.22.5" + "@jridgewell/source-map": "^0.3.3", + "acorn": "^8.8.2", + "commander": "^2.20.0", + "source-map-support": "~0.5.20" + }, + "bin": { + "terser": "bin/terser" }, "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-plugin-utils": { - "version": "7.22.5", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6.9.0" + "node": ">=10" } }, - "node_modules/@babel/helper-remap-async-to-generator": { - "version": "7.18.9", + "examples/redux/node_modules/vite": { + "version": "5.1.6", + "resolved": "https://registry.npmjs.org/vite/-/vite-5.1.6.tgz", + "integrity": "sha512-yYIAZs9nVfRJ/AiOLCA91zzhjsHUgMjB+EigzFb6W2XTLO8JixBCKCjvhKZaye+NKYHCrkv3Oh50dH9EdLU2RA==", "dev": true, - "license": "MIT", "dependencies": { - "@babel/helper-annotate-as-pure": "^7.18.6", - "@babel/helper-environment-visitor": "^7.18.9", - "@babel/helper-wrap-function": "^7.18.9", - "@babel/types": "^7.18.9" + "esbuild": "^0.19.3", + "postcss": "^8.4.35", + "rollup": "^4.2.0" + }, + "bin": { + "vite": "bin/vite.js" }, "engines": { - "node": ">=6.9.0" + "node": "^18.0.0 || >=20.0.0" + }, + "funding": { + "url": "https://github.com/vitejs/vite?sponsor=1" + }, + "optionalDependencies": { + "fsevents": "~2.3.3" }, "peerDependencies": { - "@babel/core": "^7.0.0" + "@types/node": "^18.0.0 || >=20.0.0", + "less": "*", + "lightningcss": "^1.21.0", + "sass": "*", + "stylus": "*", + "sugarss": "*", + "terser": "^5.4.0" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + }, + "less": { + "optional": true + }, + "lightningcss": { + "optional": true + }, + "sass": { + "optional": true + }, + "stylus": { + "optional": true + }, + "sugarss": { + "optional": true + }, + "terser": { + "optional": true + } } }, - "node_modules/@babel/helper-replace-supers": { - "version": "7.22.9", + "node_modules/@11ty/dependency-tree": { + "version": "2.0.1", + "dev": true, + "license": "MIT" + }, + "node_modules/@11ty/eleventy": { + "version": "1.0.2", "dev": true, "license": "MIT", "dependencies": { - "@babel/helper-environment-visitor": "^7.22.5", - "@babel/helper-member-expression-to-functions": "^7.22.5", - "@babel/helper-optimise-call-expression": "^7.22.5" + "@11ty/dependency-tree": "^2.0.1", + "@11ty/eleventy-utils": "^1.0.1", + "@iarna/toml": "^2.2.5", + "@sindresorhus/slugify": "^1.1.2", + "browser-sync": "^2.27.10", + "chokidar": "^3.5.3", + "cross-spawn": "^7.0.3", + "debug": "^4.3.4", + "dependency-graph": "^0.11.0", + "ejs": "^3.1.8", + "fast-glob": "^3.2.11", + "graceful-fs": "^4.2.10", + "gray-matter": "^4.0.3", + "hamljs": "^0.6.2", + "handlebars": "^4.7.7", + "is-glob": "^4.0.3", + "kleur": "^4.1.5", + "liquidjs": "^9.40.0", + "lodash": "^4.17.21", + "luxon": "^2.5.0", + "markdown-it": "^12.3.2", + "minimist": "^1.2.6", + "moo": "^0.5.1", + "multimatch": "^5.0.0", + "mustache": "^4.2.0", + "normalize-path": "^3.0.0", + "nunjucks": "^3.2.3", + "path-to-regexp": "^6.2.1", + "please-upgrade-node": "^3.2.0", + "pretty": "^2.0.0", + "pug": "^3.0.2", + "recursive-copy": "^2.0.14", + "semver": "^7.3.7", + "slugify": "^1.6.5" + }, + "bin": { + "eleventy": "cmd.js" }, "engines": { - "node": ">=6.9.0" + "node": ">=12" }, - "peerDependencies": { - "@babel/core": "^7.0.0" + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/11ty" } }, - "node_modules/@babel/helper-simple-access": { - "version": "7.22.5", + "node_modules/@11ty/eleventy-plugin-syntaxhighlight": { + "version": "4.2.0", "dev": true, "license": "MIT", "dependencies": { - "@babel/types": "^7.22.5" + "linkedom": "^0.14.19", + "prismjs": "^1.29.0" }, - "engines": { - "node": ">=6.9.0" + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/11ty" } }, - "node_modules/@babel/helper-skip-transparent-expression-wrappers": { - "version": "7.22.5", + "node_modules/@11ty/eleventy-utils": { + "version": "1.0.1", "dev": true, "license": "MIT", "dependencies": { - "@babel/types": "^7.22.5" + "normalize-path": "^3.0.0" }, "engines": { - "node": ">=6.9.0" + "node": ">=12" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/11ty" } }, - "node_modules/@babel/helper-split-export-declaration": { - "version": "7.22.6", - "license": "MIT", + "node_modules/@11ty/eleventy/node_modules/lru-cache": { + "version": "6.0.0", + "dev": true, + "license": "ISC", "dependencies": { - "@babel/types": "^7.22.5" + "yallist": "^4.0.0" }, "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-string-parser": { - "version": "7.23.4", - "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.23.4.tgz", - "integrity": "sha512-803gmbQdqwdf4olxrX4AJyFBV/RTr3rSmOj0rKwesmzlfhYNDEs+/iOcznzpNWlJlIlTJC2QfPFcHB6DlzdVLQ==", - "engines": { - "node": ">=6.9.0" + "node": ">=10" } }, - "node_modules/@babel/helper-validator-identifier": { - "version": "7.22.20", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.22.20.tgz", - "integrity": "sha512-Y4OZ+ytlatR8AI+8KZfKuL5urKp7qey08ha31L8b3BwewJAoJamTzyvxPR/5D+KkdJCGPq/+8TukHBlY10FX9A==", + "node_modules/@11ty/eleventy/node_modules/semver": { + "version": "7.5.4", + "dev": true, + "license": "ISC", + "dependencies": { + "lru-cache": "^6.0.0" + }, + "bin": { + "semver": "bin/semver.js" + }, "engines": { - "node": ">=6.9.0" + "node": ">=10" } }, - "node_modules/@babel/helper-validator-option": { - "version": "7.22.5", + "node_modules/@11ty/eleventy/node_modules/yallist": { + "version": "4.0.0", "dev": true, + "license": "ISC" + }, + "node_modules/@aashutoshrathi/word-wrap": { + "version": "1.2.6", "license": "MIT", "engines": { - "node": ">=6.9.0" + "node": ">=0.10.0" } }, - "node_modules/@babel/helper-wrap-function": { - "version": "7.20.5", + "node_modules/@ampproject/remapping": { + "version": "2.2.0", "dev": true, - "license": "MIT", + "license": "Apache-2.0", "dependencies": { - "@babel/helper-function-name": "^7.19.0", - "@babel/template": "^7.18.10", - "@babel/traverse": "^7.20.5", - "@babel/types": "^7.20.5" + "@jridgewell/gen-mapping": "^0.1.0", + "@jridgewell/trace-mapping": "^0.3.9" }, "engines": { - "node": ">=6.9.0" + "node": ">=6.0.0" } }, - "node_modules/@babel/helpers": { - "version": "7.22.11", + "node_modules/@babel/cli": { + "version": "7.22.10", "dev": true, "license": "MIT", "dependencies": { - "@babel/template": "^7.22.5", - "@babel/traverse": "^7.22.11", - "@babel/types": "^7.22.11" + "@jridgewell/trace-mapping": "^0.3.17", + "commander": "^4.0.1", + "convert-source-map": "^1.1.0", + "fs-readdir-recursive": "^1.1.0", + "glob": "^7.2.0", + "make-dir": "^2.1.0", + "slash": "^2.0.0" }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/highlight": { - "version": "7.22.20", - "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.22.20.tgz", - "integrity": "sha512-dkdMCN3py0+ksCgYmGG8jKeGA/8Tk+gJwSYYlFGxG5lmhfKNoAy004YpLxpS1W2J8m/EK2Ew+yOs9pVRwO89mg==", - "dependencies": { - "@babel/helper-validator-identifier": "^7.22.20", - "chalk": "^2.4.2", - "js-tokens": "^4.0.0" + "bin": { + "babel": "bin/babel.js", + "babel-external-helpers": "bin/babel-external-helpers.js" }, "engines": { "node": ">=6.9.0" - } - }, - "node_modules/@babel/parser": { - "version": "7.23.0", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.23.0.tgz", - "integrity": "sha512-vvPKKdMemU85V9WE/l5wZEmImpCtLqbnTvqDS2U1fJ96KrxoW7KrXhNsNCblQlg8Ck4b85yxdTyelsMUgFUXiw==", - "bin": { - "parser": "bin/babel-parser.js" }, - "engines": { - "node": ">=6.0.0" + "optionalDependencies": { + "@nicolo-ribaudo/chokidar-2": "2.1.8-no-fsevents.3", + "chokidar": "^3.4.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": { - "version": "7.18.6", + "node_modules/@babel/cli/node_modules/@jridgewell/trace-mapping": { + "version": "0.3.22", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.22.tgz", + "integrity": "sha512-Wf963MzWtA2sjrNt+g18IAln9lKnlRp+K2eH4jjIoF1wYeq3aMREpG09xhlhdzS0EjwU7qmUJYangWa+151vZw==", "dev": true, - "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.18.6" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0" + "@jridgewell/resolve-uri": "^3.1.0", + "@jridgewell/sourcemap-codec": "^1.4.14" } }, - "node_modules/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": { - "version": "7.20.7", + "node_modules/@babel/cli/node_modules/make-dir": { + "version": "2.1.0", "dev": true, "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.20.2", - "@babel/helper-skip-transparent-expression-wrappers": "^7.20.0", - "@babel/plugin-proposal-optional-chaining": "^7.20.7" + "pify": "^4.0.1", + "semver": "^5.6.0" }, "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.13.0" + "node": ">=6" } }, - "node_modules/@babel/plugin-proposal-async-generator-functions": { - "version": "7.20.7", + "node_modules/@babel/cli/node_modules/semver": { + "version": "5.7.2", + "dev": true, + "license": "ISC", + "bin": { + "semver": "bin/semver" + } + }, + "node_modules/@babel/cli/node_modules/slash": { + "version": "2.0.0", "dev": true, "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/@babel/code-frame": { + "version": "7.22.13", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.22.13.tgz", + "integrity": "sha512-XktuhWlJ5g+3TJXc5upd9Ks1HutSArik6jf2eAjYFyIOf4ej3RN+184cZbzDvbPnuTJIUhPKKJE3cIsYTiAT3w==", "dependencies": { - "@babel/helper-environment-visitor": "^7.18.9", - "@babel/helper-plugin-utils": "^7.20.2", - "@babel/helper-remap-async-to-generator": "^7.18.9", - "@babel/plugin-syntax-async-generators": "^7.8.4" + "@babel/highlight": "^7.22.13", + "chalk": "^2.4.2" }, "engines": { "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/plugin-proposal-class-properties": { - "version": "7.18.6", + "node_modules/@babel/compat-data": { + "version": "7.22.9", "dev": true, "license": "MIT", - "dependencies": { - "@babel/helper-create-class-features-plugin": "^7.18.6", - "@babel/helper-plugin-utils": "^7.18.6" - }, "engines": { "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/plugin-proposal-class-static-block": { - "version": "7.20.7", + "node_modules/@babel/core": { + "version": "7.22.11", "dev": true, "license": "MIT", "dependencies": { - "@babel/helper-create-class-features-plugin": "^7.20.7", - "@babel/helper-plugin-utils": "^7.20.2", - "@babel/plugin-syntax-class-static-block": "^7.14.5" + "@ampproject/remapping": "^2.2.0", + "@babel/code-frame": "^7.22.10", + "@babel/generator": "^7.22.10", + "@babel/helper-compilation-targets": "^7.22.10", + "@babel/helper-module-transforms": "^7.22.9", + "@babel/helpers": "^7.22.11", + "@babel/parser": "^7.22.11", + "@babel/template": "^7.22.5", + "@babel/traverse": "^7.22.11", + "@babel/types": "^7.22.11", + "convert-source-map": "^1.7.0", + "debug": "^4.1.0", + "gensync": "^1.0.0-beta.2", + "json5": "^2.2.3", + "semver": "^6.3.1" }, "engines": { "node": ">=6.9.0" }, - "peerDependencies": { - "@babel/core": "^7.12.0" + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/babel" } }, - "node_modules/@babel/plugin-proposal-decorators": { - "version": "7.22.10", + "node_modules/@babel/eslint-parser": { + "version": "7.19.1", "dev": true, "license": "MIT", "dependencies": { - "@babel/helper-create-class-features-plugin": "^7.22.10", - "@babel/helper-plugin-utils": "^7.22.5", - "@babel/helper-replace-supers": "^7.22.9", - "@babel/helper-split-export-declaration": "^7.22.6", - "@babel/plugin-syntax-decorators": "^7.22.10" + "@nicolo-ribaudo/eslint-scope-5-internals": "5.1.1-v1", + "eslint-visitor-keys": "^2.1.0", + "semver": "^6.3.0" }, "engines": { - "node": ">=6.9.0" + "node": "^10.13.0 || ^12.13.0 || >=14.0.0" }, "peerDependencies": { - "@babel/core": "^7.0.0-0" + "@babel/core": ">=7.11.0", + "eslint": "^7.5.0 || ^8.0.0" } }, - "node_modules/@babel/plugin-proposal-dynamic-import": { - "version": "7.18.6", - "dev": true, - "license": "MIT", + "node_modules/@babel/generator": { + "version": "7.23.0", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.23.0.tgz", + "integrity": "sha512-lN85QRR+5IbYrMWM6Y4pE/noaQtg4pNiqeNGX60eqOfo6gtEj6uw/JagelB8vVztSd7R6M5n1+PQkDbHbBRU4g==", "dependencies": { - "@babel/helper-plugin-utils": "^7.18.6", - "@babel/plugin-syntax-dynamic-import": "^7.8.3" + "@babel/types": "^7.23.0", + "@jridgewell/gen-mapping": "^0.3.2", + "@jridgewell/trace-mapping": "^0.3.17", + "jsesc": "^2.5.1" }, "engines": { "node": ">=6.9.0" + } + }, + "node_modules/@babel/generator/node_modules/@jridgewell/gen-mapping": { + "version": "0.3.3", + "license": "MIT", + "dependencies": { + "@jridgewell/set-array": "^1.0.1", + "@jridgewell/sourcemap-codec": "^1.4.10", + "@jridgewell/trace-mapping": "^0.3.9" }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" + "engines": { + "node": ">=6.0.0" } }, - "node_modules/@babel/plugin-proposal-export-namespace-from": { - "version": "7.18.9", + "node_modules/@babel/generator/node_modules/@jridgewell/trace-mapping": { + "version": "0.3.22", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.22.tgz", + "integrity": "sha512-Wf963MzWtA2sjrNt+g18IAln9lKnlRp+K2eH4jjIoF1wYeq3aMREpG09xhlhdzS0EjwU7qmUJYangWa+151vZw==", + "dependencies": { + "@jridgewell/resolve-uri": "^3.1.0", + "@jridgewell/sourcemap-codec": "^1.4.14" + } + }, + "node_modules/@babel/helper-annotate-as-pure": { + "version": "7.22.5", "dev": true, "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.18.9", - "@babel/plugin-syntax-export-namespace-from": "^7.8.3" + "@babel/types": "^7.22.5" }, "engines": { "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/plugin-proposal-json-strings": { - "version": "7.18.6", + "node_modules/@babel/helper-builder-binary-assignment-operator-visitor": { + "version": "7.18.9", "dev": true, "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.18.6", - "@babel/plugin-syntax-json-strings": "^7.8.3" + "@babel/helper-explode-assignable-expression": "^7.18.6", + "@babel/types": "^7.18.9" }, "engines": { "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/plugin-proposal-logical-assignment-operators": { - "version": "7.20.7", + "node_modules/@babel/helper-compilation-targets": { + "version": "7.22.10", "dev": true, "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.20.2", - "@babel/plugin-syntax-logical-assignment-operators": "^7.10.4" + "@babel/compat-data": "^7.22.9", + "@babel/helper-validator-option": "^7.22.5", + "browserslist": "^4.21.9", + "lru-cache": "^5.1.1", + "semver": "^6.3.1" }, "engines": { "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/plugin-proposal-nullish-coalescing-operator": { - "version": "7.18.6", + "node_modules/@babel/helper-create-class-features-plugin": { + "version": "7.22.11", "dev": true, "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.18.6", - "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.3" + "@babel/helper-annotate-as-pure": "^7.22.5", + "@babel/helper-environment-visitor": "^7.22.5", + "@babel/helper-function-name": "^7.22.5", + "@babel/helper-member-expression-to-functions": "^7.22.5", + "@babel/helper-optimise-call-expression": "^7.22.5", + "@babel/helper-replace-supers": "^7.22.9", + "@babel/helper-skip-transparent-expression-wrappers": "^7.22.5", + "@babel/helper-split-export-declaration": "^7.22.6", + "semver": "^6.3.1" }, "engines": { "node": ">=6.9.0" }, "peerDependencies": { - "@babel/core": "^7.0.0-0" + "@babel/core": "^7.0.0" } }, - "node_modules/@babel/plugin-proposal-numeric-separator": { - "version": "7.18.6", + "node_modules/@babel/helper-create-regexp-features-plugin": { + "version": "7.20.5", "dev": true, "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.18.6", - "@babel/plugin-syntax-numeric-separator": "^7.10.4" + "@babel/helper-annotate-as-pure": "^7.18.6", + "regexpu-core": "^5.2.1" }, "engines": { "node": ">=6.9.0" }, "peerDependencies": { - "@babel/core": "^7.0.0-0" + "@babel/core": "^7.0.0" } }, - "node_modules/@babel/plugin-proposal-object-rest-spread": { - "version": "7.20.7", + "node_modules/@babel/helper-define-polyfill-provider": { + "version": "0.3.3", "dev": true, "license": "MIT", "dependencies": { - "@babel/compat-data": "^7.20.5", - "@babel/helper-compilation-targets": "^7.20.7", - "@babel/helper-plugin-utils": "^7.20.2", - "@babel/plugin-syntax-object-rest-spread": "^7.8.3", - "@babel/plugin-transform-parameters": "^7.20.7" + "@babel/helper-compilation-targets": "^7.17.7", + "@babel/helper-plugin-utils": "^7.16.7", + "debug": "^4.1.1", + "lodash.debounce": "^4.0.8", + "resolve": "^1.14.2", + "semver": "^6.1.2" }, + "peerDependencies": { + "@babel/core": "^7.4.0-0" + } + }, + "node_modules/@babel/helper-environment-visitor": { + "version": "7.22.20", + "resolved": "https://registry.npmjs.org/@babel/helper-environment-visitor/-/helper-environment-visitor-7.22.20.tgz", + "integrity": "sha512-zfedSIzFhat/gFhWfHtgWvlec0nqB9YEIVrpuwjruLlXfUSnA8cJB0miHKwqDnQ7d32aKo2xt88/xZptwxbfhA==", "engines": { "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/plugin-proposal-optional-catch-binding": { + "node_modules/@babel/helper-explode-assignable-expression": { "version": "7.18.6", "dev": true, "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.18.6", - "@babel/plugin-syntax-optional-catch-binding": "^7.8.3" + "@babel/types": "^7.18.6" }, "engines": { "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/plugin-proposal-optional-chaining": { - "version": "7.20.7", - "dev": true, - "license": "MIT", + "node_modules/@babel/helper-function-name": { + "version": "7.23.0", + "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.23.0.tgz", + "integrity": "sha512-OErEqsrxjZTJciZ4Oo+eoZqeW9UIiOcuYKRJA4ZAgV9myA+pOXhhmpfNCKjEH/auVfEYVFJ6y1Tc4r0eIApqiw==", "dependencies": { - "@babel/helper-plugin-utils": "^7.20.2", - "@babel/helper-skip-transparent-expression-wrappers": "^7.20.0", - "@babel/plugin-syntax-optional-chaining": "^7.8.3" + "@babel/template": "^7.22.15", + "@babel/types": "^7.23.0" }, "engines": { "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/plugin-proposal-private-methods": { - "version": "7.18.6", - "dev": true, + "node_modules/@babel/helper-hoist-variables": { + "version": "7.22.5", "license": "MIT", "dependencies": { - "@babel/helper-create-class-features-plugin": "^7.18.6", - "@babel/helper-plugin-utils": "^7.18.6" + "@babel/types": "^7.22.5" }, "engines": { "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/plugin-proposal-private-property-in-object": { - "version": "7.20.5", + "node_modules/@babel/helper-member-expression-to-functions": { + "version": "7.22.5", "dev": true, "license": "MIT", "dependencies": { - "@babel/helper-annotate-as-pure": "^7.18.6", - "@babel/helper-create-class-features-plugin": "^7.20.5", - "@babel/helper-plugin-utils": "^7.20.2", - "@babel/plugin-syntax-private-property-in-object": "^7.14.5" + "@babel/types": "^7.22.5" }, "engines": { "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/plugin-proposal-unicode-property-regex": { - "version": "7.18.6", + "node_modules/@babel/helper-module-imports": { + "version": "7.22.15", + "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.22.15.tgz", + "integrity": "sha512-0pYVBnDKZO2fnSPCrgM/6WMc7eS20Fbok+0r88fp+YtWVLZrp4CkafFGIp+W0VKw4a22sgebPT99y+FDNMdP4w==", "dev": true, - "license": "MIT", "dependencies": { - "@babel/helper-create-regexp-features-plugin": "^7.18.6", - "@babel/helper-plugin-utils": "^7.18.6" + "@babel/types": "^7.22.15" }, "engines": { - "node": ">=4" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" + "node": ">=6.9.0" } }, - "node_modules/@babel/plugin-syntax-async-generators": { - "version": "7.8.4", + "node_modules/@babel/helper-module-transforms": { + "version": "7.22.9", "dev": true, "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.8.0" + "@babel/helper-environment-visitor": "^7.22.5", + "@babel/helper-module-imports": "^7.22.5", + "@babel/helper-simple-access": "^7.22.5", + "@babel/helper-split-export-declaration": "^7.22.6", + "@babel/helper-validator-identifier": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" }, "peerDependencies": { - "@babel/core": "^7.0.0-0" + "@babel/core": "^7.0.0" } }, - "node_modules/@babel/plugin-syntax-class-properties": { - "version": "7.12.13", + "node_modules/@babel/helper-optimise-call-expression": { + "version": "7.22.5", "dev": true, "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.12.13" + "@babel/types": "^7.22.5" }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" + "engines": { + "node": ">=6.9.0" } }, - "node_modules/@babel/plugin-syntax-class-static-block": { - "version": "7.14.5", + "node_modules/@babel/helper-plugin-utils": { + "version": "7.22.5", "dev": true, "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.14.5" - }, "engines": { "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/plugin-syntax-decorators": { - "version": "7.22.10", + "node_modules/@babel/helper-remap-async-to-generator": { + "version": "7.18.9", "dev": true, "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5" + "@babel/helper-annotate-as-pure": "^7.18.6", + "@babel/helper-environment-visitor": "^7.18.9", + "@babel/helper-wrap-function": "^7.18.9", + "@babel/types": "^7.18.9" }, "engines": { "node": ">=6.9.0" }, "peerDependencies": { - "@babel/core": "^7.0.0-0" + "@babel/core": "^7.0.0" } }, - "node_modules/@babel/plugin-syntax-dynamic-import": { - "version": "7.8.3", + "node_modules/@babel/helper-replace-supers": { + "version": "7.22.9", "dev": true, "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.8.0" + "@babel/helper-environment-visitor": "^7.22.5", + "@babel/helper-member-expression-to-functions": "^7.22.5", + "@babel/helper-optimise-call-expression": "^7.22.5" }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-export-namespace-from": { - "version": "7.8.3", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.8.3" + "engines": { + "node": ">=6.9.0" }, "peerDependencies": { - "@babel/core": "^7.0.0-0" + "@babel/core": "^7.0.0" } }, - "node_modules/@babel/plugin-syntax-import-assertions": { - "version": "7.20.0", + "node_modules/@babel/helper-simple-access": { + "version": "7.22.5", "dev": true, "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.19.0" + "@babel/types": "^7.22.5" }, "engines": { "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/plugin-syntax-import-meta": { - "version": "7.10.4", + "node_modules/@babel/helper-skip-transparent-expression-wrappers": { + "version": "7.22.5", "dev": true, "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.10.4" + "@babel/types": "^7.22.5" }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" + "engines": { + "node": ">=6.9.0" } }, - "node_modules/@babel/plugin-syntax-json-strings": { - "version": "7.8.3", - "dev": true, + "node_modules/@babel/helper-split-export-declaration": { + "version": "7.22.6", "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.8.0" + "@babel/types": "^7.22.5" }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" + "engines": { + "node": ">=6.9.0" } }, - "node_modules/@babel/plugin-syntax-jsx": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.23.3.tgz", - "integrity": "sha512-EB2MELswq55OHUoRZLGg/zC7QWUKfNLpE57m/S2yr1uEneIgsTgrSzXP3NXEsMkVn76OlaVVnzN+ugObuYGwhg==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5" - }, + "node_modules/@babel/helper-string-parser": { + "version": "7.23.4", + "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.23.4.tgz", + "integrity": "sha512-803gmbQdqwdf4olxrX4AJyFBV/RTr3rSmOj0rKwesmzlfhYNDEs+/iOcznzpNWlJlIlTJC2QfPFcHB6DlzdVLQ==", "engines": { "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/plugin-syntax-logical-assignment-operators": { - "version": "7.10.4", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.10.4" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" + "node_modules/@babel/helper-validator-identifier": { + "version": "7.22.20", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.22.20.tgz", + "integrity": "sha512-Y4OZ+ytlatR8AI+8KZfKuL5urKp7qey08ha31L8b3BwewJAoJamTzyvxPR/5D+KkdJCGPq/+8TukHBlY10FX9A==", + "engines": { + "node": ">=6.9.0" } }, - "node_modules/@babel/plugin-syntax-nullish-coalescing-operator": { - "version": "7.8.3", + "node_modules/@babel/helper-validator-option": { + "version": "7.22.5", "dev": true, "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.8.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" + "engines": { + "node": ">=6.9.0" } }, - "node_modules/@babel/plugin-syntax-numeric-separator": { - "version": "7.10.4", + "node_modules/@babel/helper-wrap-function": { + "version": "7.20.5", "dev": true, "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.10.4" + "@babel/helper-function-name": "^7.19.0", + "@babel/template": "^7.18.10", + "@babel/traverse": "^7.20.5", + "@babel/types": "^7.20.5" }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" + "engines": { + "node": ">=6.9.0" } }, - "node_modules/@babel/plugin-syntax-object-rest-spread": { - "version": "7.8.3", + "node_modules/@babel/helpers": { + "version": "7.22.11", "dev": true, "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.8.0" + "@babel/template": "^7.22.5", + "@babel/traverse": "^7.22.11", + "@babel/types": "^7.22.11" }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" + "engines": { + "node": ">=6.9.0" } }, - "node_modules/@babel/plugin-syntax-optional-catch-binding": { - "version": "7.8.3", - "dev": true, - "license": "MIT", + "node_modules/@babel/highlight": { + "version": "7.22.20", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.22.20.tgz", + "integrity": "sha512-dkdMCN3py0+ksCgYmGG8jKeGA/8Tk+gJwSYYlFGxG5lmhfKNoAy004YpLxpS1W2J8m/EK2Ew+yOs9pVRwO89mg==", "dependencies": { - "@babel/helper-plugin-utils": "^7.8.0" + "@babel/helper-validator-identifier": "^7.22.20", + "chalk": "^2.4.2", + "js-tokens": "^4.0.0" }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" + "engines": { + "node": ">=6.9.0" } }, - "node_modules/@babel/plugin-syntax-optional-chaining": { - "version": "7.8.3", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.8.0" + "node_modules/@babel/parser": { + "version": "7.23.0", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.23.0.tgz", + "integrity": "sha512-vvPKKdMemU85V9WE/l5wZEmImpCtLqbnTvqDS2U1fJ96KrxoW7KrXhNsNCblQlg8Ck4b85yxdTyelsMUgFUXiw==", + "bin": { + "parser": "bin/babel-parser.js" }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" + "engines": { + "node": ">=6.0.0" } }, - "node_modules/@babel/plugin-syntax-private-property-in-object": { - "version": "7.14.5", + "node_modules/@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": { + "version": "7.18.6", "dev": true, "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.14.5" + "@babel/helper-plugin-utils": "^7.18.6" }, "engines": { "node": ">=6.9.0" }, "peerDependencies": { - "@babel/core": "^7.0.0-0" + "@babel/core": "^7.0.0" } }, - "node_modules/@babel/plugin-syntax-top-level-await": { - "version": "7.14.5", + "node_modules/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": { + "version": "7.20.7", "dev": true, "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.14.5" + "@babel/helper-plugin-utils": "^7.20.2", + "@babel/helper-skip-transparent-expression-wrappers": "^7.20.0", + "@babel/plugin-proposal-optional-chaining": "^7.20.7" }, "engines": { "node": ">=6.9.0" }, "peerDependencies": { - "@babel/core": "^7.0.0-0" + "@babel/core": "^7.13.0" } }, - "node_modules/@babel/plugin-syntax-typescript": { - "version": "7.22.5", + "node_modules/@babel/plugin-proposal-async-generator-functions": { + "version": "7.20.7", "dev": true, "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5" + "@babel/helper-environment-visitor": "^7.18.9", + "@babel/helper-plugin-utils": "^7.20.2", + "@babel/helper-remap-async-to-generator": "^7.18.9", + "@babel/plugin-syntax-async-generators": "^7.8.4" }, "engines": { "node": ">=6.9.0" @@ -1923,12 +2182,13 @@ "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/plugin-transform-arrow-functions": { - "version": "7.20.7", + "node_modules/@babel/plugin-proposal-class-properties": { + "version": "7.18.6", "dev": true, "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.20.2" + "@babel/helper-create-class-features-plugin": "^7.18.6", + "@babel/helper-plugin-utils": "^7.18.6" }, "engines": { "node": ">=6.9.0" @@ -1937,28 +2197,32 @@ "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/plugin-transform-async-to-generator": { + "node_modules/@babel/plugin-proposal-class-static-block": { "version": "7.20.7", "dev": true, "license": "MIT", "dependencies": { - "@babel/helper-module-imports": "^7.18.6", + "@babel/helper-create-class-features-plugin": "^7.20.7", "@babel/helper-plugin-utils": "^7.20.2", - "@babel/helper-remap-async-to-generator": "^7.18.9" + "@babel/plugin-syntax-class-static-block": "^7.14.5" }, "engines": { "node": ">=6.9.0" }, "peerDependencies": { - "@babel/core": "^7.0.0-0" + "@babel/core": "^7.12.0" } }, - "node_modules/@babel/plugin-transform-block-scoped-functions": { - "version": "7.18.6", - "dev": true, + "node_modules/@babel/plugin-proposal-decorators": { + "version": "7.22.10", + "dev": true, "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.18.6" + "@babel/helper-create-class-features-plugin": "^7.22.10", + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/helper-replace-supers": "^7.22.9", + "@babel/helper-split-export-declaration": "^7.22.6", + "@babel/plugin-syntax-decorators": "^7.22.10" }, "engines": { "node": ">=6.9.0" @@ -1967,12 +2231,13 @@ "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/plugin-transform-block-scoping": { - "version": "7.20.14", + "node_modules/@babel/plugin-proposal-dynamic-import": { + "version": "7.18.6", "dev": true, "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.20.2" + "@babel/helper-plugin-utils": "^7.18.6", + "@babel/plugin-syntax-dynamic-import": "^7.8.3" }, "engines": { "node": ">=6.9.0" @@ -1981,36 +2246,28 @@ "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/plugin-transform-class-static-block": { - "version": "7.22.11", + "node_modules/@babel/plugin-proposal-export-namespace-from": { + "version": "7.18.9", "dev": true, "license": "MIT", "dependencies": { - "@babel/helper-create-class-features-plugin": "^7.22.11", - "@babel/helper-plugin-utils": "^7.22.5", - "@babel/plugin-syntax-class-static-block": "^7.14.5" + "@babel/helper-plugin-utils": "^7.18.9", + "@babel/plugin-syntax-export-namespace-from": "^7.8.3" }, "engines": { "node": ">=6.9.0" }, "peerDependencies": { - "@babel/core": "^7.12.0" + "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/plugin-transform-classes": { - "version": "7.20.7", + "node_modules/@babel/plugin-proposal-json-strings": { + "version": "7.18.6", "dev": true, "license": "MIT", "dependencies": { - "@babel/helper-annotate-as-pure": "^7.18.6", - "@babel/helper-compilation-targets": "^7.20.7", - "@babel/helper-environment-visitor": "^7.18.9", - "@babel/helper-function-name": "^7.19.0", - "@babel/helper-optimise-call-expression": "^7.18.6", - "@babel/helper-plugin-utils": "^7.20.2", - "@babel/helper-replace-supers": "^7.20.7", - "@babel/helper-split-export-declaration": "^7.18.6", - "globals": "^11.1.0" + "@babel/helper-plugin-utils": "^7.18.6", + "@babel/plugin-syntax-json-strings": "^7.8.3" }, "engines": { "node": ">=6.9.0" @@ -2019,13 +2276,13 @@ "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/plugin-transform-computed-properties": { + "node_modules/@babel/plugin-proposal-logical-assignment-operators": { "version": "7.20.7", "dev": true, "license": "MIT", "dependencies": { "@babel/helper-plugin-utils": "^7.20.2", - "@babel/template": "^7.20.7" + "@babel/plugin-syntax-logical-assignment-operators": "^7.10.4" }, "engines": { "node": ">=6.9.0" @@ -2034,12 +2291,13 @@ "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/plugin-transform-destructuring": { - "version": "7.20.7", + "node_modules/@babel/plugin-proposal-nullish-coalescing-operator": { + "version": "7.18.6", "dev": true, "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.20.2" + "@babel/helper-plugin-utils": "^7.18.6", + "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.3" }, "engines": { "node": ">=6.9.0" @@ -2048,13 +2306,13 @@ "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/plugin-transform-dotall-regex": { + "node_modules/@babel/plugin-proposal-numeric-separator": { "version": "7.18.6", "dev": true, "license": "MIT", "dependencies": { - "@babel/helper-create-regexp-features-plugin": "^7.18.6", - "@babel/helper-plugin-utils": "^7.18.6" + "@babel/helper-plugin-utils": "^7.18.6", + "@babel/plugin-syntax-numeric-separator": "^7.10.4" }, "engines": { "node": ">=6.9.0" @@ -2063,12 +2321,16 @@ "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/plugin-transform-duplicate-keys": { - "version": "7.18.9", + "node_modules/@babel/plugin-proposal-object-rest-spread": { + "version": "7.20.7", "dev": true, "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.18.9" + "@babel/compat-data": "^7.20.5", + "@babel/helper-compilation-targets": "^7.20.7", + "@babel/helper-plugin-utils": "^7.20.2", + "@babel/plugin-syntax-object-rest-spread": "^7.8.3", + "@babel/plugin-transform-parameters": "^7.20.7" }, "engines": { "node": ">=6.9.0" @@ -2077,13 +2339,13 @@ "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/plugin-transform-exponentiation-operator": { + "node_modules/@babel/plugin-proposal-optional-catch-binding": { "version": "7.18.6", "dev": true, "license": "MIT", "dependencies": { - "@babel/helper-builder-binary-assignment-operator-visitor": "^7.18.6", - "@babel/helper-plugin-utils": "^7.18.6" + "@babel/helper-plugin-utils": "^7.18.6", + "@babel/plugin-syntax-optional-catch-binding": "^7.8.3" }, "engines": { "node": ">=6.9.0" @@ -2092,12 +2354,14 @@ "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/plugin-transform-for-of": { - "version": "7.18.8", + "node_modules/@babel/plugin-proposal-optional-chaining": { + "version": "7.20.7", "dev": true, "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.18.6" + "@babel/helper-plugin-utils": "^7.20.2", + "@babel/helper-skip-transparent-expression-wrappers": "^7.20.0", + "@babel/plugin-syntax-optional-chaining": "^7.8.3" }, "engines": { "node": ">=6.9.0" @@ -2106,14 +2370,13 @@ "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/plugin-transform-function-name": { - "version": "7.18.9", + "node_modules/@babel/plugin-proposal-private-methods": { + "version": "7.18.6", "dev": true, "license": "MIT", "dependencies": { - "@babel/helper-compilation-targets": "^7.18.9", - "@babel/helper-function-name": "^7.18.9", - "@babel/helper-plugin-utils": "^7.18.9" + "@babel/helper-create-class-features-plugin": "^7.18.6", + "@babel/helper-plugin-utils": "^7.18.6" }, "engines": { "node": ">=6.9.0" @@ -2122,12 +2385,15 @@ "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/plugin-transform-literals": { - "version": "7.18.9", + "node_modules/@babel/plugin-proposal-private-property-in-object": { + "version": "7.20.5", "dev": true, "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.18.9" + "@babel/helper-annotate-as-pure": "^7.18.6", + "@babel/helper-create-class-features-plugin": "^7.20.5", + "@babel/helper-plugin-utils": "^7.20.2", + "@babel/plugin-syntax-private-property-in-object": "^7.14.5" }, "engines": { "node": ">=6.9.0" @@ -2136,60 +2402,49 @@ "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/plugin-transform-member-expression-literals": { + "node_modules/@babel/plugin-proposal-unicode-property-regex": { "version": "7.18.6", "dev": true, "license": "MIT", "dependencies": { + "@babel/helper-create-regexp-features-plugin": "^7.18.6", "@babel/helper-plugin-utils": "^7.18.6" }, "engines": { - "node": ">=6.9.0" + "node": ">=4" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/plugin-transform-modules-amd": { - "version": "7.20.11", + "node_modules/@babel/plugin-syntax-async-generators": { + "version": "7.8.4", "dev": true, "license": "MIT", "dependencies": { - "@babel/helper-module-transforms": "^7.20.11", - "@babel/helper-plugin-utils": "^7.20.2" - }, - "engines": { - "node": ">=6.9.0" + "@babel/helper-plugin-utils": "^7.8.0" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/plugin-transform-modules-commonjs": { - "version": "7.20.11", + "node_modules/@babel/plugin-syntax-class-properties": { + "version": "7.12.13", "dev": true, "license": "MIT", "dependencies": { - "@babel/helper-module-transforms": "^7.20.11", - "@babel/helper-plugin-utils": "^7.20.2", - "@babel/helper-simple-access": "^7.20.2" - }, - "engines": { - "node": ">=6.9.0" + "@babel/helper-plugin-utils": "^7.12.13" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/plugin-transform-modules-systemjs": { - "version": "7.20.11", + "node_modules/@babel/plugin-syntax-class-static-block": { + "version": "7.14.5", "dev": true, "license": "MIT", "dependencies": { - "@babel/helper-hoist-variables": "^7.18.6", - "@babel/helper-module-transforms": "^7.20.11", - "@babel/helper-plugin-utils": "^7.20.2", - "@babel/helper-validator-identifier": "^7.19.1" + "@babel/helper-plugin-utils": "^7.14.5" }, "engines": { "node": ">=6.9.0" @@ -2198,13 +2453,12 @@ "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/plugin-transform-modules-umd": { - "version": "7.18.6", + "node_modules/@babel/plugin-syntax-decorators": { + "version": "7.22.10", "dev": true, "license": "MIT", "dependencies": { - "@babel/helper-module-transforms": "^7.18.6", - "@babel/helper-plugin-utils": "^7.18.6" + "@babel/helper-plugin-utils": "^7.22.5" }, "engines": { "node": ">=6.9.0" @@ -2213,42 +2467,34 @@ "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/plugin-transform-named-capturing-groups-regex": { - "version": "7.20.5", + "node_modules/@babel/plugin-syntax-dynamic-import": { + "version": "7.8.3", "dev": true, "license": "MIT", "dependencies": { - "@babel/helper-create-regexp-features-plugin": "^7.20.5", - "@babel/helper-plugin-utils": "^7.20.2" - }, - "engines": { - "node": ">=6.9.0" + "@babel/helper-plugin-utils": "^7.8.0" }, "peerDependencies": { - "@babel/core": "^7.0.0" + "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/plugin-transform-new-target": { - "version": "7.18.6", + "node_modules/@babel/plugin-syntax-export-namespace-from": { + "version": "7.8.3", "dev": true, "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.18.6" - }, - "engines": { - "node": ">=6.9.0" + "@babel/helper-plugin-utils": "^7.8.3" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/plugin-transform-object-super": { - "version": "7.18.6", + "node_modules/@babel/plugin-syntax-import-assertions": { + "version": "7.20.0", "dev": true, "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.18.6", - "@babel/helper-replace-supers": "^7.18.6" + "@babel/helper-plugin-utils": "^7.19.0" }, "engines": { "node": ">=6.9.0" @@ -2257,45 +2503,35 @@ "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/plugin-transform-parameters": { - "version": "7.20.7", + "node_modules/@babel/plugin-syntax-import-meta": { + "version": "7.10.4", "dev": true, "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.20.2" - }, - "engines": { - "node": ">=6.9.0" + "@babel/helper-plugin-utils": "^7.10.4" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/plugin-transform-property-literals": { - "version": "7.18.6", + "node_modules/@babel/plugin-syntax-json-strings": { + "version": "7.8.3", "dev": true, "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.18.6" - }, - "engines": { - "node": ">=6.9.0" + "@babel/helper-plugin-utils": "^7.8.0" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/plugin-transform-react-jsx": { - "version": "7.23.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx/-/plugin-transform-react-jsx-7.23.4.tgz", - "integrity": "sha512-5xOpoPguCZCRbo/JeHlloSkTA8Bld1J/E1/kLfD1nsuiW1m8tduTA1ERCgIZokDflX/IBzKcqR3l7VlRgiIfHA==", + "node_modules/@babel/plugin-syntax-jsx": { + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.23.3.tgz", + "integrity": "sha512-EB2MELswq55OHUoRZLGg/zC7QWUKfNLpE57m/S2yr1uEneIgsTgrSzXP3NXEsMkVn76OlaVVnzN+ugObuYGwhg==", "dev": true, "dependencies": { - "@babel/helper-annotate-as-pure": "^7.22.5", - "@babel/helper-module-imports": "^7.22.15", - "@babel/helper-plugin-utils": "^7.22.5", - "@babel/plugin-syntax-jsx": "^7.23.3", - "@babel/types": "^7.23.4" + "@babel/helper-plugin-utils": "^7.22.5" }, "engines": { "node": ">=6.9.0" @@ -2304,85 +2540,78 @@ "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/plugin-transform-react-jsx-development": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-development/-/plugin-transform-react-jsx-development-7.22.5.tgz", - "integrity": "sha512-bDhuzwWMuInwCYeDeMzyi7TaBgRQei6DqxhbyniL7/VG4RSS7HtSL2QbY4eESy1KJqlWt8g3xeEBGPuo+XqC8A==", + "node_modules/@babel/plugin-syntax-logical-assignment-operators": { + "version": "7.10.4", "dev": true, + "license": "MIT", "dependencies": { - "@babel/plugin-transform-react-jsx": "^7.22.5" - }, - "engines": { - "node": ">=6.9.0" + "@babel/helper-plugin-utils": "^7.10.4" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/plugin-transform-regenerator": { - "version": "7.20.5", + "node_modules/@babel/plugin-syntax-nullish-coalescing-operator": { + "version": "7.8.3", "dev": true, "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.20.2", - "regenerator-transform": "^0.15.1" - }, - "engines": { - "node": ">=6.9.0" + "@babel/helper-plugin-utils": "^7.8.0" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/plugin-transform-reserved-words": { - "version": "7.18.6", + "node_modules/@babel/plugin-syntax-numeric-separator": { + "version": "7.10.4", "dev": true, "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.18.6" - }, - "engines": { - "node": ">=6.9.0" + "@babel/helper-plugin-utils": "^7.10.4" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/plugin-transform-shorthand-properties": { - "version": "7.18.6", + "node_modules/@babel/plugin-syntax-object-rest-spread": { + "version": "7.8.3", "dev": true, "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.18.6" - }, - "engines": { - "node": ">=6.9.0" + "@babel/helper-plugin-utils": "^7.8.0" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/plugin-transform-spread": { - "version": "7.20.7", + "node_modules/@babel/plugin-syntax-optional-catch-binding": { + "version": "7.8.3", "dev": true, "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.20.2", - "@babel/helper-skip-transparent-expression-wrappers": "^7.20.0" - }, - "engines": { - "node": ">=6.9.0" + "@babel/helper-plugin-utils": "^7.8.0" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/plugin-transform-sticky-regex": { - "version": "7.18.6", - "dev": true, + "node_modules/@babel/plugin-syntax-optional-chaining": { + "version": "7.8.3", + "dev": true, "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.18.6" + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-private-property-in-object": { + "version": "7.14.5", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.14.5" }, "engines": { "node": ">=6.9.0" @@ -2391,12 +2620,12 @@ "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/plugin-transform-template-literals": { - "version": "7.18.9", + "node_modules/@babel/plugin-syntax-top-level-await": { + "version": "7.14.5", "dev": true, "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.18.9" + "@babel/helper-plugin-utils": "^7.14.5" }, "engines": { "node": ">=6.9.0" @@ -2405,12 +2634,12 @@ "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/plugin-transform-typeof-symbol": { - "version": "7.18.9", + "node_modules/@babel/plugin-syntax-typescript": { + "version": "7.22.5", "dev": true, "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.18.9" + "@babel/helper-plugin-utils": "^7.22.5" }, "engines": { "node": ">=6.9.0" @@ -2419,15 +2648,12 @@ "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/plugin-transform-typescript": { - "version": "7.22.11", + "node_modules/@babel/plugin-transform-arrow-functions": { + "version": "7.20.7", "dev": true, "license": "MIT", "dependencies": { - "@babel/helper-annotate-as-pure": "^7.22.5", - "@babel/helper-create-class-features-plugin": "^7.22.11", - "@babel/helper-plugin-utils": "^7.22.5", - "@babel/plugin-syntax-typescript": "^7.22.5" + "@babel/helper-plugin-utils": "^7.20.2" }, "engines": { "node": ">=6.9.0" @@ -2436,12 +2662,14 @@ "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/plugin-transform-unicode-escapes": { - "version": "7.18.10", + "node_modules/@babel/plugin-transform-async-to-generator": { + "version": "7.20.7", "dev": true, "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.18.9" + "@babel/helper-module-imports": "^7.18.6", + "@babel/helper-plugin-utils": "^7.20.2", + "@babel/helper-remap-async-to-generator": "^7.18.9" }, "engines": { "node": ">=6.9.0" @@ -2450,12 +2678,11 @@ "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/plugin-transform-unicode-regex": { + "node_modules/@babel/plugin-transform-block-scoped-functions": { "version": "7.18.6", "dev": true, "license": "MIT", "dependencies": { - "@babel/helper-create-regexp-features-plugin": "^7.18.6", "@babel/helper-plugin-utils": "^7.18.6" }, "engines": { @@ -2465,86 +2692,12 @@ "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/preset-env": { - "version": "7.20.2", + "node_modules/@babel/plugin-transform-block-scoping": { + "version": "7.20.14", "dev": true, "license": "MIT", "dependencies": { - "@babel/compat-data": "^7.20.1", - "@babel/helper-compilation-targets": "^7.20.0", - "@babel/helper-plugin-utils": "^7.20.2", - "@babel/helper-validator-option": "^7.18.6", - "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": "^7.18.6", - "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": "^7.18.9", - "@babel/plugin-proposal-async-generator-functions": "^7.20.1", - "@babel/plugin-proposal-class-properties": "^7.18.6", - "@babel/plugin-proposal-class-static-block": "^7.18.6", - "@babel/plugin-proposal-dynamic-import": "^7.18.6", - "@babel/plugin-proposal-export-namespace-from": "^7.18.9", - "@babel/plugin-proposal-json-strings": "^7.18.6", - "@babel/plugin-proposal-logical-assignment-operators": "^7.18.9", - "@babel/plugin-proposal-nullish-coalescing-operator": "^7.18.6", - "@babel/plugin-proposal-numeric-separator": "^7.18.6", - "@babel/plugin-proposal-object-rest-spread": "^7.20.2", - "@babel/plugin-proposal-optional-catch-binding": "^7.18.6", - "@babel/plugin-proposal-optional-chaining": "^7.18.9", - "@babel/plugin-proposal-private-methods": "^7.18.6", - "@babel/plugin-proposal-private-property-in-object": "^7.18.6", - "@babel/plugin-proposal-unicode-property-regex": "^7.18.6", - "@babel/plugin-syntax-async-generators": "^7.8.4", - "@babel/plugin-syntax-class-properties": "^7.12.13", - "@babel/plugin-syntax-class-static-block": "^7.14.5", - "@babel/plugin-syntax-dynamic-import": "^7.8.3", - "@babel/plugin-syntax-export-namespace-from": "^7.8.3", - "@babel/plugin-syntax-import-assertions": "^7.20.0", - "@babel/plugin-syntax-json-strings": "^7.8.3", - "@babel/plugin-syntax-logical-assignment-operators": "^7.10.4", - "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.3", - "@babel/plugin-syntax-numeric-separator": "^7.10.4", - "@babel/plugin-syntax-object-rest-spread": "^7.8.3", - "@babel/plugin-syntax-optional-catch-binding": "^7.8.3", - "@babel/plugin-syntax-optional-chaining": "^7.8.3", - "@babel/plugin-syntax-private-property-in-object": "^7.14.5", - "@babel/plugin-syntax-top-level-await": "^7.14.5", - "@babel/plugin-transform-arrow-functions": "^7.18.6", - "@babel/plugin-transform-async-to-generator": "^7.18.6", - "@babel/plugin-transform-block-scoped-functions": "^7.18.6", - "@babel/plugin-transform-block-scoping": "^7.20.2", - "@babel/plugin-transform-classes": "^7.20.2", - "@babel/plugin-transform-computed-properties": "^7.18.9", - "@babel/plugin-transform-destructuring": "^7.20.2", - "@babel/plugin-transform-dotall-regex": "^7.18.6", - "@babel/plugin-transform-duplicate-keys": "^7.18.9", - "@babel/plugin-transform-exponentiation-operator": "^7.18.6", - "@babel/plugin-transform-for-of": "^7.18.8", - "@babel/plugin-transform-function-name": "^7.18.9", - "@babel/plugin-transform-literals": "^7.18.9", - "@babel/plugin-transform-member-expression-literals": "^7.18.6", - "@babel/plugin-transform-modules-amd": "^7.19.6", - "@babel/plugin-transform-modules-commonjs": "^7.19.6", - "@babel/plugin-transform-modules-systemjs": "^7.19.6", - "@babel/plugin-transform-modules-umd": "^7.18.6", - "@babel/plugin-transform-named-capturing-groups-regex": "^7.19.1", - "@babel/plugin-transform-new-target": "^7.18.6", - "@babel/plugin-transform-object-super": "^7.18.6", - "@babel/plugin-transform-parameters": "^7.20.1", - "@babel/plugin-transform-property-literals": "^7.18.6", - "@babel/plugin-transform-regenerator": "^7.18.6", - "@babel/plugin-transform-reserved-words": "^7.18.6", - "@babel/plugin-transform-shorthand-properties": "^7.18.6", - "@babel/plugin-transform-spread": "^7.19.0", - "@babel/plugin-transform-sticky-regex": "^7.18.6", - "@babel/plugin-transform-template-literals": "^7.18.9", - "@babel/plugin-transform-typeof-symbol": "^7.18.9", - "@babel/plugin-transform-unicode-escapes": "^7.18.10", - "@babel/plugin-transform-unicode-regex": "^7.18.6", - "@babel/preset-modules": "^0.1.5", - "@babel/types": "^7.20.2", - "babel-plugin-polyfill-corejs2": "^0.3.3", - "babel-plugin-polyfill-corejs3": "^0.6.0", - "babel-plugin-polyfill-regenerator": "^0.4.1", - "core-js-compat": "^3.25.1", - "semver": "^6.3.0" + "@babel/helper-plugin-utils": "^7.20.2" }, "engines": { "node": ">=6.9.0" @@ -2553,803 +2706,1743 @@ "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/preset-modules": { - "version": "0.1.5", + "node_modules/@babel/plugin-transform-class-static-block": { + "version": "7.22.11", "dev": true, "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.0.0", - "@babel/plugin-proposal-unicode-property-regex": "^7.4.4", - "@babel/plugin-transform-dotall-regex": "^7.4.4", - "@babel/types": "^7.4.4", - "esutils": "^2.0.2" + "@babel/helper-create-class-features-plugin": "^7.22.11", + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/plugin-syntax-class-static-block": "^7.14.5" + }, + "engines": { + "node": ">=6.9.0" }, "peerDependencies": { - "@babel/core": "^7.0.0-0" + "@babel/core": "^7.12.0" } }, - "node_modules/@babel/runtime": { - "version": "7.20.13", + "node_modules/@babel/plugin-transform-classes": { + "version": "7.20.7", + "dev": true, "license": "MIT", "dependencies": { - "regenerator-runtime": "^0.13.11" + "@babel/helper-annotate-as-pure": "^7.18.6", + "@babel/helper-compilation-targets": "^7.20.7", + "@babel/helper-environment-visitor": "^7.18.9", + "@babel/helper-function-name": "^7.19.0", + "@babel/helper-optimise-call-expression": "^7.18.6", + "@babel/helper-plugin-utils": "^7.20.2", + "@babel/helper-replace-supers": "^7.20.7", + "@babel/helper-split-export-declaration": "^7.18.6", + "globals": "^11.1.0" }, "engines": { "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/template": { - "version": "7.22.15", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.22.15.tgz", - "integrity": "sha512-QPErUVm4uyJa60rkI73qneDacvdvzxshT3kksGqlGWYdOTIUOwJ7RDUL8sGqslY1uXWSL6xMFKEXDS3ox2uF0w==", + "node_modules/@babel/plugin-transform-computed-properties": { + "version": "7.20.7", + "dev": true, + "license": "MIT", "dependencies": { - "@babel/code-frame": "^7.22.13", - "@babel/parser": "^7.22.15", - "@babel/types": "^7.22.15" + "@babel/helper-plugin-utils": "^7.20.2", + "@babel/template": "^7.20.7" }, "engines": { "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/traverse": { - "version": "7.23.2", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.23.2.tgz", - "integrity": "sha512-azpe59SQ48qG6nu2CzcMLbxUudtN+dOM9kDbUqGq3HXUJRlo7i8fvPoxQUzYgLZ4cMVmuZgm8vvBpNeRhd6XSw==", + "node_modules/@babel/plugin-transform-destructuring": { + "version": "7.20.7", + "dev": true, + "license": "MIT", "dependencies": { - "@babel/code-frame": "^7.22.13", - "@babel/generator": "^7.23.0", - "@babel/helper-environment-visitor": "^7.22.20", - "@babel/helper-function-name": "^7.23.0", - "@babel/helper-hoist-variables": "^7.22.5", - "@babel/helper-split-export-declaration": "^7.22.6", - "@babel/parser": "^7.23.0", - "@babel/types": "^7.23.0", - "debug": "^4.1.0", - "globals": "^11.1.0" + "@babel/helper-plugin-utils": "^7.20.2" }, "engines": { "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/types": { - "version": "7.23.6", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.23.6.tgz", - "integrity": "sha512-+uarb83brBzPKN38NX1MkB6vb6+mwvR6amUulqAE7ccQw1pEl+bCia9TbdG1lsnFP7lZySvUn37CHyXQdfTwzg==", + "node_modules/@babel/plugin-transform-dotall-regex": { + "version": "7.18.6", + "dev": true, + "license": "MIT", "dependencies": { - "@babel/helper-string-parser": "^7.23.4", - "@babel/helper-validator-identifier": "^7.22.20", - "to-fast-properties": "^2.0.0" + "@babel/helper-create-regexp-features-plugin": "^7.18.6", + "@babel/helper-plugin-utils": "^7.18.6" }, "engines": { "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/@changesets/apply-release-plan": { - "version": "6.1.3", + "node_modules/@babel/plugin-transform-duplicate-keys": { + "version": "7.18.9", "dev": true, "license": "MIT", "dependencies": { - "@babel/runtime": "^7.20.1", - "@changesets/config": "^2.3.0", - "@changesets/get-version-range-type": "^0.3.2", - "@changesets/git": "^2.0.0", - "@changesets/types": "^5.2.1", - "@manypkg/get-packages": "^1.1.3", - "detect-indent": "^6.0.0", - "fs-extra": "^7.0.1", - "lodash.startcase": "^4.4.0", - "outdent": "^0.5.0", - "prettier": "^2.7.1", - "resolve-from": "^5.0.0", - "semver": "^5.4.1" - } - }, - "node_modules/@changesets/apply-release-plan/node_modules/prettier": { - "version": "2.8.8", - "resolved": "https://registry.npmjs.org/prettier/-/prettier-2.8.8.tgz", - "integrity": "sha512-tdN8qQGvNjw4CHbY+XXk0JgCXn9QiF21a55rBe5LJAU+kDyC4WQn4+awm2Xfk2lQMk5fKup9XgzTZtGkjBdP9Q==", - "dev": true, - "bin": { - "prettier": "bin-prettier.js" + "@babel/helper-plugin-utils": "^7.18.9" }, "engines": { - "node": ">=10.13.0" + "node": ">=6.9.0" }, - "funding": { - "url": "https://github.com/prettier/prettier?sponsor=1" + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/@changesets/apply-release-plan/node_modules/semver": { - "version": "5.7.2", - "dev": true, - "license": "ISC", - "bin": { - "semver": "bin/semver" - } - }, - "node_modules/@changesets/assemble-release-plan": { - "version": "5.2.3", + "node_modules/@babel/plugin-transform-exponentiation-operator": { + "version": "7.18.6", "dev": true, "license": "MIT", "dependencies": { - "@babel/runtime": "^7.20.1", - "@changesets/errors": "^0.1.4", - "@changesets/get-dependents-graph": "^1.3.5", - "@changesets/types": "^5.2.1", - "@manypkg/get-packages": "^1.1.3", - "semver": "^5.4.1" + "@babel/helper-builder-binary-assignment-operator-visitor": "^7.18.6", + "@babel/helper-plugin-utils": "^7.18.6" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/@changesets/assemble-release-plan/node_modules/semver": { - "version": "5.7.2", + "node_modules/@babel/plugin-transform-for-of": { + "version": "7.18.8", "dev": true, - "license": "ISC", - "bin": { - "semver": "bin/semver" + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.18.6" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/@changesets/changelog-git": { - "version": "0.1.14", + "node_modules/@babel/plugin-transform-function-name": { + "version": "7.18.9", "dev": true, "license": "MIT", "dependencies": { - "@changesets/types": "^5.2.1" + "@babel/helper-compilation-targets": "^7.18.9", + "@babel/helper-function-name": "^7.18.9", + "@babel/helper-plugin-utils": "^7.18.9" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/@changesets/cli": { - "version": "2.26.0", + "node_modules/@babel/plugin-transform-literals": { + "version": "7.18.9", "dev": true, "license": "MIT", "dependencies": { - "@babel/runtime": "^7.20.1", - "@changesets/apply-release-plan": "^6.1.3", - "@changesets/assemble-release-plan": "^5.2.3", - "@changesets/changelog-git": "^0.1.14", - "@changesets/config": "^2.3.0", - "@changesets/errors": "^0.1.4", - "@changesets/get-dependents-graph": "^1.3.5", - "@changesets/get-release-plan": "^3.0.16", - "@changesets/git": "^2.0.0", - "@changesets/logger": "^0.0.5", - "@changesets/pre": "^1.0.14", - "@changesets/read": "^0.5.9", - "@changesets/types": "^5.2.1", - "@changesets/write": "^0.2.3", - "@manypkg/get-packages": "^1.1.3", - "@types/is-ci": "^3.0.0", - "@types/semver": "^6.0.0", - "ansi-colors": "^4.1.3", - "chalk": "^2.1.0", - "enquirer": "^2.3.0", - "external-editor": "^3.1.0", - "fs-extra": "^7.0.1", - "human-id": "^1.0.2", - "is-ci": "^3.0.1", - "meow": "^6.0.0", - "outdent": "^0.5.0", - "p-limit": "^2.2.0", - "preferred-pm": "^3.0.0", - "resolve-from": "^5.0.0", - "semver": "^5.4.1", - "spawndamnit": "^2.0.0", - "term-size": "^2.1.0", - "tty-table": "^4.1.5" + "@babel/helper-plugin-utils": "^7.18.9" }, - "bin": { - "changeset": "bin.js" + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/@changesets/cli/node_modules/semver": { - "version": "5.7.2", + "node_modules/@babel/plugin-transform-member-expression-literals": { + "version": "7.18.6", "dev": true, - "license": "ISC", - "bin": { - "semver": "bin/semver" + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.18.6" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/@changesets/config": { - "version": "2.3.0", + "node_modules/@babel/plugin-transform-modules-amd": { + "version": "7.20.11", "dev": true, "license": "MIT", "dependencies": { - "@changesets/errors": "^0.1.4", - "@changesets/get-dependents-graph": "^1.3.5", - "@changesets/logger": "^0.0.5", - "@changesets/types": "^5.2.1", - "@manypkg/get-packages": "^1.1.3", - "fs-extra": "^7.0.1", - "micromatch": "^4.0.2" + "@babel/helper-module-transforms": "^7.20.11", + "@babel/helper-plugin-utils": "^7.20.2" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/@changesets/errors": { - "version": "0.1.4", + "node_modules/@babel/plugin-transform-modules-commonjs": { + "version": "7.20.11", "dev": true, "license": "MIT", "dependencies": { - "extendable-error": "^0.1.5" + "@babel/helper-module-transforms": "^7.20.11", + "@babel/helper-plugin-utils": "^7.20.2", + "@babel/helper-simple-access": "^7.20.2" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/@changesets/get-dependents-graph": { - "version": "1.3.5", + "node_modules/@babel/plugin-transform-modules-systemjs": { + "version": "7.20.11", "dev": true, "license": "MIT", "dependencies": { - "@changesets/types": "^5.2.1", - "@manypkg/get-packages": "^1.1.3", - "chalk": "^2.1.0", - "fs-extra": "^7.0.1", - "semver": "^5.4.1" + "@babel/helper-hoist-variables": "^7.18.6", + "@babel/helper-module-transforms": "^7.20.11", + "@babel/helper-plugin-utils": "^7.20.2", + "@babel/helper-validator-identifier": "^7.19.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/@changesets/get-dependents-graph/node_modules/semver": { - "version": "5.7.2", + "node_modules/@babel/plugin-transform-modules-umd": { + "version": "7.18.6", "dev": true, - "license": "ISC", - "bin": { - "semver": "bin/semver" + "license": "MIT", + "dependencies": { + "@babel/helper-module-transforms": "^7.18.6", + "@babel/helper-plugin-utils": "^7.18.6" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/@changesets/get-github-info": { - "version": "0.5.2", + "node_modules/@babel/plugin-transform-named-capturing-groups-regex": { + "version": "7.20.5", "dev": true, "license": "MIT", "dependencies": { - "dataloader": "^1.4.0", - "node-fetch": "^2.5.0" + "@babel/helper-create-regexp-features-plugin": "^7.20.5", + "@babel/helper-plugin-utils": "^7.20.2" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" } }, - "node_modules/@changesets/get-github-info/node_modules/node-fetch": { - "version": "2.7.0", + "node_modules/@babel/plugin-transform-new-target": { + "version": "7.18.6", "dev": true, "license": "MIT", "dependencies": { - "whatwg-url": "^5.0.0" + "@babel/helper-plugin-utils": "^7.18.6" }, "engines": { - "node": "4.x || >=6.0.0" + "node": ">=6.9.0" }, "peerDependencies": { - "encoding": "^0.1.0" - }, - "peerDependenciesMeta": { - "encoding": { - "optional": true - } + "@babel/core": "^7.0.0-0" } }, - "node_modules/@changesets/get-github-info/node_modules/tr46": { - "version": "0.0.3", - "dev": true, - "license": "MIT" - }, - "node_modules/@changesets/get-github-info/node_modules/webidl-conversions": { - "version": "3.0.1", - "dev": true, - "license": "BSD-2-Clause" - }, - "node_modules/@changesets/get-github-info/node_modules/whatwg-url": { - "version": "5.0.0", + "node_modules/@babel/plugin-transform-object-super": { + "version": "7.18.6", "dev": true, "license": "MIT", "dependencies": { - "tr46": "~0.0.3", - "webidl-conversions": "^3.0.0" + "@babel/helper-plugin-utils": "^7.18.6", + "@babel/helper-replace-supers": "^7.18.6" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/@changesets/get-release-plan": { - "version": "3.0.16", + "node_modules/@babel/plugin-transform-parameters": { + "version": "7.20.7", "dev": true, "license": "MIT", "dependencies": { - "@babel/runtime": "^7.20.1", - "@changesets/assemble-release-plan": "^5.2.3", - "@changesets/config": "^2.3.0", - "@changesets/pre": "^1.0.14", - "@changesets/read": "^0.5.9", - "@changesets/types": "^5.2.1", - "@manypkg/get-packages": "^1.1.3" + "@babel/helper-plugin-utils": "^7.20.2" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/@changesets/get-version-range-type": { - "version": "0.3.2", - "dev": true, - "license": "MIT" - }, - "node_modules/@changesets/git": { - "version": "2.0.0", + "node_modules/@babel/plugin-transform-property-literals": { + "version": "7.18.6", "dev": true, "license": "MIT", "dependencies": { - "@babel/runtime": "^7.20.1", - "@changesets/errors": "^0.1.4", - "@changesets/types": "^5.2.1", - "@manypkg/get-packages": "^1.1.3", - "is-subdir": "^1.1.1", - "micromatch": "^4.0.2", - "spawndamnit": "^2.0.0" + "@babel/helper-plugin-utils": "^7.18.6" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/@changesets/logger": { - "version": "0.0.5", + "node_modules/@babel/plugin-transform-react-jsx": { + "version": "7.23.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx/-/plugin-transform-react-jsx-7.23.4.tgz", + "integrity": "sha512-5xOpoPguCZCRbo/JeHlloSkTA8Bld1J/E1/kLfD1nsuiW1m8tduTA1ERCgIZokDflX/IBzKcqR3l7VlRgiIfHA==", "dev": true, - "license": "MIT", "dependencies": { - "chalk": "^2.1.0" + "@babel/helper-annotate-as-pure": "^7.22.5", + "@babel/helper-module-imports": "^7.22.15", + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/plugin-syntax-jsx": "^7.23.3", + "@babel/types": "^7.23.4" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/@changesets/parse": { - "version": "0.3.16", + "node_modules/@babel/plugin-transform-react-jsx-development": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-development/-/plugin-transform-react-jsx-development-7.22.5.tgz", + "integrity": "sha512-bDhuzwWMuInwCYeDeMzyi7TaBgRQei6DqxhbyniL7/VG4RSS7HtSL2QbY4eESy1KJqlWt8g3xeEBGPuo+XqC8A==", "dev": true, - "license": "MIT", "dependencies": { - "@changesets/types": "^5.2.1", - "js-yaml": "^3.13.1" + "@babel/plugin-transform-react-jsx": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/@changesets/pre": { - "version": "1.0.14", + "node_modules/@babel/plugin-transform-regenerator": { + "version": "7.20.5", "dev": true, "license": "MIT", "dependencies": { - "@babel/runtime": "^7.20.1", - "@changesets/errors": "^0.1.4", - "@changesets/types": "^5.2.1", - "@manypkg/get-packages": "^1.1.3", - "fs-extra": "^7.0.1" + "@babel/helper-plugin-utils": "^7.20.2", + "regenerator-transform": "^0.15.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/@changesets/read": { - "version": "0.5.9", + "node_modules/@babel/plugin-transform-reserved-words": { + "version": "7.18.6", "dev": true, "license": "MIT", "dependencies": { - "@babel/runtime": "^7.20.1", - "@changesets/git": "^2.0.0", - "@changesets/logger": "^0.0.5", - "@changesets/parse": "^0.3.16", - "@changesets/types": "^5.2.1", - "chalk": "^2.1.0", - "fs-extra": "^7.0.1", - "p-filter": "^2.1.0" + "@babel/helper-plugin-utils": "^7.18.6" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/@changesets/types": { - "version": "5.2.1", - "dev": true, - "license": "MIT" - }, - "node_modules/@changesets/write": { - "version": "0.2.3", + "node_modules/@babel/plugin-transform-shorthand-properties": { + "version": "7.18.6", "dev": true, "license": "MIT", "dependencies": { - "@babel/runtime": "^7.20.1", - "@changesets/types": "^5.2.1", - "fs-extra": "^7.0.1", - "human-id": "^1.0.2", - "prettier": "^2.7.1" - } - }, - "node_modules/@changesets/write/node_modules/prettier": { - "version": "2.8.8", - "resolved": "https://registry.npmjs.org/prettier/-/prettier-2.8.8.tgz", - "integrity": "sha512-tdN8qQGvNjw4CHbY+XXk0JgCXn9QiF21a55rBe5LJAU+kDyC4WQn4+awm2Xfk2lQMk5fKup9XgzTZtGkjBdP9Q==", - "dev": true, - "bin": { - "prettier": "bin-prettier.js" + "@babel/helper-plugin-utils": "^7.18.6" }, "engines": { - "node": ">=10.13.0" + "node": ">=6.9.0" }, - "funding": { - "url": "https://github.com/prettier/prettier?sponsor=1" + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/@colors/colors": { - "version": "1.5.0", + "node_modules/@babel/plugin-transform-spread": { + "version": "7.20.7", "dev": true, "license": "MIT", - "optional": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.20.2", + "@babel/helper-skip-transparent-expression-wrappers": "^7.20.0" + }, "engines": { - "node": ">=0.1.90" + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/@cspotcode/source-map-support": { - "version": "0.8.1", + "node_modules/@babel/plugin-transform-sticky-regex": { + "version": "7.18.6", "dev": true, "license": "MIT", "dependencies": { - "@jridgewell/trace-mapping": "0.3.9" + "@babel/helper-plugin-utils": "^7.18.6" }, "engines": { - "node": ">=12" + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/@custom-elements-manifest/analyzer": { - "version": "0.6.8", + "node_modules/@babel/plugin-transform-template-literals": { + "version": "7.18.9", "dev": true, "license": "MIT", "dependencies": { - "@custom-elements-manifest/find-dependencies": "^0.0.5", - "@github/catalyst": "^1.6.0", - "@web/config-loader": "0.1.3", - "chokidar": "3.5.2", - "command-line-args": "5.1.2", - "comment-parser": "1.2.4", - "custom-elements-manifest": "1.0.0", - "debounce": "1.2.1", - "globby": "11.0.4", - "typescript": "~4.3.2" + "@babel/helper-plugin-utils": "^7.18.9" }, - "bin": { - "cem": "cem.js", - "custom-elements-manifest": "cem.js" - } - }, - "node_modules/@custom-elements-manifest/analyzer/node_modules/array-back": { - "version": "6.2.2", - "dev": true, - "license": "MIT", "engines": { - "node": ">=12.17" + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/@custom-elements-manifest/analyzer/node_modules/chokidar": { - "version": "3.5.2", + "node_modules/@babel/plugin-transform-typeof-symbol": { + "version": "7.18.9", "dev": true, "license": "MIT", "dependencies": { - "anymatch": "~3.1.2", - "braces": "~3.0.2", - "glob-parent": "~5.1.2", - "is-binary-path": "~2.1.0", - "is-glob": "~4.0.1", - "normalize-path": "~3.0.0", - "readdirp": "~3.6.0" + "@babel/helper-plugin-utils": "^7.18.9" }, "engines": { - "node": ">= 8.10.0" + "node": ">=6.9.0" }, - "optionalDependencies": { - "fsevents": "~2.3.2" + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/@custom-elements-manifest/analyzer/node_modules/command-line-args": { - "version": "5.1.2", + "node_modules/@babel/plugin-transform-typescript": { + "version": "7.22.11", "dev": true, "license": "MIT", "dependencies": { - "array-back": "^6.1.2", - "find-replace": "^3.0.0", - "lodash.camelcase": "^4.3.0", - "typical": "^4.0.0" + "@babel/helper-annotate-as-pure": "^7.22.5", + "@babel/helper-create-class-features-plugin": "^7.22.11", + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/plugin-syntax-typescript": "^7.22.5" }, "engines": { - "node": ">=4.0.0" + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/@custom-elements-manifest/analyzer/node_modules/custom-elements-manifest": { - "version": "1.0.0", - "dev": true, - "license": "BSD-3-Clause" - }, - "node_modules/@custom-elements-manifest/analyzer/node_modules/globby": { - "version": "11.0.4", + "node_modules/@babel/plugin-transform-unicode-escapes": { + "version": "7.18.10", "dev": true, "license": "MIT", "dependencies": { - "array-union": "^2.1.0", - "dir-glob": "^3.0.1", - "fast-glob": "^3.1.1", - "ignore": "^5.1.4", - "merge2": "^1.3.0", - "slash": "^3.0.0" + "@babel/helper-plugin-utils": "^7.18.9" }, "engines": { - "node": ">=10" + "node": ">=6.9.0" }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/@custom-elements-manifest/analyzer/node_modules/typescript": { - "version": "4.3.5", + "node_modules/@babel/plugin-transform-unicode-regex": { + "version": "7.18.6", "dev": true, - "license": "Apache-2.0", - "bin": { - "tsc": "bin/tsc", - "tsserver": "bin/tsserver" + "license": "MIT", + "dependencies": { + "@babel/helper-create-regexp-features-plugin": "^7.18.6", + "@babel/helper-plugin-utils": "^7.18.6" }, "engines": { - "node": ">=4.2.0" + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/@custom-elements-manifest/find-dependencies": { - "version": "0.0.5", + "node_modules/@babel/preset-env": { + "version": "7.20.2", "dev": true, - "license": "ISC", + "license": "MIT", "dependencies": { - "es-module-lexer": "^0.9.3" - } - }, - "node_modules/@custom-elements-manifest/find-dependencies/node_modules/es-module-lexer": { - "version": "0.9.3", - "dev": true, - "license": "MIT" - }, - "node_modules/@eslint-community/eslint-utils": { - "version": "4.4.0", - "license": "MIT", - "dependencies": { - "eslint-visitor-keys": "^3.3.0" + "@babel/compat-data": "^7.20.1", + "@babel/helper-compilation-targets": "^7.20.0", + "@babel/helper-plugin-utils": "^7.20.2", + "@babel/helper-validator-option": "^7.18.6", + "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": "^7.18.6", + "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": "^7.18.9", + "@babel/plugin-proposal-async-generator-functions": "^7.20.1", + "@babel/plugin-proposal-class-properties": "^7.18.6", + "@babel/plugin-proposal-class-static-block": "^7.18.6", + "@babel/plugin-proposal-dynamic-import": "^7.18.6", + "@babel/plugin-proposal-export-namespace-from": "^7.18.9", + "@babel/plugin-proposal-json-strings": "^7.18.6", + "@babel/plugin-proposal-logical-assignment-operators": "^7.18.9", + "@babel/plugin-proposal-nullish-coalescing-operator": "^7.18.6", + "@babel/plugin-proposal-numeric-separator": "^7.18.6", + "@babel/plugin-proposal-object-rest-spread": "^7.20.2", + "@babel/plugin-proposal-optional-catch-binding": "^7.18.6", + "@babel/plugin-proposal-optional-chaining": "^7.18.9", + "@babel/plugin-proposal-private-methods": "^7.18.6", + "@babel/plugin-proposal-private-property-in-object": "^7.18.6", + "@babel/plugin-proposal-unicode-property-regex": "^7.18.6", + "@babel/plugin-syntax-async-generators": "^7.8.4", + "@babel/plugin-syntax-class-properties": "^7.12.13", + "@babel/plugin-syntax-class-static-block": "^7.14.5", + "@babel/plugin-syntax-dynamic-import": "^7.8.3", + "@babel/plugin-syntax-export-namespace-from": "^7.8.3", + "@babel/plugin-syntax-import-assertions": "^7.20.0", + "@babel/plugin-syntax-json-strings": "^7.8.3", + "@babel/plugin-syntax-logical-assignment-operators": "^7.10.4", + "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.3", + "@babel/plugin-syntax-numeric-separator": "^7.10.4", + "@babel/plugin-syntax-object-rest-spread": "^7.8.3", + "@babel/plugin-syntax-optional-catch-binding": "^7.8.3", + "@babel/plugin-syntax-optional-chaining": "^7.8.3", + "@babel/plugin-syntax-private-property-in-object": "^7.14.5", + "@babel/plugin-syntax-top-level-await": "^7.14.5", + "@babel/plugin-transform-arrow-functions": "^7.18.6", + "@babel/plugin-transform-async-to-generator": "^7.18.6", + "@babel/plugin-transform-block-scoped-functions": "^7.18.6", + "@babel/plugin-transform-block-scoping": "^7.20.2", + "@babel/plugin-transform-classes": "^7.20.2", + "@babel/plugin-transform-computed-properties": "^7.18.9", + "@babel/plugin-transform-destructuring": "^7.20.2", + "@babel/plugin-transform-dotall-regex": "^7.18.6", + "@babel/plugin-transform-duplicate-keys": "^7.18.9", + "@babel/plugin-transform-exponentiation-operator": "^7.18.6", + "@babel/plugin-transform-for-of": "^7.18.8", + "@babel/plugin-transform-function-name": "^7.18.9", + "@babel/plugin-transform-literals": "^7.18.9", + "@babel/plugin-transform-member-expression-literals": "^7.18.6", + "@babel/plugin-transform-modules-amd": "^7.19.6", + "@babel/plugin-transform-modules-commonjs": "^7.19.6", + "@babel/plugin-transform-modules-systemjs": "^7.19.6", + "@babel/plugin-transform-modules-umd": "^7.18.6", + "@babel/plugin-transform-named-capturing-groups-regex": "^7.19.1", + "@babel/plugin-transform-new-target": "^7.18.6", + "@babel/plugin-transform-object-super": "^7.18.6", + "@babel/plugin-transform-parameters": "^7.20.1", + "@babel/plugin-transform-property-literals": "^7.18.6", + "@babel/plugin-transform-regenerator": "^7.18.6", + "@babel/plugin-transform-reserved-words": "^7.18.6", + "@babel/plugin-transform-shorthand-properties": "^7.18.6", + "@babel/plugin-transform-spread": "^7.19.0", + "@babel/plugin-transform-sticky-regex": "^7.18.6", + "@babel/plugin-transform-template-literals": "^7.18.9", + "@babel/plugin-transform-typeof-symbol": "^7.18.9", + "@babel/plugin-transform-unicode-escapes": "^7.18.10", + "@babel/plugin-transform-unicode-regex": "^7.18.6", + "@babel/preset-modules": "^0.1.5", + "@babel/types": "^7.20.2", + "babel-plugin-polyfill-corejs2": "^0.3.3", + "babel-plugin-polyfill-corejs3": "^0.6.0", + "babel-plugin-polyfill-regenerator": "^0.4.1", + "core-js-compat": "^3.25.1", + "semver": "^6.3.0" }, "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + "node": ">=6.9.0" }, "peerDependencies": { - "eslint": "^6.0.0 || ^7.0.0 || >=8.0.0" + "@babel/core": "^7.0.0-0" } }, - "node_modules/@eslint-community/eslint-utils/node_modules/eslint-visitor-keys": { - "version": "3.4.3", - "license": "Apache-2.0", - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + "node_modules/@babel/preset-modules": { + "version": "0.1.5", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.0.0", + "@babel/plugin-proposal-unicode-property-regex": "^7.4.4", + "@babel/plugin-transform-dotall-regex": "^7.4.4", + "@babel/types": "^7.4.4", + "esutils": "^2.0.2" }, - "funding": { - "url": "https://opencollective.com/eslint" + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/@eslint-community/regexpp": { - "version": "4.8.0", + "node_modules/@babel/runtime": { + "version": "7.20.13", "license": "MIT", + "dependencies": { + "regenerator-runtime": "^0.13.11" + }, "engines": { - "node": "^12.0.0 || ^14.0.0 || >=16.0.0" + "node": ">=6.9.0" } }, - "node_modules/@eslint/eslintrc": { - "version": "2.1.4", - "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-2.1.4.tgz", - "integrity": "sha512-269Z39MS6wVJtsoUl10L60WdkhJVdPG24Q4eZTH3nnF6lpvSShEK3wQjDX9JRWAUPvPh7COouPpU9IrqaZFvtQ==", + "node_modules/@babel/template": { + "version": "7.22.15", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.22.15.tgz", + "integrity": "sha512-QPErUVm4uyJa60rkI73qneDacvdvzxshT3kksGqlGWYdOTIUOwJ7RDUL8sGqslY1uXWSL6xMFKEXDS3ox2uF0w==", "dependencies": { - "ajv": "^6.12.4", - "debug": "^4.3.2", - "espree": "^9.6.0", - "globals": "^13.19.0", - "ignore": "^5.2.0", - "import-fresh": "^3.2.1", - "js-yaml": "^4.1.0", - "minimatch": "^3.1.2", - "strip-json-comments": "^3.1.1" + "@babel/code-frame": "^7.22.13", + "@babel/parser": "^7.22.15", + "@babel/types": "^7.22.15" }, "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "url": "https://opencollective.com/eslint" + "node": ">=6.9.0" } }, - "node_modules/@eslint/eslintrc/node_modules/argparse": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", - "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==" - }, - "node_modules/@eslint/eslintrc/node_modules/globals": { - "version": "13.24.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-13.24.0.tgz", - "integrity": "sha512-AhO5QUcj8llrbG09iWhPU2B204J1xnPeL8kQmVorSsy+Sjj1sk8gIyh6cUocGmH4L0UuhAJy+hJMRA4mgA4mFQ==", + "node_modules/@babel/traverse": { + "version": "7.23.2", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.23.2.tgz", + "integrity": "sha512-azpe59SQ48qG6nu2CzcMLbxUudtN+dOM9kDbUqGq3HXUJRlo7i8fvPoxQUzYgLZ4cMVmuZgm8vvBpNeRhd6XSw==", "dependencies": { - "type-fest": "^0.20.2" + "@babel/code-frame": "^7.22.13", + "@babel/generator": "^7.23.0", + "@babel/helper-environment-visitor": "^7.22.20", + "@babel/helper-function-name": "^7.23.0", + "@babel/helper-hoist-variables": "^7.22.5", + "@babel/helper-split-export-declaration": "^7.22.6", + "@babel/parser": "^7.23.0", + "@babel/types": "^7.23.0", + "debug": "^4.1.0", + "globals": "^11.1.0" }, "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "node": ">=6.9.0" } }, - "node_modules/@eslint/eslintrc/node_modules/js-yaml": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", - "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", + "node_modules/@babel/types": { + "version": "7.23.6", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.23.6.tgz", + "integrity": "sha512-+uarb83brBzPKN38NX1MkB6vb6+mwvR6amUulqAE7ccQw1pEl+bCia9TbdG1lsnFP7lZySvUn37CHyXQdfTwzg==", "dependencies": { - "argparse": "^2.0.1" + "@babel/helper-string-parser": "^7.23.4", + "@babel/helper-validator-identifier": "^7.22.20", + "to-fast-properties": "^2.0.0" }, - "bin": { - "js-yaml": "bin/js-yaml.js" + "engines": { + "node": ">=6.9.0" } }, - "node_modules/@eslint/eslintrc/node_modules/type-fest": { - "version": "0.20.2", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz", - "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==", + "node_modules/@changesets/apply-release-plan": { + "version": "6.1.3", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.20.1", + "@changesets/config": "^2.3.0", + "@changesets/get-version-range-type": "^0.3.2", + "@changesets/git": "^2.0.0", + "@changesets/types": "^5.2.1", + "@manypkg/get-packages": "^1.1.3", + "detect-indent": "^6.0.0", + "fs-extra": "^7.0.1", + "lodash.startcase": "^4.4.0", + "outdent": "^0.5.0", + "prettier": "^2.7.1", + "resolve-from": "^5.0.0", + "semver": "^5.4.1" + } + }, + "node_modules/@changesets/apply-release-plan/node_modules/prettier": { + "version": "2.8.8", + "resolved": "https://registry.npmjs.org/prettier/-/prettier-2.8.8.tgz", + "integrity": "sha512-tdN8qQGvNjw4CHbY+XXk0JgCXn9QiF21a55rBe5LJAU+kDyC4WQn4+awm2Xfk2lQMk5fKup9XgzTZtGkjBdP9Q==", + "dev": true, + "bin": { + "prettier": "bin-prettier.js" + }, "engines": { - "node": ">=10" + "node": ">=10.13.0" }, "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "url": "https://github.com/prettier/prettier?sponsor=1" } }, - "node_modules/@eslint/js": { - "version": "8.56.0", - "resolved": "https://registry.npmjs.org/@eslint/js/-/js-8.56.0.tgz", - "integrity": "sha512-gMsVel9D7f2HLkBma9VbtzZRehRogVRfbr++f06nL2vnCGCNlzOD+/MUov/F4p8myyAHspEhVobgjpX64q5m6A==", - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + "node_modules/@changesets/apply-release-plan/node_modules/semver": { + "version": "5.7.2", + "dev": true, + "license": "ISC", + "bin": { + "semver": "bin/semver" } }, - "node_modules/@esm-bundle/chai": { - "version": "4.3.4", + "node_modules/@changesets/assemble-release-plan": { + "version": "5.2.3", "dev": true, "license": "MIT", "dependencies": { - "@types/chai": "^4.2.12" + "@babel/runtime": "^7.20.1", + "@changesets/errors": "^0.1.4", + "@changesets/get-dependents-graph": "^1.3.5", + "@changesets/types": "^5.2.1", + "@manypkg/get-packages": "^1.1.3", + "semver": "^5.4.1" } }, - "node_modules/@github/catalyst": { - "version": "1.6.0", + "node_modules/@changesets/assemble-release-plan/node_modules/semver": { + "version": "5.7.2", "dev": true, - "license": "MIT" + "license": "ISC", + "bin": { + "semver": "bin/semver" + } }, - "node_modules/@humanwhocodes/config-array": { - "version": "0.11.14", - "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.11.14.tgz", - "integrity": "sha512-3T8LkOmg45BV5FICb15QQMsyUSWrQ8AygVfC7ZG32zOalnqrilm018ZVCw0eapXux8FtA33q8PSRSstjee3jSg==", + "node_modules/@changesets/changelog-git": { + "version": "0.1.14", + "dev": true, + "license": "MIT", "dependencies": { - "@humanwhocodes/object-schema": "^2.0.2", - "debug": "^4.3.1", - "minimatch": "^3.0.5" - }, - "engines": { - "node": ">=10.10.0" + "@changesets/types": "^5.2.1" } }, - "node_modules/@humanwhocodes/module-importer": { - "version": "1.0.1", - "license": "Apache-2.0", - "engines": { - "node": ">=12.22" + "node_modules/@changesets/cli": { + "version": "2.26.0", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.20.1", + "@changesets/apply-release-plan": "^6.1.3", + "@changesets/assemble-release-plan": "^5.2.3", + "@changesets/changelog-git": "^0.1.14", + "@changesets/config": "^2.3.0", + "@changesets/errors": "^0.1.4", + "@changesets/get-dependents-graph": "^1.3.5", + "@changesets/get-release-plan": "^3.0.16", + "@changesets/git": "^2.0.0", + "@changesets/logger": "^0.0.5", + "@changesets/pre": "^1.0.14", + "@changesets/read": "^0.5.9", + "@changesets/types": "^5.2.1", + "@changesets/write": "^0.2.3", + "@manypkg/get-packages": "^1.1.3", + "@types/is-ci": "^3.0.0", + "@types/semver": "^6.0.0", + "ansi-colors": "^4.1.3", + "chalk": "^2.1.0", + "enquirer": "^2.3.0", + "external-editor": "^3.1.0", + "fs-extra": "^7.0.1", + "human-id": "^1.0.2", + "is-ci": "^3.0.1", + "meow": "^6.0.0", + "outdent": "^0.5.0", + "p-limit": "^2.2.0", + "preferred-pm": "^3.0.0", + "resolve-from": "^5.0.0", + "semver": "^5.4.1", + "spawndamnit": "^2.0.0", + "term-size": "^2.1.0", + "tty-table": "^4.1.5" }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/nzakas" + "bin": { + "changeset": "bin.js" } }, - "node_modules/@humanwhocodes/object-schema": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-2.0.2.tgz", - "integrity": "sha512-6EwiSjwWYP7pTckG6I5eyFANjPhmPjUX9JRLUSfNPC7FX7zK9gyZAfUEaECL6ALTpGX5AjnBq3C9XmVWPitNpw==" - }, - "node_modules/@hutson/parse-repository-url": { - "version": "3.0.2", + "node_modules/@changesets/cli/node_modules/semver": { + "version": "5.7.2", "dev": true, - "license": "Apache-2.0", - "engines": { - "node": ">=6.9.0" + "license": "ISC", + "bin": { + "semver": "bin/semver" } }, - "node_modules/@iarna/toml": { - "version": "2.2.5", + "node_modules/@changesets/config": { + "version": "2.3.0", "dev": true, - "license": "ISC" + "license": "MIT", + "dependencies": { + "@changesets/errors": "^0.1.4", + "@changesets/get-dependents-graph": "^1.3.5", + "@changesets/logger": "^0.0.5", + "@changesets/types": "^5.2.1", + "@manypkg/get-packages": "^1.1.3", + "fs-extra": "^7.0.1", + "micromatch": "^4.0.2" + } }, - "node_modules/@istanbuljs/load-nyc-config": { - "version": "1.1.0", + "node_modules/@changesets/errors": { + "version": "0.1.4", "dev": true, - "license": "ISC", + "license": "MIT", "dependencies": { - "camelcase": "^5.3.1", - "find-up": "^4.1.0", - "get-package-type": "^0.1.0", - "js-yaml": "^3.13.1", - "resolve-from": "^5.0.0" - }, - "engines": { - "node": ">=8" + "extendable-error": "^0.1.5" } }, - "node_modules/@istanbuljs/load-nyc-config/node_modules/camelcase": { - "version": "5.3.1", + "node_modules/@changesets/get-dependents-graph": { + "version": "1.3.5", "dev": true, "license": "MIT", - "engines": { - "node": ">=6" + "dependencies": { + "@changesets/types": "^5.2.1", + "@manypkg/get-packages": "^1.1.3", + "chalk": "^2.1.0", + "fs-extra": "^7.0.1", + "semver": "^5.4.1" } }, - "node_modules/@istanbuljs/schema": { - "version": "0.1.3", + "node_modules/@changesets/get-dependents-graph/node_modules/semver": { + "version": "5.7.2", "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" + "license": "ISC", + "bin": { + "semver": "bin/semver" } }, - "node_modules/@jridgewell/gen-mapping": { - "version": "0.1.1", + "node_modules/@changesets/get-github-info": { + "version": "0.5.2", "dev": true, "license": "MIT", "dependencies": { - "@jridgewell/set-array": "^1.0.0", - "@jridgewell/sourcemap-codec": "^1.4.10" - }, - "engines": { - "node": ">=6.0.0" + "dataloader": "^1.4.0", + "node-fetch": "^2.5.0" } }, - "node_modules/@jridgewell/resolve-uri": { - "version": "3.1.0", + "node_modules/@changesets/get-github-info/node_modules/node-fetch": { + "version": "2.7.0", + "dev": true, "license": "MIT", + "dependencies": { + "whatwg-url": "^5.0.0" + }, "engines": { - "node": ">=6.0.0" + "node": "4.x || >=6.0.0" + }, + "peerDependencies": { + "encoding": "^0.1.0" + }, + "peerDependenciesMeta": { + "encoding": { + "optional": true + } } }, - "node_modules/@jridgewell/set-array": { - "version": "1.1.2", + "node_modules/@changesets/get-github-info/node_modules/tr46": { + "version": "0.0.3", + "dev": true, + "license": "MIT" + }, + "node_modules/@changesets/get-github-info/node_modules/webidl-conversions": { + "version": "3.0.1", + "dev": true, + "license": "BSD-2-Clause" + }, + "node_modules/@changesets/get-github-info/node_modules/whatwg-url": { + "version": "5.0.0", + "dev": true, "license": "MIT", - "engines": { - "node": ">=6.0.0" + "dependencies": { + "tr46": "~0.0.3", + "webidl-conversions": "^3.0.0" } }, - "node_modules/@jridgewell/source-map": { - "version": "0.3.5", + "node_modules/@changesets/get-release-plan": { + "version": "3.0.16", + "dev": true, "license": "MIT", "dependencies": { - "@jridgewell/gen-mapping": "^0.3.0", - "@jridgewell/trace-mapping": "^0.3.9" + "@babel/runtime": "^7.20.1", + "@changesets/assemble-release-plan": "^5.2.3", + "@changesets/config": "^2.3.0", + "@changesets/pre": "^1.0.14", + "@changesets/read": "^0.5.9", + "@changesets/types": "^5.2.1", + "@manypkg/get-packages": "^1.1.3" } }, - "node_modules/@jridgewell/source-map/node_modules/@jridgewell/gen-mapping": { - "version": "0.3.3", + "node_modules/@changesets/get-version-range-type": { + "version": "0.3.2", + "dev": true, + "license": "MIT" + }, + "node_modules/@changesets/git": { + "version": "2.0.0", + "dev": true, "license": "MIT", "dependencies": { - "@jridgewell/set-array": "^1.0.1", - "@jridgewell/sourcemap-codec": "^1.4.10", - "@jridgewell/trace-mapping": "^0.3.9" - }, - "engines": { - "node": ">=6.0.0" + "@babel/runtime": "^7.20.1", + "@changesets/errors": "^0.1.4", + "@changesets/types": "^5.2.1", + "@manypkg/get-packages": "^1.1.3", + "is-subdir": "^1.1.1", + "micromatch": "^4.0.2", + "spawndamnit": "^2.0.0" } }, - "node_modules/@jridgewell/sourcemap-codec": { - "version": "1.4.15", - "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.15.tgz", - "integrity": "sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg==" - }, - "node_modules/@jridgewell/trace-mapping": { - "version": "0.3.9", + "node_modules/@changesets/logger": { + "version": "0.0.5", + "dev": true, "license": "MIT", "dependencies": { - "@jridgewell/resolve-uri": "^3.0.3", - "@jridgewell/sourcemap-codec": "^1.4.10" + "chalk": "^2.1.0" } }, - "node_modules/@koa/cors": { - "version": "3.4.3", + "node_modules/@changesets/parse": { + "version": "0.3.16", "dev": true, "license": "MIT", "dependencies": { - "vary": "^1.1.2" - }, - "engines": { - "node": ">= 8.0.0" + "@changesets/types": "^5.2.1", + "js-yaml": "^3.13.1" } }, - "node_modules/@koa/router": { - "version": "12.0.0", + "node_modules/@changesets/pre": { + "version": "1.0.14", "dev": true, "license": "MIT", "dependencies": { - "http-errors": "^2.0.0", - "koa-compose": "^4.1.0", - "methods": "^1.1.2", - "path-to-regexp": "^6.2.1" - }, - "engines": { - "node": ">= 12" + "@babel/runtime": "^7.20.1", + "@changesets/errors": "^0.1.4", + "@changesets/types": "^5.2.1", + "@manypkg/get-packages": "^1.1.3", + "fs-extra": "^7.0.1" } }, - "node_modules/@lit-examples/nextjs-v13": { - "resolved": "examples/nextjs-v13", + "node_modules/@changesets/read": { + "version": "0.5.9", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.20.1", + "@changesets/git": "^2.0.0", + "@changesets/logger": "^0.0.5", + "@changesets/parse": "^0.3.16", + "@changesets/types": "^5.2.1", + "chalk": "^2.1.0", + "fs-extra": "^7.0.1", + "p-filter": "^2.1.0" + } + }, + "node_modules/@changesets/types": { + "version": "5.2.1", + "dev": true, + "license": "MIT" + }, + "node_modules/@changesets/write": { + "version": "0.2.3", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.20.1", + "@changesets/types": "^5.2.1", + "fs-extra": "^7.0.1", + "human-id": "^1.0.2", + "prettier": "^2.7.1" + } + }, + "node_modules/@changesets/write/node_modules/prettier": { + "version": "2.8.8", + "resolved": "https://registry.npmjs.org/prettier/-/prettier-2.8.8.tgz", + "integrity": "sha512-tdN8qQGvNjw4CHbY+XXk0JgCXn9QiF21a55rBe5LJAU+kDyC4WQn4+awm2Xfk2lQMk5fKup9XgzTZtGkjBdP9Q==", + "dev": true, + "bin": { + "prettier": "bin-prettier.js" + }, + "engines": { + "node": ">=10.13.0" + }, + "funding": { + "url": "https://github.com/prettier/prettier?sponsor=1" + } + }, + "node_modules/@colors/colors": { + "version": "1.5.0", + "dev": true, + "license": "MIT", + "optional": true, + "engines": { + "node": ">=0.1.90" + } + }, + "node_modules/@cspotcode/source-map-support": { + "version": "0.8.1", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/trace-mapping": "0.3.9" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/@custom-elements-manifest/analyzer": { + "version": "0.6.8", + "dev": true, + "license": "MIT", + "dependencies": { + "@custom-elements-manifest/find-dependencies": "^0.0.5", + "@github/catalyst": "^1.6.0", + "@web/config-loader": "0.1.3", + "chokidar": "3.5.2", + "command-line-args": "5.1.2", + "comment-parser": "1.2.4", + "custom-elements-manifest": "1.0.0", + "debounce": "1.2.1", + "globby": "11.0.4", + "typescript": "~4.3.2" + }, + "bin": { + "cem": "cem.js", + "custom-elements-manifest": "cem.js" + } + }, + "node_modules/@custom-elements-manifest/analyzer/node_modules/array-back": { + "version": "6.2.2", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12.17" + } + }, + "node_modules/@custom-elements-manifest/analyzer/node_modules/chokidar": { + "version": "3.5.2", + "dev": true, + "license": "MIT", + "dependencies": { + "anymatch": "~3.1.2", + "braces": "~3.0.2", + "glob-parent": "~5.1.2", + "is-binary-path": "~2.1.0", + "is-glob": "~4.0.1", + "normalize-path": "~3.0.0", + "readdirp": "~3.6.0" + }, + "engines": { + "node": ">= 8.10.0" + }, + "optionalDependencies": { + "fsevents": "~2.3.2" + } + }, + "node_modules/@custom-elements-manifest/analyzer/node_modules/command-line-args": { + "version": "5.1.2", + "dev": true, + "license": "MIT", + "dependencies": { + "array-back": "^6.1.2", + "find-replace": "^3.0.0", + "lodash.camelcase": "^4.3.0", + "typical": "^4.0.0" + }, + "engines": { + "node": ">=4.0.0" + } + }, + "node_modules/@custom-elements-manifest/analyzer/node_modules/custom-elements-manifest": { + "version": "1.0.0", + "dev": true, + "license": "BSD-3-Clause" + }, + "node_modules/@custom-elements-manifest/analyzer/node_modules/globby": { + "version": "11.0.4", + "dev": true, + "license": "MIT", + "dependencies": { + "array-union": "^2.1.0", + "dir-glob": "^3.0.1", + "fast-glob": "^3.1.1", + "ignore": "^5.1.4", + "merge2": "^1.3.0", + "slash": "^3.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@custom-elements-manifest/analyzer/node_modules/typescript": { + "version": "4.3.5", + "dev": true, + "license": "Apache-2.0", + "bin": { + "tsc": "bin/tsc", + "tsserver": "bin/tsserver" + }, + "engines": { + "node": ">=4.2.0" + } + }, + "node_modules/@custom-elements-manifest/find-dependencies": { + "version": "0.0.5", + "dev": true, + "license": "ISC", + "dependencies": { + "es-module-lexer": "^0.9.3" + } + }, + "node_modules/@custom-elements-manifest/find-dependencies/node_modules/es-module-lexer": { + "version": "0.9.3", + "dev": true, + "license": "MIT" + }, + "node_modules/@esbuild/aix-ppc64": { + "version": "0.19.12", + "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.19.12.tgz", + "integrity": "sha512-bmoCYyWdEL3wDQIVbcyzRyeKLgk2WtWLTWz1ZIAZF/EGbNOwSA6ew3PftJ1PqMiOOGu0OyFMzG53L0zqIpPeNA==", + "cpu": [ + "ppc64" + ], + "dev": true, + "optional": true, + "os": [ + "aix" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/android-arm": { + "version": "0.19.12", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.19.12.tgz", + "integrity": "sha512-qg/Lj1mu3CdQlDEEiWrlC4eaPZ1KztwGJ9B6J+/6G+/4ewxJg7gqj8eVYWvao1bXrqGiW2rsBZFSX3q2lcW05w==", + "cpu": [ + "arm" + ], + "dev": true, + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/android-arm64": { + "version": "0.19.12", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.19.12.tgz", + "integrity": "sha512-P0UVNGIienjZv3f5zq0DP3Nt2IE/3plFzuaS96vihvD0Hd6H/q4WXUGpCxD/E8YrSXfNyRPbpTq+T8ZQioSuPA==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/android-x64": { + "version": "0.19.12", + "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.19.12.tgz", + "integrity": "sha512-3k7ZoUW6Q6YqhdhIaq/WZ7HwBpnFBlW905Fa4s4qWJyiNOgT1dOqDiVAQFwBH7gBRZr17gLrlFCRzF6jFh7Kew==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/darwin-arm64": { + "version": "0.19.12", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.19.12.tgz", + "integrity": "sha512-B6IeSgZgtEzGC42jsI+YYu9Z3HKRxp8ZT3cqhvliEHovq8HSX2YX8lNocDn79gCKJXOSaEot9MVYky7AKjCs8g==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/darwin-x64": { + "version": "0.19.12", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.19.12.tgz", + "integrity": "sha512-hKoVkKzFiToTgn+41qGhsUJXFlIjxI/jSYeZf3ugemDYZldIXIxhvwN6erJGlX4t5h417iFuheZ7l+YVn05N3A==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/freebsd-arm64": { + "version": "0.19.12", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.19.12.tgz", + "integrity": "sha512-4aRvFIXmwAcDBw9AueDQ2YnGmz5L6obe5kmPT8Vd+/+x/JMVKCgdcRwH6APrbpNXsPz+K653Qg8HB/oXvXVukA==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/freebsd-x64": { + "version": "0.19.12", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.19.12.tgz", + "integrity": "sha512-EYoXZ4d8xtBoVN7CEwWY2IN4ho76xjYXqSXMNccFSx2lgqOG/1TBPW0yPx1bJZk94qu3tX0fycJeeQsKovA8gg==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-arm": { + "version": "0.19.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.19.12.tgz", + "integrity": "sha512-J5jPms//KhSNv+LO1S1TX1UWp1ucM6N6XuL6ITdKWElCu8wXP72l9MM0zDTzzeikVyqFE6U8YAV9/tFyj0ti+w==", + "cpu": [ + "arm" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-arm64": { + "version": "0.19.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.19.12.tgz", + "integrity": "sha512-EoTjyYyLuVPfdPLsGVVVC8a0p1BFFvtpQDB/YLEhaXyf/5bczaGeN15QkR+O4S5LeJ92Tqotve7i1jn35qwvdA==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-ia32": { + "version": "0.19.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.19.12.tgz", + "integrity": "sha512-Thsa42rrP1+UIGaWz47uydHSBOgTUnwBwNq59khgIwktK6x60Hivfbux9iNR0eHCHzOLjLMLfUMLCypBkZXMHA==", + "cpu": [ + "ia32" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-loong64": { + "version": "0.19.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.19.12.tgz", + "integrity": "sha512-LiXdXA0s3IqRRjm6rV6XaWATScKAXjI4R4LoDlvO7+yQqFdlr1Bax62sRwkVvRIrwXxvtYEHHI4dm50jAXkuAA==", + "cpu": [ + "loong64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-mips64el": { + "version": "0.19.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.19.12.tgz", + "integrity": "sha512-fEnAuj5VGTanfJ07ff0gOA6IPsvrVHLVb6Lyd1g2/ed67oU1eFzL0r9WL7ZzscD+/N6i3dWumGE1Un4f7Amf+w==", + "cpu": [ + "mips64el" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-ppc64": { + "version": "0.19.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.19.12.tgz", + "integrity": "sha512-nYJA2/QPimDQOh1rKWedNOe3Gfc8PabU7HT3iXWtNUbRzXS9+vgB0Fjaqr//XNbd82mCxHzik2qotuI89cfixg==", + "cpu": [ + "ppc64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-riscv64": { + "version": "0.19.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.19.12.tgz", + "integrity": "sha512-2MueBrlPQCw5dVJJpQdUYgeqIzDQgw3QtiAHUC4RBz9FXPrskyyU3VI1hw7C0BSKB9OduwSJ79FTCqtGMWqJHg==", + "cpu": [ + "riscv64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-s390x": { + "version": "0.19.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.19.12.tgz", + "integrity": "sha512-+Pil1Nv3Umes4m3AZKqA2anfhJiVmNCYkPchwFJNEJN5QxmTs1uzyy4TvmDrCRNT2ApwSari7ZIgrPeUx4UZDg==", + "cpu": [ + "s390x" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-x64": { + "version": "0.19.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.19.12.tgz", + "integrity": "sha512-B71g1QpxfwBvNrfyJdVDexenDIt1CiDN1TIXLbhOw0KhJzE78KIFGX6OJ9MrtC0oOqMWf+0xop4qEU8JrJTwCg==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/netbsd-x64": { + "version": "0.19.12", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.19.12.tgz", + "integrity": "sha512-3ltjQ7n1owJgFbuC61Oj++XhtzmymoCihNFgT84UAmJnxJfm4sYCiSLTXZtE00VWYpPMYc+ZQmB6xbSdVh0JWA==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "netbsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/openbsd-x64": { + "version": "0.19.12", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.19.12.tgz", + "integrity": "sha512-RbrfTB9SWsr0kWmb9srfF+L933uMDdu9BIzdA7os2t0TXhCRjrQyCeOt6wVxr79CKD4c+p+YhCj31HBkYcXebw==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "openbsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/sunos-x64": { + "version": "0.19.12", + "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.19.12.tgz", + "integrity": "sha512-HKjJwRrW8uWtCQnQOz9qcU3mUZhTUQvi56Q8DPTLLB+DawoiQdjsYq+j+D3s9I8VFtDr+F9CjgXKKC4ss89IeA==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "sunos" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/win32-arm64": { + "version": "0.19.12", + "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.19.12.tgz", + "integrity": "sha512-URgtR1dJnmGvX864pn1B2YUYNzjmXkuJOIqG2HdU62MVS4EHpU2946OZoTMnRUHklGtJdJZ33QfzdjGACXhn1A==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/win32-ia32": { + "version": "0.19.12", + "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.19.12.tgz", + "integrity": "sha512-+ZOE6pUkMOJfmxmBZElNOx72NKpIa/HFOMGzu8fqzQJ5kgf6aTGrcJaFsNiVMH4JKpMipyK+7k0n2UXN7a8YKQ==", + "cpu": [ + "ia32" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/win32-x64": { + "version": "0.19.12", + "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.19.12.tgz", + "integrity": "sha512-T1QyPSDCyMXaO3pzBkF96E8xMkiRYbUEZADd29SyPGabqxMViNoii+NcK7eWJAEoU6RZyEm5lVSIjTmcdoB9HA==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@eslint-community/eslint-utils": { + "version": "4.4.0", + "license": "MIT", + "dependencies": { + "eslint-visitor-keys": "^3.3.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "peerDependencies": { + "eslint": "^6.0.0 || ^7.0.0 || >=8.0.0" + } + }, + "node_modules/@eslint-community/eslint-utils/node_modules/eslint-visitor-keys": { + "version": "3.4.3", + "license": "Apache-2.0", + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/@eslint-community/regexpp": { + "version": "4.8.0", + "license": "MIT", + "engines": { + "node": "^12.0.0 || ^14.0.0 || >=16.0.0" + } + }, + "node_modules/@eslint/eslintrc": { + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-2.1.4.tgz", + "integrity": "sha512-269Z39MS6wVJtsoUl10L60WdkhJVdPG24Q4eZTH3nnF6lpvSShEK3wQjDX9JRWAUPvPh7COouPpU9IrqaZFvtQ==", + "dependencies": { + "ajv": "^6.12.4", + "debug": "^4.3.2", + "espree": "^9.6.0", + "globals": "^13.19.0", + "ignore": "^5.2.0", + "import-fresh": "^3.2.1", + "js-yaml": "^4.1.0", + "minimatch": "^3.1.2", + "strip-json-comments": "^3.1.1" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/@eslint/eslintrc/node_modules/argparse": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", + "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==" + }, + "node_modules/@eslint/eslintrc/node_modules/globals": { + "version": "13.24.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-13.24.0.tgz", + "integrity": "sha512-AhO5QUcj8llrbG09iWhPU2B204J1xnPeL8kQmVorSsy+Sjj1sk8gIyh6cUocGmH4L0UuhAJy+hJMRA4mgA4mFQ==", + "dependencies": { + "type-fest": "^0.20.2" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@eslint/eslintrc/node_modules/js-yaml": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", + "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", + "dependencies": { + "argparse": "^2.0.1" + }, + "bin": { + "js-yaml": "bin/js-yaml.js" + } + }, + "node_modules/@eslint/eslintrc/node_modules/type-fest": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz", + "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@eslint/js": { + "version": "8.56.0", + "resolved": "https://registry.npmjs.org/@eslint/js/-/js-8.56.0.tgz", + "integrity": "sha512-gMsVel9D7f2HLkBma9VbtzZRehRogVRfbr++f06nL2vnCGCNlzOD+/MUov/F4p8myyAHspEhVobgjpX64q5m6A==", + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + } + }, + "node_modules/@esm-bundle/chai": { + "version": "4.3.4", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/chai": "^4.2.12" + } + }, + "node_modules/@github/catalyst": { + "version": "1.6.0", + "dev": true, + "license": "MIT" + }, + "node_modules/@humanwhocodes/config-array": { + "version": "0.11.14", + "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.11.14.tgz", + "integrity": "sha512-3T8LkOmg45BV5FICb15QQMsyUSWrQ8AygVfC7ZG32zOalnqrilm018ZVCw0eapXux8FtA33q8PSRSstjee3jSg==", + "dependencies": { + "@humanwhocodes/object-schema": "^2.0.2", + "debug": "^4.3.1", + "minimatch": "^3.0.5" + }, + "engines": { + "node": ">=10.10.0" + } + }, + "node_modules/@humanwhocodes/module-importer": { + "version": "1.0.1", + "license": "Apache-2.0", + "engines": { + "node": ">=12.22" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/nzakas" + } + }, + "node_modules/@humanwhocodes/object-schema": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-2.0.2.tgz", + "integrity": "sha512-6EwiSjwWYP7pTckG6I5eyFANjPhmPjUX9JRLUSfNPC7FX7zK9gyZAfUEaECL6ALTpGX5AjnBq3C9XmVWPitNpw==" + }, + "node_modules/@hutson/parse-repository-url": { + "version": "3.0.2", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@iarna/toml": { + "version": "2.2.5", + "dev": true, + "license": "ISC" + }, + "node_modules/@istanbuljs/load-nyc-config": { + "version": "1.1.0", + "dev": true, + "license": "ISC", + "dependencies": { + "camelcase": "^5.3.1", + "find-up": "^4.1.0", + "get-package-type": "^0.1.0", + "js-yaml": "^3.13.1", + "resolve-from": "^5.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/@istanbuljs/load-nyc-config/node_modules/camelcase": { + "version": "5.3.1", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/@istanbuljs/schema": { + "version": "0.1.3", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/@jridgewell/gen-mapping": { + "version": "0.1.1", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/set-array": "^1.0.0", + "@jridgewell/sourcemap-codec": "^1.4.10" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/resolve-uri": { + "version": "3.1.0", + "license": "MIT", + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/set-array": { + "version": "1.1.2", + "license": "MIT", + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/source-map": { + "version": "0.3.5", + "license": "MIT", + "dependencies": { + "@jridgewell/gen-mapping": "^0.3.0", + "@jridgewell/trace-mapping": "^0.3.9" + } + }, + "node_modules/@jridgewell/source-map/node_modules/@jridgewell/gen-mapping": { + "version": "0.3.3", + "license": "MIT", + "dependencies": { + "@jridgewell/set-array": "^1.0.1", + "@jridgewell/sourcemap-codec": "^1.4.10", + "@jridgewell/trace-mapping": "^0.3.9" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/sourcemap-codec": { + "version": "1.4.15", + "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.15.tgz", + "integrity": "sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg==" + }, + "node_modules/@jridgewell/trace-mapping": { + "version": "0.3.9", + "license": "MIT", + "dependencies": { + "@jridgewell/resolve-uri": "^3.0.3", + "@jridgewell/sourcemap-codec": "^1.4.10" + } + }, + "node_modules/@koa/cors": { + "version": "3.4.3", + "dev": true, + "license": "MIT", + "dependencies": { + "vary": "^1.1.2" + }, + "engines": { + "node": ">= 8.0.0" + } + }, + "node_modules/@koa/router": { + "version": "12.0.0", + "dev": true, + "license": "MIT", + "dependencies": { + "http-errors": "^2.0.0", + "koa-compose": "^4.1.0", + "methods": "^1.1.2", + "path-to-regexp": "^6.2.1" + }, + "engines": { + "node": ">= 12" + } + }, + "node_modules/@lit-examples/nextjs-v13": { + "resolved": "examples/nextjs-v13", "link": true }, "node_modules/@lit-examples/nextjs-v14": { @@ -3364,6 +4457,10 @@ "resolved": "examples/preact", "link": true }, + "node_modules/@lit-examples/redux": { + "resolved": "examples/redux", + "link": true + }, "node_modules/@lit-internal/benchmarks": { "resolved": "packages/benchmarks", "link": true @@ -4728,7 +5825,6 @@ "version": "2.2.1", "resolved": "https://registry.npmjs.org/@reduxjs/toolkit/-/toolkit-2.2.1.tgz", "integrity": "sha512-8CREoqJovQW/5I4yvvijm/emUiCCmcs4Ev4XPWd4mizSO+dD3g5G6w34QK5AGeNrSH7qM8Fl66j4vuV7dpOdkw==", - "peer": true, "dependencies": { "immer": "^10.0.3", "redux": "^5.0.1", @@ -12489,629 +13585,965 @@ "node": ">= 0.8.0" } }, - "node_modules/ecc-jsbn": { - "version": "0.1.2", + "node_modules/ecc-jsbn": { + "version": "0.1.2", + "dev": true, + "license": "MIT", + "dependencies": { + "jsbn": "~0.1.0", + "safer-buffer": "^2.1.0" + } + }, + "node_modules/ecdsa-sig-formatter": { + "version": "1.0.11", + "license": "Apache-2.0", + "dependencies": { + "safe-buffer": "^5.0.1" + } + }, + "node_modules/edge-paths": { + "version": "2.2.1", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/which": "^1.3.2", + "which": "^2.0.2" + } + }, + "node_modules/editorconfig": { + "version": "0.15.3", + "dev": true, + "license": "MIT", + "dependencies": { + "commander": "^2.19.0", + "lru-cache": "^4.1.5", + "semver": "^5.6.0", + "sigmund": "^1.0.1" + }, + "bin": { + "editorconfig": "bin/editorconfig" + } + }, + "node_modules/editorconfig/node_modules/commander": { + "version": "2.20.3", + "dev": true, + "license": "MIT" + }, + "node_modules/editorconfig/node_modules/lru-cache": { + "version": "4.1.5", + "dev": true, + "license": "ISC", + "dependencies": { + "pseudomap": "^1.0.2", + "yallist": "^2.1.2" + } + }, + "node_modules/editorconfig/node_modules/semver": { + "version": "5.7.2", + "dev": true, + "license": "ISC", + "bin": { + "semver": "bin/semver" + } + }, + "node_modules/editorconfig/node_modules/yallist": { + "version": "2.1.2", + "dev": true, + "license": "ISC" + }, + "node_modules/ee-first": { + "version": "1.1.1", + "license": "MIT" + }, + "node_modules/ejs": { + "version": "3.1.8", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "jake": "^10.8.5" + }, + "bin": { + "ejs": "bin/cli.js" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/electron-to-chromium": { + "version": "1.4.501", + "license": "ISC" + }, + "node_modules/emoji-regex": { + "version": "9.2.2", + "license": "MIT" + }, + "node_modules/encodeurl": { + "version": "1.0.2", + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/end-of-stream": { + "version": "1.4.4", + "license": "MIT", + "dependencies": { + "once": "^1.4.0" + } + }, + "node_modules/engine.io": { + "version": "3.6.1", + "dev": true, + "license": "MIT", + "dependencies": { + "accepts": "~1.3.4", + "base64id": "2.0.0", + "cookie": "~0.4.1", + "debug": "~4.1.0", + "engine.io-parser": "~2.2.0", + "ws": "~7.4.2" + }, + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/engine.io-client": { + "version": "3.5.3", + "dev": true, + "license": "MIT", + "dependencies": { + "component-emitter": "~1.3.0", + "component-inherit": "0.0.3", + "debug": "~3.1.0", + "engine.io-parser": "~2.2.0", + "has-cors": "1.1.0", + "indexof": "0.0.1", + "parseqs": "0.0.6", + "parseuri": "0.0.6", + "ws": "~7.4.2", + "xmlhttprequest-ssl": "~1.6.2", + "yeast": "0.1.2" + } + }, + "node_modules/engine.io-client/node_modules/debug": { + "version": "3.1.0", + "dev": true, + "license": "MIT", + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/engine.io-client/node_modules/ms": { + "version": "2.0.0", + "dev": true, + "license": "MIT" + }, + "node_modules/engine.io-parser": { + "version": "2.2.1", "dev": true, "license": "MIT", "dependencies": { - "jsbn": "~0.1.0", - "safer-buffer": "^2.1.0" + "after": "0.8.2", + "arraybuffer.slice": "~0.0.7", + "base64-arraybuffer": "0.1.4", + "blob": "0.0.5", + "has-binary2": "~1.0.2" } }, - "node_modules/ecdsa-sig-formatter": { - "version": "1.0.11", - "license": "Apache-2.0", + "node_modules/engine.io/node_modules/debug": { + "version": "4.1.1", + "dev": true, + "license": "MIT", "dependencies": { - "safe-buffer": "^5.0.1" + "ms": "^2.1.1" } }, - "node_modules/edge-paths": { - "version": "2.2.1", - "dev": true, + "node_modules/enhanced-resolve": { + "version": "5.12.0", "license": "MIT", "dependencies": { - "@types/which": "^1.3.2", - "which": "^2.0.2" + "graceful-fs": "^4.2.4", + "tapable": "^2.2.0" + }, + "engines": { + "node": ">=10.13.0" } }, - "node_modules/editorconfig": { - "version": "0.15.3", + "node_modules/enquirer": { + "version": "2.3.6", "dev": true, "license": "MIT", "dependencies": { - "commander": "^2.19.0", - "lru-cache": "^4.1.5", - "semver": "^5.6.0", - "sigmund": "^1.0.1" + "ansi-colors": "^4.1.1" }, - "bin": { - "editorconfig": "bin/editorconfig" + "engines": { + "node": ">=8.6" } }, - "node_modules/editorconfig/node_modules/commander": { - "version": "2.20.3", + "node_modules/ent": { + "version": "2.2.0", "dev": true, "license": "MIT" }, - "node_modules/editorconfig/node_modules/lru-cache": { - "version": "4.1.5", - "dev": true, - "license": "ISC", - "dependencies": { - "pseudomap": "^1.0.2", - "yallist": "^2.1.2" + "node_modules/entities": { + "version": "4.5.0", + "license": "BSD-2-Clause", + "engines": { + "node": ">=0.12" + }, + "funding": { + "url": "https://github.com/fb55/entities?sponsor=1" } }, - "node_modules/editorconfig/node_modules/semver": { - "version": "5.7.2", + "node_modules/errno": { + "version": "0.1.8", "dev": true, - "license": "ISC", + "license": "MIT", + "dependencies": { + "prr": "~1.0.1" + }, "bin": { - "semver": "bin/semver" + "errno": "cli.js" } }, - "node_modules/editorconfig/node_modules/yallist": { - "version": "2.1.2", + "node_modules/error-ex": { + "version": "1.3.2", "dev": true, - "license": "ISC" + "license": "MIT", + "dependencies": { + "is-arrayish": "^0.2.1" + } }, - "node_modules/ee-first": { - "version": "1.1.1", + "node_modules/errorstacks": { + "version": "2.4.0", "license": "MIT" }, - "node_modules/ejs": { - "version": "3.1.8", - "dev": true, - "license": "Apache-2.0", + "node_modules/es-abstract": { + "version": "1.22.1", + "license": "MIT", "dependencies": { - "jake": "^10.8.5" - }, - "bin": { - "ejs": "bin/cli.js" + "array-buffer-byte-length": "^1.0.0", + "arraybuffer.prototype.slice": "^1.0.1", + "available-typed-arrays": "^1.0.5", + "call-bind": "^1.0.2", + "es-set-tostringtag": "^2.0.1", + "es-to-primitive": "^1.2.1", + "function.prototype.name": "^1.1.5", + "get-intrinsic": "^1.2.1", + "get-symbol-description": "^1.0.0", + "globalthis": "^1.0.3", + "gopd": "^1.0.1", + "has": "^1.0.3", + "has-property-descriptors": "^1.0.0", + "has-proto": "^1.0.1", + "has-symbols": "^1.0.3", + "internal-slot": "^1.0.5", + "is-array-buffer": "^3.0.2", + "is-callable": "^1.2.7", + "is-negative-zero": "^2.0.2", + "is-regex": "^1.1.4", + "is-shared-array-buffer": "^1.0.2", + "is-string": "^1.0.7", + "is-typed-array": "^1.1.10", + "is-weakref": "^1.0.2", + "object-inspect": "^1.12.3", + "object-keys": "^1.1.1", + "object.assign": "^4.1.4", + "regexp.prototype.flags": "^1.5.0", + "safe-array-concat": "^1.0.0", + "safe-regex-test": "^1.0.0", + "string.prototype.trim": "^1.2.7", + "string.prototype.trimend": "^1.0.6", + "string.prototype.trimstart": "^1.0.6", + "typed-array-buffer": "^1.0.0", + "typed-array-byte-length": "^1.0.0", + "typed-array-byte-offset": "^1.0.0", + "typed-array-length": "^1.0.4", + "unbox-primitive": "^1.0.2", + "which-typed-array": "^1.1.10" }, "engines": { - "node": ">=0.10.0" + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/electron-to-chromium": { - "version": "1.4.501", - "license": "ISC" - }, - "node_modules/emoji-regex": { - "version": "9.2.2", + "node_modules/es-array-method-boxes-properly": { + "version": "1.0.0", + "dev": true, "license": "MIT" }, - "node_modules/encodeurl": { - "version": "1.0.2", + "node_modules/es-dev-server": { + "version": "1.60.2", + "dev": true, "license": "MIT", + "dependencies": { + "@babel/core": "^7.11.1", + "@babel/plugin-proposal-dynamic-import": "^7.10.4", + "@babel/plugin-proposal-nullish-coalescing-operator": "^7.10.4", + "@babel/plugin-proposal-optional-chaining": "^7.11.0", + "@babel/plugin-syntax-class-properties": "^7.8.3", + "@babel/plugin-syntax-import-meta": "^7.10.4", + "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.3", + "@babel/plugin-syntax-numeric-separator": "^7.8.3", + "@babel/plugin-syntax-optional-chaining": "^7.8.3", + "@babel/plugin-transform-template-literals": "^7.8.3", + "@babel/preset-env": "^7.9.0", + "@koa/cors": "^3.1.0", + "@open-wc/building-utils": "^2.18.3", + "@rollup/plugin-node-resolve": "^7.1.1", + "@rollup/pluginutils": "^3.0.0", + "@types/babel__core": "^7.1.3", + "@types/browserslist": "^4.8.0", + "@types/browserslist-useragent": "^3.0.0", + "@types/caniuse-api": "^3.0.0", + "@types/command-line-args": "^5.0.0", + "@types/command-line-usage": "^5.0.1", + "@types/debounce": "^1.2.0", + "@types/koa": "^2.0.48", + "@types/koa__cors": "^3.0.1", + "@types/koa-compress": "^2.0.9", + "@types/koa-etag": "^3.0.0", + "@types/koa-static": "^4.0.1", + "@types/lru-cache": "^5.1.0", + "@types/mime-types": "^2.1.0", + "@types/minimatch": "^3.0.3", + "@types/path-is-inside": "^1.0.0", + "@types/whatwg-url": "^6.4.0", + "browserslist": "^4.9.1", + "browserslist-useragent": "^3.0.2", + "builtin-modules": "^3.1.0", + "camelcase": "^5.3.1", + "caniuse-api": "^3.0.0", + "caniuse-lite": "^1.0.30001033", + "chokidar": "^3.0.0", + "command-line-args": "^5.0.2", + "command-line-usage": "^6.1.0", + "debounce": "^1.2.0", + "deepmerge": "^4.2.2", + "es-module-lexer": "^0.3.13", + "get-stream": "^5.1.0", + "is-stream": "^2.0.0", + "isbinaryfile": "^4.0.2", + "koa": "^2.7.0", + "koa-compress": "^3.0.0", + "koa-etag": "^3.0.0", + "koa-static": "^5.0.0", + "lru-cache": "^5.1.1", + "mime-types": "^2.1.27", + "minimatch": "^3.0.4", + "open": "^7.0.3", + "parse5": "^5.1.1", + "path-is-inside": "^1.0.2", + "polyfills-loader": "^1.7.4", + "portfinder": "^1.0.21", + "rollup": "^2.7.2", + "strip-ansi": "^5.2.0", + "systemjs": "^6.3.1", + "tslib": "^1.11.1", + "useragent": "^2.3.0", + "whatwg-url": "^7.0.0" + }, + "bin": { + "es-dev-server": "dist/cli.js" + }, "engines": { - "node": ">= 0.8" + "node": ">=0.10.0" } }, - "node_modules/end-of-stream": { - "version": "1.4.4", + "node_modules/es-dev-server/node_modules/@rollup/plugin-node-resolve": { + "version": "7.1.3", + "dev": true, "license": "MIT", "dependencies": { - "once": "^1.4.0" + "@rollup/pluginutils": "^3.0.8", + "@types/resolve": "0.0.8", + "builtin-modules": "^3.1.0", + "is-module": "^1.0.0", + "resolve": "^1.14.2" + }, + "engines": { + "node": ">= 8.0.0" + }, + "peerDependencies": { + "rollup": "^1.20.0||^2.0.0" } }, - "node_modules/engine.io": { - "version": "3.6.1", + "node_modules/es-dev-server/node_modules/@rollup/pluginutils": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/@rollup/pluginutils/-/pluginutils-3.1.0.tgz", + "integrity": "sha512-GksZ6pr6TpIjHm8h9lSQ8pi8BE9VeubNT0OMJ3B5uZJ8pz73NPiqOtCog/x2/QzM1ENChPKxMDhiQuRHsqc+lg==", "dev": true, - "license": "MIT", "dependencies": { - "accepts": "~1.3.4", - "base64id": "2.0.0", - "cookie": "~0.4.1", - "debug": "~4.1.0", - "engine.io-parser": "~2.2.0", - "ws": "~7.4.2" + "@types/estree": "0.0.39", + "estree-walker": "^1.0.1", + "picomatch": "^2.2.2" }, "engines": { - "node": ">=8.0.0" + "node": ">= 8.0.0" + }, + "peerDependencies": { + "rollup": "^1.20.0||^2.0.0" } }, - "node_modules/engine.io-client": { - "version": "3.5.3", + "node_modules/es-dev-server/node_modules/@types/estree": { + "version": "0.0.39", + "resolved": "https://registry.npmjs.org/@types/estree/-/estree-0.0.39.tgz", + "integrity": "sha512-EYNwp3bU+98cpU4lAWYYL7Zz+2gryWH1qbdDTidVd6hkiR6weksdbMadyXKXNPEkQFhXM+hVO9ZygomHXp+AIw==", + "dev": true + }, + "node_modules/es-dev-server/node_modules/@types/resolve": { + "version": "0.0.8", "dev": true, "license": "MIT", "dependencies": { - "component-emitter": "~1.3.0", - "component-inherit": "0.0.3", - "debug": "~3.1.0", - "engine.io-parser": "~2.2.0", - "has-cors": "1.1.0", - "indexof": "0.0.1", - "parseqs": "0.0.6", - "parseuri": "0.0.6", - "ws": "~7.4.2", - "xmlhttprequest-ssl": "~1.6.2", - "yeast": "0.1.2" + "@types/node": "*" } }, - "node_modules/engine.io-client/node_modules/debug": { - "version": "3.1.0", + "node_modules/es-dev-server/node_modules/camelcase": { + "version": "5.3.1", "dev": true, "license": "MIT", - "dependencies": { - "ms": "2.0.0" + "engines": { + "node": ">=6" } }, - "node_modules/engine.io-client/node_modules/ms": { - "version": "2.0.0", + "node_modules/es-dev-server/node_modules/es-module-lexer": { + "version": "0.3.26", "dev": true, "license": "MIT" }, - "node_modules/engine.io-parser": { - "version": "2.2.1", - "dev": true, - "license": "MIT", - "dependencies": { - "after": "0.8.2", - "arraybuffer.slice": "~0.0.7", - "base64-arraybuffer": "0.1.4", - "blob": "0.0.5", - "has-binary2": "~1.0.2" - } + "node_modules/es-dev-server/node_modules/estree-walker": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-1.0.1.tgz", + "integrity": "sha512-1fMXF3YP4pZZVozF8j/ZLfvnR8NSIljt56UhbZ5PeeDmmGHpgpdwQt7ITlGvYaQukCvuBRMLEiKiYC+oeIg4cg==", + "dev": true }, - "node_modules/engine.io/node_modules/debug": { - "version": "4.1.1", + "node_modules/es-dev-server/node_modules/get-stream": { + "version": "5.2.0", "dev": true, "license": "MIT", "dependencies": { - "ms": "^2.1.1" + "pump": "^3.0.0" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/enhanced-resolve": { - "version": "5.12.0", + "node_modules/es-dev-server/node_modules/koa-etag": { + "version": "3.0.0", + "dev": true, "license": "MIT", "dependencies": { - "graceful-fs": "^4.2.4", - "tapable": "^2.2.0" - }, - "engines": { - "node": ">=10.13.0" + "etag": "^1.3.0", + "mz": "^2.1.0" } }, - "node_modules/enquirer": { - "version": "2.3.6", + "node_modules/es-dev-server/node_modules/open": { + "version": "7.4.2", "dev": true, "license": "MIT", "dependencies": { - "ansi-colors": "^4.1.1" + "is-docker": "^2.0.0", + "is-wsl": "^2.1.1" }, "engines": { - "node": ">=8.6" + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/ent": { - "version": "2.2.0", + "node_modules/es-dev-server/node_modules/parse5": { + "version": "5.1.1", "dev": true, "license": "MIT" }, - "node_modules/entities": { - "version": "4.5.0", - "license": "BSD-2-Clause", + "node_modules/es-dev-server/node_modules/rollup": { + "version": "2.79.1", + "resolved": "https://registry.npmjs.org/rollup/-/rollup-2.79.1.tgz", + "integrity": "sha512-uKxbd0IhMZOhjAiD5oAFp7BqvkA4Dv47qpOCtaNvng4HBwdbWtdOh8f5nZNuk2rp51PMGk3bzfWu5oayNEuYnw==", + "dev": true, + "bin": { + "rollup": "dist/bin/rollup" + }, "engines": { - "node": ">=0.12" + "node": ">=10.0.0" }, - "funding": { - "url": "https://github.com/fb55/entities?sponsor=1" + "optionalDependencies": { + "fsevents": "~2.3.2" } }, - "node_modules/errno": { - "version": "0.1.8", + "node_modules/es-dev-server/node_modules/tslib": { + "version": "1.14.1", "dev": true, - "license": "MIT", - "dependencies": { - "prr": "~1.0.1" - }, - "bin": { - "errno": "cli.js" - } + "license": "0BSD" }, - "node_modules/error-ex": { - "version": "1.3.2", - "dev": true, + "node_modules/es-get-iterator": { + "version": "1.1.3", "license": "MIT", "dependencies": { - "is-arrayish": "^0.2.1" + "call-bind": "^1.0.2", + "get-intrinsic": "^1.1.3", + "has-symbols": "^1.0.3", + "is-arguments": "^1.1.1", + "is-map": "^2.0.2", + "is-set": "^2.0.2", + "is-string": "^1.0.7", + "isarray": "^2.0.5", + "stop-iteration-iterator": "^1.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/errorstacks": { - "version": "2.4.0", + "node_modules/es-get-iterator/node_modules/isarray": { + "version": "2.0.5", "license": "MIT" }, - "node_modules/es-abstract": { - "version": "1.22.1", + "node_modules/es-iterator-helpers": { + "version": "1.0.14", "license": "MIT", "dependencies": { - "array-buffer-byte-length": "^1.0.0", - "arraybuffer.prototype.slice": "^1.0.1", - "available-typed-arrays": "^1.0.5", + "asynciterator.prototype": "^1.0.0", "call-bind": "^1.0.2", + "define-properties": "^1.2.0", + "es-abstract": "^1.22.1", "es-set-tostringtag": "^2.0.1", - "es-to-primitive": "^1.2.1", - "function.prototype.name": "^1.1.5", + "function-bind": "^1.1.1", "get-intrinsic": "^1.2.1", - "get-symbol-description": "^1.0.0", "globalthis": "^1.0.3", - "gopd": "^1.0.1", - "has": "^1.0.3", "has-property-descriptors": "^1.0.0", "has-proto": "^1.0.1", "has-symbols": "^1.0.3", "internal-slot": "^1.0.5", - "is-array-buffer": "^3.0.2", - "is-callable": "^1.2.7", - "is-negative-zero": "^2.0.2", - "is-regex": "^1.1.4", - "is-shared-array-buffer": "^1.0.2", - "is-string": "^1.0.7", - "is-typed-array": "^1.1.10", - "is-weakref": "^1.0.2", - "object-inspect": "^1.12.3", - "object-keys": "^1.1.1", - "object.assign": "^4.1.4", - "regexp.prototype.flags": "^1.5.0", - "safe-array-concat": "^1.0.0", - "safe-regex-test": "^1.0.0", - "string.prototype.trim": "^1.2.7", - "string.prototype.trimend": "^1.0.6", - "string.prototype.trimstart": "^1.0.6", - "typed-array-buffer": "^1.0.0", - "typed-array-byte-length": "^1.0.0", - "typed-array-byte-offset": "^1.0.0", - "typed-array-length": "^1.0.4", - "unbox-primitive": "^1.0.2", - "which-typed-array": "^1.1.10" + "iterator.prototype": "^1.1.0", + "safe-array-concat": "^1.0.0" + } + }, + "node_modules/es-module-lexer": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-1.4.1.tgz", + "integrity": "sha512-cXLGjP0c4T3flZJKQSuziYoq7MlT+rnvfZjfp7h+I7K9BNX54kP9nyWvdbwjQ4u1iWbOL4u96fgeZLToQlZC7w==" + }, + "node_modules/es-module-shims": { + "version": "1.8.2", + "resolved": "https://registry.npmjs.org/es-module-shims/-/es-module-shims-1.8.2.tgz", + "integrity": "sha512-7vIYVzpOhXtpc3Yn03itB+GSgVZFW7oL4kdydA+iL+IEi7HiSLBUxM05QFw4SxTl6e++pMpGqZPo2+vdNs3TbA==", + "dev": true + }, + "node_modules/es-set-tostringtag": { + "version": "2.0.1", + "license": "MIT", + "dependencies": { + "get-intrinsic": "^1.1.3", + "has": "^1.0.3", + "has-tostringtag": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-shim-unscopables": { + "version": "1.0.0", + "license": "MIT", + "dependencies": { + "has": "^1.0.3" + } + }, + "node_modules/es-to-primitive": { + "version": "1.2.1", + "license": "MIT", + "dependencies": { + "is-callable": "^1.1.4", + "is-date-object": "^1.0.1", + "is-symbol": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/es6-error": { + "version": "4.1.1", + "dev": true, + "license": "MIT" + }, + "node_modules/esbuild": { + "version": "0.14.54", + "dev": true, + "hasInstallScript": true, + "license": "MIT", + "bin": { + "esbuild": "bin/esbuild" }, "engines": { - "node": ">= 0.4" + "node": ">=12" }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "optionalDependencies": { + "@esbuild/linux-loong64": "0.14.54", + "esbuild-android-64": "0.14.54", + "esbuild-android-arm64": "0.14.54", + "esbuild-darwin-64": "0.14.54", + "esbuild-darwin-arm64": "0.14.54", + "esbuild-freebsd-64": "0.14.54", + "esbuild-freebsd-arm64": "0.14.54", + "esbuild-linux-32": "0.14.54", + "esbuild-linux-64": "0.14.54", + "esbuild-linux-arm": "0.14.54", + "esbuild-linux-arm64": "0.14.54", + "esbuild-linux-mips64le": "0.14.54", + "esbuild-linux-ppc64le": "0.14.54", + "esbuild-linux-riscv64": "0.14.54", + "esbuild-linux-s390x": "0.14.54", + "esbuild-netbsd-64": "0.14.54", + "esbuild-openbsd-64": "0.14.54", + "esbuild-sunos-64": "0.14.54", + "esbuild-windows-32": "0.14.54", + "esbuild-windows-64": "0.14.54", + "esbuild-windows-arm64": "0.14.54" } }, - "node_modules/es-array-method-boxes-properly": { - "version": "1.0.0", + "node_modules/esbuild-android-64": { + "version": "0.14.54", + "resolved": "https://registry.npmjs.org/esbuild-android-64/-/esbuild-android-64-0.14.54.tgz", + "integrity": "sha512-Tz2++Aqqz0rJ7kYBfz+iqyE3QMycD4vk7LBRyWaAVFgFtQ/O8EJOnVmTOiDWYZ/uYzB4kvP+bqejYdVKzE5lAQ==", + "cpu": [ + "x64" + ], "dev": true, - "license": "MIT" + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=12" + } }, - "node_modules/es-dev-server": { - "version": "1.60.2", + "node_modules/esbuild-android-arm64": { + "version": "0.14.54", + "resolved": "https://registry.npmjs.org/esbuild-android-arm64/-/esbuild-android-arm64-0.14.54.tgz", + "integrity": "sha512-F9E+/QDi9sSkLaClO8SOV6etqPd+5DgJje1F9lOWoNncDdOBL2YF59IhsWATSt0TLZbYCf3pNlTHvVV5VfHdvg==", + "cpu": [ + "arm64" + ], "dev": true, - "license": "MIT", - "dependencies": { - "@babel/core": "^7.11.1", - "@babel/plugin-proposal-dynamic-import": "^7.10.4", - "@babel/plugin-proposal-nullish-coalescing-operator": "^7.10.4", - "@babel/plugin-proposal-optional-chaining": "^7.11.0", - "@babel/plugin-syntax-class-properties": "^7.8.3", - "@babel/plugin-syntax-import-meta": "^7.10.4", - "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.3", - "@babel/plugin-syntax-numeric-separator": "^7.8.3", - "@babel/plugin-syntax-optional-chaining": "^7.8.3", - "@babel/plugin-transform-template-literals": "^7.8.3", - "@babel/preset-env": "^7.9.0", - "@koa/cors": "^3.1.0", - "@open-wc/building-utils": "^2.18.3", - "@rollup/plugin-node-resolve": "^7.1.1", - "@rollup/pluginutils": "^3.0.0", - "@types/babel__core": "^7.1.3", - "@types/browserslist": "^4.8.0", - "@types/browserslist-useragent": "^3.0.0", - "@types/caniuse-api": "^3.0.0", - "@types/command-line-args": "^5.0.0", - "@types/command-line-usage": "^5.0.1", - "@types/debounce": "^1.2.0", - "@types/koa": "^2.0.48", - "@types/koa__cors": "^3.0.1", - "@types/koa-compress": "^2.0.9", - "@types/koa-etag": "^3.0.0", - "@types/koa-static": "^4.0.1", - "@types/lru-cache": "^5.1.0", - "@types/mime-types": "^2.1.0", - "@types/minimatch": "^3.0.3", - "@types/path-is-inside": "^1.0.0", - "@types/whatwg-url": "^6.4.0", - "browserslist": "^4.9.1", - "browserslist-useragent": "^3.0.2", - "builtin-modules": "^3.1.0", - "camelcase": "^5.3.1", - "caniuse-api": "^3.0.0", - "caniuse-lite": "^1.0.30001033", - "chokidar": "^3.0.0", - "command-line-args": "^5.0.2", - "command-line-usage": "^6.1.0", - "debounce": "^1.2.0", - "deepmerge": "^4.2.2", - "es-module-lexer": "^0.3.13", - "get-stream": "^5.1.0", - "is-stream": "^2.0.0", - "isbinaryfile": "^4.0.2", - "koa": "^2.7.0", - "koa-compress": "^3.0.0", - "koa-etag": "^3.0.0", - "koa-static": "^5.0.0", - "lru-cache": "^5.1.1", - "mime-types": "^2.1.27", - "minimatch": "^3.0.4", - "open": "^7.0.3", - "parse5": "^5.1.1", - "path-is-inside": "^1.0.2", - "polyfills-loader": "^1.7.4", - "portfinder": "^1.0.21", - "rollup": "^2.7.2", - "strip-ansi": "^5.2.0", - "systemjs": "^6.3.1", - "tslib": "^1.11.1", - "useragent": "^2.3.0", - "whatwg-url": "^7.0.0" - }, - "bin": { - "es-dev-server": "dist/cli.js" - }, + "optional": true, + "os": [ + "android" + ], "engines": { - "node": ">=0.10.0" + "node": ">=12" } }, - "node_modules/es-dev-server/node_modules/@rollup/plugin-node-resolve": { - "version": "7.1.3", + "node_modules/esbuild-darwin-64": { + "version": "0.14.54", + "resolved": "https://registry.npmjs.org/esbuild-darwin-64/-/esbuild-darwin-64-0.14.54.tgz", + "integrity": "sha512-jtdKWV3nBviOd5v4hOpkVmpxsBy90CGzebpbO9beiqUYVMBtSc0AL9zGftFuBon7PNDcdvNCEuQqw2x0wP9yug==", + "cpu": [ + "x64" + ], "dev": true, - "license": "MIT", - "dependencies": { - "@rollup/pluginutils": "^3.0.8", - "@types/resolve": "0.0.8", - "builtin-modules": "^3.1.0", - "is-module": "^1.0.0", - "resolve": "^1.14.2" - }, + "optional": true, + "os": [ + "darwin" + ], "engines": { - "node": ">= 8.0.0" - }, - "peerDependencies": { - "rollup": "^1.20.0||^2.0.0" + "node": ">=12" } }, - "node_modules/es-dev-server/node_modules/@rollup/pluginutils": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/@rollup/pluginutils/-/pluginutils-3.1.0.tgz", - "integrity": "sha512-GksZ6pr6TpIjHm8h9lSQ8pi8BE9VeubNT0OMJ3B5uZJ8pz73NPiqOtCog/x2/QzM1ENChPKxMDhiQuRHsqc+lg==", + "node_modules/esbuild-darwin-arm64": { + "version": "0.14.54", + "resolved": "https://registry.npmjs.org/esbuild-darwin-arm64/-/esbuild-darwin-arm64-0.14.54.tgz", + "integrity": "sha512-OPafJHD2oUPyvJMrsCvDGkRrVCar5aVyHfWGQzY1dWnzErjrDuSETxwA2HSsyg2jORLY8yBfzc1MIpUkXlctmw==", + "cpu": [ + "arm64" + ], "dev": true, - "dependencies": { - "@types/estree": "0.0.39", - "estree-walker": "^1.0.1", - "picomatch": "^2.2.2" - }, + "optional": true, + "os": [ + "darwin" + ], "engines": { - "node": ">= 8.0.0" - }, - "peerDependencies": { - "rollup": "^1.20.0||^2.0.0" + "node": ">=12" } }, - "node_modules/es-dev-server/node_modules/@types/estree": { - "version": "0.0.39", - "resolved": "https://registry.npmjs.org/@types/estree/-/estree-0.0.39.tgz", - "integrity": "sha512-EYNwp3bU+98cpU4lAWYYL7Zz+2gryWH1qbdDTidVd6hkiR6weksdbMadyXKXNPEkQFhXM+hVO9ZygomHXp+AIw==", - "dev": true + "node_modules/esbuild-freebsd-64": { + "version": "0.14.54", + "resolved": "https://registry.npmjs.org/esbuild-freebsd-64/-/esbuild-freebsd-64-0.14.54.tgz", + "integrity": "sha512-OKwd4gmwHqOTp4mOGZKe/XUlbDJ4Q9TjX0hMPIDBUWWu/kwhBAudJdBoxnjNf9ocIB6GN6CPowYpR/hRCbSYAg==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=12" + } }, - "node_modules/es-dev-server/node_modules/@types/resolve": { - "version": "0.0.8", + "node_modules/esbuild-freebsd-arm64": { + "version": "0.14.54", + "resolved": "https://registry.npmjs.org/esbuild-freebsd-arm64/-/esbuild-freebsd-arm64-0.14.54.tgz", + "integrity": "sha512-sFwueGr7OvIFiQT6WeG0jRLjkjdqWWSrfbVwZp8iMP+8UHEHRBvlaxL6IuKNDwAozNUmbb8nIMXa7oAOARGs1Q==", + "cpu": [ + "arm64" + ], "dev": true, - "license": "MIT", - "dependencies": { - "@types/node": "*" + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=12" } }, - "node_modules/es-dev-server/node_modules/camelcase": { - "version": "5.3.1", + "node_modules/esbuild-linux-32": { + "version": "0.14.54", + "resolved": "https://registry.npmjs.org/esbuild-linux-32/-/esbuild-linux-32-0.14.54.tgz", + "integrity": "sha512-1ZuY+JDI//WmklKlBgJnglpUL1owm2OX+8E1syCD6UAxcMM/XoWd76OHSjl/0MR0LisSAXDqgjT3uJqT67O3qw==", + "cpu": [ + "ia32" + ], "dev": true, - "license": "MIT", + "optional": true, + "os": [ + "linux" + ], "engines": { - "node": ">=6" + "node": ">=12" } }, - "node_modules/es-dev-server/node_modules/es-module-lexer": { - "version": "0.3.26", + "node_modules/esbuild-linux-64": { + "version": "0.14.54", + "resolved": "https://registry.npmjs.org/esbuild-linux-64/-/esbuild-linux-64-0.14.54.tgz", + "integrity": "sha512-EgjAgH5HwTbtNsTqQOXWApBaPVdDn7XcK+/PtJwZLT1UmpLoznPd8c5CxqsH2dQK3j05YsB3L17T8vE7cp4cCg==", + "cpu": [ + "x64" + ], "dev": true, - "license": "MIT" + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } }, - "node_modules/es-dev-server/node_modules/estree-walker": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-1.0.1.tgz", - "integrity": "sha512-1fMXF3YP4pZZVozF8j/ZLfvnR8NSIljt56UhbZ5PeeDmmGHpgpdwQt7ITlGvYaQukCvuBRMLEiKiYC+oeIg4cg==", - "dev": true + "node_modules/esbuild-linux-arm": { + "version": "0.14.54", + "resolved": "https://registry.npmjs.org/esbuild-linux-arm/-/esbuild-linux-arm-0.14.54.tgz", + "integrity": "sha512-qqz/SjemQhVMTnvcLGoLOdFpCYbz4v4fUo+TfsWG+1aOu70/80RV6bgNpR2JCrppV2moUQkww+6bWxXRL9YMGw==", + "cpu": [ + "arm" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } }, - "node_modules/es-dev-server/node_modules/get-stream": { - "version": "5.2.0", + "node_modules/esbuild-linux-arm64": { + "version": "0.14.54", + "resolved": "https://registry.npmjs.org/esbuild-linux-arm64/-/esbuild-linux-arm64-0.14.54.tgz", + "integrity": "sha512-WL71L+0Rwv+Gv/HTmxTEmpv0UgmxYa5ftZILVi2QmZBgX3q7+tDeOQNqGtdXSdsL8TQi1vIaVFHUPDe0O0kdig==", + "cpu": [ + "arm64" + ], "dev": true, - "license": "MIT", - "dependencies": { - "pump": "^3.0.0" - }, + "optional": true, + "os": [ + "linux" + ], "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "node": ">=12" } }, - "node_modules/es-dev-server/node_modules/koa-etag": { - "version": "3.0.0", + "node_modules/esbuild-linux-mips64le": { + "version": "0.14.54", + "resolved": "https://registry.npmjs.org/esbuild-linux-mips64le/-/esbuild-linux-mips64le-0.14.54.tgz", + "integrity": "sha512-qTHGQB8D1etd0u1+sB6p0ikLKRVuCWhYQhAHRPkO+OF3I/iSlTKNNS0Lh2Oc0g0UFGguaFZZiPJdJey3AGpAlw==", + "cpu": [ + "mips64el" + ], "dev": true, - "license": "MIT", - "dependencies": { - "etag": "^1.3.0", - "mz": "^2.1.0" + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" } }, - "node_modules/es-dev-server/node_modules/open": { - "version": "7.4.2", + "node_modules/esbuild-linux-ppc64le": { + "version": "0.14.54", + "resolved": "https://registry.npmjs.org/esbuild-linux-ppc64le/-/esbuild-linux-ppc64le-0.14.54.tgz", + "integrity": "sha512-j3OMlzHiqwZBDPRCDFKcx595XVfOfOnv68Ax3U4UKZ3MTYQB5Yz3X1mn5GnodEVYzhtZgxEBidLWeIs8FDSfrQ==", + "cpu": [ + "ppc64" + ], "dev": true, - "license": "MIT", - "dependencies": { - "is-docker": "^2.0.0", - "is-wsl": "^2.1.1" - }, + "optional": true, + "os": [ + "linux" + ], "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "node": ">=12" } }, - "node_modules/es-dev-server/node_modules/parse5": { - "version": "5.1.1", + "node_modules/esbuild-linux-riscv64": { + "version": "0.14.54", + "resolved": "https://registry.npmjs.org/esbuild-linux-riscv64/-/esbuild-linux-riscv64-0.14.54.tgz", + "integrity": "sha512-y7Vt7Wl9dkOGZjxQZnDAqqn+XOqFD7IMWiewY5SPlNlzMX39ocPQlOaoxvT4FllA5viyV26/QzHtvTjVNOxHZg==", + "cpu": [ + "riscv64" + ], "dev": true, - "license": "MIT" + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } }, - "node_modules/es-dev-server/node_modules/rollup": { - "version": "2.79.1", - "resolved": "https://registry.npmjs.org/rollup/-/rollup-2.79.1.tgz", - "integrity": "sha512-uKxbd0IhMZOhjAiD5oAFp7BqvkA4Dv47qpOCtaNvng4HBwdbWtdOh8f5nZNuk2rp51PMGk3bzfWu5oayNEuYnw==", + "node_modules/esbuild-linux-s390x": { + "version": "0.14.54", + "resolved": "https://registry.npmjs.org/esbuild-linux-s390x/-/esbuild-linux-s390x-0.14.54.tgz", + "integrity": "sha512-zaHpW9dziAsi7lRcyV4r8dhfG1qBidQWUXweUjnw+lliChJqQr+6XD71K41oEIC3Mx1KStovEmlzm+MkGZHnHA==", + "cpu": [ + "s390x" + ], "dev": true, - "bin": { - "rollup": "dist/bin/rollup" - }, + "optional": true, + "os": [ + "linux" + ], "engines": { - "node": ">=10.0.0" - }, - "optionalDependencies": { - "fsevents": "~2.3.2" + "node": ">=12" } }, - "node_modules/es-dev-server/node_modules/tslib": { - "version": "1.14.1", + "node_modules/esbuild-netbsd-64": { + "version": "0.14.54", + "resolved": "https://registry.npmjs.org/esbuild-netbsd-64/-/esbuild-netbsd-64-0.14.54.tgz", + "integrity": "sha512-PR01lmIMnfJTgeU9VJTDY9ZerDWVFIUzAtJuDHwwceppW7cQWjBBqP48NdeRtoP04/AtO9a7w3viI+PIDr6d+w==", + "cpu": [ + "x64" + ], "dev": true, - "license": "0BSD" - }, - "node_modules/es-get-iterator": { - "version": "1.1.3", - "license": "MIT", - "dependencies": { - "call-bind": "^1.0.2", - "get-intrinsic": "^1.1.3", - "has-symbols": "^1.0.3", - "is-arguments": "^1.1.1", - "is-map": "^2.0.2", - "is-set": "^2.0.2", - "is-string": "^1.0.7", - "isarray": "^2.0.5", - "stop-iteration-iterator": "^1.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "optional": true, + "os": [ + "netbsd" + ], + "engines": { + "node": ">=12" } }, - "node_modules/es-get-iterator/node_modules/isarray": { - "version": "2.0.5", - "license": "MIT" - }, - "node_modules/es-iterator-helpers": { - "version": "1.0.14", - "license": "MIT", - "dependencies": { - "asynciterator.prototype": "^1.0.0", - "call-bind": "^1.0.2", - "define-properties": "^1.2.0", - "es-abstract": "^1.22.1", - "es-set-tostringtag": "^2.0.1", - "function-bind": "^1.1.1", - "get-intrinsic": "^1.2.1", - "globalthis": "^1.0.3", - "has-property-descriptors": "^1.0.0", - "has-proto": "^1.0.1", - "has-symbols": "^1.0.3", - "internal-slot": "^1.0.5", - "iterator.prototype": "^1.1.0", - "safe-array-concat": "^1.0.0" + "node_modules/esbuild-openbsd-64": { + "version": "0.14.54", + "resolved": "https://registry.npmjs.org/esbuild-openbsd-64/-/esbuild-openbsd-64-0.14.54.tgz", + "integrity": "sha512-Qyk7ikT2o7Wu76UsvvDS5q0amJvmRzDyVlL0qf5VLsLchjCa1+IAvd8kTBgUxD7VBUUVgItLkk609ZHUc1oCaw==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "openbsd" + ], + "engines": { + "node": ">=12" } }, - "node_modules/es-module-lexer": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-1.4.1.tgz", - "integrity": "sha512-cXLGjP0c4T3flZJKQSuziYoq7MlT+rnvfZjfp7h+I7K9BNX54kP9nyWvdbwjQ4u1iWbOL4u96fgeZLToQlZC7w==" - }, - "node_modules/es-module-shims": { - "version": "1.8.2", - "resolved": "https://registry.npmjs.org/es-module-shims/-/es-module-shims-1.8.2.tgz", - "integrity": "sha512-7vIYVzpOhXtpc3Yn03itB+GSgVZFW7oL4kdydA+iL+IEi7HiSLBUxM05QFw4SxTl6e++pMpGqZPo2+vdNs3TbA==", - "dev": true - }, - "node_modules/es-set-tostringtag": { - "version": "2.0.1", - "license": "MIT", - "dependencies": { - "get-intrinsic": "^1.1.3", - "has": "^1.0.3", - "has-tostringtag": "^1.0.0" - }, + "node_modules/esbuild-sunos-64": { + "version": "0.14.54", + "resolved": "https://registry.npmjs.org/esbuild-sunos-64/-/esbuild-sunos-64-0.14.54.tgz", + "integrity": "sha512-28GZ24KmMSeKi5ueWzMcco6EBHStL3B6ubM7M51RmPwXQGLe0teBGJocmWhgwccA1GeFXqxzILIxXpHbl9Q/Kw==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "sunos" + ], "engines": { - "node": ">= 0.4" + "node": ">=12" } }, - "node_modules/es-shim-unscopables": { - "version": "1.0.0", - "license": "MIT", - "dependencies": { - "has": "^1.0.3" + "node_modules/esbuild-windows-32": { + "version": "0.14.54", + "resolved": "https://registry.npmjs.org/esbuild-windows-32/-/esbuild-windows-32-0.14.54.tgz", + "integrity": "sha512-T+rdZW19ql9MjS7pixmZYVObd9G7kcaZo+sETqNH4RCkuuYSuv9AGHUVnPoP9hhuE1WM1ZimHz1CIBHBboLU7w==", + "cpu": [ + "ia32" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=12" } }, - "node_modules/es-to-primitive": { - "version": "1.2.1", - "license": "MIT", - "dependencies": { - "is-callable": "^1.1.4", - "is-date-object": "^1.0.1", - "is-symbol": "^1.0.2" - }, + "node_modules/esbuild-windows-64": { + "version": "0.14.54", + "resolved": "https://registry.npmjs.org/esbuild-windows-64/-/esbuild-windows-64-0.14.54.tgz", + "integrity": "sha512-AoHTRBUuYwXtZhjXZbA1pGfTo8cJo3vZIcWGLiUcTNgHpJJMC1rVA44ZereBHMJtotyN71S8Qw0npiCIkW96cQ==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ], "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "node": ">=12" } }, - "node_modules/es6-error": { - "version": "4.1.1", + "node_modules/esbuild-windows-arm64": { + "version": "0.14.54", + "resolved": "https://registry.npmjs.org/esbuild-windows-arm64/-/esbuild-windows-arm64-0.14.54.tgz", + "integrity": "sha512-M0kuUvXhot1zOISQGXwWn6YtS+Y/1RT9WrVIOywZnJHo3jCDyewAc79aKNQWFCQm+xNHVTq9h8dZKvygoXQQRg==", + "cpu": [ + "arm64" + ], "dev": true, - "license": "MIT" + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=12" + } }, - "node_modules/esbuild": { + "node_modules/esbuild/node_modules/@esbuild/linux-loong64": { "version": "0.14.54", + "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.14.54.tgz", + "integrity": "sha512-bZBrLAIX1kpWelV0XemxBZllyRmM6vgFQQG2GdNb+r3Fkp0FOh1NJSvekXDs7jq70k4euu1cryLMfU+mTXlEpw==", + "cpu": [ + "loong64" + ], "dev": true, - "hasInstallScript": true, - "license": "MIT", - "bin": { - "esbuild": "bin/esbuild" - }, + "optional": true, + "os": [ + "linux" + ], "engines": { "node": ">=12" - }, - "optionalDependencies": { - "@esbuild/linux-loong64": "0.14.54", - "esbuild-android-64": "0.14.54", - "esbuild-android-arm64": "0.14.54", - "esbuild-darwin-64": "0.14.54", - "esbuild-darwin-arm64": "0.14.54", - "esbuild-freebsd-64": "0.14.54", - "esbuild-freebsd-arm64": "0.14.54", - "esbuild-linux-32": "0.14.54", - "esbuild-linux-64": "0.14.54", - "esbuild-linux-arm": "0.14.54", - "esbuild-linux-arm64": "0.14.54", - "esbuild-linux-mips64le": "0.14.54", - "esbuild-linux-ppc64le": "0.14.54", - "esbuild-linux-riscv64": "0.14.54", - "esbuild-linux-s390x": "0.14.54", - "esbuild-netbsd-64": "0.14.54", - "esbuild-openbsd-64": "0.14.54", - "esbuild-sunos-64": "0.14.54", - "esbuild-windows-32": "0.14.54", - "esbuild-windows-64": "0.14.54", - "esbuild-windows-arm64": "0.14.54" } }, "node_modules/escalade": { @@ -15891,7 +17323,6 @@ "version": "10.0.4", "resolved": "https://registry.npmjs.org/immer/-/immer-10.0.4.tgz", "integrity": "sha512-cuBuGK40P/sk5IzWa9QPUaAdvPHjkk1c+xYsd9oZw+YQQEV+10G0P5uMpGctZZKnyQ+ibRO08bD25nWLmYi2pw==", - "peer": true, "funding": { "type": "opencollective", "url": "https://opencollective.com/immer" @@ -22041,14 +23472,12 @@ "node_modules/redux": { "version": "5.0.1", "resolved": "https://registry.npmjs.org/redux/-/redux-5.0.1.tgz", - "integrity": "sha512-M9/ELqF6fy8FwmkpnF0S3YKOqMyoWJ4+CS5Efg2ct3oY9daQvd/Pc71FpGZsVsbl3Cpb+IIcjBDUnnyBdQbq4w==", - "peer": true + "integrity": "sha512-M9/ELqF6fy8FwmkpnF0S3YKOqMyoWJ4+CS5Efg2ct3oY9daQvd/Pc71FpGZsVsbl3Cpb+IIcjBDUnnyBdQbq4w==" }, "node_modules/redux-thunk": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/redux-thunk/-/redux-thunk-3.1.0.tgz", "integrity": "sha512-NW2r5T6ksUKXCabzhL9z+h206HQw/NJkcLm1GPImRQ8IzfXwRGqjVhKJGauHirT0DAuyy6hjdnMZaRoAcy0Klw==", - "peer": true, "peerDependencies": { "redux": "^5.0.0" } @@ -22334,8 +23763,7 @@ "node_modules/reselect": { "version": "5.1.0", "resolved": "https://registry.npmjs.org/reselect/-/reselect-5.1.0.tgz", - "integrity": "sha512-aw7jcGLDpSgNDyWBQLv2cedml85qd95/iszJjN988zX1t7AVRJi19d9kto5+W7oCfQ94gyo40dVbT6g2k4/kXg==", - "peer": true + "integrity": "sha512-aw7jcGLDpSgNDyWBQLv2cedml85qd95/iszJjN988zX1t7AVRJi19d9kto5+W7oCfQ94gyo40dVbT6g2k4/kXg==" }, "node_modules/resize-observer-polyfill": { "version": "1.5.1", @@ -23882,8 +25310,9 @@ } }, "node_modules/source-map-js": { - "version": "1.0.2", - "license": "BSD-3-Clause", + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.1.0.tgz", + "integrity": "sha512-9vC2SfsJzlej6MAaMPLu8HiBSHGdRAJ9hVFYN1ibZoNkeanmDmLUcIrj6G9DGL7XMJ54AKg/G75akXl1/izTOw==", "engines": { "node": ">=0.10.0" } From eb76c9a188b724fec3ed51607cc4cfe0394cd591 Mon Sep 17 00:00:00 2001 From: Augustine Kim Date: Tue, 19 Mar 2024 16:46:46 -0700 Subject: [PATCH 03/13] Rename Selector to Connector and allow selector to be optional --- .../src/{app-selector.ts => app-connector.ts} | 4 +- examples/redux/src/my-counter.ts | 42 ++++--------- examples/redux/src/my-incrementor.ts | 59 +++++++++++++++++++ packages/labs/redux/src/index.ts | 2 +- .../src/lib/{selector.ts => connector.ts} | 42 ++++++------- 5 files changed, 95 insertions(+), 54 deletions(-) rename examples/redux/src/{app-selector.ts => app-connector.ts} (76%) create mode 100644 examples/redux/src/my-incrementor.ts rename packages/labs/redux/src/lib/{selector.ts => connector.ts} (64%) diff --git a/examples/redux/src/app-selector.ts b/examples/redux/src/app-connector.ts similarity index 76% rename from examples/redux/src/app-selector.ts rename to examples/redux/src/app-connector.ts index 599120b82f..94f29b65a3 100644 --- a/examples/redux/src/app-selector.ts +++ b/examples/redux/src/app-connector.ts @@ -4,11 +4,11 @@ * SPDX-License-Identifier: BSD-3-Clause */ -import {Selector} from '@lit-labs/redux'; +import {Connector} from '@lit-labs/redux'; import type {AppStore} from './store.js'; // Create a Selector controller providing the AppStore type for better type // checks on selector functions and returned values. // Similar idea as: // https://redux.js.org/tutorials/typescript-quick-start#define-typed-hooks -export const AppSelector = Selector.withStoreType(); +export const AppConnector = Connector.withStoreType(); diff --git a/examples/redux/src/my-counter.ts b/examples/redux/src/my-counter.ts index b5568dc72c..2f3a09f405 100644 --- a/examples/redux/src/my-counter.ts +++ b/examples/redux/src/my-counter.ts @@ -5,34 +5,24 @@ */ import {html, css, LitElement} from 'lit'; -import {customElement, state} from 'lit/decorators.js'; -import {AppSelector} from './app-selector.js'; -import {increment, decrement, incrementByAmount} from './counter-slice.js'; +import {customElement} from 'lit/decorators.js'; +import {AppConnector} from './app-connector.js'; +import {increment, decrement} from './counter-slice.js'; +import './my-incrementor.js'; @customElement('my-counter') export class MyCounter extends LitElement { // Select the counter value from the Redux store from parent context. - _selected = new AppSelector(this, {selector: (state) => state.counter.value}); - - @state() - _incrementAmount = '2'; + _connector = new AppConnector(this, { + selector: (state) => state.counter.value, + }); _incrementCount() { - this._selected.dispatch(increment()); + this._connector.dispatch(increment()); } _decrementCount() { - this._selected.dispatch(decrement()); - } - - _handleInput(e: InputEvent) { - this._incrementAmount = (e.target as HTMLInputElement).value; - } - - _incrementCountByAmount() { - this._selected.dispatch( - incrementByAmount(Number(this._incrementAmount) || 0) - ); + this._connector.dispatch(decrement()); } render() { @@ -40,13 +30,10 @@ export class MyCounter extends LitElement {
- ${this._selected.value} + ${this._connector.selected}
-
- - -
+
`; } @@ -74,12 +61,5 @@ export class MyCounter extends LitElement { font-size: 1.5rem; padding: 10px; } - - input { - font-size: 1.5rem; - padding: 10px; - width: 100px; - text-align: center; - } `; } diff --git a/examples/redux/src/my-incrementor.ts b/examples/redux/src/my-incrementor.ts new file mode 100644 index 0000000000..113169532f --- /dev/null +++ b/examples/redux/src/my-incrementor.ts @@ -0,0 +1,59 @@ +/** + * @license + * Copyright 2024 Google LLC + * SPDX-License-Identifier: BSD-3-Clause + */ + +import {html, css, LitElement} from 'lit'; +import {customElement, state} from 'lit/decorators.js'; +import {AppConnector} from './app-connector.js'; +import {incrementByAmount} from './counter-slice.js'; + +@customElement('my-incrementor') +export class MyIncrementor extends LitElement { + // Instantiate connector without selector to just access dispatch. + _connector = new AppConnector(this); + + @state() + _incrementAmount = '2'; + + _handleInput(e: InputEvent) { + this._incrementAmount = (e.target as HTMLInputElement).value; + } + + _incrementCountByAmount() { + this._connector.dispatch( + incrementByAmount(Number(this._incrementAmount) || 0) + ); + } + + render() { + return html` +
+ + +
+ `; + } + + static styles = css` + .row { + display: flex; + justify-content: center; + align-items: center; + gap: 1rem; + } + + button { + font-size: 1.5rem; + padding: 10px; + } + + input { + font-size: 1.5rem; + padding: 10px; + width: 100px; + text-align: center; + } + `; +} diff --git a/packages/labs/redux/src/index.ts b/packages/labs/redux/src/index.ts index 31e613c4dc..71c0693740 100644 --- a/packages/labs/redux/src/index.ts +++ b/packages/labs/redux/src/index.ts @@ -4,6 +4,6 @@ * SPDX-License-Identifier: BSD-3-Clause */ -export * from './lib/selector.js'; +export * from './lib/connector.js'; export * from './lib/store-context.js'; export {provide, ContextProvider} from '@lit/context'; diff --git a/packages/labs/redux/src/lib/selector.ts b/packages/labs/redux/src/lib/connector.ts similarity index 64% rename from packages/labs/redux/src/lib/selector.ts rename to packages/labs/redux/src/lib/connector.ts index 596a8ecd30..1bc020032d 100644 --- a/packages/labs/redux/src/lib/selector.ts +++ b/packages/labs/redux/src/lib/connector.ts @@ -13,30 +13,31 @@ import {ContextConsumer} from '@lit/context'; import {storeContext} from './store-context.js'; export type EqualityCheck = (a: unknown, b: unknown) => boolean; -export type SelectorFunction = (state: S) => V; +export type Selector = (state: S) => V; -export type SelectorOptions = { - selector: SelectorFunction, V>; +export type ConnectorOptions = { + selector?: Selector, V>; equalityCheck?: EqualityCheck; }; -export class Selector implements ReactiveController { +export class Connector implements ReactiveController { private _host: ReactiveControllerHost & HTMLElement; private _store!: S; - private _selector: SelectorOptions['selector']; + private _selector: ConnectorOptions['selector']; private _equalityCheck: EqualityCheck; private _unsubscribe!: () => void; - private _value!: V; + private _selected?: V; static withStoreType(): new ( host: ReactiveControllerHost & HTMLElement, - options: SelectorOptions - ) => Selector { + options?: ConnectorOptions + ) => Connector { return this; } - get value(): V { - return this._value; + get selected() { + // Type V will be unknown of no selector was provided to the constructor. + return this._selected as V; } get dispatch(): S['dispatch'] { @@ -45,12 +46,11 @@ export class Selector implements ReactiveController { constructor( host: ReactiveControllerHost & HTMLElement, - options: SelectorOptions + options?: ConnectorOptions ) { - const {selector, equalityCheck = tripleEquals} = options; this._host = (host.addController(this), host); - this._selector = selector; - this._equalityCheck = equalityCheck; + this._selector = options?.selector; + this._equalityCheck = options?.equalityCheck ?? tripleEquals; } hostConnected() { @@ -63,16 +63,18 @@ export class Selector implements ReactiveController { }); if (this._store === undefined) { throw new Error( - 'Selector must be used in a component below a context provider that ' + + 'Connector must be used in a component below a context provider that ' + 'provides a Redux store.' ); } - this._value = this._selector(this._store.getState()); + this._selected = this._selector?.(this._store.getState()); this._unsubscribe = this._store.subscribe(() => { - const selected = this._selector(this._store.getState()); - if (!this._equalityCheck(this.value, selected)) { - this._value = selected; - this._host.requestUpdate(); + if (this._selector !== undefined) { + const selected = this._selector(this._store.getState()); + if (!this._equalityCheck(this._selected, selected)) { + this._selected = selected; + this._host.requestUpdate(); + } } }); } From e49e8cf30ffc83050425aeb716e13c6bf0b47987 Mon Sep 17 00:00:00 2001 From: Augustine Kim Date: Tue, 19 Mar 2024 18:16:53 -0700 Subject: [PATCH 04/13] Add select and dispatch decorators --- examples/redux/src/count-display.ts | 20 +++ ...my-incrementor.ts => count-incrementor.ts} | 15 +-- examples/redux/src/index.ts | 30 +++-- examples/redux/src/my-counter.ts | 25 +--- packages/labs/redux/src/index.ts | 1 + packages/labs/redux/src/lib/decorators.ts | 123 ++++++++++++++++++ 6 files changed, 176 insertions(+), 38 deletions(-) create mode 100644 examples/redux/src/count-display.ts rename examples/redux/src/{my-incrementor.ts => count-incrementor.ts} (74%) create mode 100644 packages/labs/redux/src/lib/decorators.ts diff --git a/examples/redux/src/count-display.ts b/examples/redux/src/count-display.ts new file mode 100644 index 0000000000..be7990de4c --- /dev/null +++ b/examples/redux/src/count-display.ts @@ -0,0 +1,20 @@ +/** + * @license + * Copyright 2024 Google LLC + * SPDX-License-Identifier: BSD-3-Clause + */ + +import {html, LitElement} from 'lit'; +import {customElement} from 'lit/decorators.js'; +import {select} from '@lit-labs/redux'; +import type {RootState} from './store.js'; + +@customElement('count-display') +export class CountDisplay extends LitElement { + @select((state: RootState) => state.counter.value) + _count!: number; + + render() { + return html`

The count is: ${this._count}

`; + } +} diff --git a/examples/redux/src/my-incrementor.ts b/examples/redux/src/count-incrementor.ts similarity index 74% rename from examples/redux/src/my-incrementor.ts rename to examples/redux/src/count-incrementor.ts index 113169532f..7c6fface44 100644 --- a/examples/redux/src/my-incrementor.ts +++ b/examples/redux/src/count-incrementor.ts @@ -6,13 +6,14 @@ import {html, css, LitElement} from 'lit'; import {customElement, state} from 'lit/decorators.js'; -import {AppConnector} from './app-connector.js'; import {incrementByAmount} from './counter-slice.js'; +import {dispatch} from '@lit-labs/redux'; +import type {AppDispatch} from './store.js'; -@customElement('my-incrementor') -export class MyIncrementor extends LitElement { - // Instantiate connector without selector to just access dispatch. - _connector = new AppConnector(this); +@customElement('count-incrementor') +export class CountIncrementor extends LitElement { + @dispatch() + _dispatch!: AppDispatch; @state() _incrementAmount = '2'; @@ -22,9 +23,7 @@ export class MyIncrementor extends LitElement { } _incrementCountByAmount() { - this._connector.dispatch( - incrementByAmount(Number(this._incrementAmount) || 0) - ); + this._dispatch(incrementByAmount(Number(this._incrementAmount) || 0)); } render() { diff --git a/examples/redux/src/index.ts b/examples/redux/src/index.ts index 2c0f580224..319ff27476 100644 --- a/examples/redux/src/index.ts +++ b/examples/redux/src/index.ts @@ -9,6 +9,8 @@ import {customElement} from 'lit/decorators.js'; import {provide, storeContext} from '@lit-labs/redux'; import {store} from './store.js'; import './my-counter.js'; +import './count-incrementor.js'; +import './count-display.js'; @customElement('my-app') export class MyApp extends LitElement { @@ -20,25 +22,33 @@ export class MyApp extends LitElement { render() { return html` -
- Lit Logo - Redux Logo -
- +
+
+ Lit Logo + Redux Logo +
+ + + +
`; } static styles = css` - div { + :host { + font-size: 2rem; + } + + main { display: flex; - justify-content: center; + flex-direction: column; + align-items: center; gap: 2rem; - padding: 2rem; } img { - max-height: 150px; - max-width: 150px; + height: 150px; + width: 150px; } `; } diff --git a/examples/redux/src/my-counter.ts b/examples/redux/src/my-counter.ts index 2f3a09f405..b78f43b399 100644 --- a/examples/redux/src/my-counter.ts +++ b/examples/redux/src/my-counter.ts @@ -8,7 +8,6 @@ import {html, css, LitElement} from 'lit'; import {customElement} from 'lit/decorators.js'; import {AppConnector} from './app-connector.js'; import {increment, decrement} from './counter-slice.js'; -import './my-incrementor.js'; @customElement('my-counter') export class MyCounter extends LitElement { @@ -27,30 +26,16 @@ export class MyCounter extends LitElement { render() { return html` -
-
- - ${this._connector.selected} - -
- +
+ + ${this._connector.selected} +
`; } static styles = css` - :host { - font-size: 2rem; - } - - .container { - display: flex; - flex-direction: column; - align-items: center; - gap: 1rem; - } - - .row { + div { display: flex; justify-content: center; align-items: center; diff --git a/packages/labs/redux/src/index.ts b/packages/labs/redux/src/index.ts index 71c0693740..0f459b4624 100644 --- a/packages/labs/redux/src/index.ts +++ b/packages/labs/redux/src/index.ts @@ -6,4 +6,5 @@ export * from './lib/connector.js'; export * from './lib/store-context.js'; +export * from './lib/decorators.js'; export {provide, ContextProvider} from '@lit/context'; diff --git a/packages/labs/redux/src/lib/decorators.ts b/packages/labs/redux/src/lib/decorators.ts new file mode 100644 index 0000000000..696c2573d4 --- /dev/null +++ b/packages/labs/redux/src/lib/decorators.ts @@ -0,0 +1,123 @@ +/** + * @license + * Copyright 2024 Google LLC + * SPDX-License-Identifier: BSD-3-Clause + */ + +import {ReactiveElement} from '@lit/reactive-element'; +import {Connector, type ConnectorOptions} from './connector.js'; +import type {Store} from '@reduxjs/toolkit'; + +export function select( + selector: NonNullable['selector']>, + equalityCheck?: ConnectorOptions['equalityCheck'] +): ConnectorDecorator; +export function select( + options: ConnectorOptions +): ConnectorDecorator; +export function select( + selectorOrOptions: + | NonNullable['selector']> + | ConnectorOptions, + equalityCheck?: ConnectorOptions['equalityCheck'] +): ConnectorDecorator { + return ( + protoOrTarget: ClassAccessorDecoratorTarget, + nameOrContext: PropertyKey | ClassAccessorDecoratorContext + ) => { + let options: ConnectorOptions = {}; + if (typeof selectorOrOptions === 'object') { + options = selectorOrOptions; + } else { + options.selector = selectorOrOptions; + options.equalityCheck = equalityCheck; + } + // Map of instances to controllers + const controllerMap = new WeakMap>(); + if (typeof nameOrContext === 'object') { + // Standard decorators branch + nameOrContext.addInitializer(function (this: ReactiveElement) { + controllerMap.set(this, new Connector(this, options)); + }); + return { + get(this: ReactiveElement) { + return controllerMap.get(this)!.selected; + }, + }; + } else { + // Experimental decorators branch + (protoOrTarget.constructor as typeof ReactiveElement).addInitializer( + (element: ReactiveElement): void => { + controllerMap.set(element, new Connector(element, options)); + } + ); + Object.defineProperty(protoOrTarget, nameOrContext, { + get(this: ReactiveElement) { + return controllerMap.get(this)!.selected; + }, + }); + return; + } + }; +} + +export function dispatch(): ConnectorDecorator { + return ( + protoOrTarget: ClassAccessorDecoratorTarget, + nameOrContext: PropertyKey | ClassAccessorDecoratorContext + ) => { + // Map of instances to controllers + const controllerMap = new WeakMap>(); + if (typeof nameOrContext === 'object') { + // Standard decorators branch + nameOrContext.addInitializer(function (this: ReactiveElement) { + controllerMap.set(this, new Connector(this)); + }); + return { + get(this: ReactiveElement) { + return controllerMap.get(this)!.dispatch; + }, + }; + } else { + // Experimental decorators branch + (protoOrTarget.constructor as typeof ReactiveElement).addInitializer( + (element: ReactiveElement): void => { + controllerMap.set(element, new Connector(element)); + } + ); + Object.defineProperty(protoOrTarget, nameOrContext, { + get(this: ReactiveElement) { + return controllerMap.get(this)!.dispatch; + }, + }); + return; + } + }; +} + +/** + * Generates a public interface type that removes private and protected fields. + * This allows accepting otherwise compatible versions of the type (e.g. from + * multiple copies of the same package in `node_modules`). + */ +type Interface = { + [K in keyof T]: T[K]; +}; + +type ConnectorDecorator = { + // legacy + < + K extends PropertyKey, + Proto extends Interface>, + >( + protoOrDescriptor: Proto, + name?: K + // eslint-disable-next-line @typescript-eslint/no-explicit-any + ): any; + + // standard + >, V>( + value: ClassAccessorDecoratorTarget, + context: ClassAccessorDecoratorContext + ): void; +}; From d579ea1a8d805e61004c3e43e1d5c57243e60776 Mon Sep 17 00:00:00 2001 From: Augustine Kim Date: Fri, 29 Mar 2024 16:07:07 -0700 Subject: [PATCH 05/13] WIP testing --- examples/redux/src/counter-slice.ts | 2 +- package-lock.json | 6 +- packages/labs/redux/package.json | 10 +-- packages/labs/redux/src/index.ts | 1 + packages/labs/redux/src/lib/connector.ts | 34 +--------- packages/labs/redux/src/lib/equality.ts | 39 +++++++++++ .../labs/redux/src/test/connector_test.ts | 68 +++++++++++++++++++ packages/labs/redux/src/test/equality_test.ts | 26 +++++++ packages/labs/redux/src/test/store.ts | 31 +++++++++ packages/labs/redux/tsconfig.json | 3 + packages/labs/redux/web-test-runner.config.js | 48 +++++++++++++ 11 files changed, 227 insertions(+), 41 deletions(-) create mode 100644 packages/labs/redux/src/lib/equality.ts create mode 100644 packages/labs/redux/src/test/connector_test.ts create mode 100644 packages/labs/redux/src/test/equality_test.ts create mode 100644 packages/labs/redux/src/test/store.ts create mode 100644 packages/labs/redux/web-test-runner.config.js diff --git a/examples/redux/src/counter-slice.ts b/examples/redux/src/counter-slice.ts index c8e59fee76..05194ff911 100644 --- a/examples/redux/src/counter-slice.ts +++ b/examples/redux/src/counter-slice.ts @@ -4,7 +4,7 @@ * SPDX-License-Identifier: BSD-3-Clause */ -import {PayloadAction, createSlice} from '@reduxjs/toolkit'; +import {type PayloadAction, createSlice} from '@reduxjs/toolkit'; export type CounterState = { value: number; diff --git a/package-lock.json b/package-lock.json index b5b247de41..98248f4dc1 100644 --- a/package-lock.json +++ b/package-lock.json @@ -5255,9 +5255,9 @@ } }, "node_modules/@open-wc/semantic-dom-diff/node_modules/@web/dev-server-core": { - "version": "0.7.0", - "resolved": "https://registry.npmjs.org/@web/dev-server-core/-/dev-server-core-0.7.0.tgz", - "integrity": "sha512-1FJe6cJ3r0x0ZmxY/FnXVduQD4lKX7QgYhyS6N+VmIpV+tBU4sGRbcrmeoYeY+nlnPa6p2oNuonk3X5ln/W95g==", + "version": "0.7.1", + "resolved": "https://registry.npmjs.org/@web/dev-server-core/-/dev-server-core-0.7.1.tgz", + "integrity": "sha512-alHd2j0f4e1ekqYDR8lWScrzR7D5gfsUZq3BP3De9bkFWM3AELINCmqqlVKmCtlkAdEc9VyQvNiEqrxraOdc2A==", "dev": true, "dependencies": { "@types/koa": "^2.11.6", diff --git a/packages/labs/redux/package.json b/packages/labs/redux/package.json index d0b505cd6f..f1b9e68baa 100644 --- a/packages/labs/redux/package.json +++ b/packages/labs/redux/package.json @@ -101,7 +101,7 @@ ] }, "test:dev": { - "command": "MODE=dev node ../tests/run-web-tests.js \"development/**/*_test.js\" --config ../tests/web-test-runner.config.js", + "command": "node ../../tests/run-web-tests.js \"development/**/*_test.js\" --config ./web-test-runner.config.js", "dependencies": [ "build", "../../tests:build" @@ -109,13 +109,14 @@ "env": { "BROWSERS": { "external": true - } + }, + "MODE": "dev" }, "files": [], "output": [] }, "test:prod": { - "command": "MODE=prod node ../tests/run-web-tests.js \"development/**/*_test.js\" --config ../tests/web-test-runner.config.js", + "command": "node ../../tests/run-web-tests.js \"development/**/*_test.js\" --config ./web-test-runner.config.js", "dependencies": [ "build", "../../tests:build" @@ -123,7 +124,8 @@ "env": { "BROWSERS": { "external": true - } + }, + "MODE": "prod" }, "files": [], "output": [] diff --git a/packages/labs/redux/src/index.ts b/packages/labs/redux/src/index.ts index 0f459b4624..a5bebc096b 100644 --- a/packages/labs/redux/src/index.ts +++ b/packages/labs/redux/src/index.ts @@ -5,6 +5,7 @@ */ export * from './lib/connector.js'; +export * from './lib/equality.js'; export * from './lib/store-context.js'; export * from './lib/decorators.js'; export {provide, ContextProvider} from '@lit/context'; diff --git a/packages/labs/redux/src/lib/connector.ts b/packages/labs/redux/src/lib/connector.ts index 1bc020032d..ac06e7ecd4 100644 --- a/packages/labs/redux/src/lib/connector.ts +++ b/packages/labs/redux/src/lib/connector.ts @@ -11,8 +11,8 @@ import type { import type {Store} from '@reduxjs/toolkit'; import {ContextConsumer} from '@lit/context'; import {storeContext} from './store-context.js'; +import {type EqualityCheck, tripleEquals} from './equality.js'; -export type EqualityCheck = (a: unknown, b: unknown) => boolean; export type Selector = (state: S) => V; export type ConnectorOptions = { @@ -83,35 +83,3 @@ export class Connector implements ReactiveController { this._unsubscribe(); } } - -export const tripleEquals: EqualityCheck = (a, b) => a === b; - -export const shallowEquals: EqualityCheck = (a, b) => { - if (a === b) { - return true; - } - - if ( - typeof a !== 'object' || - typeof b !== 'object' || - a === null || - b === null - ) { - return false; - } - - const keys = Object.keys(a); - if (keys.length !== Object.keys(b).length) { - return false; - } - - for (const k of keys) { - if ( - (a as Record)[k] !== (b as Record)[k] - ) { - return false; - } - } - - return true; -}; diff --git a/packages/labs/redux/src/lib/equality.ts b/packages/labs/redux/src/lib/equality.ts new file mode 100644 index 0000000000..0628e37004 --- /dev/null +++ b/packages/labs/redux/src/lib/equality.ts @@ -0,0 +1,39 @@ +/** + * @license + * Copyright 2024 Google LLC + * SPDX-License-Identifier: BSD-3-Clause + */ + +export type EqualityCheck = (a: unknown, b: unknown) => boolean; + +export const tripleEquals: EqualityCheck = (a, b) => a === b; + +export const shallowEquals: EqualityCheck = (a, b) => { + if (a === b) { + return true; + } + + if ( + typeof a !== 'object' || + typeof b !== 'object' || + a === null || + b === null + ) { + return false; + } + + const keys = Object.keys(a); + if (keys.length !== Object.keys(b).length) { + return false; + } + + for (const k of keys) { + if ( + (a as Record)[k] !== (b as Record)[k] + ) { + return false; + } + } + + return true; +}; diff --git a/packages/labs/redux/src/test/connector_test.ts b/packages/labs/redux/src/test/connector_test.ts new file mode 100644 index 0000000000..09541a5b8f --- /dev/null +++ b/packages/labs/redux/src/test/connector_test.ts @@ -0,0 +1,68 @@ +/** + * @license + * Copyright 2024 Google LLC + * SPDX-License-Identifier: BSD-3-Clause + */ + +import {assert} from '@esm-bundle/chai'; +import {html, LitElement} from 'lit'; +import {ContextProvider} from '@lit/context'; +import {store, increment, reset} from './store.js'; + +import {storeContext, Connector} from '@lit-labs/redux'; + +class StoreProvider extends LitElement { + _store = new ContextProvider(this, { + context: storeContext, + initialValue: store, + }); + + override render() { + return html``; + } +} +customElements.define('store-provider', StoreProvider); + +class ConnectedElement extends LitElement { + _connector = new Connector(this, {selector: (state) => state.counter.value}); +} +customElements.define('connected-element', ConnectedElement); + +suite('Connector', () => { + let container: HTMLElement; + let provider: StoreProvider; + let el: ConnectedElement; + + setup(async () => { + container = document.createElement('div'); + container.innerHTML = ` + + + + `; + document.body.appendChild(container); + provider = container.querySelector('store-provider')!; + el = container.querySelector('connected-element')!; + await provider.updateComplete; + await el.updateComplete; + }); + + teardown(() => { + store.dispatch(reset()); + document.body.removeChild(container); + }); + + test('obtains selected value from store', () => { + assert.equal(el._connector.selected, store.getState().counter.value); + }); + + test('updates selected value with new one on store update', () => { + store.dispatch(increment()); + assert.equal(el._connector.selected, 1); + }); + + test('able to dispatch action', () => { + el._connector.dispatch(increment()); + assert.equal(store.getState().counter.value, 1); + }); +}); diff --git a/packages/labs/redux/src/test/equality_test.ts b/packages/labs/redux/src/test/equality_test.ts new file mode 100644 index 0000000000..c1371aaf98 --- /dev/null +++ b/packages/labs/redux/src/test/equality_test.ts @@ -0,0 +1,26 @@ +/** + * @license + * Copyright 2024 Google LLC + * SPDX-License-Identifier: BSD-3-Clause + */ + +import {assert} from '@esm-bundle/chai'; + +import {shallowEquals} from '@lit-labs/redux'; + +suite('shallowEquals', () => { + test('primitives', () => { + assert.isTrue(shallowEquals(1, 1)); + assert.isTrue(shallowEquals('1', '1')); + assert.isTrue(shallowEquals(true, true)); + assert.isNotTrue(shallowEquals(1, 2)); + assert.isNotTrue(shallowEquals('1', '2')); + assert.isNotTrue(shallowEquals(true, false)); + }); + + test('arrays', () => { + assert.isTrue(shallowEquals([1], [1])); + assert.isFalse(shallowEquals([1], [2])); + assert.isFalse(shallowEquals([[]], [[]])); + }); +}); diff --git a/packages/labs/redux/src/test/store.ts b/packages/labs/redux/src/test/store.ts new file mode 100644 index 0000000000..50ea2c3d95 --- /dev/null +++ b/packages/labs/redux/src/test/store.ts @@ -0,0 +1,31 @@ +/** + * @license + * Copyright 2024 Google LLC + * SPDX-License-Identifier: BSD-3-Clause + */ + +import {createSlice} from '@reduxjs/toolkit'; +import {configureStore} from '@reduxjs/toolkit'; + +const counterSlice = createSlice({ + name: 'counter', + initialState: {value: 0}, + reducers: { + increment: (state) => { + state.value += 1; + }, + reset: (state) => { + state.value = 0; + }, + }, +}); + +export const {increment, reset} = counterSlice.actions; + +export const store = configureStore({ + reducer: { + counter: counterSlice.reducer, + }, +}); + +export type AppStore = typeof store; diff --git a/packages/labs/redux/tsconfig.json b/packages/labs/redux/tsconfig.json index f8f14a0938..1f03ef9626 100644 --- a/packages/labs/redux/tsconfig.json +++ b/packages/labs/redux/tsconfig.json @@ -22,6 +22,9 @@ "allowSyntheticDefaultImports": true, "experimentalDecorators": true, "noImplicitOverride": true, + "paths": { + "@esm-bundle/chai": ["../../../local-types/@esm-bundle/chai/index.d.ts"] + }, "types": ["mocha"] }, "include": ["src/**/*.ts"], diff --git a/packages/labs/redux/web-test-runner.config.js b/packages/labs/redux/web-test-runner.config.js new file mode 100644 index 0000000000..6b53aa99d1 --- /dev/null +++ b/packages/labs/redux/web-test-runner.config.js @@ -0,0 +1,48 @@ +/** + * @license + * Copyright 2022 Google LLC + * SPDX-License-Identifier: BSD-3-Clause + */ +// @ts-check + +import {playwrightLauncher} from '@web/test-runner-playwright'; +import {fromRollup} from '@web/dev-server-rollup'; +import rollupReplace from '@rollup/plugin-replace'; +const replace = fromRollup(rollupReplace); + +/** + * @type {import('@web/test-runner').TestRunnerConfig} + */ +const config = { + rootDir: '.', + files: ['./test/**/*_test.js'], + nodeResolve: true, + preserveSymlinks: true, + browsers: [ + playwrightLauncher({product: 'chromium'}), + playwrightLauncher({product: 'firefox'}), + playwrightLauncher({product: 'webkit'}), + ], + testFramework: { + // https://mochajs.org/api/mocha + config: { + ui: 'tdd', + timeout: '60000', + }, + }, + plugins: [ + // TODO(augustjk) Remove when we can sort out version conflicts + // eslint-disable-next-line @typescript-eslint/ban-ts-comment + // @ts-ignore innocuous type error due to `@web/dev-server-core` conflict + replace({ + preventAssignment: false, + // Needed for immer.js used by Redux Toolkit. + // See https://github.com/immerjs/immer/issues/557 + 'process.env.NODE_ENV': JSON.stringify( + process.env.MODE === 'prod' ? 'production' : 'development' + ), + }), + ], +}; + +export default config; From 7e6718e6ec2d6b0ca4eb182e1980add6e370f20b Mon Sep 17 00:00:00 2001 From: Augustine Kim Date: Wed, 3 Apr 2024 10:58:05 -0700 Subject: [PATCH 06/13] Tests for equality and connector --- packages/labs/redux/src/lib/connector.ts | 17 +- packages/labs/redux/src/lib/equality.ts | 3 +- .../labs/redux/src/test/connector_test.ts | 212 +++++++++++++++++- packages/labs/redux/src/test/equality_test.ts | 14 ++ packages/labs/redux/src/test/store.ts | 7 +- packages/labs/redux/web-test-runner.config.js | 2 +- 6 files changed, 236 insertions(+), 19 deletions(-) diff --git a/packages/labs/redux/src/lib/connector.ts b/packages/labs/redux/src/lib/connector.ts index ac06e7ecd4..9179a064b5 100644 --- a/packages/labs/redux/src/lib/connector.ts +++ b/packages/labs/redux/src/lib/connector.ts @@ -25,7 +25,7 @@ export class Connector implements ReactiveController { private _store!: S; private _selector: ConnectorOptions['selector']; private _equalityCheck: EqualityCheck; - private _unsubscribe!: () => void; + private _unsubscribe?: () => void; private _selected?: V; static withStoreType(): new ( @@ -36,7 +36,6 @@ export class Connector implements ReactiveController { } get selected() { - // Type V will be unknown of no selector was provided to the constructor. return this._selected as V; } @@ -67,19 +66,19 @@ export class Connector implements ReactiveController { 'provides a Redux store.' ); } - this._selected = this._selector?.(this._store.getState()); - this._unsubscribe = this._store.subscribe(() => { - if (this._selector !== undefined) { - const selected = this._selector(this._store.getState()); + if (this._selector !== undefined) { + this._selected = this._selector(this._store.getState()); + this._unsubscribe = this._store.subscribe(() => { + const selected = this._selector!(this._store.getState()); if (!this._equalityCheck(this._selected, selected)) { this._selected = selected; this._host.requestUpdate(); } - } - }); + }); + } } hostDisconnected() { - this._unsubscribe(); + this._unsubscribe?.(); } } diff --git a/packages/labs/redux/src/lib/equality.ts b/packages/labs/redux/src/lib/equality.ts index 0628e37004..363acf28df 100644 --- a/packages/labs/redux/src/lib/equality.ts +++ b/packages/labs/redux/src/lib/equality.ts @@ -4,7 +4,8 @@ * SPDX-License-Identifier: BSD-3-Clause */ -export type EqualityCheck = (a: unknown, b: unknown) => boolean; +// eslint-disable-next-line @typescript-eslint/no-explicit-any +export type EqualityCheck = (a: T, b: T) => boolean; export const tripleEquals: EqualityCheck = (a, b) => a === b; diff --git a/packages/labs/redux/src/test/connector_test.ts b/packages/labs/redux/src/test/connector_test.ts index 09541a5b8f..39b8525362 100644 --- a/packages/labs/redux/src/test/connector_test.ts +++ b/packages/labs/redux/src/test/connector_test.ts @@ -7,7 +7,7 @@ import {assert} from '@esm-bundle/chai'; import {html, LitElement} from 'lit'; import {ContextProvider} from '@lit/context'; -import {store, increment, reset} from './store.js'; +import {store, increment, toggle, reset} from './store.js'; import {storeContext, Connector} from '@lit-labs/redux'; @@ -24,11 +24,49 @@ class StoreProvider extends LitElement { customElements.define('store-provider', StoreProvider); class ConnectedElement extends LitElement { - _connector = new Connector(this, {selector: (state) => state.counter.value}); + connector = new Connector(this, {selector: (state) => state.counter.value}); + renderCount = 0; + + override render() { + this.renderCount += 1; + return html`

${this.connector.selected}

`; + } } customElements.define('connected-element', ConnectedElement); -suite('Connector', () => { +class NoSelector extends LitElement { + connector = new Connector(this); + renderCount = 0; + override render() { + this.renderCount += 1; + } +} +customElements.define('no-selector', NoSelector); + +class ComplexSelector extends LitElement { + connector = new Connector(this, { + selector: (state) => ({value: state.counter.value}), + }); + renderCount = 0; + override render() { + this.renderCount += 1; + } +} +customElements.define('complex-selector', ComplexSelector); + +class CustomEquality extends LitElement { + connector = new Connector(this, { + selector: (state) => ({value: state.counter.value}), + equalityCheck: (a, b) => a.value === b.value, + }); + renderCount = 0; + override render() { + this.renderCount += 1; + } +} +customElements.define('custom-equality', CustomEquality); + +suite('Connector basic', () => { let container: HTMLElement; let provider: StoreProvider; let el: ConnectedElement; @@ -53,16 +91,178 @@ suite('Connector', () => { }); test('obtains selected value from store', () => { - assert.equal(el._connector.selected, store.getState().counter.value); + assert.equal(el.connector.selected, store.getState().counter.value); }); test('updates selected value with new one on store update', () => { store.dispatch(increment()); - assert.equal(el._connector.selected, 1); + assert.equal(el.connector.selected, 1); + }); + + test('updated value actually causes a re-render', async () => { + assert.equal(el.renderCount, 1); + assert.include(el.shadowRoot!.querySelector('p')!.innerText, '0'); + store.dispatch(increment()); + await el.updateComplete; + assert.equal(el.renderCount, 2); + assert.include(el.shadowRoot!.querySelector('p')!.innerText, '1'); + }); + + test('unrelated state change does not cause re-render', async () => { + assert.equal(el.renderCount, 1); + store.dispatch(toggle()); // this only updates a flag, not the count value. + await el.updateComplete; + assert.equal(el.renderCount, 1); }); test('able to dispatch action', () => { - el._connector.dispatch(increment()); + el.connector.dispatch(increment()); assert.equal(store.getState().counter.value, 1); }); }); + +suite('Connector without selector', () => { + let container: HTMLElement; + let provider: StoreProvider; + let el: NoSelector; + + setup(async () => { + container = document.createElement('div'); + container.innerHTML = ` + + + + `; + document.body.appendChild(container); + provider = container.querySelector('store-provider')!; + el = container.querySelector('no-selector')!; + await provider.updateComplete; + await el.updateComplete; + }); + + teardown(() => { + store.dispatch(reset()); + document.body.removeChild(container); + }); + + test('provides no selected value', async () => { + assert.isUndefined(el.connector.selected); + }); + + test('able to dispatch action', () => { + el.connector.dispatch(increment()); + assert.equal(store.getState().counter.value, 1); + }); + + test('store update does not cause re-render', async () => { + assert.equal(el.renderCount, 1); + store.dispatch(increment()); + await el.updateComplete; + assert.equal(el.renderCount, 1); + }); +}); + +suite('Connector with complex selector', () => { + let container: HTMLElement; + let provider: StoreProvider; + let el: ComplexSelector; + + setup(async () => { + container = document.createElement('div'); + container.innerHTML = ` + + + + `; + document.body.appendChild(container); + provider = container.querySelector('store-provider')!; + el = container.querySelector('complex-selector')!; + await provider.updateComplete; + await el.updateComplete; + }); + + teardown(() => { + store.dispatch(reset()); + document.body.removeChild(container); + }); + + test('selector returning new object always re-renders', async () => { + assert.equal(el.renderCount, 1); + assert.equal(el.connector.selected.value, 0); + store.dispatch(toggle()); + await el.updateComplete; + assert.equal(el.renderCount, 2); + assert.equal(el.connector.selected.value, 0); + }); +}); + +suite('Connector with custom equality', () => { + let container: HTMLElement; + let provider: StoreProvider; + let el: CustomEquality; + + setup(async () => { + container = document.createElement('div'); + container.innerHTML = ` + + + + `; + document.body.appendChild(container); + provider = container.querySelector('store-provider')!; + el = container.querySelector('custom-equality')!; + await provider.updateComplete; + await el.updateComplete; + }); + + teardown(() => { + store.dispatch(reset()); + document.body.removeChild(container); + }); + + test('prevent re-render on store update with same value', async () => { + assert.equal(el.renderCount, 1); + assert.equal(el.connector.selected.value, 0); + store.dispatch(toggle()); + await el.updateComplete; + assert.equal(el.renderCount, 1); + assert.equal(el.connector.selected.value, 0); + }); + + test('re-render on store update with different value', async () => { + assert.equal(el.renderCount, 1); + assert.equal(el.connector.selected.value, 0); + store.dispatch(increment()); + await el.updateComplete; + assert.equal(el.renderCount, 2); + assert.equal(el.connector.selected.value, 1); + }); +}); + +suite('Connector without provider', () => { + test('errors when connecting without store provided', () => { + let error: Error; + + class CaptureConnected extends ConnectedElement { + override connectedCallback() { + try { + super.connectedCallback(); + } catch (e) { + error = e as Error; + } + } + } + customElements.define('capture-connected', CaptureConnected); + + const div = document.createElement('div'); + div.innerHTML = ``; + document.body.appendChild(div); + + assert.match( + error!.message, + /Connector must be used in a component below a context provider that provides a Redux store/ + ); + + document.body.removeChild(div); + }); +}); diff --git a/packages/labs/redux/src/test/equality_test.ts b/packages/labs/redux/src/test/equality_test.ts index c1371aaf98..7b2c0b387e 100644 --- a/packages/labs/redux/src/test/equality_test.ts +++ b/packages/labs/redux/src/test/equality_test.ts @@ -18,9 +18,23 @@ suite('shallowEquals', () => { assert.isNotTrue(shallowEquals(true, false)); }); + test('null', () => { + assert.isTrue(shallowEquals(null, null)); + }); + test('arrays', () => { assert.isTrue(shallowEquals([1], [1])); + assert.isTrue(shallowEquals([1, 2], [1, 2])); assert.isFalse(shallowEquals([1], [2])); + assert.isFalse(shallowEquals([1], [1, 2])); assert.isFalse(shallowEquals([[]], [[]])); }); + + test('objects', () => { + assert.isTrue(shallowEquals({a: 1}, {a: 1})); + assert.isTrue(shallowEquals({a: 1, b: 2}, {a: 1, b: 2})); + assert.isFalse(shallowEquals({a: 1, b: 2}, {a: 2, b: 1})); + assert.isFalse(shallowEquals({a: 1}, {a: 1, b: 2})); + assert.isFalse(shallowEquals({a: {}}, {a: {}})); + }); }); diff --git a/packages/labs/redux/src/test/store.ts b/packages/labs/redux/src/test/store.ts index 50ea2c3d95..4d2d0f893d 100644 --- a/packages/labs/redux/src/test/store.ts +++ b/packages/labs/redux/src/test/store.ts @@ -9,18 +9,21 @@ import {configureStore} from '@reduxjs/toolkit'; const counterSlice = createSlice({ name: 'counter', - initialState: {value: 0}, + initialState: {value: 0, flag: false}, reducers: { increment: (state) => { state.value += 1; }, + toggle: (state) => { + state.flag = !state.flag; + }, reset: (state) => { state.value = 0; }, }, }); -export const {increment, reset} = counterSlice.actions; +export const {increment, toggle, reset} = counterSlice.actions; export const store = configureStore({ reducer: { diff --git a/packages/labs/redux/web-test-runner.config.js b/packages/labs/redux/web-test-runner.config.js index 6b53aa99d1..d8a8bccfda 100644 --- a/packages/labs/redux/web-test-runner.config.js +++ b/packages/labs/redux/web-test-runner.config.js @@ -31,7 +31,7 @@ const config = { }, }, plugins: [ - // TODO(augustjk) Remove when we can sort out version conflicts + // TODO(augustjk) Remove ts-ignore when we can sort out version conflicts. // eslint-disable-next-line @typescript-eslint/ban-ts-comment // @ts-ignore innocuous type error due to `@web/dev-server-core` conflict replace({ From 7b4e4d44ada6d6cb00c0fa1e92b02ffa6bd531e3 Mon Sep 17 00:00:00 2001 From: Augustine Kim Date: Mon, 8 Apr 2024 17:48:10 -0700 Subject: [PATCH 07/13] Add decorator tests --- packages/labs/redux/package.json | 6 +- packages/labs/redux/rollup.config.js | 2 +- packages/labs/redux/src/lib/decorators.ts | 89 +++++--- .../src/test/decorators/decorators_test.ts | 206 ++++++++++++++++++ .../std-decorators/std-decorators_test.ts | 175 +++++++++++++++ packages/labs/redux/src/test/store.ts | 2 + .../redux/tsconfig-std-decorators-test.json | 33 +++ packages/labs/redux/tsconfig.json | 4 +- packages/labs/redux/web-test-runner.config.js | 6 +- 9 files changed, 490 insertions(+), 33 deletions(-) create mode 100644 packages/labs/redux/src/test/decorators/decorators_test.ts create mode 100644 packages/labs/redux/src/test/std-decorators/std-decorators_test.ts create mode 100644 packages/labs/redux/tsconfig-std-decorators-test.json diff --git a/packages/labs/redux/package.json b/packages/labs/redux/package.json index f1b9e68baa..dcfd564c14 100644 --- a/packages/labs/redux/package.json +++ b/packages/labs/redux/package.json @@ -57,11 +57,13 @@ "clean": "if-file-deleted", "files": [ "src/**/*.ts", - "tsconfig.json" + "tsconfig.json", + "tsconfig-std-decorators-test.json" ], "output": [ "development/", "tsconfig.tsbuildinfo", + "tsconfig-std-decorators-test.tsbuildinfo", "index.d.ts{,.map}", "lib/**/*.d.ts{,.map}", "test/**/*.d.ts{,.map}" @@ -103,7 +105,7 @@ "test:dev": { "command": "node ../../tests/run-web-tests.js \"development/**/*_test.js\" --config ./web-test-runner.config.js", "dependencies": [ - "build", + "build:ts", "../../tests:build" ], "env": { diff --git a/packages/labs/redux/rollup.config.js b/packages/labs/redux/rollup.config.js index a05fc2f588..126a665941 100644 --- a/packages/labs/redux/rollup.config.js +++ b/packages/labs/redux/rollup.config.js @@ -1,6 +1,6 @@ /** * @license - * Copyright 2018 Google LLC + * Copyright 2024 Google LLC * SPDX-License-Identifier: BSD-3-Clause */ diff --git a/packages/labs/redux/src/lib/decorators.ts b/packages/labs/redux/src/lib/decorators.ts index 696c2573d4..2021edf71d 100644 --- a/packages/labs/redux/src/lib/decorators.ts +++ b/packages/labs/redux/src/lib/decorators.ts @@ -11,20 +11,20 @@ import type {Store} from '@reduxjs/toolkit'; export function select( selector: NonNullable['selector']>, equalityCheck?: ConnectorOptions['equalityCheck'] -): ConnectorDecorator; +): SelectDecorator; export function select( options: ConnectorOptions -): ConnectorDecorator; +): SelectDecorator; export function select( selectorOrOptions: | NonNullable['selector']> | ConnectorOptions, equalityCheck?: ConnectorOptions['equalityCheck'] -): ConnectorDecorator { - return ( +): SelectDecorator { + return function ( protoOrTarget: ClassAccessorDecoratorTarget, nameOrContext: PropertyKey | ClassAccessorDecoratorContext - ) => { + ) { let options: ConnectorOptions = {}; if (typeof selectorOrOptions === 'object') { options = selectorOrOptions; @@ -46,51 +46,64 @@ export function select( }; } else { // Experimental decorators branch - (protoOrTarget.constructor as typeof ReactiveElement).addInitializer( + (protoOrTarget!.constructor as typeof ReactiveElement).addInitializer( (element: ReactiveElement): void => { controllerMap.set(element, new Connector(element, options)); } ); - Object.defineProperty(protoOrTarget, nameOrContext, { + const descriptor = { get(this: ReactiveElement) { return controllerMap.get(this)!.selected; }, - }); - return; + }; + Object.defineProperty(protoOrTarget, nameOrContext, descriptor); + return descriptor; } }; } -export function dispatch(): ConnectorDecorator { - return ( - protoOrTarget: ClassAccessorDecoratorTarget, - nameOrContext: PropertyKey | ClassAccessorDecoratorContext - ) => { +export function dispatch(): DispatchDecorator { + return function ( + protoOrTarget: ClassAccessorDecoratorTarget | undefined, + nameOrContext: + | PropertyKey + | ClassAccessorDecoratorContext + | ClassFieldDecoratorContext + ) { // Map of instances to controllers const controllerMap = new WeakMap>(); if (typeof nameOrContext === 'object') { // Standard decorators branch - nameOrContext.addInitializer(function (this: ReactiveElement) { - controllerMap.set(this, new Connector(this)); - }); - return { - get(this: ReactiveElement) { + if (nameOrContext.kind === 'field') { + return function (this: ReactiveElement) { + controllerMap.set(this, new Connector(this)); return controllerMap.get(this)!.dispatch; - }, - }; + }; + } else { + // accessor + nameOrContext.addInitializer(function (this: ReactiveElement) { + controllerMap.set(this, new Connector(this)); + }); + return { + get(this: ReactiveElement) { + return controllerMap.get(this)!.dispatch; + }, + }; + } } else { // Experimental decorators branch - (protoOrTarget.constructor as typeof ReactiveElement).addInitializer( + (protoOrTarget!.constructor as typeof ReactiveElement).addInitializer( (element: ReactiveElement): void => { controllerMap.set(element, new Connector(element)); } ); - Object.defineProperty(protoOrTarget, nameOrContext, { + const descriptor = { get(this: ReactiveElement) { return controllerMap.get(this)!.dispatch; }, - }); - return; + }; + Object.defineProperty(protoOrTarget, nameOrContext, descriptor); + return descriptor; } }; } @@ -104,14 +117,15 @@ type Interface = { [K in keyof T]: T[K]; }; -type ConnectorDecorator = { +type SelectDecorator = { // legacy < K extends PropertyKey, Proto extends Interface>, >( protoOrDescriptor: Proto, - name?: K + name: K, + descriptor?: PropertyDescriptor // eslint-disable-next-line @typescript-eslint/no-explicit-any ): any; @@ -121,3 +135,24 @@ type ConnectorDecorator = { context: ClassAccessorDecoratorContext ): void; }; + +type DispatchDecorator = { + // legacy + < + K extends PropertyKey, + Proto extends Interface>, + >( + protoOrDescriptor: Proto, + name: K, + descriptor?: PropertyDescriptor + // eslint-disable-next-line @typescript-eslint/no-explicit-any + ): any; + + // standard + >, V>( + value: ClassAccessorDecoratorTarget | undefined, + context: + | ClassAccessorDecoratorContext + | ClassFieldDecoratorContext + ): void; +}; diff --git a/packages/labs/redux/src/test/decorators/decorators_test.ts b/packages/labs/redux/src/test/decorators/decorators_test.ts new file mode 100644 index 0000000000..4cb66da71f --- /dev/null +++ b/packages/labs/redux/src/test/decorators/decorators_test.ts @@ -0,0 +1,206 @@ +/** + * @license + * Copyright 2024 Google LLC + * SPDX-License-Identifier: BSD-3-Clause + */ + +import {assert} from '@esm-bundle/chai'; +import {html, LitElement} from 'lit'; +import {ContextProvider} from '@lit/context'; +import { + store, + increment, + toggle, + reset, + type RootState, + type AppDispatch, +} from '../store.js'; + +import {storeContext, select, dispatch} from '@lit-labs/redux'; + +class StoreProvider extends LitElement { + _store = new ContextProvider(this, { + context: storeContext, + initialValue: store, + }); + + override render() { + return html``; + } +} +customElements.define('store-provider', StoreProvider); + +class SelectElement extends LitElement { + @select((state: RootState) => state.counter.value) + count!: number; + + renderCount = 0; + + override render() { + this.renderCount += 1; + return html`

${this.count}

`; + } +} +customElements.define('select-element', SelectElement); + +class SelectAccessor extends LitElement { + @select((state: RootState) => state.counter.value) + accessor count!: number; + + renderCount = 0; + + override render() { + this.renderCount += 1; + return html`

${this.count}

`; + } +} +customElements.define('select-accessor', SelectAccessor); + +class SelectOption extends LitElement { + @select({selector: (state: RootState) => state.counter.value}) + count!: number; + + renderCount = 0; + + override render() { + this.renderCount += 1; + return html`

${this.count}

`; + } +} +customElements.define('select-option', SelectOption); + +class SelectOptionAccessor extends LitElement { + @select({selector: (state: RootState) => state.counter.value}) + accessor count!: number; + + renderCount = 0; + + override render() { + this.renderCount += 1; + return html`

${this.count}

`; + } +} +customElements.define('select-option-accessor', SelectOptionAccessor); + +class DispatchElement extends LitElement { + @dispatch() + dispatch!: AppDispatch; + + renderCount = 0; + + override render() { + this.renderCount += 1; + return; + } +} +customElements.define('dispatch-element', DispatchElement); + +class DispatchAccessor extends LitElement { + @dispatch() + accessor dispatch!: AppDispatch; + + renderCount = 0; + + override render() { + this.renderCount += 1; + return; + } +} +customElements.define('dispatch-accessor', DispatchAccessor); + +[ + 'select-element', + 'select-accessor', + 'select-option', + 'select-option-accessor', +].forEach((tag) => { + suite(`@select with <${tag}>`, () => { + let container: HTMLElement; + let provider: StoreProvider; + let el: SelectElement | SelectAccessor | SelectOption; + + setup(async () => { + container = document.createElement('div'); + container.innerHTML = ` + + <${tag}> + + `; + document.body.appendChild(container); + provider = container.querySelector('store-provider')!; + el = container.querySelector(tag)!; + await provider.updateComplete; + await el.updateComplete; + }); + + teardown(() => { + store.dispatch(reset()); + document.body.removeChild(container); + }); + + test('it selects a value from store', () => { + assert.equal(el.count, store.getState().counter.value); + }); + + test('updates selected value when store updates', () => { + store.dispatch(increment()); + assert.equal(el.count, store.getState().counter.value); + }); + + test('updating value causes re-render', async () => { + assert.equal(el.renderCount, 1); + assert.include(el.shadowRoot!.querySelector('p')!.innerText, '0'); + store.dispatch(increment()); + await el.updateComplete; + assert.equal(el.renderCount, 2); + assert.include(el.shadowRoot!.querySelector('p')!.innerText, '1'); + }); + + test('unrelated state change does not cause re-render', async () => { + assert.equal(el.renderCount, 1); + store.dispatch(toggle()); // this only updates a flag, not the count value. + await el.updateComplete; + assert.equal(el.renderCount, 1); + }); + }); +}); + +['dispatch-element', 'dispatch-accessor'].forEach((tag) => { + suite(`@dispatch with <${tag}>`, () => { + let container: HTMLElement; + let provider: StoreProvider; + let el: DispatchElement | DispatchAccessor; + + setup(async () => { + container = document.createElement('div'); + container.innerHTML = ` + + <${tag}> + + `; + document.body.appendChild(container); + provider = container.querySelector('store-provider')!; + el = container.querySelector(tag)!; + await provider.updateComplete; + await el.updateComplete; + }); + + teardown(() => { + store.dispatch(reset()); + document.body.removeChild(container); + }); + + test('can dispatch actions', () => { + assert.equal(store.getState().counter.value, 0); + el.dispatch(increment()); + assert.equal(store.getState().counter.value, 1); + }); + + test('dispatching does not re-render element', async () => { + assert.equal(el.renderCount, 1); + el.dispatch(increment()); + await el.updateComplete; + assert.equal(el.renderCount, 1); + }); + }); +}); diff --git a/packages/labs/redux/src/test/std-decorators/std-decorators_test.ts b/packages/labs/redux/src/test/std-decorators/std-decorators_test.ts new file mode 100644 index 0000000000..7aabb9e237 --- /dev/null +++ b/packages/labs/redux/src/test/std-decorators/std-decorators_test.ts @@ -0,0 +1,175 @@ +/** + * @license + * Copyright 2024 Google LLC + * SPDX-License-Identifier: BSD-3-Clause + */ + +import {assert} from '@esm-bundle/chai'; +import {html, LitElement} from 'lit'; +import {ContextProvider} from '@lit/context'; +import { + store, + increment, + toggle, + reset, + type RootState, + type AppDispatch, +} from '../store.js'; + +import {storeContext, select, dispatch} from '@lit-labs/redux'; + +class StoreProvider extends LitElement { + _store = new ContextProvider(this, { + context: storeContext, + initialValue: store, + }); + + override render() { + return html``; + } +} +customElements.define('store-provider', StoreProvider); + +class SelectAccessor extends LitElement { + @select((state: RootState) => state.counter.value) + accessor count!: number; + + renderCount = 0; + + override render() { + this.renderCount += 1; + return html`

${this.count}

`; + } +} +customElements.define('select-accessor', SelectAccessor); + +class SelectOptionAccessor extends LitElement { + @select({selector: (state: RootState) => state.counter.value}) + accessor count!: number; + + renderCount = 0; + + override render() { + this.renderCount += 1; + return html`

${this.count}

`; + } +} +customElements.define('select-option-accessor', SelectOptionAccessor); + +class DispatchElement extends LitElement { + @dispatch() + dispatch!: AppDispatch; + + renderCount = 0; + + override render() { + this.renderCount += 1; + return; + } +} +customElements.define('dispatch-element', DispatchElement); + +class DispatchAccessor extends LitElement { + @dispatch() + accessor dispatch!: AppDispatch; + + renderCount = 0; + + override render() { + this.renderCount += 1; + return; + } +} +customElements.define('dispatch-accessor', DispatchAccessor); + +['select-accessor', 'select-option-accessor'].forEach((tag) => { + suite(`@select with <${tag}>`, () => { + let container: HTMLElement; + let provider: StoreProvider; + let el: SelectAccessor | SelectOptionAccessor; + + setup(async () => { + container = document.createElement('div'); + container.innerHTML = ` + + <${tag}> + + `; + document.body.appendChild(container); + provider = container.querySelector('store-provider')!; + el = container.querySelector(tag)!; + await provider.updateComplete; + await el.updateComplete; + }); + + teardown(() => { + store.dispatch(reset()); + document.body.removeChild(container); + }); + + test('it selects a value from store', () => { + assert.equal(el.count, store.getState().counter.value); + }); + + test('updates selected value when store updates', () => { + store.dispatch(increment()); + assert.equal(el.count, store.getState().counter.value); + }); + + test('updating value causes re-render', async () => { + assert.equal(el.renderCount, 1); + assert.include(el.shadowRoot!.querySelector('p')!.innerText, '0'); + store.dispatch(increment()); + await el.updateComplete; + assert.equal(el.renderCount, 2); + assert.include(el.shadowRoot!.querySelector('p')!.innerText, '1'); + }); + + test('unrelated state change does not cause re-render', async () => { + assert.equal(el.renderCount, 1); + store.dispatch(toggle()); // this only updates a flag, not the count value. + await el.updateComplete; + assert.equal(el.renderCount, 1); + }); + }); +}); + +['dispatch-element', 'dispatch-accessor'].forEach((tag) => { + suite(`@dispatch with <${tag}>`, () => { + let container: HTMLElement; + let provider: StoreProvider; + let el: DispatchElement | DispatchAccessor; + + setup(async () => { + container = document.createElement('div'); + container.innerHTML = ` + + <${tag}> + + `; + document.body.appendChild(container); + provider = container.querySelector('store-provider')!; + el = container.querySelector(tag)!; + await provider.updateComplete; + await el.updateComplete; + }); + + teardown(() => { + store.dispatch(reset()); + document.body.removeChild(container); + }); + + test('can dispatch actions', () => { + assert.equal(store.getState().counter.value, 0); + el.dispatch(increment()); + assert.equal(store.getState().counter.value, 1); + }); + + test('dispatching does not re-render element', async () => { + assert.equal(el.renderCount, 1); + el.dispatch(increment()); + await el.updateComplete; + assert.equal(el.renderCount, 1); + }); + }); +}); diff --git a/packages/labs/redux/src/test/store.ts b/packages/labs/redux/src/test/store.ts index 4d2d0f893d..9a09f38fe0 100644 --- a/packages/labs/redux/src/test/store.ts +++ b/packages/labs/redux/src/test/store.ts @@ -32,3 +32,5 @@ export const store = configureStore({ }); export type AppStore = typeof store; +export type AppDispatch = typeof store.dispatch; +export type RootState = ReturnType; diff --git a/packages/labs/redux/tsconfig-std-decorators-test.json b/packages/labs/redux/tsconfig-std-decorators-test.json new file mode 100644 index 0000000000..a2e993b287 --- /dev/null +++ b/packages/labs/redux/tsconfig-std-decorators-test.json @@ -0,0 +1,33 @@ +{ + "compilerOptions": { + "composite": true, + "target": "es2021", + "module": "NodeNext", + "lib": ["es2021", "DOM"], + "declaration": true, + "declarationMap": true, + "declarationDir": "./", + "sourceMap": true, + "inlineSources": true, + "outDir": "./development/", + "rootDir": "./src/", + "strict": true, + "noUnusedLocals": true, + "noUnusedParameters": true, + "noImplicitReturns": true, + "noFallthroughCasesInSwitch": true, + "noImplicitAny": true, + "noImplicitThis": true, + "moduleResolution": "NodeNext", + "allowSyntheticDefaultImports": true, + "experimentalDecorators": false, + "useDefineForClassFields": true, + "noImplicitOverride": true, + "paths": { + "@esm-bundle/chai": ["../../../local-types/@esm-bundle/chai/index.d.ts"] + }, + "types": ["mocha"] + }, + "include": ["src/test/std-decorators/**/*.ts", "src/test/store.ts"], + "exclude": [] +} diff --git a/packages/labs/redux/tsconfig.json b/packages/labs/redux/tsconfig.json index 1f03ef9626..f5fe36019e 100644 --- a/packages/labs/redux/tsconfig.json +++ b/packages/labs/redux/tsconfig.json @@ -21,6 +21,7 @@ "moduleResolution": "NodeNext", "allowSyntheticDefaultImports": true, "experimentalDecorators": true, + "useDefineForClassFields": false, "noImplicitOverride": true, "paths": { "@esm-bundle/chai": ["../../../local-types/@esm-bundle/chai/index.d.ts"] @@ -28,5 +29,6 @@ "types": ["mocha"] }, "include": ["src/**/*.ts"], - "exclude": [] + "exclude": ["src/test/std-decorators/**/*.ts"], + "references": [{"path": "./tsconfig-std-decorators-test.json"}] } diff --git a/packages/labs/redux/web-test-runner.config.js b/packages/labs/redux/web-test-runner.config.js index d8a8bccfda..63eec64cea 100644 --- a/packages/labs/redux/web-test-runner.config.js +++ b/packages/labs/redux/web-test-runner.config.js @@ -16,7 +16,9 @@ const replace = fromRollup(rollupReplace); const config = { rootDir: '.', files: ['./test/**/*_test.js'], - nodeResolve: true, + nodeResolve: { + exportConditions: process.env.MODE === 'dev' ? ['development'] : [], + }, preserveSymlinks: true, browsers: [ playwrightLauncher({product: 'chromium'}), @@ -39,7 +41,7 @@ const config = { // Needed for immer.js used by Redux Toolkit. // See https://github.com/immerjs/immer/issues/557 'process.env.NODE_ENV': JSON.stringify( - process.env.MODE === 'prod' ? 'production' : 'development' + process.env.MODE === 'dev' ? 'development' : 'production' ), }), ], From 1c654934390a5e8c607e49c8d699bf6226aecb3f Mon Sep 17 00:00:00 2001 From: Augustine Kim Date: Mon, 8 Apr 2024 18:22:12 -0700 Subject: [PATCH 08/13] Add withStoreType test --- .../labs/redux/src/test/connector_test.ts | 20 ++++++++++++++++++- 1 file changed, 19 insertions(+), 1 deletion(-) diff --git a/packages/labs/redux/src/test/connector_test.ts b/packages/labs/redux/src/test/connector_test.ts index 39b8525362..8c4a18a90a 100644 --- a/packages/labs/redux/src/test/connector_test.ts +++ b/packages/labs/redux/src/test/connector_test.ts @@ -7,7 +7,7 @@ import {assert} from '@esm-bundle/chai'; import {html, LitElement} from 'lit'; import {ContextProvider} from '@lit/context'; -import {store, increment, toggle, reset} from './store.js'; +import {store, increment, toggle, reset, AppStore} from './store.js'; import {storeContext, Connector} from '@lit-labs/redux'; @@ -266,3 +266,21 @@ suite('Connector without provider', () => { document.body.removeChild(div); }); }); + +suite('Connector.withStoreType', () => { + test('returns itself', () => { + assert.equal(Connector, Connector.withStoreType()); + }); + + // type only test to be checked at compile time + test('correctly type checks selector with provided store type', () => { + const TypedConnector = Connector.withStoreType(); + class WithTypedSelector extends LitElement { + connector = new TypedConnector(this, { + // @ts-expect-error `foo` does not exist on state + selector: (state) => state.foo, + }); + } + return WithTypedSelector; + }); +}); From 7c99e75ac7a36cfac4965b9528810314179a213d Mon Sep 17 00:00:00 2001 From: Augustine Kim Date: Wed, 10 Apr 2024 13:55:35 -0700 Subject: [PATCH 09/13] Add jsdoc for exported members --- packages/labs/redux/src/lib/connector.ts | 57 +++++++++++++++++++ packages/labs/redux/src/lib/decorators.ts | 58 ++++++++++++++++---- packages/labs/redux/src/lib/equality.ts | 7 +++ packages/labs/redux/src/lib/store-context.ts | 7 +++ 4 files changed, 117 insertions(+), 12 deletions(-) diff --git a/packages/labs/redux/src/lib/connector.ts b/packages/labs/redux/src/lib/connector.ts index 9179a064b5..c6f66e2db3 100644 --- a/packages/labs/redux/src/lib/connector.ts +++ b/packages/labs/redux/src/lib/connector.ts @@ -13,13 +13,46 @@ import {ContextConsumer} from '@lit/context'; import {storeContext} from './store-context.js'; import {type EqualityCheck, tripleEquals} from './equality.js'; +/** + * Selector function that takes state and returns a selected value. + */ export type Selector = (state: S) => V; +/** + * Options for thet Connector reactive controller. + */ export type ConnectorOptions = { + /** + * Selector function that takes state and returns a selected value. May use a + * memoized selector like one created with `reselect`. + * + * If none is provided, the controller will not subscribe the Redux store + * changes nor provide any selected value. Do this if you only wish to bring + * in the `dispatch` method to the component. + */ selector?: Selector, V>; + /** + * Function used to check whether a selected value is different from + * previously selected value. + * + * Defaults to triple equals which will suffice for directly selecting values + * out of the state that's updating with immutable pattern, or if using a + * memoized selector using a library like `reselect`. + * + * Provide a custom function here if the selector returns derived data + * that's not memoized. + */ equalityCheck?: EqualityCheck; }; +/** + * Reactive controller which subscribes to a Redux store and ties changes to a + * custom element's reactive life cycle. + * + * This controller must be used with a provider that supplies the Redux store + * using the `storeContext` from this package using the [Context + * Protocol](https://github.com/webcomponents-cg/community-protocols/blob/main/proposals/context.md). + */ export class Connector implements ReactiveController { private _host: ReactiveControllerHost & HTMLElement; private _store!: S; @@ -28,6 +61,24 @@ export class Connector implements ReactiveController { private _unsubscribe?: () => void; private _selected?: V; + /** + * Static method to create a typed version of the `Connector` constructor. + * This allows type checking for the `selector` option, the selected value, as + * well as the `dispatch` method provided by the connector. + * + * @returns `Connector` constructor with a set store type. + * + * @example + * + * ```ts + * // `AppStore` type gotten from created Redux store + * export const TypedConnector = Connector.withStoreType(); + * + * // Usage within compoennt + * // `state` will already be typed + * new TypedConnector(this, {selector: (state) => state.counter.value}); + * ``` + */ static withStoreType(): new ( host: ReactiveControllerHost & HTMLElement, options?: ConnectorOptions @@ -35,10 +86,16 @@ export class Connector implements ReactiveController { return this; } + /** + * Selected value. + */ get selected() { return this._selected as V; } + /** + * Method to dispatch an action to the store. + */ get dispatch(): S['dispatch'] { return (action) => this._store.dispatch(action); } diff --git a/packages/labs/redux/src/lib/decorators.ts b/packages/labs/redux/src/lib/decorators.ts index 2021edf71d..5931c1c2b3 100644 --- a/packages/labs/redux/src/lib/decorators.ts +++ b/packages/labs/redux/src/lib/decorators.ts @@ -8,19 +8,49 @@ import {ReactiveElement} from '@lit/reactive-element'; import {Connector, type ConnectorOptions} from './connector.js'; import type {Store} from '@reduxjs/toolkit'; -export function select( - selector: NonNullable['selector']>, - equalityCheck?: ConnectorOptions['equalityCheck'] -): SelectDecorator; -export function select( - options: ConnectorOptions -): SelectDecorator; -export function select( +type Select = { + /** + * Decorator for subscribing to a Redux store and select a value from it. On + * state change resulting in a new value, the decorated property will contain + * the new value and the component will re-render. Must use in a component + * that has the store provided in a context. + * + * @param selector Function that takes state and returns a selected value to + * be accessable. + * @param equalityCheck Function that compares selected value with a previous + * one. Defaults to triple equals. Provide a custom function if the selector + * returns a computed value that requires bespoke checking and is not + * memoized. + */ + ( + selector: NonNullable['selector']>, + equalityCheck?: ConnectorOptions['equalityCheck'] + ): SelectDecorator; + + /** + * Decorator for subscribing to a Redux store and select a value from it. On + * state change resulting in a new value, the decorated property will contain + * the new value and the component will re-render. Must use in a component + * that has the store provided in a context. + * + * @param {ConnectorOptions} options Options passed to underlying `Connector` + * controller. + * @param options.selector Function that takes state and returns a selected + * value to be accessable. + * @param options.equalityCheck Function that compares selected value with a + * previous one. Defaults to triple equals. Provide a custom function if the + * selector returns a computed value that requires bespoke checking and is not + * memoized. + */ + (options: ConnectorOptions): SelectDecorator; +}; + +export const select: Select = ( selectorOrOptions: | NonNullable['selector']> | ConnectorOptions, equalityCheck?: ConnectorOptions['equalityCheck'] -): SelectDecorator { +): SelectDecorator => { return function ( protoOrTarget: ClassAccessorDecoratorTarget, nameOrContext: PropertyKey | ClassAccessorDecoratorContext @@ -60,9 +90,13 @@ export function select( return descriptor; } }; -} +}; -export function dispatch(): DispatchDecorator { +/** + * Decorator to obtain a dispatch method from the Redux store. Must use in a + * component that has the store provided in a context. + */ +export const dispatch = (): DispatchDecorator => { return function ( protoOrTarget: ClassAccessorDecoratorTarget | undefined, nameOrContext: @@ -106,7 +140,7 @@ export function dispatch(): DispatchDecorator { return descriptor; } }; -} +}; /** * Generates a public interface type that removes private and protected fields. diff --git a/packages/labs/redux/src/lib/equality.ts b/packages/labs/redux/src/lib/equality.ts index 363acf28df..6f8e9a00de 100644 --- a/packages/labs/redux/src/lib/equality.ts +++ b/packages/labs/redux/src/lib/equality.ts @@ -7,8 +7,15 @@ // eslint-disable-next-line @typescript-eslint/no-explicit-any export type EqualityCheck = (a: T, b: T) => boolean; +/** + * Equality function that compares strict equality with `===`. + */ export const tripleEquals: EqualityCheck = (a, b) => a === b; +/** + * Equality function that shallowly compares members of complex data types such + * as arrays and objects for strict equality. + */ export const shallowEquals: EqualityCheck = (a, b) => { if (a === b) { return true; diff --git a/packages/labs/redux/src/lib/store-context.ts b/packages/labs/redux/src/lib/store-context.ts index e14cdcf30b..9501d30f35 100644 --- a/packages/labs/redux/src/lib/store-context.ts +++ b/packages/labs/redux/src/lib/store-context.ts @@ -7,5 +7,12 @@ import {createContext} from '@lit/context'; import type {Store} from '@reduxjs/toolkit'; +/** + * Unique symbol for thet store context. + */ export const storeContextKey = Symbol('redux-store'); + +/** + * Context used by `Connector` for requesting the Redux store. + */ export const storeContext = createContext(storeContextKey); From cda3564039f352b9212710f6acbb86a241ab3ef2 Mon Sep 17 00:00:00 2001 From: Augustine Kim Date: Wed, 10 Apr 2024 16:08:37 -0700 Subject: [PATCH 10/13] Update readme --- packages/labs/redux/README.md | 214 ++++++++++++++++++++++- packages/labs/redux/src/lib/connector.ts | 11 +- 2 files changed, 217 insertions(+), 8 deletions(-) diff --git a/packages/labs/redux/README.md b/packages/labs/redux/README.md index 42c8cc9d9f..8b138b1897 100644 --- a/packages/labs/redux/README.md +++ b/packages/labs/redux/README.md @@ -1,9 +1,18 @@ # @lit-labs/redux -A reactive controller for subscribing to a Redux store. +Lit element bindings for Redux. + +> **Warning** `@lit-labs/redux` is part of the Lit Labs set of packages – it is published +> in order to get feedback on the design and may receive frequent breaking changes. ## Overview +[Redux](https://redux.js.org/) is a JS library for predictable and maintainable global state management. This package provides a bindings layer for Redux, à la [`react-redux`](https://react-redux.js.org/), to be used with Lit elements. + +The package provides a [Reactive Controller](https://lit.dev/docs/composition/controllers/) to hook into the reactive update cycle of the component to subscribe to a context provided Redux store and update on changes. + +Decorators are also provided as an alternative way to select a piece of state into your component and subscribe to updates, or to provide a component with a way to dispatch actions. + ## Installation From inside your project folder, run: @@ -14,6 +23,209 @@ $ npm install @lit-labs/redux ## Usage +This [example project](../../../examples/redux/) contains a simple application showcasing usage examples. + +Note: For instructions on how to create a Redux store, consult the [Redux quick start guide](https://redux.js.org/tutorials/quick-start). The steps involving React can be replaced with the steps below. + +### Providing the store through Context + +The bindings in this package will look for the Redux store to be provided via the [Web Components Community Group Context Protocol](https://github.com/webcomponents-cg/community-protocols/blob/main/proposals/context.md). For convenience, this package re-exports a couple of utilities for providing the context from [`@lit/context`](https://lit.dev/docs/data/context/). + +#### Using the `ContextProvider` controller + +```js +import {ContextProvider, storeContext} from '@lit-labs/redux'; +import {store} from './store.js'; + +export class AppElement extends LitElement { + + _storeProvider = new ContextProvider(this, { + context: storeContext, + initialValue: store, + }); + + ... +} +``` + +#### Using the `@provide()` decorator + +```ts +import {provide, storeContext} from '@lit-labs/redux'; +import {store} from './store.js'; + +export class AppElement extends LitElement { + @provide({context: storeContext}) + private _store = store; + + ... +} +``` + +### Connect a child component to the provided store + +Note: The component must be a child of the provider above. Attempting to connect without a store provided via context will throw an error. + +#### Using the `Connector` controller + +```js +import {Connector} from '@lit-labs/redux'; +import {increment} from './counter-slice.js'; + +export class CounterElement extends LitElement { + _connector = new Connector(this, { + selector: (state) => state.counter.value, + }); + + _incrementCount() { + this._connector.dispatch(increment()); + } + + render() { + return html` + Count: ${this._connector.selected} + + `; + } +} +``` + +The `Connector` constructor takes an options object as its second argument with the following properties: + +**`selector`** + +A function that takes state and returns a selected value. A memoized selector may be used like one created with `reselect`. + +If no selector function is provided, the controller will not subscribe to Redux store changes nor provide any selected value. Do this if you only wish to bring in the `dispatch` method to the component. + +**`equalityCheck`** + +A function used to check whether a selected value is different from the previously selected value. + +It defaults to triple equals which will suffice for directly selecting values out of the state that's updating with immutable pattern, or if using a memoized selector using a library like [`reselect`](https://github.com/reduxjs/reselect). + +Provide a custom function here if the selector returns derived data that's not memoized. The `@lit-labs/redux` package also exports a `shallowEquals` function for convenience. + +--- + +The connector instance provides the following public properties: + +**`selected`** + +The value selected from state by the selector. It will be `undefined` if no selector was provided in the options. + +**`dispatch`** + +The `dispatch` method from the Redux store. Use this in other component methods to dispatch actions. + +#### Using the `@connect()` and `@dispatch()` decorators + +```ts +import {select, dispatch} from '@lit-labs/redux'; +import {increment} from './counter-slice.js'; + +export class CounterElement extends LitElement { + @select((state) => state.counter.value) + _count; + + @dispatch() + _dispatch; + + _incrementCount() { + this._dispatch(increment()); + } + + render() { + return html` + Count: ${this._count} + + `; + } +} +``` + +The `@select()` decorator can take a selector function as an argument or an options object to be passed to the underlying `Connector` controller. + +The `@dispatch()` decorator takes no arguments. + +Note: Like all the Lit 3 decorators, these decorators will work as either TypeScript experimental decorators or [standard decorators](https://lit.dev/docs/components/decorators/#standard-decorators). When running as standard decorators, `@select()` decorated fields must also have the `accessor` keyword. `@dispatch()` decorated fields do not have this requirement. + +### Usage with TypeScript + +Similar to the Redux's [TypeScript quick start](https://redux.js.org/tutorials/typescript-quick-start) guide, the following are recommended ways of using this package for better type checking. + +#### Define inferred store types + +```ts +// store.ts +import {configureStore} from '@reduxjs/toolkit'; + +export const store = configureStore({ + ... +}); + +export type AppStore = typeof store; +export type RootState = ReturnType; +export type AppDispatch = typeof store.dispatch; +``` + +#### Define typed `Connector` controller + +```ts +// app-connector.ts + +import {Connector} from '@lit-labs/redux'; +import type {AppStore} from './store.js'; + +export const AppConnector = Connector.withStoreType(); +``` + +#### Usage within component + +Using the typed controller adds type information to the constructor and pubic fields of the instance, without needing to explicitly annotate them: + +```ts +import {AppConnector} from './app-connector.js'; + +export class CounterElement extends LitElement { + _connector = new AppConnector(this, { + // `state` will be typed based on the configured store + selector: (state) => state.counter.value, + }); + + _incrementCount() { + // `this._connector.dispatch` will be typed to accept thunks + this._connector.dispatch(increment()); + } + + render() { + // Type of `this._connector.selected` will be inferred from the return type + // of the selector function provided above. + return html` + Count: ${this._connector.selected} + + `; + } +} +``` + +For decorators, you can bring in `RootState` and `AppDispatch` types for use in the decorator argument or decorated fields: + +```ts +import {select, dispatch} from '@lit-labs/redux'; +import type {RootState, AppDispatch} from './store.js'; + +export class CounterElement extends LitElement { + @select((state: RootState) => state.counter.value) + _count!: number; + + @dispatch() + _dispatch!: AppDispatch; +} +``` + +You may also need the non-null assertion `!` on the decorated fields to let TypeScript know that those fields will have assigned values by the decorator. + ## Contributing Please see [CONTRIBUTING.md](../../../CONTRIBUTING.md). diff --git a/packages/labs/redux/src/lib/connector.ts b/packages/labs/redux/src/lib/connector.ts index c6f66e2db3..95644786dd 100644 --- a/packages/labs/redux/src/lib/connector.ts +++ b/packages/labs/redux/src/lib/connector.ts @@ -26,7 +26,7 @@ export type ConnectorOptions = { * Selector function that takes state and returns a selected value. May use a * memoized selector like one created with `reselect`. * - * If none is provided, the controller will not subscribe the Redux store + * If none is provided, the controller will not subscribe to Redux store * changes nor provide any selected value. Do this if you only wish to bring * in the `dispatch` method to the component. */ @@ -66,17 +66,14 @@ export class Connector implements ReactiveController { * This allows type checking for the `selector` option, the selected value, as * well as the `dispatch` method provided by the connector. * - * @returns `Connector` constructor with a set store type. - * * @example * * ```ts * // `AppStore` type gotten from created Redux store - * export const TypedConnector = Connector.withStoreType(); + * export const AppConnector = Connector.withStoreType(); * - * // Usage within compoennt - * // `state` will already be typed - * new TypedConnector(this, {selector: (state) => state.counter.value}); + * // Usage within component – `state` will already be typed + * new AppConnector(this, {selector: (state) => state.counter.value}); * ``` */ static withStoreType(): new ( From 745ff0df35b990accd61a1429f49ca27f7e7008a Mon Sep 17 00:00:00 2001 From: Augustine Kim Date: Wed, 10 Apr 2024 16:11:39 -0700 Subject: [PATCH 11/13] Add changeset and ready for publish --- .changeset/seven-camels-roll.md | 5 +++++ packages/labs/redux/package.json | 1 - 2 files changed, 5 insertions(+), 1 deletion(-) create mode 100644 .changeset/seven-camels-roll.md diff --git a/.changeset/seven-camels-roll.md b/.changeset/seven-camels-roll.md new file mode 100644 index 0000000000..56067d97a0 --- /dev/null +++ b/.changeset/seven-camels-roll.md @@ -0,0 +1,5 @@ +--- +'@lit-labs/redux': minor +--- + +Initial release of `@lit-labs/redux`, a package containing bindings for Redux for use in Lit elements. diff --git a/packages/labs/redux/package.json b/packages/labs/redux/package.json index dcfd564c14..c242ffb059 100644 --- a/packages/labs/redux/package.json +++ b/packages/labs/redux/package.json @@ -1,5 +1,4 @@ { - "private": true, "name": "@lit-labs/redux", "version": "0.0.0", "description": "A reactive controller for subscribing to a Redux store.", From 4b8e78639e0813c8cbe776590a08b9fc913678c5 Mon Sep 17 00:00:00 2001 From: Augustine Kim Date: Wed, 10 Apr 2024 16:15:20 -0700 Subject: [PATCH 12/13] Add build and test script to monorepo root --- package.json | 3 +++ 1 file changed, 3 insertions(+) diff --git a/package.json b/package.json index 610cd1943b..62aa39a5e0 100644 --- a/package.json +++ b/package.json @@ -72,6 +72,7 @@ "./packages/labs/observers:build", "./packages/labs/preact-signals:build", "./packages/labs/react:build", + "./packages/labs/redux:build", "./packages/labs/rollup-plugin-minify-html-literals:build", "./packages/labs/router:build", "./packages/labs/scoped-registry-mixin:build", @@ -109,6 +110,7 @@ "./packages/labs/observers:build:ts", "./packages/labs/preact-signals:build:ts", "./packages/labs/react:build:ts", + "./packages/labs/redux:build:ts", "./packages/labs/rollup-plugin-minify-html-literals:build:ts", "./packages/labs/router:build:ts", "./packages/labs/scoped-registry-mixin:build:ts", @@ -171,6 +173,7 @@ "./packages/labs/gen-wrapper-vue:test", "./packages/labs/nextjs:test", "./packages/labs/preact-signals:test", + "./packages/labs/redux:test", "./packages/labs/rollup-plugin-minify-html-literals:test", "./packages/labs/ssr:test", "./packages/labs/ssr-dom-shim:test", From a6ab3c875dd1061dc93d70edbcda9f954592dd49 Mon Sep 17 00:00:00 2001 From: Augustine Kim Date: Wed, 10 Apr 2024 16:31:11 -0700 Subject: [PATCH 13/13] Add missing wireit deps --- packages/labs/redux/package.json | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/packages/labs/redux/package.json b/packages/labs/redux/package.json index c242ffb059..829dc2106d 100644 --- a/packages/labs/redux/package.json +++ b/packages/labs/redux/package.json @@ -44,14 +44,16 @@ "build:ts", "build:rollup", "../../lit:build", - "../../reactive-element:build" + "../../reactive-element:build", + "../../context:build" ] }, "build:ts": { "command": "tsc --build --pretty", "dependencies": [ "../../lit:build:ts:types", - "../../reactive-element:build:ts:types" + "../../reactive-element:build:ts:types", + "../../context:build:ts:types" ], "clean": "if-file-deleted", "files": [