diff --git a/api-extractor.json b/api-extractor-base.json similarity index 75% rename from api-extractor.json rename to api-extractor-base.json index ec05f70..ddcf56c 100644 --- a/api-extractor.json +++ b/api-extractor-base.json @@ -1,8 +1,6 @@ { "$schema": "https://developer.microsoft.com/json-schemas/api-extractor/v7/api-extractor.schema.json", - "mainEntryPointFilePath": "/.cache/dts/index.d.ts", - "apiReport": { "enabled": false }, @@ -10,11 +8,6 @@ "enabled": false }, - "dtsRollup": { - "enabled": true, - "untrimmedFilePath": "/index.d.ts" - }, - "messages": { "compilerMessageReporting": { "default": { diff --git a/api-extractor-index.json b/api-extractor-index.json new file mode 100644 index 0000000..6264d36 --- /dev/null +++ b/api-extractor-index.json @@ -0,0 +1,10 @@ +{ + "$schema": "https://developer.microsoft.com/json-schemas/api-extractor/v7/api-extractor.schema.json", + + "extends": "./api-extractor-base.json", + "mainEntryPointFilePath": "/.cache/dts/index.d.ts", + "dtsRollup": { + "enabled": true, + "untrimmedFilePath": "/index.d.ts" + } +} diff --git a/api-extractor-jsx-dev-runtime.json b/api-extractor-jsx-dev-runtime.json new file mode 100644 index 0000000..29da653 --- /dev/null +++ b/api-extractor-jsx-dev-runtime.json @@ -0,0 +1,10 @@ +{ + "$schema": "https://developer.microsoft.com/json-schemas/api-extractor/v7/api-extractor.schema.json", + + "extends": "./api-extractor-base.json", + "mainEntryPointFilePath": "/.cache/dts/jsx-dev-runtime.d.ts", + "dtsRollup": { + "enabled": true, + "untrimmedFilePath": "/jsx-dev-runtime.d.ts" + } +} diff --git a/api-extractor-jsx-runtime.json b/api-extractor-jsx-runtime.json new file mode 100644 index 0000000..00f4012 --- /dev/null +++ b/api-extractor-jsx-runtime.json @@ -0,0 +1,10 @@ +{ + "$schema": "https://developer.microsoft.com/json-schemas/api-extractor/v7/api-extractor.schema.json", + + "extends": "./api-extractor-base.json", + "mainEntryPointFilePath": "/.cache/dts/jsx-runtime.d.ts", + "dtsRollup": { + "enabled": true, + "untrimmedFilePath": "/jsx-runtime.d.ts" + } +} diff --git a/index.d.ts b/index.d.ts index ae0e726..1659189 100644 --- a/index.d.ts +++ b/index.d.ts @@ -1,34 +1,113 @@ -import { JSXElementConstructor } from 'react'; import { ReactElement } from 'react'; import { ReactNode } from 'react'; import { XMLBuilder } from 'xmlbuilder2/lib/interfaces'; import { XMLBuilderCreateOptions } from 'xmlbuilder2/lib/interfaces'; -export declare function CData(props: { - children: TextChildren; -}): ReactElement>; +/** + * + * @public + */ +export declare function CData(props: { children: TextChildren }): null; -declare function Comment_2(props: { - children: TextChildren; -}): ReactElement>; +/** + * + * @public + */ +declare function Comment_2(props: { children: TextChildren }): null; export { Comment_2 as Comment }; -export declare function Fragment(props: { - children?: ReactNode; -}): ReactElement>; +/** + * + * @public + */ +export declare function createElement( + type: any, + props: any, + ...children: any[] +): JsxXmlComponentElement | JsxXmlTagElement; -export declare function Ins(props: { - target: string; - content?: string; -}): ReactElement>; +/** + * + * @public + */ +export declare function Fragment(props: { children?: ReactNode }): ReactNode; +/** + * @internal + */ +export declare function _getCurrentElement(): XMLBuilder; + +/** + * + * @public + */ +export declare function Ins(props: { target: string; content?: string }): null; + +/** + * + * @public + */ +declare function JSXXML( + type: any, + props: any, + ...children: any[] +): JsxXmlComponentElement | JsxXmlTagElement; +export { JSXXML }; +export { JSXXML as h }; + +declare const JsxXML: unique symbol; + +/** + * + * @public + */ +export declare type JsxXmlComponentElement = { + $$typeof: typeof JsxXML; + builtin: false; + type: (props: any) => JsxXmlElement; + props: any; +}; + +/** + * + * @public + */ +export declare type JsxXmlElement = JsxXmlComponentElement | JsxXmlTagElement; + +/** + * + * @public + */ +export declare type JsxXmlTagElement = { + $$typeof: typeof JsxXML; + builtin: false; + type: string; + attrs: any; + children: any; +}; + +/** + * + * @public + */ export declare function render( - element: any, + element: ReactElement | JsxXmlElement, options?: XMLBuilderCreateOptions, ): XMLBuilder; -declare type TextChild = string | number | boolean | null | undefined; +/** + * @public + */ +export declare type TextChild = string | number | boolean | null | undefined; + +/** + * @public + */ +export declare type TextChildren = TextChild | TextChildren[]; -declare type TextChildren = TextChild | TextChildren[]; +/** + * @internal + */ +export declare function _withElement(cur: XMLBuilder, fn: () => void): void; export {}; diff --git a/jsx-dev-runtime.d.ts b/jsx-dev-runtime.d.ts new file mode 100644 index 0000000..a9a50d8 --- /dev/null +++ b/jsx-dev-runtime.d.ts @@ -0,0 +1,53 @@ +import { ReactNode } from 'react'; + +/** + * + * @public + */ +export declare function Fragment(props: { children?: ReactNode }): ReactNode; + +/** + * + * @public + */ +export declare function jsxDEV( + type: any, + props: any, + key: any, + isStaticChildren: any, + source: any, + self: any, +): JsxXmlComponentElement | JsxXmlTagElement; + +declare const JsxXML: unique symbol; + +/** + * + * @public + */ +export declare type JsxXmlComponentElement = { + $$typeof: typeof JsxXML; + builtin: false; + type: (props: any) => JsxXmlElement; + props: any; +}; + +/** + * + * @public + */ +export declare type JsxXmlElement = JsxXmlComponentElement | JsxXmlTagElement; + +/** + * + * @public + */ +export declare type JsxXmlTagElement = { + $$typeof: typeof JsxXML; + builtin: false; + type: string; + attrs: any; + children: any; +}; + +export {}; diff --git a/jsx-runtime.d.ts b/jsx-runtime.d.ts new file mode 100644 index 0000000..68280d9 --- /dev/null +++ b/jsx-runtime.d.ts @@ -0,0 +1,60 @@ +import { ReactNode } from 'react'; + +/** + * + * @public + */ +export declare function Fragment(props: { children?: ReactNode }): ReactNode; + +/** + * + * @public + */ +export declare function jsx( + type: any, + props: any, + key: any, +): JsxXmlComponentElement | JsxXmlTagElement; + +/** + * + * @public + */ +export declare function jsxs( + type: any, + props: any, + key: any, +): JsxXmlComponentElement | JsxXmlTagElement; + +declare const JsxXML: unique symbol; + +/** + * + * @public + */ +export declare type JsxXmlComponentElement = { + $$typeof: typeof JsxXML; + builtin: false; + type: (props: any) => JsxXmlElement; + props: any; +}; + +/** + * + * @public + */ +export declare type JsxXmlElement = JsxXmlComponentElement | JsxXmlTagElement; + +/** + * + * @public + */ +export declare type JsxXmlTagElement = { + $$typeof: typeof JsxXML; + builtin: false; + type: string; + attrs: any; + children: any; +}; + +export {}; diff --git a/package.json b/package.json index 4e05663..eee7de4 100644 --- a/package.json +++ b/package.json @@ -5,6 +5,8 @@ "src", "dist", "index.d.ts", + "jsx-runtime.d.ts", + "jsx-dev-runtime.d.ts", "tsdoc-metadata.json" ], "license": "MIT", @@ -17,6 +19,16 @@ "types": "./index.d.ts", "require": "./dist/index.cjs", "import": "./dist/index.js" + }, + "./jsx-runtime": { + "types": "./jsx-runtime.d.ts", + "require": "./dist/jsx-runtime.cjs", + "import": "./dist/jsx-runtime.js" + }, + "./jsx-dev-runtime": { + "types": "./jsx-dev-runtime.d.ts", + "require": "./dist/jsx-dev-runtime.cjs", + "import": "./dist/jsx-dev-runtime.js" } }, "engines": { @@ -30,7 +42,10 @@ "format:check": "prettier --check '**/*.{js,jsx,ts,tsx,json,yml,css,scss,md}'", "test": "vitest --run --coverage", "test:watch": "vitest", - "build:dts": "api-extractor run --local --verbose && prettier --write index.d.ts", + "build:dts:index": "api-extractor run --local --verbose --config api-extractor-index.json && prettier --write index.d.ts", + "build:dts:jsx-runtime": "api-extractor run --local --verbose --config api-extractor-jsx-runtime.json && prettier --write jsx-runtime.d.ts", + "build:dts:jsx-dev-runtime": "api-extractor run --local --verbose --config api-extractor-jsx-dev-runtime.json && prettier --write jsx-dev-runtime.d.ts", + "build:dts": "pnpm build:dts:index && pnpm build:dts:jsx-runtime && pnpm build:dts:jsx-dev-runtime", "build": "tsc && vite build && pnpm build:dts", "prepublishOnly": "pnpm build" }, diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 06d0e2f..fe9cd5e 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -56,7 +56,56 @@ importers: version: 5.3.5(@types/node@20.14.12) vite-plugin-dts: specifier: ^3 - version: 3.9.1(@types/node@20.14.12)(rollup@4.19.0)(typescript@5.5.4)(vite@5.3.5(@types/node@20.14.12)) + version: 3.9.1(@types/node@20.14.12)(rollup@4.27.3)(typescript@5.5.4)(vite@5.3.5(@types/node@20.14.12)) + vitest: + specifier: ^1 + version: 1.6.0(@types/node@20.14.12) + + examples/jsx-xml-example: + dependencies: + jsx-xml: + specifier: workspace:* + version: link:../.. + react: + specifier: ^18.3.1 + version: 18.3.1 + react-dom: + specifier: ^18.3.1 + version: 18.3.1(react@18.3.1) + devDependencies: + '@eslint/js': + specifier: ^9.15.0 + version: 9.15.0 + '@types/react': + specifier: ^18.3.12 + version: 18.3.12 + '@types/react-dom': + specifier: ^18.3.1 + version: 18.3.1 + '@vitejs/plugin-react': + specifier: ^4.3.4 + version: 4.3.4(vite@6.0.1(@types/node@20.14.12)(yaml@2.4.5)) + eslint: + specifier: ^9.15.0 + version: 9.15.0 + eslint-plugin-react-hooks: + specifier: ^5.0.0 + version: 5.0.0(eslint@9.15.0) + eslint-plugin-react-refresh: + specifier: ^0.4.14 + version: 0.4.14(eslint@9.15.0) + globals: + specifier: ^15.12.0 + version: 15.12.0 + typescript: + specifier: ~5.6.2 + version: 5.6.3 + typescript-eslint: + specifier: ^8.15.0 + version: 8.15.0(eslint@9.15.0)(typescript@5.6.3) + vite: + specifier: ^6.0.1 + version: 6.0.1(@types/node@20.14.12)(yaml@2.4.5) vitest: specifier: ^1 version: 1.6.0(@types/node@20.14.12) @@ -71,14 +120,26 @@ packages: resolution: {integrity: sha512-BcYH1CVJBO9tvyIZ2jVeXgSIMvGZ2FDRvDdOIVQyuklNKSsx+eppDEBq/g47Ayw+RqNFE+URvOShmf+f/qwAlA==} engines: {node: '>=6.9.0'} + '@babel/code-frame@7.26.2': + resolution: {integrity: sha512-RJlIHRueQgwWitWgF8OdFYGZX328Ax5BCemNGlqHfplnRT9ESi8JkFlvaVYbS+UubVY6dpv87Fs2u5M29iNFVQ==} + engines: {node: '>=6.9.0'} + '@babel/compat-data@7.25.0': resolution: {integrity: sha512-P4fwKI2mjEb3ZU5cnMJzvRsRKGBUcs8jvxIoRmr6ufAY9Xk2Bz7JubRTTivkw55c7WQJfTECeqYVa+HZ0FzREg==} engines: {node: '>=6.9.0'} + '@babel/compat-data@7.26.2': + resolution: {integrity: sha512-Z0WgzSEa+aUcdiJuCIqgujCshpMWgUpgOxXotrYPSA53hA3qopNaqcJpyr0hVb1FeWdnqFA35/fUtXgBK8srQg==} + engines: {node: '>=6.9.0'} + '@babel/core@7.24.9': resolution: {integrity: sha512-5e3FI4Q3M3Pbr21+5xJwCv6ZT6KmGkI0vw3Tozy5ODAQFTIWe37iT8Cr7Ice2Ntb+M3iSKCEWMB1MBgKrW3whg==} engines: {node: '>=6.9.0'} + '@babel/core@7.26.0': + resolution: {integrity: sha512-i1SLeK+DzNnQ3LL/CswPCa/E5u4lh1k6IAEphON8F+cXt0t9euTshDru0q7/IqMa1PMPz5RnHuHscF8/ZJsStg==} + engines: {node: '>=6.9.0'} + '@babel/eslint-parser@7.25.0': resolution: {integrity: sha512-mlcTKuQAjczDRwWLIxv+Q925jaMUO8Jl5dxmWJSSGVYfZ4rKMp8daQvVC3rM1G2v8V+/fO0yIVTSLS+2zcB8rg==} engines: {node: ^10.13.0 || ^12.13.0 || >=14.0.0} @@ -90,6 +151,10 @@ packages: resolution: {integrity: sha512-3LEEcj3PVW8pW2R1SR1M89g/qrYk/m/mB/tLqn7dn4sbBUQyTqnlod+II2U4dqiGtUmkcnAmkMDralTFZttRiw==} engines: {node: '>=6.9.0'} + '@babel/generator@7.26.2': + resolution: {integrity: sha512-zevQbhbau95nkoxSq3f/DC/SC+EEOUZd3DYqfSkMhY2/wfSeaHV1Ew4vk8e+x8lja31IbyuUa2uQ3JONqKbysw==} + engines: {node: '>=6.9.0'} + '@babel/helper-annotate-as-pure@7.24.7': resolution: {integrity: sha512-BaDeOonYvhdKw+JoMVkAixAAJzG2jVPIwWoKBPdYuY9b452e2rPuI9QPYh3KpofZ3pW2akOmwZLOiOsHMiqRAg==} engines: {node: '>=6.9.0'} @@ -102,6 +167,10 @@ packages: resolution: {integrity: sha512-oU+UoqCHdp+nWVDkpldqIQL/i/bvAv53tRqLG/s+cOXxe66zOYLU7ar/Xs3LdmBihrUMEUhwu6dMZwbNOYDwvw==} engines: {node: '>=6.9.0'} + '@babel/helper-compilation-targets@7.25.9': + resolution: {integrity: sha512-j9Db8Suy6yV/VHa4qzrj9yZfZxhLWQdVnRlXxmKLYlhWUVB1sB2G5sxuWYXk/whHD9iW76PmNzxZ4UCnTQTVEQ==} + engines: {node: '>=6.9.0'} + '@babel/helper-create-class-features-plugin@7.25.0': resolution: {integrity: sha512-GYM6BxeQsETc9mnct+nIIpf63SAyzvyYN7UB/IlTyd+MBg06afFGp0mIeUqGyWgS2mxad6vqbMrHVlaL3m70sQ==} engines: {node: '>=6.9.0'} @@ -127,12 +196,22 @@ packages: resolution: {integrity: sha512-8AyH3C+74cgCVVXow/myrynrAGv+nTVg5vKu2nZph9x7RcRwzmh0VFallJuFTZ9mx6u4eSdXZfcOzSqTUm0HCA==} engines: {node: '>=6.9.0'} + '@babel/helper-module-imports@7.25.9': + resolution: {integrity: sha512-tnUA4RsrmflIM6W6RFTLFSXITtl0wKjgpnLgXyowocVPrbYrLUXSBXDgTs8BlbmIzIdlBySRQjINYs2BAkiLtw==} + engines: {node: '>=6.9.0'} + '@babel/helper-module-transforms@7.25.0': resolution: {integrity: sha512-bIkOa2ZJYn7FHnepzr5iX9Kmz8FjIz4UKzJ9zhX3dnYuVW0xul9RuR3skBfoLu+FPTQw90EHW9rJsSZhyLQ3fQ==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0 + '@babel/helper-module-transforms@7.26.0': + resolution: {integrity: sha512-xO+xu6B5K2czEnQye6BHA7DolFFmS3LB7stHZFaOLb1pAwO1HWLS8fXA+eh0A2yIvltPVmx3eNNDBJA2SLHXFw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0 + '@babel/helper-optimise-call-expression@7.24.7': resolution: {integrity: sha512-jKiTsW2xmWwxT1ixIdfXUZp+P5yURx2suzLZr5Hi64rURpDYdMW0pv+Uf17EYk2Rd428Lx4tLsnjGJzYKDM/6A==} engines: {node: '>=6.9.0'} @@ -141,6 +220,10 @@ packages: resolution: {integrity: sha512-FFWx5142D8h2Mgr/iPVGH5G7w6jDn4jUSpZTyDnQO0Yn7Ks2Kuz6Pci8H6MPCoUJegd/UZQ3tAvfLCxQSnWWwg==} engines: {node: '>=6.9.0'} + '@babel/helper-plugin-utils@7.25.9': + resolution: {integrity: sha512-kSMlyUVdWe25rEsRGviIgOWnoT/nfABVWlqt9N19/dIPWViAOW2s9wznP5tURbs/IDuNk4gPy3YdYRgH3uxhBw==} + engines: {node: '>=6.9.0'} + '@babel/helper-remap-async-to-generator@7.25.0': resolution: {integrity: sha512-NhavI2eWEIz/H9dbrG0TuOicDhNexze43i5z7lEqwYm0WEZVTwnPpA0EafUTP7+6/W79HWIP2cTe3Z5NiSTVpw==} engines: {node: '>=6.9.0'} @@ -165,14 +248,26 @@ packages: resolution: {integrity: sha512-pO9KhhRcuUyGnJWwyEgnRJTSIZHiT+vMD0kPeD+so0l7mxkMT19g3pjY9GTnHySck/hDzq+dtW/4VgnMkippsQ==} engines: {node: '>=6.9.0'} + '@babel/helper-string-parser@7.25.9': + resolution: {integrity: sha512-4A/SCr/2KLd5jrtOMFzaKjVtAei3+2r/NChoBNoZ3EyP/+GlhoaEGoWOZUmFmoITP7zOJyHIMm+DYRd8o3PvHA==} + engines: {node: '>=6.9.0'} + '@babel/helper-validator-identifier@7.24.7': resolution: {integrity: sha512-rR+PBcQ1SMQDDyF6X0wxtG8QyLCgUB0eRAGguqRLfkCA87l7yAP7ehq8SNj96OOGTO8OBV70KhuFYcIkHXOg0w==} engines: {node: '>=6.9.0'} + '@babel/helper-validator-identifier@7.25.9': + resolution: {integrity: sha512-Ed61U6XJc3CVRfkERJWDz4dJwKe7iLmmJsbOGu9wSloNSFttHV0I8g6UAgb7qnK5ly5bGLPd4oXZlxCdANBOWQ==} + engines: {node: '>=6.9.0'} + '@babel/helper-validator-option@7.24.8': resolution: {integrity: sha512-xb8t9tD1MHLungh/AIoWYN+gVHaB9kwlu8gffXGSt3FFEIT7RjS+xWbc2vUD1UTZdIpKj/ab3rdqJ7ufngyi2Q==} engines: {node: '>=6.9.0'} + '@babel/helper-validator-option@7.25.9': + resolution: {integrity: sha512-e/zv1co8pp55dNdEcCynfj9X7nyUKUXoUEwfXqaZt0omVOmDe9oOTdKStH4GmAw6zxMFs50ZayuMfHDKlO7Tfw==} + engines: {node: '>=6.9.0'} + '@babel/helper-wrap-function@7.25.0': resolution: {integrity: sha512-s6Q1ebqutSiZnEjaofc/UKDyC4SbzV5n5SrA2Gq8UawLycr3i04f1dX4OzoQVnexm6aOCh37SQNYlJ/8Ku+PMQ==} engines: {node: '>=6.9.0'} @@ -181,6 +276,10 @@ packages: resolution: {integrity: sha512-MjgLZ42aCm0oGjJj8CtSM3DB8NOOf8h2l7DCTePJs29u+v7yO/RBX9nShlKMgFnRks/Q4tBAe7Hxnov9VkGwLw==} engines: {node: '>=6.9.0'} + '@babel/helpers@7.26.0': + resolution: {integrity: sha512-tbhNuIxNcVb21pInl3ZSjksLCvgdZy9KwJ8brv993QtIVKJBBkYXz4q4ZbAv31GdnC+R90np23L5FbEBlthAEw==} + engines: {node: '>=6.9.0'} + '@babel/highlight@7.24.7': resolution: {integrity: sha512-EStJpq4OuY8xYfhGVXngigBJRWxftKX9ksiGDnmlY3o7B/V7KIAc9X4oiK87uPJSc/vs5L869bem5fhZa8caZw==} engines: {node: '>=6.9.0'} @@ -190,6 +289,11 @@ packages: engines: {node: '>=6.0.0'} hasBin: true + '@babel/parser@7.26.2': + resolution: {integrity: sha512-DWMCZH9WA4Maitz2q21SRKHo9QXZxkDsbNZoVD62gusNtNBBqDg9i7uOhASfTfIGNzW+O+r7+jAlM8dwphcJKQ==} + engines: {node: '>=6.0.0'} + hasBin: true + '@babel/plugin-bugfix-firefox-class-in-computed-class-key@7.25.0': resolution: {integrity: sha512-dG0aApncVQwAUJa8tP1VHTnmU67BeIQvKafd3raEx315H54FfkZSz3B/TT+33ZQAjatGJA79gZqTtqL5QZUKXw==} engines: {node: '>=6.9.0'} @@ -640,6 +744,18 @@ packages: peerDependencies: '@babel/core': ^7.0.0-0 + '@babel/plugin-transform-react-jsx-self@7.25.9': + resolution: {integrity: sha512-y8quW6p0WHkEhmErnfe58r7x0A70uKphQm8Sp8cV7tjNQwK56sNVK0M73LK3WuYmsuyrftut4xAkjjgU0twaMg==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-react-jsx-source@7.25.9': + resolution: {integrity: sha512-+iqjT8xmXhhYv4/uiYd8FNQsraMFZIfxVSqxxVSZP0WbbSAWvBXAul0m/zu+7Vv4O/3WtApy9pmaTMiumEZgfg==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + '@babel/plugin-transform-react-jsx@7.24.7': resolution: {integrity: sha512-+Dj06GDZEFRYvclU6k4bme55GKBEWUmByM/eoKuqg4zTNQHiApWRhQph5fxQB2wAEFvRzL1tOEj1RJ19wJrhoA==} engines: {node: '>=6.9.0'} @@ -764,152 +880,308 @@ packages: resolution: {integrity: sha512-aOOgh1/5XzKvg1jvVz7AVrx2piJ2XBi227DHmbY6y+bM9H2FlN+IfecYu4Xl0cNiiVejlsCri89LUsbj8vJD9Q==} engines: {node: '>=6.9.0'} + '@babel/template@7.25.9': + resolution: {integrity: sha512-9DGttpmPvIxBb/2uwpVo3dqJ+O6RooAFOS+lB+xDqoE2PVCE8nfoHMdZLpfCQRLwvohzXISPZcgxt80xLfsuwg==} + engines: {node: '>=6.9.0'} + '@babel/traverse@7.25.0': resolution: {integrity: sha512-ubALThHQy4GCf6mbb+5ZRNmLLCI7bJ3f8Q6LHBSRlSKSWj5a7dSUzJBLv3VuIhFrFPgjF4IzPF567YG/HSCdZA==} engines: {node: '>=6.9.0'} + '@babel/traverse@7.25.9': + resolution: {integrity: sha512-ZCuvfwOwlz/bawvAuvcj8rrithP2/N55Tzz342AkTvq4qaWbGfmCk/tKhNaV2cthijKrPAA8SRJV5WWe7IBMJw==} + engines: {node: '>=6.9.0'} + '@babel/types@7.25.0': resolution: {integrity: sha512-LcnxQSsd9aXOIgmmSpvZ/1yo46ra2ESYyqLcryaBZOghxy5qqOBjvCWP5JfkI8yl9rlxRgdLTTMCQQRcN2hdCg==} engines: {node: '>=6.9.0'} + '@babel/types@7.26.0': + resolution: {integrity: sha512-Z/yiTPj+lDVnF7lWeKCIJzaIkI0vYO87dMpZ4bg4TDrFe4XXLFWL1TbXU27gBP3QccxV9mZICCrnjnYlJjXHOA==} + engines: {node: '>=6.9.0'} + '@esbuild/aix-ppc64@0.21.5': resolution: {integrity: sha512-1SDgH6ZSPTlggy1yI6+Dbkiz8xzpHJEVAlF/AM1tHPLsf5STom9rwtjE4hKAF20FfXXNTFqEYXyJNWh1GiZedQ==} engines: {node: '>=12'} cpu: [ppc64] os: [aix] + '@esbuild/aix-ppc64@0.24.0': + resolution: {integrity: sha512-WtKdFM7ls47zkKHFVzMz8opM7LkcsIp9amDUBIAWirg70RM71WRSjdILPsY5Uv1D42ZpUfaPILDlfactHgsRkw==} + engines: {node: '>=18'} + cpu: [ppc64] + os: [aix] + '@esbuild/android-arm64@0.21.5': resolution: {integrity: sha512-c0uX9VAUBQ7dTDCjq+wdyGLowMdtR/GoC2U5IYk/7D1H1JYC0qseD7+11iMP2mRLN9RcCMRcjC4YMclCzGwS/A==} engines: {node: '>=12'} cpu: [arm64] os: [android] + '@esbuild/android-arm64@0.24.0': + resolution: {integrity: sha512-Vsm497xFM7tTIPYK9bNTYJyF/lsP590Qc1WxJdlB6ljCbdZKU9SY8i7+Iin4kyhV/KV5J2rOKsBQbB77Ab7L/w==} + engines: {node: '>=18'} + cpu: [arm64] + os: [android] + '@esbuild/android-arm@0.21.5': resolution: {integrity: sha512-vCPvzSjpPHEi1siZdlvAlsPxXl7WbOVUBBAowWug4rJHb68Ox8KualB+1ocNvT5fjv6wpkX6o/iEpbDrf68zcg==} engines: {node: '>=12'} cpu: [arm] os: [android] + '@esbuild/android-arm@0.24.0': + resolution: {integrity: sha512-arAtTPo76fJ/ICkXWetLCc9EwEHKaeya4vMrReVlEIUCAUncH7M4bhMQ+M9Vf+FFOZJdTNMXNBrWwW+OXWpSew==} + engines: {node: '>=18'} + cpu: [arm] + os: [android] + '@esbuild/android-x64@0.21.5': resolution: {integrity: sha512-D7aPRUUNHRBwHxzxRvp856rjUHRFW1SdQATKXH2hqA0kAZb1hKmi02OpYRacl0TxIGz/ZmXWlbZgjwWYaCakTA==} engines: {node: '>=12'} cpu: [x64] os: [android] + '@esbuild/android-x64@0.24.0': + resolution: {integrity: sha512-t8GrvnFkiIY7pa7mMgJd7p8p8qqYIz1NYiAoKc75Zyv73L3DZW++oYMSHPRarcotTKuSs6m3hTOa5CKHaS02TQ==} + engines: {node: '>=18'} + cpu: [x64] + os: [android] + '@esbuild/darwin-arm64@0.21.5': resolution: {integrity: sha512-DwqXqZyuk5AiWWf3UfLiRDJ5EDd49zg6O9wclZ7kUMv2WRFr4HKjXp/5t8JZ11QbQfUS6/cRCKGwYhtNAY88kQ==} engines: {node: '>=12'} cpu: [arm64] os: [darwin] + '@esbuild/darwin-arm64@0.24.0': + resolution: {integrity: sha512-CKyDpRbK1hXwv79soeTJNHb5EiG6ct3efd/FTPdzOWdbZZfGhpbcqIpiD0+vwmpu0wTIL97ZRPZu8vUt46nBSw==} + engines: {node: '>=18'} + cpu: [arm64] + os: [darwin] + '@esbuild/darwin-x64@0.21.5': resolution: {integrity: sha512-se/JjF8NlmKVG4kNIuyWMV/22ZaerB+qaSi5MdrXtd6R08kvs2qCN4C09miupktDitvh8jRFflwGFBQcxZRjbw==} engines: {node: '>=12'} cpu: [x64] os: [darwin] + '@esbuild/darwin-x64@0.24.0': + resolution: {integrity: sha512-rgtz6flkVkh58od4PwTRqxbKH9cOjaXCMZgWD905JOzjFKW+7EiUObfd/Kav+A6Gyud6WZk9w+xu6QLytdi2OA==} + engines: {node: '>=18'} + cpu: [x64] + os: [darwin] + '@esbuild/freebsd-arm64@0.21.5': resolution: {integrity: sha512-5JcRxxRDUJLX8JXp/wcBCy3pENnCgBR9bN6JsY4OmhfUtIHe3ZW0mawA7+RDAcMLrMIZaf03NlQiX9DGyB8h4g==} engines: {node: '>=12'} cpu: [arm64] os: [freebsd] + '@esbuild/freebsd-arm64@0.24.0': + resolution: {integrity: sha512-6Mtdq5nHggwfDNLAHkPlyLBpE5L6hwsuXZX8XNmHno9JuL2+bg2BX5tRkwjyfn6sKbxZTq68suOjgWqCicvPXA==} + engines: {node: '>=18'} + cpu: [arm64] + os: [freebsd] + '@esbuild/freebsd-x64@0.21.5': resolution: {integrity: sha512-J95kNBj1zkbMXtHVH29bBriQygMXqoVQOQYA+ISs0/2l3T9/kj42ow2mpqerRBxDJnmkUDCaQT/dfNXWX/ZZCQ==} engines: {node: '>=12'} cpu: [x64] os: [freebsd] + '@esbuild/freebsd-x64@0.24.0': + resolution: {integrity: sha512-D3H+xh3/zphoX8ck4S2RxKR6gHlHDXXzOf6f/9dbFt/NRBDIE33+cVa49Kil4WUjxMGW0ZIYBYtaGCa2+OsQwQ==} + engines: {node: '>=18'} + cpu: [x64] + os: [freebsd] + '@esbuild/linux-arm64@0.21.5': resolution: {integrity: sha512-ibKvmyYzKsBeX8d8I7MH/TMfWDXBF3db4qM6sy+7re0YXya+K1cem3on9XgdT2EQGMu4hQyZhan7TeQ8XkGp4Q==} engines: {node: '>=12'} cpu: [arm64] os: [linux] + '@esbuild/linux-arm64@0.24.0': + resolution: {integrity: sha512-TDijPXTOeE3eaMkRYpcy3LarIg13dS9wWHRdwYRnzlwlA370rNdZqbcp0WTyyV/k2zSxfko52+C7jU5F9Tfj1g==} + engines: {node: '>=18'} + cpu: [arm64] + os: [linux] + '@esbuild/linux-arm@0.21.5': resolution: {integrity: sha512-bPb5AHZtbeNGjCKVZ9UGqGwo8EUu4cLq68E95A53KlxAPRmUyYv2D6F0uUI65XisGOL1hBP5mTronbgo+0bFcA==} engines: {node: '>=12'} cpu: [arm] os: [linux] + '@esbuild/linux-arm@0.24.0': + resolution: {integrity: sha512-gJKIi2IjRo5G6Glxb8d3DzYXlxdEj2NlkixPsqePSZMhLudqPhtZ4BUrpIuTjJYXxvF9njql+vRjB2oaC9XpBw==} + engines: {node: '>=18'} + cpu: [arm] + os: [linux] + '@esbuild/linux-ia32@0.21.5': resolution: {integrity: sha512-YvjXDqLRqPDl2dvRODYmmhz4rPeVKYvppfGYKSNGdyZkA01046pLWyRKKI3ax8fbJoK5QbxblURkwK/MWY18Tg==} engines: {node: '>=12'} cpu: [ia32] os: [linux] + '@esbuild/linux-ia32@0.24.0': + resolution: {integrity: sha512-K40ip1LAcA0byL05TbCQ4yJ4swvnbzHscRmUilrmP9Am7//0UjPreh4lpYzvThT2Quw66MhjG//20mrufm40mA==} + engines: {node: '>=18'} + cpu: [ia32] + os: [linux] + '@esbuild/linux-loong64@0.21.5': resolution: {integrity: sha512-uHf1BmMG8qEvzdrzAqg2SIG/02+4/DHB6a9Kbya0XDvwDEKCoC8ZRWI5JJvNdUjtciBGFQ5PuBlpEOXQj+JQSg==} engines: {node: '>=12'} cpu: [loong64] os: [linux] + '@esbuild/linux-loong64@0.24.0': + resolution: {integrity: sha512-0mswrYP/9ai+CU0BzBfPMZ8RVm3RGAN/lmOMgW4aFUSOQBjA31UP8Mr6DDhWSuMwj7jaWOT0p0WoZ6jeHhrD7g==} + engines: {node: '>=18'} + cpu: [loong64] + os: [linux] + '@esbuild/linux-mips64el@0.21.5': resolution: {integrity: sha512-IajOmO+KJK23bj52dFSNCMsz1QP1DqM6cwLUv3W1QwyxkyIWecfafnI555fvSGqEKwjMXVLokcV5ygHW5b3Jbg==} engines: {node: '>=12'} cpu: [mips64el] os: [linux] + '@esbuild/linux-mips64el@0.24.0': + resolution: {integrity: sha512-hIKvXm0/3w/5+RDtCJeXqMZGkI2s4oMUGj3/jM0QzhgIASWrGO5/RlzAzm5nNh/awHE0A19h/CvHQe6FaBNrRA==} + engines: {node: '>=18'} + cpu: [mips64el] + os: [linux] + '@esbuild/linux-ppc64@0.21.5': resolution: {integrity: sha512-1hHV/Z4OEfMwpLO8rp7CvlhBDnjsC3CttJXIhBi+5Aj5r+MBvy4egg7wCbe//hSsT+RvDAG7s81tAvpL2XAE4w==} engines: {node: '>=12'} cpu: [ppc64] os: [linux] + '@esbuild/linux-ppc64@0.24.0': + resolution: {integrity: sha512-HcZh5BNq0aC52UoocJxaKORfFODWXZxtBaaZNuN3PUX3MoDsChsZqopzi5UupRhPHSEHotoiptqikjN/B77mYQ==} + engines: {node: '>=18'} + cpu: [ppc64] + os: [linux] + '@esbuild/linux-riscv64@0.21.5': resolution: {integrity: sha512-2HdXDMd9GMgTGrPWnJzP2ALSokE/0O5HhTUvWIbD3YdjME8JwvSCnNGBnTThKGEB91OZhzrJ4qIIxk/SBmyDDA==} engines: {node: '>=12'} cpu: [riscv64] os: [linux] + '@esbuild/linux-riscv64@0.24.0': + resolution: {integrity: sha512-bEh7dMn/h3QxeR2KTy1DUszQjUrIHPZKyO6aN1X4BCnhfYhuQqedHaa5MxSQA/06j3GpiIlFGSsy1c7Gf9padw==} + engines: {node: '>=18'} + cpu: [riscv64] + os: [linux] + '@esbuild/linux-s390x@0.21.5': resolution: {integrity: sha512-zus5sxzqBJD3eXxwvjN1yQkRepANgxE9lgOW2qLnmr8ikMTphkjgXu1HR01K4FJg8h1kEEDAqDcZQtbrRnB41A==} engines: {node: '>=12'} cpu: [s390x] os: [linux] + '@esbuild/linux-s390x@0.24.0': + resolution: {integrity: sha512-ZcQ6+qRkw1UcZGPyrCiHHkmBaj9SiCD8Oqd556HldP+QlpUIe2Wgn3ehQGVoPOvZvtHm8HPx+bH20c9pvbkX3g==} + engines: {node: '>=18'} + cpu: [s390x] + os: [linux] + '@esbuild/linux-x64@0.21.5': resolution: {integrity: sha512-1rYdTpyv03iycF1+BhzrzQJCdOuAOtaqHTWJZCWvijKD2N5Xu0TtVC8/+1faWqcP9iBCWOmjmhoH94dH82BxPQ==} engines: {node: '>=12'} cpu: [x64] os: [linux] + '@esbuild/linux-x64@0.24.0': + resolution: {integrity: sha512-vbutsFqQ+foy3wSSbmjBXXIJ6PL3scghJoM8zCL142cGaZKAdCZHyf+Bpu/MmX9zT9Q0zFBVKb36Ma5Fzfa8xA==} + engines: {node: '>=18'} + cpu: [x64] + os: [linux] + '@esbuild/netbsd-x64@0.21.5': resolution: {integrity: sha512-Woi2MXzXjMULccIwMnLciyZH4nCIMpWQAs049KEeMvOcNADVxo0UBIQPfSmxB3CWKedngg7sWZdLvLczpe0tLg==} engines: {node: '>=12'} cpu: [x64] os: [netbsd] + '@esbuild/netbsd-x64@0.24.0': + resolution: {integrity: sha512-hjQ0R/ulkO8fCYFsG0FZoH+pWgTTDreqpqY7UnQntnaKv95uP5iW3+dChxnx7C3trQQU40S+OgWhUVwCjVFLvg==} + engines: {node: '>=18'} + cpu: [x64] + os: [netbsd] + + '@esbuild/openbsd-arm64@0.24.0': + resolution: {integrity: sha512-MD9uzzkPQbYehwcN583yx3Tu5M8EIoTD+tUgKF982WYL9Pf5rKy9ltgD0eUgs8pvKnmizxjXZyLt0z6DC3rRXg==} + engines: {node: '>=18'} + cpu: [arm64] + os: [openbsd] + '@esbuild/openbsd-x64@0.21.5': resolution: {integrity: sha512-HLNNw99xsvx12lFBUwoT8EVCsSvRNDVxNpjZ7bPn947b8gJPzeHWyNVhFsaerc0n3TsbOINvRP2byTZ5LKezow==} engines: {node: '>=12'} cpu: [x64] os: [openbsd] + '@esbuild/openbsd-x64@0.24.0': + resolution: {integrity: sha512-4ir0aY1NGUhIC1hdoCzr1+5b43mw99uNwVzhIq1OY3QcEwPDO3B7WNXBzaKY5Nsf1+N11i1eOfFcq+D/gOS15Q==} + engines: {node: '>=18'} + cpu: [x64] + os: [openbsd] + '@esbuild/sunos-x64@0.21.5': resolution: {integrity: sha512-6+gjmFpfy0BHU5Tpptkuh8+uw3mnrvgs+dSPQXQOv3ekbordwnzTVEb4qnIvQcYXq6gzkyTnoZ9dZG+D4garKg==} engines: {node: '>=12'} cpu: [x64] os: [sunos] + '@esbuild/sunos-x64@0.24.0': + resolution: {integrity: sha512-jVzdzsbM5xrotH+W5f1s+JtUy1UWgjU0Cf4wMvffTB8m6wP5/kx0KiaLHlbJO+dMgtxKV8RQ/JvtlFcdZ1zCPA==} + engines: {node: '>=18'} + cpu: [x64] + os: [sunos] + '@esbuild/win32-arm64@0.21.5': resolution: {integrity: sha512-Z0gOTd75VvXqyq7nsl93zwahcTROgqvuAcYDUr+vOv8uHhNSKROyU961kgtCD1e95IqPKSQKH7tBTslnS3tA8A==} engines: {node: '>=12'} cpu: [arm64] os: [win32] + '@esbuild/win32-arm64@0.24.0': + resolution: {integrity: sha512-iKc8GAslzRpBytO2/aN3d2yb2z8XTVfNV0PjGlCxKo5SgWmNXx82I/Q3aG1tFfS+A2igVCY97TJ8tnYwpUWLCA==} + engines: {node: '>=18'} + cpu: [arm64] + os: [win32] + '@esbuild/win32-ia32@0.21.5': resolution: {integrity: sha512-SWXFF1CL2RVNMaVs+BBClwtfZSvDgtL//G/smwAc5oVK/UPu2Gu9tIaRgFmYFFKrmg3SyAjSrElf0TiJ1v8fYA==} engines: {node: '>=12'} cpu: [ia32] os: [win32] + '@esbuild/win32-ia32@0.24.0': + resolution: {integrity: sha512-vQW36KZolfIudCcTnaTpmLQ24Ha1RjygBo39/aLkM2kmjkWmZGEJ5Gn9l5/7tzXA42QGIoWbICfg6KLLkIw6yw==} + engines: {node: '>=18'} + cpu: [ia32] + os: [win32] + '@esbuild/win32-x64@0.21.5': resolution: {integrity: sha512-tQd/1efJuzPC6rCFwEvLtci/xNFcTZknmXs98FYDfGE4wP9ClFV98nyKrzJKVPMhdDnjzLhdUyMX4PsQAPjwIw==} engines: {node: '>=12'} cpu: [x64] os: [win32] + '@esbuild/win32-x64@0.24.0': + resolution: {integrity: sha512-7IAFPrjSQIJrGsK6flwg7NFmwBoSTyF3rl7If0hNUFQU4ilTsEPL6GuMuU9BfIWVVGuRnuIidkSMC+c0Otu8IA==} + engines: {node: '>=18'} + cpu: [x64] + os: [win32] + '@eslint-community/eslint-utils@4.4.0': resolution: {integrity: sha512-1/sA4dwrzBAyeUoQ6oxahHKmrZvsnLCg4RfxW3ZFGGmQkSNQPFNLV9CUEFQP1x9EYXHTo5p6xdhZM1Ne9p/AfA==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} @@ -920,14 +1192,50 @@ packages: resolution: {integrity: sha512-G/M/tIiMrTAxEWRfLfQJMmGNX28IxBg4PBz8XqQhqUHLFI6TL2htpIB1iQCj144V5ee/JaKyT9/WZ0MGZWfA7A==} engines: {node: ^12.0.0 || ^14.0.0 || >=16.0.0} + '@eslint-community/regexpp@4.12.1': + resolution: {integrity: sha512-CCZCDJuduB9OUkFkY2IgppNZMi2lBQgD2qzwXkEia16cge2pijY/aXi96CJMquDMn3nJdlPV1A5KrJEXwfLNzQ==} + engines: {node: ^12.0.0 || ^14.0.0 || >=16.0.0} + + '@eslint/config-array@0.19.0': + resolution: {integrity: sha512-zdHg2FPIFNKPdcHWtiNT+jEFCHYVplAXRDlQDyqy0zGx/q2parwh7brGJSiTxRk/TSMkbM//zt/f5CHgyTyaSQ==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + + '@eslint/core@0.9.0': + resolution: {integrity: sha512-7ATR9F0e4W85D/0w7cU0SNj7qkAexMG+bAHEZOjo9akvGuhHE2m7umzWzfnpa0XAg5Kxc1BWmtPMV67jJ+9VUg==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + '@eslint/eslintrc@2.1.4': resolution: {integrity: sha512-269Z39MS6wVJtsoUl10L60WdkhJVdPG24Q4eZTH3nnF6lpvSShEK3wQjDX9JRWAUPvPh7COouPpU9IrqaZFvtQ==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + '@eslint/eslintrc@3.2.0': + resolution: {integrity: sha512-grOjVNN8P3hjJn/eIETF1wwd12DdnwFDoyceUJLYYdkpbwq3nLi+4fqrTAONx7XDALqlL220wC/RHSC/QTI/0w==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + '@eslint/js@8.57.0': resolution: {integrity: sha512-Ys+3g2TaW7gADOJzPt83SJtCDhMjndcDMFVQ/Tj9iA1BfJzFKD9mAUXT3OenpuPHbI6P/myECxRJrofUsDx/5g==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + '@eslint/js@9.15.0': + resolution: {integrity: sha512-tMTqrY+EzbXmKJR5ToI8lxu7jaN5EdmrBFJpQk5JmSlyLsx6o4t27r883K5xsLuCYCpfKBCGswMSWXsM+jB7lg==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + + '@eslint/object-schema@2.1.4': + resolution: {integrity: sha512-BsWiH1yFGjXXS2yvrf5LyuoSIIbPrGUWob917o+BTKuZ7qJdxX8aJLRxs1fS9n6r7vESrq1OUqb68dANcFXuQQ==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + + '@eslint/plugin-kit@0.2.3': + resolution: {integrity: sha512-2b/g5hRmpbb1o4GnTZax9N9m0FXzz9OV42ZzI4rDDMDuHUqigAiQCEWChBWCY4ztAGVRjoWT19v0yMmc5/L5kA==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + + '@humanfs/core@0.19.1': + resolution: {integrity: sha512-5DyQ4+1JEUzejeK1JGICcideyfUbGixgS9jNgex5nqkW+cY7WZhxBigmieN5Qnw9ZosSNVC9KQKyb+GUaGyKUA==} + engines: {node: '>=18.18.0'} + + '@humanfs/node@0.16.6': + resolution: {integrity: sha512-YuI2ZHQL78Q5HbhDiBA1X4LmYdXCKCMQIfw0pw7piHJwyREFebJUvrQN4cMssyES6x+vfUbx1CIpaQUKYdQZOw==} + engines: {node: '>=18.18.0'} + '@humanwhocodes/config-array@0.11.14': resolution: {integrity: sha512-3T8LkOmg45BV5FICb15QQMsyUSWrQ8AygVfC7ZG32zOalnqrilm018ZVCw0eapXux8FtA33q8PSRSstjee3jSg==} engines: {node: '>=10.10.0'} @@ -941,6 +1249,14 @@ packages: resolution: {integrity: sha512-93zYdMES/c1D69yZiKDBj0V24vqNzB/koF26KPaagAfd3P/4gUlh3Dys5ogAK+Exi9QyzlD8x/08Zt7wIKcDcA==} deprecated: Use @eslint/object-schema instead + '@humanwhocodes/retry@0.3.1': + resolution: {integrity: sha512-JBxkERygn7Bv/GbN5Rv8Ul6LVknS+5Bp6RgDC/O8gEBU/yeH5Ui5C/OlWrTb6qct7LjjfT6Re2NxB0ln0yYybA==} + engines: {node: '>=18.18'} + + '@humanwhocodes/retry@0.4.1': + resolution: {integrity: sha512-c7hNEllBlenFTHBky65mhq8WD2kbN9Q6gk0bTk8lSBvc554jpXSkST1iePudpt7+A/AQvuHs9EMqjHDXMY1lrA==} + engines: {node: '>=18.18'} + '@istanbuljs/schema@0.1.3': resolution: {integrity: sha512-ZXRY4jNvVgSVQ8DL3LTcakaAtXwTVUxE81hslsyD2AtoXW/wVob10HkOJ1X/pAlcI7D+2YoZKg5do8G/w6RYgA==} engines: {node: '>=8'} @@ -1038,81 +1354,171 @@ packages: cpu: [arm] os: [android] + '@rollup/rollup-android-arm-eabi@4.27.3': + resolution: {integrity: sha512-EzxVSkIvCFxUd4Mgm4xR9YXrcp976qVaHnqom/Tgm+vU79k4vV4eYTjmRvGfeoW8m9LVcsAy/lGjcgVegKEhLQ==} + cpu: [arm] + os: [android] + '@rollup/rollup-android-arm64@4.19.0': resolution: {integrity: sha512-RDxUSY8D1tWYfn00DDi5myxKgOk6RvWPxhmWexcICt/MEC6yEMr4HNCu1sXXYLw8iAsg0D44NuU+qNq7zVWCrw==} cpu: [arm64] os: [android] + '@rollup/rollup-android-arm64@4.27.3': + resolution: {integrity: sha512-LJc5pDf1wjlt9o/Giaw9Ofl+k/vLUaYsE2zeQGH85giX2F+wn/Cg8b3c5CDP3qmVmeO5NzwVUzQQxwZvC2eQKw==} + cpu: [arm64] + os: [android] + '@rollup/rollup-darwin-arm64@4.19.0': resolution: {integrity: sha512-emvKHL4B15x6nlNTBMtIaC9tLPRpeA5jMvRLXVbl/W9Ie7HhkrE7KQjvgS9uxgatL1HmHWDXk5TTS4IaNJxbAA==} cpu: [arm64] os: [darwin] + '@rollup/rollup-darwin-arm64@4.27.3': + resolution: {integrity: sha512-OuRysZ1Mt7wpWJ+aYKblVbJWtVn3Cy52h8nLuNSzTqSesYw1EuN6wKp5NW/4eSre3mp12gqFRXOKTcN3AI3LqA==} + cpu: [arm64] + os: [darwin] + '@rollup/rollup-darwin-x64@4.19.0': resolution: {integrity: sha512-fO28cWA1dC57qCd+D0rfLC4VPbh6EOJXrreBmFLWPGI9dpMlER2YwSPZzSGfq11XgcEpPukPTfEVFtw2q2nYJg==} cpu: [x64] os: [darwin] + '@rollup/rollup-darwin-x64@4.27.3': + resolution: {integrity: sha512-xW//zjJMlJs2sOrCmXdB4d0uiilZsOdlGQIC/jjmMWT47lkLLoB1nsNhPUcnoqyi5YR6I4h+FjBpILxbEy8JRg==} + cpu: [x64] + os: [darwin] + + '@rollup/rollup-freebsd-arm64@4.27.3': + resolution: {integrity: sha512-58E0tIcwZ+12nK1WiLzHOD8I0d0kdrY/+o7yFVPRHuVGY3twBwzwDdTIBGRxLmyjciMYl1B/U515GJy+yn46qw==} + cpu: [arm64] + os: [freebsd] + + '@rollup/rollup-freebsd-x64@4.27.3': + resolution: {integrity: sha512-78fohrpcVwTLxg1ZzBMlwEimoAJmY6B+5TsyAZ3Vok7YabRBUvjYTsRXPTjGEvv/mfgVBepbW28OlMEz4w8wGA==} + cpu: [x64] + os: [freebsd] + '@rollup/rollup-linux-arm-gnueabihf@4.19.0': resolution: {integrity: sha512-2Rn36Ubxdv32NUcfm0wB1tgKqkQuft00PtM23VqLuCUR4N5jcNWDoV5iBC9jeGdgS38WK66ElncprqgMUOyomw==} cpu: [arm] os: [linux] + '@rollup/rollup-linux-arm-gnueabihf@4.27.3': + resolution: {integrity: sha512-h2Ay79YFXyQi+QZKo3ISZDyKaVD7uUvukEHTOft7kh00WF9mxAaxZsNs3o/eukbeKuH35jBvQqrT61fzKfAB/Q==} + cpu: [arm] + os: [linux] + '@rollup/rollup-linux-arm-musleabihf@4.19.0': resolution: {integrity: sha512-gJuzIVdq/X1ZA2bHeCGCISe0VWqCoNT8BvkQ+BfsixXwTOndhtLUpOg0A1Fcx/+eA6ei6rMBzlOz4JzmiDw7JQ==} cpu: [arm] os: [linux] + '@rollup/rollup-linux-arm-musleabihf@4.27.3': + resolution: {integrity: sha512-Sv2GWmrJfRY57urktVLQ0VKZjNZGogVtASAgosDZ1aUB+ykPxSi3X1nWORL5Jk0sTIIwQiPH7iE3BMi9zGWfkg==} + cpu: [arm] + os: [linux] + '@rollup/rollup-linux-arm64-gnu@4.19.0': resolution: {integrity: sha512-0EkX2HYPkSADo9cfeGFoQ7R0/wTKb7q6DdwI4Yn/ULFE1wuRRCHybxpl2goQrx4c/yzK3I8OlgtBu4xvted0ug==} cpu: [arm64] os: [linux] + '@rollup/rollup-linux-arm64-gnu@4.27.3': + resolution: {integrity: sha512-FPoJBLsPW2bDNWjSrwNuTPUt30VnfM8GPGRoLCYKZpPx0xiIEdFip3dH6CqgoT0RnoGXptaNziM0WlKgBc+OWQ==} + cpu: [arm64] + os: [linux] + '@rollup/rollup-linux-arm64-musl@4.19.0': resolution: {integrity: sha512-GlIQRj9px52ISomIOEUq/IojLZqzkvRpdP3cLgIE1wUWaiU5Takwlzpz002q0Nxxr1y2ZgxC2obWxjr13lvxNQ==} cpu: [arm64] os: [linux] + '@rollup/rollup-linux-arm64-musl@4.27.3': + resolution: {integrity: sha512-TKxiOvBorYq4sUpA0JT+Fkh+l+G9DScnG5Dqx7wiiqVMiRSkzTclP35pE6eQQYjP4Gc8yEkJGea6rz4qyWhp3g==} + cpu: [arm64] + os: [linux] + '@rollup/rollup-linux-powerpc64le-gnu@4.19.0': resolution: {integrity: sha512-N6cFJzssruDLUOKfEKeovCKiHcdwVYOT1Hs6dovDQ61+Y9n3Ek4zXvtghPPelt6U0AH4aDGnDLb83uiJMkWYzQ==} cpu: [ppc64] os: [linux] + '@rollup/rollup-linux-powerpc64le-gnu@4.27.3': + resolution: {integrity: sha512-v2M/mPvVUKVOKITa0oCFksnQQ/TqGrT+yD0184/cWHIu0LoIuYHwox0Pm3ccXEz8cEQDLk6FPKd1CCm+PlsISw==} + cpu: [ppc64] + os: [linux] + '@rollup/rollup-linux-riscv64-gnu@4.19.0': resolution: {integrity: sha512-2DnD3mkS2uuam/alF+I7M84koGwvn3ZVD7uG+LEWpyzo/bq8+kKnus2EVCkcvh6PlNB8QPNFOz6fWd5N8o1CYg==} cpu: [riscv64] os: [linux] + '@rollup/rollup-linux-riscv64-gnu@4.27.3': + resolution: {integrity: sha512-LdrI4Yocb1a/tFVkzmOE5WyYRgEBOyEhWYJe4gsDWDiwnjYKjNs7PS6SGlTDB7maOHF4kxevsuNBl2iOcj3b4A==} + cpu: [riscv64] + os: [linux] + '@rollup/rollup-linux-s390x-gnu@4.19.0': resolution: {integrity: sha512-D6pkaF7OpE7lzlTOFCB2m3Ngzu2ykw40Nka9WmKGUOTS3xcIieHe82slQlNq69sVB04ch73thKYIWz/Ian8DUA==} cpu: [s390x] os: [linux] + '@rollup/rollup-linux-s390x-gnu@4.27.3': + resolution: {integrity: sha512-d4wVu6SXij/jyiwPvI6C4KxdGzuZOvJ6y9VfrcleHTwo68fl8vZC5ZYHsCVPUi4tndCfMlFniWgwonQ5CUpQcA==} + cpu: [s390x] + os: [linux] + '@rollup/rollup-linux-x64-gnu@4.19.0': resolution: {integrity: sha512-HBndjQLP8OsdJNSxpNIN0einbDmRFg9+UQeZV1eiYupIRuZsDEoeGU43NQsS34Pp166DtwQOnpcbV/zQxM+rWA==} cpu: [x64] os: [linux] + '@rollup/rollup-linux-x64-gnu@4.27.3': + resolution: {integrity: sha512-/6bn6pp1fsCGEY5n3yajmzZQAh+mW4QPItbiWxs69zskBzJuheb3tNynEjL+mKOsUSFK11X4LYF2BwwXnzWleA==} + cpu: [x64] + os: [linux] + '@rollup/rollup-linux-x64-musl@4.19.0': resolution: {integrity: sha512-HxfbvfCKJe/RMYJJn0a12eiOI9OOtAUF4G6ozrFUK95BNyoJaSiBjIOHjZskTUffUrB84IPKkFG9H9nEvJGW6A==} cpu: [x64] os: [linux] + '@rollup/rollup-linux-x64-musl@4.27.3': + resolution: {integrity: sha512-nBXOfJds8OzUT1qUreT/en3eyOXd2EH5b0wr2bVB5999qHdGKkzGzIyKYaKj02lXk6wpN71ltLIaQpu58YFBoQ==} + cpu: [x64] + os: [linux] + '@rollup/rollup-win32-arm64-msvc@4.19.0': resolution: {integrity: sha512-HxDMKIhmcguGTiP5TsLNolwBUK3nGGUEoV/BO9ldUBoMLBssvh4J0X8pf11i1fTV7WShWItB1bKAKjX4RQeYmg==} cpu: [arm64] os: [win32] + '@rollup/rollup-win32-arm64-msvc@4.27.3': + resolution: {integrity: sha512-ogfbEVQgIZOz5WPWXF2HVb6En+kWzScuxJo/WdQTqEgeyGkaa2ui5sQav9Zkr7bnNCLK48uxmmK0TySm22eiuw==} + cpu: [arm64] + os: [win32] + '@rollup/rollup-win32-ia32-msvc@4.19.0': resolution: {integrity: sha512-xItlIAZZaiG/u0wooGzRsx11rokP4qyc/79LkAOdznGRAbOFc+SfEdfUOszG1odsHNgwippUJavag/+W/Etc6Q==} cpu: [ia32] os: [win32] + '@rollup/rollup-win32-ia32-msvc@4.27.3': + resolution: {integrity: sha512-ecE36ZBMLINqiTtSNQ1vzWc5pXLQHlf/oqGp/bSbi7iedcjcNb6QbCBNG73Euyy2C+l/fn8qKWEwxr+0SSfs3w==} + cpu: [ia32] + os: [win32] + '@rollup/rollup-win32-x64-msvc@4.19.0': resolution: {integrity: sha512-xNo5fV5ycvCCKqiZcpB65VMR11NJB+StnxHz20jdqRAktfdfzhgjTiJ2doTDQE/7dqGaV5I7ZGqKpgph6lCIag==} cpu: [x64] os: [win32] + '@rollup/rollup-win32-x64-msvc@4.27.3': + resolution: {integrity: sha512-vliZLrDmYKyaUoMzEbMTg2JkerfBjn03KmAw9CykO0Zzkzoyd7o3iZNam/TpyWNjNT+Cz2iO3P9Smv2wgrR+Eg==} + cpu: [x64] + os: [win32] + '@rushstack/eslint-patch@1.10.3': resolution: {integrity: sha512-qC/xYId4NMebE6w/V33Fh9gWxLgURiNYgVNObbJl2LZv0GUUItCcCqC5axQSwRaAgaxl2mELq1rMzlswaQ0Zxg==} @@ -1163,9 +1569,24 @@ packages: '@types/argparse@1.0.38': resolution: {integrity: sha512-ebDJ9b0e702Yr7pWgB0jzm+CX4Srzz8RcXtLJDJB+BSccqMa36uyH/zUsSYao5+BD1ytv3k3rPYCq4mAE1hsXA==} + '@types/babel__core@7.20.5': + resolution: {integrity: sha512-qoQprZvz5wQFJwMDqeseRXWv3rqMvhgpbXFfVyWhbx9X47POIA6i/+dXefEmZKoAgOaTdaIgNSMqMIU61yRyzA==} + + '@types/babel__generator@7.6.8': + resolution: {integrity: sha512-ASsj+tpEDsEiFr1arWrlN6V3mdfjRMZt6LtK/Vp/kreFLnr5QH5+DhvD5nINYZXzwJvXeGq+05iUXcAzVrqWtw==} + + '@types/babel__template@7.4.4': + resolution: {integrity: sha512-h/NUaSyG5EyxBIp8YRxo4RMe2/qQgvyowRwVMzhYhBCONbW8PUsg4lkFMrhgZhUe5z3L3MiLDuvyJ/CaPa2A8A==} + + '@types/babel__traverse@7.20.6': + resolution: {integrity: sha512-r1bzfrm0tomOI8g1SzvCaQHo6Lcv6zu0EA+W2kHrt8dyrHQxGzBBL4kdkzIS+jBMV+EYcMAEAqXqYaLJq5rOZg==} + '@types/estree@1.0.5': resolution: {integrity: sha512-/kYRxGDLWzHOB7q+wtSUQlFrtcdUccpfy+X+9iMBpHK8QLLhx2wIPYuS5DYtR9Wa/YlZAbIovy7qVdB1Aq6Lyw==} + '@types/estree@1.0.6': + resolution: {integrity: sha512-AYnb1nQyY49te+VRAVgmzfcgjYS91mY5P0TKUDCLEM+gNnA+3T6rWITXRLYCpahpqSQbN5cE+gHpnPyXjHWxcw==} + '@types/json-schema@7.0.15': resolution: {integrity: sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==} @@ -1181,9 +1602,15 @@ packages: '@types/prop-types@15.7.12': resolution: {integrity: sha512-5zvhXYtRNRluoE/jAp4GVsSduVUzNWKkOZrCDBWYtE7biZywwdC2AcEzg+cSMLFRfVgeAFqpfNabiPjxFddV1Q==} + '@types/react-dom@18.3.1': + resolution: {integrity: sha512-qW1Mfv8taImTthu4KoXgDfLuk4bydU6Q/TkADnDWWHwi4NX4BR+LWfTp2sVmTqRrsHvyDDTelgelxJ+SsejKKQ==} + '@types/react-is@18.3.0': resolution: {integrity: sha512-KZJpHUkAdzyKj/kUHJDc6N7KyidftICufJfOFpiG6haL/BDQNQt5i4n1XDUL/nDZAtGLHDSWRYpLzKTAKSvX6w==} + '@types/react@18.3.12': + resolution: {integrity: sha512-D2wOSq/d6Agt28q7rSI3jhU7G6aiuzljDGZ2hTZHIkrTLUI+AF3WMeKkEZ9nN2fkBAlcktT6vcZjDFiIhMYEQw==} + '@types/react@18.3.3': resolution: {integrity: sha512-hti/R0pS0q1/xx+TsI73XIqk26eBsISZ2R0wUijXIngRK9R/e7Xw/cXVxQK7R5JjW+SV4zGcn5hXjudkN/pLIw==} @@ -1201,6 +1628,17 @@ packages: typescript: optional: true + '@typescript-eslint/eslint-plugin@8.15.0': + resolution: {integrity: sha512-+zkm9AR1Ds9uLWN3fkoeXgFppaQ+uEVtfOV62dDmsy9QCNqlRHWNEck4yarvRNrvRcHQLGfqBNui3cimoz8XAg==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + peerDependencies: + '@typescript-eslint/parser': ^8.0.0 || ^8.0.0-alpha.0 + eslint: ^8.57.0 || ^9.0.0 + typescript: '*' + peerDependenciesMeta: + typescript: + optional: true + '@typescript-eslint/experimental-utils@5.62.0': resolution: {integrity: sha512-RTXpeB3eMkpoclG3ZHft6vG/Z30azNHuqY6wKPBHlVMZFuEvrtlEDe8gMqDb+SO+9hjC/pLekeSCryf9vMZlCw==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} @@ -1217,10 +1655,24 @@ packages: typescript: optional: true + '@typescript-eslint/parser@8.15.0': + resolution: {integrity: sha512-7n59qFpghG4uazrF9qtGKBZXn7Oz4sOMm8dwNWDQY96Xlm2oX67eipqcblDj+oY1lLCbf1oltMZFpUso66Kl1A==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + peerDependencies: + eslint: ^8.57.0 || ^9.0.0 + typescript: '*' + peerDependenciesMeta: + typescript: + optional: true + '@typescript-eslint/scope-manager@5.62.0': resolution: {integrity: sha512-VXuvVvZeQCQb5Zgf4HAxc04q5j+WrNAtNh9OwCsCgpKqESMTu3tF/jhZ3xG6T4NZwWl65Bg8KuS2uEvhSfLl0w==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + '@typescript-eslint/scope-manager@8.15.0': + resolution: {integrity: sha512-QRGy8ADi4J7ii95xz4UoiymmmMd/zuy9azCaamnZ3FM8T5fZcex8UfJcjkiEZjJSztKfEBe3dZ5T/5RHAmw2mA==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + '@typescript-eslint/type-utils@5.62.0': resolution: {integrity: sha512-xsSQreu+VnfbqQpW5vnCJdq1Z3Q0U31qiWmRhr98ONQmcp/yhiPJFPq8MXiJVLiksmOKSjIldZzkebzHuCGzew==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} @@ -1231,10 +1683,24 @@ packages: typescript: optional: true + '@typescript-eslint/type-utils@8.15.0': + resolution: {integrity: sha512-UU6uwXDoI3JGSXmcdnP5d8Fffa2KayOhUUqr/AiBnG1Gl7+7ut/oyagVeSkh7bxQ0zSXV9ptRh/4N15nkCqnpw==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + peerDependencies: + eslint: ^8.57.0 || ^9.0.0 + typescript: '*' + peerDependenciesMeta: + typescript: + optional: true + '@typescript-eslint/types@5.62.0': resolution: {integrity: sha512-87NVngcbVXUahrRTqIK27gD2t5Cu1yuCXxbLcFtCzZGlfyVWWh8mLHkoxzjsB6DDNnvdL+fW8MiwPEJyGJQDgQ==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + '@typescript-eslint/types@8.15.0': + resolution: {integrity: sha512-n3Gt8Y/KyJNe0S3yDCD2RVKrHBC4gTUcLTebVBXacPy091E6tNspFLKRXlk3hwT4G55nfr1n2AdFqi/XMxzmPQ==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + '@typescript-eslint/typescript-estree@5.62.0': resolution: {integrity: sha512-CmcQ6uY7b9y694lKdRB8FEel7JbU/40iSAPomu++SjLMntB+2Leay2LO6i8VnJk58MtE9/nQSFIH6jpyRWyYzA==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} @@ -1244,19 +1710,48 @@ packages: typescript: optional: true + '@typescript-eslint/typescript-estree@8.15.0': + resolution: {integrity: sha512-1eMp2JgNec/niZsR7ioFBlsh/Fk0oJbhaqO0jRyQBMgkz7RrFfkqF9lYYmBoGBaSiLnu8TAPQTwoTUiSTUW9dg==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + peerDependencies: + typescript: '*' + peerDependenciesMeta: + typescript: + optional: true + '@typescript-eslint/utils@5.62.0': resolution: {integrity: sha512-n8oxjeb5aIbPFEtmQxQYOLI0i9n5ySBEY/ZEHHZqKQSFnxio1rv6dthascc9dLuwrL0RC5mPCxB7vnAVGAYWAQ==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} peerDependencies: eslint: ^6.0.0 || ^7.0.0 || ^8.0.0 + '@typescript-eslint/utils@8.15.0': + resolution: {integrity: sha512-k82RI9yGhr0QM3Dnq+egEpz9qB6Un+WLYhmoNcvl8ltMEededhh7otBVVIDDsEEttauwdY/hQoSsOv13lxrFzQ==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + peerDependencies: + eslint: ^8.57.0 || ^9.0.0 + typescript: '*' + peerDependenciesMeta: + typescript: + optional: true + '@typescript-eslint/visitor-keys@5.62.0': resolution: {integrity: sha512-07ny+LHRzQXepkGg6w0mFY41fVUNBrL2Roj/++7V1txKugfjm/Ci/qSND03r2RhlJhJYMcTn9AhhSSqQp0Ysyw==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + '@typescript-eslint/visitor-keys@8.15.0': + resolution: {integrity: sha512-h8vYOulWec9LhpwfAdZf2bjr8xIp0KNKnpgqSz0qqYYKAW/QZKw3ktRndbiAtUz4acH4QLQavwZBYCc0wulA/Q==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + '@ungap/structured-clone@1.2.0': resolution: {integrity: sha512-zuVdFrMJiuCDQUMCzQaD6KL28MjnqqN8XnAqiEq9PNm/hCPTSGfrXCOfwj1ow4LFb/tNymJPwsNbVePc1xFqrQ==} + '@vitejs/plugin-react@4.3.4': + resolution: {integrity: sha512-SCCPBJtYLdE8PX/7ZQAs1QAZ8Jqwih+0VBLum1EGqmCCQal+MIUqLCzj3ZUy8ufbC0cAM4LRlSTm7IQJwWT4ug==} + engines: {node: ^14.18.0 || >=16.0.0} + peerDependencies: + vite: ^4.2.0 || ^5.0.0 || ^6.0.0 + '@vitest/coverage-istanbul@1.6.0': resolution: {integrity: sha512-h/BwpXehkkS0qsNCS00QxiupAqVkNi0WT19BR0dQvlge5oHghoSVLx63fABYFoKxVb7Ue7+k6V2KokmQ1zdMpg==} peerDependencies: @@ -1317,6 +1812,11 @@ packages: engines: {node: '>=0.4.0'} hasBin: true + acorn@8.14.0: + resolution: {integrity: sha512-cl669nCJTZBsL97OF4kUQm5g5hC2uihk0NxY3WENAC0TYdILVkAyHymAntgxGkl7K+t0cXIrH5siy5S4XkFycA==} + engines: {node: '>=0.4.0'} + hasBin: true + ajv-draft-04@1.0.0: resolution: {integrity: sha512-mv00Te6nmYbRp5DCwclxtt7yV/joXJPGS7nM+97GdxvuttCOfgI3K4U25zboyeX0O+myI8ERluxQe5wljMmVIw==} peerDependencies: @@ -1475,6 +1975,11 @@ packages: engines: {node: ^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7} hasBin: true + browserslist@4.24.2: + resolution: {integrity: sha512-ZIc+Q62revdMcqC6aChtW4jz3My3klmCO1fEmINZY/8J3EpBg5/A/D0AKmBveUh6pgoeycoMkVMko84tuYS+Gg==} + engines: {node: ^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7} + hasBin: true + cac@6.7.14: resolution: {integrity: sha512-b6Ilus+c3RrdDk+JhLKUAQfzzgLEPy6wcXqS7f/xe1EETvsDP6GORG7SFuOs6cID5YkqchW/LXZbX5bc8j7ZcQ==} engines: {node: '>=8'} @@ -1490,6 +1995,9 @@ packages: caniuse-lite@1.0.30001643: resolution: {integrity: sha512-ERgWGNleEilSrHM6iUz/zJNSQTP8Mr21wDWpdgvRwcTXGAq6jMtOUPP4dqFPTdKqZ2wKTdtB+uucZ3MRpAUSmg==} + caniuse-lite@1.0.30001683: + resolution: {integrity: sha512-iqmNnThZ0n70mNwvxpEC2nBJ037ZHZUoBI5Gorh1Mw6IlEAZujEoU1tXA628iZfzm7R9FvFzxbfdgml82a3k8Q==} + chai@4.5.0: resolution: {integrity: sha512-RITGBfijLkBddZvnn8jdqoTypxvqbOLYQkGGxXzeFjVHvudaPw0HNFD9x928/eUwYWd2dPCugVqspGALTZZQKw==} engines: {node: '>=4'} @@ -1567,6 +2075,10 @@ packages: resolution: {integrity: sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==} engines: {node: '>= 8'} + cross-spawn@7.0.6: + resolution: {integrity: sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==} + engines: {node: '>= 8'} + csstype@3.1.3: resolution: {integrity: sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw==} @@ -1643,6 +2155,9 @@ packages: electron-to-chromium@1.5.2: resolution: {integrity: sha512-kc4r3U3V3WLaaZqThjYz/Y6z8tJe+7K0bbjUVo3i+LWIypVdMx5nXCkwRe6SWbY6ILqLdc1rKcKmr3HoH7wjSQ==} + electron-to-chromium@1.5.64: + resolution: {integrity: sha512-IXEuxU+5ClW2IGEYFC2T7szbyVgehupCWQe5GNh+H065CD6U6IFN0s4KeAMFGNmQolRU4IV7zGBWSYMmZ8uuqQ==} + emoji-regex@10.3.0: resolution: {integrity: sha512-QpLs9D9v9kArv4lfDEgg1X/gN5XLnf/A6l9cs8SPZLRZR3ZkY9+kwIQTxm+fsSej5UMYGE8fdoaZVIBlqG0XTw==} @@ -1699,10 +2214,19 @@ packages: engines: {node: '>=12'} hasBin: true + esbuild@0.24.0: + resolution: {integrity: sha512-FuLPevChGDshgSicjisSooU0cemp/sGXR841D5LHMB7mTVOmsEHcAxaH3irL53+8YDIeVNQEySh4DaYU/iuPqQ==} + engines: {node: '>=18'} + hasBin: true + escalade@3.1.2: resolution: {integrity: sha512-ErCHMCae19vR8vQGe50xIsVomy19rg6gFu3+r3jkEO46suLMWBksvVyoGgQV+jOfl84ZSOSlmv6Gxa89PmTGmA==} engines: {node: '>=6'} + escalade@3.2.0: + resolution: {integrity: sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==} + engines: {node: '>=6'} + escape-string-regexp@1.0.5: resolution: {integrity: sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==} engines: {node: '>=0.8.0'} @@ -1788,6 +2312,17 @@ packages: peerDependencies: eslint: ^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0-0 + eslint-plugin-react-hooks@5.0.0: + resolution: {integrity: sha512-hIOwI+5hYGpJEc4uPRmz2ulCjAGD/N13Lukkh8cLV0i2IRk/bdZDYjgLVHj+U9Z704kLIdIO6iueGvxNur0sgw==} + engines: {node: '>=10'} + peerDependencies: + eslint: ^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0-0 || ^9.0.0 + + eslint-plugin-react-refresh@0.4.14: + resolution: {integrity: sha512-aXvzCTK7ZBv1e7fahFuR3Z/fyQQSIQ711yPgYRj+Oj64tyTgO4iQIDmYXDBqvSWQ/FA4OSCsXOStlF+noU0/NA==} + peerDependencies: + eslint: '>=7' + eslint-plugin-react@7.35.0: resolution: {integrity: sha512-v501SSMOWv8gerHkk+IIQBkcGRGrO2nfybfj5pLxuJNFTPxxA3PSryhXTK+9pNbtkggheDdsC0E9Q8CuPk6JKA==} engines: {node: '>=4'} @@ -1808,6 +2343,10 @@ packages: resolution: {integrity: sha512-dOt21O7lTMhDM+X9mB4GX+DZrZtCUJPL/wlcTqxyrx5IvO0IYtILdtrQGQp+8n5S0gwSVmOf9NQrjMOgfQZlIg==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + eslint-scope@8.2.0: + resolution: {integrity: sha512-PHlWUfG6lvPc3yvP5A4PNyBL1W8fkDUccmI21JUu/+GKZBoH/W5u6usENXUrWFRsyoW5ACUjFGgAFQp5gUlb/A==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + eslint-visitor-keys@2.1.0: resolution: {integrity: sha512-0rSmRBzXgDzIsD6mGdJgevzgezI534Cer5L/vyMX0kHzT/jiB43jRhd9YUlMGYLQy2zprNmoT8qasCGtY+QaKw==} engines: {node: '>=10'} @@ -1816,11 +2355,29 @@ packages: resolution: {integrity: sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + eslint-visitor-keys@4.2.0: + resolution: {integrity: sha512-UyLnSehNt62FFhSwjZlHmeokpRK59rcz29j+F1/aDgbkbRTk7wIc9XzdoasMUbRNKDM0qQt/+BJ4BrpFeABemw==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + eslint@8.57.0: resolution: {integrity: sha512-dZ6+mexnaTIbSBZWgou51U6OmzIhYM2VcNdtiTtI7qPNZm35Akpr0f6vtw3w1Kmn5PYo+tZVfh13WrhpS6oLqQ==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} hasBin: true + eslint@9.15.0: + resolution: {integrity: sha512-7CrWySmIibCgT1Os28lUU6upBshZ+GxybLOrmRzi08kS8MBuO8QA7pXEgYgY5W8vK3e74xv0lpjo9DbaGU9Rkw==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + hasBin: true + peerDependencies: + jiti: '*' + peerDependenciesMeta: + jiti: + optional: true + + espree@10.3.0: + resolution: {integrity: sha512-0QYC8b24HWY8zjRnDTL6RiHfDbAWn63qb4LMj1Z4b076A4une81+z03Kg7l7mn/48PUTqoLptSXez8oknU8Clg==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + espree@9.6.1: resolution: {integrity: sha512-oruZaFkjorTpF32kDSI5/75ViwGeZginGGy2NoOSg3Q9bnwlnmDm4HLnkl0RE3n+njDXR037aY1+x58Z/zFdwQ==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} @@ -1883,6 +2440,10 @@ packages: resolution: {integrity: sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==} engines: {node: ^10.12.0 || >=12.0.0} + file-entry-cache@8.0.0: + resolution: {integrity: sha512-XXTUwCvisa5oacNGRP9SfNtYBNAMi+RPwBFmblZEF7N7swHYQS6/Zfk7SRwx4D5j3CH211YNRco1DEMNVfZCnQ==} + engines: {node: '>=16.0.0'} + fill-range@7.1.1: resolution: {integrity: sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==} engines: {node: '>=8'} @@ -1895,6 +2456,10 @@ packages: resolution: {integrity: sha512-CYcENa+FtcUKLmhhqyctpclsq7QF38pKjZHsGNiSQF5r4FtoKDWabFDl3hzaEQMvT1LHEysw5twgLvpYYb4vbw==} engines: {node: ^10.12.0 || >=12.0.0} + flat-cache@4.0.1: + resolution: {integrity: sha512-f7ccFPK3SXFHpx15UIGyRJ/FJQctuKZ0zVuN3frBo4HnK3cay9VEW0R6yPYFHC0AgqhukPzKjq22t5DmAyqGyw==} + engines: {node: '>=16'} + flatted@3.3.1: resolution: {integrity: sha512-X8cqMLLie7KsNUDSdzeN8FYK9rEt4Dt67OsG/DNGnYTSDBG4uFAJFBnUeiV+zCVAvwFy56IjM9sH51jVaEhNxw==} @@ -1966,6 +2531,14 @@ packages: resolution: {integrity: sha512-AhO5QUcj8llrbG09iWhPU2B204J1xnPeL8kQmVorSsy+Sjj1sk8gIyh6cUocGmH4L0UuhAJy+hJMRA4mgA4mFQ==} engines: {node: '>=8'} + globals@14.0.0: + resolution: {integrity: sha512-oahGvuMGQlPw/ivIYBjVSrWAfWLBeku5tpPE2fOPLi+WHffIWbuh2tCjhyQhTBPMf5E9jDEH4FOmTYgYwbKwtQ==} + engines: {node: '>=18'} + + globals@15.12.0: + resolution: {integrity: sha512-1+gLErljJFhbOVyaetcwJiJ4+eLe45S2E7P5UiZ9xGfeq3ATQf5DOv9G7MH3gGbKQLkzmNh2DxfZwLdw+j6oTQ==} + engines: {node: '>=18'} + globalthis@1.0.4: resolution: {integrity: sha512-DpLKbNU4WylpxJykQujfCcwYWiV/Jhm50Goo0wrVILAv5jOr9d+H+UR3PhSCD2rCCEIg0uc+G+muBTwD54JhDQ==} engines: {node: '>= 0.4'} @@ -2231,6 +2804,11 @@ packages: engines: {node: '>=4'} hasBin: true + jsesc@3.0.2: + resolution: {integrity: sha512-xKqzzWXDttJuOcawBt4KnKHHIf5oQ/Cxax+0PWFG+DFDgHNAdi+TXECADI+RYiFUMmx8792xsMbbgXj4CwnP4g==} + engines: {node: '>=6'} + hasBin: true + json-buffer@3.0.1: resolution: {integrity: sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==} @@ -2514,6 +3092,9 @@ packages: picocolors@1.0.1: resolution: {integrity: sha512-anP1Z8qwhkbmu7MFP5iTt+wQKXgwzf7zTyGlcdzabySa9vd0Xt392U0rVmz9poOaBj0uHJKyyo9/upk0HrEQew==} + picocolors@1.1.1: + resolution: {integrity: sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==} + picomatch@2.3.1: resolution: {integrity: sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==} engines: {node: '>=8.6'} @@ -2534,6 +3115,10 @@ packages: resolution: {integrity: sha512-YF2kKIUzAofPMpfH6hOi2cGnv/HrUlfucspc7pDyvv7kGdqXrfj8SCl/t8owkEgKEuu8ZcRjSOxFxVLqwChZ2Q==} engines: {node: ^10 || ^12 || >=14} + postcss@8.4.49: + resolution: {integrity: sha512-OCVPnIObs4N29kxTjzLfUryOkvZEq+pf8jTF0lg8E7uETuWHA+v7j3c/xJmiqpX450191LlmZfUKkXxkTry7nA==} + engines: {node: ^10 || ^12 || >=14} + prelude-ls@1.2.1: resolution: {integrity: sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==} engines: {node: '>= 0.8.0'} @@ -2557,12 +3142,21 @@ packages: queue-microtask@1.2.3: resolution: {integrity: sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==} + react-dom@18.3.1: + resolution: {integrity: sha512-5m4nQKp+rZRb09LNH59GM4BxTh9251/ylbKIbpe7TpGxfJ+9kv6BLkLBXIjjspbgbnIBNqlI23tRnTWT0snUIw==} + peerDependencies: + react: ^18.3.1 + react-is@16.13.1: resolution: {integrity: sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==} react-is@18.3.1: resolution: {integrity: sha512-/LLMVyas0ljjAtoYiPqYiL8VWXzUUdThrmU5+n20DZv+a+ClRoevUzw5JxU+Ieh5/c87ytoTBV9G1FiKfNJdmg==} + react-refresh@0.14.2: + resolution: {integrity: sha512-jCvmsr+1IUSMUyzOkRcvnVbX3ZYC6g9TDrDbFuFmRDq7PD4yaGbLKNQL6k2jnArV8hjYxh7hVhAZB6s9HDGpZA==} + engines: {node: '>=0.10.0'} + react@18.3.1: resolution: {integrity: sha512-wS+hAgJShR0KhEvPJArfuPVN1+Hz1t0Y6n5jLrGQbkb4urgPE/0Rve+1kMB1v/oWgHgm4WIcV+i7F2pTVj+2iQ==} engines: {node: '>=0.10.0'} @@ -2636,6 +3230,11 @@ packages: engines: {node: '>=18.0.0', npm: '>=8.0.0'} hasBin: true + rollup@4.27.3: + resolution: {integrity: sha512-SLsCOnlmGt9VoZ9Ek8yBK8tAdmPHeppkw+Xa7yDlCEhDTvwYei03JlWo1fdc7YTfLZ4tD8riJCUyAgTbszk1fQ==} + engines: {node: '>=18.0.0', npm: '>=8.0.0'} + hasBin: true + run-parallel@1.2.0: resolution: {integrity: sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==} @@ -2647,6 +3246,9 @@ packages: resolution: {integrity: sha512-CdASjNJPvRa7roO6Ra/gLYBTzYzzPyyBXxIMdGW3USQLyjWEls2RgW5UBTXaQVp+OrpeCK3bLem8smtmheoRuw==} engines: {node: '>= 0.4'} + scheduler@0.23.2: + resolution: {integrity: sha512-UOShsPwz7NrMUqhR6t0hWjFduvOzbtv7toDH1/hIrfRNIDBnnBWd0CwJTGvTpngVlmwGCdP9/Zl/tVrDqcuYzQ==} + semver@6.3.1: resolution: {integrity: sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==} hasBin: true @@ -2704,6 +3306,10 @@ packages: resolution: {integrity: sha512-itJW8lvSA0TXEphiRoawsCksnlf8SyvmFzIhltqAHluXd88pkCd+cXJVHTDwdCr0IzwptSm035IHQktUu1QUMg==} engines: {node: '>=0.10.0'} + source-map-js@1.2.1: + resolution: {integrity: sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==} + engines: {node: '>=0.10.0'} + source-map@0.6.1: resolution: {integrity: sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==} engines: {node: '>=0.10.0'} @@ -2818,6 +3424,12 @@ packages: resolution: {integrity: sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==} engines: {node: '>=8.0'} + ts-api-utils@1.4.0: + resolution: {integrity: sha512-032cPxaEKwM+GT3vA5JXNzIaizx388rhsSW79vGRNGXfRRAdEAn2mvk36PvK5HnOchyWZ7afLEXqYCvPCrzuzQ==} + engines: {node: '>=16'} + peerDependencies: + typescript: '>=4.2.0' + tsconfig-paths@3.15.0: resolution: {integrity: sha512-2Ac2RgzDe/cn48GvOe3M+o82pEFewD3UPbyoUHHdKasHwJKjds4fLXWf/Ux5kATBKN20oaFGu+jbElp1pos0mg==} @@ -2858,6 +3470,16 @@ packages: resolution: {integrity: sha512-/OxDN6OtAk5KBpGb28T+HZc2M+ADtvRxXrKKbUwtsLgdoxgX13hyy7ek6bFRl5+aBs2yZzB0c4CnQfAtVypW/g==} engines: {node: '>= 0.4'} + typescript-eslint@8.15.0: + resolution: {integrity: sha512-wY4FRGl0ZI+ZU4Jo/yjdBu0lVTSML58pu6PgGtJmCufvzfV565pUF6iACQt092uFOd49iLOTX/sEVmHtbSrS+w==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + peerDependencies: + eslint: ^8.57.0 || ^9.0.0 + typescript: '*' + peerDependenciesMeta: + typescript: + optional: true + typescript@5.4.2: resolution: {integrity: sha512-+2/g0Fds1ERlP6JsakQQDXjZdZMM+rqpamFZJEKh4kwTIn3iDkgKtby0CeNd5ATNZ4Ry1ax15TMx0W2V+miizQ==} engines: {node: '>=14.17'} @@ -2868,6 +3490,11 @@ packages: engines: {node: '>=14.17'} hasBin: true + typescript@5.6.3: + resolution: {integrity: sha512-hjcS1mhfuyi4WW8IWtjP7brDrG2cuDZukyrYrSauoXGNgx0S7zceP07adYkJycEr56BOUTNPzbInooiN3fn1qw==} + engines: {node: '>=14.17'} + hasBin: true + ufo@1.5.4: resolution: {integrity: sha512-UsUk3byDzKd04EyoZ7U4DOlxQaD14JUKQl6/P7wiX4FNvUfm3XL246n9W5AmqwW5RSFJ27NAuM0iLscAOYUiGQ==} @@ -2903,6 +3530,12 @@ packages: peerDependencies: browserslist: '>= 4.21.0' + update-browserslist-db@1.1.1: + resolution: {integrity: sha512-R8UzCaa9Az+38REPiJ1tXlImTJXlVfgHZsglwBD/k6nj76ctsH1E3q4doGrukiLQd3sGQYu56r5+lo5r94l29A==} + hasBin: true + peerDependencies: + browserslist: '>= 4.21.0' + uri-js@4.4.1: resolution: {integrity: sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==} @@ -2953,6 +3586,77 @@ packages: terser: optional: true + vite@5.4.11: + resolution: {integrity: sha512-c7jFQRklXua0mTzneGW9QVyxFjUgwcihC4bXEtujIo2ouWCe1Ajt/amn2PCxYnhYfd5k09JX3SB7OYWFKYqj8Q==} + engines: {node: ^18.0.0 || >=20.0.0} + hasBin: true + peerDependencies: + '@types/node': ^18.0.0 || >=20.0.0 + less: '*' + lightningcss: ^1.21.0 + sass: '*' + sass-embedded: '*' + stylus: '*' + sugarss: '*' + terser: ^5.4.0 + peerDependenciesMeta: + '@types/node': + optional: true + less: + optional: true + lightningcss: + optional: true + sass: + optional: true + sass-embedded: + optional: true + stylus: + optional: true + sugarss: + optional: true + terser: + optional: true + + vite@6.0.1: + resolution: {integrity: sha512-Ldn6gorLGr4mCdFnmeAOLweJxZ34HjKnDm4HGo6P66IEqTxQb36VEdFJQENKxWjupNfoIjvRUnswjn1hpYEpjQ==} + engines: {node: ^18.0.0 || ^20.0.0 || >=22.0.0} + hasBin: true + peerDependencies: + '@types/node': ^18.0.0 || ^20.0.0 || >=22.0.0 + jiti: '>=1.21.0' + less: '*' + lightningcss: ^1.21.0 + sass: '*' + sass-embedded: '*' + stylus: '*' + sugarss: '*' + terser: ^5.16.0 + tsx: ^4.8.1 + yaml: ^2.4.2 + peerDependenciesMeta: + '@types/node': + optional: true + jiti: + optional: true + less: + optional: true + lightningcss: + optional: true + sass: + optional: true + sass-embedded: + optional: true + stylus: + optional: true + sugarss: + optional: true + terser: + optional: true + tsx: + optional: true + yaml: + optional: true + vitest@1.6.0: resolution: {integrity: sha512-H5r/dN06swuFnzNFhq/dnz37bPXnq8xB2xB5JOVk8K09rUtoeNN+LHWkoQ0A/i3hvbUKKcCei9KpbxqHMLhLLA==} engines: {node: ^18.0.0 || >=20.0.0} @@ -3067,8 +3771,16 @@ snapshots: '@babel/highlight': 7.24.7 picocolors: 1.0.1 + '@babel/code-frame@7.26.2': + dependencies: + '@babel/helper-validator-identifier': 7.25.9 + js-tokens: 4.0.0 + picocolors: 1.1.1 + '@babel/compat-data@7.25.0': {} + '@babel/compat-data@7.26.2': {} + '@babel/core@7.24.9': dependencies: '@ampproject/remapping': 2.3.0 @@ -3089,6 +3801,26 @@ snapshots: transitivePeerDependencies: - supports-color + '@babel/core@7.26.0': + dependencies: + '@ampproject/remapping': 2.3.0 + '@babel/code-frame': 7.26.2 + '@babel/generator': 7.26.2 + '@babel/helper-compilation-targets': 7.25.9 + '@babel/helper-module-transforms': 7.26.0(@babel/core@7.26.0) + '@babel/helpers': 7.26.0 + '@babel/parser': 7.26.2 + '@babel/template': 7.25.9 + '@babel/traverse': 7.25.9 + '@babel/types': 7.26.0 + convert-source-map: 2.0.0 + debug: 4.3.5 + gensync: 1.0.0-beta.2 + json5: 2.2.3 + semver: 6.3.1 + transitivePeerDependencies: + - supports-color + '@babel/eslint-parser@7.25.0(@babel/core@7.24.9)(eslint@8.57.0)': dependencies: '@babel/core': 7.24.9 @@ -3104,6 +3836,14 @@ snapshots: '@jridgewell/trace-mapping': 0.3.25 jsesc: 2.5.2 + '@babel/generator@7.26.2': + dependencies: + '@babel/parser': 7.26.2 + '@babel/types': 7.26.0 + '@jridgewell/gen-mapping': 0.3.5 + '@jridgewell/trace-mapping': 0.3.25 + jsesc: 3.0.2 + '@babel/helper-annotate-as-pure@7.24.7': dependencies: '@babel/types': 7.25.0 @@ -3123,6 +3863,14 @@ snapshots: lru-cache: 5.1.1 semver: 6.3.1 + '@babel/helper-compilation-targets@7.25.9': + dependencies: + '@babel/compat-data': 7.26.2 + '@babel/helper-validator-option': 7.25.9 + browserslist: 4.24.2 + lru-cache: 5.1.1 + semver: 6.3.1 + '@babel/helper-create-class-features-plugin@7.25.0(@babel/core@7.24.9)': dependencies: '@babel/core': 7.24.9 @@ -3168,6 +3916,13 @@ snapshots: transitivePeerDependencies: - supports-color + '@babel/helper-module-imports@7.25.9': + dependencies: + '@babel/traverse': 7.25.9 + '@babel/types': 7.26.0 + transitivePeerDependencies: + - supports-color + '@babel/helper-module-transforms@7.25.0(@babel/core@7.24.9)': dependencies: '@babel/core': 7.24.9 @@ -3178,12 +3933,23 @@ snapshots: transitivePeerDependencies: - supports-color + '@babel/helper-module-transforms@7.26.0(@babel/core@7.26.0)': + dependencies: + '@babel/core': 7.26.0 + '@babel/helper-module-imports': 7.25.9 + '@babel/helper-validator-identifier': 7.25.9 + '@babel/traverse': 7.25.9 + transitivePeerDependencies: + - supports-color + '@babel/helper-optimise-call-expression@7.24.7': dependencies: '@babel/types': 7.25.0 '@babel/helper-plugin-utils@7.24.8': {} + '@babel/helper-plugin-utils@7.25.9': {} + '@babel/helper-remap-async-to-generator@7.25.0(@babel/core@7.24.9)': dependencies: '@babel/core': 7.24.9 @@ -3218,10 +3984,16 @@ snapshots: '@babel/helper-string-parser@7.24.8': {} + '@babel/helper-string-parser@7.25.9': {} + '@babel/helper-validator-identifier@7.24.7': {} + '@babel/helper-validator-identifier@7.25.9': {} + '@babel/helper-validator-option@7.24.8': {} + '@babel/helper-validator-option@7.25.9': {} + '@babel/helper-wrap-function@7.25.0': dependencies: '@babel/template': 7.25.0 @@ -3235,6 +4007,11 @@ snapshots: '@babel/template': 7.25.0 '@babel/types': 7.25.0 + '@babel/helpers@7.26.0': + dependencies: + '@babel/template': 7.25.9 + '@babel/types': 7.26.0 + '@babel/highlight@7.24.7': dependencies: '@babel/helper-validator-identifier': 7.24.7 @@ -3246,6 +4023,10 @@ snapshots: dependencies: '@babel/types': 7.25.0 + '@babel/parser@7.26.2': + dependencies: + '@babel/types': 7.26.0 + '@babel/plugin-bugfix-firefox-class-in-computed-class-key@7.25.0(@babel/core@7.24.9)': dependencies: '@babel/core': 7.24.9 @@ -3737,6 +4518,16 @@ snapshots: transitivePeerDependencies: - supports-color + '@babel/plugin-transform-react-jsx-self@7.25.9(@babel/core@7.26.0)': + dependencies: + '@babel/core': 7.26.0 + '@babel/helper-plugin-utils': 7.25.9 + + '@babel/plugin-transform-react-jsx-source@7.25.9(@babel/core@7.26.0)': + dependencies: + '@babel/core': 7.26.0 + '@babel/helper-plugin-utils': 7.25.9 + '@babel/plugin-transform-react-jsx@7.24.7(@babel/core@7.24.9)': dependencies: '@babel/core': 7.24.9 @@ -3970,6 +4761,12 @@ snapshots: '@babel/parser': 7.25.0 '@babel/types': 7.25.0 + '@babel/template@7.25.9': + dependencies: + '@babel/code-frame': 7.26.2 + '@babel/parser': 7.26.2 + '@babel/types': 7.26.0 + '@babel/traverse@7.25.0': dependencies: '@babel/code-frame': 7.24.7 @@ -3982,88 +4779,194 @@ snapshots: transitivePeerDependencies: - supports-color + '@babel/traverse@7.25.9': + dependencies: + '@babel/code-frame': 7.26.2 + '@babel/generator': 7.26.2 + '@babel/parser': 7.26.2 + '@babel/template': 7.25.9 + '@babel/types': 7.26.0 + debug: 4.3.5 + globals: 11.12.0 + transitivePeerDependencies: + - supports-color + '@babel/types@7.25.0': dependencies: '@babel/helper-string-parser': 7.24.8 '@babel/helper-validator-identifier': 7.24.7 to-fast-properties: 2.0.0 + '@babel/types@7.26.0': + dependencies: + '@babel/helper-string-parser': 7.25.9 + '@babel/helper-validator-identifier': 7.25.9 + '@esbuild/aix-ppc64@0.21.5': optional: true + '@esbuild/aix-ppc64@0.24.0': + optional: true + '@esbuild/android-arm64@0.21.5': optional: true + '@esbuild/android-arm64@0.24.0': + optional: true + '@esbuild/android-arm@0.21.5': optional: true + '@esbuild/android-arm@0.24.0': + optional: true + '@esbuild/android-x64@0.21.5': optional: true - '@esbuild/darwin-arm64@0.21.5': + '@esbuild/android-x64@0.24.0': + optional: true + + '@esbuild/darwin-arm64@0.21.5': + optional: true + + '@esbuild/darwin-arm64@0.24.0': + optional: true + + '@esbuild/darwin-x64@0.21.5': + optional: true + + '@esbuild/darwin-x64@0.24.0': + optional: true + + '@esbuild/freebsd-arm64@0.21.5': + optional: true + + '@esbuild/freebsd-arm64@0.24.0': + optional: true + + '@esbuild/freebsd-x64@0.21.5': + optional: true + + '@esbuild/freebsd-x64@0.24.0': + optional: true + + '@esbuild/linux-arm64@0.21.5': + optional: true + + '@esbuild/linux-arm64@0.24.0': + optional: true + + '@esbuild/linux-arm@0.21.5': + optional: true + + '@esbuild/linux-arm@0.24.0': + optional: true + + '@esbuild/linux-ia32@0.21.5': + optional: true + + '@esbuild/linux-ia32@0.24.0': + optional: true + + '@esbuild/linux-loong64@0.21.5': + optional: true + + '@esbuild/linux-loong64@0.24.0': optional: true - '@esbuild/darwin-x64@0.21.5': + '@esbuild/linux-mips64el@0.21.5': optional: true - '@esbuild/freebsd-arm64@0.21.5': + '@esbuild/linux-mips64el@0.24.0': optional: true - '@esbuild/freebsd-x64@0.21.5': + '@esbuild/linux-ppc64@0.21.5': optional: true - '@esbuild/linux-arm64@0.21.5': + '@esbuild/linux-ppc64@0.24.0': optional: true - '@esbuild/linux-arm@0.21.5': + '@esbuild/linux-riscv64@0.21.5': optional: true - '@esbuild/linux-ia32@0.21.5': + '@esbuild/linux-riscv64@0.24.0': optional: true - '@esbuild/linux-loong64@0.21.5': + '@esbuild/linux-s390x@0.21.5': optional: true - '@esbuild/linux-mips64el@0.21.5': + '@esbuild/linux-s390x@0.24.0': optional: true - '@esbuild/linux-ppc64@0.21.5': + '@esbuild/linux-x64@0.21.5': optional: true - '@esbuild/linux-riscv64@0.21.5': + '@esbuild/linux-x64@0.24.0': optional: true - '@esbuild/linux-s390x@0.21.5': + '@esbuild/netbsd-x64@0.21.5': optional: true - '@esbuild/linux-x64@0.21.5': + '@esbuild/netbsd-x64@0.24.0': optional: true - '@esbuild/netbsd-x64@0.21.5': + '@esbuild/openbsd-arm64@0.24.0': optional: true '@esbuild/openbsd-x64@0.21.5': optional: true + '@esbuild/openbsd-x64@0.24.0': + optional: true + '@esbuild/sunos-x64@0.21.5': optional: true + '@esbuild/sunos-x64@0.24.0': + optional: true + '@esbuild/win32-arm64@0.21.5': optional: true + '@esbuild/win32-arm64@0.24.0': + optional: true + '@esbuild/win32-ia32@0.21.5': optional: true + '@esbuild/win32-ia32@0.24.0': + optional: true + '@esbuild/win32-x64@0.21.5': optional: true + '@esbuild/win32-x64@0.24.0': + optional: true + '@eslint-community/eslint-utils@4.4.0(eslint@8.57.0)': dependencies: eslint: 8.57.0 eslint-visitor-keys: 3.4.3 + '@eslint-community/eslint-utils@4.4.0(eslint@9.15.0)': + dependencies: + eslint: 9.15.0 + eslint-visitor-keys: 3.4.3 + '@eslint-community/regexpp@4.11.0': {} + '@eslint-community/regexpp@4.12.1': {} + + '@eslint/config-array@0.19.0': + dependencies: + '@eslint/object-schema': 2.1.4 + debug: 4.3.5 + minimatch: 3.1.2 + transitivePeerDependencies: + - supports-color + + '@eslint/core@0.9.0': {} + '@eslint/eslintrc@2.1.4': dependencies: ajv: 6.12.6 @@ -4078,8 +4981,37 @@ snapshots: transitivePeerDependencies: - supports-color + '@eslint/eslintrc@3.2.0': + dependencies: + ajv: 6.12.6 + debug: 4.3.5 + espree: 10.3.0 + globals: 14.0.0 + ignore: 5.3.1 + import-fresh: 3.3.0 + js-yaml: 4.1.0 + minimatch: 3.1.2 + strip-json-comments: 3.1.1 + transitivePeerDependencies: + - supports-color + '@eslint/js@8.57.0': {} + '@eslint/js@9.15.0': {} + + '@eslint/object-schema@2.1.4': {} + + '@eslint/plugin-kit@0.2.3': + dependencies: + levn: 0.4.1 + + '@humanfs/core@0.19.1': {} + + '@humanfs/node@0.16.6': + dependencies: + '@humanfs/core': 0.19.1 + '@humanwhocodes/retry': 0.3.1 + '@humanwhocodes/config-array@0.11.14': dependencies: '@humanwhocodes/object-schema': 2.0.3 @@ -4092,6 +5024,10 @@ snapshots: '@humanwhocodes/object-schema@2.0.3': {} + '@humanwhocodes/retry@0.3.1': {} + + '@humanwhocodes/retry@0.4.1': {} + '@istanbuljs/schema@0.1.3': {} '@jest/schemas@29.6.3': @@ -4218,62 +5154,116 @@ snapshots: '@oozcitak/util@8.3.8': {} - '@rollup/pluginutils@5.1.0(rollup@4.19.0)': + '@rollup/pluginutils@5.1.0(rollup@4.27.3)': dependencies: '@types/estree': 1.0.5 estree-walker: 2.0.2 picomatch: 2.3.1 optionalDependencies: - rollup: 4.19.0 + rollup: 4.27.3 '@rollup/rollup-android-arm-eabi@4.19.0': optional: true + '@rollup/rollup-android-arm-eabi@4.27.3': + optional: true + '@rollup/rollup-android-arm64@4.19.0': optional: true + '@rollup/rollup-android-arm64@4.27.3': + optional: true + '@rollup/rollup-darwin-arm64@4.19.0': optional: true + '@rollup/rollup-darwin-arm64@4.27.3': + optional: true + '@rollup/rollup-darwin-x64@4.19.0': optional: true + '@rollup/rollup-darwin-x64@4.27.3': + optional: true + + '@rollup/rollup-freebsd-arm64@4.27.3': + optional: true + + '@rollup/rollup-freebsd-x64@4.27.3': + optional: true + '@rollup/rollup-linux-arm-gnueabihf@4.19.0': optional: true + '@rollup/rollup-linux-arm-gnueabihf@4.27.3': + optional: true + '@rollup/rollup-linux-arm-musleabihf@4.19.0': optional: true + '@rollup/rollup-linux-arm-musleabihf@4.27.3': + optional: true + '@rollup/rollup-linux-arm64-gnu@4.19.0': optional: true + '@rollup/rollup-linux-arm64-gnu@4.27.3': + optional: true + '@rollup/rollup-linux-arm64-musl@4.19.0': optional: true + '@rollup/rollup-linux-arm64-musl@4.27.3': + optional: true + '@rollup/rollup-linux-powerpc64le-gnu@4.19.0': optional: true + '@rollup/rollup-linux-powerpc64le-gnu@4.27.3': + optional: true + '@rollup/rollup-linux-riscv64-gnu@4.19.0': optional: true + '@rollup/rollup-linux-riscv64-gnu@4.27.3': + optional: true + '@rollup/rollup-linux-s390x-gnu@4.19.0': optional: true + '@rollup/rollup-linux-s390x-gnu@4.27.3': + optional: true + '@rollup/rollup-linux-x64-gnu@4.19.0': optional: true + '@rollup/rollup-linux-x64-gnu@4.27.3': + optional: true + '@rollup/rollup-linux-x64-musl@4.19.0': optional: true + '@rollup/rollup-linux-x64-musl@4.27.3': + optional: true + '@rollup/rollup-win32-arm64-msvc@4.19.0': optional: true + '@rollup/rollup-win32-arm64-msvc@4.27.3': + optional: true + '@rollup/rollup-win32-ia32-msvc@4.19.0': optional: true + '@rollup/rollup-win32-ia32-msvc@4.27.3': + optional: true + '@rollup/rollup-win32-x64-msvc@4.19.0': optional: true + '@rollup/rollup-win32-x64-msvc@4.27.3': + optional: true + '@rushstack/eslint-patch@1.10.3': {} '@rushstack/node-core-library@4.0.2(@types/node@20.14.12)': @@ -4341,8 +5331,31 @@ snapshots: '@types/argparse@1.0.38': {} + '@types/babel__core@7.20.5': + dependencies: + '@babel/parser': 7.26.2 + '@babel/types': 7.26.0 + '@types/babel__generator': 7.6.8 + '@types/babel__template': 7.4.4 + '@types/babel__traverse': 7.20.6 + + '@types/babel__generator@7.6.8': + dependencies: + '@babel/types': 7.26.0 + + '@types/babel__template@7.4.4': + dependencies: + '@babel/parser': 7.26.2 + '@babel/types': 7.26.0 + + '@types/babel__traverse@7.20.6': + dependencies: + '@babel/types': 7.26.0 + '@types/estree@1.0.5': {} + '@types/estree@1.0.6': {} + '@types/json-schema@7.0.15': {} '@types/json5@0.0.29': {} @@ -4355,10 +5368,19 @@ snapshots: '@types/prop-types@15.7.12': {} + '@types/react-dom@18.3.1': + dependencies: + '@types/react': 18.3.12 + '@types/react-is@18.3.0': dependencies: '@types/react': 18.3.3 + '@types/react@18.3.12': + dependencies: + '@types/prop-types': 15.7.12 + csstype: 3.1.3 + '@types/react@18.3.3': dependencies: '@types/prop-types': 15.7.12 @@ -4385,6 +5407,24 @@ snapshots: transitivePeerDependencies: - supports-color + '@typescript-eslint/eslint-plugin@8.15.0(@typescript-eslint/parser@8.15.0(eslint@9.15.0)(typescript@5.6.3))(eslint@9.15.0)(typescript@5.6.3)': + dependencies: + '@eslint-community/regexpp': 4.12.1 + '@typescript-eslint/parser': 8.15.0(eslint@9.15.0)(typescript@5.6.3) + '@typescript-eslint/scope-manager': 8.15.0 + '@typescript-eslint/type-utils': 8.15.0(eslint@9.15.0)(typescript@5.6.3) + '@typescript-eslint/utils': 8.15.0(eslint@9.15.0)(typescript@5.6.3) + '@typescript-eslint/visitor-keys': 8.15.0 + eslint: 9.15.0 + graphemer: 1.4.0 + ignore: 5.3.1 + natural-compare: 1.4.0 + ts-api-utils: 1.4.0(typescript@5.6.3) + optionalDependencies: + typescript: 5.6.3 + transitivePeerDependencies: + - supports-color + '@typescript-eslint/experimental-utils@5.62.0(eslint@8.57.0)(typescript@5.5.4)': dependencies: '@typescript-eslint/utils': 5.62.0(eslint@8.57.0)(typescript@5.5.4) @@ -4405,11 +5445,29 @@ snapshots: transitivePeerDependencies: - supports-color + '@typescript-eslint/parser@8.15.0(eslint@9.15.0)(typescript@5.6.3)': + dependencies: + '@typescript-eslint/scope-manager': 8.15.0 + '@typescript-eslint/types': 8.15.0 + '@typescript-eslint/typescript-estree': 8.15.0(typescript@5.6.3) + '@typescript-eslint/visitor-keys': 8.15.0 + debug: 4.3.5 + eslint: 9.15.0 + optionalDependencies: + typescript: 5.6.3 + transitivePeerDependencies: + - supports-color + '@typescript-eslint/scope-manager@5.62.0': dependencies: '@typescript-eslint/types': 5.62.0 '@typescript-eslint/visitor-keys': 5.62.0 + '@typescript-eslint/scope-manager@8.15.0': + dependencies: + '@typescript-eslint/types': 8.15.0 + '@typescript-eslint/visitor-keys': 8.15.0 + '@typescript-eslint/type-utils@5.62.0(eslint@8.57.0)(typescript@5.5.4)': dependencies: '@typescript-eslint/typescript-estree': 5.62.0(typescript@5.5.4) @@ -4422,8 +5480,22 @@ snapshots: transitivePeerDependencies: - supports-color + '@typescript-eslint/type-utils@8.15.0(eslint@9.15.0)(typescript@5.6.3)': + dependencies: + '@typescript-eslint/typescript-estree': 8.15.0(typescript@5.6.3) + '@typescript-eslint/utils': 8.15.0(eslint@9.15.0)(typescript@5.6.3) + debug: 4.3.5 + eslint: 9.15.0 + ts-api-utils: 1.4.0(typescript@5.6.3) + optionalDependencies: + typescript: 5.6.3 + transitivePeerDependencies: + - supports-color + '@typescript-eslint/types@5.62.0': {} + '@typescript-eslint/types@8.15.0': {} + '@typescript-eslint/typescript-estree@5.62.0(typescript@5.5.4)': dependencies: '@typescript-eslint/types': 5.62.0 @@ -4438,6 +5510,21 @@ snapshots: transitivePeerDependencies: - supports-color + '@typescript-eslint/typescript-estree@8.15.0(typescript@5.6.3)': + dependencies: + '@typescript-eslint/types': 8.15.0 + '@typescript-eslint/visitor-keys': 8.15.0 + debug: 4.3.5 + fast-glob: 3.3.2 + is-glob: 4.0.3 + minimatch: 9.0.5 + semver: 7.6.3 + ts-api-utils: 1.4.0(typescript@5.6.3) + optionalDependencies: + typescript: 5.6.3 + transitivePeerDependencies: + - supports-color + '@typescript-eslint/utils@5.62.0(eslint@8.57.0)(typescript@5.5.4)': dependencies: '@eslint-community/eslint-utils': 4.4.0(eslint@8.57.0) @@ -4453,13 +5540,41 @@ snapshots: - supports-color - typescript + '@typescript-eslint/utils@8.15.0(eslint@9.15.0)(typescript@5.6.3)': + dependencies: + '@eslint-community/eslint-utils': 4.4.0(eslint@9.15.0) + '@typescript-eslint/scope-manager': 8.15.0 + '@typescript-eslint/types': 8.15.0 + '@typescript-eslint/typescript-estree': 8.15.0(typescript@5.6.3) + eslint: 9.15.0 + optionalDependencies: + typescript: 5.6.3 + transitivePeerDependencies: + - supports-color + '@typescript-eslint/visitor-keys@5.62.0': dependencies: '@typescript-eslint/types': 5.62.0 eslint-visitor-keys: 3.4.3 + '@typescript-eslint/visitor-keys@8.15.0': + dependencies: + '@typescript-eslint/types': 8.15.0 + eslint-visitor-keys: 4.2.0 + '@ungap/structured-clone@1.2.0': {} + '@vitejs/plugin-react@4.3.4(vite@6.0.1(@types/node@20.14.12)(yaml@2.4.5))': + dependencies: + '@babel/core': 7.26.0 + '@babel/plugin-transform-react-jsx-self': 7.25.9(@babel/core@7.26.0) + '@babel/plugin-transform-react-jsx-source': 7.25.9(@babel/core@7.26.0) + '@types/babel__core': 7.20.5 + react-refresh: 0.14.2 + vite: 6.0.1(@types/node@20.14.12)(yaml@2.4.5) + transitivePeerDependencies: + - supports-color + '@vitest/coverage-istanbul@1.6.0(vitest@1.6.0(@types/node@20.14.12))': dependencies: debug: 4.3.5 @@ -4550,12 +5665,18 @@ snapshots: dependencies: acorn: 8.12.1 + acorn-jsx@5.3.2(acorn@8.14.0): + dependencies: + acorn: 8.14.0 + acorn-walk@8.3.3: dependencies: acorn: 8.12.1 acorn@8.12.1: {} + acorn@8.14.0: {} + ajv-draft-04@1.0.0(ajv@8.13.0): optionalDependencies: ajv: 8.13.0 @@ -4772,6 +5893,13 @@ snapshots: node-releases: 2.0.18 update-browserslist-db: 1.1.0(browserslist@4.23.2) + browserslist@4.24.2: + dependencies: + caniuse-lite: 1.0.30001683 + electron-to-chromium: 1.5.64 + node-releases: 2.0.18 + update-browserslist-db: 1.1.1(browserslist@4.24.2) + cac@6.7.14: {} call-bind@1.0.7: @@ -4786,6 +5914,8 @@ snapshots: caniuse-lite@1.0.30001643: {} + caniuse-lite@1.0.30001683: {} + chai@4.5.0: dependencies: assertion-error: 1.1.0 @@ -4869,6 +5999,12 @@ snapshots: shebang-command: 2.0.0 which: 2.0.2 + cross-spawn@7.0.6: + dependencies: + path-key: 3.1.1 + shebang-command: 2.0.0 + which: 2.0.2 + csstype@3.1.3: {} damerau-levenshtein@1.0.8: {} @@ -4956,6 +6092,8 @@ snapshots: electron-to-chromium@1.5.2: {} + electron-to-chromium@1.5.64: {} + emoji-regex@10.3.0: {} emoji-regex@9.2.2: {} @@ -5098,8 +6236,37 @@ snapshots: '@esbuild/win32-ia32': 0.21.5 '@esbuild/win32-x64': 0.21.5 + esbuild@0.24.0: + optionalDependencies: + '@esbuild/aix-ppc64': 0.24.0 + '@esbuild/android-arm': 0.24.0 + '@esbuild/android-arm64': 0.24.0 + '@esbuild/android-x64': 0.24.0 + '@esbuild/darwin-arm64': 0.24.0 + '@esbuild/darwin-x64': 0.24.0 + '@esbuild/freebsd-arm64': 0.24.0 + '@esbuild/freebsd-x64': 0.24.0 + '@esbuild/linux-arm': 0.24.0 + '@esbuild/linux-arm64': 0.24.0 + '@esbuild/linux-ia32': 0.24.0 + '@esbuild/linux-loong64': 0.24.0 + '@esbuild/linux-mips64el': 0.24.0 + '@esbuild/linux-ppc64': 0.24.0 + '@esbuild/linux-riscv64': 0.24.0 + '@esbuild/linux-s390x': 0.24.0 + '@esbuild/linux-x64': 0.24.0 + '@esbuild/netbsd-x64': 0.24.0 + '@esbuild/openbsd-arm64': 0.24.0 + '@esbuild/openbsd-x64': 0.24.0 + '@esbuild/sunos-x64': 0.24.0 + '@esbuild/win32-arm64': 0.24.0 + '@esbuild/win32-ia32': 0.24.0 + '@esbuild/win32-x64': 0.24.0 + escalade@3.1.2: {} + escalade@3.2.0: {} + escape-string-regexp@1.0.5: {} escape-string-regexp@4.0.0: {} @@ -5218,6 +6385,14 @@ snapshots: dependencies: eslint: 8.57.0 + eslint-plugin-react-hooks@5.0.0(eslint@9.15.0): + dependencies: + eslint: 9.15.0 + + eslint-plugin-react-refresh@0.4.14(eslint@9.15.0): + dependencies: + eslint: 9.15.0 + eslint-plugin-react@7.35.0(eslint@8.57.0): dependencies: array-includes: 3.1.8 @@ -5258,10 +6433,17 @@ snapshots: esrecurse: 4.3.0 estraverse: 5.3.0 + eslint-scope@8.2.0: + dependencies: + esrecurse: 4.3.0 + estraverse: 5.3.0 + eslint-visitor-keys@2.1.0: {} eslint-visitor-keys@3.4.3: {} + eslint-visitor-keys@4.2.0: {} + eslint@8.57.0: dependencies: '@eslint-community/eslint-utils': 4.4.0(eslint@8.57.0) @@ -5305,6 +6487,51 @@ snapshots: transitivePeerDependencies: - supports-color + eslint@9.15.0: + dependencies: + '@eslint-community/eslint-utils': 4.4.0(eslint@9.15.0) + '@eslint-community/regexpp': 4.12.1 + '@eslint/config-array': 0.19.0 + '@eslint/core': 0.9.0 + '@eslint/eslintrc': 3.2.0 + '@eslint/js': 9.15.0 + '@eslint/plugin-kit': 0.2.3 + '@humanfs/node': 0.16.6 + '@humanwhocodes/module-importer': 1.0.1 + '@humanwhocodes/retry': 0.4.1 + '@types/estree': 1.0.6 + '@types/json-schema': 7.0.15 + ajv: 6.12.6 + chalk: 4.1.2 + cross-spawn: 7.0.6 + debug: 4.3.5 + escape-string-regexp: 4.0.0 + eslint-scope: 8.2.0 + eslint-visitor-keys: 4.2.0 + espree: 10.3.0 + esquery: 1.6.0 + esutils: 2.0.3 + fast-deep-equal: 3.1.3 + file-entry-cache: 8.0.0 + find-up: 5.0.0 + glob-parent: 6.0.2 + ignore: 5.3.1 + imurmurhash: 0.1.4 + is-glob: 4.0.3 + json-stable-stringify-without-jsonify: 1.0.1 + lodash.merge: 4.6.2 + minimatch: 3.1.2 + natural-compare: 1.4.0 + optionator: 0.9.4 + transitivePeerDependencies: + - supports-color + + espree@10.3.0: + dependencies: + acorn: 8.14.0 + acorn-jsx: 5.3.2(acorn@8.14.0) + eslint-visitor-keys: 4.2.0 + espree@9.6.1: dependencies: acorn: 8.12.1 @@ -5369,6 +6596,10 @@ snapshots: dependencies: flat-cache: 3.2.0 + file-entry-cache@8.0.0: + dependencies: + flat-cache: 4.0.1 + fill-range@7.1.1: dependencies: to-regex-range: 5.0.1 @@ -5384,6 +6615,11 @@ snapshots: keyv: 4.5.4 rimraf: 3.0.2 + flat-cache@4.0.1: + dependencies: + flatted: 3.3.1 + keyv: 4.5.4 + flatted@3.3.1: {} for-each@0.3.3: @@ -5457,6 +6693,10 @@ snapshots: dependencies: type-fest: 0.20.2 + globals@14.0.0: {} + + globals@15.12.0: {} + globalthis@1.0.4: dependencies: define-properties: 1.2.1 @@ -5702,6 +6942,8 @@ snapshots: jsesc@2.5.2: {} + jsesc@3.0.2: {} + json-buffer@3.0.1: {} json-parse-even-better-errors@2.3.1: {} @@ -5990,6 +7232,8 @@ snapshots: picocolors@1.0.1: {} + picocolors@1.1.1: {} + picomatch@2.3.1: {} pidtree@0.6.0: {} @@ -6008,6 +7252,12 @@ snapshots: picocolors: 1.0.1 source-map-js: 1.2.0 + postcss@8.4.49: + dependencies: + nanoid: 3.3.7 + picocolors: 1.1.1 + source-map-js: 1.2.1 + prelude-ls@1.2.1: {} prettier@3.3.3: {} @@ -6028,10 +7278,18 @@ snapshots: queue-microtask@1.2.3: {} + react-dom@18.3.1(react@18.3.1): + dependencies: + loose-envify: 1.4.0 + react: 18.3.1 + scheduler: 0.23.2 + react-is@16.13.1: {} react-is@18.3.1: {} + react-refresh@0.14.2: {} + react@18.3.1: dependencies: loose-envify: 1.4.0 @@ -6134,6 +7392,30 @@ snapshots: '@rollup/rollup-win32-x64-msvc': 4.19.0 fsevents: 2.3.3 + rollup@4.27.3: + dependencies: + '@types/estree': 1.0.6 + optionalDependencies: + '@rollup/rollup-android-arm-eabi': 4.27.3 + '@rollup/rollup-android-arm64': 4.27.3 + '@rollup/rollup-darwin-arm64': 4.27.3 + '@rollup/rollup-darwin-x64': 4.27.3 + '@rollup/rollup-freebsd-arm64': 4.27.3 + '@rollup/rollup-freebsd-x64': 4.27.3 + '@rollup/rollup-linux-arm-gnueabihf': 4.27.3 + '@rollup/rollup-linux-arm-musleabihf': 4.27.3 + '@rollup/rollup-linux-arm64-gnu': 4.27.3 + '@rollup/rollup-linux-arm64-musl': 4.27.3 + '@rollup/rollup-linux-powerpc64le-gnu': 4.27.3 + '@rollup/rollup-linux-riscv64-gnu': 4.27.3 + '@rollup/rollup-linux-s390x-gnu': 4.27.3 + '@rollup/rollup-linux-x64-gnu': 4.27.3 + '@rollup/rollup-linux-x64-musl': 4.27.3 + '@rollup/rollup-win32-arm64-msvc': 4.27.3 + '@rollup/rollup-win32-ia32-msvc': 4.27.3 + '@rollup/rollup-win32-x64-msvc': 4.27.3 + fsevents: 2.3.3 + run-parallel@1.2.0: dependencies: queue-microtask: 1.2.3 @@ -6151,6 +7433,10 @@ snapshots: es-errors: 1.3.0 is-regex: 1.1.4 + scheduler@0.23.2: + dependencies: + loose-envify: 1.4.0 + semver@6.3.1: {} semver@7.5.4: @@ -6206,6 +7492,8 @@ snapshots: source-map-js@1.2.0: {} + source-map-js@1.2.1: {} + source-map@0.6.1: {} sprintf-js@1.0.3: {} @@ -6324,6 +7612,10 @@ snapshots: dependencies: is-number: 7.0.0 + ts-api-utils@1.4.0(typescript@5.6.3): + dependencies: + typescript: 5.6.3 + tsconfig-paths@3.15.0: dependencies: '@types/json5': 0.0.29 @@ -6378,10 +7670,23 @@ snapshots: is-typed-array: 1.1.13 possible-typed-array-names: 1.0.0 + typescript-eslint@8.15.0(eslint@9.15.0)(typescript@5.6.3): + dependencies: + '@typescript-eslint/eslint-plugin': 8.15.0(@typescript-eslint/parser@8.15.0(eslint@9.15.0)(typescript@5.6.3))(eslint@9.15.0)(typescript@5.6.3) + '@typescript-eslint/parser': 8.15.0(eslint@9.15.0)(typescript@5.6.3) + '@typescript-eslint/utils': 8.15.0(eslint@9.15.0)(typescript@5.6.3) + eslint: 9.15.0 + optionalDependencies: + typescript: 5.6.3 + transitivePeerDependencies: + - supports-color + typescript@5.4.2: {} typescript@5.5.4: {} + typescript@5.6.3: {} + ufo@1.5.4: {} unbox-primitive@1.0.2: @@ -6412,6 +7717,12 @@ snapshots: escalade: 3.1.2 picocolors: 1.0.1 + update-browserslist-db@1.1.1(browserslist@4.24.2): + dependencies: + browserslist: 4.24.2 + escalade: 3.2.0 + picocolors: 1.1.1 + uri-js@4.4.1: dependencies: punycode: 2.3.1 @@ -6424,21 +7735,22 @@ snapshots: debug: 4.3.5 pathe: 1.1.2 picocolors: 1.0.1 - vite: 5.3.5(@types/node@20.14.12) + vite: 5.4.11(@types/node@20.14.12) transitivePeerDependencies: - '@types/node' - less - lightningcss - sass + - sass-embedded - stylus - sugarss - supports-color - terser - vite-plugin-dts@3.9.1(@types/node@20.14.12)(rollup@4.19.0)(typescript@5.5.4)(vite@5.3.5(@types/node@20.14.12)): + vite-plugin-dts@3.9.1(@types/node@20.14.12)(rollup@4.27.3)(typescript@5.5.4)(vite@5.3.5(@types/node@20.14.12)): dependencies: '@microsoft/api-extractor': 7.43.0(@types/node@20.14.12) - '@rollup/pluginutils': 5.1.0(rollup@4.19.0) + '@rollup/pluginutils': 5.1.0(rollup@4.27.3) '@vue/language-core': 1.8.27(typescript@5.5.4) debug: 4.3.5 kolorist: 1.8.0 @@ -6461,6 +7773,25 @@ snapshots: '@types/node': 20.14.12 fsevents: 2.3.3 + vite@5.4.11(@types/node@20.14.12): + dependencies: + esbuild: 0.21.5 + postcss: 8.4.49 + rollup: 4.27.3 + optionalDependencies: + '@types/node': 20.14.12 + fsevents: 2.3.3 + + vite@6.0.1(@types/node@20.14.12)(yaml@2.4.5): + dependencies: + esbuild: 0.24.0 + postcss: 8.4.49 + rollup: 4.27.3 + optionalDependencies: + '@types/node': 20.14.12 + fsevents: 2.3.3 + yaml: 2.4.5 + vitest@1.6.0(@types/node@20.14.12): dependencies: '@vitest/expect': 1.6.0 @@ -6489,6 +7820,7 @@ snapshots: - less - lightningcss - sass + - sass-embedded - stylus - sugarss - supports-color diff --git a/render.ts b/render.ts new file mode 100644 index 0000000..63688bf --- /dev/null +++ b/render.ts @@ -0,0 +1 @@ +export function render() {} diff --git a/src/builtin/CData.ts b/src/builtin/CData.ts new file mode 100644 index 0000000..33c46af --- /dev/null +++ b/src/builtin/CData.ts @@ -0,0 +1,13 @@ +import { joinTextChildren, TextChildren } from '../lib/join'; +import { getCurrentElement } from '../lib/elements-stack'; + +/** + * + * @public + */ +export function CData(props: { children: TextChildren }) { + const cur = getCurrentElement(); + const text = joinTextChildren(props.children); + cur.dat(text); + return null; +} diff --git a/src/builtin/Comment.ts b/src/builtin/Comment.ts new file mode 100644 index 0000000..211497d --- /dev/null +++ b/src/builtin/Comment.ts @@ -0,0 +1,13 @@ +import { joinTextChildren, TextChildren } from '../lib/join'; +import { getCurrentElement } from '../lib/elements-stack'; + +/** + * + * @public + */ +export function Comment(props: { children: TextChildren }) { + const cur = getCurrentElement(); + const text = joinTextChildren(props.children); + cur.com(text); + return null; +} diff --git a/src/builtin/Fragment.ts b/src/builtin/Fragment.ts new file mode 100644 index 0000000..d961eea --- /dev/null +++ b/src/builtin/Fragment.ts @@ -0,0 +1,14 @@ +import { ReactNode } from 'react'; +import { createJsxXmlComponentElement } from '../lib/jsx'; + +/** + * + * @public + */ +export function Fragment(props: { children?: ReactNode }) { + return props.children; +} + +export function createFragment(children: ReactNode) { + return createJsxXmlComponentElement(Fragment, {}, children); +} diff --git a/src/builtin/Ins.ts b/src/builtin/Ins.ts new file mode 100644 index 0000000..2264f48 --- /dev/null +++ b/src/builtin/Ins.ts @@ -0,0 +1,12 @@ +import { getCurrentElement } from '../lib/elements-stack'; + +/** + * + * @public + */ +export function Ins(props: { target: string; content?: string }) { + const cur = getCurrentElement(); + const { target, content = '' } = props; + cur.ins(target, content); + return null; +} diff --git a/src/index.ts b/src/index.ts index feb541e..3b67771 100644 --- a/src/index.ts +++ b/src/index.ts @@ -1,5 +1,19 @@ -export { render } from './render'; -export { Comment } from './lib/Comment'; -export { CData } from './lib/CData'; -export { Ins } from './lib/Ins'; -export { Fragment } from './lib/Fragment'; +export { render } from './lib/render'; +export { Fragment } from './builtin/Fragment'; +export { Comment } from './builtin/Comment'; +export { CData } from './builtin/CData'; +export { Ins } from './builtin/Ins'; + +export { createElement } from './lib/runtime'; +export { JSXXML, JSXXML as h } from './lib/runtime'; +export { + getCurrentElement as _getCurrentElement, + withElement as _withElement, +} from './lib/elements-stack'; + +export type { TextChildren, TextChild } from './lib/join'; +export type { + JsxXmlElement, + JsxXmlComponentElement, + JsxXmlTagElement, +} from './lib/types'; diff --git a/src/jsx-dev-runtime.ts b/src/jsx-dev-runtime.ts new file mode 100644 index 0000000..7f737e8 --- /dev/null +++ b/src/jsx-dev-runtime.ts @@ -0,0 +1,7 @@ +export { Fragment } from './builtin/Fragment'; +export { jsxDEV } from './lib/runtime'; +export type { + JsxXmlElement, + JsxXmlComponentElement, + JsxXmlTagElement, +} from './lib/types'; diff --git a/src/jsx-runtime.ts b/src/jsx-runtime.ts new file mode 100644 index 0000000..fb2d1bc --- /dev/null +++ b/src/jsx-runtime.ts @@ -0,0 +1,7 @@ +export { Fragment } from './builtin/Fragment'; +export { jsx, jsxs } from './lib/runtime'; +export type { + JsxXmlElement, + JsxXmlComponentElement, + JsxXmlTagElement, +} from './lib/types'; diff --git a/src/lib/CData.tsx b/src/lib/CData.tsx deleted file mode 100644 index 8e0b8e4..0000000 --- a/src/lib/CData.tsx +++ /dev/null @@ -1,7 +0,0 @@ -import { createJsxXmlBuiltinElement } from './builtin'; -import { joinTextChildren, TextChildren } from './join'; - -export function CData(props: { children: TextChildren }) { - const children = joinTextChildren(props.children); - return createJsxXmlBuiltinElement('cdata', { children }); -} diff --git a/src/lib/Comment.tsx b/src/lib/Comment.tsx deleted file mode 100644 index 209b989..0000000 --- a/src/lib/Comment.tsx +++ /dev/null @@ -1,7 +0,0 @@ -import { createJsxXmlBuiltinElement } from './builtin'; -import { joinTextChildren, TextChildren } from './join'; - -export function Comment(props: { children: TextChildren }) { - const children = joinTextChildren(props.children); - return createJsxXmlBuiltinElement('comment', { children }); -} diff --git a/src/lib/Fragment.tsx b/src/lib/Fragment.tsx deleted file mode 100644 index 6801894..0000000 --- a/src/lib/Fragment.tsx +++ /dev/null @@ -1,7 +0,0 @@ -import { ReactNode } from 'react'; -import { createJsxXmlBuiltinElement } from './builtin'; - -export function Fragment(props: { children?: ReactNode }) { - const { children } = props; - return createJsxXmlBuiltinElement('fragment', { children }); -} diff --git a/src/lib/Ins.tsx b/src/lib/Ins.tsx deleted file mode 100644 index bd54eae..0000000 --- a/src/lib/Ins.tsx +++ /dev/null @@ -1,6 +0,0 @@ -import { createJsxXmlBuiltinElement } from './builtin'; - -export function Ins(props: { target: string; content?: string }) { - const { target, content = '' } = props; - return createJsxXmlBuiltinElement('ins', { target, content }); -} diff --git a/src/lib/builtin.ts b/src/lib/builtin.ts deleted file mode 100644 index a038aa9..0000000 --- a/src/lib/builtin.ts +++ /dev/null @@ -1,20 +0,0 @@ -import { type ReactElement } from 'react'; - -export const JsxXmlBuiltin = Symbol('JSXXML.Builtin'); - -export function isJsxXmlBuiltinElement(value: any) { - return value && value.$$typeof === JsxXmlBuiltin; -} - -export function createJsxXmlBuiltinElement( - type: string, - props: any, -): ReactElement { - return { - // @ts-ignore - $$typeof: JsxXmlBuiltin, - type, - props, - key: null, - }; -} diff --git a/src/lib/elements-stack.ts b/src/lib/elements-stack.ts new file mode 100644 index 0000000..138024c --- /dev/null +++ b/src/lib/elements-stack.ts @@ -0,0 +1,22 @@ +import type { XMLBuilder } from 'xmlbuilder2/lib/interfaces'; + +export let elementsStack: XMLBuilder[] = []; + +/** + * @internal + */ +export function getCurrentElement() { + return elementsStack[elementsStack.length - 1]; +} + +/** + * @internal + */ +export function withElement(cur: XMLBuilder, fn: () => void) { + try { + elementsStack.push(cur); + fn(); + } finally { + elementsStack.pop(); + } +} diff --git a/src/lib/join.ts b/src/lib/join.ts index 4567065..2914278 100644 --- a/src/lib/join.ts +++ b/src/lib/join.ts @@ -1,4 +1,10 @@ +/** + * @public + */ export type TextChild = string | number | boolean | null | undefined; +/** + * @public + */ export type TextChildren = TextChild | TextChildren[]; export function joinTextChildren(children: TextChildren): string { diff --git a/src/lib/jsx.ts b/src/lib/jsx.ts new file mode 100644 index 0000000..ad53287 --- /dev/null +++ b/src/lib/jsx.ts @@ -0,0 +1,57 @@ +import { JsxXML, JsxXmlComponentElement, JsxXmlTagElement } from './types'; + +export function createJsxXmlTagElement( + type: string, + attrs: any, + children?: any, +): JsxXmlTagElement { + return { + $$typeof: JsxXML, + builtin: false, + type, + attrs, + children, + }; +} + +export function isJsxXmlTagElement(element: any): element is JsxXmlTagElement { + return ( + element.$$typeof === JsxXML && + !element.builtin && + typeof element.type === 'string' + ); +} + +export function createJsxXmlComponentElement( + type: (props: any) => any, + props: any, + children?: any, +): JsxXmlComponentElement { + return { + $$typeof: JsxXML, + builtin: false, + type, + props: { ...props, children }, + }; +} + +export function isJsxXmlComponentElement( + element: any, +): element is JsxXmlComponentElement { + return ( + element.$$typeof === JsxXML && + !element.builtin && + typeof element.type === 'function' + ); +} + +export function createJsxXmlElement( + type: string | ((props: any) => any), + props: any, + children?: any, +) { + if (typeof type === 'string') { + return createJsxXmlTagElement(type, props, children); + } + return createJsxXmlComponentElement(type, props, children); +} diff --git a/src/lib/react.ts b/src/lib/react.ts new file mode 100644 index 0000000..1764c89 --- /dev/null +++ b/src/lib/react.ts @@ -0,0 +1,29 @@ +import { ReactElement } from 'react'; +import { createJsxXmlComponentElement, createJsxXmlTagElement } from './jsx'; +import { isFragment } from 'react-is'; +import { createFragment } from '../builtin/Fragment'; + +export function reactElementToJsxXmlElement(element: ReactElement) { + if (typeof element.type === 'string') { + // @ts-ignore + const { key, ref } = element; + const { children, ...rest } = element.props; + const props = { key, ref, ...rest }; + return createJsxXmlTagElement(element.type, props, children); + } + if (typeof element.type === 'function') { + // @ts-ignore + const { key, ref } = element; + const { children, ...rest } = element.props; + const props = { key, ref, ...rest }; + if (element.type.prototype?.isReactComponent) { + throw new Error('Class components are not supported'); + } + // @ts-ignore + return createJsxXmlComponentElement(element.type, props, children); + } + if (isFragment(element)) { + return createFragment(element.props.children); + } + throw new Error('Unsupported element type'); +} diff --git a/src/lib/render-classic.test.tsx b/src/lib/render-classic.test.tsx new file mode 100644 index 0000000..9e53d78 --- /dev/null +++ b/src/lib/render-classic.test.tsx @@ -0,0 +1,323 @@ +// @jsxRuntime classic +// @jsxFrag Fragment +// @jsx h + +import { describe, expect, test } from 'vitest'; +import { CData, Comment, Fragment, Ins, render, h } from '../index'; + +declare global { + namespace JSX { + interface IntrinsicElements { + test: any; + item: any; + root: any; + 'h:test': any; + 'h:item': any; + 'x:test': any; + 'x:item': any; + } + } +} + +describe('render', () => { + describe('tag', () => { + test('should render a tag element', () => { + let xml = render().end({ headless: true }); + expect(xml).toBe(``); + }); + test('should render a tag element with attrs', () => { + let xml = render().end({ headless: true }); + expect(xml).toBe(``); + }); + test('should render a tag element with a child', () => { + let xml = render( + + + , + ).end({ headless: true }); + expect(xml).toBe(``); + }); + test('should render a tag element with children', () => { + let xml = render( + + + + , + ).end({ headless: true }); + expect(xml).toBe(``); + }); + test('should render a tag element with children and attrs', () => { + let xml = render( + + + + , + ).end({ headless: true }); + expect(xml).toBe(``); + }); + test('should render a tag element with a text child', () => { + let xml = render(text).end({ headless: true }); + expect(xml).toBe(`text`); + }); + test('should render a tag element with text children', () => { + let xml = render( + + text + {' child'} + , + ).end({ headless: true }); + expect(xml).toBe(`text child`); + }); + test('should render a tag element with number children', () => { + let xml = render( + + {2} + {3} + , + ).end({ headless: true }); + expect(xml).toBe(`23`); + }); + test('should render a tag element with a text child and a tag child', () => { + let xml = render( + + text + + , + ).end({ headless: true }); + expect(xml).toBe(`text`); + }); + }); + describe('fragment', () => { + test('should render a fragment element', () => { + let xml = render( + + <> + + + + , + ).end({ headless: true }); + expect(xml).toBe(``); + }); + }); + describe('builtin', () => { + describe('Fragment', () => { + test('should render a fragment element with no child', () => { + let xml = render( + + + , + ).end({ headless: true }); + expect(xml).toBe(``); + }); + test('should render a fragment element with a child', () => { + let xml = render( + + + + + , + ).end({ headless: true }); + expect(xml).toBe(``); + }); + test('should render a fragment element with children', () => { + let xml = render( + + + + + + , + ).end({ headless: true }); + expect(xml).toBe(``); + }); + }); + + describe('cdata', () => { + test('should render a cdata element with a child', () => { + let xml = render( + + test + , + ).end({ headless: true }); + expect(xml).toBe(``); + }); + test('should render a cdata element with children', () => { + let xml = render( + + test {2} + , + ).end({ headless: true }); + expect(xml).toBe(``); + }); + }); + + describe('comment', () => { + test('should render a comment element with a child', () => { + let xml = render( + + comment + , + ).end({ headless: true }); + expect(xml).toBe(``); + }); + test('should render a comment element with children', () => { + let xml = render( + + comment {2} + , + ).end({ headless: true }); + expect(xml).toBe(``); + }); + test('should render a comment element at root element', () => { + let xml = render(comment {2}).end({ + headless: true, + }); + expect(xml).toBe(``); + }); + test('should render a comment element at root element with other elements', () => { + let xml = render( + <> + comment {2} + + , + ).end({ headless: true }); + expect(xml).toBe(``); + }); + }); + + describe('ins', () => { + test('should render an ins element without content', () => { + let xml = render( + + + , + ).end({ headless: true }); + expect(xml).toBe(``); + }); + test('should render an ins element with content', () => { + let xml = render( + + + , + ).end({ headless: true }); + expect(xml).toBe(``); + }); + test('should render an ins element with multiple content', () => { + let xml = render( + + + , + ).end({ headless: true }); + expect(xml).toBe(``); + }); + test('should render an ins element at root element', () => { + let xml = render().end({ + headless: true, + }); + expect(xml).toBe(``); + }); + test('should render an ins element at root element with other elements', () => { + let xml = render( + <> + + + , + ).end({ headless: true }); + expect(xml).toBe(``); + }); + }); + }); + describe('Component', () => { + test('should render a component element', () => { + function Test() { + return ; + } + let xml = render( + + + , + ).end({ headless: true }); + expect(xml).toBe(``); + }); + test('should render a component element with props', () => { + function Test(props: { x: number }) { + return ; + } + let xml = render( + + + , + ).end({ headless: true }); + expect(xml).toBe(``); + }); + test('should render a component element with children', () => { + function Test(props: { x: number }) { + return ( + + + + ); + } + let xml = render( + + + , + ).end({ headless: true }); + expect(xml).toBe(``); + }); + test('should render a component element with children prop', () => { + function Test(props: { x: number; children: any }) { + return {props.children}; + } + let xml = render( + + + + + , + ).end({ headless: true }); + expect(xml).toBe(``); + }); + test('should render a component element with component children', () => { + function Test(props: { x: number; children: any }) { + return {props.children}; + } + function Child() { + return ; + } + let xml = render( + + + + + , + ).end({ headless: true }); + expect(xml).toBe(``); + }); + }); + describe('errors', () => { + test('unsupported element', () => { + expect(() => { + render({{ some: 'object' }}); + }).toThrowError('Unsupported element type'); + }); + test('unsupported element type', () => { + const Type = { some: 'object' }; + expect(() => { + // @ts-expect-error + render(); + }).toThrowError('Unsupported element type'); + }); + }); + describe('edge cases', () => { + test('render a tag with key and ref', () => { + let xml = render( + , + ).end({ headless: true }); + expect(xml).toBe( + ``, + ); + }); + }); +}); diff --git a/src/lib/render.test.tsx b/src/lib/render.test.tsx new file mode 100644 index 0000000..aefc0d0 --- /dev/null +++ b/src/lib/render.test.tsx @@ -0,0 +1,334 @@ +import { describe, expect, test } from 'vitest'; +import { CData, Comment, Fragment, Ins, render } from '../index'; +import { Component } from 'react'; + +declare global { + namespace JSX { + interface IntrinsicElements { + test: any; + item: any; + root: any; + 'h:test': any; + 'h:item': any; + 'x:test': any; + 'x:item': any; + } + } +} + +describe('render', () => { + describe('tag', () => { + test('should render a tag element', () => { + let xml = render().end({ headless: true }); + expect(xml).toBe(``); + }); + test('should render a tag element with attrs', () => { + let xml = render().end({ headless: true }); + expect(xml).toBe(``); + }); + test('should render a tag element with a child', () => { + let xml = render( + + + , + ).end({ headless: true }); + expect(xml).toBe(``); + }); + test('should render a tag element with children', () => { + let xml = render( + + + + , + ).end({ headless: true }); + expect(xml).toBe(``); + }); + test('should render a tag element with children and attrs', () => { + let xml = render( + + + + , + ).end({ headless: true }); + expect(xml).toBe(``); + }); + test('should render a tag element with a text child', () => { + let xml = render(text).end({ headless: true }); + expect(xml).toBe(`text`); + }); + test('should render a tag element with text children', () => { + let xml = render( + + text + {' child'} + , + ).end({ headless: true }); + expect(xml).toBe(`text child`); + }); + test('should render a tag element with number children', () => { + let xml = render( + + {2} + {3} + , + ).end({ headless: true }); + expect(xml).toBe(`23`); + }); + test('should render a tag element with a text child and a tag child', () => { + let xml = render( + + text + + , + ).end({ headless: true }); + expect(xml).toBe(`text`); + }); + }); + describe('fragment', () => { + test('should render a fragment element', () => { + let xml = render( + + <> + + + + , + ).end({ headless: true }); + expect(xml).toBe(``); + }); + }); + describe('builtin', () => { + describe('Fragment', () => { + test('should render a fragment element with no child', () => { + let xml = render( + + + , + ).end({ headless: true }); + expect(xml).toBe(``); + }); + test('should render a fragment element with a child', () => { + let xml = render( + + + + + , + ).end({ headless: true }); + expect(xml).toBe(``); + }); + test('should render a fragment element with children', () => { + let xml = render( + + + + + + , + ).end({ headless: true }); + expect(xml).toBe(``); + }); + }); + + describe('cdata', () => { + test('should render a cdata element with a child', () => { + let xml = render( + + test + , + ).end({ headless: true }); + expect(xml).toBe(``); + }); + test('should render a cdata element with children', () => { + let xml = render( + + test {2} + , + ).end({ headless: true }); + expect(xml).toBe(``); + }); + }); + + describe('comment', () => { + test('should render a comment element with a child', () => { + let xml = render( + + comment + , + ).end({ headless: true }); + expect(xml).toBe(``); + }); + test('should render a comment element with children', () => { + let xml = render( + + comment {2} + , + ).end({ headless: true }); + expect(xml).toBe(``); + }); + test('should render a comment element at root element', () => { + let xml = render(comment {2}).end({ + headless: true, + }); + expect(xml).toBe(``); + }); + test('should render a comment element at root element with other elements', () => { + let xml = render( + <> + comment {2} + + , + ).end({ headless: true }); + expect(xml).toBe(``); + }); + }); + + describe('ins', () => { + test('should render an ins element without content', () => { + let xml = render( + + + , + ).end({ headless: true }); + expect(xml).toBe(``); + }); + test('should render an ins element with content', () => { + let xml = render( + + + , + ).end({ headless: true }); + expect(xml).toBe(``); + }); + test('should render an ins element with multiple content', () => { + let xml = render( + + + , + ).end({ headless: true }); + expect(xml).toBe(``); + }); + test('should render an ins element at root element', () => { + let xml = render().end({ + headless: true, + }); + expect(xml).toBe(``); + }); + test('should render an ins element at root element with other elements', () => { + let xml = render( + <> + + + , + ).end({ headless: true }); + expect(xml).toBe(``); + }); + }); + }); + describe('Component', () => { + test('should render a component element', () => { + function Test() { + return ; + } + let xml = render( + + + , + ).end({ headless: true }); + expect(xml).toBe(``); + }); + test('should render a component element with props', () => { + function Test(props: { x: number }) { + return ; + } + let xml = render( + + + , + ).end({ headless: true }); + expect(xml).toBe(``); + }); + test('should render a component element with children', () => { + function Test(props: { x: number }) { + return ( + + + + ); + } + let xml = render( + + + , + ).end({ headless: true }); + expect(xml).toBe(``); + }); + test('should render a component element with children prop', () => { + function Test(props: { x: number; children: any }) { + return {props.children}; + } + let xml = render( + + + + + , + ).end({ headless: true }); + expect(xml).toBe(``); + }); + test('should render a component element with component children', () => { + function Test(props: { x: number; children: any }) { + return {props.children}; + } + function Child() { + return ; + } + let xml = render( + + + + + , + ).end({ headless: true }); + expect(xml).toBe(``); + }); + }); + describe('errors', () => { + test('class components', () => { + class Test extends Component { + render() { + return ; + } + } + expect(() => { + render( + + + , + ); + }).toThrowError('Class components are not supported'); + }); + test('unsupported element', () => { + expect(() => { + render({{ some: 'object' }}); + }).toThrowError('Unsupported element type'); + }); + test('unsupported element type', () => { + const Type = { some: 'object' }; + expect(() => { + // @ts-expect-error + render(); + }).toThrowError('Unsupported element type'); + }); + }); + describe('edge cases', () => { + test('render a tag with key and ref', () => { + let xml = render( + , + ).end({ headless: true }); + expect(xml).toBe( + ``, + ); + }); + }); +}); diff --git a/src/lib/render.ts b/src/lib/render.ts new file mode 100644 index 0000000..efd6b73 --- /dev/null +++ b/src/lib/render.ts @@ -0,0 +1,68 @@ +import { create } from 'xmlbuilder2'; +import type { XMLBuilder } from 'xmlbuilder2/lib/interfaces'; +import { XMLBuilderCreateOptions } from 'xmlbuilder2/lib/interfaces'; +import { isElement } from 'react-is'; +import { reactElementToJsxXmlElement } from './react'; +import { JsxXmlElement } from './types'; +import { isJsxXmlComponentElement, isJsxXmlTagElement } from './jsx'; +import { getCurrentElement, withElement } from './elements-stack'; +import { ReactElement } from 'react'; + +/** + * + * @public + */ +export function render( + element: ReactElement | JsxXmlElement, + options?: XMLBuilderCreateOptions, +) { + let cur = create(options ?? {}); + + withElement(cur, () => renderElement(element)); + + return cur; +} + +function renderElement(element: ReactElement | JsxXmlElement) { + if (isElement(element)) { + renderElement(reactElementToJsxXmlElement(element)); + } else if (isJsxXmlTagElement(element)) { + renderTagElement(element); + } else if (isJsxXmlComponentElement(element)) { + renderComponentElement(element); + } else { + throw new Error('Unsupported element type'); + } +} + +function renderTagElement(element: any) { + let cur = getCurrentElement(); + cur = cur.ele(element.type); + renderAttrs(cur, element.attrs); + if (element.children) { + withElement(cur, () => renderChildren(element.children)); + } +} + +function renderAttrs(cur: XMLBuilder, attrs: any) { + for (let key in attrs) { + cur.att(key, attrs[key]); + } +} + +function renderComponentElement(element: any) { + renderChildren(element.type(element.props)); +} + +function renderChildren(children: any) { + const cur = getCurrentElement(); + if (typeof children === 'string') { + cur.txt(children); + } else if (typeof children === 'number') { + cur.txt(children.toString()); + } else if (Array.isArray(children)) { + children.forEach((child) => renderChildren(child)); + } else if (children) { + renderElement(children); + } +} diff --git a/src/lib/runtime.ts b/src/lib/runtime.ts new file mode 100644 index 0000000..732bc61 --- /dev/null +++ b/src/lib/runtime.ts @@ -0,0 +1,51 @@ +import { createJsxXmlElement } from './jsx'; + +/** + * + * @public + */ +export function createElement(type: any, props: any, ...children: any[]) { + return createJsxXmlElement(type, props, children); +} + +/** + * + * @public + */ +export function JSXXML(type: any, props: any, ...children: any[]) { + return createJsxXmlElement(type, props, children); +} + +/** + * + * @public + */ +export function jsx(type: any, props: any, key: any) { + const { children, ...rest } = props; + return createJsxXmlElement(type, { key, ...rest }, children); +} + +/** + * + * @public + */ +export function jsxs(type: any, props: any, key: any) { + const { children, ...rest } = props; + return createJsxXmlElement(type, { key, ...rest }, children); +} + +/** + * + * @public + */ +export function jsxDEV( + type: any, + props: any, + key: any, + isStaticChildren: any, + source: any, + self: any, +) { + const { children, ...rest } = props; + return createJsxXmlElement(type, { key, ...rest }, children); +} diff --git a/src/lib/types.ts b/src/lib/types.ts new file mode 100644 index 0000000..5b9810a --- /dev/null +++ b/src/lib/types.ts @@ -0,0 +1,30 @@ +export const JsxXML = Symbol('JSXXML'); + +/** + * + * @public + */ +export type JsxXmlElement = JsxXmlComponentElement | JsxXmlTagElement; + +/** + * + * @public + */ +export type JsxXmlTagElement = { + $$typeof: typeof JsxXML; + builtin: false; + type: string; + attrs: any; + children: any; +}; + +/** + * + * @public + */ +export type JsxXmlComponentElement = { + $$typeof: typeof JsxXML; + builtin: false; + type: (props: any) => JsxXmlElement; + props: any; +}; diff --git a/src/react.ts b/src/react.ts deleted file mode 100644 index fbbbe45..0000000 --- a/src/react.ts +++ /dev/null @@ -1,85 +0,0 @@ -import type { ReactElement } from 'react'; -import { isFragment } from 'react-is'; -import type { XMLBuilder } from 'xmlbuilder2/lib/interfaces'; -import { isJsxXmlBuiltinElement } from './lib/builtin'; - -export function renderReactElement(cur: XMLBuilder, element: ReactElement) { - renderTag(cur, element); - return cur; -} - -function renderTag(cur: XMLBuilder, element: ReactElement) { - if (isJsxXmlBuiltinElement(element)) { - renderBuiltinElement(cur, element); - return; - } - if (typeof element?.type === 'string') { - let el = cur.ele(element.type); - const attrs = mergeAttrs( - element.props, - element.key, - // @ts-ignore - element.ref, - ); - renderAttrs(el, attrs); - renderChildren(el, element.props.children); - return; - } - if (typeof element?.type === 'function') { - if (element.type.prototype?.isReactComponent) { - throw new Error('Class components are not supported'); - } - const attrs = mergeAttrs( - element.props, - element.key, - // @ts-ignore - element.ref, - ); - // @ts-ignore - renderTag(cur, element.type(attrs)); - } - if (isFragment(element)) { - renderChildren(cur, element.props.children); - } -} - -function mergeAttrs(attrs: any, key: string | null, ref: string | null) { - return { key, ref, ...attrs }; -} - -function renderAttrs(cur: XMLBuilder, attrs: any) { - for (let key in attrs) { - if (key === 'children') { - continue; - } - cur.att(key, attrs[key]); - } -} - -function renderChildren(cur: XMLBuilder, children: any) { - if (typeof children === 'string') { - cur.txt(children); - } else if (typeof children === 'number') { - cur.txt(children.toString()); - } else if (Array.isArray(children)) { - children.forEach((child) => renderChildren(cur, child)); - } else if (children) { - renderTag(cur, children); - } -} - -export function renderBuiltinElement(cur: XMLBuilder, element: any) { - if (element.type === 'cdata') { - cur.dat(element.props.children); - } - if (element.type === 'comment') { - cur.com(element.props.children); - } - if (element.type === 'ins') { - cur.ins(element.props.target, element.props.content); - } - if (element.type === 'fragment') { - return renderChildren(cur, element.props.children); - } - return cur; -} diff --git a/src/render.test.tsx b/src/render.test.tsx deleted file mode 100644 index 77f0ba9..0000000 --- a/src/render.test.tsx +++ /dev/null @@ -1,369 +0,0 @@ -import React from 'react'; -import { describe, expect, test } from 'vitest'; -import { CData, Comment, Fragment, Ins } from './index'; -import { render } from './render'; - -declare global { - namespace JSX { - interface IntrinsicElements { - test: any; - item: any; - root: any; - 'h:test': any; - 'h:item': any; - 'x:test': any; - 'x:item': any; - } - } -} - -describe('render', () => { - describe('errors', () => { - test('string as element', () => { - expect(() => render('other')).throws(); - }); - test('class component', () => { - class MyComponent extends React.Component { - render() { - return ; - } - } - expect(() => render()).throws( - 'Class components are not supported', - ); - }); - }); - describe('tag', () => { - test('render self-closing tag', () => { - expect(render().end({ headless: true })).toBe(''); - }); - test('render tag', () => { - expect(render(item).end({ headless: true })).toBe( - 'item', - ); - }); - test('render multiple child', () => { - expect(render(item {2}).end({ headless: true })).toBe( - 'item 2', - ); - }); - test('render nested tags', () => { - expect( - render( - - - , - ).end({ headless: true }), - ).toBe(''); - }); - test('render nested tags with text', () => { - expect( - render( - - text - , - ).end({ headless: true }), - ).toBe('text'); - }); - test('render nested tags mixed with text', () => { - expect( - render( - - the 2. - , - ).end({ headless: true }), - ).toBe('the 2.'); - }); - test('render with children array', () => { - expect( - render({['item', ]}).end({ headless: true }), - ).toBe('item'); - }); - test('render with nested children array', () => { - expect( - render({['item', , ['nested', ]]}).end({ - headless: true, - }), - ).toBe('itemnested'); - }); - }); - describe('render attrs', () => { - test('render with attr', () => { - expect(render().end({ headless: true })).toBe( - '', - ); - }); - - test('render with attr number', () => { - expect(render().end({ headless: true })).toBe( - '', - ); - }); - - test('render with children', () => { - expect(render(item).end({ headless: true })).toBe( - 'item', - ); - }); - - test('render with multiple attr', () => { - expect(render().end({ headless: true })).toBe( - '', - ); - expect(render().end({ headless: true })).toBe( - '', - ); - }); - - test('render with key', () => { - expect(render().end({ headless: true })).toBe( - '', - ); - }); - test('render with ref', () => { - expect(render().end({ headless: true })).toBe( - '', - ); - }); - test.skip('render with key and attr', () => { - expect( - render().end({ headless: true }), - ).toBe(''); - expect( - render().end({ headless: true }), - ).toBe(''); - }); - test('render with attr in children', () => { - expect( - render( - - - , - ).end({ headless: true }), - ).toBe(''); - }); - }); - describe('component', () => { - test('render component', () => { - const Test = ({ id }: { id: string }) => ; - expect(render().end({ headless: true })).toBe( - '', - ); - }); - - test('render component with children', () => { - const Test = ({ id }: { id: string }) => item; - expect(render().end({ headless: true })).toBe( - 'item', - ); - }); - test('render component with children array', () => { - const Test = ({ id }: { id: string }) => ( - {['item', 'item2']} - ); - expect(render().end({ headless: true })).toBe( - 'itemitem2', - ); - }); - - test('render component with nested tags', () => { - const Item = () => ; - const Test = ({ id }: { id: string }) => ( - - - - ); - expect(render().end({ headless: true })).toBe( - '', - ); - }); - test('render component with nested component', () => { - const Item = () => ; - const Test = ({ id }: { id: string }) => ( - - - - ); - const Outer = () => ; - expect(render().end({ headless: true })).toBe( - '', - ); - }); - }); - describe('fragment', () => { - test('render fragment', () => { - expect( - render( - <> - - , - ).end({ headless: true }), - ).toBe(''); - }); - test('render fragment with children', () => { - expect( - render( - - <> - test - - - , - ).end({ headless: true }), - ).toBe('test'); - }); - }); - describe('namespace', () => { - test('render with namespace', () => { - expect( - render( - - - - - - - - , - ).end({ headless: true }), - ).toBe( - '', - ); - }); - test('render attr whith namespace', () => { - expect( - render( - - - - - , - ).end({ headless: true }), - ).toBe( - '', - ); - }); - }); - describe('builtin fragment', () => { - test('empty', () => { - expect( - render( - - - , - ).end({ headless: true }), - ).toBe(''); - }); - test('one child', () => { - expect( - render( - - - - - , - ).end({ headless: true }), - ).toBe(''); - }); - test('multiple children', () => { - expect( - render( - - - test - - - , - ).end({ headless: true }), - ).toBe('test'); - }); - test('at root', () => { - expect( - render( - - - - test - - - , - ).end({ headless: true }), - ).toBe('test'); - }); - }); - describe('builtin', () => { - test('render cdata', () => { - const data = 'item'; - expect( - render( - - {data} - , - ).end({ headless: true }), - ).toBe('item]]>'); - }); - test('render cdata multiple children', () => { - const data = 'item'; - expect( - render( - - data is: {data} - , - ).end({ headless: true }), - ).toBe('item]]>'); - }); - test('render comment', () => { - const data = 'comment'; - expect( - render( - - {data} - , - ).end({ headless: true }), - ).toBe(''); - }); - test('render comment multiple children', () => { - const data = 'the comment'; - expect( - render( - - comment is: {data} - , - ).end({ headless: true }), - ).toBe(''); - }); - test('render ins', () => { - expect( - render( - - - - text - , - ).end({ headless: true }), - ).toBe('text'); - }); - }); - describe('customize', () => { - test('default', () => { - expect(render().end()).toBe(''); - }); - test('doctype', () => { - expect( - render() - .dtd() - .end(), - ).toBe(''); - }); - test('declaration', () => { - expect( - render() - .dec({ standalone: true }) - .end(), - ).toBe(''); - }); - }); -}); diff --git a/src/render.ts b/src/render.ts deleted file mode 100644 index 1cae092..0000000 --- a/src/render.ts +++ /dev/null @@ -1,16 +0,0 @@ -import type { ReactElement } from 'react'; -import { create } from 'xmlbuilder2'; -import { isElement } from 'react-is'; - -import type { XMLBuilderCreateOptions } from 'xmlbuilder2/lib/interfaces'; -import { renderReactElement } from './react'; -export type { XMLBuilderCreateOptions, ReactElement }; - -export function render(element: any, options?: XMLBuilderCreateOptions) { - let cur = create(options ?? {}); - - if (isElement(element)) { - return renderReactElement(cur, element); - } - throw new Error('Not implemented'); -} diff --git a/vite.config.ts b/vite.config.ts index 4e91477..e960b8f 100644 --- a/vite.config.ts +++ b/vite.config.ts @@ -13,14 +13,20 @@ const external = [ export default defineConfig({ plugins: [dts({ outDir: resolve(__dirname, './.cache/dts') })], test: { + include: ['src/**/*.test.ts', 'src/**/*.test.tsx'], coverage: { reporter: ['clover', 'json', 'lcov', 'text'], provider: 'istanbul', + include: ['src'], }, }, build: { lib: { - entry: [resolve(__dirname, 'src/index.ts')], + entry: [ + resolve(__dirname, 'src/index.ts'), + resolve(__dirname, 'src/jsx-runtime.ts'), + resolve(__dirname, 'src/jsx-dev-runtime.ts'), + ], formats: ['es', 'cjs'], }, rollupOptions: {