diff --git a/.github/FUNDING.yml b/.github/FUNDING.yml
deleted file mode 100644
index 76ea2fd..0000000
--- a/.github/FUNDING.yml
+++ /dev/null
@@ -1,3 +0,0 @@
-custom:
- - https://paypal.me/TechQuery
- - https://tech-query.me/image/TechQuery-Alipay.jpg
diff --git a/.github/pr-badge.yml b/.github/pr-badge.yml
deleted file mode 100644
index 7400516..0000000
--- a/.github/pr-badge.yml
+++ /dev/null
@@ -1,17 +0,0 @@
-- icon: visualstudio
- label: 'GitHub.dev'
- message: 'PR-$prNumber'
- color: 'blue'
- url: 'https://github.dev/$owner/$repo/pull/$prNumber'
-
-- icon: github
- label: 'GitHub codespaces'
- message: 'PR-$prNumber'
- color: 'black'
- url: 'https://codespaces.new/$owner/$repo/pull/$prNumber'
-
-- icon: git
- label: 'GitPod.io'
- message: 'PR-$prNumber'
- color: 'orange'
- url: 'https://gitpod.io/?autostart=true#https://github.com/$owner/$repo/pull/$prNumber'
diff --git a/.github/settings.yml b/.github/settings.yml
deleted file mode 100644
index 72e1ca6..0000000
--- a/.github/settings.yml
+++ /dev/null
@@ -1,85 +0,0 @@
-# These settings are synced to GitHub by https://probot.github.io/apps/settings/
-
-repository:
- allow_merge_commit: false
-
- delete_branch_on_merge: true
-
- enable_vulnerability_alerts: true
-
-labels:
- - name: bug
- color: '#d73a4a'
- description: Something isn't working
-
- - name: documentation
- color: '#0075ca'
- description: Improvements or additions to documentation
-
- - name: duplicate
- color: '#cfd3d7'
- description: This issue or pull request already exists
-
- - name: enhancement
- color: '#a2eeef'
- description: Some improvements
-
- - name: feature
- color: '#16b33f'
- description: New feature or request
-
- - name: good first issue
- color: '#7057ff'
- description: Good for newcomers
-
- - name: help wanted
- color: '#008672'
- description: Extra attention is needed
-
- - name: invalid
- color: '#e4e669'
- description: This doesn't seem right
-
- - name: question
- color: '#d876e3'
- description: Further information is requested
-
- - name: wontfix
- color: '#ffffff'
- description: This will not be worked on
-
-branches:
- - name: main
- # https://docs.github.com/en/rest/reference/repos#update-branch-protection
- protection:
- # Required. Require at least one approving review on a pull request, before merging. Set to null to disable.
- required_pull_request_reviews:
- # The number of approvals required. (1-6)
- required_approving_review_count: 1
- # Dismiss approved reviews automatically when a new commit is pushed.
- dismiss_stale_reviews: true
- # Blocks merge until code owners have reviewed.
- require_code_owner_reviews: true
- # Specify which users and teams can dismiss pull request reviews.
- # Pass an empty dismissal_restrictions object to disable.
- # User and team dismissal_restrictions are only available for organization-owned repositories.
- # Omit this parameter for personal repositories.
- dismissal_restrictions:
- # users: []
- # teams: []
- # Required. Require status checks to pass before merging. Set to null to disable
- required_status_checks:
- # Required. Require branches to be up to date before merging.
- strict: true
- # Required. The list of status checks to require in order to merge into this branch
- contexts: []
- # Required. Enforce all configured restrictions for administrators.
- # Set to true to enforce required status checks for repository administrators.
- # Set to null to disable.
- enforce_admins: true
- # Prevent merge commits from being pushed to matching branches
- required_linear_history: true
- # Required. Restrict who can push to this branch.
- # Team and user restrictions are only available for organization-owned repositories.
- # Set to null to disable.
- restrictions: null
diff --git a/.github/workflows/main.yml b/.github/workflows/main.yml
deleted file mode 100644
index 5c54a82..0000000
--- a/.github/workflows/main.yml
+++ /dev/null
@@ -1,38 +0,0 @@
-name: CI & CD
-on:
- push:
- tags:
- - v*
-jobs:
- Build-and-Publish:
- runs-on: ubuntu-latest
- permissions:
- contents: write
- id-token: write
- steps:
- - uses: actions/checkout@v4
-
- - uses: pnpm/action-setup@v4
- with:
- version: 9
-
- - uses: actions/setup-node@v4
- with:
- node-version: 22
- registry-url: https://registry.npmjs.org
- cache: pnpm
-
- - name: Install Dependencies
- run: pnpm i --frozen-lockfile
-
- - name: Build & Publish
- run: npm publish --access public --provenance
- env:
- NODE_AUTH_TOKEN: ${{ secrets.NPM_TOKEN }}
-
- - name: Update document
- uses: peaceiris/actions-gh-pages@v4
- with:
- publish_dir: ./docs
- personal_token: ${{ secrets.GITHUB_TOKEN }}
- force_orphan: true
diff --git a/.gitignore b/.gitignore
index e5e3859..54cd362 100644
--- a/.gitignore
+++ b/.gitignore
@@ -1,7 +1,3 @@
-node_modules/
-package-lock.json
-yarn.lock
-/dist/
-/jsx-*runtime.*
-docs/
-.vscode/settings.json
\ No newline at end of file
+package-lock.json
+node_modules/
+.vscode/
\ No newline at end of file
diff --git a/.gitpod.yml b/.gitpod.yml
deleted file mode 100644
index 168fada..0000000
--- a/.gitpod.yml
+++ /dev/null
@@ -1,21 +0,0 @@
-# This configuration file was automatically generated by Gitpod.
-# Please adjust to your needs (see https://www.gitpod.io/docs/introduction/learn-gitpod/gitpod-yaml)
-# and commit this file to your remote git repository to share the goodness with others.
-
-# Learn more from ready-to-use templates: https://www.gitpod.io/docs/introduction/getting-started/quickstart
-
-vscode:
- extensions:
- - yzhang.markdown-all-in-one
- - redhat.vscode-yaml
- - akamud.vscode-caniuse
- - visualstudioexptteam.intellicode-api-usage-examples
- - pflannery.vscode-versionlens
- - christian-kohler.npm-intellisense
- - esbenp.prettier-vscode
- - eamodio.gitlens
- - github.vscode-pull-request-github
- - github.vscode-github-actions
-tasks:
- - init: pnpm i
- command: npm test
diff --git a/.husky/pre-commit b/.husky/pre-commit
deleted file mode 100644
index 72c4429..0000000
--- a/.husky/pre-commit
+++ /dev/null
@@ -1 +0,0 @@
-npm test
diff --git a/.husky/pre-push b/.husky/pre-push
deleted file mode 100644
index d6cb288..0000000
--- a/.husky/pre-push
+++ /dev/null
@@ -1 +0,0 @@
-npm run build
diff --git a/.npmignore b/.npmignore
deleted file mode 100644
index 3d2c816..0000000
--- a/.npmignore
+++ /dev/null
@@ -1,6 +0,0 @@
-test/
-docs/
-.husky/
-.github/
-.vscode/
-.gitpod.yml
\ No newline at end of file
diff --git a/.npmrc b/.npmrc
deleted file mode 100644
index f048ded..0000000
--- a/.npmrc
+++ /dev/null
@@ -1 +0,0 @@
-auto-install-peers = false
diff --git a/.vscode/extensions.json b/.vscode/extensions.json
deleted file mode 100644
index 3f05804..0000000
--- a/.vscode/extensions.json
+++ /dev/null
@@ -1,15 +0,0 @@
-{
- "recommendations": [
- "yzhang.markdown-all-in-one",
- "redhat.vscode-yaml",
- "akamud.vscode-caniuse",
- "visualstudioexptteam.intellicode-api-usage-examples",
- "pflannery.vscode-versionlens",
- "christian-kohler.npm-intellisense",
- "esbenp.prettier-vscode",
- "eamodio.gitlens",
- "github.vscode-pull-request-github",
- "github.vscode-github-actions",
- "github.copilot"
- ]
-}
diff --git a/.vscode/launch.json b/.vscode/launch.json
deleted file mode 100644
index d8ddc2b..0000000
--- a/.vscode/launch.json
+++ /dev/null
@@ -1,18 +0,0 @@
-{
- "version": "0.2.0",
- "configurations": [
- {
- "name": "Debug Jest",
- "type": "node",
- "request": "launch",
- "port": 9229,
- "runtimeArgs": [
- "--inspect-brk",
- "${workspaceRoot}/node_modules/jest/bin/jest.js",
- "--runInBand"
- ],
- "console": "integratedTerminal",
- "internalConsoleOptions": "neverOpen"
- }
- ]
-}
diff --git a/ReadMe.md b/ReadMe.md
index 727b49a..d38d473 100644
--- a/ReadMe.md
+++ b/ReadMe.md
@@ -1,186 +1,7 @@
# DOM Renderer
-A light-weight DOM Renderer supports [Web components][1] standard & [TypeScript][2] language.
+DOM Renderer with [Async Generator][1] support (inspired by [Crank.js][2]), which is based on [TSX][3] & **DOM-compatible virtual DOM**.
-[][3]
-[][4]
-
-[][5]
-
-[][6]
-
-## Feature
-
-- input: [Virtual DOM][7] object in [JSX][8] syntax
-- output: [DOM][9] object or [XML][10] string of [HTML][11], [SVG][12] & [MathML][13] languages
-- run as: **Sync**, [Async][14], [Generator][15] functions & [Readable streams][16]
-
-## Usage
-
-### JavaScript
-
-#### Sync Rendering
-
-```js
-import { DOMRenderer, VNode } from 'dom-renderer';
-
-const newVNode = new DOMRenderer().patch(
- new VNode({
- tagName: 'body',
- node: document.body
- }),
- new VNode({
- tagName: 'body',
- children: [
- new VNode({
- tagName: 'a',
- props: { href: 'https://idea2.app/' },
- style: { color: 'red' },
- children: [new VNode({ text: 'idea2app' })]
- })
- ]
- })
-);
-console.log(newVNode);
-```
-
-#### Async Rendering (experimental)
-
-```diff
-import { DOMRenderer, VNode } from 'dom-renderer';
-
--const newVNode = new DOMRenderer().patch(
-+const newVNode = new DOMRenderer().patchAsync(
- new VNode({
- tagName: 'body',
- node: document.body
- }),
- new VNode({
- tagName: 'body',
- children: [
- new VNode({
- tagName: 'a',
- props: { href: 'https://idea2.app/' },
- style: { color: 'red' },
- children: [new VNode({ text: 'idea2app' })]
- })
- ]
- })
-);
--console.log(newVNode);
-+newVNode.then(console.log);
-```
-
-### TypeScript
-
-[][17]
-
-#### `tsconfig.json`
-
-```json
-{
- "compilerOptions": {
- "jsx": "react-jsx",
- "jsxImportSource": "dom-renderer"
- }
-}
-```
-
-#### `index.tsx`
-
-##### Sync Rendering
-
-```tsx
-import { DOMRenderer } from 'dom-renderer';
-
-const newVNode = new DOMRenderer().render(
-
- idea2app
-
-);
-console.log(newVNode);
-```
-
-##### Async Rendering (experimental)
-
-```diff
-import { DOMRenderer } from 'dom-renderer';
-
-const newVNode = new DOMRenderer().render(
-
- idea2app
--
-+ ,
-+ document.body,
-+ 'async'
-);
--console.log(newVNode);
-+newVNode.then(console.log);
-```
-
-### Node.js & Bun
-
-#### `view.tsx`
-
-```tsx
-import { DOMRenderer } from 'dom-renderer';
-
-const renderer = new DOMRenderer();
-
-const Hello = () =>
Hello, JSX SSR!
;
-
-export const generateStream = () => renderer.renderToReadableStream();
-```
-
-#### `index.ts`
-
-```js
-import { Readable } from 'stream';
-import { createServer } from 'http';
-import 'dom-renderer/polyfill';
-
-import { generateStream } from './view';
-
-createServer((request, response) => {
- const stream = generateStream();
-
- Readable.fromWeb(stream).pipe(response);
-}).listen(8080);
-```
-
-## Framework
-
-### Web components
-
-[][18]
-
-## Original
-
-### Inspiration
-
-[][19]
-
-### Prototype
-
-[][20]
-
-[1]: https://www.webcomponents.org/
-[2]: https://www.typescriptlang.org/
-[3]: https://libraries.io/npm/dom-renderer
-[4]: https://github.com/EasyWebApp/DOM-Renderer/actions/workflows/main.yml
-[5]: https://nodei.co/npm/dom-renderer/
-[6]: https://gitpod.io/?autostart=true#https://github.com/EasyWebApp/DOM-Renderer
-[7]: https://en.wikipedia.org/wiki/Virtual_DOM
-[8]: https://facebook.github.io/jsx/
-[9]: https://developer.mozilla.org/en-US/docs/Web/API/Document_Object_Model
-[10]: https://developer.mozilla.org/en-US/docs/Web/XML
-[11]: https://developer.mozilla.org/en-US/docs/Web/HTML
-[12]: https://developer.mozilla.org/en-US/docs/Web/SVG
-[13]: https://developer.mozilla.org/en-US/docs/Web/MathML
-[14]: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Statements/async_function
-[15]: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Statements/function*
-[16]: https://developer.mozilla.org/en-US/docs/Web/API/ReadableStream
-[17]: https://codesandbox.io/s/dom-renderer-example-pmcsvs?autoresize=1&expanddevtools=1&fontsize=14&hidenavigation=1&module=%2Fsrc%2Findex.tsx&theme=dark
-[18]: https://codesandbox.io/s/mobx-web-components-pvn9rf?autoresize=1&fontsize=14&hidenavigation=1&module=%2Fsrc%2FWebComponent.ts&moduleview=1&theme=dark
-[19]: https://github.com/snabbdom/snabbdom
-[20]: https://codesandbox.io/s/dom-renderer-pglxkx?autoresize=1&expanddevtools=1&fontsize=14&hidenavigation=1&module=%2Fsrc%2Findex.ts&theme=dark
+[1]: https://tc39.es/ecma262/#sec-asyncgeneratorfunction-objects
+[2]: https://crank.js.org/
+[3]: https://www.typescriptlang.org/docs/handbook/jsx.html
diff --git a/package.json b/package.json
index 578d0e3..58dfd9a 100644
--- a/package.json
+++ b/package.json
@@ -1,16 +1,18 @@
{
"name": "dom-renderer",
- "version": "2.6.4",
- "license": "LGPL-3.0-or-later",
+ "version": "3.0.0-alpha.0",
+ "license": "LGPL-3.0",
"author": "shiy2008@gmail.com",
- "description": "A light-weight DOM Renderer supports Web components standard & TypeScript language",
+ "description": "DOM Renderer with Async Generator support (inspired by Crank.js), which is based on TSX & DOM-compatible virtual DOM.",
"keywords": [
- "light-weight",
- "dom",
+ "DOM",
"render",
- "web",
- "component",
- "typescript"
+ "async",
+ "generator",
+ "TypeScript",
+ "JSX",
+ "vDOM",
+ "crank"
],
"homepage": "https://web-cell.dev/DOM-Renderer/",
"repository": {
@@ -20,63 +22,40 @@
"bugs": {
"url": "https://github.com/EasyWebApp/DOM-Renderer/issues"
},
- "source": "source/dist/index.ts",
- "types": "dist/index.d.ts",
- "main": "dist/index.js",
+ "source": "source/index.ts",
"dependencies": {
- "declarative-shadow-dom-polyfill": "^0.4.1",
- "scheduler-polyfill": "^1.3.0",
- "tslib": "^2.8.1",
- "web-streams-polyfill": "^4.2.0",
- "web-utility": "^4.6.4"
- },
- "peerDependencies": {
- "happy-dom": "^14"
+ "web-utility": "1.5.0"
},
"devDependencies": {
- "@happy-dom/jest-environment": "^14.12.3",
- "@types/jest": "^29.5.14",
- "@types/node": "^22.19.1",
- "happy-dom": "^14.12.3",
- "husky": "^9.1.7",
- "jest": "^29.7.0",
- "lint-staged": "^16.2.7",
- "open-cli": "^8.0.0",
- "prettier": "^3.6.2",
- "ts-jest": "^29.4.5",
- "typedoc": "^0.28.14",
- "typedoc-plugin-mdn-links": "^5.0.10",
- "typescript": "~5.9.3"
+ "@types/jest": "^25.2.3",
+ "husky": "^4.2.5",
+ "jest": "^26.0.1",
+ "lint-staged": "^10.2.7",
+ "prettier": "^2.0.5",
+ "ts-jest": "^26.1.0",
+ "typescript": "^3.9.3"
},
"prettier": {
"singleQuote": true,
"trailingComma": "none",
"arrowParens": "avoid",
- "tabWidth": 4,
- "printWidth": 100
+ "tabWidth": 4
},
"lint-staged": {
- "*.{md,json,yml,ts}": "prettier --write"
+ "*.{md,json,yml,ts,tsx}": [
+ "prettier --write"
+ ]
},
"jest": {
"preset": "ts-jest",
- "testEnvironment": "@happy-dom/jest-environment",
- "transform": {
- "\\.tsx?$": [
- "ts-jest",
- {
- "tsconfig": "test/tsconfig.json"
- }
- ]
- }
+ "transformIgnorePatterns": []
},
- "browserslist": "> 0.5%, last 2 versions, not dead, IE 11",
"scripts": {
- "prepare": "husky",
- "test": "lint-staged && jest",
- "parcel": "tsc -p tsconfig.json && mv dist/jsx-runtime.* . && cp jsx-runtime.js jsx-dev-runtime.js && mv dist/dist/* dist/ && rm -rf dist/dist",
- "build": "rm -rf dist/ docs/ && typedoc && npm run parcel",
- "start": "typedoc && open-cli docs/index.html",
- "prepublishOnly": "npm test && npm run build"
+ "test": "lint-staged && jest"
+ },
+ "husky": {
+ "hooks": {
+ "pre-commit": "npm test"
+ }
}
}
diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml
deleted file mode 100644
index 777251e..0000000
--- a/pnpm-lock.yaml
+++ /dev/null
@@ -1,3361 +0,0 @@
-lockfileVersion: '9.0'
-
-settings:
- autoInstallPeers: false
- excludeLinksFromLockfile: false
-
-importers:
-
- .:
- dependencies:
- declarative-shadow-dom-polyfill:
- specifier: ^0.4.1
- version: 0.4.1(typescript@5.9.3)
- scheduler-polyfill:
- specifier: ^1.3.0
- version: 1.3.0
- tslib:
- specifier: ^2.8.1
- version: 2.8.1
- web-streams-polyfill:
- specifier: ^4.2.0
- version: 4.2.0
- web-utility:
- specifier: ^4.6.4
- version: 4.6.4(typescript@5.9.3)
- devDependencies:
- '@happy-dom/jest-environment':
- specifier: ^14.12.3
- version: 14.12.3
- '@types/jest':
- specifier: ^29.5.14
- version: 29.5.14
- '@types/node':
- specifier: ^22.19.1
- version: 22.19.1
- happy-dom:
- specifier: ^14.12.3
- version: 14.12.3
- husky:
- specifier: ^9.1.7
- version: 9.1.7
- jest:
- specifier: ^29.7.0
- version: 29.7.0(@types/node@22.19.1)
- lint-staged:
- specifier: ^16.2.7
- version: 16.2.7
- open-cli:
- specifier: ^8.0.0
- version: 8.0.0
- prettier:
- specifier: ^3.6.2
- version: 3.6.2
- ts-jest:
- specifier: ^29.4.5
- version: 29.4.5(@babel/core@7.28.5)(@jest/transform@29.7.0)(@jest/types@29.6.3)(babel-jest@29.7.0(@babel/core@7.28.5))(jest-util@29.7.0)(jest@29.7.0(@types/node@22.19.1))(typescript@5.9.3)
- typedoc:
- specifier: ^0.28.14
- version: 0.28.14(typescript@5.9.3)
- typedoc-plugin-mdn-links:
- specifier: ^5.0.10
- version: 5.0.10(typedoc@0.28.14(typescript@5.9.3))
- typescript:
- specifier: ~5.9.3
- version: 5.9.3
-
-packages:
-
- '@babel/code-frame@7.27.1':
- resolution: {integrity: sha512-cjQ7ZlQ0Mv3b47hABuTevyTuYN4i+loJKGeV9flcCgIK37cCXRh+L1bd3iBHlynerhQ7BhCkn2BPbQUL+rGqFg==}
- engines: {node: '>=6.9.0'}
-
- '@babel/compat-data@7.28.5':
- resolution: {integrity: sha512-6uFXyCayocRbqhZOB+6XcuZbkMNimwfVGFji8CTZnCzOHVGvDqzvitu1re2AU5LROliz7eQPhB8CpAMvnx9EjA==}
- engines: {node: '>=6.9.0'}
-
- '@babel/core@7.28.5':
- resolution: {integrity: sha512-e7jT4DxYvIDLk1ZHmU/m/mB19rex9sv0c2ftBtjSBv+kVM/902eh0fINUzD7UwLLNR+jU585GxUJ8/EBfAM5fw==}
- engines: {node: '>=6.9.0'}
-
- '@babel/generator@7.28.5':
- resolution: {integrity: sha512-3EwLFhZ38J4VyIP6WNtt2kUdW9dokXA9Cr4IVIFHuCpZ3H8/YFOl5JjZHisrn1fATPBmKKqXzDFvh9fUwHz6CQ==}
- engines: {node: '>=6.9.0'}
-
- '@babel/helper-compilation-targets@7.27.2':
- resolution: {integrity: sha512-2+1thGUUWWjLTYTHZWK1n8Yga0ijBz1XAhUXcKy81rd5g6yh7hGqMp45v7cadSbEHc9G3OTv45SyneRN3ps4DQ==}
- engines: {node: '>=6.9.0'}
-
- '@babel/helper-globals@7.28.0':
- resolution: {integrity: sha512-+W6cISkXFa1jXsDEdYA8HeevQT/FULhxzR99pxphltZcVaugps53THCeiWA8SguxxpSp3gKPiuYfSWopkLQ4hw==}
- engines: {node: '>=6.9.0'}
-
- '@babel/helper-module-imports@7.27.1':
- resolution: {integrity: sha512-0gSFWUPNXNopqtIPQvlD5WgXYI5GY2kP2cCvoT8kczjbfcfuIljTbcWrulD1CIPIX2gt1wghbDy08yE1p+/r3w==}
- engines: {node: '>=6.9.0'}
-
- '@babel/helper-module-transforms@7.28.3':
- resolution: {integrity: sha512-gytXUbs8k2sXS9PnQptz5o0QnpLL51SwASIORY6XaBKF88nsOT0Zw9szLqlSGQDP/4TljBAD5y98p2U1fqkdsw==}
- engines: {node: '>=6.9.0'}
- peerDependencies:
- '@babel/core': ^7.0.0
-
- '@babel/helper-plugin-utils@7.27.1':
- resolution: {integrity: sha512-1gn1Up5YXka3YYAHGKpbideQ5Yjf1tDa9qYcgysz+cNCXukyLl6DjPXhD3VRwSb8c0J9tA4b2+rHEZtc6R0tlw==}
- engines: {node: '>=6.9.0'}
-
- '@babel/helper-string-parser@7.27.1':
- resolution: {integrity: sha512-qMlSxKbpRlAridDExk92nSobyDdpPijUq2DW6oDnUqd0iOGxmQjyqhMIihI9+zv4LPyZdRje2cavWPbCbWm3eA==}
- engines: {node: '>=6.9.0'}
-
- '@babel/helper-validator-identifier@7.28.5':
- resolution: {integrity: sha512-qSs4ifwzKJSV39ucNjsvc6WVHs6b7S03sOh2OcHF9UHfVPqWWALUsNUVzhSBiItjRZoLHx7nIarVjqKVusUZ1Q==}
- engines: {node: '>=6.9.0'}
-
- '@babel/helper-validator-option@7.27.1':
- resolution: {integrity: sha512-YvjJow9FxbhFFKDSuFnVCe2WxXk1zWc22fFePVNEaWJEu8IrZVlda6N0uHwzZrUM1il7NC9Mlp4MaJYbYd9JSg==}
- engines: {node: '>=6.9.0'}
-
- '@babel/helpers@7.28.4':
- resolution: {integrity: sha512-HFN59MmQXGHVyYadKLVumYsA9dBFun/ldYxipEjzA4196jpLZd8UjEEBLkbEkvfYreDqJhZxYAWFPtrfhNpj4w==}
- engines: {node: '>=6.9.0'}
-
- '@babel/parser@7.28.5':
- resolution: {integrity: sha512-KKBU1VGYR7ORr3At5HAtUQ+TV3SzRCXmA/8OdDZiLDBIZxVyzXuztPjfLd3BV1PRAQGCMWWSHYhL0F8d5uHBDQ==}
- engines: {node: '>=6.0.0'}
- hasBin: true
-
- '@babel/plugin-syntax-async-generators@7.8.4':
- resolution: {integrity: sha512-tycmZxkGfZaxhMRbXlPXuVFpdWlXpir2W4AMhSJgRKzk/eDlIXOhb2LHWoLpDF7TEHylV5zNhykX6KAgHJmTNw==}
- peerDependencies:
- '@babel/core': ^7.0.0-0
-
- '@babel/plugin-syntax-bigint@7.8.3':
- resolution: {integrity: sha512-wnTnFlG+YxQm3vDxpGE57Pj0srRU4sHE/mDkt1qv2YJJSeUAec2ma4WLUnUPeKjyrfntVwe/N6dCXpU+zL3Npg==}
- peerDependencies:
- '@babel/core': ^7.0.0-0
-
- '@babel/plugin-syntax-class-properties@7.12.13':
- resolution: {integrity: sha512-fm4idjKla0YahUNgFNLCB0qySdsoPiZP3iQE3rky0mBUtMZ23yDJ9SJdg6dXTSDnulOVqiF3Hgr9nbXvXTQZYA==}
- peerDependencies:
- '@babel/core': ^7.0.0-0
-
- '@babel/plugin-syntax-class-static-block@7.14.5':
- resolution: {integrity: sha512-b+YyPmr6ldyNnM6sqYeMWE+bgJcJpO6yS4QD7ymxgH34GBPNDM/THBh8iunyvKIZztiwLH4CJZ0RxTk9emgpjw==}
- engines: {node: '>=6.9.0'}
- peerDependencies:
- '@babel/core': ^7.0.0-0
-
- '@babel/plugin-syntax-import-attributes@7.27.1':
- resolution: {integrity: sha512-oFT0FrKHgF53f4vOsZGi2Hh3I35PfSmVs4IBFLFj4dnafP+hIWDLg3VyKmUHfLoLHlyxY4C7DGtmHuJgn+IGww==}
- engines: {node: '>=6.9.0'}
- peerDependencies:
- '@babel/core': ^7.0.0-0
-
- '@babel/plugin-syntax-import-meta@7.10.4':
- resolution: {integrity: sha512-Yqfm+XDx0+Prh3VSeEQCPU81yC+JWZ2pDPFSS4ZdpfZhp4MkFMaDC1UqseovEKwSUpnIL7+vK+Clp7bfh0iD7g==}
- peerDependencies:
- '@babel/core': ^7.0.0-0
-
- '@babel/plugin-syntax-json-strings@7.8.3':
- resolution: {integrity: sha512-lY6kdGpWHvjoe2vk4WrAapEuBR69EMxZl+RoGRhrFGNYVK8mOPAW8VfbT/ZgrFbXlDNiiaxQnAtgVCZ6jv30EA==}
- peerDependencies:
- '@babel/core': ^7.0.0-0
-
- '@babel/plugin-syntax-jsx@7.27.1':
- resolution: {integrity: sha512-y8YTNIeKoyhGd9O0Jiyzyyqk8gdjnumGTQPsz0xOZOQ2RmkVJeZ1vmmfIvFEKqucBG6axJGBZDE/7iI5suUI/w==}
- engines: {node: '>=6.9.0'}
- peerDependencies:
- '@babel/core': ^7.0.0-0
-
- '@babel/plugin-syntax-logical-assignment-operators@7.10.4':
- resolution: {integrity: sha512-d8waShlpFDinQ5MtvGU9xDAOzKH47+FFoney2baFIoMr952hKOLp1HR7VszoZvOsV/4+RRszNY7D17ba0te0ig==}
- peerDependencies:
- '@babel/core': ^7.0.0-0
-
- '@babel/plugin-syntax-nullish-coalescing-operator@7.8.3':
- resolution: {integrity: sha512-aSff4zPII1u2QD7y+F8oDsz19ew4IGEJg9SVW+bqwpwtfFleiQDMdzA/R+UlWDzfnHFCxxleFT0PMIrR36XLNQ==}
- peerDependencies:
- '@babel/core': ^7.0.0-0
-
- '@babel/plugin-syntax-numeric-separator@7.10.4':
- resolution: {integrity: sha512-9H6YdfkcK/uOnY/K7/aA2xpzaAgkQn37yzWUMRK7OaPOqOpGS1+n0H5hxT9AUw9EsSjPW8SVyMJwYRtWs3X3ug==}
- peerDependencies:
- '@babel/core': ^7.0.0-0
-
- '@babel/plugin-syntax-object-rest-spread@7.8.3':
- resolution: {integrity: sha512-XoqMijGZb9y3y2XskN+P1wUGiVwWZ5JmoDRwx5+3GmEplNyVM2s2Dg8ILFQm8rWM48orGy5YpI5Bl8U1y7ydlA==}
- peerDependencies:
- '@babel/core': ^7.0.0-0
-
- '@babel/plugin-syntax-optional-catch-binding@7.8.3':
- resolution: {integrity: sha512-6VPD0Pc1lpTqw0aKoeRTMiB+kWhAoT24PA+ksWSBrFtl5SIRVpZlwN3NNPQjehA2E/91FV3RjLWoVTglWcSV3Q==}
- peerDependencies:
- '@babel/core': ^7.0.0-0
-
- '@babel/plugin-syntax-optional-chaining@7.8.3':
- resolution: {integrity: sha512-KoK9ErH1MBlCPxV0VANkXW2/dw4vlbGDrFgz8bmUsBGYkFRcbRwMh6cIJubdPrkxRwuGdtCk0v/wPTKbQgBjkg==}
- peerDependencies:
- '@babel/core': ^7.0.0-0
-
- '@babel/plugin-syntax-private-property-in-object@7.14.5':
- resolution: {integrity: sha512-0wVnp9dxJ72ZUJDV27ZfbSj6iHLoytYZmh3rFcxNnvsJF3ktkzLDZPy/mA17HGsaQT3/DQsWYX1f1QGWkCoVUg==}
- engines: {node: '>=6.9.0'}
- peerDependencies:
- '@babel/core': ^7.0.0-0
-
- '@babel/plugin-syntax-top-level-await@7.14.5':
- resolution: {integrity: sha512-hx++upLv5U1rgYfwe1xBQUhRmU41NEvpUvrp8jkrSCdvGSnM5/qdRMtylJ6PG5OFkBaHkbTAKTnd3/YyESRHFw==}
- engines: {node: '>=6.9.0'}
- peerDependencies:
- '@babel/core': ^7.0.0-0
-
- '@babel/plugin-syntax-typescript@7.27.1':
- resolution: {integrity: sha512-xfYCBMxveHrRMnAWl1ZlPXOZjzkN82THFvLhQhFXFt81Z5HnN+EtUkZhv/zcKpmT3fzmWZB0ywiBrbC3vogbwQ==}
- engines: {node: '>=6.9.0'}
- peerDependencies:
- '@babel/core': ^7.0.0-0
-
- '@babel/template@7.27.2':
- resolution: {integrity: sha512-LPDZ85aEJyYSd18/DkjNh4/y1ntkE5KwUHWTiqgRxruuZL2F1yuHligVHLvcHY2vMHXttKFpJn6LwfI7cw7ODw==}
- engines: {node: '>=6.9.0'}
-
- '@babel/traverse@7.28.5':
- resolution: {integrity: sha512-TCCj4t55U90khlYkVV/0TfkJkAkUg3jZFA3Neb7unZT8CPok7iiRfaX0F+WnqWqt7OxhOn0uBKXCw4lbL8W0aQ==}
- engines: {node: '>=6.9.0'}
-
- '@babel/types@7.28.5':
- resolution: {integrity: sha512-qQ5m48eI/MFLQ5PxQj4PFaprjyCTLI37ElWMmNs0K8Lk3dVeOdNpB3ks8jc7yM5CDmVC73eMVk/trk3fgmrUpA==}
- engines: {node: '>=6.9.0'}
-
- '@bcoe/v8-coverage@0.2.3':
- resolution: {integrity: sha512-0hYQ8SB4Db5zvZB4axdMHGwEaQjkZzFjQiN9LVYvIFB2nSUHW9tYpxWriPrWDASIxiaXax83REcLxuSdnGPZtw==}
-
- '@gerrit0/mini-shiki@3.15.0':
- resolution: {integrity: sha512-L5IHdZIDa4bG4yJaOzfasOH/o22MCesY0mx+n6VATbaiCtMeR59pdRqYk4bEiQkIHfxsHPNgdi7VJlZb2FhdMQ==}
-
- '@happy-dom/jest-environment@14.12.3':
- resolution: {integrity: sha512-sUMBNZIdGbTGt+BG2D5MKg5QBHLoBEYa9NfZr19h8v2qLiuXuFb/Bnh1+NJ0t1K0Wlcq0PlL2IKV9Cqzh2B+kw==}
- engines: {node: '>=16.0.0'}
-
- '@istanbuljs/load-nyc-config@1.1.0':
- resolution: {integrity: sha512-VjeHSlIzpv/NyD3N0YuHfXOPDIixcA1q2ZV98wsMqcYlPmv2n3Yb2lYP9XMElnaFVXg5A7YLTeLu6V84uQDjmQ==}
- engines: {node: '>=8'}
-
- '@istanbuljs/schema@0.1.3':
- resolution: {integrity: sha512-ZXRY4jNvVgSVQ8DL3LTcakaAtXwTVUxE81hslsyD2AtoXW/wVob10HkOJ1X/pAlcI7D+2YoZKg5do8G/w6RYgA==}
- engines: {node: '>=8'}
-
- '@jest/console@29.7.0':
- resolution: {integrity: sha512-5Ni4CU7XHQi32IJ398EEP4RrB8eV09sXP2ROqD4bksHrnTree52PsxvX8tpL8LvTZ3pFzXyPbNQReSN41CAhOg==}
- engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0}
-
- '@jest/core@29.7.0':
- resolution: {integrity: sha512-n7aeXWKMnGtDA48y8TLWJPJmLmmZ642Ceo78cYWEpiD7FzDgmNDV/GCVRorPABdXLJZ/9wzzgZAlHjXjxDHGsg==}
- engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0}
- peerDependencies:
- node-notifier: ^8.0.1 || ^9.0.0 || ^10.0.0
- peerDependenciesMeta:
- node-notifier:
- optional: true
-
- '@jest/environment@29.7.0':
- resolution: {integrity: sha512-aQIfHDq33ExsN4jP1NWGXhxgQ/wixs60gDiKO+XVMd8Mn0NWPWgc34ZQDTb2jKaUWQ7MuwoitXAsN2XVXNMpAw==}
- engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0}
-
- '@jest/expect-utils@29.7.0':
- resolution: {integrity: sha512-GlsNBWiFQFCVi9QVSx7f5AgMeLxe9YCCs5PuP2O2LdjDAA8Jh9eX7lA1Jq/xdXw3Wb3hyvlFNfZIfcRetSzYcA==}
- engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0}
-
- '@jest/expect@29.7.0':
- resolution: {integrity: sha512-8uMeAMycttpva3P1lBHB8VciS9V0XAr3GymPpipdyQXbBcuhkLQOSe8E/p92RyAdToS6ZD1tFkX+CkhoECE0dQ==}
- engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0}
-
- '@jest/fake-timers@29.7.0':
- resolution: {integrity: sha512-q4DH1Ha4TTFPdxLsqDXK1d3+ioSL7yL5oCMJZgDYm6i+6CygW5E5xVr/D1HdsGxjt1ZWSfUAs9OxSB/BNelWrQ==}
- engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0}
-
- '@jest/globals@29.7.0':
- resolution: {integrity: sha512-mpiz3dutLbkW2MNFubUGUEVLkTGiqW6yLVTA+JbP6fI6J5iL9Y0Nlg8k95pcF8ctKwCS7WVxteBs29hhfAotzQ==}
- engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0}
-
- '@jest/reporters@29.7.0':
- resolution: {integrity: sha512-DApq0KJbJOEzAFYjHADNNxAE3KbhxQB1y5Kplb5Waqw6zVbuWatSnMjE5gs8FUgEPmNsnZA3NCWl9NG0ia04Pg==}
- engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0}
- peerDependencies:
- node-notifier: ^8.0.1 || ^9.0.0 || ^10.0.0
- peerDependenciesMeta:
- node-notifier:
- optional: true
-
- '@jest/schemas@29.6.3':
- resolution: {integrity: sha512-mo5j5X+jIZmJQveBKeS/clAueipV7KgiX1vMgCxam1RNYiqE1w62n0/tJJnHtjW8ZHcQco5gY85jA3mi0L+nSA==}
- engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0}
-
- '@jest/source-map@29.6.3':
- resolution: {integrity: sha512-MHjT95QuipcPrpLM+8JMSzFx6eHp5Bm+4XeFDJlwsvVBjmKNiIAvasGK2fxz2WbGRlnvqehFbh07MMa7n3YJnw==}
- engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0}
-
- '@jest/test-result@29.7.0':
- resolution: {integrity: sha512-Fdx+tv6x1zlkJPcWXmMDAG2HBnaR9XPSd5aDWQVsfrZmLVT3lU1cwyxLgRmXR9yrq4NBoEm9BMsfgFzTQAbJYA==}
- engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0}
-
- '@jest/test-sequencer@29.7.0':
- resolution: {integrity: sha512-GQwJ5WZVrKnOJuiYiAF52UNUJXgTZx1NHjFSEB0qEMmSZKAkdMoIzw/Cj6x6NF4AvV23AUqDpFzQkN/eYCYTxw==}
- engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0}
-
- '@jest/transform@29.7.0':
- resolution: {integrity: sha512-ok/BTPFzFKVMwO5eOHRrvnBVHdRy9IrsrW1GpMaQ9MCnilNLXQKmAX8s1YXDFaai9xJpac2ySzV0YeRRECr2Vw==}
- engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0}
-
- '@jest/types@29.6.3':
- resolution: {integrity: sha512-u3UPsIilWKOM3F9CXtrG8LEJmNxwoCQC/XVj4IKYXvvpx7QIi/Kg1LI5uDmDpKlac62NUtX7eLjRh+jVZcLOzw==}
- engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0}
-
- '@jridgewell/gen-mapping@0.3.13':
- resolution: {integrity: sha512-2kkt/7niJ6MgEPxF0bYdQ6etZaA+fQvDcLKckhy1yIQOzaoKjBBjSj63/aLVjYE3qhRt5dvM+uUyfCg6UKCBbA==}
-
- '@jridgewell/remapping@2.3.5':
- resolution: {integrity: sha512-LI9u/+laYG4Ds1TDKSJW2YPrIlcVYOwi2fUC6xB43lueCjgxV4lffOCZCtYFiH6TNOX+tQKXx97T4IKHbhyHEQ==}
-
- '@jridgewell/resolve-uri@3.1.2':
- resolution: {integrity: sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==}
- engines: {node: '>=6.0.0'}
-
- '@jridgewell/sourcemap-codec@1.5.5':
- resolution: {integrity: sha512-cYQ9310grqxueWbl+WuIUIaiUaDcj7WOq5fVhEljNVgRfOUhY9fy2zTvfoqWsnebh8Sl70VScFbICvJnLKB0Og==}
-
- '@jridgewell/trace-mapping@0.3.31':
- resolution: {integrity: sha512-zzNR+SdQSDJzc8joaeP8QQoCQr8NuYx2dIIytl1QeBEZHJ9uW6hebsrYgbz8hJwUQao3TWCMtmfV8Nu1twOLAw==}
-
- '@shikijs/engine-oniguruma@3.15.0':
- resolution: {integrity: sha512-HnqFsV11skAHvOArMZdLBZZApRSYS4LSztk2K3016Y9VCyZISnlYUYsL2hzlS7tPqKHvNqmI5JSUJZprXloMvA==}
-
- '@shikijs/langs@3.15.0':
- resolution: {integrity: sha512-WpRvEFvkVvO65uKYW4Rzxs+IG0gToyM8SARQMtGGsH4GDMNZrr60qdggXrFOsdfOVssG/QQGEl3FnJ3EZ+8w8A==}
-
- '@shikijs/themes@3.15.0':
- resolution: {integrity: sha512-8ow2zWb1IDvCKjYb0KiLNrK4offFdkfNVPXb1OZykpLCzRU6j+efkY+Y7VQjNlNFXonSw+4AOdGYtmqykDbRiQ==}
-
- '@shikijs/types@3.15.0':
- resolution: {integrity: sha512-BnP+y/EQnhihgHy4oIAN+6FFtmfTekwOLsQbRw9hOKwqgNy8Bdsjq8B05oAt/ZgvIWWFrshV71ytOrlPfYjIJw==}
-
- '@shikijs/vscode-textmate@10.0.2':
- resolution: {integrity: sha512-83yeghZ2xxin3Nj8z1NMd/NCuca+gsYXswywDy5bHvwlWL8tpTQmzGeUuHd9FC3E/SBEMvzJRwWEOz5gGes9Qg==}
-
- '@sinclair/typebox@0.27.8':
- resolution: {integrity: sha512-+Fj43pSMwJs4KRrH/938Uf+uAELIgVBmQzg/q1YG10djyfA3TnrU8N8XzqCh/okZdszqBQTZf96idMfE5lnwTA==}
-
- '@sinonjs/commons@3.0.1':
- resolution: {integrity: sha512-K3mCHKQ9sVh8o1C9cxkwxaOmXoAMlDxC1mYyHrjqOWEcBjYr76t96zL2zlj5dUGZ3HSw240X1qgH3Mjf1yJWpQ==}
-
- '@sinonjs/fake-timers@10.3.0':
- resolution: {integrity: sha512-V4BG07kuYSUkTCSBHG8G8TNhM+F19jXFWnQtzj+we8DrkpSBCee9Z3Ms8yiGer/dlmhe35/Xdgyo3/0rQKg7YA==}
-
- '@swc/helpers@0.5.17':
- resolution: {integrity: sha512-5IKx/Y13RsYd+sauPb2x+U/xZikHjolzfuDgTAl/Tdf3Q8rslRvC19NKDLgAJQ6wsqADk10ntlv08nPFw/gO/A==}
-
- '@tokenizer/token@0.3.0':
- resolution: {integrity: sha512-OvjF+z51L3ov0OyAU0duzsYuvO01PH7x4t6DJx+guahgTnBHkhJdG7soQeTSFLWN3efnHyibZ4Z8l2EuWwJN3A==}
-
- '@types/babel__core@7.20.5':
- resolution: {integrity: sha512-qoQprZvz5wQFJwMDqeseRXWv3rqMvhgpbXFfVyWhbx9X47POIA6i/+dXefEmZKoAgOaTdaIgNSMqMIU61yRyzA==}
-
- '@types/babel__generator@7.27.0':
- resolution: {integrity: sha512-ufFd2Xi92OAVPYsy+P4n7/U7e68fex0+Ee8gSG9KX7eo084CWiQ4sdxktvdl0bOPupXtVJPY19zk6EwWqUQ8lg==}
-
- '@types/babel__template@7.4.4':
- resolution: {integrity: sha512-h/NUaSyG5EyxBIp8YRxo4RMe2/qQgvyowRwVMzhYhBCONbW8PUsg4lkFMrhgZhUe5z3L3MiLDuvyJ/CaPa2A8A==}
-
- '@types/babel__traverse@7.28.0':
- resolution: {integrity: sha512-8PvcXf70gTDZBgt9ptxJ8elBeBjcLOAcOtoO/mPJjtji1+CdGbHgm77om1GrsPxsiE+uXIpNSK64UYaIwQXd4Q==}
-
- '@types/graceful-fs@4.1.9':
- resolution: {integrity: sha512-olP3sd1qOEe5dXTSaFvQG+02VdRXcdytWLAZsAq1PecU8uqQAhkrnbli7DagjtXKW/Bl7YJbUsa8MPcuc8LHEQ==}
-
- '@types/hast@3.0.4':
- resolution: {integrity: sha512-WPs+bbQw5aCj+x6laNGWLH3wviHtoCv/P3+otBhbOhJgG8qtpdAMlTCxLtsTWA7LH1Oh/bFCHsBn0TPS5m30EQ==}
-
- '@types/istanbul-lib-coverage@2.0.6':
- resolution: {integrity: sha512-2QF/t/auWm0lsy8XtKVPG19v3sSOQlJe/YHZgfjb/KBBHOGSV+J2q/S671rcq9uTBrLAXmZpqJiaQbMT+zNU1w==}
-
- '@types/istanbul-lib-report@3.0.3':
- resolution: {integrity: sha512-NQn7AHQnk/RSLOxrBbGyJM/aVQ+pjj5HCgasFxc0K/KhoATfQ/47AyUl15I2yBUpihjmas+a+VJBOqecrFH+uA==}
-
- '@types/istanbul-reports@3.0.4':
- resolution: {integrity: sha512-pk2B1NWalF9toCRu6gjBzR69syFjP4Od8WRAX+0mmf9lAjCRicLOWc+ZrxZHx/0XRjotgkF9t6iaMJ+aXcOdZQ==}
-
- '@types/jest@29.5.14':
- resolution: {integrity: sha512-ZN+4sdnLUbo8EVvVc2ao0GFW6oVrQRPn4K2lglySj7APvSrgzxHiNNK99us4WDMi57xxA2yggblIAMNhXOotLQ==}
-
- '@types/node@22.19.1':
- resolution: {integrity: sha512-LCCV0HdSZZZb34qifBsyWlUmok6W7ouER+oQIGBScS8EsZsQbrtFTUrDX4hOl+CS6p7cnNC4td+qrSVGSCTUfQ==}
-
- '@types/stack-utils@2.0.3':
- resolution: {integrity: sha512-9aEbYZ3TbYMznPdcdr3SmIrLXwC/AKZXQeCf9Pgao5CKb8CyHuEX5jzWPTkvregvhRJHcpRO6BFoGW9ycaOkYw==}
-
- '@types/unist@3.0.3':
- resolution: {integrity: sha512-ko/gIFJRv177XgZsZcBwnqJN5x/Gien8qNOn0D5bQU/zAzVf9Zt3BlcUiLqhV9y4ARk0GbT3tnUiPNgnTXzc/Q==}
-
- '@types/yargs-parser@21.0.3':
- resolution: {integrity: sha512-I4q9QU9MQv4oEOz4tAHJtNz1cwuLxn2F3xcc2iV5WdqLPpUnj30aUuxt1mAxYTG+oe8CZMV/+6rU4S4gRDzqtQ==}
-
- '@types/yargs@17.0.35':
- resolution: {integrity: sha512-qUHkeCyQFxMXg79wQfTtfndEC+N9ZZg76HJftDJp+qH2tV7Gj4OJi7l+PiWwJ+pWtW8GwSmqsDj/oymhrTWXjg==}
-
- abort-controller@3.0.0:
- resolution: {integrity: sha512-h8lQ8tacZYnR3vNQTgibj+tODHI5/+l06Au2Pcriv/Gmet0eaj4TwWH41sO9wnHDiQsEj19q0drzdWdeAHtweg==}
- engines: {node: '>=6.5'}
-
- ansi-escapes@4.3.2:
- resolution: {integrity: sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ==}
- engines: {node: '>=8'}
-
- ansi-escapes@7.2.0:
- resolution: {integrity: sha512-g6LhBsl+GBPRWGWsBtutpzBYuIIdBkLEvad5C/va/74Db018+5TZiyA26cZJAr3Rft5lprVqOIPxf5Vid6tqAw==}
- engines: {node: '>=18'}
-
- ansi-regex@5.0.1:
- resolution: {integrity: sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==}
- engines: {node: '>=8'}
-
- ansi-regex@6.2.2:
- resolution: {integrity: sha512-Bq3SmSpyFHaWjPk8If9yc6svM8c56dB5BAtW4Qbw5jHTwwXXcTLoRMkpDJp6VL0XzlWaCHTXrkFURMYmD0sLqg==}
- engines: {node: '>=12'}
-
- ansi-styles@4.3.0:
- resolution: {integrity: sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==}
- engines: {node: '>=8'}
-
- ansi-styles@5.2.0:
- resolution: {integrity: sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==}
- engines: {node: '>=10'}
-
- ansi-styles@6.2.3:
- resolution: {integrity: sha512-4Dj6M28JB+oAH8kFkTLUo+a2jwOFkuqb3yucU0CANcRRUbxS0cP0nZYCGjcc3BNXwRIsUVmDGgzawme7zvJHvg==}
- engines: {node: '>=12'}
-
- anymatch@3.1.3:
- resolution: {integrity: sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==}
- engines: {node: '>= 8'}
-
- argparse@1.0.10:
- resolution: {integrity: sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==}
-
- argparse@2.0.1:
- resolution: {integrity: sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==}
-
- babel-jest@29.7.0:
- resolution: {integrity: sha512-BrvGY3xZSwEcCzKvKsCi2GgHqDqsYkOP4/by5xCgIwGXQxIEh+8ew3gmrE1y7XRR6LHZIj6yLYnUi/mm2KXKBg==}
- engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0}
- peerDependencies:
- '@babel/core': ^7.8.0
-
- babel-plugin-istanbul@6.1.1:
- resolution: {integrity: sha512-Y1IQok9821cC9onCx5otgFfRm7Lm+I+wwxOx738M/WLPZ9Q42m4IG5W0FNX8WLL2gYMZo3JkuXIH2DOpWM+qwA==}
- engines: {node: '>=8'}
-
- babel-plugin-jest-hoist@29.6.3:
- resolution: {integrity: sha512-ESAc/RJvGTFEzRwOTT4+lNDk/GNHMkKbNzsvT0qKRfDyyYTskxB5rnU2njIDYVxXCBHHEI1c0YwHob3WaYujOg==}
- engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0}
-
- babel-preset-current-node-syntax@1.2.0:
- resolution: {integrity: sha512-E/VlAEzRrsLEb2+dv8yp3bo4scof3l9nR4lrld+Iy5NyVqgVYUJnDAmunkhPMisRI32Qc4iRiz425d8vM++2fg==}
- peerDependencies:
- '@babel/core': ^7.0.0 || ^8.0.0-0
-
- babel-preset-jest@29.6.3:
- resolution: {integrity: sha512-0B3bhxR6snWXJZtR/RliHTDPRgn1sNHOR0yVtq/IiQFyuOVjFS+wuio/R4gSNkyYmKmJB4wGZv2NZanmKmTnNA==}
- engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0}
- peerDependencies:
- '@babel/core': ^7.0.0
-
- balanced-match@1.0.2:
- resolution: {integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==}
-
- base64-js@1.5.1:
- resolution: {integrity: sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==}
-
- baseline-browser-mapping@2.8.30:
- resolution: {integrity: sha512-aTUKW4ptQhS64+v2d6IkPzymEzzhw+G0bA1g3uBRV3+ntkH+svttKseW5IOR4Ed6NUVKqnY7qT3dKvzQ7io4AA==}
- hasBin: true
-
- brace-expansion@1.1.12:
- resolution: {integrity: sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg==}
-
- brace-expansion@2.0.2:
- resolution: {integrity: sha512-Jt0vHyM+jmUBqojB7E1NIYadt0vI0Qxjxd2TErW94wDz+E2LAm5vKMXXwg6ZZBTHPuUlDgQHKXvjGBdfcF1ZDQ==}
-
- braces@3.0.3:
- resolution: {integrity: sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==}
- engines: {node: '>=8'}
-
- browserslist@4.28.0:
- resolution: {integrity: sha512-tbydkR/CxfMwelN0vwdP/pLkDwyAASZ+VfWm4EOwlB6SWhx1sYnWLqo8N5j0rAzPfzfRaxt0mM/4wPU/Su84RQ==}
- engines: {node: ^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7}
- hasBin: true
-
- bs-logger@0.2.6:
- resolution: {integrity: sha512-pd8DCoxmbgc7hyPKOvxtqNcjYoOsABPQdcCUjGp3d42VR2CX1ORhk2A87oqqu5R1kk+76nsxZupkmyd+MVtCog==}
- engines: {node: '>= 6'}
-
- bser@2.1.1:
- resolution: {integrity: sha512-gQxTNE/GAfIIrmHLUE3oJyp5FO6HRBfhjnw4/wMmA63ZGDJnWBmgY/lyQBpnDUkGmAhbSe39tx2d/iTOAfglwQ==}
-
- buffer-from@1.1.2:
- resolution: {integrity: sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==}
-
- buffer@6.0.3:
- resolution: {integrity: sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA==}
-
- bundle-name@4.1.0:
- resolution: {integrity: sha512-tjwM5exMg6BGRI+kNmTntNsvdZS1X8BFYS6tnJ2hdH0kVxM6/eVZ2xy+FqStSWvYmtfFMDLIxurorHwDKfDz5Q==}
- engines: {node: '>=18'}
-
- callsites@3.1.0:
- resolution: {integrity: sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==}
- engines: {node: '>=6'}
-
- camelcase@5.3.1:
- resolution: {integrity: sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==}
- engines: {node: '>=6'}
-
- camelcase@6.3.0:
- resolution: {integrity: sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==}
- engines: {node: '>=10'}
-
- caniuse-lite@1.0.30001756:
- resolution: {integrity: sha512-4HnCNKbMLkLdhJz3TToeVWHSnfJvPaq6vu/eRP0Ahub/07n484XHhBF5AJoSGHdVrS8tKFauUQz8Bp9P7LVx7A==}
-
- chalk@4.1.2:
- resolution: {integrity: sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==}
- engines: {node: '>=10'}
-
- char-regex@1.0.2:
- resolution: {integrity: sha512-kWWXztvZ5SBQV+eRgKFeh8q5sLuZY2+8WUIzlxWVTg+oGwY14qylx1KbKzHd8P6ZYkAg0xyIDU9JMHhyJMZ1jw==}
- engines: {node: '>=10'}
-
- ci-info@3.9.0:
- resolution: {integrity: sha512-NIxF55hv4nSqQswkAeiOi1r83xy8JldOFDTWiug55KBu9Jnblncd2U6ViHmYgHf01TPZS77NJBhBMKdWj9HQMQ==}
- engines: {node: '>=8'}
-
- cjs-module-lexer@1.4.3:
- resolution: {integrity: sha512-9z8TZaGM1pfswYeXrUpzPrkx8UnWYdhJclsiYMm6x/w5+nN+8Tf/LnAgfLGQCm59qAOxU8WwHEq2vNwF6i4j+Q==}
-
- cli-cursor@5.0.0:
- resolution: {integrity: sha512-aCj4O5wKyszjMmDT4tZj93kxyydN/K5zPWSCe6/0AV/AA1pqe5ZBIw0a2ZfPQV7lL5/yb5HsUreJ6UFAF1tEQw==}
- engines: {node: '>=18'}
-
- cli-truncate@5.1.1:
- resolution: {integrity: sha512-SroPvNHxUnk+vIW/dOSfNqdy1sPEFkrTk6TUtqLCnBlo3N7TNYYkzzN7uSD6+jVjrdO4+p8nH7JzH6cIvUem6A==}
- engines: {node: '>=20'}
-
- cliui@8.0.1:
- resolution: {integrity: sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==}
- engines: {node: '>=12'}
-
- co@4.6.0:
- resolution: {integrity: sha512-QVb0dM5HvG+uaxitm8wONl7jltx8dqhfU33DcqtOZcLSVIKSDDLDi7+0LbAKiyI8hD9u42m2YxXSkMGWThaecQ==}
- engines: {iojs: '>= 1.0.0', node: '>= 0.12.0'}
-
- collect-v8-coverage@1.0.3:
- resolution: {integrity: sha512-1L5aqIkwPfiodaMgQunkF1zRhNqifHBmtbbbxcr6yVxxBnliw4TDOW6NxpO8DJLgJ16OT+Y4ztZqP6p/FtXnAw==}
-
- color-convert@2.0.1:
- resolution: {integrity: sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==}
- engines: {node: '>=7.0.0'}
-
- color-name@1.1.4:
- resolution: {integrity: sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==}
-
- colorette@2.0.20:
- resolution: {integrity: sha512-IfEDxwoWIjkeXL1eXcDiow4UbKjhLdq6/EuSVR9GMN7KVH3r9gQ83e73hsz1Nd1T3ijd5xv1wcWRYO+D6kCI2w==}
-
- commander@14.0.2:
- resolution: {integrity: sha512-TywoWNNRbhoD0BXs1P3ZEScW8W5iKrnbithIl0YH+uCmBd0QpPOA8yc82DS3BIE5Ma6FnBVUsJ7wVUDz4dvOWQ==}
- engines: {node: '>=20'}
-
- concat-map@0.0.1:
- resolution: {integrity: sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==}
-
- convert-source-map@2.0.0:
- resolution: {integrity: sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==}
-
- create-jest@29.7.0:
- resolution: {integrity: sha512-Adz2bdH0Vq3F53KEMJOoftQFutWCukm6J24wbPWRO4k1kMY7gS7ds/uoJkNuV8wDCtWWnuwGcJwpWcih+zEW1Q==}
- engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0}
- hasBin: true
-
- cross-spawn@7.0.6:
- resolution: {integrity: sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==}
- engines: {node: '>= 8'}
-
- crypto-random-string@4.0.0:
- resolution: {integrity: sha512-x8dy3RnvYdlUcPOjkEHqozhiwzKNSq7GcPuXFbnyMOCHxX8V3OgIg/pYuabl2sbUPfIJaeAQB7PMOK8DFIdoRA==}
- engines: {node: '>=12'}
-
- debug@4.4.3:
- resolution: {integrity: sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==}
- engines: {node: '>=6.0'}
- peerDependencies:
- supports-color: '*'
- peerDependenciesMeta:
- supports-color:
- optional: true
-
- declarative-shadow-dom-polyfill@0.4.1:
- resolution: {integrity: sha512-Zot41HbLiffkkPFnsi55lMOtPj2TuUXShtTad/Ih5IIM7Am5XoNlGSJrJGGIiS7tFxsU67nraD9OSWBOXAuSsg==}
- peerDependencies:
- typescript: '>=5.5.3'
-
- dedent@1.7.0:
- resolution: {integrity: sha512-HGFtf8yhuhGhqO07SV79tRp+br4MnbdjeVxotpn1QBl30pcLLCQjX5b2295ll0fv8RKDKsmWYrl05usHM9CewQ==}
- peerDependencies:
- babel-plugin-macros: ^3.1.0
- peerDependenciesMeta:
- babel-plugin-macros:
- optional: true
-
- deepmerge@4.3.1:
- resolution: {integrity: sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A==}
- engines: {node: '>=0.10.0'}
-
- default-browser-id@5.0.1:
- resolution: {integrity: sha512-x1VCxdX4t+8wVfd1so/9w+vQ4vx7lKd2Qp5tDRutErwmR85OgmfX7RlLRMWafRMY7hbEiXIbudNrjOAPa/hL8Q==}
- engines: {node: '>=18'}
-
- default-browser@5.4.0:
- resolution: {integrity: sha512-XDuvSq38Hr1MdN47EDvYtx3U0MTqpCEn+F6ft8z2vYDzMrvQhVp0ui9oQdqW3MvK3vqUETglt1tVGgjLuJ5izg==}
- engines: {node: '>=18'}
-
- define-lazy-prop@3.0.0:
- resolution: {integrity: sha512-N+MeXYoqr3pOgn8xfyRPREN7gHakLYjhsHhWGT3fWAiL4IkAt0iDw14QiiEm2bE30c5XX5q0FtAA3CK5f9/BUg==}
- engines: {node: '>=12'}
-
- detect-newline@3.1.0:
- resolution: {integrity: sha512-TLz+x/vEXm/Y7P7wn1EJFNLxYpUD4TgMosxY6fAVJUnJMbupHBOncxyWUG9OpTaH9EBD7uFI5LfEgmMOc54DsA==}
- engines: {node: '>=8'}
-
- diff-sequences@29.6.3:
- resolution: {integrity: sha512-EjePK1srD3P08o2j4f0ExnylqRs5B9tJjcp9t1krH2qRi8CCdsYfwe9JgSLurFBWwq4uOlipzfk5fHNvwFKr8Q==}
- engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0}
-
- electron-to-chromium@1.5.259:
- resolution: {integrity: sha512-I+oLXgpEJzD6Cwuwt1gYjxsDmu/S/Kd41mmLA3O+/uH2pFRO/DvOjUyGozL8j3KeLV6WyZ7ssPwELMsXCcsJAQ==}
-
- emittery@0.13.1:
- resolution: {integrity: sha512-DeWwawk6r5yR9jFgnDKYt4sLS0LmHJJi3ZOnb5/JdbYwj3nW+FxQnHIjhBKz8YLC7oRNPVM9NQ47I3CVx34eqQ==}
- engines: {node: '>=12'}
-
- emoji-regex@10.6.0:
- resolution: {integrity: sha512-toUI84YS5YmxW219erniWD0CIVOo46xGKColeNQRgOzDorgBi1v4D71/OFzgD9GO2UGKIv1C3Sp8DAn0+j5w7A==}
-
- emoji-regex@8.0.0:
- resolution: {integrity: sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==}
-
- entities@4.5.0:
- resolution: {integrity: sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==}
- engines: {node: '>=0.12'}
-
- environment@1.1.0:
- resolution: {integrity: sha512-xUtoPkMggbz0MPyPiIWr1Kp4aeWJjDZ6SMvURhimjdZgsRuDplF5/s9hcgGhyXMhs+6vpnuoiZ2kFiu3FMnS8Q==}
- engines: {node: '>=18'}
-
- error-ex@1.3.4:
- resolution: {integrity: sha512-sqQamAnR14VgCr1A618A3sGrygcpK+HEbenA/HiEAkkUwcZIIB/tgWqHFxWgOyDh4nB4JCRimh79dR5Ywc9MDQ==}
-
- escalade@3.2.0:
- resolution: {integrity: sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==}
- engines: {node: '>=6'}
-
- escape-string-regexp@2.0.0:
- resolution: {integrity: sha512-UpzcLCXolUWcNu5HtVMHYdXJjArjsF9C0aNnquZYY4uW/Vu0miy5YoWvbV345HauVvcAUnpRuhMMcqTcGOY2+w==}
- engines: {node: '>=8'}
-
- esprima@4.0.1:
- resolution: {integrity: sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==}
- engines: {node: '>=4'}
- hasBin: true
-
- event-target-shim@5.0.1:
- resolution: {integrity: sha512-i/2XbnSz/uxRCU6+NdVJgKWDTM427+MqYbkQzD321DuCQJUqOuJKIA0IM2+W2xtYHdKOmZ4dR6fExsd4SXL+WQ==}
- engines: {node: '>=6'}
-
- eventemitter3@5.0.1:
- resolution: {integrity: sha512-GWkBvjiSZK87ELrYOSESUYeVIc9mvLLf/nXalMOS5dYrgZq9o5OVkbZAVM06CVxYsCwH9BDZFPlQTlPA1j4ahA==}
-
- events@3.3.0:
- resolution: {integrity: sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==}
- engines: {node: '>=0.8.x'}
-
- execa@5.1.1:
- resolution: {integrity: sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==}
- engines: {node: '>=10'}
-
- exit@0.1.2:
- resolution: {integrity: sha512-Zk/eNKV2zbjpKzrsQ+n1G6poVbErQxJ0LBOJXaKZ1EViLzH+hrLu9cdXI4zw9dBQJslwBEpbQ2P1oS7nDxs6jQ==}
- engines: {node: '>= 0.8.0'}
-
- expect@29.7.0:
- resolution: {integrity: sha512-2Zks0hf1VLFYI1kbh0I5jP3KHHyCHpkfyHBzsSXRFgl/Bg9mWYfMW8oD+PdMPlEwy5HNsR9JutYy6pMeOh61nw==}
- engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0}
-
- fast-json-stable-stringify@2.1.0:
- resolution: {integrity: sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==}
-
- fb-watchman@2.0.2:
- resolution: {integrity: sha512-p5161BqbuCaSnB8jIbzQHOlpgsPmK5rJVDfDKO91Axs5NC1uu3HRQm6wt9cd9/+GtQQIO53JdGXXoyDpTAsgYA==}
-
- file-type@18.7.0:
- resolution: {integrity: sha512-ihHtXRzXEziMrQ56VSgU7wkxh55iNchFkosu7Y9/S+tXHdKyrGjVK0ujbqNnsxzea+78MaLhN6PGmfYSAv1ACw==}
- engines: {node: '>=14.16'}
-
- fill-range@7.1.1:
- resolution: {integrity: sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==}
- engines: {node: '>=8'}
-
- find-up@4.1.0:
- resolution: {integrity: sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==}
- engines: {node: '>=8'}
-
- fs.realpath@1.0.0:
- resolution: {integrity: sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==}
-
- fsevents@2.3.3:
- resolution: {integrity: sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==}
- engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0}
- os: [darwin]
-
- function-bind@1.1.2:
- resolution: {integrity: sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==}
-
- gensync@1.0.0-beta.2:
- resolution: {integrity: sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==}
- engines: {node: '>=6.9.0'}
-
- get-caller-file@2.0.5:
- resolution: {integrity: sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==}
- engines: {node: 6.* || 8.* || >= 10.*}
-
- get-east-asian-width@1.4.0:
- resolution: {integrity: sha512-QZjmEOC+IT1uk6Rx0sX22V6uHWVwbdbxf1faPqJ1QhLdGgsRGCZoyaQBm/piRdJy/D2um6hM1UP7ZEeQ4EkP+Q==}
- engines: {node: '>=18'}
-
- get-package-type@0.1.0:
- resolution: {integrity: sha512-pjzuKtY64GYfWizNAJ0fr9VqttZkNiK2iS430LtIHzjBEr6bX8Am2zm4sW4Ro5wjWW5cAlRL1qAMTcXbjNAO2Q==}
- engines: {node: '>=8.0.0'}
-
- get-stdin@9.0.0:
- resolution: {integrity: sha512-dVKBjfWisLAicarI2Sf+JuBE/DghV4UzNAVe9yhEJuzeREd3JhOTE9cUaJTeSa77fsbQUK3pcOpJfM59+VKZaA==}
- engines: {node: '>=12'}
-
- get-stream@6.0.1:
- resolution: {integrity: sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==}
- engines: {node: '>=10'}
-
- glob@7.2.3:
- resolution: {integrity: sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==}
- deprecated: Glob versions prior to v9 are no longer supported
-
- graceful-fs@4.2.11:
- resolution: {integrity: sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==}
-
- handlebars@4.7.8:
- resolution: {integrity: sha512-vafaFqs8MZkRrSX7sFVUdo3ap/eNiLnb4IakshzvP56X5Nr1iGKAIqdX6tMlm6HcNRIkr6AxO5jFEoJzzpT8aQ==}
- engines: {node: '>=0.4.7'}
- hasBin: true
-
- happy-dom@14.12.3:
- resolution: {integrity: sha512-vsYlEs3E9gLwA1Hp+w3qzu+RUDFf4VTT8cyKqVICoZ2k7WM++Qyd2LwzyTi5bqMJFiIC/vNpTDYuxdreENRK/g==}
- engines: {node: '>=16.0.0'}
-
- has-flag@4.0.0:
- resolution: {integrity: sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==}
- engines: {node: '>=8'}
-
- hasown@2.0.2:
- resolution: {integrity: sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==}
- engines: {node: '>= 0.4'}
-
- html-escaper@2.0.2:
- resolution: {integrity: sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg==}
-
- human-signals@2.1.0:
- resolution: {integrity: sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==}
- engines: {node: '>=10.17.0'}
-
- husky@9.1.7:
- resolution: {integrity: sha512-5gs5ytaNjBrh5Ow3zrvdUUY+0VxIuWVL4i9irt6friV+BqdCfmV11CQTWMiBYWHbXhco+J1kHfTOUkePhCDvMA==}
- engines: {node: '>=18'}
- hasBin: true
-
- ieee754@1.2.1:
- resolution: {integrity: sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==}
-
- import-local@3.2.0:
- resolution: {integrity: sha512-2SPlun1JUPWoM6t3F0dw0FkCF/jWY8kttcY4f599GLTSjh2OCuuhdTkJQsEcZzBqbXZGKMK2OqW1oZsjtf/gQA==}
- engines: {node: '>=8'}
- hasBin: true
-
- imurmurhash@0.1.4:
- resolution: {integrity: sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==}
- engines: {node: '>=0.8.19'}
-
- inflight@1.0.6:
- resolution: {integrity: sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==}
- deprecated: This module is not supported, and leaks memory. Do not use it. Check out lru-cache if you want a good and tested way to coalesce async requests by a key value, which is much more comprehensive and powerful.
-
- inherits@2.0.4:
- resolution: {integrity: sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==}
-
- is-arrayish@0.2.1:
- resolution: {integrity: sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==}
-
- is-core-module@2.16.1:
- resolution: {integrity: sha512-UfoeMA6fIJ8wTYFEUjelnaGI67v6+N7qXJEvQuIGa99l4xsCruSYOVSQ0uPANn4dAzm8lkYPaKLrrijLq7x23w==}
- engines: {node: '>= 0.4'}
-
- is-docker@3.0.0:
- resolution: {integrity: sha512-eljcgEDlEns/7AXFosB5K/2nCM4P7FQPkGc/DWLy5rmFEWvZayGrik1d9/QIY5nJ4f9YsVvBkA6kJpHn9rISdQ==}
- engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0}
- hasBin: true
-
- is-fullwidth-code-point@3.0.0:
- resolution: {integrity: sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==}
- engines: {node: '>=8'}
-
- is-fullwidth-code-point@5.1.0:
- resolution: {integrity: sha512-5XHYaSyiqADb4RnZ1Bdad6cPp8Toise4TzEjcOYDHZkTCbKgiUl7WTUCpNWHuxmDt91wnsZBc9xinNzopv3JMQ==}
- engines: {node: '>=18'}
-
- is-generator-fn@2.1.0:
- resolution: {integrity: sha512-cTIB4yPYL/Grw0EaSzASzg6bBy9gqCofvWN8okThAYIxKJZC+udlRAmGbM0XLeniEJSs8uEgHPGuHSe1XsOLSQ==}
- engines: {node: '>=6'}
-
- is-inside-container@1.0.0:
- resolution: {integrity: sha512-KIYLCCJghfHZxqjYBE7rEy0OBuTd5xCHS7tHVgvCLkx7StIoaxwNW3hCALgEUjFfeRk+MG/Qxmp/vtETEF3tRA==}
- engines: {node: '>=14.16'}
- hasBin: true
-
- is-number@7.0.0:
- resolution: {integrity: sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==}
- engines: {node: '>=0.12.0'}
-
- is-stream@2.0.1:
- resolution: {integrity: sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==}
- engines: {node: '>=8'}
-
- is-stream@3.0.0:
- resolution: {integrity: sha512-LnQR4bZ9IADDRSkvpqMGvt/tEJWclzklNgSw48V5EAaAeDd6qGvN8ei6k5p0tvxSR171VmGyHuTiAOfxAbr8kA==}
- engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0}
-
- is-wsl@3.1.0:
- resolution: {integrity: sha512-UcVfVfaK4Sc4m7X3dUSoHoozQGBEFeDC+zVo06t98xe8CzHSZZBekNXH+tu0NalHolcJ/QAGqS46Hef7QXBIMw==}
- engines: {node: '>=16'}
-
- isexe@2.0.0:
- resolution: {integrity: sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==}
-
- istanbul-lib-coverage@3.2.2:
- resolution: {integrity: sha512-O8dpsF+r0WV/8MNRKfnmrtCWhuKjxrq2w+jpzBL5UZKTi2LeVWnWOmWRxFlesJONmc+wLAGvKQZEOanko0LFTg==}
- engines: {node: '>=8'}
-
- istanbul-lib-instrument@5.2.1:
- resolution: {integrity: sha512-pzqtp31nLv/XFOzXGuvhCb8qhjmTVo5vjVk19XE4CRlSWz0KoeJ3bw9XsA7nOp9YBf4qHjwBxkDzKcME/J29Yg==}
- engines: {node: '>=8'}
-
- istanbul-lib-instrument@6.0.3:
- resolution: {integrity: sha512-Vtgk7L/R2JHyyGW07spoFlB8/lpjiOLTjMdms6AFMraYt3BaJauod/NGrfnVG/y4Ix1JEuMRPDPEj2ua+zz1/Q==}
- engines: {node: '>=10'}
-
- istanbul-lib-report@3.0.1:
- resolution: {integrity: sha512-GCfE1mtsHGOELCU8e/Z7YWzpmybrx/+dSTfLrvY8qRmaY6zXTKWn6WQIjaAFw069icm6GVMNkgu0NzI4iPZUNw==}
- engines: {node: '>=10'}
-
- istanbul-lib-source-maps@4.0.1:
- resolution: {integrity: sha512-n3s8EwkdFIJCG3BPKBYvskgXGoy88ARzvegkitk60NxRdwltLOTaH7CUiMRXvwYorl0Q712iEjcWB+fK/MrWVw==}
- engines: {node: '>=10'}
-
- istanbul-reports@3.2.0:
- resolution: {integrity: sha512-HGYWWS/ehqTV3xN10i23tkPkpH46MLCIMFNCaaKNavAXTF1RkqxawEPtnjnGZ6XKSInBKkiOA5BKS+aZiY3AvA==}
- engines: {node: '>=8'}
-
- jest-changed-files@29.7.0:
- resolution: {integrity: sha512-fEArFiwf1BpQ+4bXSprcDc3/x4HSzL4al2tozwVpDFpsxALjLYdyiIK4e5Vz66GQJIbXJ82+35PtysofptNX2w==}
- engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0}
-
- jest-circus@29.7.0:
- resolution: {integrity: sha512-3E1nCMgipcTkCocFwM90XXQab9bS+GMsjdpmPrlelaxwD93Ad8iVEjX/vvHPdLPnFf+L40u+5+iutRdA1N9myw==}
- engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0}
-
- jest-cli@29.7.0:
- resolution: {integrity: sha512-OVVobw2IubN/GSYsxETi+gOe7Ka59EFMR/twOU3Jb2GnKKeMGJB5SGUUrEz3SFVmJASUdZUzy83sLNNQ2gZslg==}
- engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0}
- hasBin: true
- peerDependencies:
- node-notifier: ^8.0.1 || ^9.0.0 || ^10.0.0
- peerDependenciesMeta:
- node-notifier:
- optional: true
-
- jest-config@29.7.0:
- resolution: {integrity: sha512-uXbpfeQ7R6TZBqI3/TxCU4q4ttk3u0PJeC+E0zbfSoSjq6bJ7buBPxzQPL0ifrkY4DNu4JUdk0ImlBUYi840eQ==}
- engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0}
- peerDependencies:
- '@types/node': '*'
- ts-node: '>=9.0.0'
- peerDependenciesMeta:
- '@types/node':
- optional: true
- ts-node:
- optional: true
-
- jest-diff@29.7.0:
- resolution: {integrity: sha512-LMIgiIrhigmPrs03JHpxUh2yISK3vLFPkAodPeo0+BuF7wA2FoQbkEg1u8gBYBThncu7e1oEDUfIXVuTqLRUjw==}
- engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0}
-
- jest-docblock@29.7.0:
- resolution: {integrity: sha512-q617Auw3A612guyaFgsbFeYpNP5t2aoUNLwBUbc/0kD1R4t9ixDbyFTHd1nok4epoVFpr7PmeWHrhvuV3XaJ4g==}
- engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0}
-
- jest-each@29.7.0:
- resolution: {integrity: sha512-gns+Er14+ZrEoC5fhOfYCY1LOHHr0TI+rQUHZS8Ttw2l7gl+80eHc/gFf2Ktkw0+SIACDTeWvpFcv3B04VembQ==}
- engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0}
-
- jest-environment-node@29.7.0:
- resolution: {integrity: sha512-DOSwCRqXirTOyheM+4d5YZOrWcdu0LNZ87ewUoywbcb2XR4wKgqiG8vNeYwhjFMbEkfju7wx2GYH0P2gevGvFw==}
- engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0}
-
- jest-get-type@29.6.3:
- resolution: {integrity: sha512-zrteXnqYxfQh7l5FHyL38jL39di8H8rHoecLH3JNxH3BwOrBsNeabdap5e0I23lD4HHI8W5VFBZqG4Eaq5LNcw==}
- engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0}
-
- jest-haste-map@29.7.0:
- resolution: {integrity: sha512-fP8u2pyfqx0K1rGn1R9pyE0/KTn+G7PxktWidOBTqFPLYX0b9ksaMFkhK5vrS3DVun09pckLdlx90QthlW7AmA==}
- engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0}
-
- jest-leak-detector@29.7.0:
- resolution: {integrity: sha512-kYA8IJcSYtST2BY9I+SMC32nDpBT3J2NvWJx8+JCuCdl/CR1I4EKUJROiP8XtCcxqgTTBGJNdbB1A8XRKbTetw==}
- engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0}
-
- jest-matcher-utils@29.7.0:
- resolution: {integrity: sha512-sBkD+Xi9DtcChsI3L3u0+N0opgPYnCRPtGcQYrgXmR+hmt/fYfWAL0xRXYU8eWOdfuLgBe0YCW3AFtnRLagq/g==}
- engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0}
-
- jest-message-util@29.7.0:
- resolution: {integrity: sha512-GBEV4GRADeP+qtB2+6u61stea8mGcOT4mCtrYISZwfu9/ISHFJ/5zOMXYbpBE9RsS5+Gb63DW4FgmnKJ79Kf6w==}
- engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0}
-
- jest-mock@29.7.0:
- resolution: {integrity: sha512-ITOMZn+UkYS4ZFh83xYAOzWStloNzJFO2s8DWrE4lhtGD+AorgnbkiKERe4wQVBydIGPx059g6riW5Btp6Llnw==}
- engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0}
-
- jest-pnp-resolver@1.2.3:
- resolution: {integrity: sha512-+3NpwQEnRoIBtx4fyhblQDPgJI0H1IEIkX7ShLUjPGA7TtUTvI1oiKi3SR4oBR0hQhQR80l4WAe5RrXBwWMA8w==}
- engines: {node: '>=6'}
- peerDependencies:
- jest-resolve: '*'
- peerDependenciesMeta:
- jest-resolve:
- optional: true
-
- jest-regex-util@29.6.3:
- resolution: {integrity: sha512-KJJBsRCyyLNWCNBOvZyRDnAIfUiRJ8v+hOBQYGn8gDyF3UegwiP4gwRR3/SDa42g1YbVycTidUF3rKjyLFDWbg==}
- engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0}
-
- jest-resolve-dependencies@29.7.0:
- resolution: {integrity: sha512-un0zD/6qxJ+S0et7WxeI3H5XSe9lTBBR7bOHCHXkKR6luG5mwDDlIzVQ0V5cZCuoTgEdcdwzTghYkTWfubi+nA==}
- engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0}
-
- jest-resolve@29.7.0:
- resolution: {integrity: sha512-IOVhZSrg+UvVAshDSDtHyFCCBUl/Q3AAJv8iZ6ZjnZ74xzvwuzLXid9IIIPgTnY62SJjfuupMKZsZQRsCvxEgA==}
- engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0}
-
- jest-runner@29.7.0:
- resolution: {integrity: sha512-fsc4N6cPCAahybGBfTRcq5wFR6fpLznMg47sY5aDpsoejOcVYFb07AHuSnR0liMcPTgBsA3ZJL6kFOjPdoNipQ==}
- engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0}
-
- jest-runtime@29.7.0:
- resolution: {integrity: sha512-gUnLjgwdGqW7B4LvOIkbKs9WGbn+QLqRQQ9juC6HndeDiezIwhDP+mhMwHWCEcfQ5RUXa6OPnFF8BJh5xegwwQ==}
- engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0}
-
- jest-snapshot@29.7.0:
- resolution: {integrity: sha512-Rm0BMWtxBcioHr1/OX5YCP8Uov4riHvKPknOGs804Zg9JGZgmIBkbtlxJC/7Z4msKYVbIJtfU+tKb8xlYNfdkw==}
- engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0}
-
- jest-util@29.7.0:
- resolution: {integrity: sha512-z6EbKajIpqGKU56y5KBUgy1dt1ihhQJgWzUlZHArA/+X2ad7Cb5iF+AK1EWVL/Bo7Rz9uurpqw6SiBCefUbCGA==}
- engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0}
-
- jest-validate@29.7.0:
- resolution: {integrity: sha512-ZB7wHqaRGVw/9hST/OuFUReG7M8vKeq0/J2egIGLdvjHCmYqGARhzXmtgi+gVeZ5uXFF219aOc3Ls2yLg27tkw==}
- engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0}
-
- jest-watcher@29.7.0:
- resolution: {integrity: sha512-49Fg7WXkU3Vl2h6LbLtMQ/HyB6rXSIX7SqvBLQmssRBGN9I0PNvPmAmCWSOY6SOvrjhI/F7/bGAv9RtnsPA03g==}
- engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0}
-
- jest-worker@29.7.0:
- resolution: {integrity: sha512-eIz2msL/EzL9UFTFFx7jBTkeZfku0yUAyZZZmJ93H2TYEiroIx2PQjEXcwYtYl8zXCxb+PAmA2hLIt/6ZEkPHw==}
- engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0}
-
- jest@29.7.0:
- resolution: {integrity: sha512-NIy3oAFp9shda19hy4HK0HRTWKtPJmGdnvywu01nOqNC2vZg+Z+fvJDxpMQA88eb2I9EcafcdjYgsDthnYTvGw==}
- engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0}
- hasBin: true
- peerDependencies:
- node-notifier: ^8.0.1 || ^9.0.0 || ^10.0.0
- peerDependenciesMeta:
- node-notifier:
- optional: true
-
- js-tokens@4.0.0:
- resolution: {integrity: sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==}
-
- js-yaml@3.14.2:
- resolution: {integrity: sha512-PMSmkqxr106Xa156c2M265Z+FTrPl+oxd/rgOQy2tijQeK5TxQ43psO1ZCwhVOSdnn+RzkzlRz/eY4BgJBYVpg==}
- hasBin: true
-
- jsesc@3.1.0:
- resolution: {integrity: sha512-/sM3dO2FOzXjKQhJuo0Q173wf2KOo8t4I8vHy6lF9poUp7bKT0/NHE8fPX23PwfhnykfqnC2xRxOnVw5XuGIaA==}
- engines: {node: '>=6'}
- hasBin: true
-
- json-parse-even-better-errors@2.3.1:
- resolution: {integrity: sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==}
-
- json5@2.2.3:
- resolution: {integrity: sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==}
- engines: {node: '>=6'}
- hasBin: true
-
- kleur@3.0.3:
- resolution: {integrity: sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w==}
- engines: {node: '>=6'}
-
- leven@3.1.0:
- resolution: {integrity: sha512-qsda+H8jTaUaN/x5vzW2rzc+8Rw4TAQ/4KjB46IwK5VH+IlVeeeje/EoZRpiXvIqjFgK84QffqPztGI3VBLG1A==}
- engines: {node: '>=6'}
-
- lines-and-columns@1.2.4:
- resolution: {integrity: sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==}
-
- linkify-it@5.0.0:
- resolution: {integrity: sha512-5aHCbzQRADcdP+ATqnDuhhJ/MRIqDkZX5pyjFHRRysS8vZ5AbqGEoFIb6pYHPZ+L/OC2Lc+xT8uHVVR5CAK/wQ==}
-
- lint-staged@16.2.7:
- resolution: {integrity: sha512-lDIj4RnYmK7/kXMya+qJsmkRFkGolciXjrsZ6PC25GdTfWOAWetR0ZbsNXRAj1EHHImRSalc+whZFg56F5DVow==}
- engines: {node: '>=20.17'}
- hasBin: true
-
- listr2@9.0.5:
- resolution: {integrity: sha512-ME4Fb83LgEgwNw96RKNvKV4VTLuXfoKudAmm2lP8Kk87KaMK0/Xrx/aAkMWmT8mDb+3MlFDspfbCs7adjRxA2g==}
- engines: {node: '>=20.0.0'}
-
- locate-path@5.0.0:
- resolution: {integrity: sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==}
- engines: {node: '>=8'}
-
- lodash.memoize@4.1.2:
- resolution: {integrity: sha512-t7j+NzmgnQzTAYXcsHYLgimltOV1MXHtlOWf6GjL9Kj8GK5FInw5JotxvbOs+IvV1/Dzo04/fCGfLVs7aXb4Ag==}
-
- log-update@6.1.0:
- resolution: {integrity: sha512-9ie8ItPR6tjY5uYJh8K/Zrv/RMZ5VOlOWvtZdEHYSTFKZfIBPQa9tOAEeAWhd+AnIneLJ22w5fjOYtoutpWq5w==}
- engines: {node: '>=18'}
-
- lru-cache@5.1.1:
- resolution: {integrity: sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==}
-
- lunr@2.3.9:
- resolution: {integrity: sha512-zTU3DaZaF3Rt9rhN3uBMGQD3dD2/vFQqnvZCDv4dl5iOzq2IZQqTxu90r4E5J+nP70J3ilqVCrbho2eWaeW8Ow==}
-
- make-dir@4.0.0:
- resolution: {integrity: sha512-hXdUTZYIVOt1Ex//jAQi+wTZZpUpwBj/0QsOzqegb3rGMMeJiSEu5xLHnYfBrRV4RH2+OCSOO95Is/7x1WJ4bw==}
- engines: {node: '>=10'}
-
- make-error@1.3.6:
- resolution: {integrity: sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw==}
-
- makeerror@1.0.12:
- resolution: {integrity: sha512-JmqCvUhmt43madlpFzG4BQzG2Z3m6tvQDNKdClZnO3VbIudJYmxsT0FNJMeiB2+JTSlTQTSbU8QdesVmwJcmLg==}
-
- markdown-it@14.1.0:
- resolution: {integrity: sha512-a54IwgWPaeBCAAsv13YgmALOF1elABB08FxO9i+r4VFk5Vl4pKokRPeX8u5TCgSsPi6ec1otfLjdOpVcgbpshg==}
- hasBin: true
-
- mdurl@2.0.0:
- resolution: {integrity: sha512-Lf+9+2r+Tdp5wXDXC4PcIBjTDtq4UKjCPMQhKIuzpJNW0b96kVqSwW0bT7FhRSfmAiFYgP+SCRvdrDozfh0U5w==}
-
- meow@12.1.1:
- resolution: {integrity: sha512-BhXM0Au22RwUneMPwSCnyhTOizdWoIEPU9sp0Aqa1PnDMR5Wv2FGXYDjuzJEIX+Eo2Rb8xuYe5jrnm5QowQFkw==}
- engines: {node: '>=16.10'}
-
- merge-stream@2.0.0:
- resolution: {integrity: sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==}
-
- micromatch@4.0.8:
- resolution: {integrity: sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==}
- engines: {node: '>=8.6'}
-
- mimic-fn@2.1.0:
- resolution: {integrity: sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==}
- engines: {node: '>=6'}
-
- mimic-function@5.0.1:
- resolution: {integrity: sha512-VP79XUPxV2CigYP3jWwAUFSku2aKqBH7uTAapFWCBqutsbmDo96KY5o8uh6U+/YSIn5OxJnXp73beVkpqMIGhA==}
- engines: {node: '>=18'}
-
- minimatch@3.1.2:
- resolution: {integrity: sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==}
-
- minimatch@9.0.5:
- resolution: {integrity: sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==}
- engines: {node: '>=16 || 14 >=14.17'}
-
- minimist@1.2.8:
- resolution: {integrity: sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==}
-
- ms@2.1.3:
- resolution: {integrity: sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==}
-
- nano-spawn@2.0.0:
- resolution: {integrity: sha512-tacvGzUY5o2D8CBh2rrwxyNojUsZNU2zjNTzKQrkgGJQTbGAfArVWXSKMBokBeeg6C7OLRGUEyoFlYbfeWQIqw==}
- engines: {node: '>=20.17'}
-
- natural-compare@1.4.0:
- resolution: {integrity: sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==}
-
- neo-async@2.6.2:
- resolution: {integrity: sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==}
-
- node-int64@0.4.0:
- resolution: {integrity: sha512-O5lz91xSOeoXP6DulyHfllpq+Eg00MWitZIbtPfoSEvqIHdl5gfcY6hYzDWnj0qD5tz52PI08u9qUvSVeUBeHw==}
-
- node-releases@2.0.27:
- resolution: {integrity: sha512-nmh3lCkYZ3grZvqcCH+fjmQ7X+H0OeZgP40OierEaAptX4XofMh5kwNbWh7lBduUzCcV/8kZ+NDLCwm2iorIlA==}
-
- normalize-path@3.0.0:
- resolution: {integrity: sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==}
- engines: {node: '>=0.10.0'}
-
- npm-run-path@4.0.1:
- resolution: {integrity: sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==}
- engines: {node: '>=8'}
-
- once@1.4.0:
- resolution: {integrity: sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==}
-
- onetime@5.1.2:
- resolution: {integrity: sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==}
- engines: {node: '>=6'}
-
- onetime@7.0.0:
- resolution: {integrity: sha512-VXJjc87FScF88uafS3JllDgvAm+c/Slfz06lorj2uAY34rlUu0Nt+v8wreiImcrgAjjIHp1rXpTDlLOGw29WwQ==}
- engines: {node: '>=18'}
-
- open-cli@8.0.0:
- resolution: {integrity: sha512-3muD3BbfLyzl+aMVSEfn2FfOqGdPYR0O4KNnxXsLEPE2q9OSjBfJAaB6XKbrUzLgymoSMejvb5jpXJfru/Ko2A==}
- engines: {node: '>=18'}
- hasBin: true
-
- open@10.2.0:
- resolution: {integrity: sha512-YgBpdJHPyQ2UE5x+hlSXcnejzAvD0b22U2OuAP+8OnlJT+PjWPxtgmGqKKc+RgTM63U9gN0YzrYc71R2WT/hTA==}
- engines: {node: '>=18'}
-
- p-limit@2.3.0:
- resolution: {integrity: sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==}
- engines: {node: '>=6'}
-
- p-limit@3.1.0:
- resolution: {integrity: sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==}
- engines: {node: '>=10'}
-
- p-locate@4.1.0:
- resolution: {integrity: sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==}
- engines: {node: '>=8'}
-
- p-try@2.2.0:
- resolution: {integrity: sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==}
- engines: {node: '>=6'}
-
- parse-json@5.2.0:
- resolution: {integrity: sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==}
- engines: {node: '>=8'}
-
- path-exists@4.0.0:
- resolution: {integrity: sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==}
- engines: {node: '>=8'}
-
- path-is-absolute@1.0.1:
- resolution: {integrity: sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==}
- engines: {node: '>=0.10.0'}
-
- path-key@3.1.1:
- resolution: {integrity: sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==}
- engines: {node: '>=8'}
-
- path-parse@1.0.7:
- resolution: {integrity: sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==}
-
- peek-readable@5.4.2:
- resolution: {integrity: sha512-peBp3qZyuS6cNIJ2akRNG1uo1WJ1d0wTxg/fxMdZ0BqCVhx242bSFHM9eNqflfJVS9SsgkzgT/1UgnsurBOTMg==}
- engines: {node: '>=14.16'}
-
- picocolors@1.1.1:
- resolution: {integrity: sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==}
-
- picomatch@2.3.1:
- resolution: {integrity: sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==}
- engines: {node: '>=8.6'}
-
- pidtree@0.6.0:
- resolution: {integrity: sha512-eG2dWTVw5bzqGRztnHExczNxt5VGsE6OwTeCG3fdUf9KBsZzO3R5OIIIzWR+iZA0NtZ+RDVdaoE2dK1cn6jH4g==}
- engines: {node: '>=0.10'}
- hasBin: true
-
- pirates@4.0.7:
- resolution: {integrity: sha512-TfySrs/5nm8fQJDcBDuUng3VOUKsd7S+zqvbOTiGXHfxX4wK31ard+hoNuvkicM/2YFzlpDgABOevKSsB4G/FA==}
- engines: {node: '>= 6'}
-
- pkg-dir@4.2.0:
- resolution: {integrity: sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==}
- engines: {node: '>=8'}
-
- prettier@3.6.2:
- resolution: {integrity: sha512-I7AIg5boAr5R0FFtJ6rCfD+LFsWHp81dolrFD8S79U9tb8Az2nGrJncnMSnys+bpQJfRUzqs9hnA81OAA3hCuQ==}
- engines: {node: '>=14'}
- hasBin: true
-
- pretty-format@29.7.0:
- resolution: {integrity: sha512-Pdlw/oPxN+aXdmM9R00JVC9WVFoCLTKJvDVLgmJ+qAffBMxsV85l/Lu7sNx4zSzPyoL2euImuEwHhOXdEgNFZQ==}
- engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0}
-
- process@0.11.10:
- resolution: {integrity: sha512-cdGef/drWFoydD1JsMzuFf8100nZl+GT+yacc2bEced5f9Rjk4z+WtFUTBu9PhOi9j/jfmBPu0mMEY4wIdAF8A==}
- engines: {node: '>= 0.6.0'}
-
- prompts@2.4.2:
- resolution: {integrity: sha512-NxNv/kLguCA7p3jE8oL2aEBsrJWgAakBpgmgK6lpPWV+WuOmY6r2/zbAVnP+T8bQlA0nzHXSJSJW0Hq7ylaD2Q==}
- engines: {node: '>= 6'}
-
- punycode.js@2.3.1:
- resolution: {integrity: sha512-uxFIHU0YlHYhDQtV4R9J6a52SLx28BCjT+4ieh7IGbgwVJWO+km431c4yRlREUAsAmt/uMjQUyQHNEPf0M39CA==}
- engines: {node: '>=6'}
-
- pure-rand@6.1.0:
- resolution: {integrity: sha512-bVWawvoZoBYpp6yIoQtQXHZjmz35RSVHnUOTefl8Vcjr8snTPY1wnpSPMWekcFwbxI6gtmT7rSYPFvz71ldiOA==}
-
- react-is@18.3.1:
- resolution: {integrity: sha512-/LLMVyas0ljjAtoYiPqYiL8VWXzUUdThrmU5+n20DZv+a+ClRoevUzw5JxU+Ieh5/c87ytoTBV9G1FiKfNJdmg==}
-
- readable-stream@4.7.0:
- resolution: {integrity: sha512-oIGGmcpTLwPga8Bn6/Z75SVaH1z5dUut2ibSyAMVhmUggWpmDn2dapB0n7f8nwaSiRtepAsfJyfXIO5DCVAODg==}
- engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0}
-
- readable-web-to-node-stream@3.0.4:
- resolution: {integrity: sha512-9nX56alTf5bwXQ3ZDipHJhusu9NTQJ/CVPtb/XHAJCXihZeitfJvIRS4GqQ/mfIoOE3IelHMrpayVrosdHBuLw==}
- engines: {node: '>=8'}
-
- regenerator-runtime@0.14.1:
- resolution: {integrity: sha512-dYnhHh0nJoMfnkZs6GmmhFknAGRrLznOu5nc9ML+EJxGvrx6H7teuevqVqCuPcPK//3eDrrjQhehXVx9cnkGdw==}
-
- require-directory@2.1.1:
- resolution: {integrity: sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==}
- engines: {node: '>=0.10.0'}
-
- resolve-cwd@3.0.0:
- resolution: {integrity: sha512-OrZaX2Mb+rJCpH/6CpSqt9xFVpN++x01XnN2ie9g6P5/3xelLAkXWVADpdz1IHD/KFfEXyE6V0U01OQ3UO2rEg==}
- engines: {node: '>=8'}
-
- resolve-from@5.0.0:
- resolution: {integrity: sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==}
- engines: {node: '>=8'}
-
- resolve.exports@2.0.3:
- resolution: {integrity: sha512-OcXjMsGdhL4XnbShKpAcSqPMzQoYkYyhbEaeSko47MjRP9NfEQMhZkXL1DoFlt9LWQn4YttrdnV6X2OiyzBi+A==}
- engines: {node: '>=10'}
-
- resolve@1.22.11:
- resolution: {integrity: sha512-RfqAvLnMl313r7c9oclB1HhUEAezcpLjz95wFH4LVuhk9JF/r22qmVP9AMmOU4vMX7Q8pN8jwNg/CSpdFnMjTQ==}
- engines: {node: '>= 0.4'}
- hasBin: true
-
- restore-cursor@5.1.0:
- resolution: {integrity: sha512-oMA2dcrw6u0YfxJQXm342bFKX/E4sG9rbTzO9ptUcR/e8A33cHuvStiYOwH7fszkZlZ1z/ta9AAoPk2F4qIOHA==}
- engines: {node: '>=18'}
-
- rfdc@1.4.1:
- resolution: {integrity: sha512-q1b3N5QkRUWUl7iyylaaj3kOpIT0N2i9MqIEQXP73GVsN9cw3fdx8X63cEmWhJGi2PPCF23Ijp7ktmd39rawIA==}
-
- run-applescript@7.1.0:
- resolution: {integrity: sha512-DPe5pVFaAsinSaV6QjQ6gdiedWDcRCbUuiQfQa2wmWV7+xC9bGulGI8+TdRmoFkAPaBXk8CrAbnlY2ISniJ47Q==}
- engines: {node: '>=18'}
-
- safe-buffer@5.2.1:
- resolution: {integrity: sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==}
-
- scheduler-polyfill@1.3.0:
- resolution: {integrity: sha512-bIjhi/KJqo08wrq+K2rlB6HNPh871KgREPpVti4zv0mSY1dCi3qr0rRCw+SGHc8/gtKceev29sN//lf6KiYa/g==}
-
- semver@6.3.1:
- resolution: {integrity: sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==}
- hasBin: true
-
- semver@7.7.3:
- resolution: {integrity: sha512-SdsKMrI9TdgjdweUSR9MweHA4EJ8YxHn8DFaDisvhVlUOe4BF1tLD7GAj0lIqWVl+dPb/rExr0Btby5loQm20Q==}
- engines: {node: '>=10'}
- hasBin: true
-
- shebang-command@2.0.0:
- resolution: {integrity: sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==}
- engines: {node: '>=8'}
-
- shebang-regex@3.0.0:
- resolution: {integrity: sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==}
- engines: {node: '>=8'}
-
- signal-exit@3.0.7:
- resolution: {integrity: sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==}
-
- signal-exit@4.1.0:
- resolution: {integrity: sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==}
- engines: {node: '>=14'}
-
- sisteransi@1.0.5:
- resolution: {integrity: sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg==}
-
- slash@3.0.0:
- resolution: {integrity: sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==}
- engines: {node: '>=8'}
-
- slice-ansi@7.1.2:
- resolution: {integrity: sha512-iOBWFgUX7caIZiuutICxVgX1SdxwAVFFKwt1EvMYYec/NWO5meOJ6K5uQxhrYBdQJne4KxiqZc+KptFOWFSI9w==}
- engines: {node: '>=18'}
-
- source-map-support@0.5.13:
- resolution: {integrity: sha512-SHSKFHadjVA5oR4PPqhtAVdcBWwRYVd6g6cAXnIbRiIwc2EhPrTuKUBdSLvlEKyIP3GCf89fltvcZiP9MMFA1w==}
-
- source-map@0.6.1:
- resolution: {integrity: sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==}
- engines: {node: '>=0.10.0'}
-
- sprintf-js@1.0.3:
- resolution: {integrity: sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==}
-
- stack-utils@2.0.6:
- resolution: {integrity: sha512-XlkWvfIm6RmsWtNJx+uqtKLS8eqFbxUg0ZzLXqY0caEy9l7hruX8IpiDnjsLavoBgqCCR71TqWO8MaXYheJ3RQ==}
- engines: {node: '>=10'}
-
- string-argv@0.3.2:
- resolution: {integrity: sha512-aqD2Q0144Z+/RqG52NeHEkZauTAUWJO8c6yTftGJKO3Tja5tUgIfmIl6kExvhtxSDP7fXB6DvzkfMpCd/F3G+Q==}
- engines: {node: '>=0.6.19'}
-
- string-length@4.0.2:
- resolution: {integrity: sha512-+l6rNN5fYHNhZZy41RXsYptCjA2Igmq4EG7kZAYFQI1E1VTXarr6ZPXBg6eq7Y6eK4FEhY6AJlyuFIb/v/S0VQ==}
- engines: {node: '>=10'}
-
- string-width@4.2.3:
- resolution: {integrity: sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==}
- engines: {node: '>=8'}
-
- string-width@7.2.0:
- resolution: {integrity: sha512-tsaTIkKW9b4N+AEj+SVA+WhJzV7/zMhcSu78mLKWSk7cXMOSHsBKFWUs0fWwq8QyK3MgJBQRX6Gbi4kYbdvGkQ==}
- engines: {node: '>=18'}
-
- string-width@8.1.0:
- resolution: {integrity: sha512-Kxl3KJGb/gxkaUMOjRsQ8IrXiGW75O4E3RPjFIINOVH8AMl2SQ/yWdTzWwF3FevIX9LcMAjJW+GRwAlAbTSXdg==}
- engines: {node: '>=20'}
-
- string_decoder@1.3.0:
- resolution: {integrity: sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==}
-
- strip-ansi@6.0.1:
- resolution: {integrity: sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==}
- engines: {node: '>=8'}
-
- strip-ansi@7.1.2:
- resolution: {integrity: sha512-gmBGslpoQJtgnMAvOVqGZpEz9dyoKTCzy2nfz/n8aIFhN/jCE/rCmcxabB6jOOHV+0WNnylOxaxBQPSvcWklhA==}
- engines: {node: '>=12'}
-
- strip-bom@4.0.0:
- resolution: {integrity: sha512-3xurFv5tEgii33Zi8Jtp55wEIILR9eh34FAW00PZf+JnSsTmV/ioewSgQl97JHvgjoRGwPShsWm+IdrxB35d0w==}
- engines: {node: '>=8'}
-
- strip-final-newline@2.0.0:
- resolution: {integrity: sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==}
- engines: {node: '>=6'}
-
- strip-json-comments@3.1.1:
- resolution: {integrity: sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==}
- engines: {node: '>=8'}
-
- strtok3@7.1.1:
- resolution: {integrity: sha512-mKX8HA/cdBqMKUr0MMZAFssCkIGoZeSCMXgnt79yKxNFguMLVFgRe6wB+fsL0NmoHDbeyZXczy7vEPSoo3rkzg==}
- engines: {node: '>=16'}
-
- supports-color@7.2.0:
- resolution: {integrity: sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==}
- engines: {node: '>=8'}
-
- supports-color@8.1.1:
- resolution: {integrity: sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==}
- engines: {node: '>=10'}
-
- supports-preserve-symlinks-flag@1.0.0:
- resolution: {integrity: sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==}
- engines: {node: '>= 0.4'}
-
- temp-dir@3.0.0:
- resolution: {integrity: sha512-nHc6S/bwIilKHNRgK/3jlhDoIHcp45YgyiwcAk46Tr0LfEqGBVpmiAyuiuxeVE44m3mXnEeVhaipLOEWmH+Njw==}
- engines: {node: '>=14.16'}
-
- tempy@3.1.0:
- resolution: {integrity: sha512-7jDLIdD2Zp0bDe5r3D2qtkd1QOCacylBuL7oa4udvN6v2pqr4+LcCr67C8DR1zkpaZ8XosF5m1yQSabKAW6f2g==}
- engines: {node: '>=14.16'}
-
- test-exclude@6.0.0:
- resolution: {integrity: sha512-cAGWPIyOHU6zlmg88jwm7VRyXnMN7iV68OGAbYDk/Mh/xC/pzVPlQtY6ngoIH/5/tciuhGfvESU8GrHrcxD56w==}
- engines: {node: '>=8'}
-
- tmpl@1.0.5:
- resolution: {integrity: sha512-3f0uOEAQwIqGuWW2MVzYg8fV/QNnc/IpuJNG837rLuczAaLVHslWHZQj4IGiEl5Hs3kkbhwL9Ab7Hrsmuj+Smw==}
-
- to-regex-range@5.0.1:
- resolution: {integrity: sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==}
- engines: {node: '>=8.0'}
-
- token-types@5.0.1:
- resolution: {integrity: sha512-Y2fmSnZjQdDb9W4w4r1tswlMHylzWIeOKpx0aZH9BgGtACHhrk3OkT52AzwcuqTRBZtvvnTjDBh8eynMulu8Vg==}
- engines: {node: '>=14.16'}
-
- ts-jest@29.4.5:
- resolution: {integrity: sha512-HO3GyiWn2qvTQA4kTgjDcXiMwYQt68a1Y8+JuLRVpdIzm+UOLSHgl/XqR4c6nzJkq5rOkjc02O2I7P7l/Yof0Q==}
- engines: {node: ^14.15.0 || ^16.10.0 || ^18.0.0 || >=20.0.0}
- hasBin: true
- peerDependencies:
- '@babel/core': '>=7.0.0-beta.0 <8'
- '@jest/transform': ^29.0.0 || ^30.0.0
- '@jest/types': ^29.0.0 || ^30.0.0
- babel-jest: ^29.0.0 || ^30.0.0
- esbuild: '*'
- jest: ^29.0.0 || ^30.0.0
- jest-util: ^29.0.0 || ^30.0.0
- typescript: '>=4.3 <6'
- peerDependenciesMeta:
- '@babel/core':
- optional: true
- '@jest/transform':
- optional: true
- '@jest/types':
- optional: true
- babel-jest:
- optional: true
- esbuild:
- optional: true
- jest-util:
- optional: true
-
- tslib@2.8.1:
- resolution: {integrity: sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==}
-
- type-detect@4.0.8:
- resolution: {integrity: sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g==}
- engines: {node: '>=4'}
-
- type-fest@0.21.3:
- resolution: {integrity: sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w==}
- engines: {node: '>=10'}
-
- type-fest@1.4.0:
- resolution: {integrity: sha512-yGSza74xk0UG8k+pLh5oeoYirvIiWo5t0/o3zHHAO2tRDiZcxWP7fywNlXhqb6/r6sWvwi+RsyQMWhVLe4BVuA==}
- engines: {node: '>=10'}
-
- type-fest@2.19.0:
- resolution: {integrity: sha512-RAH822pAdBgcNMAfWnCBU3CFZcfZ/i1eZjwFU/dsLKumyuuP3niueg2UAukXYF0E2AAoc82ZSSf9J0WQBinzHA==}
- engines: {node: '>=12.20'}
-
- type-fest@4.41.0:
- resolution: {integrity: sha512-TeTSQ6H5YHvpqVwBRcnLDCBnDOHWYu7IvGbHT6N8AOymcr9PJGjc1GTtiWZTYg0NCgYwvnYWEkVChQAr9bjfwA==}
- engines: {node: '>=16'}
-
- typedoc-plugin-mdn-links@5.0.10:
- resolution: {integrity: sha512-TOMj1+fyhqhdJaMwfkw7ANz+0KHjRVUnE/SorPW83wghElmsMxxCZhDSBgF2hRB9+qsf/qIjDw65RDay94E2Wg==}
- peerDependencies:
- typedoc: 0.27.x || 0.28.x
-
- typedoc@0.28.14:
- resolution: {integrity: sha512-ftJYPvpVfQvFzpkoSfHLkJybdA/geDJ8BGQt/ZnkkhnBYoYW6lBgPQXu6vqLxO4X75dA55hX8Af847H5KXlEFA==}
- engines: {node: '>= 18', pnpm: '>= 10'}
- hasBin: true
- peerDependencies:
- typescript: 5.0.x || 5.1.x || 5.2.x || 5.3.x || 5.4.x || 5.5.x || 5.6.x || 5.7.x || 5.8.x || 5.9.x
-
- typescript@5.9.3:
- resolution: {integrity: sha512-jl1vZzPDinLr9eUt3J/t7V6FgNEw9QjvBPdysz9KfQDD41fQrC2Y4vKQdiaUpFT4bXlb1RHhLpp8wtm6M5TgSw==}
- engines: {node: '>=14.17'}
- hasBin: true
-
- uc.micro@2.1.0:
- resolution: {integrity: sha512-ARDJmphmdvUk6Glw7y9DQ2bFkKBHwQHLi2lsaH6PPmz/Ka9sFOBsBluozhDltWmnv9u/cF6Rt87znRTPV+yp/A==}
-
- uglify-js@3.19.3:
- resolution: {integrity: sha512-v3Xu+yuwBXisp6QYTcH4UbH+xYJXqnq2m/LtQVWKWzYc1iehYnLixoQDN9FH6/j9/oybfd6W9Ghwkl8+UMKTKQ==}
- engines: {node: '>=0.8.0'}
- hasBin: true
-
- undici-types@6.21.0:
- resolution: {integrity: sha512-iwDZqg0QAGrg9Rav5H4n0M64c3mkR59cJ6wQp+7C4nI0gsmExaedaYLNO44eT4AtBBwjbTiGPMlt2Md0T9H9JQ==}
-
- unique-string@3.0.0:
- resolution: {integrity: sha512-VGXBUVwxKMBUznyffQweQABPRRW1vHZAbadFZud4pLFAqRGvv/96vafgjWFqzourzr8YonlQiPgH0YCJfawoGQ==}
- engines: {node: '>=12'}
-
- update-browserslist-db@1.1.4:
- resolution: {integrity: sha512-q0SPT4xyU84saUX+tomz1WLkxUbuaJnR1xWt17M7fJtEJigJeWUNGUqrauFXsHnqev9y9JTRGwk13tFBuKby4A==}
- hasBin: true
- peerDependencies:
- browserslist: '>= 4.21.0'
-
- v8-to-istanbul@9.3.0:
- resolution: {integrity: sha512-kiGUalWN+rgBJ/1OHZsBtU4rXZOfj/7rKQxULKlIzwzQSvMJUUNgPwJEEh7gU6xEVxC0ahoOBvN2YI8GH6FNgA==}
- engines: {node: '>=10.12.0'}
-
- walker@1.0.8:
- resolution: {integrity: sha512-ts/8E8l5b7kY0vlWLewOkDXMmPdLcVV4GmOQLyxuSswIJsweeFZtAsMF7k1Nszz+TYBQrlYRmzOnr398y1JemQ==}
-
- web-streams-polyfill@4.2.0:
- resolution: {integrity: sha512-0rYDzGOh9EZpig92umN5g5D/9A1Kff7k0/mzPSSCY8jEQeYkgRMoY7LhbXtUCWzLCMX0TUE9aoHkjFNB7D9pfA==}
- engines: {node: '>= 8'}
-
- web-utility@4.6.4:
- resolution: {integrity: sha512-nPZfFROLtQ6VJaoT0DKEtJ4YfBffg8altB7rl99XgscJPXZ5e7Mxj+ovqdLmjOTdAtEuCexKiyuxzg/m6qHcCg==}
- peerDependencies:
- element-internals-polyfill: '>=1'
- typescript: '>=4.1'
-
- webidl-conversions@7.0.0:
- resolution: {integrity: sha512-VwddBukDzu71offAQR975unBIGqfKZpM+8ZX6ySk8nYhVoo5CYaZyzt3YBvYtRtO+aoGlqxPg/B87NGVZ/fu6g==}
- engines: {node: '>=12'}
-
- whatwg-mimetype@3.0.0:
- resolution: {integrity: sha512-nt+N2dzIutVRxARx1nghPKGv1xHikU7HKdfafKkLNLindmPU/ch3U31NOCGGA/dmPcmb1VlofO0vnKAcsm0o/Q==}
- engines: {node: '>=12'}
-
- which@2.0.2:
- resolution: {integrity: sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==}
- engines: {node: '>= 8'}
- hasBin: true
-
- wordwrap@1.0.0:
- resolution: {integrity: sha512-gvVzJFlPycKc5dZN4yPkP8w7Dc37BtP1yczEneOb4uq34pXZcvrtRTmWV8W+Ume+XCxKgbjM+nevkyFPMybd4Q==}
-
- wrap-ansi@7.0.0:
- resolution: {integrity: sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==}
- engines: {node: '>=10'}
-
- wrap-ansi@9.0.2:
- resolution: {integrity: sha512-42AtmgqjV+X1VpdOfyTGOYRi0/zsoLqtXQckTmqTeybT+BDIbM/Guxo7x3pE2vtpr1ok6xRqM9OpBe+Jyoqyww==}
- engines: {node: '>=18'}
-
- wrappy@1.0.2:
- resolution: {integrity: sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==}
-
- write-file-atomic@4.0.2:
- resolution: {integrity: sha512-7KxauUdBmSdWnmpaGFg+ppNjKF8uNLry8LyzjauQDOVONfFLNKrKvQOxZ/VuTIcS/gge/YNahf5RIIQWTSarlg==}
- engines: {node: ^12.13.0 || ^14.15.0 || >=16.0.0}
-
- wsl-utils@0.1.0:
- resolution: {integrity: sha512-h3Fbisa2nKGPxCpm89Hk33lBLsnaGBvctQopaBSOW/uIs6FTe1ATyAnKFJrzVs9vpGdsTe73WF3V4lIsk4Gacw==}
- engines: {node: '>=18'}
-
- y18n@5.0.8:
- resolution: {integrity: sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==}
- engines: {node: '>=10'}
-
- yallist@3.1.1:
- resolution: {integrity: sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==}
-
- yaml@2.8.1:
- resolution: {integrity: sha512-lcYcMxX2PO9XMGvAJkJ3OsNMw+/7FKes7/hgerGUYWIoWu5j/+YQqcZr5JnPZWzOsEBgMbSbiSTn/dv/69Mkpw==}
- engines: {node: '>= 14.6'}
- hasBin: true
-
- yargs-parser@21.1.1:
- resolution: {integrity: sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==}
- engines: {node: '>=12'}
-
- yargs@17.7.2:
- resolution: {integrity: sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==}
- engines: {node: '>=12'}
-
- yocto-queue@0.1.0:
- resolution: {integrity: sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==}
- engines: {node: '>=10'}
-
-snapshots:
-
- '@babel/code-frame@7.27.1':
- dependencies:
- '@babel/helper-validator-identifier': 7.28.5
- js-tokens: 4.0.0
- picocolors: 1.1.1
-
- '@babel/compat-data@7.28.5': {}
-
- '@babel/core@7.28.5':
- dependencies:
- '@babel/code-frame': 7.27.1
- '@babel/generator': 7.28.5
- '@babel/helper-compilation-targets': 7.27.2
- '@babel/helper-module-transforms': 7.28.3(@babel/core@7.28.5)
- '@babel/helpers': 7.28.4
- '@babel/parser': 7.28.5
- '@babel/template': 7.27.2
- '@babel/traverse': 7.28.5
- '@babel/types': 7.28.5
- '@jridgewell/remapping': 2.3.5
- convert-source-map: 2.0.0
- debug: 4.4.3
- gensync: 1.0.0-beta.2
- json5: 2.2.3
- semver: 6.3.1
- transitivePeerDependencies:
- - supports-color
-
- '@babel/generator@7.28.5':
- dependencies:
- '@babel/parser': 7.28.5
- '@babel/types': 7.28.5
- '@jridgewell/gen-mapping': 0.3.13
- '@jridgewell/trace-mapping': 0.3.31
- jsesc: 3.1.0
-
- '@babel/helper-compilation-targets@7.27.2':
- dependencies:
- '@babel/compat-data': 7.28.5
- '@babel/helper-validator-option': 7.27.1
- browserslist: 4.28.0
- lru-cache: 5.1.1
- semver: 6.3.1
-
- '@babel/helper-globals@7.28.0': {}
-
- '@babel/helper-module-imports@7.27.1':
- dependencies:
- '@babel/traverse': 7.28.5
- '@babel/types': 7.28.5
- transitivePeerDependencies:
- - supports-color
-
- '@babel/helper-module-transforms@7.28.3(@babel/core@7.28.5)':
- dependencies:
- '@babel/core': 7.28.5
- '@babel/helper-module-imports': 7.27.1
- '@babel/helper-validator-identifier': 7.28.5
- '@babel/traverse': 7.28.5
- transitivePeerDependencies:
- - supports-color
-
- '@babel/helper-plugin-utils@7.27.1': {}
-
- '@babel/helper-string-parser@7.27.1': {}
-
- '@babel/helper-validator-identifier@7.28.5': {}
-
- '@babel/helper-validator-option@7.27.1': {}
-
- '@babel/helpers@7.28.4':
- dependencies:
- '@babel/template': 7.27.2
- '@babel/types': 7.28.5
-
- '@babel/parser@7.28.5':
- dependencies:
- '@babel/types': 7.28.5
-
- '@babel/plugin-syntax-async-generators@7.8.4(@babel/core@7.28.5)':
- dependencies:
- '@babel/core': 7.28.5
- '@babel/helper-plugin-utils': 7.27.1
-
- '@babel/plugin-syntax-bigint@7.8.3(@babel/core@7.28.5)':
- dependencies:
- '@babel/core': 7.28.5
- '@babel/helper-plugin-utils': 7.27.1
-
- '@babel/plugin-syntax-class-properties@7.12.13(@babel/core@7.28.5)':
- dependencies:
- '@babel/core': 7.28.5
- '@babel/helper-plugin-utils': 7.27.1
-
- '@babel/plugin-syntax-class-static-block@7.14.5(@babel/core@7.28.5)':
- dependencies:
- '@babel/core': 7.28.5
- '@babel/helper-plugin-utils': 7.27.1
-
- '@babel/plugin-syntax-import-attributes@7.27.1(@babel/core@7.28.5)':
- dependencies:
- '@babel/core': 7.28.5
- '@babel/helper-plugin-utils': 7.27.1
-
- '@babel/plugin-syntax-import-meta@7.10.4(@babel/core@7.28.5)':
- dependencies:
- '@babel/core': 7.28.5
- '@babel/helper-plugin-utils': 7.27.1
-
- '@babel/plugin-syntax-json-strings@7.8.3(@babel/core@7.28.5)':
- dependencies:
- '@babel/core': 7.28.5
- '@babel/helper-plugin-utils': 7.27.1
-
- '@babel/plugin-syntax-jsx@7.27.1(@babel/core@7.28.5)':
- dependencies:
- '@babel/core': 7.28.5
- '@babel/helper-plugin-utils': 7.27.1
-
- '@babel/plugin-syntax-logical-assignment-operators@7.10.4(@babel/core@7.28.5)':
- dependencies:
- '@babel/core': 7.28.5
- '@babel/helper-plugin-utils': 7.27.1
-
- '@babel/plugin-syntax-nullish-coalescing-operator@7.8.3(@babel/core@7.28.5)':
- dependencies:
- '@babel/core': 7.28.5
- '@babel/helper-plugin-utils': 7.27.1
-
- '@babel/plugin-syntax-numeric-separator@7.10.4(@babel/core@7.28.5)':
- dependencies:
- '@babel/core': 7.28.5
- '@babel/helper-plugin-utils': 7.27.1
-
- '@babel/plugin-syntax-object-rest-spread@7.8.3(@babel/core@7.28.5)':
- dependencies:
- '@babel/core': 7.28.5
- '@babel/helper-plugin-utils': 7.27.1
-
- '@babel/plugin-syntax-optional-catch-binding@7.8.3(@babel/core@7.28.5)':
- dependencies:
- '@babel/core': 7.28.5
- '@babel/helper-plugin-utils': 7.27.1
-
- '@babel/plugin-syntax-optional-chaining@7.8.3(@babel/core@7.28.5)':
- dependencies:
- '@babel/core': 7.28.5
- '@babel/helper-plugin-utils': 7.27.1
-
- '@babel/plugin-syntax-private-property-in-object@7.14.5(@babel/core@7.28.5)':
- dependencies:
- '@babel/core': 7.28.5
- '@babel/helper-plugin-utils': 7.27.1
-
- '@babel/plugin-syntax-top-level-await@7.14.5(@babel/core@7.28.5)':
- dependencies:
- '@babel/core': 7.28.5
- '@babel/helper-plugin-utils': 7.27.1
-
- '@babel/plugin-syntax-typescript@7.27.1(@babel/core@7.28.5)':
- dependencies:
- '@babel/core': 7.28.5
- '@babel/helper-plugin-utils': 7.27.1
-
- '@babel/template@7.27.2':
- dependencies:
- '@babel/code-frame': 7.27.1
- '@babel/parser': 7.28.5
- '@babel/types': 7.28.5
-
- '@babel/traverse@7.28.5':
- dependencies:
- '@babel/code-frame': 7.27.1
- '@babel/generator': 7.28.5
- '@babel/helper-globals': 7.28.0
- '@babel/parser': 7.28.5
- '@babel/template': 7.27.2
- '@babel/types': 7.28.5
- debug: 4.4.3
- transitivePeerDependencies:
- - supports-color
-
- '@babel/types@7.28.5':
- dependencies:
- '@babel/helper-string-parser': 7.27.1
- '@babel/helper-validator-identifier': 7.28.5
-
- '@bcoe/v8-coverage@0.2.3': {}
-
- '@gerrit0/mini-shiki@3.15.0':
- dependencies:
- '@shikijs/engine-oniguruma': 3.15.0
- '@shikijs/langs': 3.15.0
- '@shikijs/themes': 3.15.0
- '@shikijs/types': 3.15.0
- '@shikijs/vscode-textmate': 10.0.2
-
- '@happy-dom/jest-environment@14.12.3':
- dependencies:
- '@jest/environment': 29.7.0
- '@jest/fake-timers': 29.7.0
- '@jest/types': 29.6.3
- happy-dom: 14.12.3
- jest-mock: 29.7.0
- jest-util: 29.7.0
-
- '@istanbuljs/load-nyc-config@1.1.0':
- dependencies:
- camelcase: 5.3.1
- find-up: 4.1.0
- get-package-type: 0.1.0
- js-yaml: 3.14.2
- resolve-from: 5.0.0
-
- '@istanbuljs/schema@0.1.3': {}
-
- '@jest/console@29.7.0':
- dependencies:
- '@jest/types': 29.6.3
- '@types/node': 22.19.1
- chalk: 4.1.2
- jest-message-util: 29.7.0
- jest-util: 29.7.0
- slash: 3.0.0
-
- '@jest/core@29.7.0':
- dependencies:
- '@jest/console': 29.7.0
- '@jest/reporters': 29.7.0
- '@jest/test-result': 29.7.0
- '@jest/transform': 29.7.0
- '@jest/types': 29.6.3
- '@types/node': 22.19.1
- ansi-escapes: 4.3.2
- chalk: 4.1.2
- ci-info: 3.9.0
- exit: 0.1.2
- graceful-fs: 4.2.11
- jest-changed-files: 29.7.0
- jest-config: 29.7.0(@types/node@22.19.1)
- jest-haste-map: 29.7.0
- jest-message-util: 29.7.0
- jest-regex-util: 29.6.3
- jest-resolve: 29.7.0
- jest-resolve-dependencies: 29.7.0
- jest-runner: 29.7.0
- jest-runtime: 29.7.0
- jest-snapshot: 29.7.0
- jest-util: 29.7.0
- jest-validate: 29.7.0
- jest-watcher: 29.7.0
- micromatch: 4.0.8
- pretty-format: 29.7.0
- slash: 3.0.0
- strip-ansi: 6.0.1
- transitivePeerDependencies:
- - babel-plugin-macros
- - supports-color
- - ts-node
-
- '@jest/environment@29.7.0':
- dependencies:
- '@jest/fake-timers': 29.7.0
- '@jest/types': 29.6.3
- '@types/node': 22.19.1
- jest-mock: 29.7.0
-
- '@jest/expect-utils@29.7.0':
- dependencies:
- jest-get-type: 29.6.3
-
- '@jest/expect@29.7.0':
- dependencies:
- expect: 29.7.0
- jest-snapshot: 29.7.0
- transitivePeerDependencies:
- - supports-color
-
- '@jest/fake-timers@29.7.0':
- dependencies:
- '@jest/types': 29.6.3
- '@sinonjs/fake-timers': 10.3.0
- '@types/node': 22.19.1
- jest-message-util: 29.7.0
- jest-mock: 29.7.0
- jest-util: 29.7.0
-
- '@jest/globals@29.7.0':
- dependencies:
- '@jest/environment': 29.7.0
- '@jest/expect': 29.7.0
- '@jest/types': 29.6.3
- jest-mock: 29.7.0
- transitivePeerDependencies:
- - supports-color
-
- '@jest/reporters@29.7.0':
- dependencies:
- '@bcoe/v8-coverage': 0.2.3
- '@jest/console': 29.7.0
- '@jest/test-result': 29.7.0
- '@jest/transform': 29.7.0
- '@jest/types': 29.6.3
- '@jridgewell/trace-mapping': 0.3.31
- '@types/node': 22.19.1
- chalk: 4.1.2
- collect-v8-coverage: 1.0.3
- exit: 0.1.2
- glob: 7.2.3
- graceful-fs: 4.2.11
- istanbul-lib-coverage: 3.2.2
- istanbul-lib-instrument: 6.0.3
- istanbul-lib-report: 3.0.1
- istanbul-lib-source-maps: 4.0.1
- istanbul-reports: 3.2.0
- jest-message-util: 29.7.0
- jest-util: 29.7.0
- jest-worker: 29.7.0
- slash: 3.0.0
- string-length: 4.0.2
- strip-ansi: 6.0.1
- v8-to-istanbul: 9.3.0
- transitivePeerDependencies:
- - supports-color
-
- '@jest/schemas@29.6.3':
- dependencies:
- '@sinclair/typebox': 0.27.8
-
- '@jest/source-map@29.6.3':
- dependencies:
- '@jridgewell/trace-mapping': 0.3.31
- callsites: 3.1.0
- graceful-fs: 4.2.11
-
- '@jest/test-result@29.7.0':
- dependencies:
- '@jest/console': 29.7.0
- '@jest/types': 29.6.3
- '@types/istanbul-lib-coverage': 2.0.6
- collect-v8-coverage: 1.0.3
-
- '@jest/test-sequencer@29.7.0':
- dependencies:
- '@jest/test-result': 29.7.0
- graceful-fs: 4.2.11
- jest-haste-map: 29.7.0
- slash: 3.0.0
-
- '@jest/transform@29.7.0':
- dependencies:
- '@babel/core': 7.28.5
- '@jest/types': 29.6.3
- '@jridgewell/trace-mapping': 0.3.31
- babel-plugin-istanbul: 6.1.1
- chalk: 4.1.2
- convert-source-map: 2.0.0
- fast-json-stable-stringify: 2.1.0
- graceful-fs: 4.2.11
- jest-haste-map: 29.7.0
- jest-regex-util: 29.6.3
- jest-util: 29.7.0
- micromatch: 4.0.8
- pirates: 4.0.7
- slash: 3.0.0
- write-file-atomic: 4.0.2
- transitivePeerDependencies:
- - supports-color
-
- '@jest/types@29.6.3':
- dependencies:
- '@jest/schemas': 29.6.3
- '@types/istanbul-lib-coverage': 2.0.6
- '@types/istanbul-reports': 3.0.4
- '@types/node': 22.19.1
- '@types/yargs': 17.0.35
- chalk: 4.1.2
-
- '@jridgewell/gen-mapping@0.3.13':
- dependencies:
- '@jridgewell/sourcemap-codec': 1.5.5
- '@jridgewell/trace-mapping': 0.3.31
-
- '@jridgewell/remapping@2.3.5':
- dependencies:
- '@jridgewell/gen-mapping': 0.3.13
- '@jridgewell/trace-mapping': 0.3.31
-
- '@jridgewell/resolve-uri@3.1.2': {}
-
- '@jridgewell/sourcemap-codec@1.5.5': {}
-
- '@jridgewell/trace-mapping@0.3.31':
- dependencies:
- '@jridgewell/resolve-uri': 3.1.2
- '@jridgewell/sourcemap-codec': 1.5.5
-
- '@shikijs/engine-oniguruma@3.15.0':
- dependencies:
- '@shikijs/types': 3.15.0
- '@shikijs/vscode-textmate': 10.0.2
-
- '@shikijs/langs@3.15.0':
- dependencies:
- '@shikijs/types': 3.15.0
-
- '@shikijs/themes@3.15.0':
- dependencies:
- '@shikijs/types': 3.15.0
-
- '@shikijs/types@3.15.0':
- dependencies:
- '@shikijs/vscode-textmate': 10.0.2
- '@types/hast': 3.0.4
-
- '@shikijs/vscode-textmate@10.0.2': {}
-
- '@sinclair/typebox@0.27.8': {}
-
- '@sinonjs/commons@3.0.1':
- dependencies:
- type-detect: 4.0.8
-
- '@sinonjs/fake-timers@10.3.0':
- dependencies:
- '@sinonjs/commons': 3.0.1
-
- '@swc/helpers@0.5.17':
- dependencies:
- tslib: 2.8.1
-
- '@tokenizer/token@0.3.0': {}
-
- '@types/babel__core@7.20.5':
- dependencies:
- '@babel/parser': 7.28.5
- '@babel/types': 7.28.5
- '@types/babel__generator': 7.27.0
- '@types/babel__template': 7.4.4
- '@types/babel__traverse': 7.28.0
-
- '@types/babel__generator@7.27.0':
- dependencies:
- '@babel/types': 7.28.5
-
- '@types/babel__template@7.4.4':
- dependencies:
- '@babel/parser': 7.28.5
- '@babel/types': 7.28.5
-
- '@types/babel__traverse@7.28.0':
- dependencies:
- '@babel/types': 7.28.5
-
- '@types/graceful-fs@4.1.9':
- dependencies:
- '@types/node': 22.19.1
-
- '@types/hast@3.0.4':
- dependencies:
- '@types/unist': 3.0.3
-
- '@types/istanbul-lib-coverage@2.0.6': {}
-
- '@types/istanbul-lib-report@3.0.3':
- dependencies:
- '@types/istanbul-lib-coverage': 2.0.6
-
- '@types/istanbul-reports@3.0.4':
- dependencies:
- '@types/istanbul-lib-report': 3.0.3
-
- '@types/jest@29.5.14':
- dependencies:
- expect: 29.7.0
- pretty-format: 29.7.0
-
- '@types/node@22.19.1':
- dependencies:
- undici-types: 6.21.0
-
- '@types/stack-utils@2.0.3': {}
-
- '@types/unist@3.0.3': {}
-
- '@types/yargs-parser@21.0.3': {}
-
- '@types/yargs@17.0.35':
- dependencies:
- '@types/yargs-parser': 21.0.3
-
- abort-controller@3.0.0:
- dependencies:
- event-target-shim: 5.0.1
-
- ansi-escapes@4.3.2:
- dependencies:
- type-fest: 0.21.3
-
- ansi-escapes@7.2.0:
- dependencies:
- environment: 1.1.0
-
- ansi-regex@5.0.1: {}
-
- ansi-regex@6.2.2: {}
-
- ansi-styles@4.3.0:
- dependencies:
- color-convert: 2.0.1
-
- ansi-styles@5.2.0: {}
-
- ansi-styles@6.2.3: {}
-
- anymatch@3.1.3:
- dependencies:
- normalize-path: 3.0.0
- picomatch: 2.3.1
-
- argparse@1.0.10:
- dependencies:
- sprintf-js: 1.0.3
-
- argparse@2.0.1: {}
-
- babel-jest@29.7.0(@babel/core@7.28.5):
- dependencies:
- '@babel/core': 7.28.5
- '@jest/transform': 29.7.0
- '@types/babel__core': 7.20.5
- babel-plugin-istanbul: 6.1.1
- babel-preset-jest: 29.6.3(@babel/core@7.28.5)
- chalk: 4.1.2
- graceful-fs: 4.2.11
- slash: 3.0.0
- transitivePeerDependencies:
- - supports-color
-
- babel-plugin-istanbul@6.1.1:
- dependencies:
- '@babel/helper-plugin-utils': 7.27.1
- '@istanbuljs/load-nyc-config': 1.1.0
- '@istanbuljs/schema': 0.1.3
- istanbul-lib-instrument: 5.2.1
- test-exclude: 6.0.0
- transitivePeerDependencies:
- - supports-color
-
- babel-plugin-jest-hoist@29.6.3:
- dependencies:
- '@babel/template': 7.27.2
- '@babel/types': 7.28.5
- '@types/babel__core': 7.20.5
- '@types/babel__traverse': 7.28.0
-
- babel-preset-current-node-syntax@1.2.0(@babel/core@7.28.5):
- dependencies:
- '@babel/core': 7.28.5
- '@babel/plugin-syntax-async-generators': 7.8.4(@babel/core@7.28.5)
- '@babel/plugin-syntax-bigint': 7.8.3(@babel/core@7.28.5)
- '@babel/plugin-syntax-class-properties': 7.12.13(@babel/core@7.28.5)
- '@babel/plugin-syntax-class-static-block': 7.14.5(@babel/core@7.28.5)
- '@babel/plugin-syntax-import-attributes': 7.27.1(@babel/core@7.28.5)
- '@babel/plugin-syntax-import-meta': 7.10.4(@babel/core@7.28.5)
- '@babel/plugin-syntax-json-strings': 7.8.3(@babel/core@7.28.5)
- '@babel/plugin-syntax-logical-assignment-operators': 7.10.4(@babel/core@7.28.5)
- '@babel/plugin-syntax-nullish-coalescing-operator': 7.8.3(@babel/core@7.28.5)
- '@babel/plugin-syntax-numeric-separator': 7.10.4(@babel/core@7.28.5)
- '@babel/plugin-syntax-object-rest-spread': 7.8.3(@babel/core@7.28.5)
- '@babel/plugin-syntax-optional-catch-binding': 7.8.3(@babel/core@7.28.5)
- '@babel/plugin-syntax-optional-chaining': 7.8.3(@babel/core@7.28.5)
- '@babel/plugin-syntax-private-property-in-object': 7.14.5(@babel/core@7.28.5)
- '@babel/plugin-syntax-top-level-await': 7.14.5(@babel/core@7.28.5)
-
- babel-preset-jest@29.6.3(@babel/core@7.28.5):
- dependencies:
- '@babel/core': 7.28.5
- babel-plugin-jest-hoist: 29.6.3
- babel-preset-current-node-syntax: 1.2.0(@babel/core@7.28.5)
-
- balanced-match@1.0.2: {}
-
- base64-js@1.5.1: {}
-
- baseline-browser-mapping@2.8.30: {}
-
- brace-expansion@1.1.12:
- dependencies:
- balanced-match: 1.0.2
- concat-map: 0.0.1
-
- brace-expansion@2.0.2:
- dependencies:
- balanced-match: 1.0.2
-
- braces@3.0.3:
- dependencies:
- fill-range: 7.1.1
-
- browserslist@4.28.0:
- dependencies:
- baseline-browser-mapping: 2.8.30
- caniuse-lite: 1.0.30001756
- electron-to-chromium: 1.5.259
- node-releases: 2.0.27
- update-browserslist-db: 1.1.4(browserslist@4.28.0)
-
- bs-logger@0.2.6:
- dependencies:
- fast-json-stable-stringify: 2.1.0
-
- bser@2.1.1:
- dependencies:
- node-int64: 0.4.0
-
- buffer-from@1.1.2: {}
-
- buffer@6.0.3:
- dependencies:
- base64-js: 1.5.1
- ieee754: 1.2.1
-
- bundle-name@4.1.0:
- dependencies:
- run-applescript: 7.1.0
-
- callsites@3.1.0: {}
-
- camelcase@5.3.1: {}
-
- camelcase@6.3.0: {}
-
- caniuse-lite@1.0.30001756: {}
-
- chalk@4.1.2:
- dependencies:
- ansi-styles: 4.3.0
- supports-color: 7.2.0
-
- char-regex@1.0.2: {}
-
- ci-info@3.9.0: {}
-
- cjs-module-lexer@1.4.3: {}
-
- cli-cursor@5.0.0:
- dependencies:
- restore-cursor: 5.1.0
-
- cli-truncate@5.1.1:
- dependencies:
- slice-ansi: 7.1.2
- string-width: 8.1.0
-
- cliui@8.0.1:
- dependencies:
- string-width: 4.2.3
- strip-ansi: 6.0.1
- wrap-ansi: 7.0.0
-
- co@4.6.0: {}
-
- collect-v8-coverage@1.0.3: {}
-
- color-convert@2.0.1:
- dependencies:
- color-name: 1.1.4
-
- color-name@1.1.4: {}
-
- colorette@2.0.20: {}
-
- commander@14.0.2: {}
-
- concat-map@0.0.1: {}
-
- convert-source-map@2.0.0: {}
-
- create-jest@29.7.0(@types/node@22.19.1):
- dependencies:
- '@jest/types': 29.6.3
- chalk: 4.1.2
- exit: 0.1.2
- graceful-fs: 4.2.11
- jest-config: 29.7.0(@types/node@22.19.1)
- jest-util: 29.7.0
- prompts: 2.4.2
- transitivePeerDependencies:
- - '@types/node'
- - babel-plugin-macros
- - supports-color
- - ts-node
-
- cross-spawn@7.0.6:
- dependencies:
- path-key: 3.1.1
- shebang-command: 2.0.0
- which: 2.0.2
-
- crypto-random-string@4.0.0:
- dependencies:
- type-fest: 1.4.0
-
- debug@4.4.3:
- dependencies:
- ms: 2.1.3
-
- declarative-shadow-dom-polyfill@0.4.1(typescript@5.9.3):
- dependencies:
- typescript: 5.9.3
-
- dedent@1.7.0: {}
-
- deepmerge@4.3.1: {}
-
- default-browser-id@5.0.1: {}
-
- default-browser@5.4.0:
- dependencies:
- bundle-name: 4.1.0
- default-browser-id: 5.0.1
-
- define-lazy-prop@3.0.0: {}
-
- detect-newline@3.1.0: {}
-
- diff-sequences@29.6.3: {}
-
- electron-to-chromium@1.5.259: {}
-
- emittery@0.13.1: {}
-
- emoji-regex@10.6.0: {}
-
- emoji-regex@8.0.0: {}
-
- entities@4.5.0: {}
-
- environment@1.1.0: {}
-
- error-ex@1.3.4:
- dependencies:
- is-arrayish: 0.2.1
-
- escalade@3.2.0: {}
-
- escape-string-regexp@2.0.0: {}
-
- esprima@4.0.1: {}
-
- event-target-shim@5.0.1: {}
-
- eventemitter3@5.0.1: {}
-
- events@3.3.0: {}
-
- execa@5.1.1:
- dependencies:
- cross-spawn: 7.0.6
- get-stream: 6.0.1
- human-signals: 2.1.0
- is-stream: 2.0.1
- merge-stream: 2.0.0
- npm-run-path: 4.0.1
- onetime: 5.1.2
- signal-exit: 3.0.7
- strip-final-newline: 2.0.0
-
- exit@0.1.2: {}
-
- expect@29.7.0:
- dependencies:
- '@jest/expect-utils': 29.7.0
- jest-get-type: 29.6.3
- jest-matcher-utils: 29.7.0
- jest-message-util: 29.7.0
- jest-util: 29.7.0
-
- fast-json-stable-stringify@2.1.0: {}
-
- fb-watchman@2.0.2:
- dependencies:
- bser: 2.1.1
-
- file-type@18.7.0:
- dependencies:
- readable-web-to-node-stream: 3.0.4
- strtok3: 7.1.1
- token-types: 5.0.1
-
- fill-range@7.1.1:
- dependencies:
- to-regex-range: 5.0.1
-
- find-up@4.1.0:
- dependencies:
- locate-path: 5.0.0
- path-exists: 4.0.0
-
- fs.realpath@1.0.0: {}
-
- fsevents@2.3.3:
- optional: true
-
- function-bind@1.1.2: {}
-
- gensync@1.0.0-beta.2: {}
-
- get-caller-file@2.0.5: {}
-
- get-east-asian-width@1.4.0: {}
-
- get-package-type@0.1.0: {}
-
- get-stdin@9.0.0: {}
-
- get-stream@6.0.1: {}
-
- glob@7.2.3:
- dependencies:
- fs.realpath: 1.0.0
- inflight: 1.0.6
- inherits: 2.0.4
- minimatch: 3.1.2
- once: 1.4.0
- path-is-absolute: 1.0.1
-
- graceful-fs@4.2.11: {}
-
- handlebars@4.7.8:
- dependencies:
- minimist: 1.2.8
- neo-async: 2.6.2
- source-map: 0.6.1
- wordwrap: 1.0.0
- optionalDependencies:
- uglify-js: 3.19.3
-
- happy-dom@14.12.3:
- dependencies:
- entities: 4.5.0
- webidl-conversions: 7.0.0
- whatwg-mimetype: 3.0.0
-
- has-flag@4.0.0: {}
-
- hasown@2.0.2:
- dependencies:
- function-bind: 1.1.2
-
- html-escaper@2.0.2: {}
-
- human-signals@2.1.0: {}
-
- husky@9.1.7: {}
-
- ieee754@1.2.1: {}
-
- import-local@3.2.0:
- dependencies:
- pkg-dir: 4.2.0
- resolve-cwd: 3.0.0
-
- imurmurhash@0.1.4: {}
-
- inflight@1.0.6:
- dependencies:
- once: 1.4.0
- wrappy: 1.0.2
-
- inherits@2.0.4: {}
-
- is-arrayish@0.2.1: {}
-
- is-core-module@2.16.1:
- dependencies:
- hasown: 2.0.2
-
- is-docker@3.0.0: {}
-
- is-fullwidth-code-point@3.0.0: {}
-
- is-fullwidth-code-point@5.1.0:
- dependencies:
- get-east-asian-width: 1.4.0
-
- is-generator-fn@2.1.0: {}
-
- is-inside-container@1.0.0:
- dependencies:
- is-docker: 3.0.0
-
- is-number@7.0.0: {}
-
- is-stream@2.0.1: {}
-
- is-stream@3.0.0: {}
-
- is-wsl@3.1.0:
- dependencies:
- is-inside-container: 1.0.0
-
- isexe@2.0.0: {}
-
- istanbul-lib-coverage@3.2.2: {}
-
- istanbul-lib-instrument@5.2.1:
- dependencies:
- '@babel/core': 7.28.5
- '@babel/parser': 7.28.5
- '@istanbuljs/schema': 0.1.3
- istanbul-lib-coverage: 3.2.2
- semver: 6.3.1
- transitivePeerDependencies:
- - supports-color
-
- istanbul-lib-instrument@6.0.3:
- dependencies:
- '@babel/core': 7.28.5
- '@babel/parser': 7.28.5
- '@istanbuljs/schema': 0.1.3
- istanbul-lib-coverage: 3.2.2
- semver: 7.7.3
- transitivePeerDependencies:
- - supports-color
-
- istanbul-lib-report@3.0.1:
- dependencies:
- istanbul-lib-coverage: 3.2.2
- make-dir: 4.0.0
- supports-color: 7.2.0
-
- istanbul-lib-source-maps@4.0.1:
- dependencies:
- debug: 4.4.3
- istanbul-lib-coverage: 3.2.2
- source-map: 0.6.1
- transitivePeerDependencies:
- - supports-color
-
- istanbul-reports@3.2.0:
- dependencies:
- html-escaper: 2.0.2
- istanbul-lib-report: 3.0.1
-
- jest-changed-files@29.7.0:
- dependencies:
- execa: 5.1.1
- jest-util: 29.7.0
- p-limit: 3.1.0
-
- jest-circus@29.7.0:
- dependencies:
- '@jest/environment': 29.7.0
- '@jest/expect': 29.7.0
- '@jest/test-result': 29.7.0
- '@jest/types': 29.6.3
- '@types/node': 22.19.1
- chalk: 4.1.2
- co: 4.6.0
- dedent: 1.7.0
- is-generator-fn: 2.1.0
- jest-each: 29.7.0
- jest-matcher-utils: 29.7.0
- jest-message-util: 29.7.0
- jest-runtime: 29.7.0
- jest-snapshot: 29.7.0
- jest-util: 29.7.0
- p-limit: 3.1.0
- pretty-format: 29.7.0
- pure-rand: 6.1.0
- slash: 3.0.0
- stack-utils: 2.0.6
- transitivePeerDependencies:
- - babel-plugin-macros
- - supports-color
-
- jest-cli@29.7.0(@types/node@22.19.1):
- dependencies:
- '@jest/core': 29.7.0
- '@jest/test-result': 29.7.0
- '@jest/types': 29.6.3
- chalk: 4.1.2
- create-jest: 29.7.0(@types/node@22.19.1)
- exit: 0.1.2
- import-local: 3.2.0
- jest-config: 29.7.0(@types/node@22.19.1)
- jest-util: 29.7.0
- jest-validate: 29.7.0
- yargs: 17.7.2
- transitivePeerDependencies:
- - '@types/node'
- - babel-plugin-macros
- - supports-color
- - ts-node
-
- jest-config@29.7.0(@types/node@22.19.1):
- dependencies:
- '@babel/core': 7.28.5
- '@jest/test-sequencer': 29.7.0
- '@jest/types': 29.6.3
- babel-jest: 29.7.0(@babel/core@7.28.5)
- chalk: 4.1.2
- ci-info: 3.9.0
- deepmerge: 4.3.1
- glob: 7.2.3
- graceful-fs: 4.2.11
- jest-circus: 29.7.0
- jest-environment-node: 29.7.0
- jest-get-type: 29.6.3
- jest-regex-util: 29.6.3
- jest-resolve: 29.7.0
- jest-runner: 29.7.0
- jest-util: 29.7.0
- jest-validate: 29.7.0
- micromatch: 4.0.8
- parse-json: 5.2.0
- pretty-format: 29.7.0
- slash: 3.0.0
- strip-json-comments: 3.1.1
- optionalDependencies:
- '@types/node': 22.19.1
- transitivePeerDependencies:
- - babel-plugin-macros
- - supports-color
-
- jest-diff@29.7.0:
- dependencies:
- chalk: 4.1.2
- diff-sequences: 29.6.3
- jest-get-type: 29.6.3
- pretty-format: 29.7.0
-
- jest-docblock@29.7.0:
- dependencies:
- detect-newline: 3.1.0
-
- jest-each@29.7.0:
- dependencies:
- '@jest/types': 29.6.3
- chalk: 4.1.2
- jest-get-type: 29.6.3
- jest-util: 29.7.0
- pretty-format: 29.7.0
-
- jest-environment-node@29.7.0:
- dependencies:
- '@jest/environment': 29.7.0
- '@jest/fake-timers': 29.7.0
- '@jest/types': 29.6.3
- '@types/node': 22.19.1
- jest-mock: 29.7.0
- jest-util: 29.7.0
-
- jest-get-type@29.6.3: {}
-
- jest-haste-map@29.7.0:
- dependencies:
- '@jest/types': 29.6.3
- '@types/graceful-fs': 4.1.9
- '@types/node': 22.19.1
- anymatch: 3.1.3
- fb-watchman: 2.0.2
- graceful-fs: 4.2.11
- jest-regex-util: 29.6.3
- jest-util: 29.7.0
- jest-worker: 29.7.0
- micromatch: 4.0.8
- walker: 1.0.8
- optionalDependencies:
- fsevents: 2.3.3
-
- jest-leak-detector@29.7.0:
- dependencies:
- jest-get-type: 29.6.3
- pretty-format: 29.7.0
-
- jest-matcher-utils@29.7.0:
- dependencies:
- chalk: 4.1.2
- jest-diff: 29.7.0
- jest-get-type: 29.6.3
- pretty-format: 29.7.0
-
- jest-message-util@29.7.0:
- dependencies:
- '@babel/code-frame': 7.27.1
- '@jest/types': 29.6.3
- '@types/stack-utils': 2.0.3
- chalk: 4.1.2
- graceful-fs: 4.2.11
- micromatch: 4.0.8
- pretty-format: 29.7.0
- slash: 3.0.0
- stack-utils: 2.0.6
-
- jest-mock@29.7.0:
- dependencies:
- '@jest/types': 29.6.3
- '@types/node': 22.19.1
- jest-util: 29.7.0
-
- jest-pnp-resolver@1.2.3(jest-resolve@29.7.0):
- optionalDependencies:
- jest-resolve: 29.7.0
-
- jest-regex-util@29.6.3: {}
-
- jest-resolve-dependencies@29.7.0:
- dependencies:
- jest-regex-util: 29.6.3
- jest-snapshot: 29.7.0
- transitivePeerDependencies:
- - supports-color
-
- jest-resolve@29.7.0:
- dependencies:
- chalk: 4.1.2
- graceful-fs: 4.2.11
- jest-haste-map: 29.7.0
- jest-pnp-resolver: 1.2.3(jest-resolve@29.7.0)
- jest-util: 29.7.0
- jest-validate: 29.7.0
- resolve: 1.22.11
- resolve.exports: 2.0.3
- slash: 3.0.0
-
- jest-runner@29.7.0:
- dependencies:
- '@jest/console': 29.7.0
- '@jest/environment': 29.7.0
- '@jest/test-result': 29.7.0
- '@jest/transform': 29.7.0
- '@jest/types': 29.6.3
- '@types/node': 22.19.1
- chalk: 4.1.2
- emittery: 0.13.1
- graceful-fs: 4.2.11
- jest-docblock: 29.7.0
- jest-environment-node: 29.7.0
- jest-haste-map: 29.7.0
- jest-leak-detector: 29.7.0
- jest-message-util: 29.7.0
- jest-resolve: 29.7.0
- jest-runtime: 29.7.0
- jest-util: 29.7.0
- jest-watcher: 29.7.0
- jest-worker: 29.7.0
- p-limit: 3.1.0
- source-map-support: 0.5.13
- transitivePeerDependencies:
- - supports-color
-
- jest-runtime@29.7.0:
- dependencies:
- '@jest/environment': 29.7.0
- '@jest/fake-timers': 29.7.0
- '@jest/globals': 29.7.0
- '@jest/source-map': 29.6.3
- '@jest/test-result': 29.7.0
- '@jest/transform': 29.7.0
- '@jest/types': 29.6.3
- '@types/node': 22.19.1
- chalk: 4.1.2
- cjs-module-lexer: 1.4.3
- collect-v8-coverage: 1.0.3
- glob: 7.2.3
- graceful-fs: 4.2.11
- jest-haste-map: 29.7.0
- jest-message-util: 29.7.0
- jest-mock: 29.7.0
- jest-regex-util: 29.6.3
- jest-resolve: 29.7.0
- jest-snapshot: 29.7.0
- jest-util: 29.7.0
- slash: 3.0.0
- strip-bom: 4.0.0
- transitivePeerDependencies:
- - supports-color
-
- jest-snapshot@29.7.0:
- dependencies:
- '@babel/core': 7.28.5
- '@babel/generator': 7.28.5
- '@babel/plugin-syntax-jsx': 7.27.1(@babel/core@7.28.5)
- '@babel/plugin-syntax-typescript': 7.27.1(@babel/core@7.28.5)
- '@babel/types': 7.28.5
- '@jest/expect-utils': 29.7.0
- '@jest/transform': 29.7.0
- '@jest/types': 29.6.3
- babel-preset-current-node-syntax: 1.2.0(@babel/core@7.28.5)
- chalk: 4.1.2
- expect: 29.7.0
- graceful-fs: 4.2.11
- jest-diff: 29.7.0
- jest-get-type: 29.6.3
- jest-matcher-utils: 29.7.0
- jest-message-util: 29.7.0
- jest-util: 29.7.0
- natural-compare: 1.4.0
- pretty-format: 29.7.0
- semver: 7.7.3
- transitivePeerDependencies:
- - supports-color
-
- jest-util@29.7.0:
- dependencies:
- '@jest/types': 29.6.3
- '@types/node': 22.19.1
- chalk: 4.1.2
- ci-info: 3.9.0
- graceful-fs: 4.2.11
- picomatch: 2.3.1
-
- jest-validate@29.7.0:
- dependencies:
- '@jest/types': 29.6.3
- camelcase: 6.3.0
- chalk: 4.1.2
- jest-get-type: 29.6.3
- leven: 3.1.0
- pretty-format: 29.7.0
-
- jest-watcher@29.7.0:
- dependencies:
- '@jest/test-result': 29.7.0
- '@jest/types': 29.6.3
- '@types/node': 22.19.1
- ansi-escapes: 4.3.2
- chalk: 4.1.2
- emittery: 0.13.1
- jest-util: 29.7.0
- string-length: 4.0.2
-
- jest-worker@29.7.0:
- dependencies:
- '@types/node': 22.19.1
- jest-util: 29.7.0
- merge-stream: 2.0.0
- supports-color: 8.1.1
-
- jest@29.7.0(@types/node@22.19.1):
- dependencies:
- '@jest/core': 29.7.0
- '@jest/types': 29.6.3
- import-local: 3.2.0
- jest-cli: 29.7.0(@types/node@22.19.1)
- transitivePeerDependencies:
- - '@types/node'
- - babel-plugin-macros
- - supports-color
- - ts-node
-
- js-tokens@4.0.0: {}
-
- js-yaml@3.14.2:
- dependencies:
- argparse: 1.0.10
- esprima: 4.0.1
-
- jsesc@3.1.0: {}
-
- json-parse-even-better-errors@2.3.1: {}
-
- json5@2.2.3: {}
-
- kleur@3.0.3: {}
-
- leven@3.1.0: {}
-
- lines-and-columns@1.2.4: {}
-
- linkify-it@5.0.0:
- dependencies:
- uc.micro: 2.1.0
-
- lint-staged@16.2.7:
- dependencies:
- commander: 14.0.2
- listr2: 9.0.5
- micromatch: 4.0.8
- nano-spawn: 2.0.0
- pidtree: 0.6.0
- string-argv: 0.3.2
- yaml: 2.8.1
-
- listr2@9.0.5:
- dependencies:
- cli-truncate: 5.1.1
- colorette: 2.0.20
- eventemitter3: 5.0.1
- log-update: 6.1.0
- rfdc: 1.4.1
- wrap-ansi: 9.0.2
-
- locate-path@5.0.0:
- dependencies:
- p-locate: 4.1.0
-
- lodash.memoize@4.1.2: {}
-
- log-update@6.1.0:
- dependencies:
- ansi-escapes: 7.2.0
- cli-cursor: 5.0.0
- slice-ansi: 7.1.2
- strip-ansi: 7.1.2
- wrap-ansi: 9.0.2
-
- lru-cache@5.1.1:
- dependencies:
- yallist: 3.1.1
-
- lunr@2.3.9: {}
-
- make-dir@4.0.0:
- dependencies:
- semver: 7.7.3
-
- make-error@1.3.6: {}
-
- makeerror@1.0.12:
- dependencies:
- tmpl: 1.0.5
-
- markdown-it@14.1.0:
- dependencies:
- argparse: 2.0.1
- entities: 4.5.0
- linkify-it: 5.0.0
- mdurl: 2.0.0
- punycode.js: 2.3.1
- uc.micro: 2.1.0
-
- mdurl@2.0.0: {}
-
- meow@12.1.1: {}
-
- merge-stream@2.0.0: {}
-
- micromatch@4.0.8:
- dependencies:
- braces: 3.0.3
- picomatch: 2.3.1
-
- mimic-fn@2.1.0: {}
-
- mimic-function@5.0.1: {}
-
- minimatch@3.1.2:
- dependencies:
- brace-expansion: 1.1.12
-
- minimatch@9.0.5:
- dependencies:
- brace-expansion: 2.0.2
-
- minimist@1.2.8: {}
-
- ms@2.1.3: {}
-
- nano-spawn@2.0.0: {}
-
- natural-compare@1.4.0: {}
-
- neo-async@2.6.2: {}
-
- node-int64@0.4.0: {}
-
- node-releases@2.0.27: {}
-
- normalize-path@3.0.0: {}
-
- npm-run-path@4.0.1:
- dependencies:
- path-key: 3.1.1
-
- once@1.4.0:
- dependencies:
- wrappy: 1.0.2
-
- onetime@5.1.2:
- dependencies:
- mimic-fn: 2.1.0
-
- onetime@7.0.0:
- dependencies:
- mimic-function: 5.0.1
-
- open-cli@8.0.0:
- dependencies:
- file-type: 18.7.0
- get-stdin: 9.0.0
- meow: 12.1.1
- open: 10.2.0
- tempy: 3.1.0
-
- open@10.2.0:
- dependencies:
- default-browser: 5.4.0
- define-lazy-prop: 3.0.0
- is-inside-container: 1.0.0
- wsl-utils: 0.1.0
-
- p-limit@2.3.0:
- dependencies:
- p-try: 2.2.0
-
- p-limit@3.1.0:
- dependencies:
- yocto-queue: 0.1.0
-
- p-locate@4.1.0:
- dependencies:
- p-limit: 2.3.0
-
- p-try@2.2.0: {}
-
- parse-json@5.2.0:
- dependencies:
- '@babel/code-frame': 7.27.1
- error-ex: 1.3.4
- json-parse-even-better-errors: 2.3.1
- lines-and-columns: 1.2.4
-
- path-exists@4.0.0: {}
-
- path-is-absolute@1.0.1: {}
-
- path-key@3.1.1: {}
-
- path-parse@1.0.7: {}
-
- peek-readable@5.4.2: {}
-
- picocolors@1.1.1: {}
-
- picomatch@2.3.1: {}
-
- pidtree@0.6.0: {}
-
- pirates@4.0.7: {}
-
- pkg-dir@4.2.0:
- dependencies:
- find-up: 4.1.0
-
- prettier@3.6.2: {}
-
- pretty-format@29.7.0:
- dependencies:
- '@jest/schemas': 29.6.3
- ansi-styles: 5.2.0
- react-is: 18.3.1
-
- process@0.11.10: {}
-
- prompts@2.4.2:
- dependencies:
- kleur: 3.0.3
- sisteransi: 1.0.5
-
- punycode.js@2.3.1: {}
-
- pure-rand@6.1.0: {}
-
- react-is@18.3.1: {}
-
- readable-stream@4.7.0:
- dependencies:
- abort-controller: 3.0.0
- buffer: 6.0.3
- events: 3.3.0
- process: 0.11.10
- string_decoder: 1.3.0
-
- readable-web-to-node-stream@3.0.4:
- dependencies:
- readable-stream: 4.7.0
-
- regenerator-runtime@0.14.1: {}
-
- require-directory@2.1.1: {}
-
- resolve-cwd@3.0.0:
- dependencies:
- resolve-from: 5.0.0
-
- resolve-from@5.0.0: {}
-
- resolve.exports@2.0.3: {}
-
- resolve@1.22.11:
- dependencies:
- is-core-module: 2.16.1
- path-parse: 1.0.7
- supports-preserve-symlinks-flag: 1.0.0
-
- restore-cursor@5.1.0:
- dependencies:
- onetime: 7.0.0
- signal-exit: 4.1.0
-
- rfdc@1.4.1: {}
-
- run-applescript@7.1.0: {}
-
- safe-buffer@5.2.1: {}
-
- scheduler-polyfill@1.3.0: {}
-
- semver@6.3.1: {}
-
- semver@7.7.3: {}
-
- shebang-command@2.0.0:
- dependencies:
- shebang-regex: 3.0.0
-
- shebang-regex@3.0.0: {}
-
- signal-exit@3.0.7: {}
-
- signal-exit@4.1.0: {}
-
- sisteransi@1.0.5: {}
-
- slash@3.0.0: {}
-
- slice-ansi@7.1.2:
- dependencies:
- ansi-styles: 6.2.3
- is-fullwidth-code-point: 5.1.0
-
- source-map-support@0.5.13:
- dependencies:
- buffer-from: 1.1.2
- source-map: 0.6.1
-
- source-map@0.6.1: {}
-
- sprintf-js@1.0.3: {}
-
- stack-utils@2.0.6:
- dependencies:
- escape-string-regexp: 2.0.0
-
- string-argv@0.3.2: {}
-
- string-length@4.0.2:
- dependencies:
- char-regex: 1.0.2
- strip-ansi: 6.0.1
-
- string-width@4.2.3:
- dependencies:
- emoji-regex: 8.0.0
- is-fullwidth-code-point: 3.0.0
- strip-ansi: 6.0.1
-
- string-width@7.2.0:
- dependencies:
- emoji-regex: 10.6.0
- get-east-asian-width: 1.4.0
- strip-ansi: 7.1.2
-
- string-width@8.1.0:
- dependencies:
- get-east-asian-width: 1.4.0
- strip-ansi: 7.1.2
-
- string_decoder@1.3.0:
- dependencies:
- safe-buffer: 5.2.1
-
- strip-ansi@6.0.1:
- dependencies:
- ansi-regex: 5.0.1
-
- strip-ansi@7.1.2:
- dependencies:
- ansi-regex: 6.2.2
-
- strip-bom@4.0.0: {}
-
- strip-final-newline@2.0.0: {}
-
- strip-json-comments@3.1.1: {}
-
- strtok3@7.1.1:
- dependencies:
- '@tokenizer/token': 0.3.0
- peek-readable: 5.4.2
-
- supports-color@7.2.0:
- dependencies:
- has-flag: 4.0.0
-
- supports-color@8.1.1:
- dependencies:
- has-flag: 4.0.0
-
- supports-preserve-symlinks-flag@1.0.0: {}
-
- temp-dir@3.0.0: {}
-
- tempy@3.1.0:
- dependencies:
- is-stream: 3.0.0
- temp-dir: 3.0.0
- type-fest: 2.19.0
- unique-string: 3.0.0
-
- test-exclude@6.0.0:
- dependencies:
- '@istanbuljs/schema': 0.1.3
- glob: 7.2.3
- minimatch: 3.1.2
-
- tmpl@1.0.5: {}
-
- to-regex-range@5.0.1:
- dependencies:
- is-number: 7.0.0
-
- token-types@5.0.1:
- dependencies:
- '@tokenizer/token': 0.3.0
- ieee754: 1.2.1
-
- ts-jest@29.4.5(@babel/core@7.28.5)(@jest/transform@29.7.0)(@jest/types@29.6.3)(babel-jest@29.7.0(@babel/core@7.28.5))(jest-util@29.7.0)(jest@29.7.0(@types/node@22.19.1))(typescript@5.9.3):
- dependencies:
- bs-logger: 0.2.6
- fast-json-stable-stringify: 2.1.0
- handlebars: 4.7.8
- jest: 29.7.0(@types/node@22.19.1)
- json5: 2.2.3
- lodash.memoize: 4.1.2
- make-error: 1.3.6
- semver: 7.7.3
- type-fest: 4.41.0
- typescript: 5.9.3
- yargs-parser: 21.1.1
- optionalDependencies:
- '@babel/core': 7.28.5
- '@jest/transform': 29.7.0
- '@jest/types': 29.6.3
- babel-jest: 29.7.0(@babel/core@7.28.5)
- jest-util: 29.7.0
-
- tslib@2.8.1: {}
-
- type-detect@4.0.8: {}
-
- type-fest@0.21.3: {}
-
- type-fest@1.4.0: {}
-
- type-fest@2.19.0: {}
-
- type-fest@4.41.0: {}
-
- typedoc-plugin-mdn-links@5.0.10(typedoc@0.28.14(typescript@5.9.3)):
- dependencies:
- typedoc: 0.28.14(typescript@5.9.3)
-
- typedoc@0.28.14(typescript@5.9.3):
- dependencies:
- '@gerrit0/mini-shiki': 3.15.0
- lunr: 2.3.9
- markdown-it: 14.1.0
- minimatch: 9.0.5
- typescript: 5.9.3
- yaml: 2.8.1
-
- typescript@5.9.3: {}
-
- uc.micro@2.1.0: {}
-
- uglify-js@3.19.3:
- optional: true
-
- undici-types@6.21.0: {}
-
- unique-string@3.0.0:
- dependencies:
- crypto-random-string: 4.0.0
-
- update-browserslist-db@1.1.4(browserslist@4.28.0):
- dependencies:
- browserslist: 4.28.0
- escalade: 3.2.0
- picocolors: 1.1.1
-
- v8-to-istanbul@9.3.0:
- dependencies:
- '@jridgewell/trace-mapping': 0.3.31
- '@types/istanbul-lib-coverage': 2.0.6
- convert-source-map: 2.0.0
-
- walker@1.0.8:
- dependencies:
- makeerror: 1.0.12
-
- web-streams-polyfill@4.2.0: {}
-
- web-utility@4.6.4(typescript@5.9.3):
- dependencies:
- '@swc/helpers': 0.5.17
- regenerator-runtime: 0.14.1
- typescript: 5.9.3
-
- webidl-conversions@7.0.0: {}
-
- whatwg-mimetype@3.0.0: {}
-
- which@2.0.2:
- dependencies:
- isexe: 2.0.0
-
- wordwrap@1.0.0: {}
-
- wrap-ansi@7.0.0:
- dependencies:
- ansi-styles: 4.3.0
- string-width: 4.2.3
- strip-ansi: 6.0.1
-
- wrap-ansi@9.0.2:
- dependencies:
- ansi-styles: 6.2.3
- string-width: 7.2.0
- strip-ansi: 7.1.2
-
- wrappy@1.0.2: {}
-
- write-file-atomic@4.0.2:
- dependencies:
- imurmurhash: 0.1.4
- signal-exit: 3.0.7
-
- wsl-utils@0.1.0:
- dependencies:
- is-wsl: 3.1.0
-
- y18n@5.0.8: {}
-
- yallist@3.1.1: {}
-
- yaml@2.8.1: {}
-
- yargs-parser@21.1.1: {}
-
- yargs@17.7.2:
- dependencies:
- cliui: 8.0.1
- escalade: 3.2.0
- get-caller-file: 2.0.5
- require-directory: 2.1.1
- string-width: 4.2.3
- y18n: 5.0.8
- yargs-parser: 21.1.1
-
- yocto-queue@0.1.0: {}
diff --git a/source/AsyncComponent.ts b/source/AsyncComponent.ts
new file mode 100644
index 0000000..bf37de8
--- /dev/null
+++ b/source/AsyncComponent.ts
@@ -0,0 +1,37 @@
+import { Props, GeneratorNode, AsyncGeneratorNode, VChild } from './creator';
+import { isEmpty } from 'web-utility/source/data';
+import { clearList } from './utility';
+
+export class AsyncComponent {
+ function: Function;
+ props: Props;
+ generator: GeneratorNode | AsyncGeneratorNode;
+
+ lastNodes: VChild[] = [];
+ realNodes: HTMLElement[] = [];
+
+ constructor(func: Function, props: Props) {
+ this.function = func;
+ this.props = props;
+ this.generator = func.call(this, props);
+ }
+
+ *[Symbol.iterator]() {
+ while (true) yield this.props;
+ }
+
+ async *[Symbol.asyncIterator]() {
+ while (true) yield this.props;
+ }
+
+ async render() {
+ const { realNodes } = this;
+
+ const { value } = await this.generator.next(
+ realNodes[1] ? realNodes : realNodes[0]
+ );
+ if (!isEmpty(value)) this.lastNodes = value;
+
+ return clearList(this.lastNodes);
+ }
+}
diff --git a/source/creator.ts b/source/creator.ts
new file mode 100644
index 0000000..8628e8c
--- /dev/null
+++ b/source/creator.ts
@@ -0,0 +1,72 @@
+import { HTMLProps } from 'web-utility/source/DOM-type';
+import { clearList } from './utility';
+import { AsyncComponent } from './AsyncComponent';
+
+export interface VElement {
+ tagName: string;
+ childNodes: VChildNode[];
+ [key: string]: any;
+}
+export type VChild = string | number | boolean | VElement;
+export type VChildNode = VChild | AsyncComponent;
+export type VChildren = VChildNode | VChildNode[];
+
+export type GeneratorNode = Generator;
+export type AsyncGeneratorNode = AsyncGenerator;
+
+export type AsyncNode = Promise | GeneratorNode | AsyncGeneratorNode;
+
+export type RenderNode = VChildren | AsyncNode;
+
+export interface Props extends HTMLProps {
+ children?: VChildren;
+ [key: string]: any;
+}
+
+export type FunctionComponent = (props: Props) => RenderNode;
+
+export type Component = string | FunctionComponent;
+
+declare global {
+ namespace JSX {
+ interface IntrinsicElements {
+ [tagName: string]: Props;
+ }
+ interface ElementChildrenAttribute {
+ children: VChildren;
+ }
+ }
+}
+
+export function createElement(
+ tagName: Component,
+ props: Props | null,
+ ...childNodes: VChildNode[]
+) {
+ childNodes = clearList(childNodes);
+
+ if (typeof tagName === 'string')
+ return {
+ ...props,
+ tagName: tagName as string,
+ childNodes
+ };
+
+ props = { ...props, children: childNodes };
+
+ const result = tagName(props);
+
+ if (typeof (result as Promise).then === 'function')
+ return new AsyncComponent(async function* () {
+ yield await (result as Promise);
+ }, props);
+
+ if (typeof (result as Generator).next === 'function')
+ return new AsyncComponent(tagName, props);
+
+ return result;
+}
+
+export function Fragment({ children }: Props) {
+ return children;
+}
diff --git a/source/dist/DOMRenderer.ts b/source/dist/DOMRenderer.ts
deleted file mode 100644
index cd86ddc..0000000
--- a/source/dist/DOMRenderer.ts
+++ /dev/null
@@ -1,269 +0,0 @@
-import 'scheduler-polyfill';
-import { ReadableStream } from 'web-streams-polyfill';
-import {
- diffKeys,
- DiffStatus,
- elementTypeOf,
- groupBy,
- templateOf,
- toCamelCase,
- toHyphenCase
-} from 'web-utility';
-
-import { DataObject, VNode } from './VDOM';
-
-export type RenderMode = 'sync' | 'async';
-
-export interface UpdateTask {
- index?: number;
- oldVNode?: VNode;
- newVNode?: VNode;
-}
-
-export class DOMRenderer {
- eventPattern = /^on[A-Z]/;
- ariaPattern = /^aira[A-Z]/;
-
- document = globalThis.document;
-
- protected treeCache = new WeakMap();
- protected signalCache = new WeakMap();
-
- protected keyOf = ({ key, text, props, selector }: VNode, index?: number) =>
- key?.toString() || props?.id || (text || selector || '') + index;
-
- protected vNodeOf = (list: VNode[], key?: VNode['key']) =>
- list.find((vNode, index) => `${this.keyOf(vNode, index)}` === String(key));
-
- protected propsKeyOf = (key: string) =>
- key.startsWith('aria-')
- ? toCamelCase(key)
- : this.eventPattern.test(key)
- ? key.toLowerCase()
- : key;
- protected attrsNameOf = (key: string) => VNode.propsMap[key] || key;
-
- protected updateProps(
- node: N,
- oldProps = {} as P,
- newProps = {} as P,
- onDelete?: (node: N, key: string) => any,
- onAdd?: (node: N, key: string, value: any) => any
- ) {
- const { group } = diffKeys(Object.keys(oldProps), Object.keys(newProps));
-
- for (const [key] of group[DiffStatus.Old] || []) onDelete?.(node, key);
-
- for (const [key] of [...(group[DiffStatus.Same] || []), ...(group[DiffStatus.New] || [])])
- if (oldProps[key] !== newProps[key])
- if (onAdd instanceof Function) onAdd(node, key, newProps[key]);
- else Reflect.set(node, key, newProps[key]);
- }
-
- protected deleteNode({ ref, node, children }: VNode) {
- if (node instanceof DocumentFragment) children?.forEach(this.deleteNode);
- else if (node) {
- (node as ChildNode).remove();
-
- ref?.();
- }
- }
-
- protected commitChild(root: ParentNode, node: Node, index = 0) {
- const targetNode = root.childNodes[index];
-
- if (targetNode === node) return;
-
- if (!targetNode) root.append(node);
- else targetNode.before(node);
- }
-
- protected *diffVChildren(oldVNode: VNode, newVNode: VNode): Generator {
- newVNode.children = newVNode.children.map(vNode => new VNode(vNode));
-
- const { map, group } = diffKeys(
- oldVNode.children!.map(this.keyOf),
- newVNode.children!.map(this.keyOf)
- );
- const deletingGroup =
- group[DiffStatus.Old] &&
- groupBy(
- group[DiffStatus.Old].map(([key]) => this.vNodeOf(oldVNode.children!, key)),
- ({ selector }) => selector + ''
- );
-
- for (const [index, newVChild] of newVNode.children!.entries()) {
- const key = this.keyOf(newVChild, index);
-
- let oldVChild =
- map[key] === DiffStatus.Same
- ? this.vNodeOf(oldVNode.children!, key)
- : deletingGroup?.[newVChild.selector]?.shift();
-
- yield { index, oldVNode: oldVChild, newVNode: newVChild };
-
- if (oldVChild?.children[0] || newVChild.children[0]) {
- oldVChild ||= new VNode({ ...newVChild, children: [] });
-
- yield* this.diffVChildren(oldVChild, newVChild);
- }
- }
- for (const selector in deletingGroup)
- for (const oldVNode of deletingGroup[selector]) yield { oldVNode };
- }
-
- protected handleCustomEvent(node: EventTarget, event: string) {
- var handler: EventListener;
-
- Object.defineProperty(node, `on${event}`, {
- set: value => {
- if (handler) node.removeEventListener(event, handler);
-
- node.addEventListener(event, (handler = value));
- },
- get: () => handler
- });
- }
-
- protected removeProperty = (node: Element, key: string) =>
- this.eventPattern.test(key)
- ? (node[key.toLowerCase()] = null)
- : node.removeAttribute(
- this.ariaPattern.test(key) ? toHyphenCase(key) : this.attrsNameOf(key)
- );
- protected setProperty = (node: Element, key: string, value: string) => {
- const isXML = templateOf(node.tagName) && elementTypeOf(node.tagName) === 'xml';
-
- if (isXML || key.includes('-')) node.setAttribute(this.attrsNameOf(key), value);
- else
- try {
- const name = this.propsKeyOf(key);
-
- if (this.eventPattern.test(key) && !(name in node))
- this.handleCustomEvent(node, name.slice(2));
-
- node[name] = value;
- } catch {
- node.setAttribute(this.attrsNameOf(key), value);
- }
- };
-
- protected patchNode(oldVNode: VNode, newVNode: VNode) {
- this.updateProps(
- oldVNode.node as Element,
- oldVNode.props,
- newVNode.props,
- this.removeProperty,
- this.setProperty
- );
- this.updateProps(
- (oldVNode.node as HTMLElement).style,
- oldVNode.style,
- newVNode.style,
- (style, key) => style.removeProperty(toHyphenCase(key)),
- (style, key, value) => style.setProperty(toHyphenCase(key), value)
- );
- newVNode.node ||= oldVNode.node;
-
- return newVNode;
- }
-
- *generateDOM(oldVRoot: VNode, newVRoot: VNode) {
- if (VNode.isFragment(newVRoot))
- newVRoot = new VNode({ ...oldVRoot, children: newVRoot.children });
-
- yield this.patchNode(oldVRoot, newVRoot);
-
- for (let { index, oldVNode, newVNode } of this.diffVChildren(oldVRoot, newVRoot)) {
- if (!newVNode) {
- this.deleteNode(oldVNode);
- continue;
- }
- const inserting = !oldVNode;
-
- if (oldVNode) newVNode.node = oldVNode.node;
- else {
- newVNode.createDOM(this.document);
-
- const { tagName, node, parent } = newVNode;
-
- oldVNode = new VNode({ tagName, node, parent });
- }
-
- if (newVNode.text) oldVNode.node.nodeValue = newVNode.text;
- else if (!VNode.isFragment(newVNode)) this.patchNode(oldVNode, newVNode);
-
- if (oldVNode.parent) {
- this.commitChild(oldVNode.parent.node as ParentNode, newVNode.node, index);
-
- if (inserting) newVNode.ref?.(newVNode.node);
- }
- yield newVNode;
- }
- }
-
- patch(oldVRoot: VNode, newVRoot: VNode) {
- var count = 0;
-
- for (const newVNode of this.generateDOM(oldVRoot, newVRoot))
- if (++count === 1) newVRoot = newVNode;
-
- return newVRoot;
- }
-
- async patchAsync(oldVRoot: VNode, newVRoot: VNode) {
- const oldController = this.signalCache.get(oldVRoot.node);
-
- if (oldController) {
- oldController.abort();
-
- oldVRoot = VNode.fromDOM(oldVRoot.node);
- }
- const controller = new AbortController();
-
- this.signalCache.set(oldVRoot.node, controller);
-
- var count = 0;
-
- for (const newVNode of this.generateDOM(oldVRoot, newVRoot)) {
- if (++count === 1) newVRoot = newVNode;
-
- await scheduler.yield();
-
- if (controller.signal.aborted) {
- this.signalCache.delete(oldVRoot.node);
-
- controller.signal.throwIfAborted();
- }
- }
- this.signalCache.delete(oldVRoot.node);
-
- return newVRoot;
- }
-
- render(vNode: VNode, node?: ParentNode, mode?: 'sync'): VNode;
- render(vNode: VNode, node?: ParentNode, mode?: 'async'): Promise;
- render(
- vNode: VNode,
- node: ParentNode = globalThis.document?.body,
- mode: RenderMode = 'sync'
- ): VNode | Promise {
- this.document = node.ownerDocument;
-
- var root = this.treeCache.get(node) || VNode.fromDOM(node);
-
- const done = (root: VNode) => this.treeCache.set(node, root) && root;
-
- return mode === 'sync'
- ? done(this.patch(root, new VNode({ ...root, children: [vNode] })))
- : this.patchAsync(root, new VNode({ ...root, children: [vNode] })).then(done);
- }
-
- renderToStaticMarkup(tree: VNode) {
- return [...tree.generateXML()].join('');
- }
-
- renderToReadableStream(tree: VNode) {
- return ReadableStream.from(tree.generateXML());
- }
-}
diff --git a/source/dist/VDOM.ts b/source/dist/VDOM.ts
deleted file mode 100644
index a3859ce..0000000
--- a/source/dist/VDOM.ts
+++ /dev/null
@@ -1,251 +0,0 @@
-import { findShadowRoots } from 'declarative-shadow-dom-polyfill';
-import {
- elementTypeOf,
- HTMLProps,
- IndexKey,
- isEmpty,
- MathMLProps,
- SVGProps,
- toHyphenCase,
- XMLNamespace
-} from 'web-utility';
-
-import { DOMRenderer } from './DOMRenderer';
-
-export type DataObject = Record;
-
-export type PropsMap = Partial<
- Record | keyof HTMLProps, string>
->;
-
-export type VNodeStyle = HTMLProps['style'] & {
- [K in `--${string}`]?: string;
-};
-
-export class VNodeMeta {
- key?: IndexKey;
- ref?: (node?: Node) => any;
- text?: string;
- selector?: string;
- namespace?: string;
- tagName?: string;
- is?: string;
- props?: DataObject;
- style?: VNodeStyle;
- parent?: VNode;
- children?: JsxChildren = [];
- node?: Node;
-}
-
-export class VNode extends VNodeMeta {
- children?: VNode[] = [];
-
- constructor({ children, ...meta }: VNodeMeta) {
- super();
- Object.assign(this, meta);
-
- for (const vNode of (children as VNode[]) || [])
- this.children.push(...(VNode.isFragment(vNode) ? vNode.children || [] : [vNode]));
-
- for (const child of this.children) child.parent = this;
-
- const { tagName, is, props } = meta;
-
- if (!tagName && !props?.className && !is) return;
-
- this.selector = [
- tagName?.toLowerCase(),
- props?.className && `.${props.className.trim().replace(/\s+/, '.')}`,
- is && `[is="${is}"]`
- ]
- .filter(Boolean)
- .join('');
- }
-
- *walkUp() {
- var current: VNode = this;
-
- while ((current = current.parent)) yield current;
- }
-
- namespaceOf(tagName: string) {
- if (XMLNamespace[tagName]) return XMLNamespace[tagName];
-
- for (const { namespace } of this.walkUp()) if (namespace) return namespace;
-
- return XMLNamespace.html;
- }
-
- createDOM(document = globalThis.document) {
- const { tagName, is, text } = this;
-
- return (this.node = text
- ? document.createTextNode(text)
- : !tagName
- ? document.createDocumentFragment()
- : document.createElementNS((this.namespace ||= this.namespaceOf(tagName)), tagName, {
- is
- }));
- }
-
- toJSON(): VNodeMeta {
- const { key, text, selector, namespace, tagName, is, props, style, children } = this;
-
- return JSON.parse(
- JSON.stringify({ key, text, selector, namespace, tagName, is, props, style, children })
- );
- }
-
- protected *generateElementXML(): Generator {
- const { tagName, props, style, children, node } = this;
-
- if (tagName.includes('-') && elementTypeOf(tagName) === 'html') {
- const currentDocument = node?.ownerDocument || globalThis.document;
- const { body } = currentDocument.implementation.createHTMLDocument();
-
- new DOMRenderer().render(this, body);
-
- currentDocument.importNode(body, true);
-
- const shadowRoots = [...findShadowRoots(body)];
-
- yield body.getHTML({ serializableShadowRoots: true, shadowRoots });
- } else {
- const { innerHTML, ...restProps } = props;
-
- yield `<${tagName}`;
-
- for (const key in restProps) {
- yield ` ${VNode.propsMap[key] || key}="${restProps[key]}"`;
- }
- if (style) {
- yield ` style="`;
-
- for (const key in style) {
- yield `${toHyphenCase(key)}:${style[key]};`;
- }
- yield `"`;
- }
- if (innerHTML) {
- yield `>${innerHTML}${tagName}>`;
- } else if (children[0]) {
- yield '>';
-
- for (const child of children) {
- yield* child.generateXML();
- }
- yield `${tagName}>`;
- } else {
- yield tagName === 'script' ? '>' : ' />';
- }
- }
- }
-
- *generateXML(this: VNode): Generator {
- if (VNode.isFragment(this)) {
- yield '';
-
- for (const child of this.children) {
- yield* child.generateXML();
- }
- yield '';
- } else if (this.text != null) {
- yield this.text;
- } else {
- yield* this.generateElementXML();
- }
- }
-
- static propsMap: PropsMap = { httpEquiv: 'http-equiv', className: 'class', htmlFor: 'for' };
-
- static attrsMap: Record> = Object.fromEntries(
- Object.entries(this.propsMap).map(item => item.reverse())
- );
-
- static isFragment({ key, node, children, ...rest }: VNode) {
- for (const key in rest) if (!isEmpty(rest[key])) return false;
- return true;
- }
-
- static fromDOM(node: Node) {
- if (node instanceof Text) return new VNode({ node, text: node.nodeValue });
-
- if (!(node instanceof Element)) return new VNode({ node });
-
- const { namespaceURI, tagName, attributes, style, childNodes } = node as HTMLElement;
- const vNode: VNodeMeta = {
- node,
- namespace: namespaceURI,
- tagName: tagName.toLowerCase(),
- is: node.getAttribute('is')
- };
- const props = Array.from(
- attributes,
- ({ name, value }) => name !== 'style' && [this.attrsMap[name] || name, value]
- ).filter(Boolean);
-
- if (props[0]) vNode.props = Object.fromEntries(props);
-
- const styles = Array.from(style, key => [key, style[key]]);
-
- if (styles[0]) vNode.style = Object.fromEntries(styles);
-
- const children = Array.from(childNodes, node => VNode.fromDOM(node));
-
- if (children[0]) vNode.children = children;
-
- return new VNode(vNode);
- }
-}
-
-export type JsxChild = VNode | string | number | boolean | null | undefined;
-export type JsxChildren = JsxChild | Array;
-
-export type JsxProps = DataObject &
- Pick &
- Omit, 'children'> & {
- children?: JsxChildren;
- };
-export type SvgJsxProps = DataObject &
- Pick &
- Omit, 'children'> & {
- children?: JsxChildren;
- };
-export type MathMlJsxProps = DataObject &
- Pick &
- Omit, 'children'> & {
- children?: JsxChildren;
- };
-
-declare global {
- /**
- * @see {@link https://www.typescriptlang.org/docs/handbook/jsx.html}
- */
- namespace JSX {
- type Element = VNode;
-
- type JSXElements = {
- [tagName in keyof HTMLElementTagNameMap]: JsxProps;
- } & {
- [tagName in keyof SVGElementTagNameMap]: SvgJsxProps;
- } & {
- [tagName in keyof MathMLElementTagNameMap]: MathMlJsxProps<
- MathMLElementTagNameMap[tagName]
- >;
- };
- interface IntrinsicElements extends JSXElements {}
-
- interface ElementAttributesProperty {
- props: {};
- }
- interface ElementChildrenAttribute {
- children: {};
- }
- }
-}
diff --git a/source/dist/index.ts b/source/dist/index.ts
deleted file mode 100644
index b732f8b..0000000
--- a/source/dist/index.ts
+++ /dev/null
@@ -1,2 +0,0 @@
-export * from './VDOM';
-export * from './DOMRenderer';
diff --git a/source/index.ts b/source/index.ts
new file mode 100644
index 0000000..7c774e7
--- /dev/null
+++ b/source/index.ts
@@ -0,0 +1,5 @@
+export * from './utility';
+export * from './creator';
+export * from './AsyncComponent';
+export * from './renderer';
+export * from './updater';
diff --git a/source/jsx-runtime.ts b/source/jsx-runtime.ts
deleted file mode 100644
index f60fe7a..0000000
--- a/source/jsx-runtime.ts
+++ /dev/null
@@ -1,55 +0,0 @@
-import { IndexKey, isEmpty, isHTMLElementClass, tagNameOf } from 'web-utility';
-
-import { DataObject, VNode, VNodeMeta } from './dist/VDOM';
-
-/**
- * @see {@link https://github.com/reactjs/rfcs/blob/createlement-rfc/text/0000-create-element-changes.md}
- * @see {@link https://babeljs.io/docs/babel-plugin-transform-react-jsx}
- */
-export function jsx(
- type: string | Function,
- { ref, is, style, children, ...props }: DataObject,
- key?: IndexKey
-): VNode {
- if (typeof type === 'function' && isHTMLElementClass(type)) type = tagNameOf(type);
-
- children = [children]
- .flat(Infinity)
- .map(node =>
- node instanceof Object
- ? new VNode(node)
- : node === 0 || node
- ? new VNode({ text: node.toString() })
- : undefined
- )
- .filter(Boolean);
-
- const commonProps: VNodeMeta = { key, ref, is, style, children };
-
- return typeof type === 'string'
- ? new VNode({ ...commonProps, tagName: type, props })
- : type({ ...commonProps, ...props });
-}
-
-export const jsxs = jsx;
-export const jsxDEV = jsx;
-
-/**
- * @see {@link https://babeljs.io/docs/babel-plugin-transform-react-jsx#react-automatic-runtime-1}
- */
-export const Fragment = ({
- key,
- ref,
- is,
- style,
- children,
- ...props
-}: VNode['props'] & Omit) =>
- new VNode({
- key,
- ref,
- is,
- props: isEmpty(props) ? undefined : props,
- style,
- children
- });
diff --git a/source/polyfill.ts b/source/polyfill.ts
deleted file mode 100644
index 7237a76..0000000
--- a/source/polyfill.ts
+++ /dev/null
@@ -1,19 +0,0 @@
-import { Window } from 'happy-dom';
-
-const window = new Window();
-
-for (const key of [
- 'window',
- 'self',
- 'XMLSerializer',
- 'DOMParser',
- 'NodeFilter',
- 'Text',
- 'Document',
- 'document',
- 'ShadowRoot',
- 'Element',
- 'HTMLElement',
- 'HTMLUnknownElement'
-])
- Reflect.set(globalThis, key, Reflect.get(window, key));
diff --git a/source/renderer.ts b/source/renderer.ts
new file mode 100644
index 0000000..064b346
--- /dev/null
+++ b/source/renderer.ts
@@ -0,0 +1,80 @@
+import {
+ RenderNode,
+ GeneratorNode,
+ VChildNode,
+ VElement,
+ VChildren
+} from './creator';
+import { AsyncComponent } from './AsyncComponent';
+import { clearList } from './utility';
+import { updateTree } from './updater';
+
+export function isAsync(node: RenderNode) {
+ return (
+ node instanceof Promise ||
+ (node as GeneratorNode).next instanceof Function
+ );
+}
+
+export function* updateComponentTree(
+ next: VChildNode[],
+ prev: VChildNode[] = []
+) {
+ for (const node of next)
+ if (node instanceof AsyncComponent) {
+ const index = prev.findIndex(
+ item =>
+ item instanceof AsyncComponent &&
+ item.function === node.function
+ );
+
+ if (index < 0) yield node;
+ else {
+ const current = prev.splice(index, 1)[0] as AsyncComponent;
+
+ const { children, ...rest } = node.props;
+
+ Object.assign(current.props, rest);
+
+ current.props.children = [
+ ...updateComponentTree(
+ children as VChildNode[],
+ current.props.children as VChildNode[]
+ )
+ ];
+ yield current;
+ }
+ } else if (typeof node === 'object') {
+ const index = prev.findIndex(
+ (item: VElement) => item.tagName === node.tagName
+ );
+
+ if (index < 0) yield node;
+ else {
+ const current = prev.splice(index, 1)[0] as VElement;
+
+ const { childNodes, ...rest } = node;
+
+ Object.assign(current, rest);
+
+ current.childNodes = [
+ ...updateComponentTree(childNodes, current.childNodes)
+ ];
+ yield current;
+ }
+ } else yield node;
+}
+
+const vTreeMap = new WeakMap();
+
+export function render(children: VChildren, root = document.body) {
+ children = [
+ ...updateComponentTree(
+ clearList(children as VChildNode[]),
+ vTreeMap.get(root)
+ )
+ ];
+ vTreeMap.set(root, children);
+
+ return updateTree(children, root);
+}
diff --git a/source/updater.ts b/source/updater.ts
new file mode 100644
index 0000000..b835122
--- /dev/null
+++ b/source/updater.ts
@@ -0,0 +1,111 @@
+import { VChild, Props, VChildNode, VElement } from './creator';
+import { find } from './utility';
+import { AsyncComponent } from './AsyncComponent';
+
+export function updateProps(node: HTMLElement, props: Props) {
+ const { style = {}, ...data } = props;
+ const keys = Object.keys(data);
+
+ for (const { name } of [...node.attributes])
+ if (!keys.find(key => name === key.toLowerCase()))
+ (node as Element).removeAttribute(name);
+
+ for (const name of [...node.style].filter(name => !(name in style)))
+ node.style.removeProperty(name);
+
+ Object.assign(node.style, style);
+
+ const [attr_list, prop_list] = keys.reduce(
+ ([attr_list, prop_list], key) => {
+ if (/\W/.test(key)) attr_list.push(key);
+ else prop_list.push(key);
+
+ return [attr_list, prop_list];
+ },
+ [[], []] as string[][]
+ );
+
+ for (const key of attr_list)
+ node.setAttribute(key.toLowerCase(), data[key]);
+
+ Object.assign(
+ node,
+ Object.fromEntries(
+ prop_list.map(key => [
+ /^on[A-Z]\w+$/.test(key) ? key.toLowerCase() : key,
+ data[key]
+ ])
+ )
+ );
+}
+
+export function insertChild(
+ root: HTMLElement,
+ node: string | Node,
+ index = root.childNodes.length
+) {
+ const old = root.childNodes[index];
+
+ if (old) old.before(node);
+ else root.append(node);
+}
+
+export function updateChild(root: HTMLElement, node: VChild, index: number) {
+ var old: Node;
+
+ if (typeof node === 'object') {
+ const { tagName, childNodes, ...props } = node;
+
+ old =
+ find(
+ root.childNodes,
+ ({ nodeName }) => nodeName.toLowerCase() === tagName,
+ index
+ ) || document.createElement(tagName);
+
+ if (root.childNodes[index] !== old) insertChild(root, old, index);
+
+ updateProps(old as HTMLElement, props);
+ } else {
+ node = node + '';
+
+ old =
+ find(
+ root.childNodes,
+ ({ nodeValue }) => nodeValue === node,
+ index
+ ) || document.createTextNode(node);
+
+ if (root.childNodes[index] !== old) insertChild(root, old, index);
+ }
+
+ return old;
+}
+
+export async function updateTree(children: VChildNode[], root: HTMLElement) {
+ var cursor = 0;
+
+ for (const vNode of children)
+ if (vNode instanceof AsyncComponent) {
+ const realNodes = [];
+
+ for (const item of await vNode.render()) {
+ const node = updateChild(root, item, cursor);
+ cursor++;
+
+ realNodes.push(node);
+
+ if (node instanceof HTMLElement)
+ await updateTree(item.childNodes, node);
+ }
+ vNode.realNodes = realNodes;
+ } else {
+ const node = updateChild(root, vNode, cursor);
+ cursor++;
+
+ if (node instanceof HTMLElement)
+ await updateTree((vNode as VElement).childNodes, node);
+ }
+
+ for (const node of [...root.childNodes].slice(cursor)) node.remove();
+}
diff --git a/source/utility.ts b/source/utility.ts
new file mode 100644
index 0000000..e0db95a
--- /dev/null
+++ b/source/utility.ts
@@ -0,0 +1,16 @@
+import { isEmpty } from 'web-utility/source/data';
+
+export function find(
+ list: ArrayLike,
+ callback: (item: T, index: number) => boolean,
+ offset = 0
+) {
+ const { length } = list;
+
+ for (let i = offset; i < length; i++)
+ if (callback(list[i], i)) return list[i];
+}
+
+export function clearList(data: any[]): T[] {
+ return [data].flat(Infinity).filter(node => !isEmpty(node));
+}
diff --git a/test/DOMRenderer.spec.ts b/test/DOMRenderer.spec.ts
deleted file mode 100644
index a1374e3..0000000
--- a/test/DOMRenderer.spec.ts
+++ /dev/null
@@ -1,226 +0,0 @@
-import { DOMRenderer, VNode } from '../source/dist';
-
-globalThis.CDATASection = class extends Text {};
-
-describe('DOM Renderer', () => {
- const renderer = new DOMRenderer(),
- root = new VNode({ tagName: 'body', node: document.body });
-
- it('should update DOM properties', () => {
- const newVNode = renderer.patch(
- new VNode({ ...root }),
- new VNode({
- ...root,
- props: { className: 'container' }
- })
- );
- expect(document.body.className).toBe('container');
-
- renderer.patch(newVNode, root);
-
- expect(document.body.className).toBe('');
- });
-
- it('should update DOM styles', () => {
- const newVNode = renderer.patch(
- new VNode({ ...root }),
- new VNode({
- ...root,
- style: { margin: '0', '--color': 'red' }
- })
- );
- expect(document.body.style.margin).toBe('0px');
- expect(document.body.style.getPropertyValue('--color')).toBe('red');
-
- renderer.patch(newVNode, root);
-
- expect(document.body.style.margin).toBe('');
- expect(document.body.style.getPropertyValue('--color')).toBe('');
- });
-
- it('should update DOM children', () => {
- const newNode = renderer.patch(
- new VNode({ ...root }),
- new VNode({
- ...root,
- children: [
- new VNode({
- tagName: 'a',
- props: { href: 'https://idea2.app/' },
- style: { color: 'red' },
- children: [new VNode({ text: 'idea2app' })]
- })
- ]
- })
- );
- expect(document.body.innerHTML).toBe(
- 'idea2app'
- );
- renderer.patch(newNode, root);
-
- expect(document.body.innerHTML).toBe('');
- });
-
- it('should update DOM children without keys', () => {
- var newNode = renderer.patch(
- new VNode({ ...root }),
- new VNode({
- ...root,
- children: [new VNode({ children: [new VNode({ tagName: 'i' })] })]
- })
- );
- expect(document.body.innerHTML).toBe('');
-
- newNode = renderer.patch(
- newNode,
- new VNode({
- ...root,
- children: [new VNode({ children: [new VNode({ tagName: 'a' })] })]
- })
- );
- expect(document.body.innerHTML).toBe('');
-
- renderer.patch(newNode, root);
- });
-
- it('should not invoke duplicated Connected Callbacks during updating', () => {
- const connectHook = jest.fn();
-
- class Test extends HTMLElement {
- connectedCallback() {
- connectHook();
- }
- }
- customElements.define('x-test', Test);
-
- const newNode = renderer.patch(
- new VNode({ ...root }),
- new VNode({
- ...root,
- children: [new VNode({ tagName: 'x-test' })]
- })
- );
- expect(document.body.innerHTML).toBe('');
-
- renderer.patch(
- newNode,
- new VNode({
- ...root,
- children: [new VNode({ text: 'y' }), new VNode({ tagName: 'x-test' })]
- })
- );
- expect(document.body.innerHTML).toBe('y');
-
- expect(connectHook).toHaveBeenCalledTimes(1);
- });
-
- it('should render a Virtual DOM node to a Shadow Root', () => {
- const shadowRoot = document.createElement('div').attachShadow({ mode: 'open' });
-
- const shadowVDOM = renderer.patch(
- VNode.fromDOM(shadowRoot),
- new VNode({ children: [new VNode({ tagName: 'a' })] })
- );
- expect(VNode.isFragment(shadowVDOM)).toBe(true);
-
- expect(shadowRoot.innerHTML).toBe('');
- });
-
- it('should render a Virtual DOM node in Async mode', async () => {
- const promise = renderer.render(new VNode({ tagName: 'a' }), document.body, 'async');
-
- expect(document.body.innerHTML).not.toBe('');
-
- await promise;
-
- expect(document.body.innerHTML).toBe('');
- });
-
- it('should stop unfinished Async Rendering while new Async Rendering is started', async () => {
- const oldTree = await renderer.render(new VNode({ tagName: 'a' }), document.body, 'async');
-
- expect(document.body.outerHTML).toBe('');
-
- const promise1 = renderer.patchAsync(
- oldTree,
- new VNode({
- ...root,
- props: { className: 'dark' },
- children: [new VNode({ tagName: 'a', props: { href: '/about' } })]
- })
- );
- expect(document.body.outerHTML).toBe('');
-
- const promise2 = renderer.patchAsync(
- oldTree,
- new VNode({
- ...root,
- props: { className: 'light' },
- children: [new VNode({ tagName: 'b' })]
- })
- );
- expect(promise1).rejects.toThrow('aborted');
-
- await promise2;
-
- expect(document.body.outerHTML).toBe('');
- });
-
- it('should render Fragment nodes to HTML strings', () => {
- const markup = renderer.renderToStaticMarkup(
- new VNode({
- children: [
- new VNode({ tagName: 'a', props: {}, children: [new VNode({ text: '1' })] })
- ]
- })
- );
- expect(markup).toBe('1');
- });
-
- class NonShadowRootTag extends HTMLElement {
- set test(value: any) {
- this.setAttribute('test', JSON.stringify(value));
- }
-
- get test() {
- const value = this.getAttribute('test');
-
- return value && JSON.parse(value);
- }
- }
- customElements.define('non-shadow-root-tag', NonShadowRootTag);
-
- it('should render Custom elements without Shadow Root but with attributes', () => {
- const markup = renderer.renderToStaticMarkup(
- new VNode({ tagName: 'non-shadow-root-tag', props: { test: { a: 1, b: 2 } } })
- );
- expect(markup).toBe(``);
- });
-
- class ShadowRootTag extends HTMLElement {
- constructor() {
- super();
- this.attachShadow({ mode: 'closed' }).innerHTML = '';
- }
- }
- customElements.define('shadow-root-tag', ShadowRootTag);
-
- it('should render the Shadow Root to HTML strings', () => {
- const markup = renderer.renderToStaticMarkup(new VNode({ tagName: 'shadow-root-tag' }));
-
- expect(markup).toBe(
- ``
- );
- });
-
- it('should render the Shadow Root to a Readable Stream', async () => {
- const stream = renderer.renderToReadableStream(new VNode({ tagName: 'shadow-root-tag' })),
- markups: string[] = [];
-
- for await (const markup of stream) markups.push(markup);
-
- expect(markups.join('')).toBe(
- ``
- );
- });
-});
diff --git a/test/VDOM.spec.ts b/test/VDOM.spec.ts
deleted file mode 100644
index 7ca9a11..0000000
--- a/test/VDOM.spec.ts
+++ /dev/null
@@ -1,61 +0,0 @@
-import { VNode } from '../source/dist';
-
-describe('VDOM', () => {
- it('should transfer a DOM node to a Virtual DOM node', () => {
- const vNode = VNode.fromDOM(document.body);
- const { tagName, selector, node } = vNode;
-
- expect(vNode).toBeInstanceOf(VNode);
-
- expect({ tagName, selector, node }).toEqual({
- tagName: 'body',
- selector: 'body',
- node: document.body
- });
- });
-
- it('should detect a Fragment VNode', () => {
- const result = VNode.isFragment(
- new VNode({
- key: undefined,
- tagName: undefined,
- props: {},
- children: []
- })
- );
- expect(result).toBe(true);
- });
-
- it('should only generate a selector for a Virtual DOM element', () => {
- const vElement = new VNode({
- tagName: 'i',
- is: 'my-icon',
- props: { className: 'icon love' }
- });
- expect(vElement.selector).toBe('i.icon.love[is="my-icon"]');
-
- const vFragment = new VNode({ children: [] }),
- vText = new VNode({ text: 'Hello, Web components!' });
-
- expect(vFragment.selector).toBeUndefined();
- expect(vText.selector).toBeUndefined();
- });
-
- it('should merge Fragment VDOM nodes', () => {
- const oneLevelFragment = new VNode({
- children: [new VNode({ tagName: 'b' })]
- }),
- twoLevelFragment = new VNode({
- children: [oneLevelFragment, oneLevelFragment]
- });
- const fragmentVNode = new VNode({
- children: [new VNode({ tagName: 'a' }), oneLevelFragment, twoLevelFragment]
- });
- expect(fragmentVNode.children?.map(child => child.toJSON())).toEqual([
- { tagName: 'a', selector: 'a', children: [] },
- { tagName: 'b', selector: 'b', children: [] },
- { tagName: 'b', selector: 'b', children: [] },
- { tagName: 'b', selector: 'b', children: [] }
- ]);
- });
-});
diff --git a/test/jsx-runtime.spec.tsx b/test/jsx-runtime.spec.tsx
deleted file mode 100644
index e34213c..0000000
--- a/test/jsx-runtime.spec.tsx
+++ /dev/null
@@ -1,198 +0,0 @@
-import { DOMRenderer } from '../source/dist';
-
-class MyTag extends HTMLElement {}
-
-customElements.define('my-tag', MyTag);
-
-declare global {
- interface HTMLElementTagNameMap {
- 'my-tag': MyTag;
- }
-}
-
-describe('JSX runtime', () => {
- const renderer = new DOMRenderer();
-
- it('should render JSX to DOM', () => {
- renderer.render(
-
- idea2app
-
- );
- expect(document.body.innerHTML).toBe(
- 'idea2app'
- );
- });
-
- it('should render JSX fragment to DOM', () => {
- renderer.render(
- <>
-
- idea2app
-
- >
- );
- expect(document.body.innerHTML).toBe(
- 'idea2app'
- );
- });
-
- it('should render a Web components class', () => {
- renderer.render();
-
- expect(document.body.innerHTML).toBe('');
- });
-
- it('should render an HTML tag extended by a Web components class', () => {
- class MyDiv extends HTMLDivElement {}
-
- customElements.define('my-div', MyDiv, { extends: 'div' });
-
- renderer.render();
-
- expect(document.body.innerHTML).toBe('');
- });
-
- it('should ignore Empty values except 0', () => {
- renderer.render(
- <>
- {0}
- {false}
- {null}
- {undefined}
- {NaN}
- >
- );
- expect(document.body.innerHTML).toBe('0');
- });
-
- it('should render Non-empty Primitive values', () => {
- renderer.render(
- <>
- {1}
- {true}
- >
- );
- expect(document.body.innerHTML).toBe('1true');
- });
-
- it('should render DataSet & ARIA attributes', () => {
- renderer.render();
-
- expect(document.body.innerHTML).toBe(
- ''
- );
- // To Do: https://github.com/jsdom/jsdom/issues/3323
-
- // renderer.render();
-
- // expect(document.body.innerHTML).toBe('');
- });
-
- it('should call Event handlers', () => {
- const onClick = jest.fn();
-
- renderer.render();
-
- document.querySelector('i')?.click();
-
- expect(onClick).toHaveBeenCalledTimes(1);
- });
-
- it('should toggle a real DOM Node by callbacks', () => {
- const ref = jest.fn();
-
- renderer.render();
-
- const { firstChild } = document.body;
-
- expect(document.body.innerHTML).toBe('');
-
- expect(ref).toHaveBeenCalledWith(firstChild);
-
- renderer.render();
-
- expect(document.body.innerHTML).toBe('');
-
- expect(ref).toHaveBeenCalledWith();
- });
-
- it('should reuse similar DOM nodes', () => {
- const renderList = (offset = 0) =>
- renderer.render(
-
- {Array.from({ length: 2 }, (_, index) => {
- const key = String.fromCodePoint('a'.charCodeAt(0) + index + offset);
-
- return - {key}
;
- })}
-
- );
- renderList();
-
- expect(document.body.innerHTML).toBe('');
-
- const { children } = document.body.firstElementChild!;
-
- renderList(2);
-
- expect(document.body.innerHTML).toBe('');
-
- expect([...document.body.firstElementChild!.children]).toEqual([...children]);
- });
-
- it('should not share a real DOM with the same VDOM', () => {
- const oldVDOM = old;
-
- renderer.render(
- <>
-
-
- >
- );
- expect(document.body.innerHTML).toBe('');
-
- const newVDOM = new;
-
- renderer.render(
- <>
-
-
- >
- );
- expect(document.body.innerHTML).toBe('');
- });
-
- it('should handle Nested children arrays', () => {
- renderer.render(
- <>
-
- {[]}
- >
- );
- expect(document.body.innerHTML).toBe('');
- });
-
- it('should render to a Static String', () => {
- expect(renderer.renderToStaticMarkup()).toBe('');
- });
-
- it('should render SVG', () => {
- renderer.render(
- // copy from https://developer.mozilla.org/en-US/docs/Web/SVG/Tutorial/Getting_Started
-
- );
- expect(document.body.innerHTML).toBe(
- ''
- );
- expect(document.body.firstElementChild).toBeInstanceOf(SVGSVGElement);
- });
-});
diff --git a/test/renderer.spec.tsx b/test/renderer.spec.tsx
new file mode 100644
index 0000000..e862213
--- /dev/null
+++ b/test/renderer.spec.tsx
@@ -0,0 +1,120 @@
+import {
+ Props,
+ render,
+ createElement,
+ Fragment,
+ GeneratorNode
+} from '../source';
+
+const { body } = document;
+
+describe('Render methods', () => {
+ const log = jest.fn();
+
+ it('should render HTML nodes', async () => {
+ await render(
+
+ 01
+
+ );
+
+ expect(body.innerHTML).toBe('01');
+ });
+
+ function Sync({ children }: Props) {
+ return {children};
+ }
+
+ it('should render a Sync Function Component', async () => {
+ await render(2);
+
+ expect(body.innerHTML).toBe('2');
+ });
+
+ async function Async({ children }: Props) {
+ await new Promise(resolve => setTimeout(resolve));
+
+ return {children};
+ }
+
+ it('should render an Async Function Component', async () => {
+ await render(3);
+
+ expect(body.innerHTML).toBe('3');
+ });
+
+ function* Generator({ children }: Props): GeneratorNode {
+ for (const { children } of this) {
+ const element = (yield {children}
) as Element;
+
+ log(element.outerHTML);
+ }
+ }
+
+ it('should render a Generator Function Component', async () => {
+ await render(4);
+
+ expect(body.innerHTML).toBe('4
');
+ });
+
+ async function* AsyncGenerator({ children }: Props) {
+ for await (const { children } of this) {
+ const element = (yield {children}
) as Element;
+
+ log(element.outerHTML);
+ }
+ }
+
+ it('should render an Async Generator Function Component', async () => {
+ await render(5);
+
+ expect(body.innerHTML).toBe('5
');
+ });
+
+ it('should render kinds of Function Components in a Tree', async () => {
+ await render(
+
+ 01
+ 2
+ 3
+ 4
+ 5
+
+
+ );
+
+ expect(body.innerHTML).toBe(
+ `01234
5
`
+ );
+ expect(log).toBeCalledTimes(1);
+ expect(log).lastCalledWith('5
');
+ });
+
+ it('should update kinds of Function Components in a Tree', async () => {
+ await render(
+
+ 01
+ 2
+ 3-1
+ 4-1
+ 5-1
+
+
+ );
+
+ expect(body.innerHTML).toBe(
+ `0123-14-1
5-1
`
+ );
+ expect(log).toBeCalledTimes(5);
+ expect(log).lastCalledWith('7
');
+ });
+});
diff --git a/test/tsconfig.json b/test/tsconfig.json
index bff2123..06dc298 100644
--- a/test/tsconfig.json
+++ b/test/tsconfig.json
@@ -1,9 +1,7 @@
{
"extends": "../tsconfig.json",
"compilerOptions": {
- "lib": ["ESNext", "DOM", "DOM.Iterable"],
- "jsx": "react-jsx",
- "jsxImportSource": "../source"
+ "target": "ES2018"
},
- "include": ["**/*"]
+ "include": ["../source/*.ts", "*.ts", "*.tsx"]
}
diff --git a/test/updater.spec.ts b/test/updater.spec.ts
new file mode 100644
index 0000000..d118286
--- /dev/null
+++ b/test/updater.spec.ts
@@ -0,0 +1,48 @@
+import { updateProps, insertChild, updateChild } from '../source/updater';
+
+const { body } = document;
+
+describe('DOM updater', () => {
+ it('should update properties of a DOM Element', () => {
+ body.innerHTML = '';
+
+ const tag = body.firstElementChild as HTMLElement,
+ onClick = () => {};
+
+ updateProps(tag, {
+ className: 'sample',
+ style: { width: '100%' },
+ 'data-index': '0',
+ hidden: true,
+ onClick
+ });
+
+ expect(tag.outerHTML).toBe(
+ ''
+ );
+ expect(tag.onclick).toBe(onClick);
+ });
+
+ it('should insert a Node to DOM tree based on Index', () => {
+ const { childNodes } = body;
+
+ insertChild(body, 'test');
+
+ expect(childNodes[1].nodeValue).toBe('test');
+
+ insertChild(body, document.createElement('a'), 1);
+
+ expect(childNodes[1].nodeName).toBe('A');
+ });
+
+ it('should update a Child Node based on Virtual Node', () => {
+ const link = body.childNodes[1];
+
+ updateChild(body, { tagName: 'a', href: '#', childNodes: [] }, 0);
+
+ expect(body.childNodes[0]).toBe(link);
+ expect(body.innerHTML).toBe(
+ 'test'
+ );
+ });
+});
diff --git a/test/utility.spec.ts b/test/utility.spec.ts
new file mode 100644
index 0000000..be4eb33
--- /dev/null
+++ b/test/utility.spec.ts
@@ -0,0 +1,19 @@
+import { find, clearList } from '../source/utility';
+
+describe('Utility methods', () => {
+ it('should find an Item from Array-like objects with Index Offset', () => {
+ expect(
+ find(
+ document.documentElement.childNodes,
+ ({ nodeName }) => nodeName.toLowerCase() === 'body',
+ 1
+ )
+ ).toBe(document.body);
+ });
+
+ it('should clear & flatten an Array', () => {
+ expect(
+ clearList([1, [null, [2, [NaN, 3]]]])
+ ).toEqual(expect.arrayContaining([1, 2, 3]));
+ });
+});
diff --git a/tsconfig.json b/tsconfig.json
index f708f84..4735303 100644
--- a/tsconfig.json
+++ b/tsconfig.json
@@ -1,20 +1,13 @@
{
"compilerOptions": {
+ "target": "ES5",
+ "module": "ES6",
+ "moduleResolution": "Node",
"esModuleInterop": true,
- "importHelpers": true,
"downlevelIteration": true,
- "lib": ["ES2023", "DOM", "DOM.Iterable"],
- "skipLibCheck": true,
- "declaration": true,
- "outDir": "dist"
+ "jsx": "react",
+ "jsxFactory": "createElement",
+ "lib": ["ES2019", "DOM", "DOM.Iterable"]
},
- "include": ["source/**/*.ts"],
- "typedocOptions": {
- "name": "DOM Renderer",
- "excludeExternals": true,
- "excludePrivate": true,
- "readme": "ReadMe.md",
- "entryPoints": ["source/dist/index.ts", "source/jsx-runtime.ts"],
- "plugin": ["typedoc-plugin-mdn-links"]
- }
+ "include": ["source/*.ts"]
}