├── .codesandbox └── ci.json ├── .github └── workflows │ └── ci.yml ├── .gitignore ├── .npmignore ├── .npmrc ├── .prettierignore ├── LICENCE ├── README.md ├── examples └── basic │ ├── about.html │ ├── contact.html │ ├── index.html │ ├── package.json │ ├── src │ ├── components │ │ ├── App.ts │ │ ├── Footer.ts │ │ ├── Header.ts │ │ └── MainButton.ts │ ├── fetchDOM.ts │ ├── helpers │ │ └── defaultTransitions.ts │ ├── index.css │ ├── index.ts │ └── pages │ │ ├── About.ts │ │ ├── Contact.ts │ │ └── Home.ts │ ├── tsconfig.json │ └── vite.config.ts ├── package.json ├── pnpm-lock.yaml ├── pnpm-workspace.yaml ├── src ├── Component.ts └── index.ts ├── tests ├── Component.add.test.ts ├── Component.find.test.ts ├── Component.init.test.ts ├── Component.lifecycle.test.ts ├── helpers │ └── wait.ts └── templates │ ├── AboutPageMock.ts │ └── HomePageMock.ts ├── tsconfig.json ├── tsup.config.ts └── turbo.json /.codesandbox/ci.json: -------------------------------------------------------------------------------- 1 | { 2 | "buildCommand": "build", 3 | "packages": ["./packages/*"], 4 | "sandboxes": [ 5 | "/examples/basic" 6 | ], 7 | "node": "18" 8 | } 9 | -------------------------------------------------------------------------------- /.github/workflows/ci.yml: -------------------------------------------------------------------------------- 1 | name: ci 2 | on: [push] 3 | jobs: 4 | build: 5 | runs-on: ubuntu-latest 6 | strategy: 7 | matrix: 8 | node-version: [18.x] 9 | steps: 10 | - uses: actions/checkout@v2 11 | - name: Use Node.js ${{ matrix.node-version }} 12 | uses: actions/setup-node@v1 13 | with: 14 | node-version: ${{ matrix.node-version }} 15 | 16 | - name: Checkout 17 | uses: actions/checkout@v3 18 | with: 19 | fetch-depth: 0 20 | 21 | - name: Install pnpm 22 | uses: pnpm/action-setup@v2 23 | with: 24 | version: 8 25 | 26 | - name: Install dependencies 27 | run: pnpm install 28 | 29 | - name: build 30 | run: pnpm run build 31 | 32 | - name: test 33 | run: pnpm run test 34 | 35 | - name: size 36 | run: pnpm run size 37 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | .idea 2 | node_modules 3 | dist 4 | tsconfig.tsbuildinfo 5 | tsconfig-build.tsbuildinfo 6 | .husky 7 | .DS_Store 8 | .turbo 9 | -------------------------------------------------------------------------------- /.npmignore: -------------------------------------------------------------------------------- 1 | .idea 2 | .cache 3 | .github 4 | example 5 | examples 6 | node_modules 7 | src 8 | test 9 | .babelrc 10 | .prettierignore 11 | .prettierrc 12 | stories 13 | tsconfig.json 14 | pnpm-lock.yaml 15 | pnpm-workspace.yaml 16 | dist 17 | -------------------------------------------------------------------------------- /.npmrc: -------------------------------------------------------------------------------- 1 | strict-peer-dependencies=false 2 | -------------------------------------------------------------------------------- /.prettierignore: -------------------------------------------------------------------------------- 1 | .cache 2 | node_modules 3 | dist 4 | -------------------------------------------------------------------------------- /LICENCE: -------------------------------------------------------------------------------- 1 | The MIT License (MIT) 2 | 3 | Copyright (c) Willy Brauner 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. 22 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 |
2 |

Compose

3 | 4 | ![](documentation/static/img/logo.png) 5 | 6 | ![](https://img.shields.io/npm/v/@wbe/compose/latest.svg) 7 | ![](https://img.shields.io/bundlephobia/minzip/@wbe/compose.svg) 8 | ![](https://img.shields.io/npm/dt/@wbe/compose.svg) 9 | ![](https://img.shields.io/npm/l/@wbe/compose.svg) 10 | 11 | Compose is a small library that help to links your javascript to your DOM. 12 | _⚠️ This library is work in progress, the API is subject to change until the v1.0 release._ 13 | 14 |
15 |
16 |
17 | 18 | ## Summary 19 | 20 | - [Installation](#Installation) 21 | - [Component](#Component) 22 | - [add](#add) 23 | - [addAll](#addAll) 24 | - [find](#find) 25 | - [findAll](#findAll) 26 | - [lifecycle](#lifecycle) 27 | - [beforeMount](#beforeMount) 28 | - [mounted](#mounted) 29 | - [unmounted](#unmounted) 30 | - [workflow](#Workflow) 31 | - [Credits](#Credits) 32 | - [Licence](#Licence) 33 | 34 | ## Installation 35 | 36 | ```shell 37 | $ npm i @wbe/compose 38 | ``` 39 | 40 | ## Component 41 | 42 | ### add 43 | 44 | This method allows to 'add' new Component instance to the tree. 45 | It returns a single instance and associated properties. 46 | 47 | Add component inside the class: 48 | 49 | ```js 50 | class Foo extends Component { 51 | bar = this.add(Bar) 52 | 53 | method() { 54 | // then, access child Bar instance 55 | this.bar.root 56 | this.bar.mounted() 57 | this.bar.unmounted() 58 | // etc... 59 | } 60 | } 61 | ``` 62 | 63 | The method accepts a static props parameter which we can access from the new Bar component via `this.props`. 64 | 65 | ```js 66 | bar = this.add(Bar, { props: { foo: "bar" } }) 67 | ``` 68 | 69 | ### addAll 70 | 71 | `addAll` will return an array of instances. 72 | 73 | ```html 74 |
75 |
76 |
77 |
78 | ``` 79 | 80 | ```js 81 | class Foo extends Component { 82 | bars = this.addAll(Bar) 83 | // Returns array of Bar: [Bar, Bar] 84 | } 85 | ``` 86 | 87 | ### `find` 88 | 89 | `find` is a simple `this.root.querySelector()` wrapper. 90 | This method allows retrieving `BEM` element of current $root component. 91 | 92 | ```html 93 |
94 |

Hello

95 |
96 | ``` 97 | 98 | ```js 99 | class Bar extends Component { 100 | //

Hello

can be query with: 101 | $title = this.find("_title") 102 | // or 103 | $title = this.find("Bar_title") 104 | } 105 | ``` 106 | 107 | ### `findAll` 108 | 109 | `findAll` is a simple `this.$root.querySelectorAll()` wrapper. 110 | This method returns a DOM Element array. 111 | 112 | ```html 113 |
114 |
icon
115 |
icon
116 |
117 | ``` 118 | 119 | ```js 120 | class Bar extends Component { 121 | $icons = this.findAll("_icon") 122 | // [div.Bar_icon, div.Bar_icon] 123 | } 124 | ``` 125 | 126 | ## lifecycle 127 | 128 | ### beforeMount 129 | 130 | Each class extended by `Component` provide a life-cycle methods collection. 131 | It's particularly useful when `Stack` class is used. 132 | 133 | `beforeMount(): void` 134 | 135 | Method called before class component is mounted, in at begining of class constructor. 136 | 137 | ### mounted 138 | 139 | `mounted(): (()=> void) | void` 140 | 141 | Method called after class component is mounted. Children component instances are now available. 142 | It can return a function to be called when the component is unmounted. 143 | 144 | ### unmounted 145 | 146 | `unmounted(): void` 147 | 148 | Method called after class component is unmounted. 149 | The parent component observer will called this unmounted method automatically if the current component is removed from DOM. 150 | All children component instances are also unmounted after this method is called. 151 | 152 | ## Workflow 153 | 154 | - Clone this repo 155 | 156 | ```shell 157 | # install dependencies 158 | pnpm i 159 | 160 | # build and watch lib changes 161 | pnpm run build:watch 162 | 163 | # start tests and watch 164 | pnpm run test:watch 165 | 166 | # start dev server for all examples 167 | pnpm run dev 168 | 169 | # Or run a specific example 170 | pnpm run dev --scope {example-name} 171 | ``` 172 | 173 | ## Credits 174 | 175 | [© Willy Brauner](https://willybrauner.com) 176 | 177 | ## Licence 178 | 179 | [MIT](./LICENCE) 180 | -------------------------------------------------------------------------------- /examples/basic/about.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | About 6 | 7 | 8 | 9 |
10 |
11 | 17 |
18 |
19 |
20 |

About

21 | 22 | 23 |
24 |
25 |
26 | 27 |
28 |
29 | 30 | 31 | 32 | -------------------------------------------------------------------------------- /examples/basic/contact.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | Contact 6 | 7 | 8 | 9 |
10 |
11 | 17 |
18 |
19 |
20 |

Contact

21 | 22 | 23 |
24 |
25 |
26 | 27 |
28 |
29 | 30 | 31 | 32 | -------------------------------------------------------------------------------- /examples/basic/index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | Home 6 | 7 | 8 | 9 |
10 |
11 | 17 |
18 |
19 |
20 |

Home

21 | 22 |
23 |
24 |
25 | 26 |
27 |
28 | 29 | 30 | 31 | -------------------------------------------------------------------------------- /examples/basic/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "example-basic", 3 | "version": "0.1.0", 4 | "main": "src/index.ts", 5 | "scripts": { 6 | "dev": "vite --host", 7 | "build": "tsc && vite build", 8 | "preview": "vite preview", 9 | "ncu": "ncu -u" 10 | }, 11 | "dependencies": { 12 | "@cher-ami/utils": "^1.4.1", 13 | "@wbe/compose": "workspace:^", 14 | "@wbe/debug": "latest", 15 | "@wbe/interpol": "^0.9.0", 16 | "@wbe/low-router": "^0.1.1", 17 | "gsap": "^3.12.3" 18 | }, 19 | "devDependencies": { 20 | "typescript": "^5.3.2", 21 | "vite": "^5.0.4" 22 | } 23 | } 24 | -------------------------------------------------------------------------------- /examples/basic/src/components/App.ts: -------------------------------------------------------------------------------- 1 | import { Component } from "@wbe/compose" 2 | import { createBrowserHistory, RouteContext, LowRouter } from "@wbe/low-router" 3 | import Home from "../pages/Home" 4 | import About from "../pages/About" 5 | import Contact from "../pages/Contact" 6 | import { fetchDOM } from "../fetchDOM" 7 | /** 8 | * Main App 9 | */ 10 | export class App extends Component { 11 | stackClass = "stack" 12 | linkClass = "link" 13 | stack: HTMLElement = document.querySelector(`.${this.stackClass}`) 14 | links 15 | router: LowRouter 16 | currContext: RouteContext 17 | contexts: RouteContext[] = [] 18 | isFirstRoute = true 19 | isAnimating = false 20 | browserHistory = createBrowserHistory() 21 | 22 | mounted() { 23 | this.#createRouter() 24 | // Update links to set click listener on it 25 | this.#updateLinks() 26 | // call & listen to history 27 | this.#handleHistory() 28 | const unlistenBrowser = this.browserHistory.listen(this.#handleHistory) 29 | // unmounted 30 | return () => { 31 | unlistenBrowser() 32 | } 33 | } 34 | 35 | // --------------------------------------------------------------------------- ROUTER 36 | 37 | /** 38 | * Create router 39 | * Need to create it in App for now because onResolve callback has to be set 40 | * as option on router creation. 41 | */ 42 | #createRouter(): void { 43 | const routes = [ 44 | { path: "/", action: () => Home }, 45 | { path: "/about", action: () => About as any }, 46 | { path: "/contact", action: () => Contact as any }, 47 | ] 48 | 49 | const options = { 50 | base: "/", 51 | debug: true, 52 | onResolve: (ctx) => this.#onRouteResolve(ctx), 53 | } 54 | 55 | this.router = new LowRouter(routes, options) 56 | } 57 | 58 | /** 59 | * Manage transitions between routes 60 | */ 61 | async #manageTransitions(prevContext: RouteContext, currContext: RouteContext): Promise { 62 | const prev = prevContext?.route.props.instance 63 | const curr = currContext.route.props.instance 64 | 65 | curr.root.style.opacity = "0" 66 | prev?.playOut().then(() => { 67 | prev.root.remove() 68 | prev._unmounted() 69 | }) 70 | await curr.playIn?.() 71 | } 72 | 73 | // --------------------------------------------------------------------------- INTERNAL 74 | 75 | // implement a history listener 76 | // each time the history change, the router will resolve the new location 77 | #handleHistory = ( 78 | location = { 79 | pathname: window.location.pathname, 80 | search: window.location.search, 81 | hash: window.location.hash, 82 | }, 83 | action?, 84 | ): void => { 85 | this.router.resolve(location.pathname + location.search + location.hash) 86 | } 87 | 88 | /** 89 | * on Route Update 90 | * Will be fired on each route change, first route included 91 | * 92 | */ 93 | async #onRouteResolve(context: RouteContext): Promise { 94 | if (context.pathname === this.currContext?.pathname) return 95 | this.currContext = context 96 | this.contexts.push(this.currContext) 97 | 98 | if (this.isAnimating) { 99 | // reject anim promise en cours? 100 | // keep only one div in stack? 101 | } 102 | 103 | try { 104 | // fetch dom 105 | const doc = this.isFirstRoute ? document : await fetchDOM(context.pathname) 106 | const stack = doc.body.querySelector(`.${this.stackClass}`) 107 | const root = stack.querySelector(":scope > *") 108 | this.stack.appendChild(root) 109 | const instance = context.route.action(context) 110 | if (!context.route.props) context.route.props = {} 111 | context.route.props.instance = new instance(root) 112 | 113 | // Transition... 114 | this.isAnimating = true 115 | const prevContext = this.contexts[this.contexts.length - 2] 116 | await this.#manageTransitions(prevContext, this.currContext) 117 | 118 | // remove prev context from array 119 | const index = this.contexts.indexOf(prevContext) 120 | if (index > -1) this.contexts.splice(index, 1) 121 | } catch (e) { 122 | console.error("preTransition error", e) 123 | } 124 | 125 | // then... 126 | this.#updateLinks() 127 | this.isFirstRoute = false 128 | this.isAnimating = false 129 | } 130 | 131 | /** 132 | * Links 133 | */ 134 | #listenLinks(): void { 135 | for (let link of this.links) { 136 | link.addEventListener("click", this.#handleLinks) 137 | } 138 | } 139 | #unlistenLinks(): void { 140 | for (let link of this.links) { 141 | link?.removeEventListener("click", this.#handleLinks) 142 | } 143 | } 144 | #updateLinks(): void { 145 | if (this.links) this.#unlistenLinks() 146 | this.links = document.querySelectorAll(`.${this.linkClass}`) 147 | if (this.links) this.#listenLinks() 148 | } 149 | #handleLinks = (e): void => { 150 | e.preventDefault() 151 | const href: string = e.currentTarget.getAttribute("href") 152 | if (!href) console.error("No href attribute found on link", e.currentTarget) 153 | else { 154 | this.browserHistory.push(href) 155 | } 156 | } 157 | } 158 | -------------------------------------------------------------------------------- /examples/basic/src/components/Footer.ts: -------------------------------------------------------------------------------- 1 | import { Component } from "@wbe/compose"; 2 | import debug from "@wbe/debug" 3 | const log = debug(`front:Footer`) 4 | 5 | type TProps = {} 6 | 7 | /** 8 | * @name Footer 9 | */ 10 | export default class Footer extends Component { 11 | mounted () { 12 | log('Footer is mounted', this) 13 | } 14 | 15 | logMe() { 16 | log("Log Me!", this) 17 | } 18 | } 19 | -------------------------------------------------------------------------------- /examples/basic/src/components/Header.ts: -------------------------------------------------------------------------------- 1 | import { Component } from "@wbe/compose" 2 | import MainButton from "./MainButton" 3 | import debug from "@wbe/debug" 4 | const log = debug(`front:Header`) 5 | 6 | type TStaticProps = {} 7 | 8 | /** 9 | * @name Header 10 | */ 11 | export default class Header extends Component { 12 | 13 | public mainButtons = this.addAll(MainButton) 14 | 15 | public mounted() { 16 | log("mainButtons", this.mainButtons) 17 | window.addEventListener("resize", this.resizeHandler) 18 | } 19 | 20 | public unmounted() { 21 | window.removeEventListener("resize", this.resizeHandler) 22 | } 23 | 24 | protected resizeHandler = () => { 25 | log("window.innerWidth", window.innerWidth) 26 | } 27 | } 28 | -------------------------------------------------------------------------------- /examples/basic/src/components/MainButton.ts: -------------------------------------------------------------------------------- 1 | import { Component } from "@wbe/compose" 2 | import debug from "@wbe/debug" 3 | const log = debug(`front:MainButton`) 4 | 5 | /** 6 | * @name MainButton 7 | */ 8 | export default class MainButton extends Component {} 9 | -------------------------------------------------------------------------------- /examples/basic/src/fetchDOM.ts: -------------------------------------------------------------------------------- 1 | const parser = new DOMParser() 2 | let IS_FETCHING = false 3 | 4 | /** 5 | * Fetch new document from specific URL 6 | * @param pathname 7 | * @param controller 8 | */ 9 | export async function fetchDOM( 10 | pathname: string, 11 | controller: AbortController = new AbortController(), 12 | ): Promise { 13 | if (IS_FETCHING) { 14 | controller.abort() 15 | IS_FETCHING = false 16 | return 17 | } 18 | IS_FETCHING = true 19 | const response = await fetch(pathname, { 20 | signal: controller.signal, 21 | method: "GET", 22 | }) 23 | if (response.status >= 200 && response.status < 300) { 24 | const html = await response.text() 25 | IS_FETCHING = false 26 | return typeof html === "string" ? parser.parseFromString(html, "text/html") : html 27 | } 28 | IS_FETCHING = false 29 | } 30 | -------------------------------------------------------------------------------- /examples/basic/src/helpers/defaultTransitions.ts: -------------------------------------------------------------------------------- 1 | import { Interpol } from "@wbe/interpol" 2 | 3 | export const defaultTransitions = (el: HTMLElement) => { 4 | const paused = true 5 | const duration = 700 6 | return { 7 | playIn: () => { 8 | const itp = new Interpol({ 9 | paused, 10 | el, 11 | duration, 12 | ease: "power3.out", 13 | props: { 14 | x: [-100, 0, "px"], 15 | opacity: [0, 1], 16 | }, 17 | }) 18 | return itp.play() 19 | }, 20 | playOut: () => { 21 | const itp = new Interpol({ 22 | el, 23 | duration, 24 | paused, 25 | ease: "power3.out", 26 | props: { 27 | x: [0, 100, "px"], 28 | opacity: [1, 0], 29 | }, 30 | }) 31 | return itp.play() 32 | }, 33 | } 34 | } 35 | -------------------------------------------------------------------------------- /examples/basic/src/index.css: -------------------------------------------------------------------------------- 1 | body { 2 | font-size: 1.2rem; 3 | font-family: sans-serif; 4 | background: #222; 5 | color: #eee; 6 | } 7 | 8 | .Page { 9 | margin-top: 2rem; 10 | position: absolute; 11 | top: 0; 12 | left: 0; 13 | } 14 | 15 | button { 16 | margin-top: 1rem; 17 | cursor: pointer; 18 | background: #000; 19 | border: none; 20 | border-radius: 0.5em; 21 | color: #eee; 22 | padding: 0.4rem 0.6rem; 23 | font-size: 0.9rem; 24 | outline: none; 25 | } 26 | 27 | button:hover { 28 | background: #444; 29 | } 30 | 31 | .link { 32 | color: red; 33 | } 34 | code { 35 | display: block; 36 | margin-top: 3rem; 37 | } 38 | 39 | .active { 40 | color: orange; 41 | } 42 | -------------------------------------------------------------------------------- /examples/basic/src/index.ts: -------------------------------------------------------------------------------- 1 | import "./index.css" 2 | import { App } from "./components/App" 3 | 4 | new App(document.querySelector(".App")) 5 | -------------------------------------------------------------------------------- /examples/basic/src/pages/About.ts: -------------------------------------------------------------------------------- 1 | import { Component } from "@wbe/compose" 2 | import Header from "../components/Header" 3 | import debug from "@wbe/debug" 4 | import { defaultTransitions } from "../helpers/defaultTransitions" 5 | const log = debug(`front:About`) 6 | 7 | /** 8 | * @name About 9 | */ 10 | export default class About extends Component { 11 | protected header = this.add(Header) 12 | 13 | mounted() { 14 | log("> mounted") 15 | window.addEventListener("resize", this.resizeHandler) 16 | } 17 | 18 | unmounted() { 19 | log("> unmounted") 20 | window.removeEventListener("resize", this.resizeHandler) 21 | } 22 | 23 | protected resizeHandler = () => { 24 | log("window.innerWidth", window.innerWidth) 25 | } 26 | 27 | // --------------------------------------------------------------------------- PAGE TRANSITION 28 | 29 | public transition = defaultTransitions(this.root) 30 | async playIn() { 31 | return this.transition.playIn() 32 | } 33 | async playOut() { 34 | return this.transition.playOut() 35 | } 36 | } 37 | -------------------------------------------------------------------------------- /examples/basic/src/pages/Contact.ts: -------------------------------------------------------------------------------- 1 | import { Component } from "@wbe/compose" 2 | import Header from "../components/Header" 3 | import debug from "@wbe/debug" 4 | import { defaultTransitions } from "../helpers/defaultTransitions" 5 | const log = debug(`front:Contact`) 6 | 7 | type TStaticProps = {} 8 | 9 | /** 10 | * @name Contact 11 | */ 12 | export default class Contact extends Component { 13 | public header = this.add(Header) 14 | 15 | public mounted() { 16 | window.addEventListener("resize", this.resizeHandler) 17 | } 18 | 19 | public unmounted() { 20 | window.removeEventListener("resize", this.resizeHandler) 21 | } 22 | 23 | protected resizeHandler = () => { 24 | log("window.innerWidth", window.innerWidth) 25 | } 26 | 27 | // --------------------------------------------------------------------------- PAGE TRANSITION 28 | 29 | public transition = defaultTransitions(this.root) 30 | async playIn() { 31 | return this.transition.playIn() 32 | } 33 | async playOut() { 34 | return this.transition.playOut() 35 | } 36 | } 37 | -------------------------------------------------------------------------------- /examples/basic/src/pages/Home.ts: -------------------------------------------------------------------------------- 1 | import { Component } from "@wbe/compose" 2 | import Header from "../components/Header" 3 | import debug from "@wbe/debug" 4 | import { defaultTransitions } from "../helpers/defaultTransitions" 5 | import { listen } from "@cher-ami/utils" 6 | const log = debug(`front:Home`) 7 | 8 | type TStaticProps = {} 9 | 10 | /** 11 | * @name Home 12 | */ 13 | export default class Home extends Component { 14 | public header = this.add(Header) 15 | 16 | public mounted() { 17 | return listen(window, "resize", () => { 18 | log("window.innerWidth", window.innerWidth) 19 | }) 20 | } 21 | 22 | // --------------------------------------------------------------------------- PAGE TRANSITION 23 | 24 | public transition = defaultTransitions(this.root) 25 | async playIn() { 26 | return this.transition.playIn() 27 | } 28 | async playOut() { 29 | return this.transition.playOut() 30 | } 31 | } 32 | -------------------------------------------------------------------------------- /examples/basic/tsconfig.json: -------------------------------------------------------------------------------- 1 | { 2 | "compilerOptions": { 3 | "module": "esnext", 4 | "target": "esnext", 5 | "lib": ["es2015.promise", "es6", "dom", "esnext"], 6 | "jsx": "react", 7 | "moduleResolution": "node", 8 | "declaration": true, 9 | "isolatedModules": false, 10 | "noImplicitAny": false, 11 | "esModuleInterop": true, 12 | "preserveConstEnums": true, 13 | "strictNullChecks": false 14 | }, 15 | "include": ["./src/**/*"], 16 | "exclude": ["node_modules", "dist", "test"] 17 | } 18 | -------------------------------------------------------------------------------- /examples/basic/vite.config.ts: -------------------------------------------------------------------------------- 1 | import { defineConfig } from "vite"; 2 | 3 | // https://vitejs.dev/config/ 4 | export default defineConfig({ 5 | server: { 6 | host: true 7 | }, 8 | plugins: [ 9 | { 10 | name: "rewrite-middleware", 11 | configureServer(serve) { 12 | serve.middlewares.use((req, res, next) => { 13 | for (let p of ["about", "contact"]) { 14 | if (req.url.startsWith(`/${p}`)) req.url = `/${p}.html` 15 | } 16 | next() 17 | }) 18 | }, 19 | }, 20 | ], 21 | }); 22 | -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "@wbe/compose", 3 | "version": "0.17.1", 4 | "description": "Compose is a small and type-safe library that links your javascript to your DOM.", 5 | "author": "Willy Brauner", 6 | "license": "MIT", 7 | "type": "module", 8 | "files": [ 9 | "dist" 10 | ], 11 | "sideEffects": false, 12 | "main": "./dist/compose.js", 13 | "module": "./dist/compose.js", 14 | "types": "./dist/compose.d.ts", 15 | "repository": { 16 | "type": "git", 17 | "url": "https://github.com/willybrauner/compose.git" 18 | }, 19 | "publishConfig": { 20 | "access": "public" 21 | }, 22 | "keywords": [ 23 | "compose", 24 | "component" 25 | ], 26 | "scripts": { 27 | "clean": "rm -rf dist", 28 | "build": "tsup", 29 | "build:watch": "tsup --watch --sourcemap", 30 | "dev": "FORCE_COLOR=1 turbo run dev", 31 | "ncu": "ncu -u && FORCE_COLOR=1 turbo run ncu", 32 | "test:watch": "vitest --reporter verbose", 33 | "test": "vitest run", 34 | "size": "size-limit", 35 | "pre-publish": "npm run build && npm run test" 36 | }, 37 | "dependencies": { 38 | "@wbe/debug": "latest" 39 | }, 40 | "devDependencies": { 41 | "terser": "^5.24.0", 42 | "tsup": "^8.0.1", 43 | "@size-limit/preset-small-lib": "^11.0.0", 44 | "happy-dom": "^12.10.3", 45 | "prettier": "^3.1.0", 46 | "size-limit": "^11.0.0", 47 | "turbo": "^1.10.16", 48 | "typescript": "^5.3.2", 49 | "vite": "^5.0.4", 50 | "vitest": "^0.34.6", 51 | "@types/node": "^20.10.3" 52 | }, 53 | "prettier": { 54 | "printWidth": 100, 55 | "semi": false 56 | }, 57 | "size-limit": [ 58 | { 59 | "name": "@wbe/compose", 60 | "path": "dist/compose.js", 61 | "limit": "2 KB" 62 | } 63 | ] 64 | } 65 | -------------------------------------------------------------------------------- /pnpm-lock.yaml: -------------------------------------------------------------------------------- 1 | lockfileVersion: '6.0' 2 | 3 | settings: 4 | autoInstallPeers: true 5 | excludeLinksFromLockfile: false 6 | 7 | importers: 8 | 9 | .: 10 | dependencies: 11 | '@wbe/debug': 12 | specifier: latest 13 | version: 1.2.0 14 | devDependencies: 15 | '@size-limit/preset-small-lib': 16 | specifier: ^11.0.0 17 | version: 11.0.0(size-limit@11.0.0) 18 | '@types/node': 19 | specifier: ^20.10.3 20 | version: 20.10.3 21 | happy-dom: 22 | specifier: ^12.10.3 23 | version: 12.10.3 24 | prettier: 25 | specifier: ^3.1.0 26 | version: 3.1.0 27 | size-limit: 28 | specifier: ^11.0.0 29 | version: 11.0.0 30 | terser: 31 | specifier: ^5.24.0 32 | version: 5.24.0 33 | tsup: 34 | specifier: ^8.0.1 35 | version: 8.0.1(typescript@5.3.2) 36 | turbo: 37 | specifier: ^1.10.16 38 | version: 1.10.16 39 | typescript: 40 | specifier: ^5.3.2 41 | version: 5.3.2 42 | vite: 43 | specifier: ^5.0.4 44 | version: 5.0.4(@types/node@20.10.3)(terser@5.24.0) 45 | vitest: 46 | specifier: ^0.34.6 47 | version: 0.34.6(happy-dom@12.10.3)(terser@5.24.0) 48 | 49 | examples/basic: 50 | dependencies: 51 | '@cher-ami/utils': 52 | specifier: ^1.4.1 53 | version: 1.4.1 54 | '@wbe/compose': 55 | specifier: workspace:^ 56 | version: link:../.. 57 | '@wbe/debug': 58 | specifier: latest 59 | version: 1.2.0 60 | '@wbe/interpol': 61 | specifier: ^0.9.0 62 | version: 0.9.0 63 | '@wbe/low-router': 64 | specifier: ^0.1.1 65 | version: 0.1.1 66 | gsap: 67 | specifier: ^3.12.3 68 | version: 3.12.3 69 | devDependencies: 70 | typescript: 71 | specifier: ^5.3.2 72 | version: 5.3.2 73 | vite: 74 | specifier: ^5.0.4 75 | version: 5.0.4(@types/node@20.10.3)(terser@5.24.0) 76 | 77 | packages: 78 | 79 | /@cher-ami/utils@1.4.1: 80 | resolution: {integrity: sha512-4FE2ais6TduClhDpOaBCSbwPyJz4iV8za1MDCFKfQ3gU4r3jyQJHiNinjKMvMTwNvytdfM1+NF4xGT4uBdEwZA==} 81 | dev: false 82 | 83 | /@esbuild/android-arm64@0.19.6: 84 | resolution: {integrity: sha512-KQ/hbe9SJvIJ4sR+2PcZ41IBV+LPJyYp6V1K1P1xcMRup9iYsBoQn4MzE3mhMLOld27Au2eDcLlIREeKGUXpHQ==} 85 | engines: {node: '>=12'} 86 | cpu: [arm64] 87 | os: [android] 88 | requiresBuild: true 89 | dev: true 90 | optional: true 91 | 92 | /@esbuild/android-arm@0.19.6: 93 | resolution: {integrity: sha512-muPzBqXJKCbMYoNbb1JpZh/ynl0xS6/+pLjrofcR3Nad82SbsCogYzUE6Aq9QT3cLP0jR/IVK/NHC9b90mSHtg==} 94 | engines: {node: '>=12'} 95 | cpu: [arm] 96 | os: [android] 97 | requiresBuild: true 98 | dev: true 99 | optional: true 100 | 101 | /@esbuild/android-x64@0.19.6: 102 | resolution: {integrity: sha512-VVJVZQ7p5BBOKoNxd0Ly3xUM78Y4DyOoFKdkdAe2m11jbh0LEU4bPles4e/72EMl4tapko8o915UalN/5zhspg==} 103 | engines: {node: '>=12'} 104 | cpu: [x64] 105 | os: [android] 106 | requiresBuild: true 107 | dev: true 108 | optional: true 109 | 110 | /@esbuild/darwin-arm64@0.19.6: 111 | resolution: {integrity: sha512-91LoRp/uZAKx6ESNspL3I46ypwzdqyDLXZH7x2QYCLgtnaU08+AXEbabY2yExIz03/am0DivsTtbdxzGejfXpA==} 112 | engines: {node: '>=12'} 113 | cpu: [arm64] 114 | os: [darwin] 115 | requiresBuild: true 116 | dev: true 117 | optional: true 118 | 119 | /@esbuild/darwin-x64@0.19.6: 120 | resolution: {integrity: sha512-QCGHw770ubjBU1J3ZkFJh671MFajGTYMZumPs9E/rqU52md6lIil97BR0CbPq6U+vTh3xnTNDHKRdR8ggHnmxQ==} 121 | engines: {node: '>=12'} 122 | cpu: [x64] 123 | os: [darwin] 124 | requiresBuild: true 125 | dev: true 126 | optional: true 127 | 128 | /@esbuild/freebsd-arm64@0.19.6: 129 | resolution: {integrity: sha512-J53d0jGsDcLzWk9d9SPmlyF+wzVxjXpOH7jVW5ae7PvrDst4kiAz6sX+E8btz0GB6oH12zC+aHRD945jdjF2Vg==} 130 | engines: {node: '>=12'} 131 | cpu: [arm64] 132 | os: [freebsd] 133 | requiresBuild: true 134 | dev: true 135 | optional: true 136 | 137 | /@esbuild/freebsd-x64@0.19.6: 138 | resolution: {integrity: sha512-hn9qvkjHSIB5Z9JgCCjED6YYVGCNpqB7dEGavBdG6EjBD8S/UcNUIlGcB35NCkMETkdYwfZSvD9VoDJX6VeUVA==} 139 | engines: {node: '>=12'} 140 | cpu: [x64] 141 | os: [freebsd] 142 | requiresBuild: true 143 | dev: true 144 | optional: true 145 | 146 | /@esbuild/linux-arm64@0.19.6: 147 | resolution: {integrity: sha512-HQCOrk9XlH3KngASLaBfHpcoYEGUt829A9MyxaI8RMkfRA8SakG6YQEITAuwmtzFdEu5GU4eyhKcpv27dFaOBg==} 148 | engines: {node: '>=12'} 149 | cpu: [arm64] 150 | os: [linux] 151 | requiresBuild: true 152 | dev: true 153 | optional: true 154 | 155 | /@esbuild/linux-arm@0.19.6: 156 | resolution: {integrity: sha512-G8IR5zFgpXad/Zp7gr7ZyTKyqZuThU6z1JjmRyN1vSF8j0bOlGzUwFSMTbctLAdd7QHpeyu0cRiuKrqK1ZTwvQ==} 157 | engines: {node: '>=12'} 158 | cpu: [arm] 159 | os: [linux] 160 | requiresBuild: true 161 | dev: true 162 | optional: true 163 | 164 | /@esbuild/linux-ia32@0.19.6: 165 | resolution: {integrity: sha512-22eOR08zL/OXkmEhxOfshfOGo8P69k8oKHkwkDrUlcB12S/sw/+COM4PhAPT0cAYW/gpqY2uXp3TpjQVJitz7w==} 166 | engines: {node: '>=12'} 167 | cpu: [ia32] 168 | os: [linux] 169 | requiresBuild: true 170 | dev: true 171 | optional: true 172 | 173 | /@esbuild/linux-loong64@0.19.6: 174 | resolution: {integrity: sha512-82RvaYAh/SUJyjWA8jDpyZCHQjmEggL//sC7F3VKYcBMumQjUL3C5WDl/tJpEiKtt7XrWmgjaLkrk205zfvwTA==} 175 | engines: {node: '>=12'} 176 | cpu: [loong64] 177 | os: [linux] 178 | requiresBuild: true 179 | dev: true 180 | optional: true 181 | 182 | /@esbuild/linux-mips64el@0.19.6: 183 | resolution: {integrity: sha512-8tvnwyYJpR618vboIv2l8tK2SuK/RqUIGMfMENkeDGo3hsEIrpGldMGYFcWxWeEILe5Fi72zoXLmhZ7PR23oQA==} 184 | engines: {node: '>=12'} 185 | cpu: [mips64el] 186 | os: [linux] 187 | requiresBuild: true 188 | dev: true 189 | optional: true 190 | 191 | /@esbuild/linux-ppc64@0.19.6: 192 | resolution: {integrity: sha512-Qt+D7xiPajxVNk5tQiEJwhmarNnLPdjXAoA5uWMpbfStZB0+YU6a3CtbWYSy+sgAsnyx4IGZjWsTzBzrvg/fMA==} 193 | engines: {node: '>=12'} 194 | cpu: [ppc64] 195 | os: [linux] 196 | requiresBuild: true 197 | dev: true 198 | optional: true 199 | 200 | /@esbuild/linux-riscv64@0.19.6: 201 | resolution: {integrity: sha512-lxRdk0iJ9CWYDH1Wpnnnc640ajF4RmQ+w6oHFZmAIYu577meE9Ka/DCtpOrwr9McMY11ocbp4jirgGgCi7Ls/g==} 202 | engines: {node: '>=12'} 203 | cpu: [riscv64] 204 | os: [linux] 205 | requiresBuild: true 206 | dev: true 207 | optional: true 208 | 209 | /@esbuild/linux-s390x@0.19.6: 210 | resolution: {integrity: sha512-MopyYV39vnfuykHanRWHGRcRC3AwU7b0QY4TI8ISLfAGfK+tMkXyFuyT1epw/lM0pflQlS53JoD22yN83DHZgA==} 211 | engines: {node: '>=12'} 212 | cpu: [s390x] 213 | os: [linux] 214 | requiresBuild: true 215 | dev: true 216 | optional: true 217 | 218 | /@esbuild/linux-x64@0.19.6: 219 | resolution: {integrity: sha512-UWcieaBzsN8WYbzFF5Jq7QULETPcQvlX7KL4xWGIB54OknXJjBO37sPqk7N82WU13JGWvmDzFBi1weVBajPovg==} 220 | engines: {node: '>=12'} 221 | cpu: [x64] 222 | os: [linux] 223 | requiresBuild: true 224 | dev: true 225 | optional: true 226 | 227 | /@esbuild/netbsd-x64@0.19.6: 228 | resolution: {integrity: sha512-EpWiLX0fzvZn1wxtLxZrEW+oQED9Pwpnh+w4Ffv8ZLuMhUoqR9q9rL4+qHW8F4Mg5oQEKxAoT0G+8JYNqCiR6g==} 229 | engines: {node: '>=12'} 230 | cpu: [x64] 231 | os: [netbsd] 232 | requiresBuild: true 233 | dev: true 234 | optional: true 235 | 236 | /@esbuild/openbsd-x64@0.19.6: 237 | resolution: {integrity: sha512-fFqTVEktM1PGs2sLKH4M5mhAVEzGpeZJuasAMRnvDZNCV0Cjvm1Hu35moL2vC0DOrAQjNTvj4zWrol/lwQ8Deg==} 238 | engines: {node: '>=12'} 239 | cpu: [x64] 240 | os: [openbsd] 241 | requiresBuild: true 242 | dev: true 243 | optional: true 244 | 245 | /@esbuild/sunos-x64@0.19.6: 246 | resolution: {integrity: sha512-M+XIAnBpaNvaVAhbe3uBXtgWyWynSdlww/JNZws0FlMPSBy+EpatPXNIlKAdtbFVII9OpX91ZfMb17TU3JKTBA==} 247 | engines: {node: '>=12'} 248 | cpu: [x64] 249 | os: [sunos] 250 | requiresBuild: true 251 | dev: true 252 | optional: true 253 | 254 | /@esbuild/win32-arm64@0.19.6: 255 | resolution: {integrity: sha512-2DchFXn7vp/B6Tc2eKdTsLzE0ygqKkNUhUBCNtMx2Llk4POIVMUq5rUYjdcedFlGLeRe1uLCpVvCmE+G8XYybA==} 256 | engines: {node: '>=12'} 257 | cpu: [arm64] 258 | os: [win32] 259 | requiresBuild: true 260 | dev: true 261 | optional: true 262 | 263 | /@esbuild/win32-ia32@0.19.6: 264 | resolution: {integrity: sha512-PBo/HPDQllyWdjwAVX+Gl2hH0dfBydL97BAH/grHKC8fubqp02aL4S63otZ25q3sBdINtOBbz1qTZQfXbP4VBg==} 265 | engines: {node: '>=12'} 266 | cpu: [ia32] 267 | os: [win32] 268 | requiresBuild: true 269 | dev: true 270 | optional: true 271 | 272 | /@esbuild/win32-x64@0.19.6: 273 | resolution: {integrity: sha512-OE7yIdbDif2kKfrGa+V0vx/B3FJv2L4KnIiLlvtibPyO9UkgO3rzYE0HhpREo2vmJ1Ixq1zwm9/0er+3VOSZJA==} 274 | engines: {node: '>=12'} 275 | cpu: [x64] 276 | os: [win32] 277 | requiresBuild: true 278 | dev: true 279 | optional: true 280 | 281 | /@jest/schemas@29.6.3: 282 | resolution: {integrity: sha512-mo5j5X+jIZmJQveBKeS/clAueipV7KgiX1vMgCxam1RNYiqE1w62n0/tJJnHtjW8ZHcQco5gY85jA3mi0L+nSA==} 283 | engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} 284 | dependencies: 285 | '@sinclair/typebox': 0.27.8 286 | dev: true 287 | 288 | /@jridgewell/gen-mapping@0.3.3: 289 | resolution: {integrity: sha512-HLhSWOLRi875zjjMG/r+Nv0oCW8umGb0BgEhyX3dDX3egwZtB8PqLnjz3yedt8R5StBrzcg4aBpnh8UA9D1BoQ==} 290 | engines: {node: '>=6.0.0'} 291 | dependencies: 292 | '@jridgewell/set-array': 1.1.2 293 | '@jridgewell/sourcemap-codec': 1.4.15 294 | '@jridgewell/trace-mapping': 0.3.19 295 | dev: true 296 | 297 | /@jridgewell/resolve-uri@3.1.1: 298 | resolution: {integrity: sha512-dSYZh7HhCDtCKm4QakX0xFpsRDqjjtZf/kjI/v3T3Nwt5r8/qz/M19F9ySyOqU94SXBmeG9ttTul+YnR4LOxFA==} 299 | engines: {node: '>=6.0.0'} 300 | dev: true 301 | 302 | /@jridgewell/set-array@1.1.2: 303 | resolution: {integrity: sha512-xnkseuNADM0gt2bs+BvhO0p78Mk762YnZdsuzFV018NoG1Sj1SCQvpSqa7XUaTam5vAGasABV9qXASMKnFMwMw==} 304 | engines: {node: '>=6.0.0'} 305 | dev: true 306 | 307 | /@jridgewell/source-map@0.3.5: 308 | resolution: {integrity: sha512-UTYAUj/wviwdsMfzoSJspJxbkH5o1snzwX0//0ENX1u/55kkZZkcTZP6u9bwKGkv+dkk9at4m1Cpt0uY80kcpQ==} 309 | dependencies: 310 | '@jridgewell/gen-mapping': 0.3.3 311 | '@jridgewell/trace-mapping': 0.3.19 312 | dev: true 313 | 314 | /@jridgewell/sourcemap-codec@1.4.15: 315 | resolution: {integrity: sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg==} 316 | dev: true 317 | 318 | /@jridgewell/trace-mapping@0.3.19: 319 | resolution: {integrity: sha512-kf37QtfW+Hwx/buWGMPcR60iF9ziHa6r/CZJIHbmcm4+0qrXiVdxegAH0F6yddEVQ7zdkjcGCgCzUu+BcbhQxw==} 320 | dependencies: 321 | '@jridgewell/resolve-uri': 3.1.1 322 | '@jridgewell/sourcemap-codec': 1.4.15 323 | dev: true 324 | 325 | /@nodelib/fs.scandir@2.1.5: 326 | resolution: {integrity: sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==} 327 | engines: {node: '>= 8'} 328 | dependencies: 329 | '@nodelib/fs.stat': 2.0.5 330 | run-parallel: 1.2.0 331 | dev: true 332 | 333 | /@nodelib/fs.stat@2.0.5: 334 | resolution: {integrity: sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==} 335 | engines: {node: '>= 8'} 336 | dev: true 337 | 338 | /@nodelib/fs.walk@1.2.8: 339 | resolution: {integrity: sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==} 340 | engines: {node: '>= 8'} 341 | dependencies: 342 | '@nodelib/fs.scandir': 2.1.5 343 | fastq: 1.13.0 344 | dev: true 345 | 346 | /@rollup/rollup-android-arm-eabi@4.5.0: 347 | resolution: {integrity: sha512-OINaBGY+Wc++U0rdr7BLuFClxcoWaVW3vQYqmQq6B3bqQ/2olkaoz+K8+af/Mmka/C2yN5j+L9scBkv4BtKsDA==} 348 | cpu: [arm] 349 | os: [android] 350 | requiresBuild: true 351 | dev: true 352 | optional: true 353 | 354 | /@rollup/rollup-android-arm64@4.5.0: 355 | resolution: {integrity: sha512-UdMf1pOQc4ZmUA/NTmKhgJTBimbSKnhPS2zJqucqFyBRFPnPDtwA8MzrGNTjDeQbIAWfpJVAlxejw+/lQyBK/w==} 356 | cpu: [arm64] 357 | os: [android] 358 | requiresBuild: true 359 | dev: true 360 | optional: true 361 | 362 | /@rollup/rollup-darwin-arm64@4.5.0: 363 | resolution: {integrity: sha512-L0/CA5p/idVKI+c9PcAPGorH6CwXn6+J0Ys7Gg1axCbTPgI8MeMlhA6fLM9fK+ssFhqogMHFC8HDvZuetOii7w==} 364 | cpu: [arm64] 365 | os: [darwin] 366 | requiresBuild: true 367 | dev: true 368 | optional: true 369 | 370 | /@rollup/rollup-darwin-x64@4.5.0: 371 | resolution: {integrity: sha512-QZCbVqU26mNlLn8zi/XDDquNmvcr4ON5FYAHQQsyhrHx8q+sQi/6xduoznYXwk/KmKIXG5dLfR0CvY+NAWpFYQ==} 372 | cpu: [x64] 373 | os: [darwin] 374 | requiresBuild: true 375 | dev: true 376 | optional: true 377 | 378 | /@rollup/rollup-linux-arm-gnueabihf@4.5.0: 379 | resolution: {integrity: sha512-VpSQ+xm93AeV33QbYslgf44wc5eJGYfYitlQzAi3OObu9iwrGXEnmu5S3ilkqE3Pr/FkgOiJKV/2p0ewf4Hrtg==} 380 | cpu: [arm] 381 | os: [linux] 382 | requiresBuild: true 383 | dev: true 384 | optional: true 385 | 386 | /@rollup/rollup-linux-arm64-gnu@4.5.0: 387 | resolution: {integrity: sha512-OrEyIfpxSsMal44JpEVx9AEcGpdBQG1ZuWISAanaQTSMeStBW+oHWwOkoqR54bw3x8heP8gBOyoJiGg+fLY8qQ==} 388 | cpu: [arm64] 389 | os: [linux] 390 | requiresBuild: true 391 | dev: true 392 | optional: true 393 | 394 | /@rollup/rollup-linux-arm64-musl@4.5.0: 395 | resolution: {integrity: sha512-1H7wBbQuE6igQdxMSTjtFfD+DGAudcYWhp106z/9zBA8OQhsJRnemO4XGavdzHpGhRtRxbgmUGdO3YQgrWf2RA==} 396 | cpu: [arm64] 397 | os: [linux] 398 | requiresBuild: true 399 | dev: true 400 | optional: true 401 | 402 | /@rollup/rollup-linux-x64-gnu@4.5.0: 403 | resolution: {integrity: sha512-FVyFI13tXw5aE65sZdBpNjPVIi4Q5mARnL/39UIkxvSgRAIqCo5sCpCELk0JtXHGee2owZz5aNLbWNfBHzr71Q==} 404 | cpu: [x64] 405 | os: [linux] 406 | requiresBuild: true 407 | dev: true 408 | optional: true 409 | 410 | /@rollup/rollup-linux-x64-musl@4.5.0: 411 | resolution: {integrity: sha512-eBPYl2sLpH/o8qbSz6vPwWlDyThnQjJfcDOGFbNjmjb44XKC1F5dQfakOsADRVrXCNzM6ZsSIPDG5dc6HHLNFg==} 412 | cpu: [x64] 413 | os: [linux] 414 | requiresBuild: true 415 | dev: true 416 | optional: true 417 | 418 | /@rollup/rollup-win32-arm64-msvc@4.5.0: 419 | resolution: {integrity: sha512-xaOHIfLOZypoQ5U2I6rEaugS4IYtTgP030xzvrBf5js7p9WI9wik07iHmsKaej8Z83ZDxN5GyypfoyKV5O5TJA==} 420 | cpu: [arm64] 421 | os: [win32] 422 | requiresBuild: true 423 | dev: true 424 | optional: true 425 | 426 | /@rollup/rollup-win32-ia32-msvc@4.5.0: 427 | resolution: {integrity: sha512-Al6quztQUrHwcOoU2TuFblUQ5L+/AmPBXFR6dUvyo4nRj2yQRK0WIUaGMF/uwKulvRcXkpHe3k9A8Vf93VDktA==} 428 | cpu: [ia32] 429 | os: [win32] 430 | requiresBuild: true 431 | dev: true 432 | optional: true 433 | 434 | /@rollup/rollup-win32-x64-msvc@4.5.0: 435 | resolution: {integrity: sha512-8kdW+brNhI/NzJ4fxDufuJUjepzINqJKLGHuxyAtpPG9bMbn8P5mtaCcbOm0EzLJ+atg+kF9dwg8jpclkVqx5w==} 436 | cpu: [x64] 437 | os: [win32] 438 | requiresBuild: true 439 | dev: true 440 | optional: true 441 | 442 | /@sinclair/typebox@0.27.8: 443 | resolution: {integrity: sha512-+Fj43pSMwJs4KRrH/938Uf+uAELIgVBmQzg/q1YG10djyfA3TnrU8N8XzqCh/okZdszqBQTZf96idMfE5lnwTA==} 444 | dev: true 445 | 446 | /@sindresorhus/merge-streams@1.0.0: 447 | resolution: {integrity: sha512-rUV5WyJrJLoloD4NDN1V1+LDMDWOa4OTsT4yYJwQNpTU6FWxkxHpL7eu4w+DmiH8x/EAM1otkPE1+LaspIbplw==} 448 | engines: {node: '>=18'} 449 | dev: true 450 | 451 | /@size-limit/esbuild@11.0.0(size-limit@11.0.0): 452 | resolution: {integrity: sha512-OOmba2ZuMpaUhmBXgCfgrO7L6zkUDwvFFfW8T+dK08968LQ79Q+kNgEXQAd+dhj9TlTkHyyEDczWmx16e9cXoQ==} 453 | engines: {node: ^18.0.0 || >=20.0.0} 454 | peerDependencies: 455 | size-limit: 11.0.0 456 | dependencies: 457 | esbuild: 0.19.6 458 | nanoid: 5.0.4 459 | size-limit: 11.0.0 460 | dev: true 461 | 462 | /@size-limit/file@11.0.0(size-limit@11.0.0): 463 | resolution: {integrity: sha512-tTg6sSiFbiogiof3GV4iIRCPS4+46Hvq4QWXGXp00Be/tOnpglXF62xNpCfFwefx9YCXxCyeYSqqaRBjpRCsmQ==} 464 | engines: {node: ^18.0.0 || >=20.0.0} 465 | peerDependencies: 466 | size-limit: 11.0.0 467 | dependencies: 468 | size-limit: 11.0.0 469 | dev: true 470 | 471 | /@size-limit/preset-small-lib@11.0.0(size-limit@11.0.0): 472 | resolution: {integrity: sha512-B4KDPbx5E8Vsn/aXilt2iAeofRBJdT8svQRSylTQPw5RkrumXUBKioM1dmWUXcnuHR2zUveJXlMxGmbdmxbJpQ==} 473 | peerDependencies: 474 | size-limit: 11.0.0 475 | dependencies: 476 | '@size-limit/esbuild': 11.0.0(size-limit@11.0.0) 477 | '@size-limit/file': 11.0.0(size-limit@11.0.0) 478 | size-limit: 11.0.0 479 | dev: true 480 | 481 | /@types/chai-subset@1.3.3: 482 | resolution: {integrity: sha512-frBecisrNGz+F4T6bcc+NLeolfiojh5FxW2klu669+8BARtyQv2C/GkNW6FUodVe4BroGMP/wER/YDGc7rEllw==} 483 | dependencies: 484 | '@types/chai': 4.3.6 485 | dev: true 486 | 487 | /@types/chai@4.3.6: 488 | resolution: {integrity: sha512-VOVRLM1mBxIRxydiViqPcKn6MIxZytrbMpd6RJLIWKxUNr3zux8no0Oc7kJx0WAPIitgZ0gkrDS+btlqQpubpw==} 489 | dev: true 490 | 491 | /@types/node@20.10.3: 492 | resolution: {integrity: sha512-XJavIpZqiXID5Yxnxv3RUDKTN5b81ddNC3ecsA0SoFXz/QU8OGBwZGMomiq0zw+uuqbL/krztv/DINAQ/EV4gg==} 493 | dependencies: 494 | undici-types: 5.26.5 495 | dev: true 496 | 497 | /@vitest/expect@0.34.6: 498 | resolution: {integrity: sha512-QUzKpUQRc1qC7qdGo7rMK3AkETI7w18gTCUrsNnyjjJKYiuUB9+TQK3QnR1unhCnWRC0AbKv2omLGQDF/mIjOw==} 499 | dependencies: 500 | '@vitest/spy': 0.34.6 501 | '@vitest/utils': 0.34.6 502 | chai: 4.3.10 503 | dev: true 504 | 505 | /@vitest/runner@0.34.6: 506 | resolution: {integrity: sha512-1CUQgtJSLF47NnhN+F9X2ycxUP0kLHQ/JWvNHbeBfwW8CzEGgeskzNnHDyv1ieKTltuR6sdIHV+nmR6kPxQqzQ==} 507 | dependencies: 508 | '@vitest/utils': 0.34.6 509 | p-limit: 4.0.0 510 | pathe: 1.1.1 511 | dev: true 512 | 513 | /@vitest/snapshot@0.34.6: 514 | resolution: {integrity: sha512-B3OZqYn6k4VaN011D+ve+AA4whM4QkcwcrwaKwAbyyvS/NB1hCWjFIBQxAQQSQir9/RtyAAGuq+4RJmbn2dH4w==} 515 | dependencies: 516 | magic-string: 0.30.4 517 | pathe: 1.1.1 518 | pretty-format: 29.7.0 519 | dev: true 520 | 521 | /@vitest/spy@0.34.6: 522 | resolution: {integrity: sha512-xaCvneSaeBw/cz8ySmF7ZwGvL0lBjfvqc1LpQ/vcdHEvpLn3Ff1vAvjw+CoGn0802l++5L/pxb7whwcWAw+DUQ==} 523 | dependencies: 524 | tinyspy: 2.2.0 525 | dev: true 526 | 527 | /@vitest/utils@0.34.6: 528 | resolution: {integrity: sha512-IG5aDD8S6zlvloDsnzHw0Ut5xczlF+kv2BOTo+iXfPr54Yhi5qbVOgGB1hZaVq4iJ4C/MZ2J0y15IlsV/ZcI0A==} 529 | dependencies: 530 | diff-sequences: 29.6.3 531 | loupe: 2.3.6 532 | pretty-format: 29.7.0 533 | dev: true 534 | 535 | /@wbe/debug@1.2.0: 536 | resolution: {integrity: sha512-jTCR1JagaS4TpoPR5sjdVfu67Muz5mDB49seMVsbRvetodgPjATELXQWtKRlyrj3hCyZt+rjw1iacYfpCc9Yuw==} 537 | dev: false 538 | 539 | /@wbe/interpol@0.9.0: 540 | resolution: {integrity: sha512-dppeNa3WD/HZTmcJwzfe7UjqsmCNSelh8YKn4v4tXdjMxdMdozLI88sEGCquSdvcLTGpwovx3sOOSRYTVKqk5w==} 541 | dev: false 542 | 543 | /@wbe/low-router@0.1.1: 544 | resolution: {integrity: sha512-e00hPQElmIVTmOqCNn/M+cipFUpFh20xRAIxdSIbdTaepJsgd5lh0C4TulIyyPZjLR3dfALMrzQj+zyI4GC8jw==} 545 | dev: false 546 | 547 | /acorn-walk@8.2.0: 548 | resolution: {integrity: sha512-k+iyHEuPgSw6SbuDpGQM+06HQUa04DZ3o+F6CSzXMvvI5KMvnaEqXe+YVe555R9nn6GPt404fos4wcgpw12SDA==} 549 | engines: {node: '>=0.4.0'} 550 | dev: true 551 | 552 | /acorn@8.10.0: 553 | resolution: {integrity: sha512-F0SAmZ8iUtS//m8DmCTA0jlh6TDKkHQyK6xc6V4KDTyZKA9dnvX9/3sRTVQrWm79glUAZbnmmNcdYwUIHWVybw==} 554 | engines: {node: '>=0.4.0'} 555 | hasBin: true 556 | dev: true 557 | 558 | /ansi-styles@5.2.0: 559 | resolution: {integrity: sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==} 560 | engines: {node: '>=10'} 561 | dev: true 562 | 563 | /any-promise@1.3.0: 564 | resolution: {integrity: sha512-7UvmKalWRt1wgjL1RrGxoSJW/0QZFIegpeGvZG9kjp8vrRu55XTHbwnqq2GpXm9uLbcuhxm3IqX9OB4MZR1b2A==} 565 | dev: true 566 | 567 | /anymatch@3.1.2: 568 | resolution: {integrity: sha512-P43ePfOAIupkguHUycrc4qJ9kz8ZiuOUijaETwX7THt0Y/GNK7v0aa8rY816xWjZ7rJdA5XdMcpVFTKMq+RvWg==} 569 | engines: {node: '>= 8'} 570 | dependencies: 571 | normalize-path: 3.0.0 572 | picomatch: 2.3.1 573 | dev: true 574 | 575 | /array-union@2.1.0: 576 | resolution: {integrity: sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==} 577 | engines: {node: '>=8'} 578 | dev: true 579 | 580 | /assertion-error@1.1.0: 581 | resolution: {integrity: sha512-jgsaNduz+ndvGyFt3uSuWqvy4lCnIJiovtouQN5JZHOKCS2QuhEdbcQHFhVksz2N2U9hXJo8odG7ETyWlEeuDw==} 582 | dev: true 583 | 584 | /balanced-match@1.0.2: 585 | resolution: {integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==} 586 | dev: true 587 | 588 | /binary-extensions@2.2.0: 589 | resolution: {integrity: sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==} 590 | engines: {node: '>=8'} 591 | dev: true 592 | 593 | /brace-expansion@1.1.11: 594 | resolution: {integrity: sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==} 595 | dependencies: 596 | balanced-match: 1.0.2 597 | concat-map: 0.0.1 598 | dev: true 599 | 600 | /braces@3.0.2: 601 | resolution: {integrity: sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==} 602 | engines: {node: '>=8'} 603 | dependencies: 604 | fill-range: 7.0.1 605 | dev: true 606 | 607 | /buffer-from@1.1.2: 608 | resolution: {integrity: sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==} 609 | dev: true 610 | 611 | /bundle-require@4.0.2(esbuild@0.19.6): 612 | resolution: {integrity: sha512-jwzPOChofl67PSTW2SGubV9HBQAhhR2i6nskiOThauo9dzwDUgOWQScFVaJkjEfYX+UXiD+LEx8EblQMc2wIag==} 613 | engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} 614 | peerDependencies: 615 | esbuild: '>=0.17' 616 | dependencies: 617 | esbuild: 0.19.6 618 | load-tsconfig: 0.2.5 619 | dev: true 620 | 621 | /bytes-iec@3.1.1: 622 | resolution: {integrity: sha512-fey6+4jDK7TFtFg/klGSvNKJctyU7n2aQdnM+CO0ruLPbqqMOM8Tio0Pc+deqUeVKX1tL5DQep1zQ7+37aTAsA==} 623 | engines: {node: '>= 0.8'} 624 | dev: true 625 | 626 | /cac@6.7.14: 627 | resolution: {integrity: sha512-b6Ilus+c3RrdDk+JhLKUAQfzzgLEPy6wcXqS7f/xe1EETvsDP6GORG7SFuOs6cID5YkqchW/LXZbX5bc8j7ZcQ==} 628 | engines: {node: '>=8'} 629 | dev: true 630 | 631 | /chai@4.3.10: 632 | resolution: {integrity: sha512-0UXG04VuVbruMUYbJ6JctvH0YnC/4q3/AkT18q4NaITo91CUm0liMS9VqzT9vZhVQ/1eqPanMWjBM+Juhfb/9g==} 633 | engines: {node: '>=4'} 634 | dependencies: 635 | assertion-error: 1.1.0 636 | check-error: 1.0.3 637 | deep-eql: 4.1.3 638 | get-func-name: 2.0.2 639 | loupe: 2.3.6 640 | pathval: 1.1.1 641 | type-detect: 4.0.8 642 | dev: true 643 | 644 | /check-error@1.0.3: 645 | resolution: {integrity: sha512-iKEoDYaRmd1mxM90a2OEfWhjsjPpYPuQ+lMYsoxB126+t8fw7ySEO48nmDg5COTjxDI65/Y2OWpeEHk3ZOe8zg==} 646 | dependencies: 647 | get-func-name: 2.0.2 648 | dev: true 649 | 650 | /chokidar@3.5.3: 651 | resolution: {integrity: sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==} 652 | engines: {node: '>= 8.10.0'} 653 | dependencies: 654 | anymatch: 3.1.2 655 | braces: 3.0.2 656 | glob-parent: 5.1.2 657 | is-binary-path: 2.1.0 658 | is-glob: 4.0.3 659 | normalize-path: 3.0.0 660 | readdirp: 3.6.0 661 | optionalDependencies: 662 | fsevents: 2.3.3 663 | dev: true 664 | 665 | /commander@2.20.3: 666 | resolution: {integrity: sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==} 667 | dev: true 668 | 669 | /commander@4.1.1: 670 | resolution: {integrity: sha512-NOKm8xhkzAjzFx8B2v5OAHT+u5pRQc2UCa2Vq9jYL/31o2wi9mxBA7LIFs3sV5VSC49z6pEhfbMULvShKj26WA==} 671 | engines: {node: '>= 6'} 672 | dev: true 673 | 674 | /concat-map@0.0.1: 675 | resolution: {integrity: sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==} 676 | dev: true 677 | 678 | /cross-spawn@7.0.3: 679 | resolution: {integrity: sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==} 680 | engines: {node: '>= 8'} 681 | dependencies: 682 | path-key: 3.1.1 683 | shebang-command: 2.0.0 684 | which: 2.0.2 685 | dev: true 686 | 687 | /css.escape@1.5.1: 688 | resolution: {integrity: sha512-YUifsXXuknHlUsmlgyY0PKzgPOr7/FjCePfHNt0jxm83wHZi44VDMQ7/fGNkjY3/jV1MC+1CmZbaHzugyeRtpg==} 689 | dev: true 690 | 691 | /debug@4.3.4: 692 | resolution: {integrity: sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==} 693 | engines: {node: '>=6.0'} 694 | peerDependencies: 695 | supports-color: '*' 696 | peerDependenciesMeta: 697 | supports-color: 698 | optional: true 699 | dependencies: 700 | ms: 2.1.2 701 | dev: true 702 | 703 | /deep-eql@4.1.3: 704 | resolution: {integrity: sha512-WaEtAOpRA1MQ0eohqZjpGD8zdI0Ovsm8mmFhaDN8dvDZzyoUMcYDnf5Y6iu7HTXxf8JDS23qWa4a+hKCDyOPzw==} 705 | engines: {node: '>=6'} 706 | dependencies: 707 | type-detect: 4.0.8 708 | dev: true 709 | 710 | /diff-sequences@29.6.3: 711 | resolution: {integrity: sha512-EjePK1srD3P08o2j4f0ExnylqRs5B9tJjcp9t1krH2qRi8CCdsYfwe9JgSLurFBWwq4uOlipzfk5fHNvwFKr8Q==} 712 | engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} 713 | dev: true 714 | 715 | /dir-glob@3.0.1: 716 | resolution: {integrity: sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==} 717 | engines: {node: '>=8'} 718 | dependencies: 719 | path-type: 4.0.0 720 | dev: true 721 | 722 | /entities@4.5.0: 723 | resolution: {integrity: sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==} 724 | engines: {node: '>=0.12'} 725 | dev: true 726 | 727 | /esbuild@0.19.6: 728 | resolution: {integrity: sha512-Xl7dntjA2OEIvpr9j0DVxxnog2fyTGnyVoQXAMQI6eR3mf9zCQds7VIKUDCotDgE/p4ncTgeRqgX8t5d6oP4Gw==} 729 | engines: {node: '>=12'} 730 | hasBin: true 731 | requiresBuild: true 732 | optionalDependencies: 733 | '@esbuild/android-arm': 0.19.6 734 | '@esbuild/android-arm64': 0.19.6 735 | '@esbuild/android-x64': 0.19.6 736 | '@esbuild/darwin-arm64': 0.19.6 737 | '@esbuild/darwin-x64': 0.19.6 738 | '@esbuild/freebsd-arm64': 0.19.6 739 | '@esbuild/freebsd-x64': 0.19.6 740 | '@esbuild/linux-arm': 0.19.6 741 | '@esbuild/linux-arm64': 0.19.6 742 | '@esbuild/linux-ia32': 0.19.6 743 | '@esbuild/linux-loong64': 0.19.6 744 | '@esbuild/linux-mips64el': 0.19.6 745 | '@esbuild/linux-ppc64': 0.19.6 746 | '@esbuild/linux-riscv64': 0.19.6 747 | '@esbuild/linux-s390x': 0.19.6 748 | '@esbuild/linux-x64': 0.19.6 749 | '@esbuild/netbsd-x64': 0.19.6 750 | '@esbuild/openbsd-x64': 0.19.6 751 | '@esbuild/sunos-x64': 0.19.6 752 | '@esbuild/win32-arm64': 0.19.6 753 | '@esbuild/win32-ia32': 0.19.6 754 | '@esbuild/win32-x64': 0.19.6 755 | dev: true 756 | 757 | /execa@5.1.1: 758 | resolution: {integrity: sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==} 759 | engines: {node: '>=10'} 760 | dependencies: 761 | cross-spawn: 7.0.3 762 | get-stream: 6.0.1 763 | human-signals: 2.1.0 764 | is-stream: 2.0.1 765 | merge-stream: 2.0.0 766 | npm-run-path: 4.0.1 767 | onetime: 5.1.2 768 | signal-exit: 3.0.7 769 | strip-final-newline: 2.0.0 770 | dev: true 771 | 772 | /fast-glob@3.3.2: 773 | resolution: {integrity: sha512-oX2ruAFQwf/Orj8m737Y5adxDQO0LAB7/S5MnxCdTNDd4p6BsyIVsv9JQsATbTSq8KHRpLwIHbVlUNatxd+1Ow==} 774 | engines: {node: '>=8.6.0'} 775 | dependencies: 776 | '@nodelib/fs.stat': 2.0.5 777 | '@nodelib/fs.walk': 1.2.8 778 | glob-parent: 5.1.2 779 | merge2: 1.4.1 780 | micromatch: 4.0.5 781 | dev: true 782 | 783 | /fastq@1.13.0: 784 | resolution: {integrity: sha512-YpkpUnK8od0o1hmeSc7UUs/eB/vIPWJYjKck2QKIzAf71Vm1AAQ3EbuZB3g2JIy+pg+ERD0vqI79KyZiB2e2Nw==} 785 | dependencies: 786 | reusify: 1.0.4 787 | dev: true 788 | 789 | /fill-range@7.0.1: 790 | resolution: {integrity: sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==} 791 | engines: {node: '>=8'} 792 | dependencies: 793 | to-regex-range: 5.0.1 794 | dev: true 795 | 796 | /fs.realpath@1.0.0: 797 | resolution: {integrity: sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==} 798 | dev: true 799 | 800 | /fsevents@2.3.3: 801 | resolution: {integrity: sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==} 802 | engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0} 803 | os: [darwin] 804 | requiresBuild: true 805 | dev: true 806 | optional: true 807 | 808 | /get-func-name@2.0.2: 809 | resolution: {integrity: sha512-8vXOvuE167CtIc3OyItco7N/dpRtBbYOsPsXCz7X/PMnlGjYjSGuZJgM1Y7mmew7BKf9BqvLX2tnOVy1BBUsxQ==} 810 | dev: true 811 | 812 | /get-stream@6.0.1: 813 | resolution: {integrity: sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==} 814 | engines: {node: '>=10'} 815 | dev: true 816 | 817 | /glob-parent@5.1.2: 818 | resolution: {integrity: sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==} 819 | engines: {node: '>= 6'} 820 | dependencies: 821 | is-glob: 4.0.3 822 | dev: true 823 | 824 | /glob@7.1.6: 825 | resolution: {integrity: sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA==} 826 | dependencies: 827 | fs.realpath: 1.0.0 828 | inflight: 1.0.6 829 | inherits: 2.0.4 830 | minimatch: 3.1.2 831 | once: 1.4.0 832 | path-is-absolute: 1.0.1 833 | dev: true 834 | 835 | /globby@11.1.0: 836 | resolution: {integrity: sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==} 837 | engines: {node: '>=10'} 838 | dependencies: 839 | array-union: 2.1.0 840 | dir-glob: 3.0.1 841 | fast-glob: 3.3.2 842 | ignore: 5.3.0 843 | merge2: 1.4.1 844 | slash: 3.0.0 845 | dev: true 846 | 847 | /globby@14.0.0: 848 | resolution: {integrity: sha512-/1WM/LNHRAOH9lZta77uGbq0dAEQM+XjNesWwhlERDVenqothRbnzTrL3/LrIoEPPjeUHC3vrS6TwoyxeHs7MQ==} 849 | engines: {node: '>=18'} 850 | dependencies: 851 | '@sindresorhus/merge-streams': 1.0.0 852 | fast-glob: 3.3.2 853 | ignore: 5.3.0 854 | path-type: 5.0.0 855 | slash: 5.1.0 856 | unicorn-magic: 0.1.0 857 | dev: true 858 | 859 | /gsap@3.12.3: 860 | resolution: {integrity: sha512-TySXTE+ABiAVa61W+h5wv2p5GkJT1Uj//4nWpK8EjmhcDqwH++35IvtbQlVVFj+rdcJdFCdCt0SKgb+SwdPq/A==} 861 | dev: false 862 | 863 | /happy-dom@12.10.3: 864 | resolution: {integrity: sha512-JzUXOh0wdNGY54oKng5hliuBkq/+aT1V3YpTM+lrN/GoLQTANZsMaIvmHiHe612rauHvPJnDZkZ+5GZR++1Abg==} 865 | dependencies: 866 | css.escape: 1.5.1 867 | entities: 4.5.0 868 | iconv-lite: 0.6.3 869 | webidl-conversions: 7.0.0 870 | whatwg-encoding: 2.0.0 871 | whatwg-mimetype: 3.0.0 872 | dev: true 873 | 874 | /human-signals@2.1.0: 875 | resolution: {integrity: sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==} 876 | engines: {node: '>=10.17.0'} 877 | dev: true 878 | 879 | /iconv-lite@0.6.3: 880 | resolution: {integrity: sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==} 881 | engines: {node: '>=0.10.0'} 882 | dependencies: 883 | safer-buffer: 2.1.2 884 | dev: true 885 | 886 | /ignore@5.3.0: 887 | resolution: {integrity: sha512-g7dmpshy+gD7mh88OC9NwSGTKoc3kyLAZQRU1mt53Aw/vnvfXnbC+F/7F7QoYVKbV+KNvJx8wArewKy1vXMtlg==} 888 | engines: {node: '>= 4'} 889 | dev: true 890 | 891 | /inflight@1.0.6: 892 | resolution: {integrity: sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==} 893 | dependencies: 894 | once: 1.4.0 895 | wrappy: 1.0.2 896 | dev: true 897 | 898 | /inherits@2.0.4: 899 | resolution: {integrity: sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==} 900 | dev: true 901 | 902 | /is-binary-path@2.1.0: 903 | resolution: {integrity: sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==} 904 | engines: {node: '>=8'} 905 | dependencies: 906 | binary-extensions: 2.2.0 907 | dev: true 908 | 909 | /is-extglob@2.1.1: 910 | resolution: {integrity: sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==} 911 | engines: {node: '>=0.10.0'} 912 | dev: true 913 | 914 | /is-glob@4.0.3: 915 | resolution: {integrity: sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==} 916 | engines: {node: '>=0.10.0'} 917 | dependencies: 918 | is-extglob: 2.1.1 919 | dev: true 920 | 921 | /is-number@7.0.0: 922 | resolution: {integrity: sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==} 923 | engines: {node: '>=0.12.0'} 924 | dev: true 925 | 926 | /is-stream@2.0.1: 927 | resolution: {integrity: sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==} 928 | engines: {node: '>=8'} 929 | dev: true 930 | 931 | /isexe@2.0.0: 932 | resolution: {integrity: sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==} 933 | dev: true 934 | 935 | /joycon@3.1.1: 936 | resolution: {integrity: sha512-34wB/Y7MW7bzjKRjUKTa46I2Z7eV62Rkhva+KkopW7Qvv/OSWBqvkSY7vusOPrNuZcUG3tApvdVgNB8POj3SPw==} 937 | engines: {node: '>=10'} 938 | dev: true 939 | 940 | /jsonc-parser@3.2.0: 941 | resolution: {integrity: sha512-gfFQZrcTc8CnKXp6Y4/CBT3fTc0OVuDofpre4aEeEpSBPV5X5v4+Vmx+8snU7RLPrNHPKSgLxGo9YuQzz20o+w==} 942 | dev: true 943 | 944 | /lilconfig@2.1.0: 945 | resolution: {integrity: sha512-utWOt/GHzuUxnLKxB6dk81RoOeoNeHgbrXiuGk4yyF5qlRz+iIVWu56E2fqGHFrXz0QNUhLB/8nKqvRH66JKGQ==} 946 | engines: {node: '>=10'} 947 | dev: true 948 | 949 | /lines-and-columns@1.2.4: 950 | resolution: {integrity: sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==} 951 | dev: true 952 | 953 | /load-tsconfig@0.2.5: 954 | resolution: {integrity: sha512-IXO6OCs9yg8tMKzfPZ1YmheJbZCiEsnBdcB03l0OcfK9prKnJb96siuHCr5Fl37/yo9DnKU+TLpxzTUspw9shg==} 955 | engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} 956 | dev: true 957 | 958 | /local-pkg@0.4.3: 959 | resolution: {integrity: sha512-SFppqq5p42fe2qcZQqqEOiVRXl+WCP1MdT6k7BDEW1j++sp5fIY+/fdRQitvKgB5BrBcmrs5m/L0v2FrU5MY1g==} 960 | engines: {node: '>=14'} 961 | dev: true 962 | 963 | /lodash.sortby@4.7.0: 964 | resolution: {integrity: sha512-HDWXG8isMntAyRF5vZ7xKuEvOhT4AhlRt/3czTSjvGUxjYCBVRQY48ViDHyfYz9VIoBkW4TMGQNapx+l3RUwdA==} 965 | dev: true 966 | 967 | /loupe@2.3.6: 968 | resolution: {integrity: sha512-RaPMZKiMy8/JruncMU5Bt6na1eftNoo++R4Y+N2FrxkDVTrGvcyzFTsaGif4QTeKESheMGegbhw6iUAq+5A8zA==} 969 | dependencies: 970 | get-func-name: 2.0.2 971 | dev: true 972 | 973 | /magic-string@0.30.4: 974 | resolution: {integrity: sha512-Q/TKtsC5BPm0kGqgBIF9oXAs/xEf2vRKiIB4wCRQTJOQIByZ1d+NnUOotvJOvNpi5RNIgVOMC3pOuaP1ZTDlVg==} 975 | engines: {node: '>=12'} 976 | dependencies: 977 | '@jridgewell/sourcemap-codec': 1.4.15 978 | dev: true 979 | 980 | /merge-stream@2.0.0: 981 | resolution: {integrity: sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==} 982 | dev: true 983 | 984 | /merge2@1.4.1: 985 | resolution: {integrity: sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==} 986 | engines: {node: '>= 8'} 987 | dev: true 988 | 989 | /micromatch@4.0.5: 990 | resolution: {integrity: sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==} 991 | engines: {node: '>=8.6'} 992 | dependencies: 993 | braces: 3.0.2 994 | picomatch: 2.3.1 995 | dev: true 996 | 997 | /mimic-fn@2.1.0: 998 | resolution: {integrity: sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==} 999 | engines: {node: '>=6'} 1000 | dev: true 1001 | 1002 | /minimatch@3.1.2: 1003 | resolution: {integrity: sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==} 1004 | dependencies: 1005 | brace-expansion: 1.1.11 1006 | dev: true 1007 | 1008 | /mlly@1.4.2: 1009 | resolution: {integrity: sha512-i/Ykufi2t1EZ6NaPLdfnZk2AX8cs0d+mTzVKuPfqPKPatxLApaBoxJQ9x1/uckXtrS/U5oisPMDkNs0yQTaBRg==} 1010 | dependencies: 1011 | acorn: 8.10.0 1012 | pathe: 1.1.1 1013 | pkg-types: 1.0.3 1014 | ufo: 1.3.1 1015 | dev: true 1016 | 1017 | /ms@2.1.2: 1018 | resolution: {integrity: sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==} 1019 | dev: true 1020 | 1021 | /mz@2.7.0: 1022 | resolution: {integrity: sha512-z81GNO7nnYMEhrGh9LeymoE4+Yr0Wn5McHIZMK5cfQCl+NDX08sCZgUc9/6MHni9IWuFLm1Z3HTCXu2z9fN62Q==} 1023 | dependencies: 1024 | any-promise: 1.3.0 1025 | object-assign: 4.1.1 1026 | thenify-all: 1.6.0 1027 | dev: true 1028 | 1029 | /nanoid@3.3.6: 1030 | resolution: {integrity: sha512-BGcqMMJuToF7i1rt+2PWSNVnWIkGCU78jBG3RxO/bZlnZPK2Cmi2QaffxGO/2RvWi9sL+FAiRiXMgsyxQ1DIDA==} 1031 | engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1} 1032 | hasBin: true 1033 | dev: true 1034 | 1035 | /nanoid@5.0.4: 1036 | resolution: {integrity: sha512-vAjmBf13gsmhXSgBrtIclinISzFFy22WwCYoyilZlsrRXNIHSwgFQ1bEdjRwMT3aoadeIF6HMuDRlOxzfXV8ig==} 1037 | engines: {node: ^18 || >=20} 1038 | hasBin: true 1039 | dev: true 1040 | 1041 | /nanospinner@1.1.0: 1042 | resolution: {integrity: sha512-yFvNYMig4AthKYfHFl1sLj7B2nkHL4lzdig4osvl9/LdGbXwrdFRoqBS98gsEsOakr0yH+r5NZ/1Y9gdVB8trA==} 1043 | dependencies: 1044 | picocolors: 1.0.0 1045 | dev: true 1046 | 1047 | /normalize-path@3.0.0: 1048 | resolution: {integrity: sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==} 1049 | engines: {node: '>=0.10.0'} 1050 | dev: true 1051 | 1052 | /npm-run-path@4.0.1: 1053 | resolution: {integrity: sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==} 1054 | engines: {node: '>=8'} 1055 | dependencies: 1056 | path-key: 3.1.1 1057 | dev: true 1058 | 1059 | /object-assign@4.1.1: 1060 | resolution: {integrity: sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==} 1061 | engines: {node: '>=0.10.0'} 1062 | dev: true 1063 | 1064 | /once@1.4.0: 1065 | resolution: {integrity: sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==} 1066 | dependencies: 1067 | wrappy: 1.0.2 1068 | dev: true 1069 | 1070 | /onetime@5.1.2: 1071 | resolution: {integrity: sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==} 1072 | engines: {node: '>=6'} 1073 | dependencies: 1074 | mimic-fn: 2.1.0 1075 | dev: true 1076 | 1077 | /p-limit@4.0.0: 1078 | resolution: {integrity: sha512-5b0R4txpzjPWVw/cXXUResoD4hb6U/x9BH08L7nw+GN1sezDzPdxeRvpc9c433fZhBan/wusjbCsqwqm4EIBIQ==} 1079 | engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} 1080 | dependencies: 1081 | yocto-queue: 1.0.0 1082 | dev: true 1083 | 1084 | /path-is-absolute@1.0.1: 1085 | resolution: {integrity: sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==} 1086 | engines: {node: '>=0.10.0'} 1087 | dev: true 1088 | 1089 | /path-key@3.1.1: 1090 | resolution: {integrity: sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==} 1091 | engines: {node: '>=8'} 1092 | dev: true 1093 | 1094 | /path-type@4.0.0: 1095 | resolution: {integrity: sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==} 1096 | engines: {node: '>=8'} 1097 | dev: true 1098 | 1099 | /path-type@5.0.0: 1100 | resolution: {integrity: sha512-5HviZNaZcfqP95rwpv+1HDgUamezbqdSYTyzjTvwtJSnIH+3vnbmWsItli8OFEndS984VT55M3jduxZbX351gg==} 1101 | engines: {node: '>=12'} 1102 | dev: true 1103 | 1104 | /pathe@1.1.1: 1105 | resolution: {integrity: sha512-d+RQGp0MAYTIaDBIMmOfMwz3E+LOZnxx1HZd5R18mmCZY0QBlK0LDZfPc8FW8Ed2DlvsuE6PRjroDY+wg4+j/Q==} 1106 | dev: true 1107 | 1108 | /pathval@1.1.1: 1109 | resolution: {integrity: sha512-Dp6zGqpTdETdR63lehJYPeIOqpiNBNtc7BpWSLrOje7UaIsE5aY92r/AunQA7rsXvet3lrJ3JnZX29UPTKXyKQ==} 1110 | dev: true 1111 | 1112 | /picocolors@1.0.0: 1113 | resolution: {integrity: sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==} 1114 | dev: true 1115 | 1116 | /picomatch@2.3.1: 1117 | resolution: {integrity: sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==} 1118 | engines: {node: '>=8.6'} 1119 | dev: true 1120 | 1121 | /pirates@4.0.6: 1122 | resolution: {integrity: sha512-saLsH7WeYYPiD25LDuLRRY/i+6HaPYr6G1OUlN39otzkSTxKnubR9RTxS3/Kk50s1g2JTgFwWQDQyplC5/SHZg==} 1123 | engines: {node: '>= 6'} 1124 | dev: true 1125 | 1126 | /pkg-types@1.0.3: 1127 | resolution: {integrity: sha512-nN7pYi0AQqJnoLPC9eHFQ8AcyaixBUOwvqc5TDnIKCMEE6I0y8P7OKA7fPexsXGCGxQDl/cmrLAp26LhcwxZ4A==} 1128 | dependencies: 1129 | jsonc-parser: 3.2.0 1130 | mlly: 1.4.2 1131 | pathe: 1.1.1 1132 | dev: true 1133 | 1134 | /postcss-load-config@4.0.1: 1135 | resolution: {integrity: sha512-vEJIc8RdiBRu3oRAI0ymerOn+7rPuMvRXslTvZUKZonDHFIczxztIyJ1urxM1x9JXEikvpWWTUUqal5j/8QgvA==} 1136 | engines: {node: '>= 14'} 1137 | peerDependencies: 1138 | postcss: '>=8.0.9' 1139 | ts-node: '>=9.0.0' 1140 | peerDependenciesMeta: 1141 | postcss: 1142 | optional: true 1143 | ts-node: 1144 | optional: true 1145 | dependencies: 1146 | lilconfig: 2.1.0 1147 | yaml: 2.3.2 1148 | dev: true 1149 | 1150 | /postcss@8.4.31: 1151 | resolution: {integrity: sha512-PS08Iboia9mts/2ygV3eLpY5ghnUcfLV/EXTOW1E2qYxJKGGBUtNjN76FYHnMs36RmARn41bC0AZmn+rR0OVpQ==} 1152 | engines: {node: ^10 || ^12 || >=14} 1153 | dependencies: 1154 | nanoid: 3.3.6 1155 | picocolors: 1.0.0 1156 | source-map-js: 1.0.2 1157 | dev: true 1158 | 1159 | /prettier@3.1.0: 1160 | resolution: {integrity: sha512-TQLvXjq5IAibjh8EpBIkNKxO749UEWABoiIZehEPiY4GNpVdhaFKqSTu+QrlU6D2dPAfubRmtJTi4K4YkQ5eXw==} 1161 | engines: {node: '>=14'} 1162 | hasBin: true 1163 | dev: true 1164 | 1165 | /pretty-format@29.7.0: 1166 | resolution: {integrity: sha512-Pdlw/oPxN+aXdmM9R00JVC9WVFoCLTKJvDVLgmJ+qAffBMxsV85l/Lu7sNx4zSzPyoL2euImuEwHhOXdEgNFZQ==} 1167 | engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} 1168 | dependencies: 1169 | '@jest/schemas': 29.6.3 1170 | ansi-styles: 5.2.0 1171 | react-is: 18.2.0 1172 | dev: true 1173 | 1174 | /punycode@2.3.0: 1175 | resolution: {integrity: sha512-rRV+zQD8tVFys26lAGR9WUuS4iUAngJScM+ZRSKtvl5tKeZ2t5bvdNFdNHBW9FWR4guGHlgmsZ1G7BSm2wTbuA==} 1176 | engines: {node: '>=6'} 1177 | dev: true 1178 | 1179 | /queue-microtask@1.2.3: 1180 | resolution: {integrity: sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==} 1181 | dev: true 1182 | 1183 | /react-is@18.2.0: 1184 | resolution: {integrity: sha512-xWGDIW6x921xtzPkhiULtthJHoJvBbF3q26fzloPCK0hsvxtPVelvftw3zjbHWSkR2km9Z+4uxbDDK/6Zw9B8w==} 1185 | dev: true 1186 | 1187 | /readdirp@3.6.0: 1188 | resolution: {integrity: sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==} 1189 | engines: {node: '>=8.10.0'} 1190 | dependencies: 1191 | picomatch: 2.3.1 1192 | dev: true 1193 | 1194 | /resolve-from@5.0.0: 1195 | resolution: {integrity: sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==} 1196 | engines: {node: '>=8'} 1197 | dev: true 1198 | 1199 | /reusify@1.0.4: 1200 | resolution: {integrity: sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==} 1201 | engines: {iojs: '>=1.0.0', node: '>=0.10.0'} 1202 | dev: true 1203 | 1204 | /rollup@4.5.0: 1205 | resolution: {integrity: sha512-41xsWhzxqjMDASCxH5ibw1mXk+3c4TNI2UjKbLxe6iEzrSQnqOzmmK8/3mufCPbzHNJ2e04Fc1ddI35hHy+8zg==} 1206 | engines: {node: '>=18.0.0', npm: '>=8.0.0'} 1207 | hasBin: true 1208 | optionalDependencies: 1209 | '@rollup/rollup-android-arm-eabi': 4.5.0 1210 | '@rollup/rollup-android-arm64': 4.5.0 1211 | '@rollup/rollup-darwin-arm64': 4.5.0 1212 | '@rollup/rollup-darwin-x64': 4.5.0 1213 | '@rollup/rollup-linux-arm-gnueabihf': 4.5.0 1214 | '@rollup/rollup-linux-arm64-gnu': 4.5.0 1215 | '@rollup/rollup-linux-arm64-musl': 4.5.0 1216 | '@rollup/rollup-linux-x64-gnu': 4.5.0 1217 | '@rollup/rollup-linux-x64-musl': 4.5.0 1218 | '@rollup/rollup-win32-arm64-msvc': 4.5.0 1219 | '@rollup/rollup-win32-ia32-msvc': 4.5.0 1220 | '@rollup/rollup-win32-x64-msvc': 4.5.0 1221 | fsevents: 2.3.3 1222 | dev: true 1223 | 1224 | /run-parallel@1.2.0: 1225 | resolution: {integrity: sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==} 1226 | dependencies: 1227 | queue-microtask: 1.2.3 1228 | dev: true 1229 | 1230 | /safer-buffer@2.1.2: 1231 | resolution: {integrity: sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==} 1232 | dev: true 1233 | 1234 | /shebang-command@2.0.0: 1235 | resolution: {integrity: sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==} 1236 | engines: {node: '>=8'} 1237 | dependencies: 1238 | shebang-regex: 3.0.0 1239 | dev: true 1240 | 1241 | /shebang-regex@3.0.0: 1242 | resolution: {integrity: sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==} 1243 | engines: {node: '>=8'} 1244 | dev: true 1245 | 1246 | /siginfo@2.0.0: 1247 | resolution: {integrity: sha512-ybx0WO1/8bSBLEWXZvEd7gMW3Sn3JFlW3TvX1nREbDLRNQNaeNN8WK0meBwPdAaOI7TtRRRJn/Es1zhrrCHu7g==} 1248 | dev: true 1249 | 1250 | /signal-exit@3.0.7: 1251 | resolution: {integrity: sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==} 1252 | dev: true 1253 | 1254 | /size-limit@11.0.0: 1255 | resolution: {integrity: sha512-6+i4rE1GRzx/vRpuitRYQiZJNTXJjde+4P2NPg8AK7pURrE1+hA3mGstzvT8vQ8DuYFnvp9fh4CHM7Heq3EKXA==} 1256 | engines: {node: ^18.0.0 || >=20.0.0} 1257 | hasBin: true 1258 | dependencies: 1259 | bytes-iec: 3.1.1 1260 | chokidar: 3.5.3 1261 | globby: 14.0.0 1262 | lilconfig: 2.1.0 1263 | nanospinner: 1.1.0 1264 | picocolors: 1.0.0 1265 | dev: true 1266 | 1267 | /slash@3.0.0: 1268 | resolution: {integrity: sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==} 1269 | engines: {node: '>=8'} 1270 | dev: true 1271 | 1272 | /slash@5.1.0: 1273 | resolution: {integrity: sha512-ZA6oR3T/pEyuqwMgAKT0/hAv8oAXckzbkmR0UkUosQ+Mc4RxGoJkRmwHgHufaenlyAgE1Mxgpdcrf75y6XcnDg==} 1274 | engines: {node: '>=14.16'} 1275 | dev: true 1276 | 1277 | /source-map-js@1.0.2: 1278 | resolution: {integrity: sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw==} 1279 | engines: {node: '>=0.10.0'} 1280 | dev: true 1281 | 1282 | /source-map-support@0.5.21: 1283 | resolution: {integrity: sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==} 1284 | dependencies: 1285 | buffer-from: 1.1.2 1286 | source-map: 0.6.1 1287 | dev: true 1288 | 1289 | /source-map@0.6.1: 1290 | resolution: {integrity: sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==} 1291 | engines: {node: '>=0.10.0'} 1292 | dev: true 1293 | 1294 | /source-map@0.8.0-beta.0: 1295 | resolution: {integrity: sha512-2ymg6oRBpebeZi9UUNsgQ89bhx01TcTkmNTGnNO88imTmbSgy4nfujrgVEFKWpMTEGA11EDkTt7mqObTPdigIA==} 1296 | engines: {node: '>= 8'} 1297 | dependencies: 1298 | whatwg-url: 7.1.0 1299 | dev: true 1300 | 1301 | /stackback@0.0.2: 1302 | resolution: {integrity: sha512-1XMJE5fQo1jGH6Y/7ebnwPOBEkIEnT4QF32d5R1+VXdXveM0IBMJt8zfaxX1P3QhVwrYe+576+jkANtSS2mBbw==} 1303 | dev: true 1304 | 1305 | /std-env@3.4.3: 1306 | resolution: {integrity: sha512-f9aPhy8fYBuMN+sNfakZV18U39PbalgjXG3lLB9WkaYTxijru61wb57V9wxxNthXM5Sd88ETBWi29qLAsHO52Q==} 1307 | dev: true 1308 | 1309 | /strip-final-newline@2.0.0: 1310 | resolution: {integrity: sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==} 1311 | engines: {node: '>=6'} 1312 | dev: true 1313 | 1314 | /strip-literal@1.3.0: 1315 | resolution: {integrity: sha512-PugKzOsyXpArk0yWmUwqOZecSO0GH0bPoctLcqNDH9J04pVW3lflYE0ujElBGTloevcxF5MofAOZ7C5l2b+wLg==} 1316 | dependencies: 1317 | acorn: 8.10.0 1318 | dev: true 1319 | 1320 | /sucrase@3.34.0: 1321 | resolution: {integrity: sha512-70/LQEZ07TEcxiU2dz51FKaE6hCTWC6vr7FOk3Gr0U60C3shtAN+H+BFr9XlYe5xqf3RA8nrc+VIwzCfnxuXJw==} 1322 | engines: {node: '>=8'} 1323 | hasBin: true 1324 | dependencies: 1325 | '@jridgewell/gen-mapping': 0.3.3 1326 | commander: 4.1.1 1327 | glob: 7.1.6 1328 | lines-and-columns: 1.2.4 1329 | mz: 2.7.0 1330 | pirates: 4.0.6 1331 | ts-interface-checker: 0.1.13 1332 | dev: true 1333 | 1334 | /terser@5.24.0: 1335 | resolution: {integrity: sha512-ZpGR4Hy3+wBEzVEnHvstMvqpD/nABNelQn/z2r0fjVWGQsN3bpOLzQlqDxmb4CDZnXq5lpjnQ+mHQLAOpfM5iw==} 1336 | engines: {node: '>=10'} 1337 | hasBin: true 1338 | dependencies: 1339 | '@jridgewell/source-map': 0.3.5 1340 | acorn: 8.10.0 1341 | commander: 2.20.3 1342 | source-map-support: 0.5.21 1343 | dev: true 1344 | 1345 | /thenify-all@1.6.0: 1346 | resolution: {integrity: sha512-RNxQH/qI8/t3thXJDwcstUO4zeqo64+Uy/+sNVRBx4Xn2OX+OZ9oP+iJnNFqplFra2ZUVeKCSa2oVWi3T4uVmA==} 1347 | engines: {node: '>=0.8'} 1348 | dependencies: 1349 | thenify: 3.3.1 1350 | dev: true 1351 | 1352 | /thenify@3.3.1: 1353 | resolution: {integrity: sha512-RVZSIV5IG10Hk3enotrhvz0T9em6cyHBLkH/YAZuKqd8hRkKhSfCGIcP2KUY0EPxndzANBmNllzWPwak+bheSw==} 1354 | dependencies: 1355 | any-promise: 1.3.0 1356 | dev: true 1357 | 1358 | /tinybench@2.5.1: 1359 | resolution: {integrity: sha512-65NKvSuAVDP/n4CqH+a9w2kTlLReS9vhsAP06MWx+/89nMinJyB2icyl58RIcqCmIggpojIGeuJGhjU1aGMBSg==} 1360 | dev: true 1361 | 1362 | /tinypool@0.7.0: 1363 | resolution: {integrity: sha512-zSYNUlYSMhJ6Zdou4cJwo/p7w5nmAH17GRfU/ui3ctvjXFErXXkruT4MWW6poDeXgCaIBlGLrfU6TbTXxyGMww==} 1364 | engines: {node: '>=14.0.0'} 1365 | dev: true 1366 | 1367 | /tinyspy@2.2.0: 1368 | resolution: {integrity: sha512-d2eda04AN/cPOR89F7Xv5bK/jrQEhmcLFe6HFldoeO9AJtps+fqEnh486vnT/8y4bw38pSyxDcTCAq+Ks2aJTg==} 1369 | engines: {node: '>=14.0.0'} 1370 | dev: true 1371 | 1372 | /to-regex-range@5.0.1: 1373 | resolution: {integrity: sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==} 1374 | engines: {node: '>=8.0'} 1375 | dependencies: 1376 | is-number: 7.0.0 1377 | dev: true 1378 | 1379 | /tr46@1.0.1: 1380 | resolution: {integrity: sha512-dTpowEjclQ7Kgx5SdBkqRzVhERQXov8/l9Ft9dVM9fmg0W0KQSVaXX9T4i6twCPNtYiZM53lpSSUAwJbFPOHxA==} 1381 | dependencies: 1382 | punycode: 2.3.0 1383 | dev: true 1384 | 1385 | /tree-kill@1.2.2: 1386 | resolution: {integrity: sha512-L0Orpi8qGpRG//Nd+H90vFB+3iHnue1zSSGmNOOCh1GLJ7rUKVwV2HvijphGQS2UmhUZewS9VgvxYIdgr+fG1A==} 1387 | hasBin: true 1388 | dev: true 1389 | 1390 | /ts-interface-checker@0.1.13: 1391 | resolution: {integrity: sha512-Y/arvbn+rrz3JCKl9C4kVNfTfSm2/mEp5FSz5EsZSANGPSlQrpRI5M4PKF+mJnE52jOO90PnPSc3Ur3bTQw0gA==} 1392 | dev: true 1393 | 1394 | /tsup@8.0.1(typescript@5.3.2): 1395 | resolution: {integrity: sha512-hvW7gUSG96j53ZTSlT4j/KL0q1Q2l6TqGBFc6/mu/L46IoNWqLLUzLRLP1R8Q7xrJTmkDxxDoojV5uCVs1sVOg==} 1396 | engines: {node: '>=18'} 1397 | hasBin: true 1398 | peerDependencies: 1399 | '@microsoft/api-extractor': ^7.36.0 1400 | '@swc/core': ^1 1401 | postcss: ^8.4.12 1402 | typescript: '>=4.5.0' 1403 | peerDependenciesMeta: 1404 | '@microsoft/api-extractor': 1405 | optional: true 1406 | '@swc/core': 1407 | optional: true 1408 | postcss: 1409 | optional: true 1410 | typescript: 1411 | optional: true 1412 | dependencies: 1413 | bundle-require: 4.0.2(esbuild@0.19.6) 1414 | cac: 6.7.14 1415 | chokidar: 3.5.3 1416 | debug: 4.3.4 1417 | esbuild: 0.19.6 1418 | execa: 5.1.1 1419 | globby: 11.1.0 1420 | joycon: 3.1.1 1421 | postcss-load-config: 4.0.1 1422 | resolve-from: 5.0.0 1423 | rollup: 4.5.0 1424 | source-map: 0.8.0-beta.0 1425 | sucrase: 3.34.0 1426 | tree-kill: 1.2.2 1427 | typescript: 5.3.2 1428 | transitivePeerDependencies: 1429 | - supports-color 1430 | - ts-node 1431 | dev: true 1432 | 1433 | /turbo-darwin-64@1.10.16: 1434 | resolution: {integrity: sha512-+Jk91FNcp9e9NCLYlvDDlp2HwEDp14F9N42IoW3dmHI5ZkGSXzalbhVcrx3DOox3QfiNUHxzWg4d7CnVNCuuMg==} 1435 | cpu: [x64] 1436 | os: [darwin] 1437 | requiresBuild: true 1438 | dev: true 1439 | optional: true 1440 | 1441 | /turbo-darwin-arm64@1.10.16: 1442 | resolution: {integrity: sha512-jqGpFZipIivkRp/i+jnL8npX0VssE6IAVNKtu573LXtssZdV/S+fRGYA16tI46xJGxSAivrZ/IcgZrV6Jk80bw==} 1443 | cpu: [arm64] 1444 | os: [darwin] 1445 | requiresBuild: true 1446 | dev: true 1447 | optional: true 1448 | 1449 | /turbo-linux-64@1.10.16: 1450 | resolution: {integrity: sha512-PpqEZHwLoizQ6sTUvmImcRmACyRk9EWLXGlqceogPZsJ1jTRK3sfcF9fC2W56zkSIzuLEP07k5kl+ZxJd8JMcg==} 1451 | cpu: [x64] 1452 | os: [linux] 1453 | requiresBuild: true 1454 | dev: true 1455 | optional: true 1456 | 1457 | /turbo-linux-arm64@1.10.16: 1458 | resolution: {integrity: sha512-TMjFYz8to1QE0fKVXCIvG/4giyfnmqcQIwjdNfJvKjBxn22PpbjeuFuQ5kNXshUTRaTJihFbuuCcb5OYFNx4uw==} 1459 | cpu: [arm64] 1460 | os: [linux] 1461 | requiresBuild: true 1462 | dev: true 1463 | optional: true 1464 | 1465 | /turbo-windows-64@1.10.16: 1466 | resolution: {integrity: sha512-+jsf68krs0N66FfC4/zZvioUap/Tq3sPFumnMV+EBo8jFdqs4yehd6+MxIwYTjSQLIcpH8KoNMB0gQYhJRLZzw==} 1467 | cpu: [x64] 1468 | os: [win32] 1469 | requiresBuild: true 1470 | dev: true 1471 | optional: true 1472 | 1473 | /turbo-windows-arm64@1.10.16: 1474 | resolution: {integrity: sha512-sKm3hcMM1bl0B3PLG4ifidicOGfoJmOEacM5JtgBkYM48ncMHjkHfFY7HrJHZHUnXM4l05RQTpLFoOl/uIo2HQ==} 1475 | cpu: [arm64] 1476 | os: [win32] 1477 | requiresBuild: true 1478 | dev: true 1479 | optional: true 1480 | 1481 | /turbo@1.10.16: 1482 | resolution: {integrity: sha512-2CEaK4FIuSZiP83iFa9GqMTQhroW2QryckVqUydmg4tx78baftTOS0O+oDAhvo9r9Nit4xUEtC1RAHoqs6ZEtg==} 1483 | hasBin: true 1484 | optionalDependencies: 1485 | turbo-darwin-64: 1.10.16 1486 | turbo-darwin-arm64: 1.10.16 1487 | turbo-linux-64: 1.10.16 1488 | turbo-linux-arm64: 1.10.16 1489 | turbo-windows-64: 1.10.16 1490 | turbo-windows-arm64: 1.10.16 1491 | dev: true 1492 | 1493 | /type-detect@4.0.8: 1494 | resolution: {integrity: sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g==} 1495 | engines: {node: '>=4'} 1496 | dev: true 1497 | 1498 | /typescript@5.3.2: 1499 | resolution: {integrity: sha512-6l+RyNy7oAHDfxC4FzSJcz9vnjTKxrLpDG5M2Vu4SHRVNg6xzqZp6LYSR9zjqQTu8DU/f5xwxUdADOkbrIX2gQ==} 1500 | engines: {node: '>=14.17'} 1501 | hasBin: true 1502 | dev: true 1503 | 1504 | /ufo@1.3.1: 1505 | resolution: {integrity: sha512-uY/99gMLIOlJPwATcMVYfqDSxUR9//AUcgZMzwfSTJPDKzA1S8mX4VLqa+fiAtveraQUBCz4FFcwVZBGbwBXIw==} 1506 | dev: true 1507 | 1508 | /undici-types@5.26.5: 1509 | resolution: {integrity: sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA==} 1510 | dev: true 1511 | 1512 | /unicorn-magic@0.1.0: 1513 | resolution: {integrity: sha512-lRfVq8fE8gz6QMBuDM6a+LO3IAzTi05H6gCVaUpir2E1Rwpo4ZUog45KpNXKC/Mn3Yb9UDuHumeFTo9iV/D9FQ==} 1514 | engines: {node: '>=18'} 1515 | dev: true 1516 | 1517 | /vite-node@0.34.6(@types/node@20.10.3)(terser@5.24.0): 1518 | resolution: {integrity: sha512-nlBMJ9x6n7/Amaz6F3zJ97EBwR2FkzhBRxF5e+jE6LA3yi6Wtc2lyTij1OnDMIr34v5g/tVQtsVAzhT0jc5ygA==} 1519 | engines: {node: '>=v14.18.0'} 1520 | hasBin: true 1521 | dependencies: 1522 | cac: 6.7.14 1523 | debug: 4.3.4 1524 | mlly: 1.4.2 1525 | pathe: 1.1.1 1526 | picocolors: 1.0.0 1527 | vite: 5.0.4(@types/node@20.10.3)(terser@5.24.0) 1528 | transitivePeerDependencies: 1529 | - '@types/node' 1530 | - less 1531 | - lightningcss 1532 | - sass 1533 | - stylus 1534 | - sugarss 1535 | - supports-color 1536 | - terser 1537 | dev: true 1538 | 1539 | /vite@5.0.4(@types/node@20.10.3)(terser@5.24.0): 1540 | resolution: {integrity: sha512-RzAr8LSvM8lmhB4tQ5OPcBhpjOZRZjuxv9zO5UcxeoY2bd3kP3Ticd40Qma9/BqZ8JS96Ll/jeBX9u+LJZrhVg==} 1541 | engines: {node: ^18.0.0 || >=20.0.0} 1542 | hasBin: true 1543 | peerDependencies: 1544 | '@types/node': ^18.0.0 || >=20.0.0 1545 | less: '*' 1546 | lightningcss: ^1.21.0 1547 | sass: '*' 1548 | stylus: '*' 1549 | sugarss: '*' 1550 | terser: ^5.4.0 1551 | peerDependenciesMeta: 1552 | '@types/node': 1553 | optional: true 1554 | less: 1555 | optional: true 1556 | lightningcss: 1557 | optional: true 1558 | sass: 1559 | optional: true 1560 | stylus: 1561 | optional: true 1562 | sugarss: 1563 | optional: true 1564 | terser: 1565 | optional: true 1566 | dependencies: 1567 | '@types/node': 20.10.3 1568 | esbuild: 0.19.6 1569 | postcss: 8.4.31 1570 | rollup: 4.5.0 1571 | terser: 5.24.0 1572 | optionalDependencies: 1573 | fsevents: 2.3.3 1574 | dev: true 1575 | 1576 | /vitest@0.34.6(happy-dom@12.10.3)(terser@5.24.0): 1577 | resolution: {integrity: sha512-+5CALsOvbNKnS+ZHMXtuUC7nL8/7F1F2DnHGjSsszX8zCjWSSviphCb/NuS9Nzf4Q03KyyDRBAXhF/8lffME4Q==} 1578 | engines: {node: '>=v14.18.0'} 1579 | hasBin: true 1580 | peerDependencies: 1581 | '@edge-runtime/vm': '*' 1582 | '@vitest/browser': '*' 1583 | '@vitest/ui': '*' 1584 | happy-dom: '*' 1585 | jsdom: '*' 1586 | playwright: '*' 1587 | safaridriver: '*' 1588 | webdriverio: '*' 1589 | peerDependenciesMeta: 1590 | '@edge-runtime/vm': 1591 | optional: true 1592 | '@vitest/browser': 1593 | optional: true 1594 | '@vitest/ui': 1595 | optional: true 1596 | happy-dom: 1597 | optional: true 1598 | jsdom: 1599 | optional: true 1600 | playwright: 1601 | optional: true 1602 | safaridriver: 1603 | optional: true 1604 | webdriverio: 1605 | optional: true 1606 | dependencies: 1607 | '@types/chai': 4.3.6 1608 | '@types/chai-subset': 1.3.3 1609 | '@types/node': 20.10.3 1610 | '@vitest/expect': 0.34.6 1611 | '@vitest/runner': 0.34.6 1612 | '@vitest/snapshot': 0.34.6 1613 | '@vitest/spy': 0.34.6 1614 | '@vitest/utils': 0.34.6 1615 | acorn: 8.10.0 1616 | acorn-walk: 8.2.0 1617 | cac: 6.7.14 1618 | chai: 4.3.10 1619 | debug: 4.3.4 1620 | happy-dom: 12.10.3 1621 | local-pkg: 0.4.3 1622 | magic-string: 0.30.4 1623 | pathe: 1.1.1 1624 | picocolors: 1.0.0 1625 | std-env: 3.4.3 1626 | strip-literal: 1.3.0 1627 | tinybench: 2.5.1 1628 | tinypool: 0.7.0 1629 | vite: 5.0.4(@types/node@20.10.3)(terser@5.24.0) 1630 | vite-node: 0.34.6(@types/node@20.10.3)(terser@5.24.0) 1631 | why-is-node-running: 2.2.2 1632 | transitivePeerDependencies: 1633 | - less 1634 | - lightningcss 1635 | - sass 1636 | - stylus 1637 | - sugarss 1638 | - supports-color 1639 | - terser 1640 | dev: true 1641 | 1642 | /webidl-conversions@4.0.2: 1643 | resolution: {integrity: sha512-YQ+BmxuTgd6UXZW3+ICGfyqRyHXVlD5GtQr5+qjiNW7bF0cqrzX500HVXPBOvgXb5YnzDd+h0zqyv61KUD7+Sg==} 1644 | dev: true 1645 | 1646 | /webidl-conversions@7.0.0: 1647 | resolution: {integrity: sha512-VwddBukDzu71offAQR975unBIGqfKZpM+8ZX6ySk8nYhVoo5CYaZyzt3YBvYtRtO+aoGlqxPg/B87NGVZ/fu6g==} 1648 | engines: {node: '>=12'} 1649 | dev: true 1650 | 1651 | /whatwg-encoding@2.0.0: 1652 | resolution: {integrity: sha512-p41ogyeMUrw3jWclHWTQg1k05DSVXPLcVxRTYsXUk+ZooOCZLcoYgPZ/HL/D/N+uQPOtcp1me1WhBEaX02mhWg==} 1653 | engines: {node: '>=12'} 1654 | dependencies: 1655 | iconv-lite: 0.6.3 1656 | dev: true 1657 | 1658 | /whatwg-mimetype@3.0.0: 1659 | resolution: {integrity: sha512-nt+N2dzIutVRxARx1nghPKGv1xHikU7HKdfafKkLNLindmPU/ch3U31NOCGGA/dmPcmb1VlofO0vnKAcsm0o/Q==} 1660 | engines: {node: '>=12'} 1661 | dev: true 1662 | 1663 | /whatwg-url@7.1.0: 1664 | resolution: {integrity: sha512-WUu7Rg1DroM7oQvGWfOiAK21n74Gg+T4elXEQYkOhtyLeWiJFoOGLXPKI/9gzIie9CtwVLm8wtw6YJdKyxSjeg==} 1665 | dependencies: 1666 | lodash.sortby: 4.7.0 1667 | tr46: 1.0.1 1668 | webidl-conversions: 4.0.2 1669 | dev: true 1670 | 1671 | /which@2.0.2: 1672 | resolution: {integrity: sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==} 1673 | engines: {node: '>= 8'} 1674 | hasBin: true 1675 | dependencies: 1676 | isexe: 2.0.0 1677 | dev: true 1678 | 1679 | /why-is-node-running@2.2.2: 1680 | resolution: {integrity: sha512-6tSwToZxTOcotxHeA+qGCq1mVzKR3CwcJGmVcY+QE8SHy6TnpFnh8PAvPNHYr7EcuVeG0QSMxtYCuO1ta/G/oA==} 1681 | engines: {node: '>=8'} 1682 | hasBin: true 1683 | dependencies: 1684 | siginfo: 2.0.0 1685 | stackback: 0.0.2 1686 | dev: true 1687 | 1688 | /wrappy@1.0.2: 1689 | resolution: {integrity: sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==} 1690 | dev: true 1691 | 1692 | /yaml@2.3.2: 1693 | resolution: {integrity: sha512-N/lyzTPaJasoDmfV7YTrYCI0G/3ivm/9wdG0aHuheKowWQwGTsK0Eoiw6utmzAnI6pkJa0DUVygvp3spqqEKXg==} 1694 | engines: {node: '>= 14'} 1695 | dev: true 1696 | 1697 | /yocto-queue@1.0.0: 1698 | resolution: {integrity: sha512-9bnSc/HEW2uRy67wc+T8UwauLuPJVn28jb+GtJY16iiKWyvmYJRXVT4UamsAEGQfPohgr2q4Tq0sQbQlxTfi1g==} 1699 | engines: {node: '>=12.20'} 1700 | dev: true 1701 | -------------------------------------------------------------------------------- /pnpm-workspace.yaml: -------------------------------------------------------------------------------- 1 | packages: 2 | - "examples/*" 3 | - "packages/*" 4 | -------------------------------------------------------------------------------- /src/Component.ts: -------------------------------------------------------------------------------- 1 | import debug from "@wbe/debug" 2 | const log = debug(`compose:Component`) 3 | 4 | type Props = Record 5 | interface ComponentOptions

{ 6 | name: string 7 | props: P 8 | } 9 | 10 | // global 11 | export const ID_ATTR = "data-id" 12 | let ID = 0 13 | 14 | /** 15 | * Component 16 | */ 17 | export class Component

{ 18 | public readonly root: HTMLElement 19 | public readonly id: number 20 | public readonly name: string 21 | public readonly props: P 22 | 23 | #observer: MutationObserver 24 | #isMounted: boolean = false 25 | #unmountedFromMounted: (() => void) | void 26 | public get isMounted() { 27 | return this.#isMounted 28 | } 29 | 30 | constructor(root: HTMLElement, options: Partial> = {}) { 31 | this.beforeMount() 32 | this.root = root 33 | this.name = options.name ?? this.root?.classList?.[0] 34 | this.props = options.props 35 | this.id = ID++ 36 | this.root?.setAttribute(ID_ATTR, `${this.id}`) 37 | 38 | // hack: exe init method with timeout to access `this` inside 39 | // the component witch extends Component 40 | setTimeout(() => { 41 | this.#mounted() 42 | this.#watchChildren() 43 | }, 0) 44 | } 45 | 46 | public beforeMount(): void {} 47 | 48 | public mounted(): (() => void) | void { 49 | return () => {} 50 | } 51 | 52 | #mounted(): void { 53 | log(`🟢 ${this.name} mounted`) 54 | this.#unmountedFromMounted = this.mounted() 55 | this.#isMounted = true 56 | } 57 | 58 | public unmounted(): void {} 59 | 60 | protected _unmounted(): void { 61 | log(`🔴 ${this.name} unmounted`) 62 | if (this.#unmountedFromMounted) this.#unmountedFromMounted() 63 | this.unmounted() 64 | this.#isMounted = false 65 | this.#onChildrenComponents((component: Component) => { 66 | if (component) component._unmounted() 67 | }) 68 | } 69 | 70 | // --------------------------------------------------------------------------- ADD 71 | 72 | /** 73 | * Add is a register child component function 74 | * It create new children instance 75 | */ 76 | public add( 77 | classComponent: new

(...args: any[]) => C, 78 | options?: Partial>, 79 | ): C { 80 | const name = options?.name || classComponent?.["name"] 81 | const element = this.root.querySelector(`.${name}`) 82 | return element ? new classComponent

(element, options) : null 83 | } 84 | 85 | /** 86 | * Add multiple children components 87 | */ 88 | public addAll( 89 | classComponent: new

(...args: any[]) => C extends (infer U)[] ? U : never, 90 | options?: Partial>, 91 | ): C { 92 | const arr = [] 93 | const name = options?.name || classComponent?.["name"] 94 | const elements = this.root.querySelectorAll(`.${name}`) 95 | if (!elements?.length) return arr as any 96 | 97 | // map on each elements (because elements return an array) 98 | for (let i = 0; i < elements.length; i++) { 99 | const classInstance = new classComponent

(elements[i], options) 100 | arr.push(classInstance) 101 | } 102 | return arr as C 103 | } 104 | 105 | // --------------------------------------------------------------------------- FIND 106 | 107 | /** 108 | * Find single HTML element from parent root 109 | */ 110 | public find(className: string): T { 111 | return this.root?.querySelector( 112 | className.startsWith("_") ? `.${this.name}${className}` : `.${className}`, 113 | ) 114 | } 115 | 116 | /** 117 | * Find HTML element list from parent root 118 | */ 119 | public findAll(className: string): T { 120 | const els = this.root?.querySelectorAll( 121 | className.startsWith("_") ? `.${this.name}${className}` : `.${className}`, 122 | ) 123 | return Array.from(els || []) as T 124 | } 125 | 126 | // --------------------------------------------------------------------------- TRANSITIONS 127 | 128 | public playIn(): Promise { 129 | return Promise.resolve() 130 | } 131 | 132 | public playOut(): Promise { 133 | return Promise.resolve() 134 | } 135 | 136 | // --------------------------------------------------------------------------- CORE 137 | 138 | /** 139 | * Process callback function on each children components 140 | * A children component is an instance of Component 141 | * @param callback 142 | */ 143 | #onChildrenComponents(callback: (component) => void): void { 144 | Object.keys(this)?.forEach((child) => { 145 | const curr = this?.[child] 146 | if (Array.isArray(curr)) { 147 | curr.forEach((c) => { 148 | if (c instanceof Component) callback(c) 149 | }) 150 | } else if (curr instanceof Component) callback(curr) 151 | }) 152 | } 153 | 154 | /** 155 | * Watch children components changed 156 | * If this current component is removed (with his children), unmount children 157 | */ 158 | #watchChildren(): void { 159 | this.#observer = new MutationObserver((mutationsList) => { 160 | for (const mutation of mutationsList) { 161 | for (const node of mutation.removedNodes as any) { 162 | const nodeRemovedId = this.#getComponentId(node as any) 163 | const parentNode = node.parentNode?.querySelector(`*[${ID_ATTR}='${nodeRemovedId}']`) 164 | if (nodeRemovedId && parentNode) continue 165 | 166 | this.#onChildrenComponents((component) => { 167 | if (!component) return 168 | if (nodeRemovedId === component?.id && component?.isMounted) { 169 | component._unmounted() 170 | component?.observer?.disconnect() 171 | } 172 | }) 173 | } 174 | } 175 | }) 176 | 177 | if (this.root) { 178 | this.#observer.observe(this.root, { 179 | subtree: true, 180 | childList: true, 181 | }) 182 | } 183 | } 184 | 185 | /** 186 | * Get component ID 187 | * @param $node 188 | */ 189 | #getComponentId($node: HTMLElement): number { 190 | return $node?.getAttribute?.(ID_ATTR) && parseInt($node.getAttribute(ID_ATTR)) 191 | } 192 | } 193 | -------------------------------------------------------------------------------- /src/index.ts: -------------------------------------------------------------------------------- 1 | export { Component } from "./Component" 2 | -------------------------------------------------------------------------------- /tests/Component.add.test.ts: -------------------------------------------------------------------------------- 1 | // @vitest-environment happy-dom 2 | import { beforeEach, expect, it } from "vitest" 3 | import { Window } from "happy-dom" 4 | import { HomePageMock } from "./templates/HomePageMock" 5 | import { Component } from "../src" 6 | 7 | let window = new Window() 8 | let document = window.document 9 | 10 | beforeEach(() => { 11 | window = new Window() 12 | document = window.document 13 | }) 14 | 15 | class Button extends Component { 16 | static attrName = "Button" 17 | } 18 | 19 | class NotExistInDOM extends Component { 20 | static attrName = "NotExistInDOM" 21 | } 22 | 23 | it("Should add properly", async () => { 24 | class HomePage extends Component { 25 | public button = this.add(Button) 26 | } 27 | document.write(HomePageMock()) 28 | const root = document.querySelector(".HomePage") as any 29 | const homePage = new HomePage(root) 30 | expect(homePage.button).toBeInstanceOf(Button) 31 | expect(homePage.button.root).toBe(root.querySelector(".Button")) 32 | }) 33 | 34 | it("Should addAll properly", async () => { 35 | class HomePage extends Component { 36 | public buttons = this.addAll(Button) 37 | public notExistInDOM = this.addAll(NotExistInDOM) 38 | } 39 | 40 | document.write(HomePageMock()) 41 | const root = document.querySelector(".HomePage") as any 42 | const homePage = new HomePage(root) 43 | expect(homePage.buttons.length).toBe(2) 44 | homePage.buttons.forEach((e) => expect(e).toBeInstanceOf(Button)) 45 | expect(homePage.notExistInDOM).toEqual([]) 46 | }) 47 | 48 | it("Should addAll multiple instances properly", async () => { 49 | class HomePage extends Component { 50 | public buttons = this.addAll(Button) 51 | } 52 | document.write(HomePageMock()) 53 | const root = document.querySelector(".HomePage") as any 54 | root.innerHTML = new Array(1000).fill(`

hello
`).join("\n") 55 | 56 | const homePage = new HomePage(root) 57 | expect(homePage.buttons.length).toBe(1000) 58 | homePage.buttons.forEach((e) => expect(e).toBeInstanceOf(Button)) 59 | }) 60 | -------------------------------------------------------------------------------- /tests/Component.find.test.ts: -------------------------------------------------------------------------------- 1 | // @vitest-environment happy-dom 2 | import { beforeEach, expect, it } from "vitest" 3 | import { Window } from "happy-dom" 4 | import { HomePageMock } from "./templates/HomePageMock" 5 | import { Component } from "../src" 6 | 7 | let window = new Window() 8 | let document = window.document 9 | 10 | beforeEach(() => { 11 | window = new Window() 12 | document = window.document 13 | }) 14 | 15 | class HomePage extends Component { 16 | public section = this.find("_section") 17 | public notExist = this.find("_notExist") 18 | public notExists = this.findAll("_notExists") 19 | } 20 | 21 | it("Should find and findAll properly", async () => { 22 | document.write(HomePageMock()) 23 | const root = document.querySelector(".HomePage") as any 24 | const section = root.querySelector(".HomePage_section") 25 | const homePage = new HomePage(root) 26 | 27 | expect(homePage.section).toEqual(section) 28 | expect(homePage.notExist).toBeNull() 29 | expect(homePage.notExists).toEqual([]) 30 | }) 31 | -------------------------------------------------------------------------------- /tests/Component.init.test.ts: -------------------------------------------------------------------------------- 1 | // @vitest-environment happy-dom 2 | import { expect, it } from "vitest" 3 | import { Window } from "happy-dom" 4 | import { HomePageMock } from "./templates/HomePageMock" 5 | import { Component } from "../src" 6 | 7 | let window = new Window() 8 | let document = window.document 9 | 10 | class HomePage extends Component {} 11 | 12 | it("Extended class should be init properly.", async () => { 13 | document.write(HomePageMock()) 14 | const root = document.querySelector(".HomePage") as any 15 | const props = { foo: "bar" } 16 | const homePage = new HomePage(root, { props }) 17 | 18 | expect(HomePage.name).toBe("HomePage") 19 | expect(homePage.root).toBe(root) 20 | expect(homePage.props).toBe(props) 21 | expect(parseInt(root.getAttribute("data-id"))).toBeTypeOf("number") 22 | }) 23 | -------------------------------------------------------------------------------- /tests/Component.lifecycle.test.ts: -------------------------------------------------------------------------------- 1 | // @vitest-environment happy-dom 2 | import { beforeEach, expect, it, Mock, vi } from "vitest" 3 | import { Window } from "happy-dom" 4 | import { HomePageMock } from "./templates/HomePageMock" 5 | import { wait } from "./helpers/wait" 6 | import { Component } from "../src" 7 | 8 | let window 9 | let document 10 | 11 | beforeEach(() => { 12 | window = new Window() 13 | document = window.document 14 | }) 15 | 16 | it("Life-cycle order should be respected.", async () => { 17 | let beforeMountMock = vi.fn() 18 | let mountedMock = vi.fn() 19 | let unmountedMock = vi.fn() 20 | 21 | class HomePage extends Component { 22 | static attrName = "HomePage" 23 | public beforeMount() { 24 | expect(this.root).toBeUndefined() 25 | beforeMountMock() 26 | } 27 | public mounted() { 28 | mountedMock() 29 | } 30 | public unmounted() { 31 | unmountedMock() 32 | } 33 | } 34 | 35 | document.write(HomePageMock()) 36 | const homePage = new HomePage(document.querySelector(".HomePage")) 37 | expect(beforeMountMock).toBeCalledTimes(1) 38 | // waiting for a frame (see trick in Component constructor) 39 | await wait(0) 40 | expect(mountedMock).toBeCalledTimes(1) 41 | expect(unmountedMock).toBeCalledTimes(0) 42 | homePage.unmounted() 43 | expect(unmountedMock).toBeCalledTimes(1) 44 | }) 45 | 46 | it("Should mount & unmount children components", async () => { 47 | let homeMountedMock = vi.fn() 48 | let homeUnmountedMock = vi.fn() 49 | let buttonMountedMock = vi.fn() 50 | let buttonUnmountedMock = vi.fn() 51 | let labelMountedMock = vi.fn() 52 | let labelUnmountedMock = vi.fn() 53 | let mountedOrder = [] 54 | let unmountedOrder = [] 55 | /** 56 | * Home 57 | * Button 58 | * Label 59 | */ 60 | class HomePage extends Component { 61 | static attrName = "HomePage" 62 | public button = this.add(Button) 63 | public mounted() { 64 | homeMountedMock() 65 | mountedOrder.push(this.name) 66 | } 67 | public unmounted() { 68 | homeUnmountedMock() 69 | unmountedOrder.push(this.name) 70 | } 71 | public _unmounted() { 72 | super._unmounted() 73 | } 74 | } 75 | class Button extends Component { 76 | static attrName = "Button" 77 | public label = this.add(Label) 78 | public mounted() { 79 | buttonMountedMock() 80 | mountedOrder.push(this.name) 81 | } 82 | public unmounted() { 83 | buttonUnmountedMock() 84 | unmountedOrder.push(this.name) 85 | } 86 | } 87 | class Label extends Component { 88 | static attrName = "Label" 89 | public mounted() { 90 | labelMountedMock() 91 | mountedOrder.push(this.name) 92 | } 93 | public unmounted() { 94 | labelUnmountedMock() 95 | unmountedOrder.push(this.name) 96 | } 97 | } 98 | 99 | document.write(HomePageMock()) 100 | const root = document.querySelector(".HomePage") as any 101 | 102 | // add appropriate DOM 103 | root.innerHTML = ` 104 |
105 |
label
106 |
` 107 | 108 | // root instance will chain children instances 109 | const homePage = new HomePage(root) 110 | 111 | expect(homePage.root.getAttribute("data-id")).toBeDefined() 112 | expect(homePage.button.root.getAttribute("data-id")).toBeDefined() 113 | expect(homePage.button.label.root.getAttribute("data-id")).toBeDefined() 114 | 115 | // waiting for a frame (see trick in Component constructor) 116 | await wait(0) 117 | ;[homeMountedMock, buttonMountedMock, labelMountedMock].forEach((e) => 118 | expect(e).toHaveBeenCalledTimes(1), 119 | ) 120 | expect(mountedOrder).toEqual(["HomePage", "Button", "Label"]) 121 | 122 | // unmounted() will not unmount children component, only current instance 123 | homePage.unmounted() 124 | expect(homeUnmountedMock).toHaveBeenCalledTimes(1) 125 | expect(buttonUnmountedMock).toHaveBeenCalledTimes(0) 126 | expect(labelUnmountedMock).toHaveBeenCalledTimes(0) 127 | 128 | // clear 129 | homeUnmountedMock.mockClear() 130 | buttonUnmountedMock.mockClear() 131 | labelUnmountedMock.mockClear() 132 | unmountedOrder = [] 133 | 134 | // _unmounted() will unmount all children component 135 | // (protected method, making public here) 136 | homePage._unmounted() 137 | ;[homeUnmountedMock, buttonUnmountedMock, labelUnmountedMock].forEach((e) => 138 | expect(e).toHaveBeenCalledTimes(1), 139 | ) 140 | expect(unmountedOrder).toEqual(["HomePage", "Button", "Label"]) 141 | }) 142 | -------------------------------------------------------------------------------- /tests/helpers/wait.ts: -------------------------------------------------------------------------------- 1 | export const wait = async (t) => new Promise((r) => setTimeout(r, t)) 2 | -------------------------------------------------------------------------------- /tests/templates/AboutPageMock.ts: -------------------------------------------------------------------------------- 1 | export const AboutPageMock = () => ` 2 | 3 | 4 | 5 | 6 | About 7 | 8 | 9 | 10 |
11 |
12 | 17 |
18 | 19 |
20 |
About
21 |
22 |
footer
23 |
24 | 25 | 26 | ` 27 | -------------------------------------------------------------------------------- /tests/templates/HomePageMock.ts: -------------------------------------------------------------------------------- 1 | export const HomePageMock = () => ` 2 | 3 | 4 | 5 | 6 | Home 7 | 8 | 9 | 10 |
11 |
12 | 17 |
18 | 19 |
20 |
21 | Home 22 |
Hello
23 |
Hello
24 |
25 |
26 | 27 |
28 | 29 | 30 | ` 31 | -------------------------------------------------------------------------------- /tsconfig.json: -------------------------------------------------------------------------------- 1 | { 2 | "compilerOptions": { 3 | "target": "esnext", 4 | "module": "esnext", 5 | "moduleResolution": "node", 6 | "importHelpers": true, 7 | "outDir": "dist", 8 | "strict": false, 9 | "jsx": "preserve", 10 | "declaration": true, 11 | "sourceMap": true, 12 | "resolveJsonModule": true, 13 | "esModuleInterop": true, 14 | "skipLibCheck": true, 15 | "experimentalDecorators": true, 16 | "baseUrl": ".", 17 | "types": ["vite/client"], 18 | "paths": { 19 | "~/*": ["src/*"] 20 | }, 21 | "lib": ["esnext", "dom"] 22 | }, 23 | "include": ["src/**/*"], 24 | "exclude": ["node_modules", "dist"] 25 | } 26 | -------------------------------------------------------------------------------- /tsup.config.ts: -------------------------------------------------------------------------------- 1 | import { defineConfig } from "tsup" 2 | import { spawn } from "child_process" 3 | 4 | export default defineConfig({ 5 | entry: { compose: "src/index.ts" }, 6 | splitting: true, 7 | clean: true, 8 | dts: true, 9 | format: ["esm"], 10 | name: "compose", 11 | minify: true, 12 | async onSuccess() { 13 | const process = spawn("npx", ["size-limit"], { shell: true }) 14 | process.stdout.on("data", (data) => console.log(data.toString())) 15 | }, 16 | }) 17 | -------------------------------------------------------------------------------- /turbo.json: -------------------------------------------------------------------------------- 1 | { 2 | "$schema": "https://turbo.build/schema.json", 3 | "pipeline": { 4 | "build": { 5 | "outputs": ["dist/**"] 6 | }, 7 | "dev": { 8 | "cache": false 9 | }, 10 | "ncu": { 11 | "cache": false 12 | }, 13 | "test": { 14 | "cache": false 15 | } 16 | } 17 | } 18 | --------------------------------------------------------------------------------