├── .nvmrc ├── examples ├── todo-svelte │ ├── .gitignore │ ├── public │ │ ├── favicon.png │ │ ├── index.html │ │ └── global.css │ ├── src │ │ ├── store.js │ │ ├── main.js │ │ └── App.svelte │ ├── package.json │ ├── STORES_README.md │ ├── rollup.config.js │ ├── README.md │ ├── scripts │ │ └── setupTypeScript.js │ └── yarn.lock ├── todo-solid │ ├── src │ │ ├── Comp.jsx │ │ ├── store.js │ │ ├── index.jsx │ │ ├── App.jsx │ │ ├── AddTodo.jsx │ │ └── TodoItem.jsx │ ├── vite.config.ts │ ├── .gitignore │ ├── package.json │ ├── index.html │ ├── README.md │ └── yarn.lock └── todo-react │ ├── public │ ├── robots.txt │ ├── favicon.ico │ ├── manifest.json │ └── index.html │ ├── src │ ├── store.js │ ├── setupTests.js │ ├── App.test.js │ ├── index.css │ ├── reportWebVitals.js │ ├── index.js │ ├── buttonCreate.js │ ├── App.js │ ├── App.css │ ├── TodoItem.js │ ├── AppWithHooks.js │ ├── logo.svg │ └── PersistentApp.js │ ├── .gitignore │ ├── package.json │ ├── HOOKS_README.md │ └── README.md ├── tsconfig.json ├── src ├── type.d.ts ├── middleware.ts ├── performance.ts ├── devtools.ts ├── react.ts ├── svelte.ts ├── vue.ts ├── index.ts └── persistence.ts ├── .gitignore ├── test ├── performance.js ├── batch.js ├── test-array.js ├── performance-benchmark.js ├── test-vue-composables.js ├── test-middleware.js ├── test-edge-cases.js ├── test-svelte-stores.js ├── test-react-hooks.js ├── test-devtools.js ├── test-helpers.js ├── test-vue-watch.js ├── test-persistence.js └── test-init.js ├── License.md ├── package.json └── README.md /.nvmrc: -------------------------------------------------------------------------------- 1 | 18.0.0 -------------------------------------------------------------------------------- /examples/todo-svelte/.gitignore: -------------------------------------------------------------------------------- 1 | /node_modules/ 2 | /public/build/ 3 | 4 | .DS_Store 5 | -------------------------------------------------------------------------------- /examples/todo-solid/src/Comp.jsx: -------------------------------------------------------------------------------- 1 | export default () => { 2 | return

Hello world!!!

; 3 | }; 4 | -------------------------------------------------------------------------------- /examples/todo-react/public/robots.txt: -------------------------------------------------------------------------------- 1 | # https://www.robotstxt.org/robotstxt.html 2 | User-agent: * 3 | Disallow: 4 | -------------------------------------------------------------------------------- /examples/todo-react/public/favicon.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/vyquocvu/anystate/HEAD/examples/todo-react/public/favicon.ico -------------------------------------------------------------------------------- /examples/todo-svelte/public/favicon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/vyquocvu/anystate/HEAD/examples/todo-svelte/public/favicon.png -------------------------------------------------------------------------------- /examples/todo-react/src/store.js: -------------------------------------------------------------------------------- 1 | import { createStore } from "anystate" 2 | 3 | export const store = createStore({ 4 | todos: [], 5 | }); 6 | -------------------------------------------------------------------------------- /examples/todo-solid/src/store.js: -------------------------------------------------------------------------------- 1 | import { createStore } from "anystate" 2 | 3 | export const store = createStore({ 4 | todos: [], 5 | }); 6 | -------------------------------------------------------------------------------- /examples/todo-svelte/src/store.js: -------------------------------------------------------------------------------- 1 | import { createStore } from "anystate" 2 | 3 | export const store = createStore({ 4 | todos: [], 5 | }); 6 | -------------------------------------------------------------------------------- /examples/todo-solid/src/index.jsx: -------------------------------------------------------------------------------- 1 | /* @refresh reload */ 2 | import { render } from "solid-js/web"; 3 | 4 | import App from "./App"; 5 | 6 | render(() => , document.getElementById("root")); 7 | -------------------------------------------------------------------------------- /examples/todo-svelte/src/main.js: -------------------------------------------------------------------------------- 1 | import App from './App.svelte'; 2 | 3 | const app = new App({ 4 | target: document.body, 5 | props: { 6 | name: 'Svelte' 7 | } 8 | }); 9 | 10 | export default app; -------------------------------------------------------------------------------- /examples/todo-react/src/setupTests.js: -------------------------------------------------------------------------------- 1 | // jest-dom adds custom jest matchers for asserting on DOM nodes. 2 | // allows you to do things like: 3 | // expect(element).toHaveTextContent(/react/i) 4 | // learn more: https://github.com/testing-library/jest-dom 5 | import '@testing-library/jest-dom'; 6 | -------------------------------------------------------------------------------- /examples/todo-solid/vite.config.ts: -------------------------------------------------------------------------------- 1 | import { defineConfig } from 'vite'; 2 | import solidPlugin from 'vite-plugin-solid'; 3 | 4 | export default defineConfig({ 5 | plugins: [solidPlugin()], 6 | build: { 7 | target: 'esnext', 8 | polyfillDynamicImport: false, 9 | }, 10 | }); 11 | -------------------------------------------------------------------------------- /examples/todo-react/src/App.test.js: -------------------------------------------------------------------------------- 1 | import { render, screen } from '@testing-library/react'; 2 | import App from './App'; 3 | 4 | test('renders learn react link', () => { 5 | render(); 6 | const linkElement = screen.getByText(/learn react/i); 7 | expect(linkElement).toBeInTheDocument(); 8 | }); 9 | -------------------------------------------------------------------------------- /tsconfig.json: -------------------------------------------------------------------------------- 1 | { 2 | "compilerOptions": { 3 | "target": "esnext", 4 | "module": "commonjs", 5 | "outDir": "dist", 6 | "strict": true, 7 | "esModuleInterop": true, 8 | "skipLibCheck": true, 9 | "forceConsistentCasingInFileNames": true 10 | }, 11 | "include": ["src/**/*"] 12 | } 13 | -------------------------------------------------------------------------------- /src/type.d.ts: -------------------------------------------------------------------------------- 1 | export type Key = string | number; 2 | export type TPath = Key | Key[]; 3 | 4 | export type WatchCallback = (newValue: T, oldValue: T) => void; 5 | export type WatchObject = { [path: string]: WatchCallback }; 6 | export type Middleware = ( 7 | state: T, 8 | next: (...args: any[]) => void, 9 | ...payload: any[] 10 | ) => void; -------------------------------------------------------------------------------- /examples/todo-react/.gitignore: -------------------------------------------------------------------------------- 1 | # See https://help.github.com/articles/ignoring-files/ for more about ignoring files. 2 | 3 | # dependencies 4 | /node_modules 5 | /.pnp 6 | .pnp.js 7 | 8 | # testing 9 | /coverage 10 | 11 | # production 12 | /build 13 | 14 | # misc 15 | .DS_Store 16 | .env.local 17 | .env.development.local 18 | .env.test.local 19 | .env.production.local 20 | 21 | npm-debug.log* 22 | yarn-debug.log* 23 | yarn-error.log* 24 | -------------------------------------------------------------------------------- /examples/todo-solid/.gitignore: -------------------------------------------------------------------------------- 1 | # See https://help.github.com/articles/ignoring-files/ for more about ignoring files. 2 | 3 | # dependencies 4 | /node_modules 5 | /.pnp 6 | .pnp.js 7 | 8 | # testing 9 | /coverage 10 | 11 | # production 12 | /build 13 | 14 | # misc 15 | .DS_Store 16 | .env.local 17 | .env.development.local 18 | .env.test.local 19 | .env.production.local 20 | 21 | npm-debug.log* 22 | yarn-debug.log* 23 | yarn-error.log* 24 | -------------------------------------------------------------------------------- /examples/todo-react/src/index.css: -------------------------------------------------------------------------------- 1 | body { 2 | margin: 0; 3 | font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', 'Roboto', 'Oxygen', 4 | 'Ubuntu', 'Cantarell', 'Fira Sans', 'Droid Sans', 'Helvetica Neue', 5 | sans-serif; 6 | -webkit-font-smoothing: antialiased; 7 | -moz-osx-font-smoothing: grayscale; 8 | } 9 | 10 | code { 11 | font-family: source-code-pro, Menlo, Monaco, Consolas, 'Courier New', 12 | monospace; 13 | } 14 | -------------------------------------------------------------------------------- /examples/todo-react/src/reportWebVitals.js: -------------------------------------------------------------------------------- 1 | const reportWebVitals = onPerfEntry => { 2 | if (onPerfEntry && onPerfEntry instanceof Function) { 3 | import('web-vitals').then(({ getCLS, getFID, getFCP, getLCP, getTTFB }) => { 4 | getCLS(onPerfEntry); 5 | getFID(onPerfEntry); 6 | getFCP(onPerfEntry); 7 | getLCP(onPerfEntry); 8 | getTTFB(onPerfEntry); 9 | }); 10 | } 11 | }; 12 | 13 | export default reportWebVitals; 14 | -------------------------------------------------------------------------------- /examples/todo-solid/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "todo-solid", 3 | "version": "0.0.0", 4 | "description": "", 5 | "scripts": { 6 | "dev": "vite", 7 | "build": "vite build", 8 | "serve": "vite preview" 9 | }, 10 | "license": "MIT", 11 | "devDependencies": { 12 | "vite": "3.0.4", 13 | "vite-plugin-solid": "2.3.0" 14 | }, 15 | "dependencies": { 16 | "anystate": "0.0.2-a", 17 | "solid-js": "1.4.8" 18 | } 19 | } 20 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | # See https://help.github.com/articles/ignoring-files/ for more about ignoring files. 2 | 3 | # dependencies 4 | /node_modules 5 | /.pnp 6 | .pnp.js 7 | 8 | # testing 9 | /coverage 10 | /.nyc_output 11 | 12 | # production 13 | /build 14 | /dist 15 | /src/index.js 16 | 17 | # misc 18 | .DS_Store 19 | .env.local 20 | .env.development.local 21 | .env.test.local 22 | .env.production.local 23 | 24 | npm-debug.log* 25 | yarn-debug.log* 26 | yarn-error.log* 27 | package-lock.json 28 | -------------------------------------------------------------------------------- /examples/todo-svelte/public/index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | Svelte app 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | -------------------------------------------------------------------------------- /examples/todo-solid/index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | Solid App 8 | 9 | 10 | 11 |
12 | 13 | 14 | 15 | 16 | -------------------------------------------------------------------------------- /examples/todo-solid/src/App.jsx: -------------------------------------------------------------------------------- 1 | import { createSignal } from "solid-js"; 2 | import { store } from './store'; 3 | import AddTodo from "./AddTodo"; 4 | import TodoItem from "./TodoItem"; 5 | 6 | const App = () => { 7 | const [todos, setTodos] = createSignal(store.getItem('todos') || []); 8 | store.watch('todos', (newTodos) => { 9 | setTodos(newTodos) 10 | }); 11 | 12 | return ( 13 | <> 14 | 15 | {(item, index) => } 16 | 17 | 18 | 19 | ); 20 | }; 21 | 22 | export default App; 23 | -------------------------------------------------------------------------------- /examples/todo-react/src/index.js: -------------------------------------------------------------------------------- 1 | import React from 'react'; 2 | import ReactDOM from 'react-dom/client'; 3 | import './index.css'; 4 | import App from './App'; 5 | import reportWebVitals from './reportWebVitals'; 6 | 7 | const root = ReactDOM.createRoot(document.getElementById('root')); 8 | root.render( 9 | 10 | 11 | 12 | ); 13 | 14 | // If you want to start measuring performance in your app, pass a function 15 | // to log results (for example: reportWebVitals(console.log)) 16 | // or send to an analytics endpoint. Learn more: https://bit.ly/CRA-vitals 17 | reportWebVitals(); 18 | -------------------------------------------------------------------------------- /examples/todo-react/public/manifest.json: -------------------------------------------------------------------------------- 1 | { 2 | "short_name": "React App", 3 | "name": "Create React App Sample", 4 | "icons": [ 5 | { 6 | "src": "favicon.ico", 7 | "sizes": "64x64 32x32 24x24 16x16", 8 | "type": "image/x-icon" 9 | }, 10 | { 11 | "src": "logo192.png", 12 | "type": "image/png", 13 | "sizes": "192x192" 14 | }, 15 | { 16 | "src": "logo512.png", 17 | "type": "image/png", 18 | "sizes": "512x512" 19 | } 20 | ], 21 | "start_url": ".", 22 | "display": "standalone", 23 | "theme_color": "#000000", 24 | "background_color": "#ffffff" 25 | } 26 | -------------------------------------------------------------------------------- /examples/todo-react/src/buttonCreate.js: -------------------------------------------------------------------------------- 1 | import { useState } from 'react'; 2 | import { store } from './store'; 3 | 4 | 5 | const ButtonCreate = () => { 6 | const [text, setText] = useState(''); 7 | const onClick = () => { 8 | const todos = store.getItem('todos') 9 | store.setItem('todos', todos.concat({ 10 | text: text, 11 | status: '' 12 | })); 13 | setText(''); 14 | } 15 | return ( 16 |
17 | setText(e.target.value)} /> 18 | 19 |
20 | )}; 21 | export default ButtonCreate; -------------------------------------------------------------------------------- /examples/todo-solid/src/AddTodo.jsx: -------------------------------------------------------------------------------- 1 | import { createSignal } from 'solid-js'; 2 | import { store } from './store'; 3 | 4 | 5 | const AddTodo = () => { 6 | const [text, setText] = createSignal(''); 7 | const onClick = () => { 8 | const todos = store.getItem('todos') 9 | store.setItem('todos', todos.concat({ 10 | text: text(), 11 | status: '' 12 | })); 13 | setText(''); 14 | } 15 | return ( 16 |
17 | setText(e.target.value)} /> 18 | 19 |
20 | )}; 21 | export default AddTodo; -------------------------------------------------------------------------------- /examples/todo-react/src/App.js: -------------------------------------------------------------------------------- 1 | import './App.css'; 2 | import { useState } from 'react'; 3 | import { store } from './store'; 4 | import ButtonCreate from './buttonCreate'; 5 | import TodoItem from './TodoItem'; 6 | 7 | function App() { 8 | const [todos, setTodos] = useState(store.getItem('todos') || []); 9 | store.watch('todos', (newTodos) => { 10 | setTodos(newTodos) 11 | }); 12 | 13 | return ( 14 |
15 | { 16 | todos.map((todo, index) => ( 17 | 18 | )) 19 | } 20 | 21 |
22 | ); 23 | } 24 | 25 | export default App; 26 | -------------------------------------------------------------------------------- /examples/todo-svelte/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "svelte-app", 3 | "version": "1.0.0", 4 | "private": true, 5 | "scripts": { 6 | "build": "rollup -c", 7 | "dev": "rollup -c -w", 8 | "start": "sirv public --no-clear" 9 | }, 10 | "devDependencies": { 11 | "@rollup/plugin-commonjs": "^17.0.0", 12 | "@rollup/plugin-node-resolve": "^11.0.0", 13 | "rollup": "^2.3.4", 14 | "rollup-plugin-css-only": "^3.1.0", 15 | "rollup-plugin-livereload": "^2.0.0", 16 | "rollup-plugin-svelte": "^7.0.0", 17 | "rollup-plugin-terser": "^7.0.0", 18 | "svelte": "^3.0.0" 19 | }, 20 | "dependencies": { 21 | "anystate": "^0.0.2-a", 22 | "sirv-cli": "^2.0.0" 23 | } 24 | } 25 | -------------------------------------------------------------------------------- /src/middleware.ts: -------------------------------------------------------------------------------- 1 | import type { Middleware } from './type'; 2 | 3 | export const applyMiddleware = ( 4 | middlewares: Middleware[], 5 | getState: () => T | null 6 | ) => { 7 | return (fn: (...args: any[]) => void) => { 8 | return (...args: any[]) => { 9 | const composed: (...args: any[]) => void = middlewares.reduceRight( 10 | (next, middleware) => { 11 | return (...a: any[]) => { 12 | const state = getState(); 13 | if (state) { 14 | (middleware as any).apply(null, [state, next].concat(a)); 15 | } 16 | }; 17 | }, 18 | fn 19 | ); 20 | composed(...args); 21 | }; 22 | }; 23 | }; 24 | -------------------------------------------------------------------------------- /examples/todo-react/src/App.css: -------------------------------------------------------------------------------- 1 | .App { 2 | text-align: center; 3 | } 4 | 5 | .App-logo { 6 | height: 40vmin; 7 | pointer-events: none; 8 | } 9 | 10 | @media (prefers-reduced-motion: no-preference) { 11 | .App-logo { 12 | animation: App-logo-spin infinite 20s linear; 13 | } 14 | } 15 | 16 | .App-header { 17 | background-color: #282c34; 18 | min-height: 100vh; 19 | display: flex; 20 | flex-direction: column; 21 | align-items: center; 22 | justify-content: center; 23 | font-size: calc(10px + 2vmin); 24 | color: white; 25 | } 26 | 27 | .App-link { 28 | color: #61dafb; 29 | } 30 | 31 | @keyframes App-logo-spin { 32 | from { 33 | transform: rotate(0deg); 34 | } 35 | to { 36 | transform: rotate(360deg); 37 | } 38 | } 39 | -------------------------------------------------------------------------------- /examples/todo-react/src/TodoItem.js: -------------------------------------------------------------------------------- 1 | import { store } from './store'; 2 | 3 | const TodoItem = ({ onClick, completed, item, index }) => { 4 | 5 | const removeItem = () => { 6 | let todos = store.getItem('todos'); 7 | store.setItem('todos', todos.filter((_, i) => i !== index)); 8 | } 9 | 10 | const toggleTodo = (e) => { 11 | // TODO update get State 12 | let todos = store.getItem('todos'); 13 | todos[index].status = e.target.checked ? 'done' : ''; 14 | store.setItem('todos', todos); 15 | } 16 | return ( 17 |
18 | 19 | {item.text} 20 | 21 |
22 | ) 23 | } 24 | 25 | export default TodoItem; -------------------------------------------------------------------------------- /examples/todo-solid/src/TodoItem.jsx: -------------------------------------------------------------------------------- 1 | import { store } from './store'; 2 | 3 | const TodoItem = ({ item, index }) => { 4 | 5 | const idx = index(); 6 | const removeItem = () => { 7 | let todos = store.getItem('todos'); 8 | store.setItem('todos', todos.filter((_, i) => i !== idx)); 9 | } 10 | 11 | const toggleTodo = (e) => { 12 | // TODO update get State 13 | let todos = store.getItem('todos'); 14 | todos[idx].status = e.target.checked ? 'done' : ''; 15 | store.setItem('todos', todos); 16 | } 17 | return ( 18 |
19 | 20 | {item.text} 21 | 22 |
23 | ) 24 | } 25 | 26 | export default TodoItem; -------------------------------------------------------------------------------- /src/performance.ts: -------------------------------------------------------------------------------- 1 | import { sendToDevTools } from './devtools'; 2 | 3 | export const trackPerformance = any>( 4 | fnName: string, 5 | fn: T, 6 | ): ((...args: Parameters) => ReturnType) => { 7 | return (...args: Parameters): ReturnType => { 8 | const start = performance.now(); 9 | const result = fn(...args); 10 | const end = performance.now(); 11 | const duration = end - start; 12 | console.log(`${fnName} took ${duration}ms`); 13 | sendToDevTools(`@performance/${fnName}`, { duration }); 14 | return result; 15 | }; 16 | }; 17 | 18 | export const trackMemory = (state: object) => { 19 | const memoryUsage = new TextEncoder().encode(JSON.stringify(state)).length; 20 | console.log(`State memory usage: ${memoryUsage} bytes`); 21 | }; 22 | -------------------------------------------------------------------------------- /examples/todo-react/src/AppWithHooks.js: -------------------------------------------------------------------------------- 1 | import './App.css'; 2 | import { useAnyState } from 'anystate'; 3 | import { store } from './store'; 4 | import ButtonCreate from './buttonCreate'; 5 | import TodoItem from './TodoItem'; 6 | 7 | function AppWithHooks() { 8 | // Using the new useAnyState hook instead of manual useState + watch 9 | const [todos, setTodos] = useAnyState(store, 'todos'); 10 | 11 | return ( 12 |
13 |

Todo App with anyState React Hooks

14 |

This version uses the new useAnyState hook for cleaner integration

15 | { 16 | (todos || []).map((todo, index) => ( 17 | 18 | )) 19 | } 20 | 21 |
22 | ); 23 | } 24 | 25 | export default AppWithHooks; -------------------------------------------------------------------------------- /test/performance.js: -------------------------------------------------------------------------------- 1 | const assert = require('assert'); 2 | const { createStore } = require('../dist/index'); 3 | 4 | describe('Performance', () => { 5 | let logs = []; 6 | const originalLog = console.log; 7 | beforeEach(() => { 8 | console.log = (...args) => { 9 | logs.push(args.join(' ')); 10 | }; 11 | }); 12 | afterEach(() => { 13 | console.log = originalLog; 14 | logs = []; 15 | }); 16 | 17 | it('should track performance', () => { 18 | const store = createStore({ a: 1 }); 19 | store.setState({ a: 2 }); 20 | assert.strictEqual(store.getState().a, 2); 21 | assert.ok(logs.some(log => log.includes('setState took'))); 22 | assert.ok(logs.some(log => log.includes('getState took'))); 23 | }); 24 | 25 | it('should track memory', () => { 26 | const store = createStore({ a: 1 }); 27 | store.logMemoryUsage(); 28 | assert.ok(logs.some(log => log.includes('State memory usage'))); 29 | }); 30 | }); 31 | -------------------------------------------------------------------------------- /examples/todo-react/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "todo-react", 3 | "version": "0.1.0", 4 | "private": true, 5 | "dependencies": { 6 | "@testing-library/jest-dom": "^5.16.5", 7 | "@testing-library/react": "^13.3.0", 8 | "@testing-library/user-event": "^13.5.0", 9 | "anystate": "0.0.2-a", 10 | "react": "^18.2.0", 11 | "react-dom": "^18.2.0", 12 | "react-scripts": "5.0.1", 13 | "web-vitals": "^2.1.4" 14 | }, 15 | "scripts": { 16 | "start": "react-scripts start", 17 | "build": "react-scripts build", 18 | "test": "react-scripts test", 19 | "eject": "react-scripts eject" 20 | }, 21 | "eslintConfig": { 22 | "extends": [ 23 | "react-app", 24 | "react-app/jest" 25 | ] 26 | }, 27 | "browserslist": { 28 | "production": [ 29 | ">0.2%", 30 | "not dead", 31 | "not op_mini all" 32 | ], 33 | "development": [ 34 | "last 1 chrome version", 35 | "last 1 firefox version", 36 | "last 1 safari version" 37 | ] 38 | } 39 | } 40 | -------------------------------------------------------------------------------- /License.md: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) 2022 Vy Quốc Vũ 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. 22 | -------------------------------------------------------------------------------- /examples/todo-svelte/public/global.css: -------------------------------------------------------------------------------- 1 | html, body { 2 | position: relative; 3 | width: 100%; 4 | height: 100%; 5 | } 6 | 7 | body { 8 | color: #333; 9 | margin: 0; 10 | padding: 8px; 11 | box-sizing: border-box; 12 | font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Oxygen-Sans, Ubuntu, Cantarell, "Helvetica Neue", sans-serif; 13 | } 14 | 15 | a { 16 | color: rgb(0,100,200); 17 | text-decoration: none; 18 | } 19 | 20 | a:hover { 21 | text-decoration: underline; 22 | } 23 | 24 | a:visited { 25 | color: rgb(0,80,160); 26 | } 27 | 28 | label { 29 | display: block; 30 | } 31 | 32 | input, button, select, textarea { 33 | font-family: inherit; 34 | font-size: inherit; 35 | -webkit-padding: 0.4em 0; 36 | padding: 0.4em; 37 | margin: 0 0 0.5em 0; 38 | box-sizing: border-box; 39 | border: 1px solid #ccc; 40 | border-radius: 2px; 41 | } 42 | 43 | input:disabled { 44 | color: #ccc; 45 | } 46 | 47 | button { 48 | color: #333; 49 | background-color: #f4f4f4; 50 | outline: none; 51 | } 52 | 53 | button:disabled { 54 | color: #999; 55 | } 56 | 57 | button:not(:disabled):active { 58 | background-color: #ddd; 59 | } 60 | 61 | button:focus { 62 | border-color: #666; 63 | } 64 | -------------------------------------------------------------------------------- /src/devtools.ts: -------------------------------------------------------------------------------- 1 | import type { Key } from './type'; 2 | 3 | declare global { 4 | interface Window { 5 | __REDUX_DEVTOOLS_EXTENSION__: any; 6 | } 7 | } 8 | 9 | type Action = { 10 | type: string; 11 | payload?: any; 12 | }; 13 | 14 | type DevTools = { 15 | send: (action: Action, state: any) => void; 16 | subscribe: (listener: (message: any) => void) => () => void; 17 | init: (state: any) => void; 18 | }; 19 | 20 | let devTools: DevTools | null = null; 21 | 22 | export const connectDevTools = ( 23 | initialState: T, 24 | setState: (newState: T) => void, 25 | ) => { 26 | if (typeof window !== 'undefined' && window.__REDUX_DEVTOOLS_EXTENSION__) { 27 | devTools = window.__REDUX_DEVTOOLS_EXTENSION__.connect(); 28 | if (devTools) { 29 | devTools.init(initialState); 30 | 31 | devTools.subscribe((message) => { 32 | if (message.type === 'DISPATCH' && message.payload.type === 'JUMP_TO_STATE') { 33 | setState(JSON.parse(message.state)); 34 | } 35 | }); 36 | } 37 | } 38 | }; 39 | 40 | export const sendToDevTools = (action: string, state: any, payload?: any) => { 41 | if (devTools && devTools.send) { 42 | devTools.send({ type: action, payload }, state); 43 | } 44 | }; 45 | -------------------------------------------------------------------------------- /test/batch.js: -------------------------------------------------------------------------------- 1 | const assert = require('assert'); 2 | const { createStore } = require('../dist/index'); 3 | 4 | describe('Batching', () => { 5 | it('should batch updates', (done) => { 6 | const store = createStore({ a: 1, b: 2 }); 7 | let watchCount = 0; 8 | store.watch('a', () => { 9 | watchCount++; 10 | }); 11 | store.watch('b', () => { 12 | watchCount++; 13 | }); 14 | 15 | store.batch(() => { 16 | store.setItem('a', 2); 17 | store.setItem('b', 3); 18 | }); 19 | 20 | assert.strictEqual(store.getItem('a'), 2); 21 | assert.strictEqual(store.getItem('b'), 3); 22 | assert.strictEqual(watchCount, 2); 23 | done(); 24 | }); 25 | 26 | it('should run atomic updates', (done) => { 27 | const store = createStore({ a: 1, b: 2 }); 28 | let watchCount = 0; 29 | store.watch('a', () => { 30 | watchCount++; 31 | }); 32 | store.watch('b', () => { 33 | watchCount++; 34 | }); 35 | 36 | store.atomic(() => { 37 | store.setItem('a', 2); 38 | store.setItem('b', 3); 39 | }); 40 | 41 | assert.strictEqual(store.getItem('a'), 2); 42 | assert.strictEqual(store.getItem('b'), 3); 43 | assert.strictEqual(watchCount, 0); 44 | done(); 45 | }); 46 | }); 47 | -------------------------------------------------------------------------------- /examples/todo-react/HOOKS_README.md: -------------------------------------------------------------------------------- 1 | # React Todo App with anyState Hooks 2 | 3 | This example demonstrates the new React hooks integration for anyState. 4 | 5 | ## What's New 6 | 7 | The `AppWithHooks.js` file shows how to use the new `useAnyState` hook instead of manually managing `useState` and `watch` calls. 8 | 9 | ### Before (Traditional Approach) 10 | ```jsx 11 | function App() { 12 | const [todos, setTodos] = useState(store.getItem('todos') || []); 13 | store.watch('todos', (newTodos) => { 14 | setTodos(newTodos) 15 | }); 16 | // ... 17 | } 18 | ``` 19 | 20 | ### After (With Hooks) 21 | ```jsx 22 | import { useAnyState } from 'anystate'; 23 | 24 | function AppWithHooks() { 25 | const [todos, setTodos] = useAnyState(store, 'todos'); 26 | // That's it! No manual watch setup needed 27 | } 28 | ``` 29 | 30 | ## Benefits 31 | 32 | 1. **Cleaner Code**: No need to manually set up watch listeners 33 | 2. **Automatic Cleanup**: The hook handles unsubscribing when component unmounts 34 | 3. **Better Performance**: Optimized to prevent unnecessary re-renders 35 | 4. **TypeScript Support**: Full type safety when using TypeScript 36 | 37 | ## Running the Example 38 | 39 | ```bash 40 | npm install 41 | npm start 42 | ``` 43 | 44 | The app will run on `http://localhost:3000` -------------------------------------------------------------------------------- /examples/todo-solid/README.md: -------------------------------------------------------------------------------- 1 | ## Solid todo app with anystate (state management) 2 | []: # [Solid Todo](/examples/todo-solid) 3 | 4 | ## Usage 5 | 6 | Those templates dependencies are maintained via [pnpm](https://pnpm.io) via `pnpm up -Lri`. 7 | 8 | This is the reason you see a `pnpm-lock.yaml`. That being said, any package manager will work. This file can be safely be removed once you clone a template. 9 | 10 | ```bash 11 | $ npm install # or pnpm install or yarn install 12 | ``` 13 | 14 | ### Learn more on the [Solid Website](https://solidjs.com) and come chat with us on our [Discord](https://discord.com/invite/solidjs) 15 | 16 | ## Available Scripts 17 | 18 | In the project directory, you can run: 19 | 20 | ### `npm dev` or `npm start` 21 | 22 | Runs the app in the development mode.
23 | Open [http://localhost:3000](http://localhost:3000) to view it in the browser. 24 | 25 | The page will reload if you make edits.
26 | 27 | ### `npm run build` 28 | 29 | Builds the app for production to the `dist` folder.
30 | It correctly bundles Solid in production mode and optimizes the build for the best performance. 31 | 32 | The build is minified and the filenames include the hashes.
33 | Your app is ready to be deployed! 34 | 35 | ## Deployment 36 | 37 | You can deploy the `dist` folder to any static host provider (netlify, surge, now, etc.) 38 | -------------------------------------------------------------------------------- /test/test-array.js: -------------------------------------------------------------------------------- 1 | var assert = require('assert'); 2 | var { createStore } = require('../dist/index.js'); 3 | 4 | describe('Test State array', function () { 5 | let state; 6 | 7 | beforeEach(() => { 8 | state = createStore({ 9 | x: 0, 10 | items: [], 11 | }); 12 | }); 13 | 14 | describe('Initial state', function () { 15 | it(`[Not shadow] Should return [ { id: 1, name: 'item 1' } ]`, function () { 16 | const items = [{ id: 1, name: 'item 1' }]; 17 | state.setItem('items', items); 18 | assert.deepEqual(state.getItem(['items']), [{ id: 1, name: 'item 1' }]); 19 | }); 20 | 21 | it(`[Not shadow] Should not be mutable from outside`, function () { 22 | const initialItems = [{ id: 1, name: 'item 1' }]; 23 | state.setItem('items', initialItems); 24 | 25 | const itemsFromState = state.getItem('items'); 26 | itemsFromState[0].name = 'item 1 updated'; 27 | 28 | assert.deepEqual(state.getItem(['items']), [{ id: 1, name: 'item 1' }]); 29 | }); 30 | 31 | it(`[Update array element] Should return [ { id: 1, name: 'item 1 updated updated' } ]`, function () { 32 | const items = [{ id: 1, name: 'item 1' }]; 33 | state.setItem('items', items); 34 | state.setItem('items[0].name', 'item 1 updated updated'); 35 | assert.deepEqual(state.getItem(['items']), [{ id: 1, name: 'item 1 updated updated' }]); 36 | }); 37 | }); 38 | }); 39 | -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "anystate", 3 | "version": "0.0.2-a", 4 | "author": "Vy Quốc Vũ ", 5 | "description": "state management for any framework", 6 | "main": "dist/index.js", 7 | "scripts": { 8 | "test": "mocha", 9 | "coverage": "nyc mocha", 10 | "dev": "tsc --watch", 11 | "build": "tsc && uglifyjs dist/index.js --compress --mangle -o dist/bundle.js" 12 | }, 13 | "repository": { 14 | "type": "git", 15 | "url": "git@github.com:vyquocvu/anyState.git" 16 | }, 17 | "keywords": [ 18 | "state", 19 | "management" 20 | ], 21 | "license": "MIT", 22 | "peerDependencies": { 23 | "react": ">=16.8.0", 24 | "svelte": ">=3.0.0", 25 | "vue": ">=3.0.0" 26 | }, 27 | "peerDependenciesMeta": { 28 | "react": { 29 | "optional": true 30 | }, 31 | "vue": { 32 | "optional": true 33 | }, 34 | "svelte": { 35 | "optional": true 36 | } 37 | }, 38 | "devDependencies": { 39 | "@size-limit/preset-small-lib": "^8.1.0", 40 | "@types/node": "17.0.29", 41 | "@types/react": "^18.3.24", 42 | "jsdom": "^27.0.1", 43 | "mocha": "^10.0.0", 44 | "nyc": "^17.1.0", 45 | "react": "^18.3.1", 46 | "react-dom": "^18.3.1", 47 | "size-limit": "^8.1.0", 48 | "svelte": "^5.39.2", 49 | "typescript": "^5.9.3", 50 | "uglify-js": "^3.16.3", 51 | "vue": "^3.5.21" 52 | }, 53 | "size-limit": [ 54 | { 55 | "path": "dist/bundle.js", 56 | "limit": "5 kB" 57 | } 58 | ] 59 | } 60 | -------------------------------------------------------------------------------- /test/performance-benchmark.js: -------------------------------------------------------------------------------- 1 | const assert = require('assert'); 2 | const { createStore } = require('../dist/index'); 3 | 4 | describe('Performance Benchmarks', () => { 5 | const largeState = {}; 6 | for (let i = 0; i < 1000; i++) { 7 | largeState[`key${i}`] = { value: i }; 8 | } 9 | 10 | it('should handle large state object with setState', () => { 11 | const store = createStore(largeState); 12 | const start = process.hrtime(); 13 | store.setState({ key500: { value: 501 } }); 14 | const end = process.hrtime(start); 15 | const duration = (end[0] * 1e9 + end[1]) / 1e6; 16 | assert.ok(duration < 10, `setState took ${duration}ms, which is too long.`); 17 | }); 18 | 19 | it('should handle large state object with getState', () => { 20 | const store = createStore(largeState); 21 | const start = process.hrtime(); 22 | store.getState(); 23 | const end = process.hrtime(start); 24 | const duration = (end[0] * 1e9 + end[1]) / 1e6; 25 | assert.ok(duration < 5, `getState took ${duration}ms, which is too long.`); 26 | }); 27 | 28 | it('should handle watchers with a large state object', () => { 29 | const store = createStore(largeState); 30 | let watchCount = 0; 31 | store.watch('key777', () => { 32 | watchCount++; 33 | }); 34 | const start = process.hrtime(); 35 | store.setState({ key777: { value: 778 } }); 36 | const end = process.hrtime(start); 37 | const duration = (end[0] * 1e9 + end[1]) / 1e6; 38 | assert.strictEqual(watchCount, 1); 39 | assert.ok(duration < 10, `Watcher took ${duration}ms, which is too long.`); 40 | }); 41 | }); 42 | -------------------------------------------------------------------------------- /examples/todo-svelte/src/App.svelte: -------------------------------------------------------------------------------- 1 | 28 | 29 |
30 |

TODO {name}!

31 |
    32 | {#each todos as todo, i} 33 |
  • 34 | toggleTodo(i)} checked={todo.status === 'done'} type="checkbox" /> 35 | {todo.text} 36 | 37 |
  • 38 | {/each} 39 |
    40 | 41 | 42 |
    43 |
44 | 45 | -------------------------------------------------------------------------------- /src/react.ts: -------------------------------------------------------------------------------- 1 | import { useState, useEffect } from 'react'; 2 | import type { Key, TPath } from './type'; 3 | 4 | interface AnyStateStore { 5 | getItem: (path: TPath) => any; 6 | setItem: (path: TPath, value: any) => void; 7 | watch: (path: string, callback: (newValue: any, oldValue: any) => void) => () => void; 8 | } 9 | 10 | /** 11 | * React hook for anyState integration 12 | * @param store - The anyState store instance 13 | * @param path - The path to watch in the store 14 | * @returns [value, setValue] tuple similar to useState 15 | */ 16 | export function useAnyState(store: AnyStateStore, path: TPath): [T, (value: T) => void] { 17 | const [value, setValue] = useState(() => store.getItem(path)); 18 | 19 | useEffect(() => { 20 | return store.watch(path as string, (newValue) => setValue(newValue)); 21 | }, [store, path]); 22 | 23 | const updateValue = (newValue: T) => store.setItem(path, newValue); 24 | 25 | return [value, updateValue]; 26 | } 27 | 28 | /** 29 | * React hook for multiple anyState values 30 | * @param store - The anyState store instance 31 | * @param paths - Object with keys as property names and values as paths to watch 32 | * @returns Object with the same keys but values from the store 33 | */ 34 | export function useAnyStateMultiple>( 35 | store: AnyStateStore, 36 | paths: Record 37 | ): T & { [K in keyof T]: (value: T[K]) => void } { 38 | const result = {} as any; 39 | 40 | for (const key in paths) { 41 | const [value, setValue] = useAnyState(store, paths[key]); 42 | result[key] = value; 43 | result[`set${key.charAt(0).toUpperCase() + key.slice(1)}`] = setValue; 44 | } 45 | 46 | return result; 47 | } -------------------------------------------------------------------------------- /examples/todo-react/public/index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 12 | 16 | 17 | 26 | React App 27 | 28 | 29 | 30 |
31 | 41 | 42 | 43 | -------------------------------------------------------------------------------- /examples/todo-svelte/STORES_README.md: -------------------------------------------------------------------------------- 1 | # Svelte Todo App with anyState Stores 2 | 3 | This example demonstrates the new Svelte stores integration for anyState. 4 | 5 | ## What's New 6 | 7 | The anyState library now provides native Svelte store integration with these functions: 8 | 9 | - `createAnyStateStore(store, path)` - Creates a writable Svelte store 10 | - `createAnyStateStores(store, paths)` - Creates multiple stores at once 11 | - `createAnyStateDerived(store, paths, deriveFn)` - Creates derived stores 12 | - `createAnyStateReadable(store, path)` - Creates read-only stores 13 | 14 | ### Before (Manual Integration) 15 | ```svelte 16 | 27 | ``` 28 | 29 | ### After (With Stores Integration) 30 | ```svelte 31 | 39 | 40 |
41 | {#each $todos as todo} 42 |

{todo.text}

43 | {/each} 44 |
45 | ``` 46 | 47 | ## Benefits 48 | 49 | 1. **Native Svelte Integration**: Works seamlessly with Svelte's reactivity system 50 | 2. **Automatic Synchronization**: Changes in anyState automatically update Svelte stores 51 | 3. **Bidirectional Binding**: Changes in Svelte stores update anyState 52 | 4. **Standard Svelte API**: Use familiar `$store` syntax and store methods 53 | 5. **TypeScript Support**: Full type safety when using TypeScript 54 | 55 | ## Running the Example 56 | 57 | ```bash 58 | npm install 59 | npm run dev 60 | ``` 61 | 62 | The app will run on `http://localhost:5000` -------------------------------------------------------------------------------- /test/test-vue-composables.js: -------------------------------------------------------------------------------- 1 | var assert = require('assert'); 2 | var { createStore, useAnyStateVue, useAnyStateMultipleVue, useAnyStateComputed } = require('../dist/index.js'); 3 | 4 | describe('Vue Composables Integration', function () { 5 | describe('useAnyStateVue composable', function () { 6 | it('should be exportable as a function', function () { 7 | assert.equal(typeof useAnyStateVue, 'function'); 8 | }); 9 | 10 | it('should be compatible with store interface', function () { 11 | const store = createStore({ count: 0, user: { name: 'John' } }); 12 | 13 | // Test that the composable accepts store and path parameters 14 | // Note: We can't actually run Vue composables in Node.js tests without Vue test environment 15 | // But we can test that the functions exist and have correct interfaces 16 | assert.equal(typeof store.getItem, 'function'); 17 | assert.equal(typeof store.setItem, 'function'); 18 | assert.equal(typeof store.watch, 'function'); 19 | 20 | // Test that the required store methods work as expected 21 | assert.equal(store.getItem('count'), 0); 22 | assert.equal(store.getItem('user.name'), 'John'); 23 | 24 | let watchCalled = false; 25 | const unwatch = store.watch('count', (newValue, oldValue) => { 26 | watchCalled = true; 27 | assert.equal(oldValue, 0); 28 | assert.equal(newValue, 1); 29 | }); 30 | 31 | store.setItem('count', 1); 32 | assert.equal(watchCalled, true); 33 | 34 | if (typeof unwatch === 'function') { 35 | unwatch(); 36 | } 37 | }); 38 | }); 39 | 40 | describe('useAnyStateMultipleVue composable', function () { 41 | it('should be exportable as a function', function () { 42 | assert.equal(typeof useAnyStateMultipleVue, 'function'); 43 | }); 44 | }); 45 | 46 | describe('useAnyStateComputed composable', function () { 47 | it('should be exportable as a function', function () { 48 | assert.equal(typeof useAnyStateComputed, 'function'); 49 | }); 50 | }); 51 | }); -------------------------------------------------------------------------------- /test/test-middleware.js: -------------------------------------------------------------------------------- 1 | const assert = require('assert'); 2 | const { createStore } = require('../dist/index.js'); 3 | 4 | describe('Middleware', () => { 5 | it('should call a single middleware', (done) => { 6 | const middleware = (state, next, payload) => { 7 | assert.deepStrictEqual(state, { count: 0 }); 8 | next(payload); 9 | done(); 10 | }; 11 | const store = createStore({ count: 0 }, [middleware]); 12 | store.setState({ count: 1 }); 13 | }); 14 | 15 | it('should call multiple middleware in order', () => { 16 | let callOrder = []; 17 | const middleware1 = (state, next, payload) => { 18 | callOrder.push(1); 19 | next(payload); 20 | }; 21 | const middleware2 = (state, next, payload) => { 22 | callOrder.push(2); 23 | next(payload); 24 | }; 25 | const store = createStore({ count: 0 }, [middleware1, middleware2]); 26 | store.setState({ count: 1 }); 27 | assert.deepStrictEqual(callOrder, [1, 2]); 28 | }); 29 | 30 | it('should modify state with middleware', () => { 31 | const middleware = (state, next, payload) => { 32 | next({ ...payload, count: payload.count + 1 }); 33 | }; 34 | const store = createStore({ count: 0 }, [middleware]); 35 | store.setState({ count: 1 }); 36 | assert.deepStrictEqual(store.getState(), { count: 2 }); 37 | }); 38 | 39 | it('should modify state with middleware using setItem', () => { 40 | const middleware = (state, next, key, value) => { 41 | next(key, value + 1); 42 | }; 43 | const store = createStore({ count: 0 }, [middleware]); 44 | store.setItem('count', 1); 45 | assert.deepStrictEqual(store.getState(), { count: 2 }); 46 | }); 47 | 48 | it('should handle asynchronous middleware', (done) => { 49 | const middleware = (state, next, payload) => { 50 | setTimeout(() => { 51 | next(payload); 52 | assert.deepStrictEqual(store.getState(), { count: 1 }); 53 | done(); 54 | }, 10); 55 | }; 56 | const store = createStore({ count: 0 }, [middleware]); 57 | store.setState({ count: 1 }); 58 | }); 59 | }); 60 | -------------------------------------------------------------------------------- /test/test-edge-cases.js: -------------------------------------------------------------------------------- 1 | const assert = require('assert'); 2 | const { createStore } = require('../dist/index'); 3 | 4 | describe('Edge Case Testing', () => { 5 | describe('Initial State', () => { 6 | it('should handle empty initial state', () => { 7 | const store = createStore(); 8 | assert.deepStrictEqual(store.getState(), {}); 9 | }); 10 | 11 | it('should handle initial state with null values', () => { 12 | const store = createStore({ a: null, b: { c: null } }); 13 | assert.deepStrictEqual(store.getState(), { a: null, b: { c: null } }); 14 | }); 15 | }); 16 | 17 | describe('State Updates', () => { 18 | it('should handle setting state to undefined', () => { 19 | const store = createStore({ a: 1 }); 20 | store.setState({ a: undefined }); 21 | assert.strictEqual(store.getState().a, undefined); 22 | }); 23 | 24 | it('should handle updates with empty objects', () => { 25 | const store = createStore({ a: { b: 1 } }); 26 | store.setState({ a: {} }); 27 | assert.deepStrictEqual(store.getState().a, {}); 28 | }); 29 | 30 | it('should handle updates with empty arrays', () => { 31 | const store = createStore({ a: [1, 2, 3] }); 32 | store.setState({ a: [] }); 33 | assert.deepStrictEqual(store.getState().a, []); 34 | }); 35 | }); 36 | 37 | describe('Watchers', () => { 38 | it('should not trigger watcher for same value update', () => { 39 | const store = createStore({ a: 1 }); 40 | let watchCount = 0; 41 | store.watch('a', () => { 42 | watchCount++; 43 | }); 44 | store.setState({ a: 1 }); 45 | assert.strictEqual(watchCount, 0); 46 | }); 47 | 48 | it('should handle unwatching inside a watcher', () => { 49 | const store = createStore({ a: 0 }); 50 | let unwatch; 51 | let watchCount = 0; 52 | unwatch = store.watch('a', () => { 53 | watchCount++; 54 | unwatch(); 55 | }); 56 | store.setState({ a: 1 }); 57 | store.setState({ a: 2 }); 58 | assert.strictEqual(watchCount, 1); 59 | }); 60 | }); 61 | }); 62 | -------------------------------------------------------------------------------- /examples/todo-svelte/rollup.config.js: -------------------------------------------------------------------------------- 1 | import svelte from 'rollup-plugin-svelte'; 2 | import commonjs from '@rollup/plugin-commonjs'; 3 | import resolve from '@rollup/plugin-node-resolve'; 4 | import livereload from 'rollup-plugin-livereload'; 5 | import { terser } from 'rollup-plugin-terser'; 6 | import css from 'rollup-plugin-css-only'; 7 | 8 | const production = !process.env.ROLLUP_WATCH; 9 | 10 | function serve() { 11 | let server; 12 | 13 | function toExit() { 14 | if (server) server.kill(0); 15 | } 16 | 17 | return { 18 | writeBundle() { 19 | if (server) return; 20 | server = require('child_process').spawn('npm', ['run', 'start', '--', '--dev'], { 21 | stdio: ['ignore', 'inherit', 'inherit'], 22 | shell: true 23 | }); 24 | 25 | process.on('SIGTERM', toExit); 26 | process.on('exit', toExit); 27 | } 28 | }; 29 | } 30 | 31 | export default { 32 | input: 'src/main.js', 33 | output: { 34 | sourcemap: true, 35 | format: 'iife', 36 | name: 'app', 37 | file: 'public/build/bundle.js' 38 | }, 39 | plugins: [ 40 | svelte({ 41 | compilerOptions: { 42 | // enable run-time checks when not in production 43 | dev: !production 44 | } 45 | }), 46 | // we'll extract any component CSS out into 47 | // a separate file - better for performance 48 | css({ output: 'bundle.css' }), 49 | 50 | // If you have external dependencies installed from 51 | // npm, you'll most likely need these plugins. In 52 | // some cases you'll need additional configuration - 53 | // consult the documentation for details: 54 | // https://github.com/rollup/plugins/tree/master/packages/commonjs 55 | resolve({ 56 | browser: true, 57 | dedupe: ['svelte'] 58 | }), 59 | commonjs(), 60 | 61 | // In dev mode, call `npm run start` once 62 | // the bundle has been generated 63 | !production && serve(), 64 | 65 | // Watch the `public` directory and refresh the 66 | // browser on changes when not in production 67 | !production && livereload('public'), 68 | 69 | // If we're building for production (npm run build 70 | // instead of npm run dev), minify 71 | production && terser() 72 | ], 73 | watch: { 74 | clearScreen: false 75 | } 76 | }; 77 | -------------------------------------------------------------------------------- /test/test-svelte-stores.js: -------------------------------------------------------------------------------- 1 | var assert = require('assert'); 2 | var { createStore, createAnyStateStore, createAnyStateStores, createAnyStateDerived, createAnyStateReadable } = require('../dist/index.js'); 3 | 4 | describe('Svelte Stores Integration', function () { 5 | describe('createAnyStateStore function', function () { 6 | it('should be exportable as a function', function () { 7 | assert.equal(typeof createAnyStateStore, 'function'); 8 | }); 9 | 10 | it('should be compatible with store interface', function () { 11 | const store = createStore({ count: 0, user: { name: 'John' } }); 12 | 13 | // Test that the function accepts store and path parameters 14 | // Note: We can't actually run Svelte stores in Node.js tests without Svelte test environment 15 | // But we can test that the functions exist and have correct interfaces 16 | assert.equal(typeof store.getItem, 'function'); 17 | assert.equal(typeof store.setItem, 'function'); 18 | assert.equal(typeof store.watch, 'function'); 19 | 20 | // Test that the required store methods work as expected 21 | assert.equal(store.getItem('count'), 0); 22 | assert.equal(store.getItem('user.name'), 'John'); 23 | 24 | let watchCalled = false; 25 | const unwatch = store.watch('count', (newValue, oldValue) => { 26 | watchCalled = true; 27 | assert.equal(oldValue, 0); 28 | assert.equal(newValue, 1); 29 | }); 30 | 31 | store.setItem('count', 1); 32 | assert.equal(watchCalled, true); 33 | 34 | if (typeof unwatch === 'function') { 35 | unwatch(); 36 | } 37 | }); 38 | }); 39 | 40 | describe('createAnyStateStores function', function () { 41 | it('should be exportable as a function', function () { 42 | assert.equal(typeof createAnyStateStores, 'function'); 43 | }); 44 | }); 45 | 46 | describe('createAnyStateDerived function', function () { 47 | it('should be exportable as a function', function () { 48 | assert.equal(typeof createAnyStateDerived, 'function'); 49 | }); 50 | }); 51 | 52 | describe('createAnyStateReadable function', function () { 53 | it('should be exportable as a function', function () { 54 | assert.equal(typeof createAnyStateReadable, 'function'); 55 | }); 56 | }); 57 | }); -------------------------------------------------------------------------------- /examples/todo-react/src/logo.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /test/test-react-hooks.js: -------------------------------------------------------------------------------- 1 | const assert = require('assert'); 2 | const React = require('react'); 3 | const { act } = require('react-dom/test-utils'); 4 | const { createRoot } = require('react-dom/client'); 5 | const { JSDOM } = require('jsdom'); 6 | const { createStore, useAnyState, useAnyStateMultiple } = require('../dist/index'); 7 | 8 | describe('React Hooks', () => { 9 | let store; 10 | let container; 11 | let root; 12 | let dom; 13 | 14 | beforeEach(() => { 15 | dom = new JSDOM('
'); 16 | global.window = dom.window; 17 | global.document = dom.window.document; 18 | store = createStore({ 19 | user: { name: 'John', age: 30 }, 20 | items: ['apple', 'banana'], 21 | }); 22 | container = document.getElementById('root'); 23 | root = createRoot(container); 24 | }); 25 | 26 | afterEach(() => { 27 | act(() => { 28 | root.unmount(); 29 | }); 30 | container.innerHTML = ''; 31 | }); 32 | 33 | it('useAnyState should read and update state', () => { 34 | const TestComponent = () => { 35 | const [name, setName] = useAnyState(store, 'user.name'); 36 | return React.createElement('div', { 37 | onClick: () => setName('Doe'), 38 | }, name); 39 | }; 40 | 41 | act(() => { 42 | root.render(React.createElement(TestComponent)); 43 | }); 44 | 45 | assert.strictEqual(container.textContent, 'John'); 46 | 47 | act(() => { 48 | container.firstChild.dispatchEvent(new window.MouseEvent('click', { bubbles: true })); 49 | }); 50 | 51 | assert.strictEqual(container.textContent, 'Doe'); 52 | }); 53 | 54 | it('useAnyStateMultiple should read and update multiple state values', () => { 55 | const TestComponent = () => { 56 | const state = useAnyStateMultiple(store, { 57 | name: 'user.name', 58 | firstItem: 'items[0]', 59 | }); 60 | 61 | return React.createElement('div', { 62 | onClick: () => { 63 | state.setName('Jane'); 64 | state.setFirstItem('orange'); 65 | }, 66 | }, `${state.name} ${state.firstItem}`); 67 | }; 68 | 69 | act(() => { 70 | root.render(React.createElement(TestComponent)); 71 | }); 72 | 73 | assert.strictEqual(container.textContent, 'John apple'); 74 | 75 | act(() => { 76 | container.firstChild.dispatchEvent(new window.MouseEvent('click', { bubbles: true })); 77 | }); 78 | 79 | assert.strictEqual(container.textContent, 'Jane orange'); 80 | assert.deepStrictEqual(store.getState().user.name, 'Jane'); 81 | assert.deepStrictEqual(store.getState().items[0], 'orange'); 82 | }); 83 | }); 84 | -------------------------------------------------------------------------------- /test/test-devtools.js: -------------------------------------------------------------------------------- 1 | const assert = require('assert'); 2 | const { createStore } = require('../dist/index'); 3 | const { JSDOM } = require('jsdom'); 4 | 5 | describe('DevTools Integration', () => { 6 | let dom; 7 | 8 | beforeEach(() => { 9 | dom = new JSDOM('', { 10 | url: 'http://localhost/', 11 | }); 12 | global.window = dom.window; 13 | global.document = dom.window.document; 14 | }); 15 | 16 | afterEach(() => { 17 | dom.window.close(); 18 | }); 19 | 20 | it('should connect to the DevTools extension and send initial state', () => { 21 | let connected = false; 22 | let initialStateSent = false; 23 | 24 | window.__REDUX_DEVTOOLS_EXTENSION__ = { 25 | connect: () => { 26 | connected = true; 27 | return { 28 | init: (state) => { 29 | initialStateSent = true; 30 | assert.deepStrictEqual(state, { a: 1 }); 31 | }, 32 | subscribe: () => {}, 33 | }; 34 | }, 35 | }; 36 | 37 | createStore({ a: 1 }); 38 | 39 | assert.strictEqual(connected, true, 'Did not connect to DevTools'); 40 | assert.strictEqual(initialStateSent, true, 'Did not send initial state'); 41 | }); 42 | 43 | it('should send state updates to the DevTools extension', () => { 44 | let sendCalled = 0; 45 | 46 | window.__REDUX_DEVTOOLS_EXTENSION__ = { 47 | connect: () => ({ 48 | init: () => {}, 49 | subscribe: () => {}, 50 | send: (action, state) => { 51 | sendCalled++; 52 | if (action.type.startsWith('@performance')) { 53 | return; 54 | } 55 | assert.strictEqual(action.type, 'setState'); 56 | assert.deepStrictEqual(state, { a: 2 }); 57 | }, 58 | }), 59 | }; 60 | 61 | const store = createStore({ a: 1 }); 62 | store.setState({ a: 2 }); 63 | 64 | assert.strictEqual(sendCalled > 0, true, 'Did not send state update'); 65 | }); 66 | 67 | it('should handle time-travel messages from the DevTools extension', () => { 68 | let subscribeCallback; 69 | 70 | window.__REDUX_DEVTOOLS_EXTENSION__ = { 71 | connect: () => ({ 72 | init: () => {}, 73 | subscribe: (callback) => { 74 | subscribeCallback = callback; 75 | }, 76 | send: () => {}, 77 | }), 78 | }; 79 | 80 | const store = createStore({ a: 1 }); 81 | 82 | assert.deepStrictEqual(store.getState(), { a: 1 }); 83 | 84 | if (!subscribeCallback) { 85 | assert.fail('subscribe was not called by the devtools connector'); 86 | } 87 | 88 | // Simulate time travel 89 | subscribeCallback({ 90 | type: 'DISPATCH', 91 | payload: { type: 'JUMP_TO_STATE' }, 92 | state: JSON.stringify({ a: 3 }), 93 | }); 94 | 95 | assert.deepStrictEqual(store.getState(), { a: 3 }, 'Did not handle time-travel message correctly'); 96 | }); 97 | }); 98 | -------------------------------------------------------------------------------- /test/test-helpers.js: -------------------------------------------------------------------------------- 1 | var assert = require('assert'); 2 | var { isObject, getIn, clonedValues, setIn, getPaths, getIdPath } = require('../dist/index.js'); 3 | 4 | describe('Helper Functions', function () { 5 | describe('isObject', function () { 6 | it('should return true for objects', function () { 7 | assert.strictEqual(isObject({}), true); 8 | assert.strictEqual(isObject({ a: 1 }), true); 9 | assert.strictEqual(isObject([]), true); 10 | }); 11 | 12 | it('should return false for non-objects', function () { 13 | assert.strictEqual(isObject(null), false); 14 | assert.strictEqual(isObject(undefined), false); 15 | assert.strictEqual(isObject(123), false); 16 | assert.strictEqual(isObject('string'), false); 17 | assert.strictEqual(isObject(true), false); 18 | }); 19 | }); 20 | 21 | describe('getIn', function () { 22 | const testObj = { a: { b: { c: 1 } }, d: [2, { e: 3 }] }; 23 | 24 | it('should get nested properties', function () { 25 | assert.strictEqual(getIn(testObj, ['a', 'b', 'c']), 1); 26 | assert.deepStrictEqual(getIn(testObj, ['d', 1]), { e: 3 }); 27 | }); 28 | 29 | it('should return undefined for non-existent paths', function () { 30 | assert.strictEqual(getIn(testObj, ['a', 'x', 'y']), undefined); 31 | assert.strictEqual(getIn(testObj, ['d', 2]), undefined); 32 | }); 33 | }); 34 | 35 | describe('clonedValues', function () { 36 | it('should clone objects', function () { 37 | const obj = { a: 1 }; 38 | const cloned = clonedValues(obj); 39 | assert.notStrictEqual(obj, cloned); 40 | assert.deepStrictEqual(obj, cloned); 41 | }); 42 | 43 | it('should return primitives unchanged', function () { 44 | assert.strictEqual(clonedValues(1), 1); 45 | assert.strictEqual(clonedValues('test'), 'test'); 46 | assert.strictEqual(clonedValues(null), null); 47 | }); 48 | }); 49 | 50 | describe('setIn', function () { 51 | it('should set nested properties', function () { 52 | const obj = { a: { b: { c: 1 } } }; 53 | setIn(obj, ['a', 'b', 'c'], 2); 54 | assert.strictEqual(obj.a.b.c, 2); 55 | }); 56 | 57 | it('should not create new properties', function () { 58 | const obj = { a: {} }; 59 | const result = setIn(obj, ['a', 'b', 'c'], 2); 60 | assert.deepStrictEqual(result, obj); 61 | }); 62 | }); 63 | 64 | describe('getPaths', function () { 65 | it('should convert string paths to arrays', function () { 66 | assert.deepStrictEqual(getPaths('a.b.c'), ['a', 'b', 'c']); 67 | assert.deepStrictEqual(getPaths('a[0].b'), ['a', 0, 'b']); 68 | assert.deepStrictEqual(getPaths('a[0][1]'), ['a', 0, 1]); 69 | }); 70 | }); 71 | 72 | describe('getIdPath', function () { 73 | it('should convert array paths to string IDs', function () { 74 | assert.strictEqual(getIdPath(['a', 'b', 'c']), 'a/b/c'); 75 | assert.strictEqual(getIdPath(['a', 0, 'b']), 'a/0/b'); 76 | }); 77 | }); 78 | }); 79 | -------------------------------------------------------------------------------- /examples/todo-react/src/PersistentApp.js: -------------------------------------------------------------------------------- 1 | import React, { useEffect, useState } from 'react'; 2 | import { createStore, useAnyState, addPersistence, localStoragePlugin } from 'anystate'; 3 | 4 | // Create store with initial state 5 | const store = createStore({ 6 | user: { 7 | name: '', 8 | email: '', 9 | preferences: { 10 | theme: 'light', 11 | notifications: true 12 | } 13 | }, 14 | todos: [] 15 | }); 16 | 17 | // Add persistence 18 | let persistence; 19 | addPersistence(store, { 20 | plugins: [localStoragePlugin('todo-app-state')], 21 | autoSave: true, 22 | throttle: 500 23 | }).then(p => { 24 | persistence = p; 25 | // Load existing state when app starts 26 | return persistence.load(); 27 | }); 28 | 29 | function PersistentTodoApp() { 30 | const [name, setName] = useAnyState(store, 'user.name'); 31 | const [theme, setTheme] = useAnyState(store, 'user.preferences.theme'); 32 | const [todos, setTodos] = useAnyState(store, 'todos'); 33 | const [isLoaded, setIsLoaded] = useState(false); 34 | 35 | useEffect(() => { 36 | // Wait for persistence to load 37 | const loadData = async () => { 38 | if (persistence) { 39 | await persistence.load(); 40 | } 41 | setIsLoaded(true); 42 | }; 43 | loadData(); 44 | }, []); 45 | 46 | const addTodo = () => { 47 | const newTodo = { 48 | id: Date.now(), 49 | text: `Todo ${todos.length + 1}`, 50 | completed: false 51 | }; 52 | setTodos([...todos, newTodo]); 53 | }; 54 | 55 | const clearData = async () => { 56 | if (persistence) { 57 | await persistence.clear(); 58 | // Reset to initial state 59 | setName(''); 60 | setTheme('light'); 61 | setTodos([]); 62 | } 63 | }; 64 | 65 | if (!isLoaded) { 66 | return
Loading...
; 67 | } 68 | 69 | return ( 70 |
71 |

Persistent Todo App

72 | 73 |
74 |

User Settings (Auto-saved to localStorage)

75 | setName(e.target.value)} 78 | placeholder="Your name" 79 | /> 80 | 84 |
85 | 86 |
87 |

Todos (Persisted)

88 | 89 |
    90 | {todos.map(todo => ( 91 |
  • {todo.text}
  • 92 | ))} 93 |
94 |
95 | 96 |
97 | 98 |

All changes are automatically saved to localStorage!

99 |
100 |
101 | ); 102 | } 103 | 104 | export default PersistentTodoApp; -------------------------------------------------------------------------------- /src/svelte.ts: -------------------------------------------------------------------------------- 1 | import { writable, derived, readable } from 'svelte/store'; 2 | import type { Key, TPath } from './type'; 3 | 4 | interface AnyStateStore { 5 | getItem: (path: TPath) => any; 6 | setItem: (path: TPath, value: any) => void; 7 | watch: (path: string, callback: (newValue: any, oldValue: any) => void) => () => void; 8 | } 9 | 10 | /** 11 | * Creates a Svelte writable store from an anyState store path 12 | * @param store - The anyState store instance 13 | * @param path - The path to watch in the store 14 | * @returns Svelte writable store 15 | */ 16 | export function createAnyStateStore(store: AnyStateStore, path: TPath) { 17 | const initialValue = store.getItem(path); 18 | const { subscribe, set, update } = writable(initialValue); 19 | 20 | // Set up watching for changes from anyState 21 | const unwatch = store.watch(path as string, (newValue) => { 22 | set(newValue); 23 | }); 24 | 25 | return { 26 | subscribe, 27 | set: (value: T) => { 28 | store.setItem(path, value); 29 | set(value); 30 | }, 31 | update: (updater: (value: T) => T) => { 32 | const currentValue = store.getItem(path); 33 | const newValue = updater(currentValue); 34 | store.setItem(path, newValue); 35 | set(newValue); 36 | }, 37 | // Method to unsubscribe from anyState watching 38 | destroy: () => { 39 | unwatch(); 40 | } 41 | }; 42 | } 43 | 44 | /** 45 | * Creates multiple Svelte stores from anyState store paths 46 | * @param store - The anyState store instance 47 | * @param paths - Object with keys as store names and values as paths 48 | * @returns Object with Svelte stores 49 | */ 50 | export function createAnyStateStores>( 51 | store: AnyStateStore, 52 | paths: Record 53 | ): { [K in keyof T]: ReturnType } { 54 | const stores = {} as any; 55 | 56 | for (const key in paths) { 57 | stores[key] = createAnyStateStore(store, paths[key]); 58 | } 59 | 60 | return stores; 61 | } 62 | 63 | /** 64 | * Creates a Svelte derived store from multiple anyState paths 65 | * @param store - The anyState store instance 66 | * @param paths - Array of paths to watch 67 | * @param deriveFn - Function to derive the value 68 | * @returns Svelte readable store 69 | */ 70 | export function createAnyStateDerived( 71 | store: AnyStateStore, 72 | paths: TPath[], 73 | deriveFn: (...values: any[]) => T 74 | ) { 75 | const watchedStores = paths.map(path => createAnyStateStore(store, path)); 76 | 77 | return derived( 78 | watchedStores, 79 | (values) => deriveFn(...values) 80 | ); 81 | } 82 | 83 | /** 84 | * Creates a readable Svelte store from an anyState path (read-only) 85 | * @param store - The anyState store instance 86 | * @param path - The path to watch in the store 87 | * @returns Svelte readable store 88 | */ 89 | export function createAnyStateReadable(store: AnyStateStore, path: TPath) { 90 | const initialValue = store.getItem(path); 91 | 92 | return readable(initialValue, (set) => { 93 | const unwatch = store.watch(path as string, (newValue) => { 94 | set(newValue); 95 | }); 96 | 97 | // Return cleanup function 98 | return () => { 99 | unwatch(); 100 | }; 101 | }); 102 | } -------------------------------------------------------------------------------- /examples/todo-react/README.md: -------------------------------------------------------------------------------- 1 | # Getting Started with Create React App 2 | 3 | This project was bootstrapped with [Create React App](https://github.com/facebook/create-react-app). 4 | 5 | ## Available Scripts 6 | 7 | In the project directory, you can run: 8 | 9 | ### `npm start` 10 | 11 | Runs the app in the development mode.\ 12 | Open [http://localhost:3000](http://localhost:3000) to view it in your browser. 13 | 14 | The page will reload when you make changes.\ 15 | You may also see any lint errors in the console. 16 | 17 | ### `npm test` 18 | 19 | Launches the test runner in the interactive watch mode.\ 20 | See the section about [running tests](https://facebook.github.io/create-react-app/docs/running-tests) for more information. 21 | 22 | ### `npm run build` 23 | 24 | Builds the app for production to the `build` folder.\ 25 | It correctly bundles React in production mode and optimizes the build for the best performance. 26 | 27 | The build is minified and the filenames include the hashes.\ 28 | Your app is ready to be deployed! 29 | 30 | See the section about [deployment](https://facebook.github.io/create-react-app/docs/deployment) for more information. 31 | 32 | ### `npm run eject` 33 | 34 | **Note: this is a one-way operation. Once you `eject`, you can't go back!** 35 | 36 | If you aren't satisfied with the build tool and configuration choices, you can `eject` at any time. This command will remove the single build dependency from your project. 37 | 38 | Instead, it will copy all the configuration files and the transitive dependencies (webpack, Babel, ESLint, etc) right into your project so you have full control over them. All of the commands except `eject` will still work, but they will point to the copied scripts so you can tweak them. At this point you're on your own. 39 | 40 | You don't have to ever use `eject`. The curated feature set is suitable for small and middle deployments, and you shouldn't feel obligated to use this feature. However we understand that this tool wouldn't be useful if you couldn't customize it when you are ready for it. 41 | 42 | ## Learn More 43 | 44 | You can learn more in the [Create React App documentation](https://facebook.github.io/create-react-app/docs/getting-started). 45 | 46 | To learn React, check out the [React documentation](https://reactjs.org/). 47 | 48 | ### Code Splitting 49 | 50 | This section has moved here: [https://facebook.github.io/create-react-app/docs/code-splitting](https://facebook.github.io/create-react-app/docs/code-splitting) 51 | 52 | ### Analyzing the Bundle Size 53 | 54 | This section has moved here: [https://facebook.github.io/create-react-app/docs/analyzing-the-bundle-size](https://facebook.github.io/create-react-app/docs/analyzing-the-bundle-size) 55 | 56 | ### Making a Progressive Web App 57 | 58 | This section has moved here: [https://facebook.github.io/create-react-app/docs/making-a-progressive-web-app](https://facebook.github.io/create-react-app/docs/making-a-progressive-web-app) 59 | 60 | ### Advanced Configuration 61 | 62 | This section has moved here: [https://facebook.github.io/create-react-app/docs/advanced-configuration](https://facebook.github.io/create-react-app/docs/advanced-configuration) 63 | 64 | ### Deployment 65 | 66 | This section has moved here: [https://facebook.github.io/create-react-app/docs/deployment](https://facebook.github.io/create-react-app/docs/deployment) 67 | 68 | ### `npm run build` fails to minify 69 | 70 | This section has moved here: [https://facebook.github.io/create-react-app/docs/troubleshooting#npm-run-build-fails-to-minify](https://facebook.github.io/create-react-app/docs/troubleshooting#npm-run-build-fails-to-minify) 71 | -------------------------------------------------------------------------------- /src/vue.ts: -------------------------------------------------------------------------------- 1 | import { ref, onMounted, onUnmounted, computed, Ref } from 'vue'; 2 | import type { Key, TPath } from './type'; 3 | 4 | interface AnyStateStore { 5 | getItem: (path: TPath) => any; 6 | setItem: (path: TPath, value: any) => void; 7 | watch: (path: string, callback: (newValue: any, oldValue: any) => void) => () => void; 8 | } 9 | 10 | /** 11 | * Vue composable for anyState integration 12 | * @param store - The anyState store instance 13 | * @param path - The path to watch in the store 14 | * @returns Reactive ref and setter function 15 | */ 16 | export function useAnyState(store: AnyStateStore, path: TPath): [Ref, (value: T) => void] { 17 | const value = ref(store.getItem(path)) as Ref; 18 | let unwatch: (() => void) | null = null; 19 | 20 | onMounted(() => { 21 | unwatch = store.watch(path as string, (newValue) => { 22 | value.value = newValue; 23 | }); 24 | }); 25 | 26 | onUnmounted(() => { 27 | if (unwatch) { 28 | unwatch(); 29 | } 30 | }); 31 | 32 | const setValue = (newValue: T) => store.setItem(path, newValue); 33 | 34 | return [value, setValue]; 35 | } 36 | 37 | /** 38 | * Vue composable for multiple anyState values 39 | * @param store - The anyState store instance 40 | * @param paths - Object with keys as property names and values as paths to watch 41 | * @returns Reactive object with all values and setters 42 | */ 43 | export function useAnyStateMultiple>( 44 | store: AnyStateStore, 45 | paths: Record 46 | ): T & { [K in keyof T as `set${Capitalize}`]: (value: T[K]) => void } { 47 | const values = {} as any; 48 | const unwatchers: (() => void)[] = []; 49 | 50 | // Create reactive refs for each path 51 | for (const key in paths) { 52 | const path = paths[key]; 53 | const valueRef = ref(store.getItem(path)); 54 | values[key] = valueRef; 55 | 56 | // Create setter function 57 | const setterName = `set${key.charAt(0).toUpperCase() + key.slice(1)}`; 58 | values[setterName] = (newValue: any) => store.setItem(path, newValue); 59 | } 60 | 61 | onMounted(() => { 62 | // Set up watchers for each path 63 | for (const key in paths) { 64 | const path = paths[key]; 65 | const valueRef = values[key]; 66 | 67 | const unwatch = store.watch(path as string, (newValue) => { 68 | valueRef.value = newValue; 69 | }); 70 | 71 | unwatchers.push(unwatch); 72 | } 73 | }); 74 | 75 | onUnmounted(() => { 76 | // Clean up all watchers 77 | unwatchers.forEach(unwatch => unwatch()); 78 | }); 79 | 80 | return values; 81 | } 82 | 83 | /** 84 | * Vue composable that creates a computed property from store values 85 | * @param store - The anyState store instance 86 | * @param paths - Array of paths to watch 87 | * @param computeFn - Function to compute the derived value 88 | * @returns Computed ref 89 | */ 90 | export function useAnyStateComputed( 91 | store: AnyStateStore, 92 | paths: TPath[], 93 | computeFn: (...values: any[]) => T 94 | ): Ref { 95 | const watchedValues = paths.map(path => { 96 | const valueRef = ref(store.getItem(path)) as Ref; 97 | 98 | onMounted(() => { 99 | const unwatch = store.watch(path as string, (newValue) => { 100 | valueRef.value = newValue; 101 | }); 102 | 103 | onUnmounted(() => { 104 | unwatch(); 105 | }); 106 | }); 107 | 108 | return valueRef; 109 | }); 110 | 111 | return computed(() => { 112 | const values = watchedValues.map(ref => ref.value); 113 | return computeFn(...values); 114 | }); 115 | } -------------------------------------------------------------------------------- /examples/todo-svelte/README.md: -------------------------------------------------------------------------------- 1 | # This repo is no longer maintained. Consider using `npm init vite` and selecting the `svelte` option or — if you want a full-fledged app framework and don't mind using pre-1.0 software — use [SvelteKit](https://kit.svelte.dev), the official application framework for Svelte. 2 | 3 | --- 4 | 5 | # svelte app 6 | 7 | This is a project template for [Svelte](https://svelte.dev) apps. It lives at https://github.com/sveltejs/template. 8 | 9 | To create a new project based on this template using [degit](https://github.com/Rich-Harris/degit): 10 | 11 | ```bash 12 | npx degit sveltejs/template svelte-app 13 | cd svelte-app 14 | ``` 15 | 16 | *Note that you will need to have [Node.js](https://nodejs.org) installed.* 17 | 18 | 19 | ## Get started 20 | 21 | Install the dependencies... 22 | 23 | ```bash 24 | cd svelte-app 25 | npm install 26 | ``` 27 | 28 | ...then start [Rollup](https://rollupjs.org): 29 | 30 | ```bash 31 | npm run dev 32 | ``` 33 | 34 | Navigate to [localhost:8080](http://localhost:8080). You should see your app running. Edit a component file in `src`, save it, and reload the page to see your changes. 35 | 36 | By default, the server will only respond to requests from localhost. To allow connections from other computers, edit the `sirv` commands in package.json to include the option `--host 0.0.0.0`. 37 | 38 | If you're using [Visual Studio Code](https://code.visualstudio.com/) we recommend installing the official extension [Svelte for VS Code](https://marketplace.visualstudio.com/items?itemName=svelte.svelte-vscode). If you are using other editors you may need to install a plugin in order to get syntax highlighting and intellisense. 39 | 40 | ## Building and running in production mode 41 | 42 | To create an optimised version of the app: 43 | 44 | ```bash 45 | npm run build 46 | ``` 47 | 48 | You can run the newly built app with `npm run start`. This uses [sirv](https://github.com/lukeed/sirv), which is included in your package.json's `dependencies` so that the app will work when you deploy to platforms like [Heroku](https://heroku.com). 49 | 50 | 51 | ## Single-page app mode 52 | 53 | By default, sirv will only respond to requests that match files in `public`. This is to maximise compatibility with static fileservers, allowing you to deploy your app anywhere. 54 | 55 | If you're building a single-page app (SPA) with multiple routes, sirv needs to be able to respond to requests for *any* path. You can make it so by editing the `"start"` command in package.json: 56 | 57 | ```js 58 | "start": "sirv public --single" 59 | ``` 60 | 61 | ## Using TypeScript 62 | 63 | This template comes with a script to set up a TypeScript development environment, you can run it immediately after cloning the template with: 64 | 65 | ```bash 66 | node scripts/setupTypeScript.js 67 | ``` 68 | 69 | Or remove the script via: 70 | 71 | ```bash 72 | rm scripts/setupTypeScript.js 73 | ``` 74 | 75 | If you want to use `baseUrl` or `path` aliases within your `tsconfig`, you need to set up `@rollup/plugin-alias` to tell Rollup to resolve the aliases. For more info, see [this StackOverflow question](https://stackoverflow.com/questions/63427935/setup-tsconfig-path-in-svelte). 76 | 77 | ## Deploying to the web 78 | 79 | ### With [Vercel](https://vercel.com) 80 | 81 | Install `vercel` if you haven't already: 82 | 83 | ```bash 84 | npm install -g vercel 85 | ``` 86 | 87 | Then, from within your project folder: 88 | 89 | ```bash 90 | cd public 91 | vercel deploy --name my-project 92 | ``` 93 | 94 | ### With [surge](https://surge.sh/) 95 | 96 | Install `surge` if you haven't already: 97 | 98 | ```bash 99 | npm install -g surge 100 | ``` 101 | 102 | Then, from within your project folder: 103 | 104 | ```bash 105 | npm run build 106 | surge public my-project.surge.sh 107 | ``` 108 | -------------------------------------------------------------------------------- /test/test-vue-watch.js: -------------------------------------------------------------------------------- 1 | var assert = require('assert'); 2 | var { createStore } = require('../dist/index.js'); 3 | 4 | describe('Vue-like Watch', function () { 5 | describe('Object-based watching', function () { 6 | it('should watch multiple properties with object syntax', function () { 7 | const state = createStore({ 8 | name: 'John', 9 | age: 30, 10 | nested: { 11 | value: 'test' 12 | } 13 | }); 14 | 15 | let nameChanges = []; 16 | let ageChanges = []; 17 | let nestedChanges = []; 18 | 19 | // Use Vue-like watch syntax 20 | state.watch({ 21 | 'name': (newVal, oldVal) => { 22 | nameChanges.push({ new: newVal, old: oldVal }); 23 | }, 24 | 'age': (newVal, oldVal) => { 25 | ageChanges.push({ new: newVal, old: oldVal }); 26 | }, 27 | 'nested.value': (newVal, oldVal) => { 28 | nestedChanges.push({ new: newVal, old: oldVal }); 29 | } 30 | }); 31 | 32 | // Change values and verify watchers are called 33 | state.setItem('name', 'Jane'); 34 | state.setItem('age', 31); 35 | state.setItem('nested.value', 'updated'); 36 | 37 | // Verify state changes 38 | assert.deepEqual(state.getState(), { 39 | name: 'Jane', 40 | age: 31, 41 | nested: { 42 | value: 'updated' 43 | } 44 | }); 45 | 46 | // Verify watcher calls 47 | assert.equal(nameChanges.length, 1); 48 | assert.deepEqual(nameChanges[0], { new: 'Jane', old: 'John' }); 49 | 50 | assert.equal(ageChanges.length, 1); 51 | assert.deepEqual(ageChanges[0], { new: 31, old: 30 }); 52 | 53 | assert.equal(nestedChanges.length, 1); 54 | assert.deepEqual(nestedChanges[0], { new: 'updated', old: 'test' }); 55 | }); 56 | 57 | it('should work with array paths', function () { 58 | const state = createStore({ 59 | items: [ 60 | { name: 'item1', value: 1 }, 61 | { name: 'item2', value: 2 } 62 | ] 63 | }); 64 | 65 | let item0Changes = []; 66 | let item1Changes = []; 67 | 68 | state.watch({ 69 | 'items[0].name': (newVal, oldVal) => { 70 | item0Changes.push({ new: newVal, old: oldVal }); 71 | }, 72 | 'items[1].value': (newVal, oldVal) => { 73 | item1Changes.push({ new: newVal, old: oldVal }); 74 | } 75 | }); 76 | 77 | state.setItem('items[0].name', 'updated-item1'); 78 | state.setItem('items[1].value', 22); 79 | 80 | assert.equal(item0Changes.length, 1); 81 | assert.deepEqual(item0Changes[0], { new: 'updated-item1', old: 'item1' }); 82 | 83 | assert.equal(item1Changes.length, 1); 84 | assert.deepEqual(item1Changes[0], { new: 22, old: 2 }); 85 | }); 86 | 87 | it('should throw error for invalid callbacks', function () { 88 | const state = createStore({ test: 'value' }); 89 | 90 | assert.throws(() => { 91 | state.watch({ 92 | 'test': 'not a function' 93 | }); 94 | }, /callback for path 'test' must be a function/); 95 | }); 96 | }); 97 | 98 | describe('Backward compatibility', function () { 99 | it('should still support original string-based watch syntax', function () { 100 | const state = createStore({ 101 | name: 'John', 102 | age: 30 103 | }); 104 | 105 | let nameChanges = []; 106 | 107 | // Use original watch syntax 108 | state.watch('name', (newVal, oldVal) => { 109 | nameChanges.push({ new: newVal, old: oldVal }); 110 | }); 111 | 112 | state.setItem('name', 'Jane'); 113 | 114 | assert.equal(nameChanges.length, 1); 115 | assert.deepEqual(nameChanges[0], { new: 'Jane', old: 'John' }); 116 | }); 117 | 118 | it('should throw error for invalid arguments', function () { 119 | const state = createStore({ test: 'value' }); 120 | 121 | assert.throws(() => { 122 | state.watch(123); 123 | }, /watch: first argument must be a string path or an object with path-callback pairs/); 124 | 125 | assert.throws(() => { 126 | state.watch('test'); 127 | }, /callback must be a function/); 128 | }); 129 | }); 130 | }); -------------------------------------------------------------------------------- /examples/todo-svelte/scripts/setupTypeScript.js: -------------------------------------------------------------------------------- 1 | // @ts-check 2 | 3 | /** This script modifies the project to support TS code in .svelte files like: 4 | 5 | 8 | 9 | As well as validating the code for CI. 10 | */ 11 | 12 | /** To work on this script: 13 | rm -rf test-template template && git clone sveltejs/template test-template && node scripts/setupTypeScript.js test-template 14 | */ 15 | 16 | const fs = require("fs") 17 | const path = require("path") 18 | const { argv } = require("process") 19 | 20 | const projectRoot = argv[2] || path.join(__dirname, "..") 21 | 22 | // Add deps to pkg.json 23 | const packageJSON = JSON.parse(fs.readFileSync(path.join(projectRoot, "package.json"), "utf8")) 24 | packageJSON.devDependencies = Object.assign(packageJSON.devDependencies, { 25 | "svelte-check": "^2.0.0", 26 | "svelte-preprocess": "^4.0.0", 27 | "@rollup/plugin-typescript": "^8.0.0", 28 | "typescript": "^4.0.0", 29 | "tslib": "^2.0.0", 30 | "@tsconfig/svelte": "^2.0.0" 31 | }) 32 | 33 | // Add script for checking 34 | packageJSON.scripts = Object.assign(packageJSON.scripts, { 35 | "check": "svelte-check --tsconfig ./tsconfig.json" 36 | }) 37 | 38 | // Write the package JSON 39 | fs.writeFileSync(path.join(projectRoot, "package.json"), JSON.stringify(packageJSON, null, " ")) 40 | 41 | // mv src/main.js to main.ts - note, we need to edit rollup.config.js for this too 42 | const beforeMainJSPath = path.join(projectRoot, "src", "main.js") 43 | const afterMainTSPath = path.join(projectRoot, "src", "main.ts") 44 | fs.renameSync(beforeMainJSPath, afterMainTSPath) 45 | 46 | // Switch the app.svelte file to use TS 47 | const appSveltePath = path.join(projectRoot, "src", "App.svelte") 48 | let appFile = fs.readFileSync(appSveltePath, "utf8") 49 | appFile = appFile.replace(" 455 | ``` 456 | 457 | #### `useAnyStateMultipleVue(store, paths)` 458 | For managing multiple store values: 459 | 460 | ```vue 461 | 473 | ``` 474 | 475 | #### `useAnyStateComputed(store, paths, computeFn)` 476 | For computed values derived from store data: 477 | 478 | ```vue 479 | 490 | ``` 491 | 492 | ### Vue Composition API Example (Manual Integration) 493 | ```vue 494 | 500 | 501 | 524 | ``` 525 | 526 | ### Vue Composition API Example (With Composables) 527 | ```vue 528 | 534 | 535 | 545 | ``` 546 | 547 | ### Svelte Stores Integration 548 | 549 | anyState provides seamless integration with Svelte's store system: 550 | 551 | #### `createAnyStateStore(store, path)` 552 | Creates a Svelte writable store that stays in sync with anyState. 553 | 554 | ```svelte 555 | 569 | 570 |
571 |

{$name} ({$age} years old)

572 | 573 |
574 | ``` 575 | 576 | #### `createAnyStateStores(store, paths)` 577 | For managing multiple stores: 578 | 579 | ```svelte 580 | 589 | 590 |
591 | 592 | 593 | 594 |
595 | ``` 596 | 597 | #### `createAnyStateDerived(store, paths, deriveFn)` 598 | For computed/derived values: 599 | 600 | ```svelte 601 | 610 | 611 |

Welcome, {$fullName}!

612 | ``` 613 | 614 | #### `createAnyStateReadable(store, path)` 615 | For read-only stores: 616 | 617 | ```svelte 618 | 623 | 624 |
625 | Status: {$status} 626 |
627 | ``` 628 | 629 | ### Persistence 630 | 631 | anyState provides flexible persistence plugins to save and restore state: 632 | 633 | #### Basic LocalStorage Persistence 634 | ```js 635 | import { createStore, addPersistence, localStoragePlugin } from 'anystate'; 636 | 637 | const store = createStore({ 638 | user: { name: 'John', preferences: { theme: 'dark' } }, 639 | todos: [] 640 | }); 641 | 642 | // Add persistence 643 | const persistence = await addPersistence(store, { 644 | plugins: [localStoragePlugin('my-app-state')], 645 | autoSave: true, 646 | throttle: 1000 647 | }); 648 | 649 | // Load existing state 650 | await persistence.load(); 651 | 652 | // State changes are automatically saved to localStorage 653 | store.setItem('user.name', 'Jane'); // Saved after 1 second 654 | ``` 655 | 656 | #### Multiple Storage Backends 657 | ```js 658 | // Use multiple storage plugins with fallback 659 | const persistence = await addPersistence(store, { 660 | plugins: [ 661 | indexedDBPlugin('myapp', 'state', 'appstate'), 662 | localStoragePlugin('my-app-backup'), 663 | sessionStoragePlugin('my-app-session') 664 | ] 665 | }); 666 | ``` 667 | 668 | #### Selective Persistence 669 | ```js 670 | // Only persist specific paths 671 | const persistence = await addPersistence(store, { 672 | paths: ['user.preferences', 'todos'], 673 | plugins: [localStoragePlugin('user-data')] 674 | }); 675 | ``` 676 | 677 | #### Custom Storage Plugin 678 | ```js 679 | // Create a custom plugin (e.g., for server storage) 680 | const serverPlugin = createCustomPlugin( 681 | 'server', 682 | async () => { 683 | const response = await fetch('/api/state'); 684 | return response.json(); 685 | }, 686 | async (state) => { 687 | await fetch('/api/state', { 688 | method: 'POST', 689 | headers: { 'Content-Type': 'application/json' }, 690 | body: JSON.stringify(state) 691 | }); 692 | }, 693 | async () => { 694 | await fetch('/api/state', { method: 'DELETE' }); 695 | } 696 | ); 697 | 698 | const persistence = await addPersistence(store, { 699 | plugins: [serverPlugin] 700 | }); 701 | ``` 702 | 703 | #### Manual Control 704 | ```js 705 | // Disable auto-save for manual control 706 | const persistence = await addPersistence(store, { 707 | autoSave: false, 708 | plugins: [localStoragePlugin()] 709 | }); 710 | 711 | // Manual operations 712 | await persistence.save(); // Save current state 713 | await persistence.load(); // Load saved state 714 | await persistence.clear(); // Clear saved state 715 | persistence.destroy(); // Clean up watchers 716 | ``` 717 | 718 | ## Examples 719 | 720 | Explore complete working examples in different frameworks: 721 | 722 | - **[React Todo App](/examples/todo-react)** - Complete todo application with React 723 | - **[Solid Todo App](/examples/todo-solid)** - Todo app built with SolidJS 724 | - **[Svelte Todo App](/examples/todo-svelte)** - Todo app using Svelte 725 | 726 | Each example demonstrates: 727 | - State initialization and management 728 | - Path-based updates for nested data 729 | - Change watching and UI reactivity 730 | - Framework-specific integration patterns 731 | 732 | ## Resources 733 | 734 | - **Interactive Examples & Playground** - *Coming Soon* 735 | - **Video Tutorials** - *Coming Soon* 736 | - **Advanced Patterns Guide** - *Coming Soon* 737 | 738 | ## Development 739 | 740 | ### Setup 741 | ```bash 742 | # Install dependencies 743 | npm install 744 | 745 | # Run tests 746 | npm test 747 | 748 | # Development mode (TypeScript watch) 749 | npm run dev 750 | 751 | # Build for production 752 | npm run build 753 | ``` 754 | 755 | ### Project Structure 756 | ``` 757 | ├── src/ 758 | │ ├── index.ts # Main library code 759 | │ └── type.d.ts # TypeScript definitions 760 | ├── test/ # Test files 761 | ├── examples/ # Framework examples 762 | │ ├── todo-react/ # React example 763 | │ ├── todo-solid/ # Solid example 764 | │ └── todo-svelte/ # Svelte example 765 | └── dist/ # Built files 766 | ``` 767 | 768 | ### Running Examples 769 | ```bash 770 | # React example 771 | cd examples/todo-react && npm install && npm start 772 | 773 | # Solid example 774 | cd examples/todo-solid && npm install && npm start 775 | 776 | # Svelte example 777 | cd examples/todo-svelte && npm install && npm run dev 778 | ``` 779 | 780 | ## Contributing 781 | 782 | 1. Fork the repository 783 | 2. Create a feature branch: `git checkout -b feature-name` 784 | 3. Make your changes and add tests 785 | 4. Run tests: `npm test` 786 | 5. Commit your changes: `git commit -am 'Add feature'` 787 | 6. Push to the branch: `git push origin feature-name` 788 | 7. Submit a pull request 789 | 790 | ## License 791 | 792 | MIT License - see [LICENSE.md](License.md) for details. 793 | -------------------------------------------------------------------------------- /examples/todo-svelte/yarn.lock: -------------------------------------------------------------------------------- 1 | # THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY. 2 | # yarn lockfile v1 3 | 4 | 5 | "@babel/code-frame@^7.10.4": 6 | version "7.18.6" 7 | resolved "https://registry.yarnpkg.com/@babel/code-frame/-/code-frame-7.18.6.tgz#3b25d38c89600baa2dcc219edfa88a74eb2c427a" 8 | integrity sha512-TDCmlK5eOvH+eH7cdAFlNXeVJqWIQ7gW9tY1GJIpUtFb6CmjVyq2VM3u71bOyR8CRihcCgMUYoDNyLXao3+70Q== 9 | dependencies: 10 | "@babel/highlight" "^7.18.6" 11 | 12 | "@babel/helper-validator-identifier@^7.18.6": 13 | version "7.18.6" 14 | resolved "https://registry.yarnpkg.com/@babel/helper-validator-identifier/-/helper-validator-identifier-7.18.6.tgz#9c97e30d31b2b8c72a1d08984f2ca9b574d7a076" 15 | integrity sha512-MmetCkz9ej86nJQV+sFCxoGGrUbU3q02kgLciwkrt9QqEB7cP39oKEY0PakknEO0Gu20SskMRi+AYZ3b1TpN9g== 16 | 17 | "@babel/highlight@^7.18.6": 18 | version "7.18.6" 19 | resolved "https://registry.yarnpkg.com/@babel/highlight/-/highlight-7.18.6.tgz#81158601e93e2563795adcbfbdf5d64be3f2ecdf" 20 | integrity sha512-u7stbOuYjaPezCuLj29hNW1v64M2Md2qupEKP1fHc7WdOA3DgLh37suiSrZYY7haUB7iBeQZ9P1uiRF359do3g== 21 | dependencies: 22 | "@babel/helper-validator-identifier" "^7.18.6" 23 | chalk "^2.0.0" 24 | js-tokens "^4.0.0" 25 | 26 | "@jridgewell/gen-mapping@^0.3.0": 27 | version "0.3.2" 28 | resolved "https://registry.yarnpkg.com/@jridgewell/gen-mapping/-/gen-mapping-0.3.2.tgz#c1aedc61e853f2bb9f5dfe6d4442d3b565b253b9" 29 | integrity sha512-mh65xKQAzI6iBcFzwv28KVWSmCkdRBWoOh+bYQGW3+6OZvbbN3TqMGo5hqYxQniRcH9F2VZIoJCm4pa3BPDK/A== 30 | dependencies: 31 | "@jridgewell/set-array" "^1.0.1" 32 | "@jridgewell/sourcemap-codec" "^1.4.10" 33 | "@jridgewell/trace-mapping" "^0.3.9" 34 | 35 | "@jridgewell/resolve-uri@^3.0.3": 36 | version "3.1.0" 37 | resolved "https://registry.yarnpkg.com/@jridgewell/resolve-uri/-/resolve-uri-3.1.0.tgz#2203b118c157721addfe69d47b70465463066d78" 38 | integrity sha512-F2msla3tad+Mfht5cJq7LSXcdudKTWCVYUgw6pLFOOHSTtZlj6SWNYAp+AhuqLmWdBO2X5hPrLcu8cVP8fy28w== 39 | 40 | "@jridgewell/set-array@^1.0.1": 41 | version "1.1.2" 42 | resolved "https://registry.yarnpkg.com/@jridgewell/set-array/-/set-array-1.1.2.tgz#7c6cf998d6d20b914c0a55a91ae928ff25965e72" 43 | integrity sha512-xnkseuNADM0gt2bs+BvhO0p78Mk762YnZdsuzFV018NoG1Sj1SCQvpSqa7XUaTam5vAGasABV9qXASMKnFMwMw== 44 | 45 | "@jridgewell/source-map@^0.3.2": 46 | version "0.3.2" 47 | resolved "https://registry.yarnpkg.com/@jridgewell/source-map/-/source-map-0.3.2.tgz#f45351aaed4527a298512ec72f81040c998580fb" 48 | integrity sha512-m7O9o2uR8k2ObDysZYzdfhb08VuEml5oWGiosa1VdaPZ/A6QyPkAJuwN0Q1lhULOf6B7MtQmHENS743hWtCrgw== 49 | dependencies: 50 | "@jridgewell/gen-mapping" "^0.3.0" 51 | "@jridgewell/trace-mapping" "^0.3.9" 52 | 53 | "@jridgewell/sourcemap-codec@^1.4.10": 54 | version "1.4.14" 55 | resolved "https://registry.yarnpkg.com/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.14.tgz#add4c98d341472a289190b424efbdb096991bb24" 56 | integrity sha512-XPSJHWmi394fuUuzDnGz1wiKqWfo1yXecHQMRf2l6hztTO+nPru658AyDngaBe7isIxEkRsPR3FZh+s7iVa4Uw== 57 | 58 | "@jridgewell/trace-mapping@^0.3.9": 59 | version "0.3.15" 60 | resolved "https://registry.yarnpkg.com/@jridgewell/trace-mapping/-/trace-mapping-0.3.15.tgz#aba35c48a38d3fd84b37e66c9c0423f9744f9774" 61 | integrity sha512-oWZNOULl+UbhsgB51uuZzglikfIKSUBO/M9W2OfEjn7cmqoAiCgmv9lyACTUacZwBz0ITnJ2NqjU8Tx0DHL88g== 62 | dependencies: 63 | "@jridgewell/resolve-uri" "^3.0.3" 64 | "@jridgewell/sourcemap-codec" "^1.4.10" 65 | 66 | "@polka/url@^1.0.0-next.20": 67 | version "1.0.0-next.21" 68 | resolved "https://registry.yarnpkg.com/@polka/url/-/url-1.0.0-next.21.tgz#5de5a2385a35309427f6011992b544514d559aa1" 69 | integrity sha512-a5Sab1C4/icpTZVzZc5Ghpz88yQtGOyNqYXcZgOssB2uuAr+wF/MvN6bgtW32q7HHrvBki+BsZ0OuNv6EV3K9g== 70 | 71 | "@rollup/plugin-commonjs@^17.0.0": 72 | version "17.1.0" 73 | resolved "https://registry.yarnpkg.com/@rollup/plugin-commonjs/-/plugin-commonjs-17.1.0.tgz#757ec88737dffa8aa913eb392fade2e45aef2a2d" 74 | integrity sha512-PoMdXCw0ZyvjpCMT5aV4nkL0QywxP29sODQsSGeDpr/oI49Qq9tRtAsb/LbYbDzFlOydVEqHmmZWFtXJEAX9ew== 75 | dependencies: 76 | "@rollup/pluginutils" "^3.1.0" 77 | commondir "^1.0.1" 78 | estree-walker "^2.0.1" 79 | glob "^7.1.6" 80 | is-reference "^1.2.1" 81 | magic-string "^0.25.7" 82 | resolve "^1.17.0" 83 | 84 | "@rollup/plugin-node-resolve@^11.0.0": 85 | version "11.2.1" 86 | resolved "https://registry.yarnpkg.com/@rollup/plugin-node-resolve/-/plugin-node-resolve-11.2.1.tgz#82aa59397a29cd4e13248b106e6a4a1880362a60" 87 | integrity sha512-yc2n43jcqVyGE2sqV5/YCmocy9ArjVAP/BeXyTtADTBBX6V0e5UMqwO8CdQ0kzjb6zu5P1qMzsScCMRvE9OlVg== 88 | dependencies: 89 | "@rollup/pluginutils" "^3.1.0" 90 | "@types/resolve" "1.17.1" 91 | builtin-modules "^3.1.0" 92 | deepmerge "^4.2.2" 93 | is-module "^1.0.0" 94 | resolve "^1.19.0" 95 | 96 | "@rollup/pluginutils@4": 97 | version "4.2.1" 98 | resolved "https://registry.yarnpkg.com/@rollup/pluginutils/-/pluginutils-4.2.1.tgz#e6c6c3aba0744edce3fb2074922d3776c0af2a6d" 99 | integrity sha512-iKnFXr7NkdZAIHiIWE+BX5ULi/ucVFYWD6TbAV+rZctiRTY2PL6tsIKhoIOaoskiWAkgu+VsbXgUVDNLHf+InQ== 100 | dependencies: 101 | estree-walker "^2.0.1" 102 | picomatch "^2.2.2" 103 | 104 | "@rollup/pluginutils@^3.1.0": 105 | version "3.1.0" 106 | resolved "https://registry.yarnpkg.com/@rollup/pluginutils/-/pluginutils-3.1.0.tgz#706b4524ee6dc8b103b3c995533e5ad680c02b9b" 107 | integrity sha512-GksZ6pr6TpIjHm8h9lSQ8pi8BE9VeubNT0OMJ3B5uZJ8pz73NPiqOtCog/x2/QzM1ENChPKxMDhiQuRHsqc+lg== 108 | dependencies: 109 | "@types/estree" "0.0.39" 110 | estree-walker "^1.0.1" 111 | picomatch "^2.2.2" 112 | 113 | "@types/estree@*": 114 | version "1.0.0" 115 | resolved "https://registry.yarnpkg.com/@types/estree/-/estree-1.0.0.tgz#5fb2e536c1ae9bf35366eed879e827fa59ca41c2" 116 | integrity sha512-WulqXMDUTYAXCjZnk6JtIHPigp55cVtDgDrO2gHRwhyJto21+1zbVCtOYB2L1F9w4qCQ0rOGWBnBe0FNTiEJIQ== 117 | 118 | "@types/estree@0.0.39": 119 | version "0.0.39" 120 | resolved "https://registry.yarnpkg.com/@types/estree/-/estree-0.0.39.tgz#e177e699ee1b8c22d23174caaa7422644389509f" 121 | integrity sha512-EYNwp3bU+98cpU4lAWYYL7Zz+2gryWH1qbdDTidVd6hkiR6weksdbMadyXKXNPEkQFhXM+hVO9ZygomHXp+AIw== 122 | 123 | "@types/node@*": 124 | version "18.7.16" 125 | resolved "https://registry.yarnpkg.com/@types/node/-/node-18.7.16.tgz#0eb3cce1e37c79619943d2fd903919fc30850601" 126 | integrity sha512-EQHhixfu+mkqHMZl1R2Ovuvn47PUw18azMJOTwSZr9/fhzHNGXAJ0ma0dayRVchprpCj0Kc1K1xKoWaATWF1qg== 127 | 128 | "@types/resolve@1.17.1": 129 | version "1.17.1" 130 | resolved "https://registry.yarnpkg.com/@types/resolve/-/resolve-1.17.1.tgz#3afd6ad8967c77e4376c598a82ddd58f46ec45d6" 131 | integrity sha512-yy7HuzQhj0dhGpD8RLXSZWEkLsV9ibvxvi6EiJ3bkqLAO1RGo0WbkWQiwpRlSFymTJRz0d3k5LM3kkx8ArDbLw== 132 | dependencies: 133 | "@types/node" "*" 134 | 135 | acorn@^8.5.0: 136 | version "8.8.0" 137 | resolved "https://registry.yarnpkg.com/acorn/-/acorn-8.8.0.tgz#88c0187620435c7f6015803f5539dae05a9dbea8" 138 | integrity sha512-QOxyigPVrpZ2GXT+PFyZTl6TtOFc5egxHIP9IlQ+RbupQuX4RkT/Bee4/kQuC02Xkzg84JcT7oLYtDIQxp+v7w== 139 | 140 | ansi-styles@^3.2.1: 141 | version "3.2.1" 142 | resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-3.2.1.tgz#41fbb20243e50b12be0f04b8dedbf07520ce841d" 143 | integrity sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA== 144 | dependencies: 145 | color-convert "^1.9.0" 146 | 147 | anymatch@~3.1.2: 148 | version "3.1.2" 149 | resolved "https://registry.yarnpkg.com/anymatch/-/anymatch-3.1.2.tgz#c0557c096af32f106198f4f4e2a383537e378716" 150 | integrity sha512-P43ePfOAIupkguHUycrc4qJ9kz8ZiuOUijaETwX7THt0Y/GNK7v0aa8rY816xWjZ7rJdA5XdMcpVFTKMq+RvWg== 151 | dependencies: 152 | normalize-path "^3.0.0" 153 | picomatch "^2.0.4" 154 | 155 | anystate@^0.0.2-a: 156 | version "0.0.2-a" 157 | resolved "https://registry.yarnpkg.com/anystate/-/anystate-0.0.2-a.tgz#dda74b4628b305bb8b924cf5438649c7fc2e5b43" 158 | integrity sha512-fnX4VQxQ280fERa9Irqmp9Is6or7QTtbaM+LD2w8xHIMW5hxz0q8Q+TWpHaIutI5PMb/0P+PPqpiS+25/R5sdw== 159 | 160 | balanced-match@^1.0.0: 161 | version "1.0.2" 162 | resolved "https://registry.yarnpkg.com/balanced-match/-/balanced-match-1.0.2.tgz#e83e3a7e3f300b34cb9d87f615fa0cbf357690ee" 163 | integrity sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw== 164 | 165 | binary-extensions@^2.0.0: 166 | version "2.2.0" 167 | resolved "https://registry.yarnpkg.com/binary-extensions/-/binary-extensions-2.2.0.tgz#75f502eeaf9ffde42fc98829645be4ea76bd9e2d" 168 | integrity sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA== 169 | 170 | brace-expansion@^1.1.7: 171 | version "1.1.11" 172 | resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-1.1.11.tgz#3c7fcbf529d87226f3d2f52b966ff5271eb441dd" 173 | integrity sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA== 174 | dependencies: 175 | balanced-match "^1.0.0" 176 | concat-map "0.0.1" 177 | 178 | braces@~3.0.2: 179 | version "3.0.2" 180 | resolved "https://registry.yarnpkg.com/braces/-/braces-3.0.2.tgz#3454e1a462ee8d599e236df336cd9ea4f8afe107" 181 | integrity sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A== 182 | dependencies: 183 | fill-range "^7.0.1" 184 | 185 | buffer-from@^1.0.0: 186 | version "1.1.2" 187 | resolved "https://registry.yarnpkg.com/buffer-from/-/buffer-from-1.1.2.tgz#2b146a6fd72e80b4f55d255f35ed59a3a9a41bd5" 188 | integrity sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ== 189 | 190 | builtin-modules@^3.1.0: 191 | version "3.3.0" 192 | resolved "https://registry.yarnpkg.com/builtin-modules/-/builtin-modules-3.3.0.tgz#cae62812b89801e9656336e46223e030386be7b6" 193 | integrity sha512-zhaCDicdLuWN5UbN5IMnFqNMhNfo919sH85y2/ea+5Yg9TsTkeZxpL+JLbp6cgYFS4sRLp3YV4S6yDuqVWHYOw== 194 | 195 | chalk@^2.0.0: 196 | version "2.4.2" 197 | resolved "https://registry.yarnpkg.com/chalk/-/chalk-2.4.2.tgz#cd42541677a54333cf541a49108c1432b44c9424" 198 | integrity sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ== 199 | dependencies: 200 | ansi-styles "^3.2.1" 201 | escape-string-regexp "^1.0.5" 202 | supports-color "^5.3.0" 203 | 204 | chokidar@^3.5.0: 205 | version "3.5.3" 206 | resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-3.5.3.tgz#1cf37c8707b932bd1af1ae22c0432e2acd1903bd" 207 | integrity sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw== 208 | dependencies: 209 | anymatch "~3.1.2" 210 | braces "~3.0.2" 211 | glob-parent "~5.1.2" 212 | is-binary-path "~2.1.0" 213 | is-glob "~4.0.1" 214 | normalize-path "~3.0.0" 215 | readdirp "~3.6.0" 216 | optionalDependencies: 217 | fsevents "~2.3.2" 218 | 219 | color-convert@^1.9.0: 220 | version "1.9.3" 221 | resolved "https://registry.yarnpkg.com/color-convert/-/color-convert-1.9.3.tgz#bb71850690e1f136567de629d2d5471deda4c1e8" 222 | integrity sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg== 223 | dependencies: 224 | color-name "1.1.3" 225 | 226 | color-name@1.1.3: 227 | version "1.1.3" 228 | resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.3.tgz#a7d0558bd89c42f795dd42328f740831ca53bc25" 229 | integrity sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw== 230 | 231 | commander@^2.20.0: 232 | version "2.20.3" 233 | resolved "https://registry.yarnpkg.com/commander/-/commander-2.20.3.tgz#fd485e84c03eb4881c20722ba48035e8531aeb33" 234 | integrity sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ== 235 | 236 | commondir@^1.0.1: 237 | version "1.0.1" 238 | resolved "https://registry.yarnpkg.com/commondir/-/commondir-1.0.1.tgz#ddd800da0c66127393cca5950ea968a3aaf1253b" 239 | integrity sha512-W9pAhw0ja1Edb5GVdIF1mjZw/ASI0AlShXM83UUGe2DVr5TdAPEA1OA8m/g8zWp9x6On7gqufY+FatDbC3MDQg== 240 | 241 | concat-map@0.0.1: 242 | version "0.0.1" 243 | resolved "https://registry.yarnpkg.com/concat-map/-/concat-map-0.0.1.tgz#d8a96bd77fd68df7793a73036a3ba0d5405d477b" 244 | integrity sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg== 245 | 246 | console-clear@^1.1.0: 247 | version "1.1.1" 248 | resolved "https://registry.yarnpkg.com/console-clear/-/console-clear-1.1.1.tgz#995e20cbfbf14dd792b672cde387bd128d674bf7" 249 | integrity sha512-pMD+MVR538ipqkG5JXeOEbKWS5um1H4LUUccUQG68qpeqBYbzYy79Gh55jkd2TtPdRfUaLWdv6LPP//5Zt0aPQ== 250 | 251 | deepmerge@^4.2.2: 252 | version "4.2.2" 253 | resolved "https://registry.yarnpkg.com/deepmerge/-/deepmerge-4.2.2.tgz#44d2ea3679b8f4d4ffba33f03d865fc1e7bf4955" 254 | integrity sha512-FJ3UgI4gIl+PHZm53knsuSFpE+nESMr7M4v9QcgB7S63Kj/6WqMiFQJpBBYz1Pt+66bZpP3Q7Lye0Oo9MPKEdg== 255 | 256 | escape-string-regexp@^1.0.5: 257 | version "1.0.5" 258 | resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz#1b61c0562190a8dff6ae3bb2cf0200ca130b86d4" 259 | integrity sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg== 260 | 261 | estree-walker@^0.6.1: 262 | version "0.6.1" 263 | resolved "https://registry.yarnpkg.com/estree-walker/-/estree-walker-0.6.1.tgz#53049143f40c6eb918b23671d1fe3219f3a1b362" 264 | integrity sha512-SqmZANLWS0mnatqbSfRP5g8OXZC12Fgg1IwNtLsyHDzJizORW4khDfjPqJZsemPWBB2uqykUah5YpQ6epsqC/w== 265 | 266 | estree-walker@^1.0.1: 267 | version "1.0.1" 268 | resolved "https://registry.yarnpkg.com/estree-walker/-/estree-walker-1.0.1.tgz#31bc5d612c96b704106b477e6dd5d8aa138cb700" 269 | integrity sha512-1fMXF3YP4pZZVozF8j/ZLfvnR8NSIljt56UhbZ5PeeDmmGHpgpdwQt7ITlGvYaQukCvuBRMLEiKiYC+oeIg4cg== 270 | 271 | estree-walker@^2.0.1: 272 | version "2.0.2" 273 | resolved "https://registry.yarnpkg.com/estree-walker/-/estree-walker-2.0.2.tgz#52f010178c2a4c117a7757cfe942adb7d2da4cac" 274 | integrity sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w== 275 | 276 | fill-range@^7.0.1: 277 | version "7.0.1" 278 | resolved "https://registry.yarnpkg.com/fill-range/-/fill-range-7.0.1.tgz#1919a6a7c75fe38b2c7c77e5198535da9acdda40" 279 | integrity sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ== 280 | dependencies: 281 | to-regex-range "^5.0.1" 282 | 283 | fs.realpath@^1.0.0: 284 | version "1.0.0" 285 | resolved "https://registry.yarnpkg.com/fs.realpath/-/fs.realpath-1.0.0.tgz#1504ad2523158caa40db4a2787cb01411994ea4f" 286 | integrity sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw== 287 | 288 | fsevents@~2.3.2: 289 | version "2.3.2" 290 | resolved "https://registry.yarnpkg.com/fsevents/-/fsevents-2.3.2.tgz#8a526f78b8fdf4623b709e0b975c52c24c02fd1a" 291 | integrity sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA== 292 | 293 | function-bind@^1.1.1: 294 | version "1.1.1" 295 | resolved "https://registry.yarnpkg.com/function-bind/-/function-bind-1.1.1.tgz#a56899d3ea3c9bab874bb9773b7c5ede92f4895d" 296 | integrity sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A== 297 | 298 | get-port@^3.2.0: 299 | version "3.2.0" 300 | resolved "https://registry.yarnpkg.com/get-port/-/get-port-3.2.0.tgz#dd7ce7de187c06c8bf353796ac71e099f0980ebc" 301 | integrity sha512-x5UJKlgeUiNT8nyo/AcnwLnZuZNcSjSw0kogRB+Whd1fjjFq4B1hySFxSFWWSn4mIBzg3sRNUDFYc4g5gjPoLg== 302 | 303 | glob-parent@~5.1.2: 304 | version "5.1.2" 305 | resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-5.1.2.tgz#869832c58034fe68a4093c17dc15e8340d8401c4" 306 | integrity sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow== 307 | dependencies: 308 | is-glob "^4.0.1" 309 | 310 | glob@^7.1.6: 311 | version "7.2.3" 312 | resolved "https://registry.yarnpkg.com/glob/-/glob-7.2.3.tgz#b8df0fb802bbfa8e89bd1d938b4e16578ed44f2b" 313 | integrity sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q== 314 | dependencies: 315 | fs.realpath "^1.0.0" 316 | inflight "^1.0.4" 317 | inherits "2" 318 | minimatch "^3.1.1" 319 | once "^1.3.0" 320 | path-is-absolute "^1.0.0" 321 | 322 | has-flag@^3.0.0: 323 | version "3.0.0" 324 | resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-3.0.0.tgz#b5d454dc2199ae225699f3467e5a07f3b955bafd" 325 | integrity sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw== 326 | 327 | has-flag@^4.0.0: 328 | version "4.0.0" 329 | resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-4.0.0.tgz#944771fd9c81c81265c4d6941860da06bb59479b" 330 | integrity sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ== 331 | 332 | has@^1.0.3: 333 | version "1.0.3" 334 | resolved "https://registry.yarnpkg.com/has/-/has-1.0.3.tgz#722d7cbfc1f6aa8241f16dd814e011e1f41e8796" 335 | integrity sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw== 336 | dependencies: 337 | function-bind "^1.1.1" 338 | 339 | inflight@^1.0.4: 340 | version "1.0.6" 341 | resolved "https://registry.yarnpkg.com/inflight/-/inflight-1.0.6.tgz#49bd6331d7d02d0c09bc910a1075ba8165b56df9" 342 | integrity sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA== 343 | dependencies: 344 | once "^1.3.0" 345 | wrappy "1" 346 | 347 | inherits@2: 348 | version "2.0.4" 349 | resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.4.tgz#0fa2c64f932917c3433a0ded55363aae37416b7c" 350 | integrity sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ== 351 | 352 | is-binary-path@~2.1.0: 353 | version "2.1.0" 354 | resolved "https://registry.yarnpkg.com/is-binary-path/-/is-binary-path-2.1.0.tgz#ea1f7f3b80f064236e83470f86c09c254fb45b09" 355 | integrity sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw== 356 | dependencies: 357 | binary-extensions "^2.0.0" 358 | 359 | is-core-module@^2.9.0: 360 | version "2.10.0" 361 | resolved "https://registry.yarnpkg.com/is-core-module/-/is-core-module-2.10.0.tgz#9012ede0a91c69587e647514e1d5277019e728ed" 362 | integrity sha512-Erxj2n/LDAZ7H8WNJXd9tw38GYM3dv8rk8Zcs+jJuxYTW7sozH+SS8NtrSjVL1/vpLvWi1hxy96IzjJ3EHTJJg== 363 | dependencies: 364 | has "^1.0.3" 365 | 366 | is-extglob@^2.1.1: 367 | version "2.1.1" 368 | resolved "https://registry.yarnpkg.com/is-extglob/-/is-extglob-2.1.1.tgz#a88c02535791f02ed37c76a1b9ea9773c833f8c2" 369 | integrity sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ== 370 | 371 | is-glob@^4.0.1, is-glob@~4.0.1: 372 | version "4.0.3" 373 | resolved "https://registry.yarnpkg.com/is-glob/-/is-glob-4.0.3.tgz#64f61e42cbbb2eec2071a9dac0b28ba1e65d5084" 374 | integrity sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg== 375 | dependencies: 376 | is-extglob "^2.1.1" 377 | 378 | is-module@^1.0.0: 379 | version "1.0.0" 380 | resolved "https://registry.yarnpkg.com/is-module/-/is-module-1.0.0.tgz#3258fb69f78c14d5b815d664336b4cffb6441591" 381 | integrity sha512-51ypPSPCoTEIN9dy5Oy+h4pShgJmPCygKfyRCISBI+JoWT/2oJvK8QPxmwv7b/p239jXrm9M1mlQbyKJ5A152g== 382 | 383 | is-number@^7.0.0: 384 | version "7.0.0" 385 | resolved "https://registry.yarnpkg.com/is-number/-/is-number-7.0.0.tgz#7535345b896734d5f80c4d06c50955527a14f12b" 386 | integrity sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng== 387 | 388 | is-reference@^1.2.1: 389 | version "1.2.1" 390 | resolved "https://registry.yarnpkg.com/is-reference/-/is-reference-1.2.1.tgz#8b2dac0b371f4bc994fdeaba9eb542d03002d0b7" 391 | integrity sha512-U82MsXXiFIrjCK4otLT+o2NA2Cd2g5MLoOVXUZjIOhLurrRxpEXzI8O0KZHr3IjLvlAH1kTPYSuqer5T9ZVBKQ== 392 | dependencies: 393 | "@types/estree" "*" 394 | 395 | jest-worker@^26.2.1: 396 | version "26.6.2" 397 | resolved "https://registry.yarnpkg.com/jest-worker/-/jest-worker-26.6.2.tgz#7f72cbc4d643c365e27b9fd775f9d0eaa9c7a8ed" 398 | integrity sha512-KWYVV1c4i+jbMpaBC+U++4Va0cp8OisU185o73T1vo99hqi7w8tSJfUXYswwqqrjzwxa6KpRK54WhPvwf5w6PQ== 399 | dependencies: 400 | "@types/node" "*" 401 | merge-stream "^2.0.0" 402 | supports-color "^7.0.0" 403 | 404 | js-tokens@^4.0.0: 405 | version "4.0.0" 406 | resolved "https://registry.yarnpkg.com/js-tokens/-/js-tokens-4.0.0.tgz#19203fb59991df98e3a287050d4647cdeaf32499" 407 | integrity sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ== 408 | 409 | kleur@^4.1.4: 410 | version "4.1.5" 411 | resolved "https://registry.yarnpkg.com/kleur/-/kleur-4.1.5.tgz#95106101795f7050c6c650f350c683febddb1780" 412 | integrity sha512-o+NO+8WrRiQEE4/7nwRJhN1HWpVmJm511pBHUxPLtp0BUISzlBplORYSmTclCnJvQq2tKu/sgl3xVpkc7ZWuQQ== 413 | 414 | livereload-js@^3.3.1: 415 | version "3.4.1" 416 | resolved "https://registry.yarnpkg.com/livereload-js/-/livereload-js-3.4.1.tgz#ba90fbc708ed1b9a024bb89c4ee12c96ea03d66f" 417 | integrity sha512-5MP0uUeVCec89ZbNOT/i97Mc+q3SxXmiUGhRFOTmhrGPn//uWVQdCvcLJDy64MSBR5MidFdOR7B9viumoavy6g== 418 | 419 | livereload@^0.9.1: 420 | version "0.9.3" 421 | resolved "https://registry.yarnpkg.com/livereload/-/livereload-0.9.3.tgz#a714816375ed52471408bede8b49b2ee6a0c55b1" 422 | integrity sha512-q7Z71n3i4X0R9xthAryBdNGVGAO2R5X+/xXpmKeuPMrteg+W2U8VusTKV3YiJbXZwKsOlFlHe+go6uSNjfxrZw== 423 | dependencies: 424 | chokidar "^3.5.0" 425 | livereload-js "^3.3.1" 426 | opts ">= 1.2.0" 427 | ws "^7.4.3" 428 | 429 | local-access@^1.0.1: 430 | version "1.1.0" 431 | resolved "https://registry.yarnpkg.com/local-access/-/local-access-1.1.0.tgz#e007c76ba2ca83d5877ba1a125fc8dfe23ba4798" 432 | integrity sha512-XfegD5pyTAfb+GY6chk283Ox5z8WexG56OvM06RWLpAc/UHozO8X6xAxEkIitZOtsSMM1Yr3DkHgW5W+onLhCw== 433 | 434 | magic-string@^0.25.7: 435 | version "0.25.9" 436 | resolved "https://registry.yarnpkg.com/magic-string/-/magic-string-0.25.9.tgz#de7f9faf91ef8a1c91d02c2e5314c8277dbcdd1c" 437 | integrity sha512-RmF0AsMzgt25qzqqLc1+MbHmhdx0ojF2Fvs4XnOqz2ZOBXzzkEwc/dJQZCYHAn7v1jbVOjAZfK8msRn4BxO4VQ== 438 | dependencies: 439 | sourcemap-codec "^1.4.8" 440 | 441 | merge-stream@^2.0.0: 442 | version "2.0.0" 443 | resolved "https://registry.yarnpkg.com/merge-stream/-/merge-stream-2.0.0.tgz#52823629a14dd00c9770fb6ad47dc6310f2c1f60" 444 | integrity sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w== 445 | 446 | minimatch@^3.1.1: 447 | version "3.1.2" 448 | resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-3.1.2.tgz#19cd194bfd3e428f049a70817c038d89ab4be35b" 449 | integrity sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw== 450 | dependencies: 451 | brace-expansion "^1.1.7" 452 | 453 | mri@^1.1.0: 454 | version "1.2.0" 455 | resolved "https://registry.yarnpkg.com/mri/-/mri-1.2.0.tgz#6721480fec2a11a4889861115a48b6cbe7cc8f0b" 456 | integrity sha512-tzzskb3bG8LvYGFF/mDTpq3jpI6Q9wc3LEmBaghu+DdCssd1FakN7Bc0hVNmEyGq1bq3RgfkCb3cmQLpNPOroA== 457 | 458 | mrmime@^1.0.0: 459 | version "1.0.1" 460 | resolved "https://registry.yarnpkg.com/mrmime/-/mrmime-1.0.1.tgz#5f90c825fad4bdd41dc914eff5d1a8cfdaf24f27" 461 | integrity sha512-hzzEagAgDyoU1Q6yg5uI+AorQgdvMCur3FcKf7NhMKWsaYg+RnbTyHRa/9IlLF9rf455MOCtcqqrQQ83pPP7Uw== 462 | 463 | normalize-path@^3.0.0, normalize-path@~3.0.0: 464 | version "3.0.0" 465 | resolved "https://registry.yarnpkg.com/normalize-path/-/normalize-path-3.0.0.tgz#0dcd69ff23a1c9b11fd0978316644a0388216a65" 466 | integrity sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA== 467 | 468 | once@^1.3.0: 469 | version "1.4.0" 470 | resolved "https://registry.yarnpkg.com/once/-/once-1.4.0.tgz#583b1aa775961d4b113ac17d9c50baef9dd76bd1" 471 | integrity sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w== 472 | dependencies: 473 | wrappy "1" 474 | 475 | "opts@>= 1.2.0": 476 | version "2.0.2" 477 | resolved "https://registry.yarnpkg.com/opts/-/opts-2.0.2.tgz#a17e189fbbfee171da559edd8a42423bc5993ce1" 478 | integrity sha512-k41FwbcLnlgnFh69f4qdUfvDQ+5vaSDnVPFI/y5XuhKRq97EnVVneO9F1ESVCdiVu4fCS2L8usX3mU331hB7pg== 479 | 480 | path-is-absolute@^1.0.0: 481 | version "1.0.1" 482 | resolved "https://registry.yarnpkg.com/path-is-absolute/-/path-is-absolute-1.0.1.tgz#174b9268735534ffbc7ace6bf53a5a9e1b5c5f5f" 483 | integrity sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg== 484 | 485 | path-parse@^1.0.7: 486 | version "1.0.7" 487 | resolved "https://registry.yarnpkg.com/path-parse/-/path-parse-1.0.7.tgz#fbc114b60ca42b30d9daf5858e4bd68bbedb6735" 488 | integrity sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw== 489 | 490 | picomatch@^2.0.4, picomatch@^2.2.1, picomatch@^2.2.2: 491 | version "2.3.1" 492 | resolved "https://registry.yarnpkg.com/picomatch/-/picomatch-2.3.1.tgz#3ba3833733646d9d3e4995946c1365a67fb07a42" 493 | integrity sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA== 494 | 495 | randombytes@^2.1.0: 496 | version "2.1.0" 497 | resolved "https://registry.yarnpkg.com/randombytes/-/randombytes-2.1.0.tgz#df6f84372f0270dc65cdf6291349ab7a473d4f2a" 498 | integrity sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ== 499 | dependencies: 500 | safe-buffer "^5.1.0" 501 | 502 | readdirp@~3.6.0: 503 | version "3.6.0" 504 | resolved "https://registry.yarnpkg.com/readdirp/-/readdirp-3.6.0.tgz#74a370bd857116e245b29cc97340cd431a02a6c7" 505 | integrity sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA== 506 | dependencies: 507 | picomatch "^2.2.1" 508 | 509 | require-relative@^0.8.7: 510 | version "0.8.7" 511 | resolved "https://registry.yarnpkg.com/require-relative/-/require-relative-0.8.7.tgz#7999539fc9e047a37928fa196f8e1563dabd36de" 512 | integrity sha512-AKGr4qvHiryxRb19m3PsLRGuKVAbJLUD7E6eOaHkfKhwc+vSgVOCY5xNvm9EkolBKTOf0GrQAZKLimOCz81Khg== 513 | 514 | resolve@^1.17.0, resolve@^1.19.0: 515 | version "1.22.1" 516 | resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.22.1.tgz#27cb2ebb53f91abb49470a928bba7558066ac177" 517 | integrity sha512-nBpuuYuY5jFsli/JIs1oldw6fOQCBioohqWZg/2hiaOybXOft4lonv85uDOKXdf8rhyK159cxU5cDcK/NKk8zw== 518 | dependencies: 519 | is-core-module "^2.9.0" 520 | path-parse "^1.0.7" 521 | supports-preserve-symlinks-flag "^1.0.0" 522 | 523 | rollup-plugin-css-only@^3.1.0: 524 | version "3.1.0" 525 | resolved "https://registry.yarnpkg.com/rollup-plugin-css-only/-/rollup-plugin-css-only-3.1.0.tgz#6a701cc5b051c6b3f0961e69b108a9a118e1b1df" 526 | integrity sha512-TYMOE5uoD76vpj+RTkQLzC9cQtbnJNktHPB507FzRWBVaofg7KhIqq1kGbcVOadARSozWF883Ho9KpSPKH8gqA== 527 | dependencies: 528 | "@rollup/pluginutils" "4" 529 | 530 | rollup-plugin-livereload@^2.0.0: 531 | version "2.0.5" 532 | resolved "https://registry.yarnpkg.com/rollup-plugin-livereload/-/rollup-plugin-livereload-2.0.5.tgz#4747fa292a2cceb0c972c573d71b3d66b4252b37" 533 | integrity sha512-vqQZ/UQowTW7VoiKEM5ouNW90wE5/GZLfdWuR0ELxyKOJUIaj+uismPZZaICU4DnWPVjnpCDDxEqwU7pcKY/PA== 534 | dependencies: 535 | livereload "^0.9.1" 536 | 537 | rollup-plugin-svelte@^7.0.0: 538 | version "7.1.0" 539 | resolved "https://registry.yarnpkg.com/rollup-plugin-svelte/-/rollup-plugin-svelte-7.1.0.tgz#d45f2b92b1014be4eb46b55aa033fb9a9c65f04d" 540 | integrity sha512-vopCUq3G+25sKjwF5VilIbiY6KCuMNHP1PFvx2Vr3REBNMDllKHFZN2B9jwwC+MqNc3UPKkjXnceLPEjTjXGXg== 541 | dependencies: 542 | require-relative "^0.8.7" 543 | rollup-pluginutils "^2.8.2" 544 | 545 | rollup-plugin-terser@^7.0.0: 546 | version "7.0.2" 547 | resolved "https://registry.yarnpkg.com/rollup-plugin-terser/-/rollup-plugin-terser-7.0.2.tgz#e8fbba4869981b2dc35ae7e8a502d5c6c04d324d" 548 | integrity sha512-w3iIaU4OxcF52UUXiZNsNeuXIMDvFrr+ZXK6bFZ0Q60qyVfq4uLptoS4bbq3paG3x216eQllFZX7zt6TIImguQ== 549 | dependencies: 550 | "@babel/code-frame" "^7.10.4" 551 | jest-worker "^26.2.1" 552 | serialize-javascript "^4.0.0" 553 | terser "^5.0.0" 554 | 555 | rollup-pluginutils@^2.8.2: 556 | version "2.8.2" 557 | resolved "https://registry.yarnpkg.com/rollup-pluginutils/-/rollup-pluginutils-2.8.2.tgz#72f2af0748b592364dbd3389e600e5a9444a351e" 558 | integrity sha512-EEp9NhnUkwY8aif6bxgovPHMoMoNr2FulJziTndpt5H9RdwC47GSGuII9XxpSdzVGM0GWrNPHV6ie1LTNJPaLQ== 559 | dependencies: 560 | estree-walker "^0.6.1" 561 | 562 | rollup@^2.3.4: 563 | version "2.79.0" 564 | resolved "https://registry.yarnpkg.com/rollup/-/rollup-2.79.0.tgz#9177992c9f09eb58c5e56cbfa641607a12b57ce2" 565 | integrity sha512-x4KsrCgwQ7ZJPcFA/SUu6QVcYlO7uRLfLAy0DSA4NS2eG8japdbpM50ToH7z4iObodRYOJ0soneF0iaQRJ6zhA== 566 | optionalDependencies: 567 | fsevents "~2.3.2" 568 | 569 | sade@^1.6.0: 570 | version "1.8.1" 571 | resolved "https://registry.yarnpkg.com/sade/-/sade-1.8.1.tgz#0a78e81d658d394887be57d2a409bf703a3b2701" 572 | integrity sha512-xal3CZX1Xlo/k4ApwCFrHVACi9fBqJ7V+mwhBsuf/1IOKbBy098Fex+Wa/5QMubw09pSZ/u8EY8PWgevJsXp1A== 573 | dependencies: 574 | mri "^1.1.0" 575 | 576 | safe-buffer@^5.1.0: 577 | version "5.2.1" 578 | resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.2.1.tgz#1eaf9fa9bdb1fdd4ec75f58f9cdb4e6b7827eec6" 579 | integrity sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ== 580 | 581 | semiver@^1.0.0: 582 | version "1.1.0" 583 | resolved "https://registry.yarnpkg.com/semiver/-/semiver-1.1.0.tgz#9c97fb02c21c7ce4fcf1b73e2c7a24324bdddd5f" 584 | integrity sha512-QNI2ChmuioGC1/xjyYwyZYADILWyW6AmS1UH6gDj/SFUUUS4MBAWs/7mxnkRPc/F4iHezDP+O8t0dO8WHiEOdg== 585 | 586 | serialize-javascript@^4.0.0: 587 | version "4.0.0" 588 | resolved "https://registry.yarnpkg.com/serialize-javascript/-/serialize-javascript-4.0.0.tgz#b525e1238489a5ecfc42afacc3fe99e666f4b1aa" 589 | integrity sha512-GaNA54380uFefWghODBWEGisLZFj00nS5ACs6yHa9nLqlLpVLO8ChDGeKRjZnV4Nh4n0Qi7nhYZD/9fCPzEqkw== 590 | dependencies: 591 | randombytes "^2.1.0" 592 | 593 | sirv-cli@^2.0.0: 594 | version "2.0.2" 595 | resolved "https://registry.yarnpkg.com/sirv-cli/-/sirv-cli-2.0.2.tgz#4b25ff8dc577be41588357c1f87fbf264a1bba55" 596 | integrity sha512-OtSJDwxsF1NWHc7ps3Sa0s+dPtP15iQNJzfKVz+MxkEo3z72mCD+yu30ct79rPr0CaV1HXSOBp+MIY5uIhHZ1A== 597 | dependencies: 598 | console-clear "^1.1.0" 599 | get-port "^3.2.0" 600 | kleur "^4.1.4" 601 | local-access "^1.0.1" 602 | sade "^1.6.0" 603 | semiver "^1.0.0" 604 | sirv "^2.0.0" 605 | tinydate "^1.0.0" 606 | 607 | sirv@^2.0.0: 608 | version "2.0.2" 609 | resolved "https://registry.yarnpkg.com/sirv/-/sirv-2.0.2.tgz#128b9a628d77568139cff85703ad5497c46a4760" 610 | integrity sha512-4Qog6aE29nIjAOKe/wowFTxOdmbEZKb+3tsLljaBRzJwtqto0BChD2zzH0LhgCSXiI+V7X+Y45v14wBZQ1TK3w== 611 | dependencies: 612 | "@polka/url" "^1.0.0-next.20" 613 | mrmime "^1.0.0" 614 | totalist "^3.0.0" 615 | 616 | source-map-support@~0.5.20: 617 | version "0.5.21" 618 | resolved "https://registry.yarnpkg.com/source-map-support/-/source-map-support-0.5.21.tgz#04fe7c7f9e1ed2d662233c28cb2b35b9f63f6e4f" 619 | integrity sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w== 620 | dependencies: 621 | buffer-from "^1.0.0" 622 | source-map "^0.6.0" 623 | 624 | source-map@^0.6.0: 625 | version "0.6.1" 626 | resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.6.1.tgz#74722af32e9614e9c287a8d0bbde48b5e2f1a263" 627 | integrity sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g== 628 | 629 | sourcemap-codec@^1.4.8: 630 | version "1.4.8" 631 | resolved "https://registry.yarnpkg.com/sourcemap-codec/-/sourcemap-codec-1.4.8.tgz#ea804bd94857402e6992d05a38ef1ae35a9ab4c4" 632 | integrity sha512-9NykojV5Uih4lgo5So5dtw+f0JgJX30KCNI8gwhz2J9A15wD0Ml6tjHKwf6fTSa6fAdVBdZeNOs9eJ71qCk8vA== 633 | 634 | supports-color@^5.3.0: 635 | version "5.5.0" 636 | resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-5.5.0.tgz#e2e69a44ac8772f78a1ec0b35b689df6530efc8f" 637 | integrity sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow== 638 | dependencies: 639 | has-flag "^3.0.0" 640 | 641 | supports-color@^7.0.0: 642 | version "7.2.0" 643 | resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-7.2.0.tgz#1b7dcdcb32b8138801b3e478ba6a51caa89648da" 644 | integrity sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw== 645 | dependencies: 646 | has-flag "^4.0.0" 647 | 648 | supports-preserve-symlinks-flag@^1.0.0: 649 | version "1.0.0" 650 | resolved "https://registry.yarnpkg.com/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz#6eda4bd344a3c94aea376d4cc31bc77311039e09" 651 | integrity sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w== 652 | 653 | svelte@^3.0.0: 654 | version "3.50.0" 655 | resolved "https://registry.yarnpkg.com/svelte/-/svelte-3.50.0.tgz#d11a7a6bd1e084ec051d55104a9af8bccf54461f" 656 | integrity sha512-zXeOUDS7+85i+RxLN+0iB6PMbGH7OhEgjETcD1fD8ZrhuhNFxYxYEHU41xuhkHIulJavcu3PKbPyuCrBxdxskQ== 657 | 658 | terser@^5.0.0: 659 | version "5.15.0" 660 | resolved "https://registry.yarnpkg.com/terser/-/terser-5.15.0.tgz#e16967894eeba6e1091509ec83f0c60e179f2425" 661 | integrity sha512-L1BJiXVmheAQQy+as0oF3Pwtlo4s3Wi1X2zNZ2NxOB4wx9bdS9Vk67XQENLFdLYGCK/Z2di53mTj/hBafR+dTA== 662 | dependencies: 663 | "@jridgewell/source-map" "^0.3.2" 664 | acorn "^8.5.0" 665 | commander "^2.20.0" 666 | source-map-support "~0.5.20" 667 | 668 | tinydate@^1.0.0: 669 | version "1.3.0" 670 | resolved "https://registry.yarnpkg.com/tinydate/-/tinydate-1.3.0.tgz#e6ca8e5a22b51bb4ea1c3a2a4fd1352dbd4c57fb" 671 | integrity sha512-7cR8rLy2QhYHpsBDBVYnnWXm8uRTr38RoZakFSW7Bs7PzfMPNZthuMLkwqZv7MTu8lhQ91cOFYS5a7iFj2oR3w== 672 | 673 | to-regex-range@^5.0.1: 674 | version "5.0.1" 675 | resolved "https://registry.yarnpkg.com/to-regex-range/-/to-regex-range-5.0.1.tgz#1648c44aae7c8d988a326018ed72f5b4dd0392e4" 676 | integrity sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ== 677 | dependencies: 678 | is-number "^7.0.0" 679 | 680 | totalist@^3.0.0: 681 | version "3.0.0" 682 | resolved "https://registry.yarnpkg.com/totalist/-/totalist-3.0.0.tgz#4ef9c58c5f095255cdc3ff2a0a55091c57a3a1bd" 683 | integrity sha512-eM+pCBxXO/njtF7vdFsHuqb+ElbxqtI4r5EAvk6grfAFyJ6IvWlSkfZ5T9ozC6xWw3Fj1fGoSmrl0gUs46JVIw== 684 | 685 | wrappy@1: 686 | version "1.0.2" 687 | resolved "https://registry.yarnpkg.com/wrappy/-/wrappy-1.0.2.tgz#b5243d8f3ec1aa35f1364605bc0d1036e30ab69f" 688 | integrity sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ== 689 | 690 | ws@^7.4.3: 691 | version "7.5.9" 692 | resolved "https://registry.yarnpkg.com/ws/-/ws-7.5.9.tgz#54fa7db29f4c7cec68b1ddd3a89de099942bb591" 693 | integrity sha512-F+P9Jil7UiSKSkppIiD94dN07AwvFixvLIj1Og1Rl9GGMuNipJnV9JzjD6XuqmAeiswGvUmNLjr5cFuXwNS77Q== 694 | -------------------------------------------------------------------------------- /examples/todo-solid/yarn.lock: -------------------------------------------------------------------------------- 1 | # THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY. 2 | # yarn lockfile v1 3 | 4 | 5 | "@ampproject/remapping@^2.1.0": 6 | version "2.2.0" 7 | resolved "https://registry.yarnpkg.com/@ampproject/remapping/-/remapping-2.2.0.tgz#56c133824780de3174aed5ab6834f3026790154d" 8 | integrity sha512-qRmjj8nj9qmLTQXXmaR1cck3UXSRMPrbsLJAasZpF+t3riI71BXed5ebIOYwQntykeZuhjsdweEc9BxH5Jc26w== 9 | dependencies: 10 | "@jridgewell/gen-mapping" "^0.1.0" 11 | "@jridgewell/trace-mapping" "^0.3.9" 12 | 13 | "@babel/code-frame@^7.18.6": 14 | version "7.18.6" 15 | resolved "https://registry.yarnpkg.com/@babel/code-frame/-/code-frame-7.18.6.tgz#3b25d38c89600baa2dcc219edfa88a74eb2c427a" 16 | integrity sha512-TDCmlK5eOvH+eH7cdAFlNXeVJqWIQ7gW9tY1GJIpUtFb6CmjVyq2VM3u71bOyR8CRihcCgMUYoDNyLXao3+70Q== 17 | dependencies: 18 | "@babel/highlight" "^7.18.6" 19 | 20 | "@babel/compat-data@^7.18.8": 21 | version "7.18.8" 22 | resolved "https://registry.yarnpkg.com/@babel/compat-data/-/compat-data-7.18.8.tgz#2483f565faca607b8535590e84e7de323f27764d" 23 | integrity sha512-HSmX4WZPPK3FUxYp7g2T6EyO8j96HlZJlxmKPSh6KAcqwyDrfx7hKjXpAW/0FhFfTJsR0Yt4lAjLI2coMptIHQ== 24 | 25 | "@babel/core@^7.18.6": 26 | version "7.18.10" 27 | resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.18.10.tgz#39ad504991d77f1f3da91be0b8b949a5bc466fb8" 28 | integrity sha512-JQM6k6ENcBFKVtWvLavlvi/mPcpYZ3+R+2EySDEMSMbp7Mn4FexlbbJVrx2R7Ijhr01T8gyqrOaABWIOgxeUyw== 29 | dependencies: 30 | "@ampproject/remapping" "^2.1.0" 31 | "@babel/code-frame" "^7.18.6" 32 | "@babel/generator" "^7.18.10" 33 | "@babel/helper-compilation-targets" "^7.18.9" 34 | "@babel/helper-module-transforms" "^7.18.9" 35 | "@babel/helpers" "^7.18.9" 36 | "@babel/parser" "^7.18.10" 37 | "@babel/template" "^7.18.10" 38 | "@babel/traverse" "^7.18.10" 39 | "@babel/types" "^7.18.10" 40 | convert-source-map "^1.7.0" 41 | debug "^4.1.0" 42 | gensync "^1.0.0-beta.2" 43 | json5 "^2.2.1" 44 | semver "^6.3.0" 45 | 46 | "@babel/generator@^7.18.10", "@babel/generator@^7.18.2": 47 | version "7.18.12" 48 | resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.18.12.tgz#fa58daa303757bd6f5e4bbca91b342040463d9f4" 49 | integrity sha512-dfQ8ebCN98SvyL7IxNMCUtZQSq5R7kxgN+r8qYTGDmmSion1hX2C0zq2yo1bsCDhXixokv1SAWTZUMYbO/V5zg== 50 | dependencies: 51 | "@babel/types" "^7.18.10" 52 | "@jridgewell/gen-mapping" "^0.3.2" 53 | jsesc "^2.5.1" 54 | 55 | "@babel/helper-annotate-as-pure@^7.18.6": 56 | version "7.18.6" 57 | resolved "https://registry.yarnpkg.com/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.18.6.tgz#eaa49f6f80d5a33f9a5dd2276e6d6e451be0a6bb" 58 | integrity sha512-duORpUiYrEpzKIop6iNbjnwKLAKnJ47csTyRACyEmWj0QdUrm5aqNJGHSSEQSUAvNW0ojX0dOmK9dZduvkfeXA== 59 | dependencies: 60 | "@babel/types" "^7.18.6" 61 | 62 | "@babel/helper-compilation-targets@^7.18.9": 63 | version "7.18.9" 64 | resolved "https://registry.yarnpkg.com/@babel/helper-compilation-targets/-/helper-compilation-targets-7.18.9.tgz#69e64f57b524cde3e5ff6cc5a9f4a387ee5563bf" 65 | integrity sha512-tzLCyVmqUiFlcFoAPLA/gL9TeYrF61VLNtb+hvkuVaB5SUjW7jcfrglBIX1vUIoT7CLP3bBlIMeyEsIl2eFQNg== 66 | dependencies: 67 | "@babel/compat-data" "^7.18.8" 68 | "@babel/helper-validator-option" "^7.18.6" 69 | browserslist "^4.20.2" 70 | semver "^6.3.0" 71 | 72 | "@babel/helper-create-class-features-plugin@^7.18.9": 73 | version "7.18.9" 74 | resolved "https://registry.yarnpkg.com/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.18.9.tgz#d802ee16a64a9e824fcbf0a2ffc92f19d58550ce" 75 | integrity sha512-WvypNAYaVh23QcjpMR24CwZY2Nz6hqdOcFdPbNpV56hL5H6KiFheO7Xm1aPdlLQ7d5emYZX7VZwPp9x3z+2opw== 76 | dependencies: 77 | "@babel/helper-annotate-as-pure" "^7.18.6" 78 | "@babel/helper-environment-visitor" "^7.18.9" 79 | "@babel/helper-function-name" "^7.18.9" 80 | "@babel/helper-member-expression-to-functions" "^7.18.9" 81 | "@babel/helper-optimise-call-expression" "^7.18.6" 82 | "@babel/helper-replace-supers" "^7.18.9" 83 | "@babel/helper-split-export-declaration" "^7.18.6" 84 | 85 | "@babel/helper-environment-visitor@^7.18.9": 86 | version "7.18.9" 87 | resolved "https://registry.yarnpkg.com/@babel/helper-environment-visitor/-/helper-environment-visitor-7.18.9.tgz#0c0cee9b35d2ca190478756865bb3528422f51be" 88 | integrity sha512-3r/aACDJ3fhQ/EVgFy0hpj8oHyHpQc+LPtJoY9SzTThAsStm4Ptegq92vqKoE3vD706ZVFWITnMnxucw+S9Ipg== 89 | 90 | "@babel/helper-function-name@^7.18.9": 91 | version "7.18.9" 92 | resolved "https://registry.yarnpkg.com/@babel/helper-function-name/-/helper-function-name-7.18.9.tgz#940e6084a55dee867d33b4e487da2676365e86b0" 93 | integrity sha512-fJgWlZt7nxGksJS9a0XdSaI4XvpExnNIgRP+rVefWh5U7BL8pPuir6SJUmFKRfjWQ51OtWSzwOxhaH/EBWWc0A== 94 | dependencies: 95 | "@babel/template" "^7.18.6" 96 | "@babel/types" "^7.18.9" 97 | 98 | "@babel/helper-hoist-variables@^7.18.6": 99 | version "7.18.6" 100 | resolved "https://registry.yarnpkg.com/@babel/helper-hoist-variables/-/helper-hoist-variables-7.18.6.tgz#d4d2c8fb4baeaa5c68b99cc8245c56554f926678" 101 | integrity sha512-UlJQPkFqFULIcyW5sbzgbkxn2FKRgwWiRexcuaR8RNJRy8+LLveqPjwZV/bwrLZCN0eUHD/x8D0heK1ozuoo6Q== 102 | dependencies: 103 | "@babel/types" "^7.18.6" 104 | 105 | "@babel/helper-member-expression-to-functions@^7.18.9": 106 | version "7.18.9" 107 | resolved "https://registry.yarnpkg.com/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.18.9.tgz#1531661e8375af843ad37ac692c132841e2fd815" 108 | integrity sha512-RxifAh2ZoVU67PyKIO4AMi1wTenGfMR/O/ae0CCRqwgBAt5v7xjdtRw7UoSbsreKrQn5t7r89eruK/9JjYHuDg== 109 | dependencies: 110 | "@babel/types" "^7.18.9" 111 | 112 | "@babel/helper-module-imports@7.16.0": 113 | version "7.16.0" 114 | resolved "https://registry.yarnpkg.com/@babel/helper-module-imports/-/helper-module-imports-7.16.0.tgz#90538e60b672ecf1b448f5f4f5433d37e79a3ec3" 115 | integrity sha512-kkH7sWzKPq0xt3H1n+ghb4xEMP8k0U7XV3kkB+ZGy69kDk2ySFW1qPi06sjKzFY3t1j6XbJSqr4mF9L7CYVyhg== 116 | dependencies: 117 | "@babel/types" "^7.16.0" 118 | 119 | "@babel/helper-module-imports@^7.16.7", "@babel/helper-module-imports@^7.18.6": 120 | version "7.18.6" 121 | resolved "https://registry.yarnpkg.com/@babel/helper-module-imports/-/helper-module-imports-7.18.6.tgz#1e3ebdbbd08aad1437b428c50204db13c5a3ca6e" 122 | integrity sha512-0NFvs3VkuSYbFi1x2Vd6tKrywq+z/cLeYC/RJNFrIX/30Bf5aiGYbtvGXolEktzJH8o5E5KJ3tT+nkxuuZFVlA== 123 | dependencies: 124 | "@babel/types" "^7.18.6" 125 | 126 | "@babel/helper-module-transforms@^7.18.9": 127 | version "7.18.9" 128 | resolved "https://registry.yarnpkg.com/@babel/helper-module-transforms/-/helper-module-transforms-7.18.9.tgz#5a1079c005135ed627442df31a42887e80fcb712" 129 | integrity sha512-KYNqY0ICwfv19b31XzvmI/mfcylOzbLtowkw+mfvGPAQ3kfCnMLYbED3YecL5tPd8nAYFQFAd6JHp2LxZk/J1g== 130 | dependencies: 131 | "@babel/helper-environment-visitor" "^7.18.9" 132 | "@babel/helper-module-imports" "^7.18.6" 133 | "@babel/helper-simple-access" "^7.18.6" 134 | "@babel/helper-split-export-declaration" "^7.18.6" 135 | "@babel/helper-validator-identifier" "^7.18.6" 136 | "@babel/template" "^7.18.6" 137 | "@babel/traverse" "^7.18.9" 138 | "@babel/types" "^7.18.9" 139 | 140 | "@babel/helper-optimise-call-expression@^7.18.6": 141 | version "7.18.6" 142 | resolved "https://registry.yarnpkg.com/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.18.6.tgz#9369aa943ee7da47edab2cb4e838acf09d290ffe" 143 | integrity sha512-HP59oD9/fEHQkdcbgFCnbmgH5vIQTJbxh2yf+CdM89/glUNnuzr87Q8GIjGEnOktTROemO0Pe0iPAYbqZuOUiA== 144 | dependencies: 145 | "@babel/types" "^7.18.6" 146 | 147 | "@babel/helper-plugin-utils@^7.18.6", "@babel/helper-plugin-utils@^7.18.9": 148 | version "7.18.9" 149 | resolved "https://registry.yarnpkg.com/@babel/helper-plugin-utils/-/helper-plugin-utils-7.18.9.tgz#4b8aea3b069d8cb8a72cdfe28ddf5ceca695ef2f" 150 | integrity sha512-aBXPT3bmtLryXaoJLyYPXPlSD4p1ld9aYeR+sJNOZjJJGiOpb+fKfh3NkcCu7J54nUJwCERPBExCCpyCOHnu/w== 151 | 152 | "@babel/helper-replace-supers@^7.18.9": 153 | version "7.18.9" 154 | resolved "https://registry.yarnpkg.com/@babel/helper-replace-supers/-/helper-replace-supers-7.18.9.tgz#1092e002feca980fbbb0bd4d51b74a65c6a500e6" 155 | integrity sha512-dNsWibVI4lNT6HiuOIBr1oyxo40HvIVmbwPUm3XZ7wMh4k2WxrxTqZwSqw/eEmXDS9np0ey5M2bz9tBmO9c+YQ== 156 | dependencies: 157 | "@babel/helper-environment-visitor" "^7.18.9" 158 | "@babel/helper-member-expression-to-functions" "^7.18.9" 159 | "@babel/helper-optimise-call-expression" "^7.18.6" 160 | "@babel/traverse" "^7.18.9" 161 | "@babel/types" "^7.18.9" 162 | 163 | "@babel/helper-simple-access@^7.18.6": 164 | version "7.18.6" 165 | resolved "https://registry.yarnpkg.com/@babel/helper-simple-access/-/helper-simple-access-7.18.6.tgz#d6d8f51f4ac2978068df934b569f08f29788c7ea" 166 | integrity sha512-iNpIgTgyAvDQpDj76POqg+YEt8fPxx3yaNBg3S30dxNKm2SWfYhD0TGrK/Eu9wHpUW63VQU894TsTg+GLbUa1g== 167 | dependencies: 168 | "@babel/types" "^7.18.6" 169 | 170 | "@babel/helper-split-export-declaration@^7.18.6": 171 | version "7.18.6" 172 | resolved "https://registry.yarnpkg.com/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.18.6.tgz#7367949bc75b20c6d5a5d4a97bba2824ae8ef075" 173 | integrity sha512-bde1etTx6ZyTmobl9LLMMQsaizFVZrquTEHOqKeQESMKo4PlObf+8+JA25ZsIpZhT/WEd39+vOdLXAFG/nELpA== 174 | dependencies: 175 | "@babel/types" "^7.18.6" 176 | 177 | "@babel/helper-string-parser@^7.18.10": 178 | version "7.18.10" 179 | resolved "https://registry.yarnpkg.com/@babel/helper-string-parser/-/helper-string-parser-7.18.10.tgz#181f22d28ebe1b3857fa575f5c290b1aaf659b56" 180 | integrity sha512-XtIfWmeNY3i4t7t4D2t02q50HvqHybPqW2ki1kosnvWCwuCMeo81Jf0gwr85jy/neUdg5XDdeFE/80DXiO+njw== 181 | 182 | "@babel/helper-validator-identifier@^7.18.6": 183 | version "7.18.6" 184 | resolved "https://registry.yarnpkg.com/@babel/helper-validator-identifier/-/helper-validator-identifier-7.18.6.tgz#9c97e30d31b2b8c72a1d08984f2ca9b574d7a076" 185 | integrity sha512-MmetCkz9ej86nJQV+sFCxoGGrUbU3q02kgLciwkrt9QqEB7cP39oKEY0PakknEO0Gu20SskMRi+AYZ3b1TpN9g== 186 | 187 | "@babel/helper-validator-option@^7.18.6": 188 | version "7.18.6" 189 | resolved "https://registry.yarnpkg.com/@babel/helper-validator-option/-/helper-validator-option-7.18.6.tgz#bf0d2b5a509b1f336099e4ff36e1a63aa5db4db8" 190 | integrity sha512-XO7gESt5ouv/LRJdrVjkShckw6STTaB7l9BrpBaAHDeF5YZT+01PCwmR0SJHnkW6i8OwW/EVWRShfi4j2x+KQw== 191 | 192 | "@babel/helpers@^7.18.9": 193 | version "7.18.9" 194 | resolved "https://registry.yarnpkg.com/@babel/helpers/-/helpers-7.18.9.tgz#4bef3b893f253a1eced04516824ede94dcfe7ff9" 195 | integrity sha512-Jf5a+rbrLoR4eNdUmnFu8cN5eNJT6qdTdOg5IHIzq87WwyRw9PwguLFOWYgktN/60IP4fgDUawJvs7PjQIzELQ== 196 | dependencies: 197 | "@babel/template" "^7.18.6" 198 | "@babel/traverse" "^7.18.9" 199 | "@babel/types" "^7.18.9" 200 | 201 | "@babel/highlight@^7.18.6": 202 | version "7.18.6" 203 | resolved "https://registry.yarnpkg.com/@babel/highlight/-/highlight-7.18.6.tgz#81158601e93e2563795adcbfbdf5d64be3f2ecdf" 204 | integrity sha512-u7stbOuYjaPezCuLj29hNW1v64M2Md2qupEKP1fHc7WdOA3DgLh37suiSrZYY7haUB7iBeQZ9P1uiRF359do3g== 205 | dependencies: 206 | "@babel/helper-validator-identifier" "^7.18.6" 207 | chalk "^2.0.0" 208 | js-tokens "^4.0.0" 209 | 210 | "@babel/parser@^7.18.10", "@babel/parser@^7.18.11": 211 | version "7.18.11" 212 | resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.18.11.tgz#68bb07ab3d380affa9a3f96728df07969645d2d9" 213 | integrity sha512-9JKn5vN+hDt0Hdqn1PiJ2guflwP+B6Ga8qbDuoF0PzzVhrzsKIJo8yGqVk6CmMHiMei9w1C1Bp9IMJSIK+HPIQ== 214 | 215 | "@babel/plugin-syntax-jsx@^7.16.5": 216 | version "7.18.6" 217 | resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.18.6.tgz#a8feef63b010150abd97f1649ec296e849943ca0" 218 | integrity sha512-6mmljtAedFGTWu2p/8WIORGwy+61PLgOMPOdazc7YoJ9ZCWUyFy3A6CpPkRKLKD1ToAesxX8KGEViAiLo9N+7Q== 219 | dependencies: 220 | "@babel/helper-plugin-utils" "^7.18.6" 221 | 222 | "@babel/plugin-syntax-typescript@^7.18.6": 223 | version "7.18.6" 224 | resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.18.6.tgz#1c09cd25795c7c2b8a4ba9ae49394576d4133285" 225 | integrity sha512-mAWAuq4rvOepWCBid55JuRNvpTNf2UGVgoz4JV0fXEKolsVZDzsa4NqCef758WZJj/GDu0gVGItjKFiClTAmZA== 226 | dependencies: 227 | "@babel/helper-plugin-utils" "^7.18.6" 228 | 229 | "@babel/plugin-transform-typescript@^7.18.6": 230 | version "7.18.12" 231 | resolved "https://registry.yarnpkg.com/@babel/plugin-transform-typescript/-/plugin-transform-typescript-7.18.12.tgz#712e9a71b9e00fde9f8c0238e0cceee86ab2f8fd" 232 | integrity sha512-2vjjam0cum0miPkenUbQswKowuxs/NjMwIKEq0zwegRxXk12C9YOF9STXnaUptITOtOJHKHpzvvWYOjbm6tc0w== 233 | dependencies: 234 | "@babel/helper-create-class-features-plugin" "^7.18.9" 235 | "@babel/helper-plugin-utils" "^7.18.9" 236 | "@babel/plugin-syntax-typescript" "^7.18.6" 237 | 238 | "@babel/preset-typescript@^7.18.6": 239 | version "7.18.6" 240 | resolved "https://registry.yarnpkg.com/@babel/preset-typescript/-/preset-typescript-7.18.6.tgz#ce64be3e63eddc44240c6358daefac17b3186399" 241 | integrity sha512-s9ik86kXBAnD760aybBucdpnLsAt0jK1xqJn2juOn9lkOvSHV60os5hxoVJsPzMQxvnUJFAlkont2DvvaYEBtQ== 242 | dependencies: 243 | "@babel/helper-plugin-utils" "^7.18.6" 244 | "@babel/helper-validator-option" "^7.18.6" 245 | "@babel/plugin-transform-typescript" "^7.18.6" 246 | 247 | "@babel/template@^7.18.10", "@babel/template@^7.18.6": 248 | version "7.18.10" 249 | resolved "https://registry.yarnpkg.com/@babel/template/-/template-7.18.10.tgz#6f9134835970d1dbf0835c0d100c9f38de0c5e71" 250 | integrity sha512-TI+rCtooWHr3QJ27kJxfjutghu44DLnasDMwpDqCXVTal9RLp3RSYNh4NdBrRP2cQAoG9A8juOQl6P6oZG4JxA== 251 | dependencies: 252 | "@babel/code-frame" "^7.18.6" 253 | "@babel/parser" "^7.18.10" 254 | "@babel/types" "^7.18.10" 255 | 256 | "@babel/traverse@^7.18.10", "@babel/traverse@^7.18.9": 257 | version "7.18.11" 258 | resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.18.11.tgz#3d51f2afbd83ecf9912bcbb5c4d94e3d2ddaa16f" 259 | integrity sha512-TG9PiM2R/cWCAy6BPJKeHzNbu4lPzOSZpeMfeNErskGpTJx6trEvFaVCbDvpcxwy49BKWmEPwiW8mrysNiDvIQ== 260 | dependencies: 261 | "@babel/code-frame" "^7.18.6" 262 | "@babel/generator" "^7.18.10" 263 | "@babel/helper-environment-visitor" "^7.18.9" 264 | "@babel/helper-function-name" "^7.18.9" 265 | "@babel/helper-hoist-variables" "^7.18.6" 266 | "@babel/helper-split-export-declaration" "^7.18.6" 267 | "@babel/parser" "^7.18.11" 268 | "@babel/types" "^7.18.10" 269 | debug "^4.1.0" 270 | globals "^11.1.0" 271 | 272 | "@babel/types@^7.16.0", "@babel/types@^7.18.10", "@babel/types@^7.18.4", "@babel/types@^7.18.6", "@babel/types@^7.18.9": 273 | version "7.18.10" 274 | resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.18.10.tgz#4908e81b6b339ca7c6b7a555a5fc29446f26dde6" 275 | integrity sha512-MJvnbEiiNkpjo+LknnmRrqbY1GPUUggjv+wQVjetM/AONoupqRALB7I6jGqNUAZsKcRIEu2J6FRFvsczljjsaQ== 276 | dependencies: 277 | "@babel/helper-string-parser" "^7.18.10" 278 | "@babel/helper-validator-identifier" "^7.18.6" 279 | to-fast-properties "^2.0.0" 280 | 281 | "@esbuild/linux-loong64@0.14.54": 282 | version "0.14.54" 283 | resolved "https://registry.yarnpkg.com/@esbuild/linux-loong64/-/linux-loong64-0.14.54.tgz#de2a4be678bd4d0d1ffbb86e6de779cde5999028" 284 | integrity sha512-bZBrLAIX1kpWelV0XemxBZllyRmM6vgFQQG2GdNb+r3Fkp0FOh1NJSvekXDs7jq70k4euu1cryLMfU+mTXlEpw== 285 | 286 | "@jridgewell/gen-mapping@^0.1.0": 287 | version "0.1.1" 288 | resolved "https://registry.yarnpkg.com/@jridgewell/gen-mapping/-/gen-mapping-0.1.1.tgz#e5d2e450306a9491e3bd77e323e38d7aff315996" 289 | integrity sha512-sQXCasFk+U8lWYEe66WxRDOE9PjVz4vSM51fTu3Hw+ClTpUSQb718772vH3pyS5pShp6lvQM7SxgIDXXXmOX7w== 290 | dependencies: 291 | "@jridgewell/set-array" "^1.0.0" 292 | "@jridgewell/sourcemap-codec" "^1.4.10" 293 | 294 | "@jridgewell/gen-mapping@^0.3.2": 295 | version "0.3.2" 296 | resolved "https://registry.yarnpkg.com/@jridgewell/gen-mapping/-/gen-mapping-0.3.2.tgz#c1aedc61e853f2bb9f5dfe6d4442d3b565b253b9" 297 | integrity sha512-mh65xKQAzI6iBcFzwv28KVWSmCkdRBWoOh+bYQGW3+6OZvbbN3TqMGo5hqYxQniRcH9F2VZIoJCm4pa3BPDK/A== 298 | dependencies: 299 | "@jridgewell/set-array" "^1.0.1" 300 | "@jridgewell/sourcemap-codec" "^1.4.10" 301 | "@jridgewell/trace-mapping" "^0.3.9" 302 | 303 | "@jridgewell/resolve-uri@^3.0.3": 304 | version "3.1.0" 305 | resolved "https://registry.yarnpkg.com/@jridgewell/resolve-uri/-/resolve-uri-3.1.0.tgz#2203b118c157721addfe69d47b70465463066d78" 306 | integrity sha512-F2msla3tad+Mfht5cJq7LSXcdudKTWCVYUgw6pLFOOHSTtZlj6SWNYAp+AhuqLmWdBO2X5hPrLcu8cVP8fy28w== 307 | 308 | "@jridgewell/set-array@^1.0.0", "@jridgewell/set-array@^1.0.1": 309 | version "1.1.2" 310 | resolved "https://registry.yarnpkg.com/@jridgewell/set-array/-/set-array-1.1.2.tgz#7c6cf998d6d20b914c0a55a91ae928ff25965e72" 311 | integrity sha512-xnkseuNADM0gt2bs+BvhO0p78Mk762YnZdsuzFV018NoG1Sj1SCQvpSqa7XUaTam5vAGasABV9qXASMKnFMwMw== 312 | 313 | "@jridgewell/sourcemap-codec@^1.4.10": 314 | version "1.4.14" 315 | resolved "https://registry.yarnpkg.com/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.14.tgz#add4c98d341472a289190b424efbdb096991bb24" 316 | integrity sha512-XPSJHWmi394fuUuzDnGz1wiKqWfo1yXecHQMRf2l6hztTO+nPru658AyDngaBe7isIxEkRsPR3FZh+s7iVa4Uw== 317 | 318 | "@jridgewell/trace-mapping@^0.3.9": 319 | version "0.3.14" 320 | resolved "https://registry.yarnpkg.com/@jridgewell/trace-mapping/-/trace-mapping-0.3.14.tgz#b231a081d8f66796e475ad588a1ef473112701ed" 321 | integrity sha512-bJWEfQ9lPTvm3SneWwRFVLzrh6nhjwqw7TUFFBEMzwvg7t7PCDenf2lDwqo4NQXzdpgBXyFgDWnQA+2vkruksQ== 322 | dependencies: 323 | "@jridgewell/resolve-uri" "^3.0.3" 324 | "@jridgewell/sourcemap-codec" "^1.4.10" 325 | 326 | ansi-styles@^3.2.1: 327 | version "3.2.1" 328 | resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-3.2.1.tgz#41fbb20243e50b12be0f04b8dedbf07520ce841d" 329 | integrity sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA== 330 | dependencies: 331 | color-convert "^1.9.0" 332 | 333 | anystate@0.0.2-a: 334 | version "0.0.2-a" 335 | resolved "https://registry.yarnpkg.com/anystate/-/anystate-0.0.2-a.tgz#dda74b4628b305bb8b924cf5438649c7fc2e5b43" 336 | integrity sha512-fnX4VQxQ280fERa9Irqmp9Is6or7QTtbaM+LD2w8xHIMW5hxz0q8Q+TWpHaIutI5PMb/0P+PPqpiS+25/R5sdw== 337 | 338 | babel-plugin-jsx-dom-expressions@^0.33.14: 339 | version "0.33.14" 340 | resolved "https://registry.yarnpkg.com/babel-plugin-jsx-dom-expressions/-/babel-plugin-jsx-dom-expressions-0.33.14.tgz#18e3bf41487a4aa85669e85750b7ed34e95ae145" 341 | integrity sha512-91T8uEz6Wb42bUm5vxRBawY05fBHiwUxah/xWBimuWpH3nf7E0KJ0Wm/s8R7lxRIZzwGCILv1IBlUCqA50WOVw== 342 | dependencies: 343 | "@babel/helper-module-imports" "7.16.0" 344 | "@babel/plugin-syntax-jsx" "^7.16.5" 345 | "@babel/types" "^7.16.0" 346 | html-entities "2.3.2" 347 | 348 | babel-preset-solid@^1.4.6: 349 | version "1.4.8" 350 | resolved "https://registry.yarnpkg.com/babel-preset-solid/-/babel-preset-solid-1.4.8.tgz#0b14f670d0dd53956024d70d8d980ebf399372b4" 351 | integrity sha512-Qv1yoE7yIux68egUsUUEV26t7B0KLNyXKz1MTk89GJDc6mt+2s7+lDVr4tXa29PTZ/hXDTu2uLbEN/1OtmFFBg== 352 | dependencies: 353 | babel-plugin-jsx-dom-expressions "^0.33.14" 354 | 355 | browserslist@^4.20.2: 356 | version "4.21.3" 357 | resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-4.21.3.tgz#5df277694eb3c48bc5c4b05af3e8b7e09c5a6d1a" 358 | integrity sha512-898rgRXLAyRkM1GryrrBHGkqA5hlpkV5MhtZwg9QXeiyLUYs2k00Un05aX5l2/yJIOObYKOpS2JNo8nJDE7fWQ== 359 | dependencies: 360 | caniuse-lite "^1.0.30001370" 361 | electron-to-chromium "^1.4.202" 362 | node-releases "^2.0.6" 363 | update-browserslist-db "^1.0.5" 364 | 365 | caniuse-lite@^1.0.30001370: 366 | version "1.0.30001374" 367 | resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001374.tgz#3dab138e3f5485ba2e74bd13eca7fe1037ce6f57" 368 | integrity sha512-mWvzatRx3w+j5wx/mpFN5v5twlPrabG8NqX2c6e45LCpymdoGqNvRkRutFUqpRTXKFQFNQJasvK0YT7suW6/Hw== 369 | 370 | chalk@^2.0.0: 371 | version "2.4.2" 372 | resolved "https://registry.yarnpkg.com/chalk/-/chalk-2.4.2.tgz#cd42541677a54333cf541a49108c1432b44c9424" 373 | integrity sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ== 374 | dependencies: 375 | ansi-styles "^3.2.1" 376 | escape-string-regexp "^1.0.5" 377 | supports-color "^5.3.0" 378 | 379 | color-convert@^1.9.0: 380 | version "1.9.3" 381 | resolved "https://registry.yarnpkg.com/color-convert/-/color-convert-1.9.3.tgz#bb71850690e1f136567de629d2d5471deda4c1e8" 382 | integrity sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg== 383 | dependencies: 384 | color-name "1.1.3" 385 | 386 | color-name@1.1.3: 387 | version "1.1.3" 388 | resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.3.tgz#a7d0558bd89c42f795dd42328f740831ca53bc25" 389 | integrity sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw== 390 | 391 | convert-source-map@^1.7.0: 392 | version "1.8.0" 393 | resolved "https://registry.yarnpkg.com/convert-source-map/-/convert-source-map-1.8.0.tgz#f3373c32d21b4d780dd8004514684fb791ca4369" 394 | integrity sha512-+OQdjP49zViI/6i7nIJpA8rAl4sV/JdPfU9nZs3VqOwGIgizICvuN2ru6fMd+4llL0tar18UYJXfZ/TWtmhUjA== 395 | dependencies: 396 | safe-buffer "~5.1.1" 397 | 398 | debug@^4.1.0: 399 | version "4.3.4" 400 | resolved "https://registry.yarnpkg.com/debug/-/debug-4.3.4.tgz#1319f6579357f2338d3337d2cdd4914bb5dcc865" 401 | integrity sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ== 402 | dependencies: 403 | ms "2.1.2" 404 | 405 | electron-to-chromium@^1.4.202: 406 | version "1.4.211" 407 | resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.4.211.tgz#afaa8b58313807501312d598d99b953568d60f91" 408 | integrity sha512-BZSbMpyFQU0KBJ1JG26XGeFI3i4op+qOYGxftmZXFZoHkhLgsSv4DHDJfl8ogII3hIuzGt51PaZ195OVu0yJ9A== 409 | 410 | esbuild-android-64@0.14.54: 411 | version "0.14.54" 412 | resolved "https://registry.yarnpkg.com/esbuild-android-64/-/esbuild-android-64-0.14.54.tgz#505f41832884313bbaffb27704b8bcaa2d8616be" 413 | integrity sha512-Tz2++Aqqz0rJ7kYBfz+iqyE3QMycD4vk7LBRyWaAVFgFtQ/O8EJOnVmTOiDWYZ/uYzB4kvP+bqejYdVKzE5lAQ== 414 | 415 | esbuild-android-arm64@0.14.54: 416 | version "0.14.54" 417 | resolved "https://registry.yarnpkg.com/esbuild-android-arm64/-/esbuild-android-arm64-0.14.54.tgz#8ce69d7caba49646e009968fe5754a21a9871771" 418 | integrity sha512-F9E+/QDi9sSkLaClO8SOV6etqPd+5DgJje1F9lOWoNncDdOBL2YF59IhsWATSt0TLZbYCf3pNlTHvVV5VfHdvg== 419 | 420 | esbuild-darwin-64@0.14.54: 421 | version "0.14.54" 422 | resolved "https://registry.yarnpkg.com/esbuild-darwin-64/-/esbuild-darwin-64-0.14.54.tgz#24ba67b9a8cb890a3c08d9018f887cc221cdda25" 423 | integrity sha512-jtdKWV3nBviOd5v4hOpkVmpxsBy90CGzebpbO9beiqUYVMBtSc0AL9zGftFuBon7PNDcdvNCEuQqw2x0wP9yug== 424 | 425 | esbuild-darwin-arm64@0.14.54: 426 | version "0.14.54" 427 | resolved "https://registry.yarnpkg.com/esbuild-darwin-arm64/-/esbuild-darwin-arm64-0.14.54.tgz#3f7cdb78888ee05e488d250a2bdaab1fa671bf73" 428 | integrity sha512-OPafJHD2oUPyvJMrsCvDGkRrVCar5aVyHfWGQzY1dWnzErjrDuSETxwA2HSsyg2jORLY8yBfzc1MIpUkXlctmw== 429 | 430 | esbuild-freebsd-64@0.14.54: 431 | version "0.14.54" 432 | resolved "https://registry.yarnpkg.com/esbuild-freebsd-64/-/esbuild-freebsd-64-0.14.54.tgz#09250f997a56ed4650f3e1979c905ffc40bbe94d" 433 | integrity sha512-OKwd4gmwHqOTp4mOGZKe/XUlbDJ4Q9TjX0hMPIDBUWWu/kwhBAudJdBoxnjNf9ocIB6GN6CPowYpR/hRCbSYAg== 434 | 435 | esbuild-freebsd-arm64@0.14.54: 436 | version "0.14.54" 437 | resolved "https://registry.yarnpkg.com/esbuild-freebsd-arm64/-/esbuild-freebsd-arm64-0.14.54.tgz#bafb46ed04fc5f97cbdb016d86947a79579f8e48" 438 | integrity sha512-sFwueGr7OvIFiQT6WeG0jRLjkjdqWWSrfbVwZp8iMP+8UHEHRBvlaxL6IuKNDwAozNUmbb8nIMXa7oAOARGs1Q== 439 | 440 | esbuild-linux-32@0.14.54: 441 | version "0.14.54" 442 | resolved "https://registry.yarnpkg.com/esbuild-linux-32/-/esbuild-linux-32-0.14.54.tgz#e2a8c4a8efdc355405325033fcebeb941f781fe5" 443 | integrity sha512-1ZuY+JDI//WmklKlBgJnglpUL1owm2OX+8E1syCD6UAxcMM/XoWd76OHSjl/0MR0LisSAXDqgjT3uJqT67O3qw== 444 | 445 | esbuild-linux-64@0.14.54: 446 | version "0.14.54" 447 | resolved "https://registry.yarnpkg.com/esbuild-linux-64/-/esbuild-linux-64-0.14.54.tgz#de5fdba1c95666cf72369f52b40b03be71226652" 448 | integrity sha512-EgjAgH5HwTbtNsTqQOXWApBaPVdDn7XcK+/PtJwZLT1UmpLoznPd8c5CxqsH2dQK3j05YsB3L17T8vE7cp4cCg== 449 | 450 | esbuild-linux-arm64@0.14.54: 451 | version "0.14.54" 452 | resolved "https://registry.yarnpkg.com/esbuild-linux-arm64/-/esbuild-linux-arm64-0.14.54.tgz#dae4cd42ae9787468b6a5c158da4c84e83b0ce8b" 453 | integrity sha512-WL71L+0Rwv+Gv/HTmxTEmpv0UgmxYa5ftZILVi2QmZBgX3q7+tDeOQNqGtdXSdsL8TQi1vIaVFHUPDe0O0kdig== 454 | 455 | esbuild-linux-arm@0.14.54: 456 | version "0.14.54" 457 | resolved "https://registry.yarnpkg.com/esbuild-linux-arm/-/esbuild-linux-arm-0.14.54.tgz#a2c1dff6d0f21dbe8fc6998a122675533ddfcd59" 458 | integrity sha512-qqz/SjemQhVMTnvcLGoLOdFpCYbz4v4fUo+TfsWG+1aOu70/80RV6bgNpR2JCrppV2moUQkww+6bWxXRL9YMGw== 459 | 460 | esbuild-linux-mips64le@0.14.54: 461 | version "0.14.54" 462 | resolved "https://registry.yarnpkg.com/esbuild-linux-mips64le/-/esbuild-linux-mips64le-0.14.54.tgz#d9918e9e4cb972f8d6dae8e8655bf9ee131eda34" 463 | integrity sha512-qTHGQB8D1etd0u1+sB6p0ikLKRVuCWhYQhAHRPkO+OF3I/iSlTKNNS0Lh2Oc0g0UFGguaFZZiPJdJey3AGpAlw== 464 | 465 | esbuild-linux-ppc64le@0.14.54: 466 | version "0.14.54" 467 | resolved "https://registry.yarnpkg.com/esbuild-linux-ppc64le/-/esbuild-linux-ppc64le-0.14.54.tgz#3f9a0f6d41073fb1a640680845c7de52995f137e" 468 | integrity sha512-j3OMlzHiqwZBDPRCDFKcx595XVfOfOnv68Ax3U4UKZ3MTYQB5Yz3X1mn5GnodEVYzhtZgxEBidLWeIs8FDSfrQ== 469 | 470 | esbuild-linux-riscv64@0.14.54: 471 | version "0.14.54" 472 | resolved "https://registry.yarnpkg.com/esbuild-linux-riscv64/-/esbuild-linux-riscv64-0.14.54.tgz#618853c028178a61837bc799d2013d4695e451c8" 473 | integrity sha512-y7Vt7Wl9dkOGZjxQZnDAqqn+XOqFD7IMWiewY5SPlNlzMX39ocPQlOaoxvT4FllA5viyV26/QzHtvTjVNOxHZg== 474 | 475 | esbuild-linux-s390x@0.14.54: 476 | version "0.14.54" 477 | resolved "https://registry.yarnpkg.com/esbuild-linux-s390x/-/esbuild-linux-s390x-0.14.54.tgz#d1885c4c5a76bbb5a0fe182e2c8c60eb9e29f2a6" 478 | integrity sha512-zaHpW9dziAsi7lRcyV4r8dhfG1qBidQWUXweUjnw+lliChJqQr+6XD71K41oEIC3Mx1KStovEmlzm+MkGZHnHA== 479 | 480 | esbuild-netbsd-64@0.14.54: 481 | version "0.14.54" 482 | resolved "https://registry.yarnpkg.com/esbuild-netbsd-64/-/esbuild-netbsd-64-0.14.54.tgz#69ae917a2ff241b7df1dbf22baf04bd330349e81" 483 | integrity sha512-PR01lmIMnfJTgeU9VJTDY9ZerDWVFIUzAtJuDHwwceppW7cQWjBBqP48NdeRtoP04/AtO9a7w3viI+PIDr6d+w== 484 | 485 | esbuild-openbsd-64@0.14.54: 486 | version "0.14.54" 487 | resolved "https://registry.yarnpkg.com/esbuild-openbsd-64/-/esbuild-openbsd-64-0.14.54.tgz#db4c8495287a350a6790de22edea247a57c5d47b" 488 | integrity sha512-Qyk7ikT2o7Wu76UsvvDS5q0amJvmRzDyVlL0qf5VLsLchjCa1+IAvd8kTBgUxD7VBUUVgItLkk609ZHUc1oCaw== 489 | 490 | esbuild-sunos-64@0.14.54: 491 | version "0.14.54" 492 | resolved "https://registry.yarnpkg.com/esbuild-sunos-64/-/esbuild-sunos-64-0.14.54.tgz#54287ee3da73d3844b721c21bc80c1dc7e1bf7da" 493 | integrity sha512-28GZ24KmMSeKi5ueWzMcco6EBHStL3B6ubM7M51RmPwXQGLe0teBGJocmWhgwccA1GeFXqxzILIxXpHbl9Q/Kw== 494 | 495 | esbuild-windows-32@0.14.54: 496 | version "0.14.54" 497 | resolved "https://registry.yarnpkg.com/esbuild-windows-32/-/esbuild-windows-32-0.14.54.tgz#f8aaf9a5667630b40f0fb3aa37bf01bbd340ce31" 498 | integrity sha512-T+rdZW19ql9MjS7pixmZYVObd9G7kcaZo+sETqNH4RCkuuYSuv9AGHUVnPoP9hhuE1WM1ZimHz1CIBHBboLU7w== 499 | 500 | esbuild-windows-64@0.14.54: 501 | version "0.14.54" 502 | resolved "https://registry.yarnpkg.com/esbuild-windows-64/-/esbuild-windows-64-0.14.54.tgz#bf54b51bd3e9b0f1886ffdb224a4176031ea0af4" 503 | integrity sha512-AoHTRBUuYwXtZhjXZbA1pGfTo8cJo3vZIcWGLiUcTNgHpJJMC1rVA44ZereBHMJtotyN71S8Qw0npiCIkW96cQ== 504 | 505 | esbuild-windows-arm64@0.14.54: 506 | version "0.14.54" 507 | resolved "https://registry.yarnpkg.com/esbuild-windows-arm64/-/esbuild-windows-arm64-0.14.54.tgz#937d15675a15e4b0e4fafdbaa3a01a776a2be982" 508 | integrity sha512-M0kuUvXhot1zOISQGXwWn6YtS+Y/1RT9WrVIOywZnJHo3jCDyewAc79aKNQWFCQm+xNHVTq9h8dZKvygoXQQRg== 509 | 510 | esbuild@^0.14.47: 511 | version "0.14.54" 512 | resolved "https://registry.yarnpkg.com/esbuild/-/esbuild-0.14.54.tgz#8b44dcf2b0f1a66fc22459943dccf477535e9aa2" 513 | integrity sha512-Cy9llcy8DvET5uznocPyqL3BFRrFXSVqbgpMJ9Wz8oVjZlh/zUSNbPRbov0VX7VxN2JH1Oa0uNxZ7eLRb62pJA== 514 | optionalDependencies: 515 | "@esbuild/linux-loong64" "0.14.54" 516 | esbuild-android-64 "0.14.54" 517 | esbuild-android-arm64 "0.14.54" 518 | esbuild-darwin-64 "0.14.54" 519 | esbuild-darwin-arm64 "0.14.54" 520 | esbuild-freebsd-64 "0.14.54" 521 | esbuild-freebsd-arm64 "0.14.54" 522 | esbuild-linux-32 "0.14.54" 523 | esbuild-linux-64 "0.14.54" 524 | esbuild-linux-arm "0.14.54" 525 | esbuild-linux-arm64 "0.14.54" 526 | esbuild-linux-mips64le "0.14.54" 527 | esbuild-linux-ppc64le "0.14.54" 528 | esbuild-linux-riscv64 "0.14.54" 529 | esbuild-linux-s390x "0.14.54" 530 | esbuild-netbsd-64 "0.14.54" 531 | esbuild-openbsd-64 "0.14.54" 532 | esbuild-sunos-64 "0.14.54" 533 | esbuild-windows-32 "0.14.54" 534 | esbuild-windows-64 "0.14.54" 535 | esbuild-windows-arm64 "0.14.54" 536 | 537 | escalade@^3.1.1: 538 | version "3.1.1" 539 | resolved "https://registry.yarnpkg.com/escalade/-/escalade-3.1.1.tgz#d8cfdc7000965c5a0174b4a82eaa5c0552742e40" 540 | integrity sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw== 541 | 542 | escape-string-regexp@^1.0.5: 543 | version "1.0.5" 544 | resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz#1b61c0562190a8dff6ae3bb2cf0200ca130b86d4" 545 | integrity sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg== 546 | 547 | fsevents@~2.3.2: 548 | version "2.3.2" 549 | resolved "https://registry.yarnpkg.com/fsevents/-/fsevents-2.3.2.tgz#8a526f78b8fdf4623b709e0b975c52c24c02fd1a" 550 | integrity sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA== 551 | 552 | function-bind@^1.1.1: 553 | version "1.1.1" 554 | resolved "https://registry.yarnpkg.com/function-bind/-/function-bind-1.1.1.tgz#a56899d3ea3c9bab874bb9773b7c5ede92f4895d" 555 | integrity sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A== 556 | 557 | gensync@^1.0.0-beta.2: 558 | version "1.0.0-beta.2" 559 | resolved "https://registry.yarnpkg.com/gensync/-/gensync-1.0.0-beta.2.tgz#32a6ee76c3d7f52d46b2b1ae5d93fea8580a25e0" 560 | integrity sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg== 561 | 562 | globals@^11.1.0: 563 | version "11.12.0" 564 | resolved "https://registry.yarnpkg.com/globals/-/globals-11.12.0.tgz#ab8795338868a0babd8525758018c2a7eb95c42e" 565 | integrity sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA== 566 | 567 | has-flag@^3.0.0: 568 | version "3.0.0" 569 | resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-3.0.0.tgz#b5d454dc2199ae225699f3467e5a07f3b955bafd" 570 | integrity sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw== 571 | 572 | has@^1.0.3: 573 | version "1.0.3" 574 | resolved "https://registry.yarnpkg.com/has/-/has-1.0.3.tgz#722d7cbfc1f6aa8241f16dd814e011e1f41e8796" 575 | integrity sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw== 576 | dependencies: 577 | function-bind "^1.1.1" 578 | 579 | html-entities@2.3.2: 580 | version "2.3.2" 581 | resolved "https://registry.yarnpkg.com/html-entities/-/html-entities-2.3.2.tgz#760b404685cb1d794e4f4b744332e3b00dcfe488" 582 | integrity sha512-c3Ab/url5ksaT0WyleslpBEthOzWhrjQbg75y7XUsfSzi3Dgzt0l8w5e7DylRn15MTlMMD58dTfzddNS2kcAjQ== 583 | 584 | is-core-module@^2.9.0: 585 | version "2.10.0" 586 | resolved "https://registry.yarnpkg.com/is-core-module/-/is-core-module-2.10.0.tgz#9012ede0a91c69587e647514e1d5277019e728ed" 587 | integrity sha512-Erxj2n/LDAZ7H8WNJXd9tw38GYM3dv8rk8Zcs+jJuxYTW7sozH+SS8NtrSjVL1/vpLvWi1hxy96IzjJ3EHTJJg== 588 | dependencies: 589 | has "^1.0.3" 590 | 591 | is-what@^4.1.6: 592 | version "4.1.7" 593 | resolved "https://registry.yarnpkg.com/is-what/-/is-what-4.1.7.tgz#c41dc1d2d2d6a9285c624c2505f61849c8b1f9cc" 594 | integrity sha512-DBVOQNiPKnGMxRMLIYSwERAS5MVY1B7xYiGnpgctsOFvVDz9f9PFXXxMcTOHuoqYp4NK9qFYQaIC1NRRxLMpBQ== 595 | 596 | js-tokens@^4.0.0: 597 | version "4.0.0" 598 | resolved "https://registry.yarnpkg.com/js-tokens/-/js-tokens-4.0.0.tgz#19203fb59991df98e3a287050d4647cdeaf32499" 599 | integrity sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ== 600 | 601 | jsesc@^2.5.1: 602 | version "2.5.2" 603 | resolved "https://registry.yarnpkg.com/jsesc/-/jsesc-2.5.2.tgz#80564d2e483dacf6e8ef209650a67df3f0c283a4" 604 | integrity sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA== 605 | 606 | json5@^2.2.1: 607 | version "2.2.1" 608 | resolved "https://registry.yarnpkg.com/json5/-/json5-2.2.1.tgz#655d50ed1e6f95ad1a3caababd2b0efda10b395c" 609 | integrity sha512-1hqLFMSrGHRHxav9q9gNjJ5EXznIxGVO09xQRrwplcS8qs28pZ8s8hupZAmqDwZUmVZ2Qb2jnyPOWcDH8m8dlA== 610 | 611 | merge-anything@^5.0.2: 612 | version "5.0.2" 613 | resolved "https://registry.yarnpkg.com/merge-anything/-/merge-anything-5.0.2.tgz#b023af9b8f48e2fc71eb859d4ad834ba667f4150" 614 | integrity sha512-POPQBWkBC0vxdgzRJ2Mkj4+2NTKbvkHo93ih+jGDhNMLzIw+rYKjO7949hOQM2X7DxMHH1uoUkwWFLIzImw7gA== 615 | dependencies: 616 | is-what "^4.1.6" 617 | ts-toolbelt "^9.6.0" 618 | 619 | ms@2.1.2: 620 | version "2.1.2" 621 | resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.2.tgz#d09d1f357b443f493382a8eb3ccd183872ae6009" 622 | integrity sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w== 623 | 624 | nanoid@^3.3.4: 625 | version "3.3.4" 626 | resolved "https://registry.yarnpkg.com/nanoid/-/nanoid-3.3.4.tgz#730b67e3cd09e2deacf03c027c81c9d9dbc5e8ab" 627 | integrity sha512-MqBkQh/OHTS2egovRtLk45wEyNXwF+cokD+1YPf9u5VfJiRdAiRwB2froX5Co9Rh20xs4siNPm8naNotSD6RBw== 628 | 629 | node-releases@^2.0.6: 630 | version "2.0.6" 631 | resolved "https://registry.yarnpkg.com/node-releases/-/node-releases-2.0.6.tgz#8a7088c63a55e493845683ebf3c828d8c51c5503" 632 | integrity sha512-PiVXnNuFm5+iYkLBNeq5211hvO38y63T0i2KKh2KnUs3RpzJ+JtODFjkD8yjLwnDkTYF1eKXheUwdssR+NRZdg== 633 | 634 | path-parse@^1.0.7: 635 | version "1.0.7" 636 | resolved "https://registry.yarnpkg.com/path-parse/-/path-parse-1.0.7.tgz#fbc114b60ca42b30d9daf5858e4bd68bbedb6735" 637 | integrity sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw== 638 | 639 | picocolors@^1.0.0: 640 | version "1.0.0" 641 | resolved "https://registry.yarnpkg.com/picocolors/-/picocolors-1.0.0.tgz#cb5bdc74ff3f51892236eaf79d68bc44564ab81c" 642 | integrity sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ== 643 | 644 | postcss@^8.4.14: 645 | version "8.4.16" 646 | resolved "https://registry.yarnpkg.com/postcss/-/postcss-8.4.16.tgz#33a1d675fac39941f5f445db0de4db2b6e01d43c" 647 | integrity sha512-ipHE1XBvKzm5xI7hiHCZJCSugxvsdq2mPnsq5+UF+VHCjiBvtDrlxJfMBToWaP9D5XlgNmcFGqoHmUn0EYEaRQ== 648 | dependencies: 649 | nanoid "^3.3.4" 650 | picocolors "^1.0.0" 651 | source-map-js "^1.0.2" 652 | 653 | resolve@^1.22.1: 654 | version "1.22.1" 655 | resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.22.1.tgz#27cb2ebb53f91abb49470a928bba7558066ac177" 656 | integrity sha512-nBpuuYuY5jFsli/JIs1oldw6fOQCBioohqWZg/2hiaOybXOft4lonv85uDOKXdf8rhyK159cxU5cDcK/NKk8zw== 657 | dependencies: 658 | is-core-module "^2.9.0" 659 | path-parse "^1.0.7" 660 | supports-preserve-symlinks-flag "^1.0.0" 661 | 662 | rollup@^2.75.6: 663 | version "2.77.2" 664 | resolved "https://registry.yarnpkg.com/rollup/-/rollup-2.77.2.tgz#6b6075c55f9cc2040a5912e6e062151e42e2c4e3" 665 | integrity sha512-m/4YzYgLcpMQbxX3NmAqDvwLATZzxt8bIegO78FZLl+lAgKJBd1DRAOeEiZcKOIOPjxE6ewHWHNgGEalFXuz1g== 666 | optionalDependencies: 667 | fsevents "~2.3.2" 668 | 669 | safe-buffer@~5.1.1: 670 | version "5.1.2" 671 | resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.1.2.tgz#991ec69d296e0313747d59bdfd2b745c35f8828d" 672 | integrity sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g== 673 | 674 | semver@^6.3.0: 675 | version "6.3.0" 676 | resolved "https://registry.yarnpkg.com/semver/-/semver-6.3.0.tgz#ee0a64c8af5e8ceea67687b133761e1becbd1d3d" 677 | integrity sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw== 678 | 679 | solid-js@1.4.8: 680 | version "1.4.8" 681 | resolved "https://registry.yarnpkg.com/solid-js/-/solid-js-1.4.8.tgz#a1e7f56c17d64c1729c6fd36fe513ca283e78dbd" 682 | integrity sha512-XErZdnnYYXF7OwGSUAPcua2y5/ELB/c53zFCpWiEGqxTNoH1iQghzI8EsHJXk06sNn+Z/TGhb8bPDNNGSgimag== 683 | 684 | solid-refresh@^0.4.1: 685 | version "0.4.1" 686 | resolved "https://registry.yarnpkg.com/solid-refresh/-/solid-refresh-0.4.1.tgz#0681ffd633d9ef4de35bb1f5ef0722c865079f2a" 687 | integrity sha512-v3tD/OXQcUyXLrWjPW1dXZyeWwP7/+GQNs8YTL09GBq+5FguA6IejJWUvJDrLIA4M0ho9/5zK2e9n+uy+4488g== 688 | dependencies: 689 | "@babel/generator" "^7.18.2" 690 | "@babel/helper-module-imports" "^7.16.7" 691 | "@babel/types" "^7.18.4" 692 | 693 | source-map-js@^1.0.2: 694 | version "1.0.2" 695 | resolved "https://registry.yarnpkg.com/source-map-js/-/source-map-js-1.0.2.tgz#adbc361d9c62df380125e7f161f71c826f1e490c" 696 | integrity sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw== 697 | 698 | supports-color@^5.3.0: 699 | version "5.5.0" 700 | resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-5.5.0.tgz#e2e69a44ac8772f78a1ec0b35b689df6530efc8f" 701 | integrity sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow== 702 | dependencies: 703 | has-flag "^3.0.0" 704 | 705 | supports-preserve-symlinks-flag@^1.0.0: 706 | version "1.0.0" 707 | resolved "https://registry.yarnpkg.com/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz#6eda4bd344a3c94aea376d4cc31bc77311039e09" 708 | integrity sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w== 709 | 710 | to-fast-properties@^2.0.0: 711 | version "2.0.0" 712 | resolved "https://registry.yarnpkg.com/to-fast-properties/-/to-fast-properties-2.0.0.tgz#dc5e698cbd079265bc73e0377681a4e4e83f616e" 713 | integrity sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog== 714 | 715 | ts-toolbelt@^9.6.0: 716 | version "9.6.0" 717 | resolved "https://registry.yarnpkg.com/ts-toolbelt/-/ts-toolbelt-9.6.0.tgz#50a25426cfed500d4a09bd1b3afb6f28879edfd5" 718 | integrity sha512-nsZd8ZeNUzukXPlJmTBwUAuABDe/9qtVDelJeT/qW0ow3ZS3BsQJtNkan1802aM9Uf68/Y8ljw86Hu0h5IUW3w== 719 | 720 | update-browserslist-db@^1.0.5: 721 | version "1.0.5" 722 | resolved "https://registry.yarnpkg.com/update-browserslist-db/-/update-browserslist-db-1.0.5.tgz#be06a5eedd62f107b7c19eb5bcefb194411abf38" 723 | integrity sha512-dteFFpCyvuDdr9S/ff1ISkKt/9YZxKjI9WlRR99c180GaztJtRa/fn18FdxGVKVsnPY7/a/FDN68mcvUmP4U7Q== 724 | dependencies: 725 | escalade "^3.1.1" 726 | picocolors "^1.0.0" 727 | 728 | vite-plugin-solid@2.3.0: 729 | version "2.3.0" 730 | resolved "https://registry.yarnpkg.com/vite-plugin-solid/-/vite-plugin-solid-2.3.0.tgz#d479459dc45d30ce8eea1eafdf7bcf85c25a8004" 731 | integrity sha512-N2sa54C3UZC2nN5vpj5o6YP+XdIAZW6n6xv8OasxNAcAJPFeZT7EOVvumL0V4c8hBz1yuYniMWdESY8807fVSg== 732 | dependencies: 733 | "@babel/core" "^7.18.6" 734 | "@babel/preset-typescript" "^7.18.6" 735 | babel-preset-solid "^1.4.6" 736 | merge-anything "^5.0.2" 737 | solid-refresh "^0.4.1" 738 | 739 | vite@3.0.4: 740 | version "3.0.4" 741 | resolved "https://registry.yarnpkg.com/vite/-/vite-3.0.4.tgz#c61688d6b97573e96cf5ac25f2d68597b5ce68e8" 742 | integrity sha512-NU304nqnBeOx2MkQnskBQxVsa0pRAH5FphokTGmyy8M3oxbvw7qAXts2GORxs+h/2vKsD+osMhZ7An6yK6F1dA== 743 | dependencies: 744 | esbuild "^0.14.47" 745 | postcss "^8.4.14" 746 | resolve "^1.22.1" 747 | rollup "^2.75.6" 748 | optionalDependencies: 749 | fsevents "~2.3.2" 750 | --------------------------------------------------------------------------------