diff --git a/examples/hono-tractor-store-2.0/.eslintignore b/examples/hono-tractor-store-2.0/.eslintignore new file mode 100644 index 0000000..9564c30 --- /dev/null +++ b/examples/hono-tractor-store-2.0/.eslintignore @@ -0,0 +1,6 @@ +src/explore/database/index.js +src/decide/database/index.js +src/checkout/database/index.js +public/explore/ +public/decide/ +public/checkout/ \ No newline at end of file diff --git a/examples/hono-tractor-store-2.0/.eslintrc.json b/examples/hono-tractor-store-2.0/.eslintrc.json new file mode 100644 index 0000000..7bef58e --- /dev/null +++ b/examples/hono-tractor-store-2.0/.eslintrc.json @@ -0,0 +1,15 @@ +{ + "env": { + "es2021": true, + "node": true, + "browser": true + }, + "extends": ["eslint:recommended", "plugin:prettier/recommended", "plugin:jsdoc/recommended"], + "parserOptions": { + "ecmaVersion": 14, + "sourceType": "module" + }, + "rules": { + "jsdoc/no-undefined-types": "off" + } +} \ No newline at end of file diff --git a/examples/hono-tractor-store-2.0/.gitignore b/examples/hono-tractor-store-2.0/.gitignore new file mode 100644 index 0000000..0b97bb3 --- /dev/null +++ b/examples/hono-tractor-store-2.0/.gitignore @@ -0,0 +1,4 @@ +node_modules/ +public/checkout/ +public/decide/ +public/explore/ diff --git a/examples/hono-tractor-store-2.0/.prettierrc b/examples/hono-tractor-store-2.0/.prettierrc new file mode 100644 index 0000000..0967ef4 --- /dev/null +++ b/examples/hono-tractor-store-2.0/.prettierrc @@ -0,0 +1 @@ +{} diff --git a/examples/hono-tractor-store-2.0/README.md b/examples/hono-tractor-store-2.0/README.md new file mode 100644 index 0000000..593282e --- /dev/null +++ b/examples/hono-tractor-store-2.0/README.md @@ -0,0 +1,93 @@ +# The Tractor Store - Blueprint + +## What is The Tractor Store? + +The Tractor Store is a template to experiment with micro frontend architecture. +Goal is to create a real world application where developers can experiment with different integration techniques. + +The idea is similar to [TodoMVC](http://todomvc.com/) or [Movies](https://tastejs.com/movies/), but with a focus on micro frontends. + +## About this project + +- Three systems: Explore, Decide, Buy along the customer journey (buying process) +- Store that sells tractors +- E-commerce platform (homepage, catalog, product details, cart, checkout, thank you page) +- Special features: Add to cart animation, recommendations, store picker, thank you confetti +- Focus on frontend aspects. Backend and database are mocked with static data. +- Styling is provided in the blueprint. It's not the focus of this project. +- Static assets (images, fonts, helpers, ...) are provided. They can be copied or linked to directly (CDN). + +## Design principals + +- Each system can be developed and deployed independently by different teams +- The freedom to change a systems technology stack without affecting the others must be guaranteed +- Self-contained systems: Each system has its own database, backend and frontend +- Loose coupling: Systems should be able to function independently of each other as best as possible +- Provide a way to run the entire application locally for development and testing + +## Implementation choices + +- All described features must be implemented (user stories). End-to-end tests are provided to verify the implementation. +- The concrete implementation is up to you (frontend framework, style handling, etc.) +- Communication between systems can be achieved with different techniques (client, server, shared state, events, event-bus, etc.) +- Server- and/or client-rendering is possible +- An application shell is not required, but can be implemented if desired +- Deployment can be done with different techniques (container, serverless, static, etc.) +- Optional feature: extract shared UI components into a pattern library (button, ...) + +## Goal of the project + +There is no one-size-fits-all solution for micro frontends. +The goal of this project is to provide a central place, where different micro frontend integration techniques can be compared and evaluated. + +- Make pros and cons of different tech-stacks and integration techniques visible and discussable + - Organizational scalability (more teams, more systems) + - Technical scalability (more users, more features) + - Performance characteristics (Core-Web-Vitals, ...) + - Development experience +- Share knowledge and learnings with the community +- Provide a blueprint for others to experiment with a specific micro frontends tech stack + +## Implementation gallery + +- Fork the blueprint or any other implementation +- Submit a an issue with a link to your implementation (github repo) +- Describe you tech stack and integration techniques using the issue template +- Extra points if you provide a hosted version of your implementation + +## Anatomy of the project + +### Boundaries 📄 + +- 🔴 Explore + - 📄 Home + - 📄 Category + - 📄 Stores + - 🧩 Header (🔴🟢🟡 every page, except checkout) + - 🧩 Footer (🔴🟢🟡 every page) + - 🧩 Recommendations (🔴 home, 🟢 product, 🟡 cart) + - 🧩 Store Picker (🟡 checkout) +- 🟢 Decide + - 📄 Product detail +- 🟡 Buy + - 📄 Cart + - 📄 Checkout + - 📄 Thank you + - 🧩 Mini Cart (🔴 header) + - 🧩 Add To Cart Button (🟢 product details) + +### Concepts 🧠 + +- Inter-team navigation (server- and/or client-side) +- Communication parent-child (variant change > recommendations, add to cart) +- Communication sibling (add to cart > mini cart) +- Communication child-parent (in store pickup > explore ) +- Potential client-side interactions (variant change, remove from cart, form validation) +- Nested integration (page > header > mini cart) +- [Bonus] Shared UI components / pattern library (button) + +### Infrastructure 🏗️ + +- Deployment +- Integration service +- Ende-zu-Ende-Tests (planned) diff --git a/examples/hono-tractor-store-2.0/esbuild.js b/examples/hono-tractor-store-2.0/esbuild.js new file mode 100644 index 0000000..aedf93b --- /dev/null +++ b/examples/hono-tractor-store-2.0/esbuild.js @@ -0,0 +1,35 @@ +import esbuild from "esbuild"; + +const isWatchMode = process.argv.includes("--watch"); + +const teams = ["explore", "decide", "checkout"]; +const buildOptions = []; + +teams.forEach((team) => { + buildOptions.push( + { + entryPoints: [`src/${team}/scripts.js`], + outfile: `public/${team}/static/scripts.js`, + }, + { + entryPoints: [`src/${team}/styles.css`], + external: ["*.woff2"], + outfile: `public/${team}/static/styles.css`, + }, + ); +}); + +buildOptions.forEach(async (options) => { + let opts = { + bundle: true, + minify: true, + logLevel: "info", + ...options, + }; + if (isWatchMode) { + let ctx = await esbuild.context(opts); + ctx.watch(); + } else { + esbuild.build(opts).catch(() => process.exit(1)); + } +}); diff --git a/examples/hono-tractor-store-2.0/package-lock.json b/examples/hono-tractor-store-2.0/package-lock.json new file mode 100644 index 0000000..e3743a6 --- /dev/null +++ b/examples/hono-tractor-store-2.0/package-lock.json @@ -0,0 +1,2898 @@ +{ + "name": "tractor-store-blueprint", + "version": "1.0.0", + "lockfileVersion": 3, + "requires": true, + "packages": { + "": { + "name": "tractor-store-blueprint", + "version": "1.0.0", + "license": "MIT", + "dependencies": { + "@hono/node-server": "^1.8.2", + "eslint-plugin-jsdoc": "^48.2.1", + "hono": "^4.1.0" + }, + "devDependencies": { + "esbuild": "^0.20.1", + "eslint": "^8.56.0", + "eslint-config-prettier": "^9.1.0", + "eslint-plugin-prettier": "^5.1.3", + "prettier": "^3.2.5", + "wrangler": "^3.34.0" + } + }, + "node_modules/@aashutoshrathi/word-wrap": { + "version": "1.2.6", + "resolved": "https://registry.npmjs.org/@aashutoshrathi/word-wrap/-/word-wrap-1.2.6.tgz", + "integrity": "sha512-1Yjs2SvM8TflER/OD3cOjhWWOZb58A2t7wpE2S9XfBYTiIl+XFhQG2bjy4Pu1I+EAlCNUzRDYDdFwFYUKvXcIA==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/@cloudflare/kv-asset-handler": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/@cloudflare/kv-asset-handler/-/kv-asset-handler-0.3.1.tgz", + "integrity": "sha512-lKN2XCfKCmpKb86a1tl4GIwsJYDy9TGuwjhDELLmpKygQhw8X2xR4dusgpC5Tg7q1pB96Eb0rBo81kxSILQMwA==", + "dev": true, + "dependencies": { + "mime": "^3.0.0" + } + }, + "node_modules/@cloudflare/workerd-darwin-64": { + "version": "1.20240314.0", + "resolved": "https://registry.npmjs.org/@cloudflare/workerd-darwin-64/-/workerd-darwin-64-1.20240314.0.tgz", + "integrity": "sha512-19xW64AmkjGnp9ZSwa5RPMTBJ0eqadY/oLs3RcdC8J+R8vT766U2bgxyuf3VATlOf+T7t28aGYzW/QcBRls9eg==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=16" + } + }, + "node_modules/@cloudflare/workerd-darwin-arm64": { + "version": "1.20240314.0", + "resolved": "https://registry.npmjs.org/@cloudflare/workerd-darwin-arm64/-/workerd-darwin-arm64-1.20240314.0.tgz", + "integrity": "sha512-gq78D30GlNSg55YRzCzNHPuLp87L7xmYCYa5hIuIE7xpqhqGN6FV/mRtp2TQ5VoDXiuq1F+VdEZDwQFvrNAvtg==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=16" + } + }, + "node_modules/@cloudflare/workerd-linux-64": { + "version": "1.20240314.0", + "resolved": "https://registry.npmjs.org/@cloudflare/workerd-linux-64/-/workerd-linux-64-1.20240314.0.tgz", + "integrity": "sha512-1PYddg+lGGOUkXNt3LEHB0GvIBWjilTNwmbacGyyVRm+zaWGKqt2bS3bW/TY6cHJ1lxFe/fDMrQOgnSBB7jGIw==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=16" + } + }, + "node_modules/@cloudflare/workerd-linux-arm64": { + "version": "1.20240314.0", + "resolved": "https://registry.npmjs.org/@cloudflare/workerd-linux-arm64/-/workerd-linux-arm64-1.20240314.0.tgz", + "integrity": "sha512-GIyyO+TKYQ7TsM/DgpoHP2uQrJuPEc/cpRaXYeOzHerGAdQRej6iS2+LAnTJgLTXgOC4DE622mKBL3tnZvuKVQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=16" + } + }, + "node_modules/@cloudflare/workerd-windows-64": { + "version": "1.20240314.0", + "resolved": "https://registry.npmjs.org/@cloudflare/workerd-windows-64/-/workerd-windows-64-1.20240314.0.tgz", + "integrity": "sha512-NWZeVXEXJfPuLAXfMTiFusJNOMnsHkBae0C4hlqzwIzYiQ0PYnQ+BEWFS5eWy5dZihhFrsW3VRYqnTbgESIkzw==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=16" + } + }, + "node_modules/@cspotcode/source-map-support": { + "version": "0.8.1", + "resolved": "https://registry.npmjs.org/@cspotcode/source-map-support/-/source-map-support-0.8.1.tgz", + "integrity": "sha512-IchNf6dN4tHoMFIn/7OE8LWZ19Y6q/67Bmf6vnGREv8RSbBVb9LPJxEcnwrcwX6ixSvaiGoomAUvu4YSxXrVgw==", + "dev": true, + "dependencies": { + "@jridgewell/trace-mapping": "0.3.9" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/@es-joy/jsdoccomment": { + "version": "0.42.0", + "resolved": "https://registry.npmjs.org/@es-joy/jsdoccomment/-/jsdoccomment-0.42.0.tgz", + "integrity": "sha512-R1w57YlVA6+YE01wch3GPYn6bCsrOV3YW/5oGGE2tmX6JcL9Nr+b5IikrjMPF+v9CV3ay+obImEdsDhovhJrzw==", + "dependencies": { + "comment-parser": "1.4.1", + "esquery": "^1.5.0", + "jsdoc-type-pratt-parser": "~4.0.0" + }, + "engines": { + "node": ">=16" + } + }, + "node_modules/@esbuild-plugins/node-globals-polyfill": { + "version": "0.2.3", + "resolved": "https://registry.npmjs.org/@esbuild-plugins/node-globals-polyfill/-/node-globals-polyfill-0.2.3.tgz", + "integrity": "sha512-r3MIryXDeXDOZh7ih1l/yE9ZLORCd5e8vWg02azWRGj5SPTuoh69A2AIyn0Z31V/kHBfZ4HgWJ+OK3GTTwLmnw==", + "dev": true, + "peerDependencies": { + "esbuild": "*" + } + }, + "node_modules/@esbuild-plugins/node-modules-polyfill": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/@esbuild-plugins/node-modules-polyfill/-/node-modules-polyfill-0.2.2.tgz", + "integrity": "sha512-LXV7QsWJxRuMYvKbiznh+U1ilIop3g2TeKRzUxOG5X3YITc8JyyTa90BmLwqqv0YnX4v32CSlG+vsziZp9dMvA==", + "dev": true, + "dependencies": { + "escape-string-regexp": "^4.0.0", + "rollup-plugin-node-polyfills": "^0.2.1" + }, + "peerDependencies": { + "esbuild": "*" + } + }, + "node_modules/@esbuild/aix-ppc64": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.20.2.tgz", + "integrity": "sha512-D+EBOJHXdNZcLJRBkhENNG8Wji2kgc9AZ9KiPr1JuZjsNtyHzrsfLRrY0tk2H2aoFu6RANO1y1iPPUCDYWkb5g==", + "cpu": [ + "ppc64" + ], + "dev": true, + "optional": true, + "os": [ + "aix" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/android-arm": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.20.2.tgz", + "integrity": "sha512-t98Ra6pw2VaDhqNWO2Oph2LXbz/EJcnLmKLGBJwEwXX/JAN83Fym1rU8l0JUWK6HkIbWONCSSatf4sf2NBRx/w==", + "cpu": [ + "arm" + ], + "dev": true, + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/android-arm64": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.20.2.tgz", + "integrity": "sha512-mRzjLacRtl/tWU0SvD8lUEwb61yP9cqQo6noDZP/O8VkwafSYwZ4yWy24kan8jE/IMERpYncRt2dw438LP3Xmg==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/android-x64": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.20.2.tgz", + "integrity": "sha512-btzExgV+/lMGDDa194CcUQm53ncxzeBrWJcncOBxuC6ndBkKxnHdFJn86mCIgTELsooUmwUm9FkhSp5HYu00Rg==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/darwin-arm64": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.20.2.tgz", + "integrity": "sha512-4J6IRT+10J3aJH3l1yzEg9y3wkTDgDk7TSDFX+wKFiWjqWp/iCfLIYzGyasx9l0SAFPT1HwSCR+0w/h1ES/MjA==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/darwin-x64": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.20.2.tgz", + "integrity": "sha512-tBcXp9KNphnNH0dfhv8KYkZhjc+H3XBkF5DKtswJblV7KlT9EI2+jeA8DgBjp908WEuYll6pF+UStUCfEpdysA==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/freebsd-arm64": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.20.2.tgz", + "integrity": "sha512-d3qI41G4SuLiCGCFGUrKsSeTXyWG6yem1KcGZVS+3FYlYhtNoNgYrWcvkOoaqMhwXSMrZRl69ArHsGJ9mYdbbw==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/freebsd-x64": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.20.2.tgz", + "integrity": "sha512-d+DipyvHRuqEeM5zDivKV1KuXn9WeRX6vqSqIDgwIfPQtwMP4jaDsQsDncjTDDsExT4lR/91OLjRo8bmC1e+Cw==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-arm": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.20.2.tgz", + "integrity": "sha512-VhLPeR8HTMPccbuWWcEUD1Az68TqaTYyj6nfE4QByZIQEQVWBB8vup8PpR7y1QHL3CpcF6xd5WVBU/+SBEvGTg==", + "cpu": [ + "arm" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-arm64": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.20.2.tgz", + "integrity": "sha512-9pb6rBjGvTFNira2FLIWqDk/uaf42sSyLE8j1rnUpuzsODBq7FvpwHYZxQ/It/8b+QOS1RYfqgGFNLRI+qlq2A==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-ia32": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.20.2.tgz", + "integrity": "sha512-o10utieEkNPFDZFQm9CoP7Tvb33UutoJqg3qKf1PWVeeJhJw0Q347PxMvBgVVFgouYLGIhFYG0UGdBumROyiig==", + "cpu": [ + "ia32" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-loong64": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.20.2.tgz", + "integrity": "sha512-PR7sp6R/UC4CFVomVINKJ80pMFlfDfMQMYynX7t1tNTeivQ6XdX5r2XovMmha/VjR1YN/HgHWsVcTRIMkymrgQ==", + "cpu": [ + "loong64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-mips64el": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.20.2.tgz", + "integrity": "sha512-4BlTqeutE/KnOiTG5Y6Sb/Hw6hsBOZapOVF6njAESHInhlQAghVVZL1ZpIctBOoTFbQyGW+LsVYZ8lSSB3wkjA==", + "cpu": [ + "mips64el" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-ppc64": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.20.2.tgz", + "integrity": "sha512-rD3KsaDprDcfajSKdn25ooz5J5/fWBylaaXkuotBDGnMnDP1Uv5DLAN/45qfnf3JDYyJv/ytGHQaziHUdyzaAg==", + "cpu": [ + "ppc64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-riscv64": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.20.2.tgz", + "integrity": "sha512-snwmBKacKmwTMmhLlz/3aH1Q9T8v45bKYGE3j26TsaOVtjIag4wLfWSiZykXzXuE1kbCE+zJRmwp+ZbIHinnVg==", + "cpu": [ + "riscv64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-s390x": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.20.2.tgz", + "integrity": "sha512-wcWISOobRWNm3cezm5HOZcYz1sKoHLd8VL1dl309DiixxVFoFe/o8HnwuIwn6sXre88Nwj+VwZUvJf4AFxkyrQ==", + "cpu": [ + "s390x" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-x64": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.20.2.tgz", + "integrity": "sha512-1MdwI6OOTsfQfek8sLwgyjOXAu+wKhLEoaOLTjbijk6E2WONYpH9ZU2mNtR+lZ2B4uwr+usqGuVfFT9tMtGvGw==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/netbsd-x64": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.20.2.tgz", + "integrity": "sha512-K8/DhBxcVQkzYc43yJXDSyjlFeHQJBiowJ0uVL6Tor3jGQfSGHNNJcWxNbOI8v5k82prYqzPuwkzHt3J1T1iZQ==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "netbsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/openbsd-x64": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.20.2.tgz", + "integrity": "sha512-eMpKlV0SThJmmJgiVyN9jTPJ2VBPquf6Kt/nAoo6DgHAoN57K15ZghiHaMvqjCye/uU4X5u3YSMgVBI1h3vKrQ==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "openbsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/sunos-x64": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.20.2.tgz", + "integrity": "sha512-2UyFtRC6cXLyejf/YEld4Hajo7UHILetzE1vsRcGL3earZEW77JxrFjH4Ez2qaTiEfMgAXxfAZCm1fvM/G/o8w==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "sunos" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/win32-arm64": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.20.2.tgz", + "integrity": "sha512-GRibxoawM9ZCnDxnP3usoUDO9vUkpAxIIZ6GQI+IlVmr5kP3zUq+l17xELTHMWTWzjxa2guPNyrpq1GWmPvcGQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/win32-ia32": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.20.2.tgz", + "integrity": "sha512-HfLOfn9YWmkSKRQqovpnITazdtquEW8/SoHW7pWpuEeguaZI4QnCRW6b+oZTztdBnZOS2hqJ6im/D5cPzBTTlQ==", + "cpu": [ + "ia32" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/win32-x64": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.20.2.tgz", + "integrity": "sha512-N49X4lJX27+l9jbLKSqZ6bKNjzQvHaT8IIFUy+YIqmXQdjYCToGWwOItDrfby14c78aDd5NHQl29xingXfCdLQ==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@eslint-community/eslint-utils": { + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.4.0.tgz", + "integrity": "sha512-1/sA4dwrzBAyeUoQ6oxahHKmrZvsnLCg4RfxW3ZFGGmQkSNQPFNLV9CUEFQP1x9EYXHTo5p6xdhZM1Ne9p/AfA==", + "dependencies": { + "eslint-visitor-keys": "^3.3.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "peerDependencies": { + "eslint": "^6.0.0 || ^7.0.0 || >=8.0.0" + } + }, + "node_modules/@eslint-community/regexpp": { + "version": "4.10.0", + "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.10.0.tgz", + "integrity": "sha512-Cu96Sd2By9mCNTx2iyKOmq10v22jUVQv0lQnlGNy16oE9589yE+QADPbrMGCkA51cKZSg3Pu/aTJVTGfL/qjUA==", + "engines": { + "node": "^12.0.0 || ^14.0.0 || >=16.0.0" + } + }, + "node_modules/@eslint/eslintrc": { + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-2.1.4.tgz", + "integrity": "sha512-269Z39MS6wVJtsoUl10L60WdkhJVdPG24Q4eZTH3nnF6lpvSShEK3wQjDX9JRWAUPvPh7COouPpU9IrqaZFvtQ==", + "dependencies": { + "ajv": "^6.12.4", + "debug": "^4.3.2", + "espree": "^9.6.0", + "globals": "^13.19.0", + "ignore": "^5.2.0", + "import-fresh": "^3.2.1", + "js-yaml": "^4.1.0", + "minimatch": "^3.1.2", + "strip-json-comments": "^3.1.1" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/@eslint/js": { + "version": "8.57.0", + "resolved": "https://registry.npmjs.org/@eslint/js/-/js-8.57.0.tgz", + "integrity": "sha512-Ys+3g2TaW7gADOJzPt83SJtCDhMjndcDMFVQ/Tj9iA1BfJzFKD9mAUXT3OenpuPHbI6P/myECxRJrofUsDx/5g==", + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + } + }, + "node_modules/@fastify/busboy": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/@fastify/busboy/-/busboy-2.1.1.tgz", + "integrity": "sha512-vBZP4NlzfOlerQTnba4aqZoMhE/a9HY7HRqoOPaETQcSQuWEIyZMHGfVu6w9wGtGK5fED5qRs2DteVCjOH60sA==", + "dev": true, + "engines": { + "node": ">=14" + } + }, + "node_modules/@hono/node-server": { + "version": "1.8.2", + "resolved": "https://registry.npmjs.org/@hono/node-server/-/node-server-1.8.2.tgz", + "integrity": "sha512-h8l2TBLCPHZBUrrkosZ6L5CpBLj6zdESyF4B+zngiCDF7aZFQJ0alVbLx7jn8PCVi9EyoFf8a4hOZFi1tD95EA==", + "engines": { + "node": ">=18.14.1" + } + }, + "node_modules/@humanwhocodes/config-array": { + "version": "0.11.14", + "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.11.14.tgz", + "integrity": "sha512-3T8LkOmg45BV5FICb15QQMsyUSWrQ8AygVfC7ZG32zOalnqrilm018ZVCw0eapXux8FtA33q8PSRSstjee3jSg==", + "dependencies": { + "@humanwhocodes/object-schema": "^2.0.2", + "debug": "^4.3.1", + "minimatch": "^3.0.5" + }, + "engines": { + "node": ">=10.10.0" + } + }, + "node_modules/@humanwhocodes/module-importer": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz", + "integrity": "sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==", + "engines": { + "node": ">=12.22" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/nzakas" + } + }, + "node_modules/@humanwhocodes/object-schema": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-2.0.2.tgz", + "integrity": "sha512-6EwiSjwWYP7pTckG6I5eyFANjPhmPjUX9JRLUSfNPC7FX7zK9gyZAfUEaECL6ALTpGX5AjnBq3C9XmVWPitNpw==" + }, + "node_modules/@jridgewell/resolve-uri": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz", + "integrity": "sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==", + "dev": true, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/sourcemap-codec": { + "version": "1.4.15", + "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.15.tgz", + "integrity": "sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg==", + "dev": true + }, + "node_modules/@jridgewell/trace-mapping": { + "version": "0.3.9", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.9.tgz", + "integrity": "sha512-3Belt6tdc8bPgAtbcmdtNJlirVoTmEb5e2gC94PnkwEW9jI6CAHUeoG85tjWP5WquqfavoMtMwiG4P926ZKKuQ==", + "dev": true, + "dependencies": { + "@jridgewell/resolve-uri": "^3.0.3", + "@jridgewell/sourcemap-codec": "^1.4.10" + } + }, + "node_modules/@nodelib/fs.scandir": { + "version": "2.1.5", + "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", + "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==", + "dependencies": { + "@nodelib/fs.stat": "2.0.5", + "run-parallel": "^1.1.9" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/@nodelib/fs.stat": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz", + "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==", + "engines": { + "node": ">= 8" + } + }, + "node_modules/@nodelib/fs.walk": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz", + "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==", + "dependencies": { + "@nodelib/fs.scandir": "2.1.5", + "fastq": "^1.6.0" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/@pkgr/core": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/@pkgr/core/-/core-0.1.1.tgz", + "integrity": "sha512-cq8o4cWH0ibXh9VGi5P20Tu9XF/0fFXl9EUinr9QfTM7a7p0oTA4iJRCQWppXR1Pg8dSM0UCItCkPwsk9qWWYA==", + "dev": true, + "engines": { + "node": "^12.20.0 || ^14.18.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/unts" + } + }, + "node_modules/@types/node": { + "version": "20.11.30", + "resolved": "https://registry.npmjs.org/@types/node/-/node-20.11.30.tgz", + "integrity": "sha512-dHM6ZxwlmuZaRmUPfv1p+KrdD1Dci04FbdEm/9wEMouFqxYoFl5aMkt0VMAUtYRQDyYvD41WJLukhq/ha3YuTw==", + "dev": true, + "dependencies": { + "undici-types": "~5.26.4" + } + }, + "node_modules/@types/node-forge": { + "version": "1.3.11", + "resolved": "https://registry.npmjs.org/@types/node-forge/-/node-forge-1.3.11.tgz", + "integrity": "sha512-FQx220y22OKNTqaByeBGqHWYz4cl94tpcxeFdvBo3wjG6XPBuZ0BNgNZRV5J5TFmmcsJ4IzsLkmGRiQbnYsBEQ==", + "dev": true, + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@ungap/structured-clone": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/@ungap/structured-clone/-/structured-clone-1.2.0.tgz", + "integrity": "sha512-zuVdFrMJiuCDQUMCzQaD6KL28MjnqqN8XnAqiEq9PNm/hCPTSGfrXCOfwj1ow4LFb/tNymJPwsNbVePc1xFqrQ==" + }, + "node_modules/acorn": { + "version": "8.11.3", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.11.3.tgz", + "integrity": "sha512-Y9rRfJG5jcKOE0CLisYbojUjIrIEE7AGMzA/Sm4BslANhbS+cDMpgBdcPT91oJ7OuJ9hYJBx59RjbhxVnrF8Xg==", + "bin": { + "acorn": "bin/acorn" + }, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/acorn-jsx": { + "version": "5.3.2", + "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz", + "integrity": "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==", + "peerDependencies": { + "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0" + } + }, + "node_modules/acorn-walk": { + "version": "8.3.2", + "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-8.3.2.tgz", + "integrity": "sha512-cjkyv4OtNCIeqhHrfS81QWXoCBPExR/J62oyEqepVw8WaQeSqpW2uhuLPh1m9eWhDuOo/jUXVTlifvesOWp/4A==", + "dev": true, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/ajv": { + "version": "6.12.6", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", + "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", + "dependencies": { + "fast-deep-equal": "^3.1.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "engines": { + "node": ">=8" + } + }, + "node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/anymatch": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz", + "integrity": "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==", + "dev": true, + "dependencies": { + "normalize-path": "^3.0.0", + "picomatch": "^2.0.4" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/are-docs-informative": { + "version": "0.0.2", + "resolved": "https://registry.npmjs.org/are-docs-informative/-/are-docs-informative-0.0.2.tgz", + "integrity": "sha512-ixiS0nLNNG5jNQzgZJNoUpBKdo9yTYZMGJ+QgT2jmjR7G7+QHRCc4v6LQ3NgE7EBJq+o0ams3waJwkrlBom8Ig==", + "engines": { + "node": ">=14" + } + }, + "node_modules/argparse": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", + "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==" + }, + "node_modules/as-table": { + "version": "1.0.55", + "resolved": "https://registry.npmjs.org/as-table/-/as-table-1.0.55.tgz", + "integrity": "sha512-xvsWESUJn0JN421Xb9MQw6AsMHRCUknCe0Wjlxvjud80mU4E6hQf1A6NzQKcYNmYw62MfzEtXc+badstZP3JpQ==", + "dev": true, + "dependencies": { + "printable-characters": "^1.0.42" + } + }, + "node_modules/balanced-match": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==" + }, + "node_modules/binary-extensions": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.3.0.tgz", + "integrity": "sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw==", + "dev": true, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/blake3-wasm": { + "version": "2.1.5", + "resolved": "https://registry.npmjs.org/blake3-wasm/-/blake3-wasm-2.1.5.tgz", + "integrity": "sha512-F1+K8EbfOZE49dtoPtmxUQrpXaBIl3ICvasLh+nJta0xkz+9kF/7uet9fLnwKqhDrmj6g+6K3Tw9yQPUg2ka5g==", + "dev": true + }, + "node_modules/brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/braces": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", + "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", + "dev": true, + "dependencies": { + "fill-range": "^7.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/builtin-modules": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/builtin-modules/-/builtin-modules-3.3.0.tgz", + "integrity": "sha512-zhaCDicdLuWN5UbN5IMnFqNMhNfo919sH85y2/ea+5Yg9TsTkeZxpL+JLbp6cgYFS4sRLp3YV4S6yDuqVWHYOw==", + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/callsites": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", + "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", + "engines": { + "node": ">=6" + } + }, + "node_modules/capnp-ts": { + "version": "0.7.0", + "resolved": "https://registry.npmjs.org/capnp-ts/-/capnp-ts-0.7.0.tgz", + "integrity": "sha512-XKxXAC3HVPv7r674zP0VC3RTXz+/JKhfyw94ljvF80yynK6VkTnqE3jMuN8b3dUVmmc43TjyxjW4KTsmB3c86g==", + "dev": true, + "dependencies": { + "debug": "^4.3.1", + "tslib": "^2.2.0" + } + }, + "node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/chokidar": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.6.0.tgz", + "integrity": "sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw==", + "dev": true, + "dependencies": { + "anymatch": "~3.1.2", + "braces": "~3.0.2", + "glob-parent": "~5.1.2", + "is-binary-path": "~2.1.0", + "is-glob": "~4.0.1", + "normalize-path": "~3.0.0", + "readdirp": "~3.6.0" + }, + "engines": { + "node": ">= 8.10.0" + }, + "funding": { + "url": "https://paulmillr.com/funding/" + }, + "optionalDependencies": { + "fsevents": "~2.3.2" + } + }, + "node_modules/chokidar/node_modules/glob-parent": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", + "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", + "dev": true, + "dependencies": { + "is-glob": "^4.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" + }, + "node_modules/comment-parser": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/comment-parser/-/comment-parser-1.4.1.tgz", + "integrity": "sha512-buhp5kePrmda3vhc5B9t7pUQXAb2Tnd0qgpkIhPhkHXxJpiPJ11H0ZEU0oBpJ2QztSbzG/ZxMj/CHsYJqRHmyg==", + "engines": { + "node": ">= 12.0.0" + } + }, + "node_modules/concat-map": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==" + }, + "node_modules/cookie": { + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.5.0.tgz", + "integrity": "sha512-YZ3GUyn/o8gfKJlnlX7g7xq4gyO6OSuhGPKaaGssGB2qgDUS0gPgtTvoyZLTt9Ab6dC4hfc9dV5arkvc/OCmrw==", + "dev": true, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/cross-spawn": { + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", + "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", + "dependencies": { + "path-key": "^3.1.0", + "shebang-command": "^2.0.0", + "which": "^2.0.1" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/data-uri-to-buffer": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/data-uri-to-buffer/-/data-uri-to-buffer-2.0.2.tgz", + "integrity": "sha512-ND9qDTLc6diwj+Xe5cdAgVTbLVdXbtxTJRXRhli8Mowuaan+0EJOtdqJ0QCHNSSPyoXGx9HX2/VMnKeC34AChA==", + "dev": true + }, + "node_modules/debug": { + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", + "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", + "dependencies": { + "ms": "2.1.2" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/deep-is": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz", + "integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==" + }, + "node_modules/doctrine": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-3.0.0.tgz", + "integrity": "sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==", + "dependencies": { + "esutils": "^2.0.2" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/esbuild": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.20.2.tgz", + "integrity": "sha512-WdOOppmUNU+IbZ0PaDiTst80zjnrOkyJNHoKupIcVyU8Lvla3Ugx94VzkQ32Ijqd7UhHJy75gNWDMUekcrSJ6g==", + "dev": true, + "hasInstallScript": true, + "bin": { + "esbuild": "bin/esbuild" + }, + "engines": { + "node": ">=12" + }, + "optionalDependencies": { + "@esbuild/aix-ppc64": "0.20.2", + "@esbuild/android-arm": "0.20.2", + "@esbuild/android-arm64": "0.20.2", + "@esbuild/android-x64": "0.20.2", + "@esbuild/darwin-arm64": "0.20.2", + "@esbuild/darwin-x64": "0.20.2", + "@esbuild/freebsd-arm64": "0.20.2", + "@esbuild/freebsd-x64": "0.20.2", + "@esbuild/linux-arm": "0.20.2", + "@esbuild/linux-arm64": "0.20.2", + "@esbuild/linux-ia32": "0.20.2", + "@esbuild/linux-loong64": "0.20.2", + "@esbuild/linux-mips64el": "0.20.2", + "@esbuild/linux-ppc64": "0.20.2", + "@esbuild/linux-riscv64": "0.20.2", + "@esbuild/linux-s390x": "0.20.2", + "@esbuild/linux-x64": "0.20.2", + "@esbuild/netbsd-x64": "0.20.2", + "@esbuild/openbsd-x64": "0.20.2", + "@esbuild/sunos-x64": "0.20.2", + "@esbuild/win32-arm64": "0.20.2", + "@esbuild/win32-ia32": "0.20.2", + "@esbuild/win32-x64": "0.20.2" + } + }, + "node_modules/escape-string-regexp": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", + "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/eslint": { + "version": "8.57.0", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.57.0.tgz", + "integrity": "sha512-dZ6+mexnaTIbSBZWgou51U6OmzIhYM2VcNdtiTtI7qPNZm35Akpr0f6vtw3w1Kmn5PYo+tZVfh13WrhpS6oLqQ==", + "dependencies": { + "@eslint-community/eslint-utils": "^4.2.0", + "@eslint-community/regexpp": "^4.6.1", + "@eslint/eslintrc": "^2.1.4", + "@eslint/js": "8.57.0", + "@humanwhocodes/config-array": "^0.11.14", + "@humanwhocodes/module-importer": "^1.0.1", + "@nodelib/fs.walk": "^1.2.8", + "@ungap/structured-clone": "^1.2.0", + "ajv": "^6.12.4", + "chalk": "^4.0.0", + "cross-spawn": "^7.0.2", + "debug": "^4.3.2", + "doctrine": "^3.0.0", + "escape-string-regexp": "^4.0.0", + "eslint-scope": "^7.2.2", + "eslint-visitor-keys": "^3.4.3", + "espree": "^9.6.1", + "esquery": "^1.4.2", + "esutils": "^2.0.2", + "fast-deep-equal": "^3.1.3", + "file-entry-cache": "^6.0.1", + "find-up": "^5.0.0", + "glob-parent": "^6.0.2", + "globals": "^13.19.0", + "graphemer": "^1.4.0", + "ignore": "^5.2.0", + "imurmurhash": "^0.1.4", + "is-glob": "^4.0.0", + "is-path-inside": "^3.0.3", + "js-yaml": "^4.1.0", + "json-stable-stringify-without-jsonify": "^1.0.1", + "levn": "^0.4.1", + "lodash.merge": "^4.6.2", + "minimatch": "^3.1.2", + "natural-compare": "^1.4.0", + "optionator": "^0.9.3", + "strip-ansi": "^6.0.1", + "text-table": "^0.2.0" + }, + "bin": { + "eslint": "bin/eslint.js" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/eslint-config-prettier": { + "version": "9.1.0", + "resolved": "https://registry.npmjs.org/eslint-config-prettier/-/eslint-config-prettier-9.1.0.tgz", + "integrity": "sha512-NSWl5BFQWEPi1j4TjVNItzYV7dZXZ+wP6I6ZhrBGpChQhZRUaElihE9uRRkcbRnNb76UMKDF3r+WTmNcGPKsqw==", + "dev": true, + "bin": { + "eslint-config-prettier": "bin/cli.js" + }, + "peerDependencies": { + "eslint": ">=7.0.0" + } + }, + "node_modules/eslint-plugin-jsdoc": { + "version": "48.2.1", + "resolved": "https://registry.npmjs.org/eslint-plugin-jsdoc/-/eslint-plugin-jsdoc-48.2.1.tgz", + "integrity": "sha512-iUvbcyDZSO/9xSuRv2HQBw++8VkV/pt3UWtX9cpPH0l7GKPq78QC/6+PmyQHHvNZaTjAce6QVciEbnc6J/zH5g==", + "dependencies": { + "@es-joy/jsdoccomment": "~0.42.0", + "are-docs-informative": "^0.0.2", + "comment-parser": "1.4.1", + "debug": "^4.3.4", + "escape-string-regexp": "^4.0.0", + "esquery": "^1.5.0", + "is-builtin-module": "^3.2.1", + "semver": "^7.6.0", + "spdx-expression-parse": "^4.0.0" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "eslint": "^7.0.0 || ^8.0.0 || ^9.0.0" + } + }, + "node_modules/eslint-plugin-prettier": { + "version": "5.1.3", + "resolved": "https://registry.npmjs.org/eslint-plugin-prettier/-/eslint-plugin-prettier-5.1.3.tgz", + "integrity": "sha512-C9GCVAs4Eq7ZC/XFQHITLiHJxQngdtraXaM+LoUFoFp/lHNl2Zn8f3WQbe9HvTBBQ9YnKFB0/2Ajdqwo5D1EAw==", + "dev": true, + "dependencies": { + "prettier-linter-helpers": "^1.0.0", + "synckit": "^0.8.6" + }, + "engines": { + "node": "^14.18.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint-plugin-prettier" + }, + "peerDependencies": { + "@types/eslint": ">=8.0.0", + "eslint": ">=8.0.0", + "eslint-config-prettier": "*", + "prettier": ">=3.0.0" + }, + "peerDependenciesMeta": { + "@types/eslint": { + "optional": true + }, + "eslint-config-prettier": { + "optional": true + } + } + }, + "node_modules/eslint-scope": { + "version": "7.2.2", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-7.2.2.tgz", + "integrity": "sha512-dOt21O7lTMhDM+X9mB4GX+DZrZtCUJPL/wlcTqxyrx5IvO0IYtILdtrQGQp+8n5S0gwSVmOf9NQrjMOgfQZlIg==", + "dependencies": { + "esrecurse": "^4.3.0", + "estraverse": "^5.2.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/eslint-visitor-keys": { + "version": "3.4.3", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz", + "integrity": "sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==", + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/espree": { + "version": "9.6.1", + "resolved": "https://registry.npmjs.org/espree/-/espree-9.6.1.tgz", + "integrity": "sha512-oruZaFkjorTpF32kDSI5/75ViwGeZginGGy2NoOSg3Q9bnwlnmDm4HLnkl0RE3n+njDXR037aY1+x58Z/zFdwQ==", + "dependencies": { + "acorn": "^8.9.0", + "acorn-jsx": "^5.3.2", + "eslint-visitor-keys": "^3.4.1" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/esquery": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.5.0.tgz", + "integrity": "sha512-YQLXUplAwJgCydQ78IMJywZCceoqk1oH01OERdSAJc/7U2AylwjhSCLDEtqwg811idIS/9fIU5GjG73IgjKMVg==", + "dependencies": { + "estraverse": "^5.1.0" + }, + "engines": { + "node": ">=0.10" + } + }, + "node_modules/esrecurse": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz", + "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==", + "dependencies": { + "estraverse": "^5.2.0" + }, + "engines": { + "node": ">=4.0" + } + }, + "node_modules/estraverse": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", + "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", + "engines": { + "node": ">=4.0" + } + }, + "node_modules/estree-walker": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-0.6.1.tgz", + "integrity": "sha512-SqmZANLWS0mnatqbSfRP5g8OXZC12Fgg1IwNtLsyHDzJizORW4khDfjPqJZsemPWBB2uqykUah5YpQ6epsqC/w==", + "dev": true + }, + "node_modules/esutils": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", + "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/exit-hook": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/exit-hook/-/exit-hook-2.2.1.tgz", + "integrity": "sha512-eNTPlAD67BmP31LDINZ3U7HSF8l57TxOY2PmBJ1shpCvpnxBF93mWCE8YHBnXs8qiUZJc9WDcWIeC3a2HIAMfw==", + "dev": true, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/fast-deep-equal": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", + "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==" + }, + "node_modules/fast-diff": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/fast-diff/-/fast-diff-1.3.0.tgz", + "integrity": "sha512-VxPP4NqbUjj6MaAOafWeUn2cXWLcCtljklUtZf0Ind4XQ+QPtmA0b18zZy0jIQx+ExRVCR/ZQpBmik5lXshNsw==", + "dev": true + }, + "node_modules/fast-json-stable-stringify": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", + "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==" + }, + "node_modules/fast-levenshtein": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", + "integrity": "sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==" + }, + "node_modules/fastq": { + "version": "1.17.1", + "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.17.1.tgz", + "integrity": "sha512-sRVD3lWVIXWg6By68ZN7vho9a1pQcN/WBFaAAsDDFzlJjvoGx0P8z7V1t72grFJfJhu3YPZBuu25f7Kaw2jN1w==", + "dependencies": { + "reusify": "^1.0.4" + } + }, + "node_modules/file-entry-cache": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-6.0.1.tgz", + "integrity": "sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==", + "dependencies": { + "flat-cache": "^3.0.4" + }, + "engines": { + "node": "^10.12.0 || >=12.0.0" + } + }, + "node_modules/fill-range": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", + "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", + "dev": true, + "dependencies": { + "to-regex-range": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/find-up": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", + "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==", + "dependencies": { + "locate-path": "^6.0.0", + "path-exists": "^4.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/flat-cache": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-3.2.0.tgz", + "integrity": "sha512-CYcENa+FtcUKLmhhqyctpclsq7QF38pKjZHsGNiSQF5r4FtoKDWabFDl3hzaEQMvT1LHEysw5twgLvpYYb4vbw==", + "dependencies": { + "flatted": "^3.2.9", + "keyv": "^4.5.3", + "rimraf": "^3.0.2" + }, + "engines": { + "node": "^10.12.0 || >=12.0.0" + } + }, + "node_modules/flatted": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.3.1.tgz", + "integrity": "sha512-X8cqMLLie7KsNUDSdzeN8FYK9rEt4Dt67OsG/DNGnYTSDBG4uFAJFBnUeiV+zCVAvwFy56IjM9sH51jVaEhNxw==" + }, + "node_modules/fs.realpath": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", + "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==" + }, + "node_modules/fsevents": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", + "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", + "dev": true, + "hasInstallScript": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^8.16.0 || ^10.6.0 || >=11.0.0" + } + }, + "node_modules/function-bind": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz", + "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==", + "dev": true, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/get-source": { + "version": "2.0.12", + "resolved": "https://registry.npmjs.org/get-source/-/get-source-2.0.12.tgz", + "integrity": "sha512-X5+4+iD+HoSeEED+uwrQ07BOQr0kEDFMVqqpBuI+RaZBpBpHCuXxo70bjar6f0b0u/DQJsJ7ssurpP0V60Az+w==", + "dev": true, + "dependencies": { + "data-uri-to-buffer": "^2.0.0", + "source-map": "^0.6.1" + } + }, + "node_modules/glob": { + "version": "7.2.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", + "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", + "dependencies": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.1.1", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + }, + "engines": { + "node": "*" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/glob-parent": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz", + "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==", + "dependencies": { + "is-glob": "^4.0.3" + }, + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/glob-to-regexp": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/glob-to-regexp/-/glob-to-regexp-0.4.1.tgz", + "integrity": "sha512-lkX1HJXwyMcprw/5YUZc2s7DrpAiHB21/V+E1rHUrVNokkvB6bqMzT0VfV6/86ZNabt1k14YOIaT7nDvOX3Iiw==", + "dev": true + }, + "node_modules/globals": { + "version": "13.24.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-13.24.0.tgz", + "integrity": "sha512-AhO5QUcj8llrbG09iWhPU2B204J1xnPeL8kQmVorSsy+Sjj1sk8gIyh6cUocGmH4L0UuhAJy+hJMRA4mgA4mFQ==", + "dependencies": { + "type-fest": "^0.20.2" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/graphemer": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/graphemer/-/graphemer-1.4.0.tgz", + "integrity": "sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==" + }, + "node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "engines": { + "node": ">=8" + } + }, + "node_modules/hasown": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz", + "integrity": "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==", + "dev": true, + "dependencies": { + "function-bind": "^1.1.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/hono": { + "version": "4.1.3", + "resolved": "https://registry.npmjs.org/hono/-/hono-4.1.3.tgz", + "integrity": "sha512-V0I6qCw0gn2MA4LLtyXe6oD3/7ToeQf5Zv98o7uSuLuViQgWHJeYoYrZ4NbXhOtg4SaZjNJJm1+XuFB3LN+j6A==", + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/ignore": { + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.1.tgz", + "integrity": "sha512-5Fytz/IraMjqpwfd34ke28PTVMjZjJG2MPn5t7OE4eUCUNf8BAa7b5WUS9/Qvr6mwOQS7Mk6vdsMno5he+T8Xw==", + "engines": { + "node": ">= 4" + } + }, + "node_modules/import-fresh": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz", + "integrity": "sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==", + "dependencies": { + "parent-module": "^1.0.0", + "resolve-from": "^4.0.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/imurmurhash": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", + "integrity": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==", + "engines": { + "node": ">=0.8.19" + } + }, + "node_modules/inflight": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", + "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==", + "dependencies": { + "once": "^1.3.0", + "wrappy": "1" + } + }, + "node_modules/inherits": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" + }, + "node_modules/is-binary-path": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", + "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", + "dev": true, + "dependencies": { + "binary-extensions": "^2.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/is-builtin-module": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/is-builtin-module/-/is-builtin-module-3.2.1.tgz", + "integrity": "sha512-BSLE3HnV2syZ0FK0iMA/yUGplUeMmNz4AW5fnTunbCIqZi4vG3WjJT9FHMy5D69xmAYBHXQhJdALdpwVxV501A==", + "dependencies": { + "builtin-modules": "^3.3.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/is-core-module": { + "version": "2.13.1", + "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.13.1.tgz", + "integrity": "sha512-hHrIjvZsftOsvKSn2TRYl63zvxsgE0K+0mYMoH6gD4omR5IWB2KynivBQczo3+wF1cCkjzvptnI9Q0sPU66ilw==", + "dev": true, + "dependencies": { + "hasown": "^2.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-extglob": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", + "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-glob": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", + "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", + "dependencies": { + "is-extglob": "^2.1.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-number": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", + "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", + "dev": true, + "engines": { + "node": ">=0.12.0" + } + }, + "node_modules/is-path-inside": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-3.0.3.tgz", + "integrity": "sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==", + "engines": { + "node": ">=8" + } + }, + "node_modules/isexe": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", + "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==" + }, + "node_modules/js-yaml": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", + "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", + "dependencies": { + "argparse": "^2.0.1" + }, + "bin": { + "js-yaml": "bin/js-yaml.js" + } + }, + "node_modules/jsdoc-type-pratt-parser": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/jsdoc-type-pratt-parser/-/jsdoc-type-pratt-parser-4.0.0.tgz", + "integrity": "sha512-YtOli5Cmzy3q4dP26GraSOeAhqecewG04hoO8DY56CH4KJ9Fvv5qKWUCCo3HZob7esJQHCv6/+bnTy72xZZaVQ==", + "engines": { + "node": ">=12.0.0" + } + }, + "node_modules/json-buffer": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.1.tgz", + "integrity": "sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==" + }, + "node_modules/json-schema-traverse": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", + "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==" + }, + "node_modules/json-stable-stringify-without-jsonify": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz", + "integrity": "sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==" + }, + "node_modules/keyv": { + "version": "4.5.4", + "resolved": "https://registry.npmjs.org/keyv/-/keyv-4.5.4.tgz", + "integrity": "sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==", + "dependencies": { + "json-buffer": "3.0.1" + } + }, + "node_modules/levn": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz", + "integrity": "sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==", + "dependencies": { + "prelude-ls": "^1.2.1", + "type-check": "~0.4.0" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/locate-path": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", + "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==", + "dependencies": { + "p-locate": "^5.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/lodash.merge": { + "version": "4.6.2", + "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz", + "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==" + }, + "node_modules/lru-cache": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", + "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/magic-string": { + "version": "0.25.9", + "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.25.9.tgz", + "integrity": "sha512-RmF0AsMzgt25qzqqLc1+MbHmhdx0ojF2Fvs4XnOqz2ZOBXzzkEwc/dJQZCYHAn7v1jbVOjAZfK8msRn4BxO4VQ==", + "dev": true, + "dependencies": { + "sourcemap-codec": "^1.4.8" + } + }, + "node_modules/mime": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/mime/-/mime-3.0.0.tgz", + "integrity": "sha512-jSCU7/VB1loIWBZe14aEYHU/+1UMEHoaO7qxCOVJOw9GgH72VAWppxNcjU+x9a2k3GSIBXNKxXQFqRvvZ7vr3A==", + "dev": true, + "bin": { + "mime": "cli.js" + }, + "engines": { + "node": ">=10.0.0" + } + }, + "node_modules/miniflare": { + "version": "3.20240314.0", + "resolved": "https://registry.npmjs.org/miniflare/-/miniflare-3.20240314.0.tgz", + "integrity": "sha512-vjjiCEgNy4rfE8VP2C9xngT3eQY4HQg5eiXL+I845voM+6m67a7sZaGl2MspANNHXAKVi71m5bAzFgPcb2Jw9w==", + "dev": true, + "dependencies": { + "@cspotcode/source-map-support": "0.8.1", + "acorn": "^8.8.0", + "acorn-walk": "^8.2.0", + "capnp-ts": "^0.7.0", + "exit-hook": "^2.2.1", + "glob-to-regexp": "^0.4.1", + "stoppable": "^1.1.0", + "undici": "^5.28.2", + "workerd": "1.20240314.0", + "ws": "^8.11.0", + "youch": "^3.2.2", + "zod": "^3.20.6" + }, + "bin": { + "miniflare": "bootstrap.js" + }, + "engines": { + "node": ">=16.13" + } + }, + "node_modules/minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" + }, + "node_modules/mustache": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/mustache/-/mustache-4.2.0.tgz", + "integrity": "sha512-71ippSywq5Yb7/tVYyGbkBggbU8H3u5Rz56fH60jGFgr8uHwxs+aSKeqmluIVzM0m0kB7xQjKS6qPfd0b2ZoqQ==", + "dev": true, + "bin": { + "mustache": "bin/mustache" + } + }, + "node_modules/nanoid": { + "version": "3.3.7", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.7.tgz", + "integrity": "sha512-eSRppjcPIatRIMC1U6UngP8XFcz8MQWGQdt1MTBQ7NaAmvXDfvNxbvWV3x2y6CdEUciCSsDHDQZbhYaB8QEo2g==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "bin": { + "nanoid": "bin/nanoid.cjs" + }, + "engines": { + "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" + } + }, + "node_modules/natural-compare": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", + "integrity": "sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==" + }, + "node_modules/node-forge": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/node-forge/-/node-forge-1.3.1.tgz", + "integrity": "sha512-dPEtOeMvF9VMcYV/1Wb8CPoVAXtp6MKMlcbAt4ddqmGqUJ6fQZFXkNZNkNlfevtNkGtaSoXf/vNNNSvgrdXwtA==", + "dev": true, + "engines": { + "node": ">= 6.13.0" + } + }, + "node_modules/normalize-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", + "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/once": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", + "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", + "dependencies": { + "wrappy": "1" + } + }, + "node_modules/optionator": { + "version": "0.9.3", + "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.3.tgz", + "integrity": "sha512-JjCoypp+jKn1ttEFExxhetCKeJt9zhAgAve5FXHixTvFDW/5aEktX9bufBKLRRMdU7bNtpLfcGu94B3cdEJgjg==", + "dependencies": { + "@aashutoshrathi/word-wrap": "^1.2.3", + "deep-is": "^0.1.3", + "fast-levenshtein": "^2.0.6", + "levn": "^0.4.1", + "prelude-ls": "^1.2.1", + "type-check": "^0.4.0" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/p-limit": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", + "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", + "dependencies": { + "yocto-queue": "^0.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/p-locate": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz", + "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==", + "dependencies": { + "p-limit": "^3.0.2" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/parent-module": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", + "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==", + "dependencies": { + "callsites": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/path-exists": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", + "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", + "engines": { + "node": ">=8" + } + }, + "node_modules/path-is-absolute": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", + "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/path-key": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", + "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", + "engines": { + "node": ">=8" + } + }, + "node_modules/path-parse": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", + "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==", + "dev": true + }, + "node_modules/path-to-regexp": { + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-6.2.1.tgz", + "integrity": "sha512-JLyh7xT1kizaEvcaXOQwOc2/Yhw6KZOvPf1S8401UyLk86CU79LN3vl7ztXGm/pZ+YjoyAJ4rxmHwbkBXJX+yw==", + "dev": true + }, + "node_modules/picomatch": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", + "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", + "dev": true, + "engines": { + "node": ">=8.6" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/prelude-ls": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz", + "integrity": "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==", + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/prettier": { + "version": "3.2.5", + "resolved": "https://registry.npmjs.org/prettier/-/prettier-3.2.5.tgz", + "integrity": "sha512-3/GWa9aOC0YeD7LUfvOG2NiDyhOWRvt1k+rcKhOuYnMY24iiCphgneUfJDyFXd6rZCAnuLBv6UeAULtrhT/F4A==", + "dev": true, + "bin": { + "prettier": "bin/prettier.cjs" + }, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/prettier/prettier?sponsor=1" + } + }, + "node_modules/prettier-linter-helpers": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/prettier-linter-helpers/-/prettier-linter-helpers-1.0.0.tgz", + "integrity": "sha512-GbK2cP9nraSSUF9N2XwUwqfzlAFlMNYYl+ShE/V+H8a9uNl/oUqB1w2EL54Jh0OlyRSd8RfWYJ3coVS4TROP2w==", + "dev": true, + "dependencies": { + "fast-diff": "^1.1.2" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/printable-characters": { + "version": "1.0.42", + "resolved": "https://registry.npmjs.org/printable-characters/-/printable-characters-1.0.42.tgz", + "integrity": "sha512-dKp+C4iXWK4vVYZmYSd0KBH5F/h1HoZRsbJ82AVKRO3PEo8L4lBS/vLwhVtpwwuYcoIsVY+1JYKR268yn480uQ==", + "dev": true + }, + "node_modules/punycode": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz", + "integrity": "sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==", + "engines": { + "node": ">=6" + } + }, + "node_modules/queue-microtask": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", + "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ] + }, + "node_modules/readdirp": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", + "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", + "dev": true, + "dependencies": { + "picomatch": "^2.2.1" + }, + "engines": { + "node": ">=8.10.0" + } + }, + "node_modules/resolve": { + "version": "1.22.8", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.8.tgz", + "integrity": "sha512-oKWePCxqpd6FlLvGV1VU0x7bkPmmCNolxzjMf4NczoDnQcIWrAF+cPtZn5i6n+RfD2d9i0tzpKnG6Yk168yIyw==", + "dev": true, + "dependencies": { + "is-core-module": "^2.13.0", + "path-parse": "^1.0.7", + "supports-preserve-symlinks-flag": "^1.0.0" + }, + "bin": { + "resolve": "bin/resolve" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/resolve-from": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", + "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", + "engines": { + "node": ">=4" + } + }, + "node_modules/resolve.exports": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/resolve.exports/-/resolve.exports-2.0.2.tgz", + "integrity": "sha512-X2UW6Nw3n/aMgDVy+0rSqgHlv39WZAlZrXCdnbyEiKm17DSqHX4MmQMaST3FbeWR5FTuRcUwYAziZajji0Y7mg==", + "dev": true, + "engines": { + "node": ">=10" + } + }, + "node_modules/reusify": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz", + "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==", + "engines": { + "iojs": ">=1.0.0", + "node": ">=0.10.0" + } + }, + "node_modules/rimraf": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", + "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", + "dependencies": { + "glob": "^7.1.3" + }, + "bin": { + "rimraf": "bin.js" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/rollup-plugin-inject": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/rollup-plugin-inject/-/rollup-plugin-inject-3.0.2.tgz", + "integrity": "sha512-ptg9PQwzs3orn4jkgXJ74bfs5vYz1NCZlSQMBUA0wKcGp5i5pA1AO3fOUEte8enhGUC+iapTCzEWw2jEFFUO/w==", + "deprecated": "This package has been deprecated and is no longer maintained. Please use @rollup/plugin-inject.", + "dev": true, + "dependencies": { + "estree-walker": "^0.6.1", + "magic-string": "^0.25.3", + "rollup-pluginutils": "^2.8.1" + } + }, + "node_modules/rollup-plugin-node-polyfills": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/rollup-plugin-node-polyfills/-/rollup-plugin-node-polyfills-0.2.1.tgz", + "integrity": "sha512-4kCrKPTJ6sK4/gLL/U5QzVT8cxJcofO0OU74tnB19F40cmuAKSzH5/siithxlofFEjwvw1YAhPmbvGNA6jEroA==", + "dev": true, + "dependencies": { + "rollup-plugin-inject": "^3.0.0" + } + }, + "node_modules/rollup-pluginutils": { + "version": "2.8.2", + "resolved": "https://registry.npmjs.org/rollup-pluginutils/-/rollup-pluginutils-2.8.2.tgz", + "integrity": "sha512-EEp9NhnUkwY8aif6bxgovPHMoMoNr2FulJziTndpt5H9RdwC47GSGuII9XxpSdzVGM0GWrNPHV6ie1LTNJPaLQ==", + "dev": true, + "dependencies": { + "estree-walker": "^0.6.1" + } + }, + "node_modules/run-parallel": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz", + "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "dependencies": { + "queue-microtask": "^1.2.2" + } + }, + "node_modules/selfsigned": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/selfsigned/-/selfsigned-2.4.1.tgz", + "integrity": "sha512-th5B4L2U+eGLq1TVh7zNRGBapioSORUeymIydxgFpwww9d2qyKvtuPU2jJuHvYAwwqi2Y596QBL3eEqcPEYL8Q==", + "dev": true, + "dependencies": { + "@types/node-forge": "^1.3.0", + "node-forge": "^1" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/semver": { + "version": "7.6.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.0.tgz", + "integrity": "sha512-EnwXhrlwXMk9gKu5/flx5sv/an57AkRplG3hTK68W7FRDN+k+OWBj65M7719OkA82XLBxrcX0KSHj+X5COhOVg==", + "dependencies": { + "lru-cache": "^6.0.0" + }, + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/shebang-command": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", + "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", + "dependencies": { + "shebang-regex": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/shebang-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", + "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", + "engines": { + "node": ">=8" + } + }, + "node_modules/source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/sourcemap-codec": { + "version": "1.4.8", + "resolved": "https://registry.npmjs.org/sourcemap-codec/-/sourcemap-codec-1.4.8.tgz", + "integrity": "sha512-9NykojV5Uih4lgo5So5dtw+f0JgJX30KCNI8gwhz2J9A15wD0Ml6tjHKwf6fTSa6fAdVBdZeNOs9eJ71qCk8vA==", + "deprecated": "Please use @jridgewell/sourcemap-codec instead", + "dev": true + }, + "node_modules/spdx-exceptions": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/spdx-exceptions/-/spdx-exceptions-2.5.0.tgz", + "integrity": "sha512-PiU42r+xO4UbUS1buo3LPJkjlO7430Xn5SVAhdpzzsPHsjbYVflnnFdATgabnLude+Cqu25p6N+g2lw/PFsa4w==" + }, + "node_modules/spdx-expression-parse": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-4.0.0.tgz", + "integrity": "sha512-Clya5JIij/7C6bRR22+tnGXbc4VKlibKSVj2iHvVeX5iMW7s1SIQlqu699JkODJJIhh/pUu8L0/VLh8xflD+LQ==", + "dependencies": { + "spdx-exceptions": "^2.1.0", + "spdx-license-ids": "^3.0.0" + } + }, + "node_modules/spdx-license-ids": { + "version": "3.0.17", + "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.17.tgz", + "integrity": "sha512-sh8PWc/ftMqAAdFiBu6Fy6JUOYjqDJBJvIhpfDMyHrr0Rbp5liZqd4TjtQ/RgfLjKFZb+LMx5hpml5qOWy0qvg==" + }, + "node_modules/stacktracey": { + "version": "2.1.8", + "resolved": "https://registry.npmjs.org/stacktracey/-/stacktracey-2.1.8.tgz", + "integrity": "sha512-Kpij9riA+UNg7TnphqjH7/CzctQ/owJGNbFkfEeve4Z4uxT5+JapVLFXcsurIfN34gnTWZNJ/f7NMG0E8JDzTw==", + "dev": true, + "dependencies": { + "as-table": "^1.0.36", + "get-source": "^2.0.12" + } + }, + "node_modules/stoppable": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/stoppable/-/stoppable-1.1.0.tgz", + "integrity": "sha512-KXDYZ9dszj6bzvnEMRYvxgeTHU74QBFL54XKtP3nyMuJ81CFYtABZ3bAzL2EdFUaEwJOBOgENyFj3R7oTzDyyw==", + "dev": true, + "engines": { + "node": ">=4", + "npm": ">=6" + } + }, + "node_modules/strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/strip-json-comments": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", + "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==", + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/supports-preserve-symlinks-flag": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", + "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==", + "dev": true, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/synckit": { + "version": "0.8.8", + "resolved": "https://registry.npmjs.org/synckit/-/synckit-0.8.8.tgz", + "integrity": "sha512-HwOKAP7Wc5aRGYdKH+dw0PRRpbO841v2DENBtjnR5HFWoiNByAl7vrx3p0G/rCyYXQsrxqtX48TImFtPcIHSpQ==", + "dev": true, + "dependencies": { + "@pkgr/core": "^0.1.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": "^14.18.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/unts" + } + }, + "node_modules/text-table": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz", + "integrity": "sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==" + }, + "node_modules/to-regex-range": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", + "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", + "dev": true, + "dependencies": { + "is-number": "^7.0.0" + }, + "engines": { + "node": ">=8.0" + } + }, + "node_modules/tslib": { + "version": "2.6.2", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.2.tgz", + "integrity": "sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q==", + "dev": true + }, + "node_modules/type-check": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz", + "integrity": "sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==", + "dependencies": { + "prelude-ls": "^1.2.1" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/type-fest": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz", + "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/undici": { + "version": "5.28.3", + "resolved": "https://registry.npmjs.org/undici/-/undici-5.28.3.tgz", + "integrity": "sha512-3ItfzbrhDlINjaP0duwnNsKpDQk3acHI3gVJ1z4fmwMK31k5G9OVIAMLSIaP6w4FaGkaAkN6zaQO9LUvZ1t7VA==", + "dev": true, + "dependencies": { + "@fastify/busboy": "^2.0.0" + }, + "engines": { + "node": ">=14.0" + } + }, + "node_modules/undici-types": { + "version": "5.26.5", + "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-5.26.5.tgz", + "integrity": "sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA==", + "dev": true + }, + "node_modules/uri-js": { + "version": "4.4.1", + "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", + "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", + "dependencies": { + "punycode": "^2.1.0" + } + }, + "node_modules/which": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", + "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", + "dependencies": { + "isexe": "^2.0.0" + }, + "bin": { + "node-which": "bin/node-which" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/workerd": { + "version": "1.20240314.0", + "resolved": "https://registry.npmjs.org/workerd/-/workerd-1.20240314.0.tgz", + "integrity": "sha512-5vXqDe6vJTMpfPVW8Vtcy2zcVIBnOIMv0D+Z0gVPMPq++KwEyQWzCIVLpIyc28EUc5bW3gEO49E8BN1PQebgfw==", + "dev": true, + "hasInstallScript": true, + "bin": { + "workerd": "bin/workerd" + }, + "engines": { + "node": ">=16" + }, + "optionalDependencies": { + "@cloudflare/workerd-darwin-64": "1.20240314.0", + "@cloudflare/workerd-darwin-arm64": "1.20240314.0", + "@cloudflare/workerd-linux-64": "1.20240314.0", + "@cloudflare/workerd-linux-arm64": "1.20240314.0", + "@cloudflare/workerd-windows-64": "1.20240314.0" + } + }, + "node_modules/wrangler": { + "version": "3.36.0", + "resolved": "https://registry.npmjs.org/wrangler/-/wrangler-3.36.0.tgz", + "integrity": "sha512-Fywf9RGAePIuIDcsSg4BW+lDUZX1jh2jN+TtmZOwG5Ewdr9dJGP3dxoFa85eQQZP1VLvY4lsqrKy67JqOuP9Gw==", + "dev": true, + "dependencies": { + "@cloudflare/kv-asset-handler": "0.3.1", + "@esbuild-plugins/node-globals-polyfill": "^0.2.3", + "@esbuild-plugins/node-modules-polyfill": "^0.2.2", + "blake3-wasm": "^2.1.5", + "chokidar": "^3.5.3", + "esbuild": "0.17.19", + "miniflare": "3.20240314.0", + "nanoid": "^3.3.3", + "path-to-regexp": "^6.2.0", + "resolve": "^1.22.8", + "resolve.exports": "^2.0.2", + "selfsigned": "^2.0.1", + "source-map": "0.6.1", + "xxhash-wasm": "^1.0.1" + }, + "bin": { + "wrangler": "bin/wrangler.js", + "wrangler2": "bin/wrangler.js" + }, + "engines": { + "node": ">=16.17.0" + }, + "optionalDependencies": { + "fsevents": "~2.3.2" + }, + "peerDependencies": { + "@cloudflare/workers-types": "^4.20230914.0" + }, + "peerDependenciesMeta": { + "@cloudflare/workers-types": { + "optional": true + } + } + }, + "node_modules/wrangler/node_modules/@esbuild/android-arm": { + "version": "0.17.19", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.17.19.tgz", + "integrity": "sha512-rIKddzqhmav7MSmoFCmDIb6e2W57geRsM94gV2l38fzhXMwq7hZoClug9USI2pFRGL06f4IOPHHpFNOkWieR8A==", + "cpu": [ + "arm" + ], + "dev": true, + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/wrangler/node_modules/@esbuild/android-arm64": { + "version": "0.17.19", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.17.19.tgz", + "integrity": "sha512-KBMWvEZooR7+kzY0BtbTQn0OAYY7CsiydT63pVEaPtVYF0hXbUaOyZog37DKxK7NF3XacBJOpYT4adIJh+avxA==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/wrangler/node_modules/@esbuild/android-x64": { + "version": "0.17.19", + "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.17.19.tgz", + "integrity": "sha512-uUTTc4xGNDT7YSArp/zbtmbhO0uEEK9/ETW29Wk1thYUJBz3IVnvgEiEwEa9IeLyvnpKrWK64Utw2bgUmDveww==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/wrangler/node_modules/@esbuild/darwin-arm64": { + "version": "0.17.19", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.17.19.tgz", + "integrity": "sha512-80wEoCfF/hFKM6WE1FyBHc9SfUblloAWx6FJkFWTWiCoht9Mc0ARGEM47e67W9rI09YoUxJL68WHfDRYEAvOhg==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/wrangler/node_modules/@esbuild/darwin-x64": { + "version": "0.17.19", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.17.19.tgz", + "integrity": "sha512-IJM4JJsLhRYr9xdtLytPLSH9k/oxR3boaUIYiHkAawtwNOXKE8KoU8tMvryogdcT8AU+Bflmh81Xn6Q0vTZbQw==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/wrangler/node_modules/@esbuild/freebsd-arm64": { + "version": "0.17.19", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.17.19.tgz", + "integrity": "sha512-pBwbc7DufluUeGdjSU5Si+P3SoMF5DQ/F/UmTSb8HXO80ZEAJmrykPyzo1IfNbAoaqw48YRpv8shwd1NoI0jcQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/wrangler/node_modules/@esbuild/freebsd-x64": { + "version": "0.17.19", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.17.19.tgz", + "integrity": "sha512-4lu+n8Wk0XlajEhbEffdy2xy53dpR06SlzvhGByyg36qJw6Kpfk7cp45DR/62aPH9mtJRmIyrXAS5UWBrJT6TQ==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/wrangler/node_modules/@esbuild/linux-arm": { + "version": "0.17.19", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.17.19.tgz", + "integrity": "sha512-cdmT3KxjlOQ/gZ2cjfrQOtmhG4HJs6hhvm3mWSRDPtZ/lP5oe8FWceS10JaSJC13GBd4eH/haHnqf7hhGNLerA==", + "cpu": [ + "arm" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/wrangler/node_modules/@esbuild/linux-arm64": { + "version": "0.17.19", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.17.19.tgz", + "integrity": "sha512-ct1Tg3WGwd3P+oZYqic+YZF4snNl2bsnMKRkb3ozHmnM0dGWuxcPTTntAF6bOP0Sp4x0PjSF+4uHQ1xvxfRKqg==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/wrangler/node_modules/@esbuild/linux-ia32": { + "version": "0.17.19", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.17.19.tgz", + "integrity": "sha512-w4IRhSy1VbsNxHRQpeGCHEmibqdTUx61Vc38APcsRbuVgK0OPEnQ0YD39Brymn96mOx48Y2laBQGqgZ0j9w6SQ==", + "cpu": [ + "ia32" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/wrangler/node_modules/@esbuild/linux-loong64": { + "version": "0.17.19", + "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.17.19.tgz", + "integrity": "sha512-2iAngUbBPMq439a+z//gE+9WBldoMp1s5GWsUSgqHLzLJ9WoZLZhpwWuym0u0u/4XmZ3gpHmzV84PonE+9IIdQ==", + "cpu": [ + "loong64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/wrangler/node_modules/@esbuild/linux-mips64el": { + "version": "0.17.19", + "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.17.19.tgz", + "integrity": "sha512-LKJltc4LVdMKHsrFe4MGNPp0hqDFA1Wpt3jE1gEyM3nKUvOiO//9PheZZHfYRfYl6AwdTH4aTcXSqBerX0ml4A==", + "cpu": [ + "mips64el" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/wrangler/node_modules/@esbuild/linux-ppc64": { + "version": "0.17.19", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.17.19.tgz", + "integrity": "sha512-/c/DGybs95WXNS8y3Ti/ytqETiW7EU44MEKuCAcpPto3YjQbyK3IQVKfF6nbghD7EcLUGl0NbiL5Rt5DMhn5tg==", + "cpu": [ + "ppc64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/wrangler/node_modules/@esbuild/linux-riscv64": { + "version": "0.17.19", + "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.17.19.tgz", + "integrity": "sha512-FC3nUAWhvFoutlhAkgHf8f5HwFWUL6bYdvLc/TTuxKlvLi3+pPzdZiFKSWz/PF30TB1K19SuCxDTI5KcqASJqA==", + "cpu": [ + "riscv64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/wrangler/node_modules/@esbuild/linux-s390x": { + "version": "0.17.19", + "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.17.19.tgz", + "integrity": "sha512-IbFsFbxMWLuKEbH+7sTkKzL6NJmG2vRyy6K7JJo55w+8xDk7RElYn6xvXtDW8HCfoKBFK69f3pgBJSUSQPr+4Q==", + "cpu": [ + "s390x" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/wrangler/node_modules/@esbuild/linux-x64": { + "version": "0.17.19", + "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.17.19.tgz", + "integrity": "sha512-68ngA9lg2H6zkZcyp22tsVt38mlhWde8l3eJLWkyLrp4HwMUr3c1s/M2t7+kHIhvMjglIBrFpncX1SzMckomGw==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/wrangler/node_modules/@esbuild/netbsd-x64": { + "version": "0.17.19", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.17.19.tgz", + "integrity": "sha512-CwFq42rXCR8TYIjIfpXCbRX0rp1jo6cPIUPSaWwzbVI4aOfX96OXY8M6KNmtPcg7QjYeDmN+DD0Wp3LaBOLf4Q==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "netbsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/wrangler/node_modules/@esbuild/openbsd-x64": { + "version": "0.17.19", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.17.19.tgz", + "integrity": "sha512-cnq5brJYrSZ2CF6c35eCmviIN3k3RczmHz8eYaVlNasVqsNY+JKohZU5MKmaOI+KkllCdzOKKdPs762VCPC20g==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "openbsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/wrangler/node_modules/@esbuild/sunos-x64": { + "version": "0.17.19", + "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.17.19.tgz", + "integrity": "sha512-vCRT7yP3zX+bKWFeP/zdS6SqdWB8OIpaRq/mbXQxTGHnIxspRtigpkUcDMlSCOejlHowLqII7K2JKevwyRP2rg==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "sunos" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/wrangler/node_modules/@esbuild/win32-arm64": { + "version": "0.17.19", + "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.17.19.tgz", + "integrity": "sha512-yYx+8jwowUstVdorcMdNlzklLYhPxjniHWFKgRqH7IFlUEa0Umu3KuYplf1HUZZ422e3NU9F4LGb+4O0Kdcaag==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/wrangler/node_modules/@esbuild/win32-ia32": { + "version": "0.17.19", + "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.17.19.tgz", + "integrity": "sha512-eggDKanJszUtCdlVs0RB+h35wNlb5v4TWEkq4vZcmVt5u/HiDZrTXe2bWFQUez3RgNHwx/x4sk5++4NSSicKkw==", + "cpu": [ + "ia32" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/wrangler/node_modules/@esbuild/win32-x64": { + "version": "0.17.19", + "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.17.19.tgz", + "integrity": "sha512-lAhycmKnVOuRYNtRtatQR1LPQf2oYCkRGkSFnseDAKPl8lu5SOsK/e1sXe5a0Pc5kHIHe6P2I/ilntNv2xf3cA==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/wrangler/node_modules/esbuild": { + "version": "0.17.19", + "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.17.19.tgz", + "integrity": "sha512-XQ0jAPFkK/u3LcVRcvVHQcTIqD6E2H1fvZMA5dQPSOWb3suUbWbfbRf94pjc0bNzRYLfIrDRQXr7X+LHIm5oHw==", + "dev": true, + "hasInstallScript": true, + "bin": { + "esbuild": "bin/esbuild" + }, + "engines": { + "node": ">=12" + }, + "optionalDependencies": { + "@esbuild/android-arm": "0.17.19", + "@esbuild/android-arm64": "0.17.19", + "@esbuild/android-x64": "0.17.19", + "@esbuild/darwin-arm64": "0.17.19", + "@esbuild/darwin-x64": "0.17.19", + "@esbuild/freebsd-arm64": "0.17.19", + "@esbuild/freebsd-x64": "0.17.19", + "@esbuild/linux-arm": "0.17.19", + "@esbuild/linux-arm64": "0.17.19", + "@esbuild/linux-ia32": "0.17.19", + "@esbuild/linux-loong64": "0.17.19", + "@esbuild/linux-mips64el": "0.17.19", + "@esbuild/linux-ppc64": "0.17.19", + "@esbuild/linux-riscv64": "0.17.19", + "@esbuild/linux-s390x": "0.17.19", + "@esbuild/linux-x64": "0.17.19", + "@esbuild/netbsd-x64": "0.17.19", + "@esbuild/openbsd-x64": "0.17.19", + "@esbuild/sunos-x64": "0.17.19", + "@esbuild/win32-arm64": "0.17.19", + "@esbuild/win32-ia32": "0.17.19", + "@esbuild/win32-x64": "0.17.19" + } + }, + "node_modules/wrappy": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", + "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==" + }, + "node_modules/ws": { + "version": "8.16.0", + "resolved": "https://registry.npmjs.org/ws/-/ws-8.16.0.tgz", + "integrity": "sha512-HS0c//TP7Ina87TfiPUz1rQzMhHrl/SG2guqRcTOIUYD2q8uhUdNHZYJUaQ8aTGPzCh+c6oawMKW35nFl1dxyQ==", + "dev": true, + "engines": { + "node": ">=10.0.0" + }, + "peerDependencies": { + "bufferutil": "^4.0.1", + "utf-8-validate": ">=5.0.2" + }, + "peerDependenciesMeta": { + "bufferutil": { + "optional": true + }, + "utf-8-validate": { + "optional": true + } + } + }, + "node_modules/xxhash-wasm": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/xxhash-wasm/-/xxhash-wasm-1.0.2.tgz", + "integrity": "sha512-ibF0Or+FivM9lNrg+HGJfVX8WJqgo+kCLDc4vx6xMeTce7Aj+DLttKbxxRR/gNLSAelRc1omAPlJ77N/Jem07A==", + "dev": true + }, + "node_modules/yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==" + }, + "node_modules/yocto-queue": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", + "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/youch": { + "version": "3.3.3", + "resolved": "https://registry.npmjs.org/youch/-/youch-3.3.3.tgz", + "integrity": "sha512-qSFXUk3UZBLfggAW3dJKg0BMblG5biqSF8M34E06o5CSsZtH92u9Hqmj2RzGiHDi64fhe83+4tENFP2DB6t6ZA==", + "dev": true, + "dependencies": { + "cookie": "^0.5.0", + "mustache": "^4.2.0", + "stacktracey": "^2.1.8" + } + }, + "node_modules/zod": { + "version": "3.22.4", + "resolved": "https://registry.npmjs.org/zod/-/zod-3.22.4.tgz", + "integrity": "sha512-iC+8Io04lddc+mVqQ9AZ7OQ2MrUKGN+oIQyq1vemgt46jwCwLfhq7/pwnBnNXXXZb8VTVLKwp9EDkx+ryxIWmg==", + "dev": true, + "funding": { + "url": "https://github.com/sponsors/colinhacks" + } + } + } +} diff --git a/examples/hono-tractor-store-2.0/package.json b/examples/hono-tractor-store-2.0/package.json new file mode 100644 index 0000000..f39358d --- /dev/null +++ b/examples/hono-tractor-store-2.0/package.json @@ -0,0 +1,35 @@ +{ + "name": "tractor-store-blueprint", + "version": "1.0.0", + "description": "## What is The Tractor Store?", + "main": "src/server.js", + "scripts": { + "dev": "npm run build && node --watch --es-module-specifier-resolution=node --no-warnings src/server.node.js", + "dev:local-images": "USE_LOCAL_IMAGES=true npm run dev", + "watch": "node esbuild.js --watch", + "build": "node esbuild.js", + "lint": "eslint .", + "format": "prettier --write .", + "test": "echo \"Error: no test specified\" && exit 0", + "start": "NODE_ENV=production node src/server.node.js", + "database": "node src/explore/database/import.js && node src/decide/database/import.js && node src/checkout/database/import.js", + "dev:cloudflare": "wrangler dev", + "deploy:cloudflare": "npm run build && wrangler deploy" + }, + "type": "module", + "author": "neuland", + "license": "MIT", + "dependencies": { + "@hono/node-server": "^1.8.2", + "eslint-plugin-jsdoc": "^48.2.1", + "hono": "^4.1.0" + }, + "devDependencies": { + "esbuild": "^0.20.1", + "eslint": "^8.56.0", + "eslint-config-prettier": "^9.1.0", + "eslint-plugin-prettier": "^5.1.3", + "prettier": "^3.2.5", + "wrangler": "^3.34.0" + } +} \ No newline at end of file diff --git a/examples/hono-tractor-store-2.0/products.js b/examples/hono-tractor-store-2.0/products.js new file mode 100644 index 0000000..1d2ce4d --- /dev/null +++ b/examples/hono-tractor-store-2.0/products.js @@ -0,0 +1,628 @@ +/** + * @typedef {object} Variant + * @property {string} name - The variant name. + * @property {string} image - The URL to the variant's image. + * @property {string} sku - The stock keeping unit. + * @property {string} color - The color code in hexadecimal. + * @property {number} price - The price of the variant. + */ + +/** + * @typedef {object} Product + * @property {string} name - The product name. + * @property {string} id - The product ID. + * @property {string} category - The product category. + * @property {string[]} highlights - List of product highlights. + * @property {Variant[]} variants - Available variants of the product. + */ + +/** + * @type {Product[]} + */ +export default [ + { + name: "TerraFirma AutoCultivator T-300", + id: "AU-01", + category: "autonomous", + highlightsa: [ + "Precision GPS mapping optimizes field coverage.", + "Hybrid engine ensures eco-friendly extended operation.", + "Fully autonomous with smart obstacle detection and terrain adaptation.", + ], + variants: [ + { + name: "Silver", + image: "/cdn/img/product/[size]/AU-01-SI.webp", + sku: "AU-01-SI", + color: "#C0C0C0", // Silver + price: 1000, + }, + ], + }, + { + name: "SmartFarm Titan", + id: "AU-02", + category: "autonomous", + highlights: [ + "Advanced autopilot technology for precise farming operations.", + "Eco-friendly solar-assisted power system for sustainable use.", + "Intelligent AI for real-time field analysis and automated adjustments.", + ], + variants: [ + { + name: "Sunset Copper", + image: "/cdn/img/product/[size]/AU-02-OG.webp", + sku: "AU-02-OG", + color: "#dd5219", // Sunset Copper: + price: 4100, + }, + { + name: "Cosmic Sapphire", + image: "/cdn/img/product/[size]/AU-02-BL.webp", + sku: "AU-02-BL", + color: "#2A52BE", // Cosmic Sapphire: + price: 4000, + }, + { + name: "Verdant Shadow", + image: "/cdn/img/product/[size]/AU-02-GG.webp", + sku: "AU-02-GG", + color: "#005A04", + price: 4000, + }, + ], + }, + { + name: "FutureHarvest Navigator", + id: "AU-03", + category: "autonomous", + highlights: [ + "Autonomous navigation with sub-inch accuracy", + "Solar-enhanced hybrid powertrain for extended operation", + "Real-time crop and soil health analytics", + ], + variants: [ + { + name: "Turquoise Titan", + image: "/cdn/img/product/[size]/AU-03-TQ.webp", + sku: "AU-03-TQ", + color: "#169fb8", // Turquoise Titan: + price: 1600, + }, + { + name: "Majestic Violet", + image: "/cdn/img/product/[size]/AU-03-PL.webp", + sku: "AU-03-PL", + color: "#9B5FC0", // Majestic Violet: + price: 1700, + }, + { + name: "Scarlet Dynamo", + image: "/cdn/img/product/[size]/AU-03-RD.webp", + sku: "AU-03-RD", + color: "#FF2400", // Scarlet Dynamo: + price: 1900, + }, + { + name: "Sunbeam Yellow", + image: "/cdn/img/product/[size]/AU-03-YE.webp", + sku: "AU-03-YE", + color: "#faad00", // Sunbeam Yellow: + price: 1800, + }, + ], + }, + { + name: "Sapphire Sunworker 460R", + id: "AU-04", + category: "autonomous", + highlights: [ + "Next-generation autonomous guidance system for seamless operation", + "High-capacity energy storage for all-day work without recharge", + "Advanced analytics suite for precision soil and plant health management", + ], + variants: [ + { + name: "Ruby Red", + image: "/cdn/img/product/[size]/AU-04-RD.webp", + sku: "AU-04-RD", + color: "#9B111E", // Ruby Red: + price: 8700, + }, + { + name: "Midnight Onyx", + image: "/cdn/img/product/[size]/AU-04-BK.webp", + sku: "AU-04-BK", + color: "#353839", // Midnight Onyx: + price: 8500, + }, + ], + }, + { + name: "EcoGrow Crop Commander", + id: "AU-05", + category: "autonomous", + highlights: [ + "Ultra-precise field navigation technology", + "Dual-mode power system for maximum uptime", + "On-the-go field data analysis for smart farming decisions", + ], + variants: [ + { + name: "Zestful Horizon", + image: "/cdn/img/product/[size]/AU-05-ZH.webp", + sku: "AU-05-ZH", + color: "#FFA07A", // Zestful Horizon: + price: 3400, + }, + ], + }, + { + name: "FarmFleet Sovereign", + id: "AU-06", + category: "autonomous", + highlights: [ + "Robust all-terrain adaptability for diverse farm landscapes", + "High-efficiency energy matrix for longer field endurance", + "Integrated crop management system with advanced diagnostics", + ], + variants: [ + { + name: "Canary Zenith", + image: "/cdn/img/product/[size]/AU-06-CZ.webp", + sku: "AU-06-CZ", + color: "#FFD700", // Canary Zenith: + price: 2200, + }, + { + name: "Minted Jade", + color: "#628882", // Minted Jade: + image: "/cdn/img/product/[size]/AU-06-MT.webp", + sku: "AU-06-MT", + price: 2100, + }, + ], + }, + { + name: "Verde Voyager", + id: "AU-07", + category: "autonomous", + highlights: [ + "Adaptive drive system intelligently navigates through diverse field conditions", + "Clean energy operation with advanced solar battery technology", + "High-resolution field scanners for precise agronomy insights", + ], + variants: [ + { + name: "Glacial Mint", + image: "/cdn/img/product/[size]/AU-07-MT.webp", + sku: "AU-07-MT", + color: "#AFDBD2", // Glacial Mint: + price: 4000, + }, + { + name: "Sunbeam Yellow", + image: "/cdn/img/product/[size]/AU-07-YE.webp", + sku: "AU-07-YE", + color: "#FFDA03", // Sunbeam Yellow: + price: 5000, + }, + ], + }, + { + name: "Field Pioneer", + id: "AU-08", + category: "autonomous", + highlights: [ + "Automated field traversal with intelligent pathfinding algorithms", + "Eco-friendly electric motors paired with high-capacity batteries", + "Real-time environmental monitoring for optimal crop growth", + ], + variants: [ + { + name: "Polar White", + image: "/cdn/img/product/[size]/AU-08-WH.webp", + sku: "AU-08-WH", + color: "#E8E8E8", // Polar White: + price: 4500, + }, + ], + }, + { + name: "Heritage Workhorse", + id: "CL-01", + category: "classic", + highlights: [ + "Proven reliability with a touch of modern reliability enhancements", + "Robust construction equipped to withstand decades of labor", + "User-friendly operation with traditional manual controls", + ], + variants: [ + { + name: "Verdant Field", + image: "/cdn/img/product/[size]/CL-01-GR.webp", + sku: "CL-01-GR", + color: "#6B8E23", // Verdant Field: + price: 5700, + }, + { + name: "Stormy Sky", + image: "/cdn/img/product/[size]/CL-01-GY.webp", + sku: "CL-01-GY", + color: "#708090", // Stormy Sky: + price: 6200, + }, + ], + }, + { + name: "Falcon Crest Farm", + id: "CL-02", + category: "classic", + highlights: [ + "Rugged simplicity meets classic design", + "Built-to-last machinery for reliable fieldwork", + "Ease of control with straightforward mechanical systems", + ], + variants: [ + { + name: "Cerulean Classic", + image: "/cdn/img/product/[size]/CL-02-BL.webp", + sku: "CL-02-BL", + color: "#007BA7", // Cerulean Classic: + price: 2600, + }, + ], + }, + { + name: "Falcon Crest Work", + id: "CL-03", + category: "classic", + highlights: [ + "Vintage engineering with a legacy of durability", + "Powerful yet simple mechanics for easy operation and repair", + "Classic aesthetics with a robust body, built to last", + ], + variants: [ + { + name: "Meadow Green", + image: "/cdn/img/product/[size]/CL-03-GR.webp", + sku: "CL-03-GR", + color: "#7CFC00", // Meadow Green: + price: 2300, + }, + { + name: "Rustic Rose", + image: "/cdn/img/product/[size]/CL-03-PI.webp", + sku: "CL-03-PI", + color: "#b50018", // Rustic Rose: + price: 2300, + }, + { + name: "Harvest Gold", + image: "/cdn/img/product/[size]/CL-03-YE.webp", + sku: "CL-03-YE", + color: "#DA9100", // Harvest Gold: + price: 2300, + }, + ], + }, + { + name: "Broadfield Majestic", + id: "CL-04", + category: "classic", + highlights: [ + "Built with the robust heart of early industrial workhorses", + "Simplified mechanics for unparalleled ease of use and maintenance", + "A testament to early agricultural machinery with a dependable engine", + ], + variants: [ + { + name: "Oceanic Blue", + image: "/cdn/img/product/[size]/CL-04-BL.webp", + sku: "CL-04-BL", + color: "#0040a6", // Oceanic Blue: + price: 2200, + }, + { + name: "Rustic Crimson", + image: "/cdn/img/product/[size]/CL-04-RD.webp", + sku: "CL-04-RD", + color: "#7B3F00", // Rustic Crimson: + price: 2200, + }, + { + name: "Aqua Green", + image: "/cdn/img/product/[size]/CL-04-TQ.webp", + sku: "CL-04-TQ", + color: "#00b298", // Aqua Green: + price: 2200, + }, + ], + }, + { + name: "Countryside Commander", + id: "CL-05", + category: "classic", + highlights: [ + "Reliable performance with time-tested engineering", + "Rugged design for efficient operation across all types of terrain", + "Classic operator comfort with modern ergonomic enhancements", + ], + variants: [ + { + name: "Pacific Teal", + image: "/cdn/img/product/[size]/CL-05-PT.webp", + sku: "CL-05-PT", + color: "#479da8", // Pacific Teal: + price: 2700, + }, + { + name: "Barn Red", + image: "/cdn/img/product/[size]/CL-05-RD.webp", + sku: "CL-05-RD", + color: "#7C0A02", // Barn Red: + price: 2700, + }, + ], + }, + { + name: "Danamark Steadfast", + id: "CL-06", + category: "classic", + highlights: [ + "Engineered for the meticulous demands of Danish agriculture", + "Sturdy chassis and reliable mechanics for longevity", + "Utilitarian design with practical functionality and comfort", + ], + variants: [ + { + name: "Emerald Forest", + image: "/cdn/img/product/[size]/CL-06-MT.webp", + sku: "CL-06-MT", + color: "#46f5bb", // Emerald Forest: + price: 2800, + }, + { + name: "Golden Wheat", + image: "/cdn/img/product/[size]/CL-06-YE.webp", + sku: "CL-06-YE", + color: "#faaf3f", // Golden Wheat: + price: 2800, + }, + ], + }, + { + name: "Greenland Rover", + id: "CL-07", + category: "classic", + highlights: [ + "Engineered to tackle the diverse European terrain with ease", + "Sturdy and reliable mechanics known for their longevity", + "Ergonomically designed for comfort during long working hours", + ], + variants: [ + { + name: "Forest Fern", + image: "/cdn/img/product/[size]/CL-07-GR.webp", + sku: "CL-07-GR", + color: "#2ea250", // Forest Fern: + price: 2900, + }, + { + name: "Autumn Amber", + image: "/cdn/img/product/[size]/CL-07-YE.webp", + sku: "CL-07-YE", + color: "#FFBF00", // Autumn Amber: + price: 2900, + }, + ], + }, + { + name: "Holland Hamster", + id: "CL-08", + category: "classic", + highlights: [ + "Dutch craftsmanship for precision and quality", + "Optimized for tulip fields and versatile European landscapes", + "Ergonomic design with a focus on operator comfort and efficiency", + ], + variants: [ + { + name: "Polder Green", + image: "/cdn/img/product/[size]/CL-08-GR.webp", + sku: "CL-08-GR", + color: "#C2B280", // Polder Green: + price: 7750, + }, + { + name: "Tulip Magenta", + image: "/cdn/img/product/[size]/CL-08-PI.webp", + sku: "CL-08-PI", + color: "#D65282", // Tulip Magenta: + price: 7900, + }, + ], + }, + { + name: "TerraFirma Veneto", + id: "CL-09", + category: "classic", + highlights: [ + "Elegant Italian design with sleek lines and a vibrant aesthetic", + "Precision mechanics for vineyard and orchard maneuverability", + "Comfort-focused design with a flair for the dramatic", + ], + variants: [ + { + name: "Adriatic Blue", + image: "/cdn/img/product/[size]/CL-09-BL.webp", + sku: "CL-09-BL", + color: "#2f6ea3", // Adriatic Blue: + price: 2950, + }, + { + name: "Tuscan Green", + image: "/cdn/img/product/[size]/CL-09-GR.webp", + sku: "CL-09-GR", + color: "#518b2b", // Tuscan Green: + price: 2950, + }, + ], + }, + { + name: "Global Gallant", + id: "CL-10", + category: "classic", + highlights: [ + "Retro design with a nod to the golden era of farming", + "Engine robustness that stands the test of time", + "Functional simplicity for ease of operation in any region", + ], + variants: [ + { + name: "Sahara Dawn", + image: "/cdn/img/product/[size]/CL-10-SD.webp", + sku: "CL-10-SD", + color: "#b8a875", // Sahara Dawn: + price: 2600, + }, + { + name: "Violet Vintage", + image: "/cdn/img/product/[size]/CL-10-VI.webp", + sku: "CL-10-VI", + color: "#8A2BE2", // Violet Vintage: + price: 2600, + }, + ], + }, + { + name: "Scandinavia Sower", + id: "CL-11", + category: "classic", + highlights: [ + "Authentic Swedish engineering for optimal cold-climate performance", + "Sturdy build and mechanics for lifelong reliability", + "Iconic design reflecting the simplicity and efficiency of Scandinavian style", + ], + variants: [ + { + name: "Baltic Blue", + image: "/cdn/img/product/[size]/CL-11-SK.webp", + sku: "CL-11-SK", + color: "#95c1f4", // Baltic Blue: + price: 3100, + }, + { + name: "Nordic Gold", + image: "/cdn/img/product/[size]/CL-11-YE.webp", + sku: "CL-11-YE", + color: "#FFD700", // Nordic Gold: + price: 3100, + }, + ], + }, + { + name: "Celerity Cruiser", + id: "CL-12", + category: "classic", + highlights: [ + "A speedster in the classic tractor segment, unparalleled in quick task completion", + "Sleek design with aerodynamic contours for reduced drag", + "Enhanced gearbox for smooth acceleration and nimble handling", + ], + variants: [ + { + name: "Velocity Blue", + image: "/cdn/img/product/[size]/CL-12-BL.webp", + sku: "CL-12-BL", + color: "#1E90FF", // Velocity Blue: + price: 3200, + }, + { + name: "Rally Red", + image: "/cdn/img/product/[size]/CL-12-RD.webp", + sku: "CL-12-RD", + color: "#ED2939", // Rally Red: + price: 3200, + }, + ], + }, + { + name: "Rapid Racer", + id: "CL-13", + category: "classic", + highlights: [ + "Streamlined design for faster field operations", + "Optimized gear ratios for efficient power transmission", + "Advanced air flow system for superior engine cooling", + ], + variants: [ + { + name: "Speedway Blue", + image: "/cdn/img/product/[size]/CL-13-BL.webp", + sku: "CL-13-BL", + color: "#2679a6", // Speedway Blue: + price: 7500, + }, + { + name: "Raceway Red", + image: "/cdn/img/product/[size]/CL-13-RD.webp", + sku: "CL-13-RD", + color: "#CF1020", // Raceway Red: + price: 7500, + }, + ], + }, + { + name: "Caribbean Cruiser", + id: "CL-14", + category: "classic", + highlights: [ + "Robust construction for enduring performance", + "Time-tested design with a proven track record", + "Easy-to-service mechanics for long-term reliability", + ], + variants: [ + { + name: "Emerald Grove", + image: "/cdn/img/product/[size]/CL-14-GR.webp", + sku: "CL-14-GR", + color: "#57ae13", // Emerald Grove: + price: 2300, + }, + { + name: "Ruby Fields", + image: "/cdn/img/product/[size]/CL-14-RD.webp", + sku: "CL-14-RD", + color: "#cd2b1e", // Ruby Fields: + price: 2300, + }, + ], + }, + { + name: "Fieldmaster Classic", + id: "CL-15", + category: "classic", + highlights: [ + "Timeless design with a focus on comfort and control", + "Efficient fuel consumption with a powerful engine", + "Versatile functionality for all types of agricultural work", + ], + variants: [ + { + name: "Vintage Pink", + image: "/cdn/img/product/[size]/CL-15-PI.webp", + sku: "CL-15-PI", + color: "#e1949e", // Vintage Pink: + price: 6200, + }, + { + name: "Sahara Dust", + image: "/cdn/img/product/[size]/CL-15-SD.webp", + sku: "CL-15-SD", + color: "#dec78c", // Sahara Dust: + price: 6200, + }, + ], + }, +]; diff --git a/examples/hono-tractor-store-2.0/public/cdn/font/raleway-regular.woff2 b/examples/hono-tractor-store-2.0/public/cdn/font/raleway-regular.woff2 new file mode 100644 index 0000000..a763188 Binary files /dev/null and b/examples/hono-tractor-store-2.0/public/cdn/font/raleway-regular.woff2 differ diff --git a/examples/hono-tractor-store-2.0/public/cdn/img/logo.svg b/examples/hono-tractor-store-2.0/public/cdn/img/logo.svg new file mode 100644 index 0000000..cad2adc --- /dev/null +++ b/examples/hono-tractor-store-2.0/public/cdn/img/logo.svg @@ -0,0 +1,2 @@ + \ No newline at end of file diff --git a/examples/hono-tractor-store-2.0/public/cdn/img/meta/android-chrome-192x192.png b/examples/hono-tractor-store-2.0/public/cdn/img/meta/android-chrome-192x192.png new file mode 100644 index 0000000..a0ebdb7 Binary files /dev/null and b/examples/hono-tractor-store-2.0/public/cdn/img/meta/android-chrome-192x192.png differ diff --git a/examples/hono-tractor-store-2.0/public/cdn/img/meta/android-chrome-512x512.png b/examples/hono-tractor-store-2.0/public/cdn/img/meta/android-chrome-512x512.png new file mode 100644 index 0000000..8cf57e4 Binary files /dev/null and b/examples/hono-tractor-store-2.0/public/cdn/img/meta/android-chrome-512x512.png differ diff --git a/examples/hono-tractor-store-2.0/public/cdn/img/meta/apple-touch-icon.png b/examples/hono-tractor-store-2.0/public/cdn/img/meta/apple-touch-icon.png new file mode 100644 index 0000000..d6f9d4a Binary files /dev/null and b/examples/hono-tractor-store-2.0/public/cdn/img/meta/apple-touch-icon.png differ diff --git a/examples/hono-tractor-store-2.0/public/cdn/img/meta/browserconfig.xml b/examples/hono-tractor-store-2.0/public/cdn/img/meta/browserconfig.xml new file mode 100644 index 0000000..b8daf29 --- /dev/null +++ b/examples/hono-tractor-store-2.0/public/cdn/img/meta/browserconfig.xml @@ -0,0 +1,9 @@ + + + + + + #ffffff + + + diff --git a/examples/hono-tractor-store-2.0/public/cdn/img/meta/favicon-16x16.png b/examples/hono-tractor-store-2.0/public/cdn/img/meta/favicon-16x16.png new file mode 100644 index 0000000..ca1090d Binary files /dev/null and b/examples/hono-tractor-store-2.0/public/cdn/img/meta/favicon-16x16.png differ diff --git a/examples/hono-tractor-store-2.0/public/cdn/img/meta/favicon-32x32.png b/examples/hono-tractor-store-2.0/public/cdn/img/meta/favicon-32x32.png new file mode 100644 index 0000000..b427cb6 Binary files /dev/null and b/examples/hono-tractor-store-2.0/public/cdn/img/meta/favicon-32x32.png differ diff --git a/examples/hono-tractor-store-2.0/public/cdn/img/meta/favicon-source.svg b/examples/hono-tractor-store-2.0/public/cdn/img/meta/favicon-source.svg new file mode 100644 index 0000000..ff12be6 --- /dev/null +++ b/examples/hono-tractor-store-2.0/public/cdn/img/meta/favicon-source.svg @@ -0,0 +1,2 @@ + \ No newline at end of file diff --git a/examples/hono-tractor-store-2.0/public/cdn/img/meta/favicon.ico b/examples/hono-tractor-store-2.0/public/cdn/img/meta/favicon.ico new file mode 100644 index 0000000..b401540 Binary files /dev/null and b/examples/hono-tractor-store-2.0/public/cdn/img/meta/favicon.ico differ diff --git a/examples/hono-tractor-store-2.0/public/cdn/img/meta/mstile-144x144.png b/examples/hono-tractor-store-2.0/public/cdn/img/meta/mstile-144x144.png new file mode 100644 index 0000000..66a4fc7 Binary files /dev/null and b/examples/hono-tractor-store-2.0/public/cdn/img/meta/mstile-144x144.png differ diff --git a/examples/hono-tractor-store-2.0/public/cdn/img/meta/mstile-150x150.png b/examples/hono-tractor-store-2.0/public/cdn/img/meta/mstile-150x150.png new file mode 100644 index 0000000..52b4faf Binary files /dev/null and b/examples/hono-tractor-store-2.0/public/cdn/img/meta/mstile-150x150.png differ diff --git a/examples/hono-tractor-store-2.0/public/cdn/img/meta/mstile-310x150.png b/examples/hono-tractor-store-2.0/public/cdn/img/meta/mstile-310x150.png new file mode 100644 index 0000000..0ddabaf Binary files /dev/null and b/examples/hono-tractor-store-2.0/public/cdn/img/meta/mstile-310x150.png differ diff --git a/examples/hono-tractor-store-2.0/public/cdn/img/meta/mstile-310x310.png b/examples/hono-tractor-store-2.0/public/cdn/img/meta/mstile-310x310.png new file mode 100644 index 0000000..b596276 Binary files /dev/null and b/examples/hono-tractor-store-2.0/public/cdn/img/meta/mstile-310x310.png differ diff --git a/examples/hono-tractor-store-2.0/public/cdn/img/meta/mstile-70x70.png b/examples/hono-tractor-store-2.0/public/cdn/img/meta/mstile-70x70.png new file mode 100644 index 0000000..d56b7d1 Binary files /dev/null and b/examples/hono-tractor-store-2.0/public/cdn/img/meta/mstile-70x70.png differ diff --git a/examples/hono-tractor-store-2.0/public/cdn/img/meta/safari-pinned-tab.svg b/examples/hono-tractor-store-2.0/public/cdn/img/meta/safari-pinned-tab.svg new file mode 100644 index 0000000..ae59e3a --- /dev/null +++ b/examples/hono-tractor-store-2.0/public/cdn/img/meta/safari-pinned-tab.svg @@ -0,0 +1,36 @@ + + + + +Created by potrace 1.14, written by Peter Selinger 2001-2017 + + + + + diff --git a/examples/hono-tractor-store-2.0/public/cdn/img/meta/site.webmanifest b/examples/hono-tractor-store-2.0/public/cdn/img/meta/site.webmanifest new file mode 100644 index 0000000..c7edfc6 --- /dev/null +++ b/examples/hono-tractor-store-2.0/public/cdn/img/meta/site.webmanifest @@ -0,0 +1,19 @@ +{ + "name": "", + "short_name": "", + "icons": [ + { + "src": "/cdn/img/meta/android-chrome-192x192.png", + "sizes": "192x192", + "type": "image/png" + }, + { + "src": "/cdn/img/meta/android-chrome-512x512.png", + "sizes": "512x512", + "type": "image/png" + } + ], + "theme_color": "#ffffff", + "background_color": "#ffffff", + "display": "standalone" +} diff --git a/examples/hono-tractor-store-2.0/public/cdn/img/neulandlogo.svg b/examples/hono-tractor-store-2.0/public/cdn/img/neulandlogo.svg new file mode 100644 index 0000000..2a9509b --- /dev/null +++ b/examples/hono-tractor-store-2.0/public/cdn/img/neulandlogo.svg @@ -0,0 +1,2 @@ + \ No newline at end of file diff --git a/examples/hono-tractor-store-2.0/public/cdn/img/product/200/AU-01-GR.webp b/examples/hono-tractor-store-2.0/public/cdn/img/product/200/AU-01-GR.webp new file mode 100644 index 0000000..91be59a Binary files /dev/null and b/examples/hono-tractor-store-2.0/public/cdn/img/product/200/AU-01-GR.webp differ diff --git a/examples/hono-tractor-store-2.0/public/cdn/img/product/200/AU-01-SI.webp b/examples/hono-tractor-store-2.0/public/cdn/img/product/200/AU-01-SI.webp new file mode 100644 index 0000000..6dfdff5 Binary files /dev/null and b/examples/hono-tractor-store-2.0/public/cdn/img/product/200/AU-01-SI.webp differ diff --git a/examples/hono-tractor-store-2.0/public/cdn/img/product/200/AU-02-BL.webp b/examples/hono-tractor-store-2.0/public/cdn/img/product/200/AU-02-BL.webp new file mode 100644 index 0000000..9f6a034 Binary files /dev/null and b/examples/hono-tractor-store-2.0/public/cdn/img/product/200/AU-02-BL.webp differ diff --git a/examples/hono-tractor-store-2.0/public/cdn/img/product/200/AU-02-GG.webp b/examples/hono-tractor-store-2.0/public/cdn/img/product/200/AU-02-GG.webp new file mode 100644 index 0000000..52f9636 Binary files /dev/null and b/examples/hono-tractor-store-2.0/public/cdn/img/product/200/AU-02-GG.webp differ diff --git a/examples/hono-tractor-store-2.0/public/cdn/img/product/200/AU-02-OG.webp b/examples/hono-tractor-store-2.0/public/cdn/img/product/200/AU-02-OG.webp new file mode 100644 index 0000000..ea82951 Binary files /dev/null and b/examples/hono-tractor-store-2.0/public/cdn/img/product/200/AU-02-OG.webp differ diff --git a/examples/hono-tractor-store-2.0/public/cdn/img/product/200/AU-03-PL.webp b/examples/hono-tractor-store-2.0/public/cdn/img/product/200/AU-03-PL.webp new file mode 100644 index 0000000..7d5c14d Binary files /dev/null and b/examples/hono-tractor-store-2.0/public/cdn/img/product/200/AU-03-PL.webp differ diff --git a/examples/hono-tractor-store-2.0/public/cdn/img/product/200/AU-03-RD.webp b/examples/hono-tractor-store-2.0/public/cdn/img/product/200/AU-03-RD.webp new file mode 100644 index 0000000..bdd6a1c Binary files /dev/null and b/examples/hono-tractor-store-2.0/public/cdn/img/product/200/AU-03-RD.webp differ diff --git a/examples/hono-tractor-store-2.0/public/cdn/img/product/200/AU-03-TQ.webp b/examples/hono-tractor-store-2.0/public/cdn/img/product/200/AU-03-TQ.webp new file mode 100644 index 0000000..92aa199 Binary files /dev/null and b/examples/hono-tractor-store-2.0/public/cdn/img/product/200/AU-03-TQ.webp differ diff --git a/examples/hono-tractor-store-2.0/public/cdn/img/product/200/AU-03-YE.webp b/examples/hono-tractor-store-2.0/public/cdn/img/product/200/AU-03-YE.webp new file mode 100644 index 0000000..c2ea8bb Binary files /dev/null and b/examples/hono-tractor-store-2.0/public/cdn/img/product/200/AU-03-YE.webp differ diff --git a/examples/hono-tractor-store-2.0/public/cdn/img/product/200/AU-04-BK.webp b/examples/hono-tractor-store-2.0/public/cdn/img/product/200/AU-04-BK.webp new file mode 100644 index 0000000..9af16d5 Binary files /dev/null and b/examples/hono-tractor-store-2.0/public/cdn/img/product/200/AU-04-BK.webp differ diff --git a/examples/hono-tractor-store-2.0/public/cdn/img/product/200/AU-04-RD.webp b/examples/hono-tractor-store-2.0/public/cdn/img/product/200/AU-04-RD.webp new file mode 100644 index 0000000..618181d Binary files /dev/null and b/examples/hono-tractor-store-2.0/public/cdn/img/product/200/AU-04-RD.webp differ diff --git a/examples/hono-tractor-store-2.0/public/cdn/img/product/200/AU-05-ZH.webp b/examples/hono-tractor-store-2.0/public/cdn/img/product/200/AU-05-ZH.webp new file mode 100644 index 0000000..7fb04cc Binary files /dev/null and b/examples/hono-tractor-store-2.0/public/cdn/img/product/200/AU-05-ZH.webp differ diff --git a/examples/hono-tractor-store-2.0/public/cdn/img/product/200/AU-06-CZ.webp b/examples/hono-tractor-store-2.0/public/cdn/img/product/200/AU-06-CZ.webp new file mode 100644 index 0000000..38d0448 Binary files /dev/null and b/examples/hono-tractor-store-2.0/public/cdn/img/product/200/AU-06-CZ.webp differ diff --git a/examples/hono-tractor-store-2.0/public/cdn/img/product/200/AU-06-MT.webp b/examples/hono-tractor-store-2.0/public/cdn/img/product/200/AU-06-MT.webp new file mode 100644 index 0000000..39c9ead Binary files /dev/null and b/examples/hono-tractor-store-2.0/public/cdn/img/product/200/AU-06-MT.webp differ diff --git a/examples/hono-tractor-store-2.0/public/cdn/img/product/200/AU-07-MT.webp b/examples/hono-tractor-store-2.0/public/cdn/img/product/200/AU-07-MT.webp new file mode 100644 index 0000000..054a427 Binary files /dev/null and b/examples/hono-tractor-store-2.0/public/cdn/img/product/200/AU-07-MT.webp differ diff --git a/examples/hono-tractor-store-2.0/public/cdn/img/product/200/AU-07-YE.webp b/examples/hono-tractor-store-2.0/public/cdn/img/product/200/AU-07-YE.webp new file mode 100644 index 0000000..1028c20 Binary files /dev/null and b/examples/hono-tractor-store-2.0/public/cdn/img/product/200/AU-07-YE.webp differ diff --git a/examples/hono-tractor-store-2.0/public/cdn/img/product/200/AU-08-WH.webp b/examples/hono-tractor-store-2.0/public/cdn/img/product/200/AU-08-WH.webp new file mode 100644 index 0000000..b14abc4 Binary files /dev/null and b/examples/hono-tractor-store-2.0/public/cdn/img/product/200/AU-08-WH.webp differ diff --git a/examples/hono-tractor-store-2.0/public/cdn/img/product/200/CL-01-GR.webp b/examples/hono-tractor-store-2.0/public/cdn/img/product/200/CL-01-GR.webp new file mode 100644 index 0000000..5801f03 Binary files /dev/null and b/examples/hono-tractor-store-2.0/public/cdn/img/product/200/CL-01-GR.webp differ diff --git a/examples/hono-tractor-store-2.0/public/cdn/img/product/200/CL-01-GY.webp b/examples/hono-tractor-store-2.0/public/cdn/img/product/200/CL-01-GY.webp new file mode 100644 index 0000000..776e1f3 Binary files /dev/null and b/examples/hono-tractor-store-2.0/public/cdn/img/product/200/CL-01-GY.webp differ diff --git a/examples/hono-tractor-store-2.0/public/cdn/img/product/200/CL-02-BL.webp b/examples/hono-tractor-store-2.0/public/cdn/img/product/200/CL-02-BL.webp new file mode 100644 index 0000000..699f1b0 Binary files /dev/null and b/examples/hono-tractor-store-2.0/public/cdn/img/product/200/CL-02-BL.webp differ diff --git a/examples/hono-tractor-store-2.0/public/cdn/img/product/200/CL-03-GR.webp b/examples/hono-tractor-store-2.0/public/cdn/img/product/200/CL-03-GR.webp new file mode 100644 index 0000000..70e8b43 Binary files /dev/null and b/examples/hono-tractor-store-2.0/public/cdn/img/product/200/CL-03-GR.webp differ diff --git a/examples/hono-tractor-store-2.0/public/cdn/img/product/200/CL-03-PI.webp b/examples/hono-tractor-store-2.0/public/cdn/img/product/200/CL-03-PI.webp new file mode 100644 index 0000000..971c793 Binary files /dev/null and b/examples/hono-tractor-store-2.0/public/cdn/img/product/200/CL-03-PI.webp differ diff --git a/examples/hono-tractor-store-2.0/public/cdn/img/product/200/CL-03-YE.webp b/examples/hono-tractor-store-2.0/public/cdn/img/product/200/CL-03-YE.webp new file mode 100644 index 0000000..cde5766 Binary files /dev/null and b/examples/hono-tractor-store-2.0/public/cdn/img/product/200/CL-03-YE.webp differ diff --git a/examples/hono-tractor-store-2.0/public/cdn/img/product/200/CL-04-BL.webp b/examples/hono-tractor-store-2.0/public/cdn/img/product/200/CL-04-BL.webp new file mode 100644 index 0000000..609796d Binary files /dev/null and b/examples/hono-tractor-store-2.0/public/cdn/img/product/200/CL-04-BL.webp differ diff --git a/examples/hono-tractor-store-2.0/public/cdn/img/product/200/CL-04-RD.webp b/examples/hono-tractor-store-2.0/public/cdn/img/product/200/CL-04-RD.webp new file mode 100644 index 0000000..c8bfb0a Binary files /dev/null and b/examples/hono-tractor-store-2.0/public/cdn/img/product/200/CL-04-RD.webp differ diff --git a/examples/hono-tractor-store-2.0/public/cdn/img/product/200/CL-04-TQ.webp b/examples/hono-tractor-store-2.0/public/cdn/img/product/200/CL-04-TQ.webp new file mode 100644 index 0000000..dfb67a4 Binary files /dev/null and b/examples/hono-tractor-store-2.0/public/cdn/img/product/200/CL-04-TQ.webp differ diff --git a/examples/hono-tractor-store-2.0/public/cdn/img/product/200/CL-05-PT.webp b/examples/hono-tractor-store-2.0/public/cdn/img/product/200/CL-05-PT.webp new file mode 100644 index 0000000..dbac479 Binary files /dev/null and b/examples/hono-tractor-store-2.0/public/cdn/img/product/200/CL-05-PT.webp differ diff --git a/examples/hono-tractor-store-2.0/public/cdn/img/product/200/CL-05-RD.webp b/examples/hono-tractor-store-2.0/public/cdn/img/product/200/CL-05-RD.webp new file mode 100644 index 0000000..4db2350 Binary files /dev/null and b/examples/hono-tractor-store-2.0/public/cdn/img/product/200/CL-05-RD.webp differ diff --git a/examples/hono-tractor-store-2.0/public/cdn/img/product/200/CL-06-MT.webp b/examples/hono-tractor-store-2.0/public/cdn/img/product/200/CL-06-MT.webp new file mode 100644 index 0000000..e00a8b2 Binary files /dev/null and b/examples/hono-tractor-store-2.0/public/cdn/img/product/200/CL-06-MT.webp differ diff --git a/examples/hono-tractor-store-2.0/public/cdn/img/product/200/CL-06-YE.webp b/examples/hono-tractor-store-2.0/public/cdn/img/product/200/CL-06-YE.webp new file mode 100644 index 0000000..251a9fb Binary files /dev/null and b/examples/hono-tractor-store-2.0/public/cdn/img/product/200/CL-06-YE.webp differ diff --git a/examples/hono-tractor-store-2.0/public/cdn/img/product/200/CL-07-GR.webp b/examples/hono-tractor-store-2.0/public/cdn/img/product/200/CL-07-GR.webp new file mode 100644 index 0000000..9954f11 Binary files /dev/null and b/examples/hono-tractor-store-2.0/public/cdn/img/product/200/CL-07-GR.webp differ diff --git a/examples/hono-tractor-store-2.0/public/cdn/img/product/200/CL-07-YE.webp b/examples/hono-tractor-store-2.0/public/cdn/img/product/200/CL-07-YE.webp new file mode 100644 index 0000000..52981bf Binary files /dev/null and b/examples/hono-tractor-store-2.0/public/cdn/img/product/200/CL-07-YE.webp differ diff --git a/examples/hono-tractor-store-2.0/public/cdn/img/product/200/CL-08-GR.webp b/examples/hono-tractor-store-2.0/public/cdn/img/product/200/CL-08-GR.webp new file mode 100644 index 0000000..09f8a91 Binary files /dev/null and b/examples/hono-tractor-store-2.0/public/cdn/img/product/200/CL-08-GR.webp differ diff --git a/examples/hono-tractor-store-2.0/public/cdn/img/product/200/CL-08-PI.webp b/examples/hono-tractor-store-2.0/public/cdn/img/product/200/CL-08-PI.webp new file mode 100644 index 0000000..1e08585 Binary files /dev/null and b/examples/hono-tractor-store-2.0/public/cdn/img/product/200/CL-08-PI.webp differ diff --git a/examples/hono-tractor-store-2.0/public/cdn/img/product/200/CL-09-BL.webp b/examples/hono-tractor-store-2.0/public/cdn/img/product/200/CL-09-BL.webp new file mode 100644 index 0000000..82d063a Binary files /dev/null and b/examples/hono-tractor-store-2.0/public/cdn/img/product/200/CL-09-BL.webp differ diff --git a/examples/hono-tractor-store-2.0/public/cdn/img/product/200/CL-09-GR.webp b/examples/hono-tractor-store-2.0/public/cdn/img/product/200/CL-09-GR.webp new file mode 100644 index 0000000..47cabac Binary files /dev/null and b/examples/hono-tractor-store-2.0/public/cdn/img/product/200/CL-09-GR.webp differ diff --git a/examples/hono-tractor-store-2.0/public/cdn/img/product/200/CL-10-SD.webp b/examples/hono-tractor-store-2.0/public/cdn/img/product/200/CL-10-SD.webp new file mode 100644 index 0000000..db3349a Binary files /dev/null and b/examples/hono-tractor-store-2.0/public/cdn/img/product/200/CL-10-SD.webp differ diff --git a/examples/hono-tractor-store-2.0/public/cdn/img/product/200/CL-10-VI.webp b/examples/hono-tractor-store-2.0/public/cdn/img/product/200/CL-10-VI.webp new file mode 100644 index 0000000..e0d530f Binary files /dev/null and b/examples/hono-tractor-store-2.0/public/cdn/img/product/200/CL-10-VI.webp differ diff --git a/examples/hono-tractor-store-2.0/public/cdn/img/product/200/CL-11-SK.webp b/examples/hono-tractor-store-2.0/public/cdn/img/product/200/CL-11-SK.webp new file mode 100644 index 0000000..a89e2f6 Binary files /dev/null and b/examples/hono-tractor-store-2.0/public/cdn/img/product/200/CL-11-SK.webp differ diff --git a/examples/hono-tractor-store-2.0/public/cdn/img/product/200/CL-11-YE.webp b/examples/hono-tractor-store-2.0/public/cdn/img/product/200/CL-11-YE.webp new file mode 100644 index 0000000..78594c3 Binary files /dev/null and b/examples/hono-tractor-store-2.0/public/cdn/img/product/200/CL-11-YE.webp differ diff --git a/examples/hono-tractor-store-2.0/public/cdn/img/product/200/CL-12-BL.webp b/examples/hono-tractor-store-2.0/public/cdn/img/product/200/CL-12-BL.webp new file mode 100644 index 0000000..4766f7c Binary files /dev/null and b/examples/hono-tractor-store-2.0/public/cdn/img/product/200/CL-12-BL.webp differ diff --git a/examples/hono-tractor-store-2.0/public/cdn/img/product/200/CL-12-RD.webp b/examples/hono-tractor-store-2.0/public/cdn/img/product/200/CL-12-RD.webp new file mode 100644 index 0000000..3cbf72a Binary files /dev/null and b/examples/hono-tractor-store-2.0/public/cdn/img/product/200/CL-12-RD.webp differ diff --git a/examples/hono-tractor-store-2.0/public/cdn/img/product/200/CL-13-BL.webp b/examples/hono-tractor-store-2.0/public/cdn/img/product/200/CL-13-BL.webp new file mode 100644 index 0000000..1838064 Binary files /dev/null and b/examples/hono-tractor-store-2.0/public/cdn/img/product/200/CL-13-BL.webp differ diff --git a/examples/hono-tractor-store-2.0/public/cdn/img/product/200/CL-13-RD.webp b/examples/hono-tractor-store-2.0/public/cdn/img/product/200/CL-13-RD.webp new file mode 100644 index 0000000..1ad055a Binary files /dev/null and b/examples/hono-tractor-store-2.0/public/cdn/img/product/200/CL-13-RD.webp differ diff --git a/examples/hono-tractor-store-2.0/public/cdn/img/product/200/CL-14-GR.webp b/examples/hono-tractor-store-2.0/public/cdn/img/product/200/CL-14-GR.webp new file mode 100644 index 0000000..d87d811 Binary files /dev/null and b/examples/hono-tractor-store-2.0/public/cdn/img/product/200/CL-14-GR.webp differ diff --git a/examples/hono-tractor-store-2.0/public/cdn/img/product/200/CL-14-RD.webp b/examples/hono-tractor-store-2.0/public/cdn/img/product/200/CL-14-RD.webp new file mode 100644 index 0000000..aea6fac Binary files /dev/null and b/examples/hono-tractor-store-2.0/public/cdn/img/product/200/CL-14-RD.webp differ diff --git a/examples/hono-tractor-store-2.0/public/cdn/img/product/200/CL-15-PI.webp b/examples/hono-tractor-store-2.0/public/cdn/img/product/200/CL-15-PI.webp new file mode 100644 index 0000000..a2db6ae Binary files /dev/null and b/examples/hono-tractor-store-2.0/public/cdn/img/product/200/CL-15-PI.webp differ diff --git a/examples/hono-tractor-store-2.0/public/cdn/img/product/200/CL-15-SD.webp b/examples/hono-tractor-store-2.0/public/cdn/img/product/200/CL-15-SD.webp new file mode 100644 index 0000000..4edc7be Binary files /dev/null and b/examples/hono-tractor-store-2.0/public/cdn/img/product/200/CL-15-SD.webp differ diff --git a/examples/hono-tractor-store-2.0/public/cdn/img/product/400/AU-01-GR.webp b/examples/hono-tractor-store-2.0/public/cdn/img/product/400/AU-01-GR.webp new file mode 100644 index 0000000..b8b61cf Binary files /dev/null and b/examples/hono-tractor-store-2.0/public/cdn/img/product/400/AU-01-GR.webp differ diff --git a/examples/hono-tractor-store-2.0/public/cdn/img/product/400/AU-01-SI.webp b/examples/hono-tractor-store-2.0/public/cdn/img/product/400/AU-01-SI.webp new file mode 100644 index 0000000..5c6dcde Binary files /dev/null and b/examples/hono-tractor-store-2.0/public/cdn/img/product/400/AU-01-SI.webp differ diff --git a/examples/hono-tractor-store-2.0/public/cdn/img/product/400/AU-02-BL.webp b/examples/hono-tractor-store-2.0/public/cdn/img/product/400/AU-02-BL.webp new file mode 100644 index 0000000..51f732b Binary files /dev/null and b/examples/hono-tractor-store-2.0/public/cdn/img/product/400/AU-02-BL.webp differ diff --git a/examples/hono-tractor-store-2.0/public/cdn/img/product/400/AU-02-GG.webp b/examples/hono-tractor-store-2.0/public/cdn/img/product/400/AU-02-GG.webp new file mode 100644 index 0000000..d81ba0c Binary files /dev/null and b/examples/hono-tractor-store-2.0/public/cdn/img/product/400/AU-02-GG.webp differ diff --git a/examples/hono-tractor-store-2.0/public/cdn/img/product/400/AU-02-OG.webp b/examples/hono-tractor-store-2.0/public/cdn/img/product/400/AU-02-OG.webp new file mode 100644 index 0000000..78dcfd6 Binary files /dev/null and b/examples/hono-tractor-store-2.0/public/cdn/img/product/400/AU-02-OG.webp differ diff --git a/examples/hono-tractor-store-2.0/public/cdn/img/product/400/AU-03-PL.webp b/examples/hono-tractor-store-2.0/public/cdn/img/product/400/AU-03-PL.webp new file mode 100644 index 0000000..2d42eb1 Binary files /dev/null and b/examples/hono-tractor-store-2.0/public/cdn/img/product/400/AU-03-PL.webp differ diff --git a/examples/hono-tractor-store-2.0/public/cdn/img/product/400/AU-03-RD.webp b/examples/hono-tractor-store-2.0/public/cdn/img/product/400/AU-03-RD.webp new file mode 100644 index 0000000..689db93 Binary files /dev/null and b/examples/hono-tractor-store-2.0/public/cdn/img/product/400/AU-03-RD.webp differ diff --git a/examples/hono-tractor-store-2.0/public/cdn/img/product/400/AU-03-TQ.webp b/examples/hono-tractor-store-2.0/public/cdn/img/product/400/AU-03-TQ.webp new file mode 100644 index 0000000..04cd557 Binary files /dev/null and b/examples/hono-tractor-store-2.0/public/cdn/img/product/400/AU-03-TQ.webp differ diff --git a/examples/hono-tractor-store-2.0/public/cdn/img/product/400/AU-03-YE.webp b/examples/hono-tractor-store-2.0/public/cdn/img/product/400/AU-03-YE.webp new file mode 100644 index 0000000..55ff939 Binary files /dev/null and b/examples/hono-tractor-store-2.0/public/cdn/img/product/400/AU-03-YE.webp differ diff --git a/examples/hono-tractor-store-2.0/public/cdn/img/product/400/AU-04-BK.webp b/examples/hono-tractor-store-2.0/public/cdn/img/product/400/AU-04-BK.webp new file mode 100644 index 0000000..9a969c4 Binary files /dev/null and b/examples/hono-tractor-store-2.0/public/cdn/img/product/400/AU-04-BK.webp differ diff --git a/examples/hono-tractor-store-2.0/public/cdn/img/product/400/AU-04-RD.webp b/examples/hono-tractor-store-2.0/public/cdn/img/product/400/AU-04-RD.webp new file mode 100644 index 0000000..bdcdcbe Binary files /dev/null and b/examples/hono-tractor-store-2.0/public/cdn/img/product/400/AU-04-RD.webp differ diff --git a/examples/hono-tractor-store-2.0/public/cdn/img/product/400/AU-05-ZH.webp b/examples/hono-tractor-store-2.0/public/cdn/img/product/400/AU-05-ZH.webp new file mode 100644 index 0000000..f7e9928 Binary files /dev/null and b/examples/hono-tractor-store-2.0/public/cdn/img/product/400/AU-05-ZH.webp differ diff --git a/examples/hono-tractor-store-2.0/public/cdn/img/product/400/AU-06-CZ.webp b/examples/hono-tractor-store-2.0/public/cdn/img/product/400/AU-06-CZ.webp new file mode 100644 index 0000000..83f0496 Binary files /dev/null and b/examples/hono-tractor-store-2.0/public/cdn/img/product/400/AU-06-CZ.webp differ diff --git a/examples/hono-tractor-store-2.0/public/cdn/img/product/400/AU-06-MT.webp b/examples/hono-tractor-store-2.0/public/cdn/img/product/400/AU-06-MT.webp new file mode 100644 index 0000000..5d1b95b Binary files /dev/null and b/examples/hono-tractor-store-2.0/public/cdn/img/product/400/AU-06-MT.webp differ diff --git a/examples/hono-tractor-store-2.0/public/cdn/img/product/400/AU-07-MT.webp b/examples/hono-tractor-store-2.0/public/cdn/img/product/400/AU-07-MT.webp new file mode 100644 index 0000000..8ac3283 Binary files /dev/null and b/examples/hono-tractor-store-2.0/public/cdn/img/product/400/AU-07-MT.webp differ diff --git a/examples/hono-tractor-store-2.0/public/cdn/img/product/400/AU-07-YE.webp b/examples/hono-tractor-store-2.0/public/cdn/img/product/400/AU-07-YE.webp new file mode 100644 index 0000000..19e02a3 Binary files /dev/null and b/examples/hono-tractor-store-2.0/public/cdn/img/product/400/AU-07-YE.webp differ diff --git a/examples/hono-tractor-store-2.0/public/cdn/img/product/400/AU-08-WH.webp b/examples/hono-tractor-store-2.0/public/cdn/img/product/400/AU-08-WH.webp new file mode 100644 index 0000000..accfa82 Binary files /dev/null and b/examples/hono-tractor-store-2.0/public/cdn/img/product/400/AU-08-WH.webp differ diff --git a/examples/hono-tractor-store-2.0/public/cdn/img/product/400/CL-01-GR.webp b/examples/hono-tractor-store-2.0/public/cdn/img/product/400/CL-01-GR.webp new file mode 100644 index 0000000..b7c45c7 Binary files /dev/null and b/examples/hono-tractor-store-2.0/public/cdn/img/product/400/CL-01-GR.webp differ diff --git a/examples/hono-tractor-store-2.0/public/cdn/img/product/400/CL-01-GY.webp b/examples/hono-tractor-store-2.0/public/cdn/img/product/400/CL-01-GY.webp new file mode 100644 index 0000000..83360d4 Binary files /dev/null and b/examples/hono-tractor-store-2.0/public/cdn/img/product/400/CL-01-GY.webp differ diff --git a/examples/hono-tractor-store-2.0/public/cdn/img/product/400/CL-02-BL.webp b/examples/hono-tractor-store-2.0/public/cdn/img/product/400/CL-02-BL.webp new file mode 100644 index 0000000..d02c199 Binary files /dev/null and b/examples/hono-tractor-store-2.0/public/cdn/img/product/400/CL-02-BL.webp differ diff --git a/examples/hono-tractor-store-2.0/public/cdn/img/product/400/CL-03-GR.webp b/examples/hono-tractor-store-2.0/public/cdn/img/product/400/CL-03-GR.webp new file mode 100644 index 0000000..e4fa712 Binary files /dev/null and b/examples/hono-tractor-store-2.0/public/cdn/img/product/400/CL-03-GR.webp differ diff --git a/examples/hono-tractor-store-2.0/public/cdn/img/product/400/CL-03-PI.webp b/examples/hono-tractor-store-2.0/public/cdn/img/product/400/CL-03-PI.webp new file mode 100644 index 0000000..5c9b307 Binary files /dev/null and b/examples/hono-tractor-store-2.0/public/cdn/img/product/400/CL-03-PI.webp differ diff --git a/examples/hono-tractor-store-2.0/public/cdn/img/product/400/CL-03-YE.webp b/examples/hono-tractor-store-2.0/public/cdn/img/product/400/CL-03-YE.webp new file mode 100644 index 0000000..178a0eb Binary files /dev/null and b/examples/hono-tractor-store-2.0/public/cdn/img/product/400/CL-03-YE.webp differ diff --git a/examples/hono-tractor-store-2.0/public/cdn/img/product/400/CL-04-BL.webp b/examples/hono-tractor-store-2.0/public/cdn/img/product/400/CL-04-BL.webp new file mode 100644 index 0000000..476b30d Binary files /dev/null and b/examples/hono-tractor-store-2.0/public/cdn/img/product/400/CL-04-BL.webp differ diff --git a/examples/hono-tractor-store-2.0/public/cdn/img/product/400/CL-04-RD.webp b/examples/hono-tractor-store-2.0/public/cdn/img/product/400/CL-04-RD.webp new file mode 100644 index 0000000..ec5cbfc Binary files /dev/null and b/examples/hono-tractor-store-2.0/public/cdn/img/product/400/CL-04-RD.webp differ diff --git a/examples/hono-tractor-store-2.0/public/cdn/img/product/400/CL-04-TQ.webp b/examples/hono-tractor-store-2.0/public/cdn/img/product/400/CL-04-TQ.webp new file mode 100644 index 0000000..a05a8ea Binary files /dev/null and b/examples/hono-tractor-store-2.0/public/cdn/img/product/400/CL-04-TQ.webp differ diff --git a/examples/hono-tractor-store-2.0/public/cdn/img/product/400/CL-05-PT.webp b/examples/hono-tractor-store-2.0/public/cdn/img/product/400/CL-05-PT.webp new file mode 100644 index 0000000..8a1e2e4 Binary files /dev/null and b/examples/hono-tractor-store-2.0/public/cdn/img/product/400/CL-05-PT.webp differ diff --git a/examples/hono-tractor-store-2.0/public/cdn/img/product/400/CL-05-RD.webp b/examples/hono-tractor-store-2.0/public/cdn/img/product/400/CL-05-RD.webp new file mode 100644 index 0000000..d5661c0 Binary files /dev/null and b/examples/hono-tractor-store-2.0/public/cdn/img/product/400/CL-05-RD.webp differ diff --git a/examples/hono-tractor-store-2.0/public/cdn/img/product/400/CL-06-MT.webp b/examples/hono-tractor-store-2.0/public/cdn/img/product/400/CL-06-MT.webp new file mode 100644 index 0000000..cd02b1f Binary files /dev/null and b/examples/hono-tractor-store-2.0/public/cdn/img/product/400/CL-06-MT.webp differ diff --git a/examples/hono-tractor-store-2.0/public/cdn/img/product/400/CL-06-YE.webp b/examples/hono-tractor-store-2.0/public/cdn/img/product/400/CL-06-YE.webp new file mode 100644 index 0000000..73d3030 Binary files /dev/null and b/examples/hono-tractor-store-2.0/public/cdn/img/product/400/CL-06-YE.webp differ diff --git a/examples/hono-tractor-store-2.0/public/cdn/img/product/400/CL-07-GR.webp b/examples/hono-tractor-store-2.0/public/cdn/img/product/400/CL-07-GR.webp new file mode 100644 index 0000000..65f597f Binary files /dev/null and b/examples/hono-tractor-store-2.0/public/cdn/img/product/400/CL-07-GR.webp differ diff --git a/examples/hono-tractor-store-2.0/public/cdn/img/product/400/CL-07-YE.webp b/examples/hono-tractor-store-2.0/public/cdn/img/product/400/CL-07-YE.webp new file mode 100644 index 0000000..001b805 Binary files /dev/null and b/examples/hono-tractor-store-2.0/public/cdn/img/product/400/CL-07-YE.webp differ diff --git a/examples/hono-tractor-store-2.0/public/cdn/img/product/400/CL-08-GR.webp b/examples/hono-tractor-store-2.0/public/cdn/img/product/400/CL-08-GR.webp new file mode 100644 index 0000000..486f3b9 Binary files /dev/null and b/examples/hono-tractor-store-2.0/public/cdn/img/product/400/CL-08-GR.webp differ diff --git a/examples/hono-tractor-store-2.0/public/cdn/img/product/400/CL-08-PI.webp b/examples/hono-tractor-store-2.0/public/cdn/img/product/400/CL-08-PI.webp new file mode 100644 index 0000000..8932b8f Binary files /dev/null and b/examples/hono-tractor-store-2.0/public/cdn/img/product/400/CL-08-PI.webp differ diff --git a/examples/hono-tractor-store-2.0/public/cdn/img/product/400/CL-09-BL.webp b/examples/hono-tractor-store-2.0/public/cdn/img/product/400/CL-09-BL.webp new file mode 100644 index 0000000..748818a Binary files /dev/null and b/examples/hono-tractor-store-2.0/public/cdn/img/product/400/CL-09-BL.webp differ diff --git a/examples/hono-tractor-store-2.0/public/cdn/img/product/400/CL-09-GR.webp b/examples/hono-tractor-store-2.0/public/cdn/img/product/400/CL-09-GR.webp new file mode 100644 index 0000000..edaba1a Binary files /dev/null and b/examples/hono-tractor-store-2.0/public/cdn/img/product/400/CL-09-GR.webp differ diff --git a/examples/hono-tractor-store-2.0/public/cdn/img/product/400/CL-10-SD.webp b/examples/hono-tractor-store-2.0/public/cdn/img/product/400/CL-10-SD.webp new file mode 100644 index 0000000..74cfa86 Binary files /dev/null and b/examples/hono-tractor-store-2.0/public/cdn/img/product/400/CL-10-SD.webp differ diff --git a/examples/hono-tractor-store-2.0/public/cdn/img/product/400/CL-10-VI.webp b/examples/hono-tractor-store-2.0/public/cdn/img/product/400/CL-10-VI.webp new file mode 100644 index 0000000..3dd982a Binary files /dev/null and b/examples/hono-tractor-store-2.0/public/cdn/img/product/400/CL-10-VI.webp differ diff --git a/examples/hono-tractor-store-2.0/public/cdn/img/product/400/CL-11-SK.webp b/examples/hono-tractor-store-2.0/public/cdn/img/product/400/CL-11-SK.webp new file mode 100644 index 0000000..90dddea Binary files /dev/null and b/examples/hono-tractor-store-2.0/public/cdn/img/product/400/CL-11-SK.webp differ diff --git a/examples/hono-tractor-store-2.0/public/cdn/img/product/400/CL-11-YE.webp b/examples/hono-tractor-store-2.0/public/cdn/img/product/400/CL-11-YE.webp new file mode 100644 index 0000000..5ff1f0a Binary files /dev/null and b/examples/hono-tractor-store-2.0/public/cdn/img/product/400/CL-11-YE.webp differ diff --git a/examples/hono-tractor-store-2.0/public/cdn/img/product/400/CL-12-BL.webp b/examples/hono-tractor-store-2.0/public/cdn/img/product/400/CL-12-BL.webp new file mode 100644 index 0000000..6c4a196 Binary files /dev/null and b/examples/hono-tractor-store-2.0/public/cdn/img/product/400/CL-12-BL.webp differ diff --git a/examples/hono-tractor-store-2.0/public/cdn/img/product/400/CL-12-RD.webp b/examples/hono-tractor-store-2.0/public/cdn/img/product/400/CL-12-RD.webp new file mode 100644 index 0000000..983be18 Binary files /dev/null and b/examples/hono-tractor-store-2.0/public/cdn/img/product/400/CL-12-RD.webp differ diff --git a/examples/hono-tractor-store-2.0/public/cdn/img/product/400/CL-13-BL.webp b/examples/hono-tractor-store-2.0/public/cdn/img/product/400/CL-13-BL.webp new file mode 100644 index 0000000..bfbe572 Binary files /dev/null and b/examples/hono-tractor-store-2.0/public/cdn/img/product/400/CL-13-BL.webp differ diff --git a/examples/hono-tractor-store-2.0/public/cdn/img/product/400/CL-13-RD.webp b/examples/hono-tractor-store-2.0/public/cdn/img/product/400/CL-13-RD.webp new file mode 100644 index 0000000..015fcfe Binary files /dev/null and b/examples/hono-tractor-store-2.0/public/cdn/img/product/400/CL-13-RD.webp differ diff --git a/examples/hono-tractor-store-2.0/public/cdn/img/product/400/CL-14-GR.webp b/examples/hono-tractor-store-2.0/public/cdn/img/product/400/CL-14-GR.webp new file mode 100644 index 0000000..78fcf3a Binary files /dev/null and b/examples/hono-tractor-store-2.0/public/cdn/img/product/400/CL-14-GR.webp differ diff --git a/examples/hono-tractor-store-2.0/public/cdn/img/product/400/CL-14-RD.webp b/examples/hono-tractor-store-2.0/public/cdn/img/product/400/CL-14-RD.webp new file mode 100644 index 0000000..b68f5c7 Binary files /dev/null and b/examples/hono-tractor-store-2.0/public/cdn/img/product/400/CL-14-RD.webp differ diff --git a/examples/hono-tractor-store-2.0/public/cdn/img/product/400/CL-15-PI.webp b/examples/hono-tractor-store-2.0/public/cdn/img/product/400/CL-15-PI.webp new file mode 100644 index 0000000..9921048 Binary files /dev/null and b/examples/hono-tractor-store-2.0/public/cdn/img/product/400/CL-15-PI.webp differ diff --git a/examples/hono-tractor-store-2.0/public/cdn/img/product/400/CL-15-SD.webp b/examples/hono-tractor-store-2.0/public/cdn/img/product/400/CL-15-SD.webp new file mode 100644 index 0000000..e98e8a1 Binary files /dev/null and b/examples/hono-tractor-store-2.0/public/cdn/img/product/400/CL-15-SD.webp differ diff --git a/examples/hono-tractor-store-2.0/public/cdn/img/product/800/AU-01-GR.webp b/examples/hono-tractor-store-2.0/public/cdn/img/product/800/AU-01-GR.webp new file mode 100644 index 0000000..791898b Binary files /dev/null and b/examples/hono-tractor-store-2.0/public/cdn/img/product/800/AU-01-GR.webp differ diff --git a/examples/hono-tractor-store-2.0/public/cdn/img/product/800/AU-01-SI.webp b/examples/hono-tractor-store-2.0/public/cdn/img/product/800/AU-01-SI.webp new file mode 100644 index 0000000..e058ea1 Binary files /dev/null and b/examples/hono-tractor-store-2.0/public/cdn/img/product/800/AU-01-SI.webp differ diff --git a/examples/hono-tractor-store-2.0/public/cdn/img/product/800/AU-02-BL.webp b/examples/hono-tractor-store-2.0/public/cdn/img/product/800/AU-02-BL.webp new file mode 100644 index 0000000..6036dcc Binary files /dev/null and b/examples/hono-tractor-store-2.0/public/cdn/img/product/800/AU-02-BL.webp differ diff --git a/examples/hono-tractor-store-2.0/public/cdn/img/product/800/AU-02-GG.webp b/examples/hono-tractor-store-2.0/public/cdn/img/product/800/AU-02-GG.webp new file mode 100644 index 0000000..d0817ee Binary files /dev/null and b/examples/hono-tractor-store-2.0/public/cdn/img/product/800/AU-02-GG.webp differ diff --git a/examples/hono-tractor-store-2.0/public/cdn/img/product/800/AU-02-OG.webp b/examples/hono-tractor-store-2.0/public/cdn/img/product/800/AU-02-OG.webp new file mode 100644 index 0000000..098fe58 Binary files /dev/null and b/examples/hono-tractor-store-2.0/public/cdn/img/product/800/AU-02-OG.webp differ diff --git a/examples/hono-tractor-store-2.0/public/cdn/img/product/800/AU-03-PL.webp b/examples/hono-tractor-store-2.0/public/cdn/img/product/800/AU-03-PL.webp new file mode 100644 index 0000000..fe403b7 Binary files /dev/null and b/examples/hono-tractor-store-2.0/public/cdn/img/product/800/AU-03-PL.webp differ diff --git a/examples/hono-tractor-store-2.0/public/cdn/img/product/800/AU-03-RD.webp b/examples/hono-tractor-store-2.0/public/cdn/img/product/800/AU-03-RD.webp new file mode 100644 index 0000000..e9f26b9 Binary files /dev/null and b/examples/hono-tractor-store-2.0/public/cdn/img/product/800/AU-03-RD.webp differ diff --git a/examples/hono-tractor-store-2.0/public/cdn/img/product/800/AU-03-TQ.webp b/examples/hono-tractor-store-2.0/public/cdn/img/product/800/AU-03-TQ.webp new file mode 100644 index 0000000..5c98ad1 Binary files /dev/null and b/examples/hono-tractor-store-2.0/public/cdn/img/product/800/AU-03-TQ.webp differ diff --git a/examples/hono-tractor-store-2.0/public/cdn/img/product/800/AU-03-YE.webp b/examples/hono-tractor-store-2.0/public/cdn/img/product/800/AU-03-YE.webp new file mode 100644 index 0000000..ba02ae0 Binary files /dev/null and b/examples/hono-tractor-store-2.0/public/cdn/img/product/800/AU-03-YE.webp differ diff --git a/examples/hono-tractor-store-2.0/public/cdn/img/product/800/AU-04-BK.webp b/examples/hono-tractor-store-2.0/public/cdn/img/product/800/AU-04-BK.webp new file mode 100644 index 0000000..3cd129f Binary files /dev/null and b/examples/hono-tractor-store-2.0/public/cdn/img/product/800/AU-04-BK.webp differ diff --git a/examples/hono-tractor-store-2.0/public/cdn/img/product/800/AU-04-RD.webp b/examples/hono-tractor-store-2.0/public/cdn/img/product/800/AU-04-RD.webp new file mode 100644 index 0000000..959d261 Binary files /dev/null and b/examples/hono-tractor-store-2.0/public/cdn/img/product/800/AU-04-RD.webp differ diff --git a/examples/hono-tractor-store-2.0/public/cdn/img/product/800/AU-05-ZH.webp b/examples/hono-tractor-store-2.0/public/cdn/img/product/800/AU-05-ZH.webp new file mode 100644 index 0000000..0da7558 Binary files /dev/null and b/examples/hono-tractor-store-2.0/public/cdn/img/product/800/AU-05-ZH.webp differ diff --git a/examples/hono-tractor-store-2.0/public/cdn/img/product/800/AU-06-CZ.webp b/examples/hono-tractor-store-2.0/public/cdn/img/product/800/AU-06-CZ.webp new file mode 100644 index 0000000..e3d853f Binary files /dev/null and b/examples/hono-tractor-store-2.0/public/cdn/img/product/800/AU-06-CZ.webp differ diff --git a/examples/hono-tractor-store-2.0/public/cdn/img/product/800/AU-06-MT.webp b/examples/hono-tractor-store-2.0/public/cdn/img/product/800/AU-06-MT.webp new file mode 100644 index 0000000..6727edb Binary files /dev/null and b/examples/hono-tractor-store-2.0/public/cdn/img/product/800/AU-06-MT.webp differ diff --git a/examples/hono-tractor-store-2.0/public/cdn/img/product/800/AU-07-MT.webp b/examples/hono-tractor-store-2.0/public/cdn/img/product/800/AU-07-MT.webp new file mode 100644 index 0000000..0fbca6a Binary files /dev/null and b/examples/hono-tractor-store-2.0/public/cdn/img/product/800/AU-07-MT.webp differ diff --git a/examples/hono-tractor-store-2.0/public/cdn/img/product/800/AU-07-YE.webp b/examples/hono-tractor-store-2.0/public/cdn/img/product/800/AU-07-YE.webp new file mode 100644 index 0000000..1d760e6 Binary files /dev/null and b/examples/hono-tractor-store-2.0/public/cdn/img/product/800/AU-07-YE.webp differ diff --git a/examples/hono-tractor-store-2.0/public/cdn/img/product/800/AU-08-WH.webp b/examples/hono-tractor-store-2.0/public/cdn/img/product/800/AU-08-WH.webp new file mode 100644 index 0000000..5b6505c Binary files /dev/null and b/examples/hono-tractor-store-2.0/public/cdn/img/product/800/AU-08-WH.webp differ diff --git a/examples/hono-tractor-store-2.0/public/cdn/img/product/800/CL-01-GR.webp b/examples/hono-tractor-store-2.0/public/cdn/img/product/800/CL-01-GR.webp new file mode 100644 index 0000000..40b153d Binary files /dev/null and b/examples/hono-tractor-store-2.0/public/cdn/img/product/800/CL-01-GR.webp differ diff --git a/examples/hono-tractor-store-2.0/public/cdn/img/product/800/CL-01-GY.webp b/examples/hono-tractor-store-2.0/public/cdn/img/product/800/CL-01-GY.webp new file mode 100644 index 0000000..3b7ffac Binary files /dev/null and b/examples/hono-tractor-store-2.0/public/cdn/img/product/800/CL-01-GY.webp differ diff --git a/examples/hono-tractor-store-2.0/public/cdn/img/product/800/CL-02-BL.webp b/examples/hono-tractor-store-2.0/public/cdn/img/product/800/CL-02-BL.webp new file mode 100644 index 0000000..de9fbe3 Binary files /dev/null and b/examples/hono-tractor-store-2.0/public/cdn/img/product/800/CL-02-BL.webp differ diff --git a/examples/hono-tractor-store-2.0/public/cdn/img/product/800/CL-03-GR.webp b/examples/hono-tractor-store-2.0/public/cdn/img/product/800/CL-03-GR.webp new file mode 100644 index 0000000..5c15682 Binary files /dev/null and b/examples/hono-tractor-store-2.0/public/cdn/img/product/800/CL-03-GR.webp differ diff --git a/examples/hono-tractor-store-2.0/public/cdn/img/product/800/CL-03-PI.webp b/examples/hono-tractor-store-2.0/public/cdn/img/product/800/CL-03-PI.webp new file mode 100644 index 0000000..ee5c9af Binary files /dev/null and b/examples/hono-tractor-store-2.0/public/cdn/img/product/800/CL-03-PI.webp differ diff --git a/examples/hono-tractor-store-2.0/public/cdn/img/product/800/CL-03-YE.webp b/examples/hono-tractor-store-2.0/public/cdn/img/product/800/CL-03-YE.webp new file mode 100644 index 0000000..710c0da Binary files /dev/null and b/examples/hono-tractor-store-2.0/public/cdn/img/product/800/CL-03-YE.webp differ diff --git a/examples/hono-tractor-store-2.0/public/cdn/img/product/800/CL-04-BL.webp b/examples/hono-tractor-store-2.0/public/cdn/img/product/800/CL-04-BL.webp new file mode 100644 index 0000000..14c1e22 Binary files /dev/null and b/examples/hono-tractor-store-2.0/public/cdn/img/product/800/CL-04-BL.webp differ diff --git a/examples/hono-tractor-store-2.0/public/cdn/img/product/800/CL-04-RD.webp b/examples/hono-tractor-store-2.0/public/cdn/img/product/800/CL-04-RD.webp new file mode 100644 index 0000000..e28584f Binary files /dev/null and b/examples/hono-tractor-store-2.0/public/cdn/img/product/800/CL-04-RD.webp differ diff --git a/examples/hono-tractor-store-2.0/public/cdn/img/product/800/CL-04-TQ.webp b/examples/hono-tractor-store-2.0/public/cdn/img/product/800/CL-04-TQ.webp new file mode 100644 index 0000000..14a7937 Binary files /dev/null and b/examples/hono-tractor-store-2.0/public/cdn/img/product/800/CL-04-TQ.webp differ diff --git a/examples/hono-tractor-store-2.0/public/cdn/img/product/800/CL-05-PT.webp b/examples/hono-tractor-store-2.0/public/cdn/img/product/800/CL-05-PT.webp new file mode 100644 index 0000000..15b6f20 Binary files /dev/null and b/examples/hono-tractor-store-2.0/public/cdn/img/product/800/CL-05-PT.webp differ diff --git a/examples/hono-tractor-store-2.0/public/cdn/img/product/800/CL-05-RD.webp b/examples/hono-tractor-store-2.0/public/cdn/img/product/800/CL-05-RD.webp new file mode 100644 index 0000000..9a825d8 Binary files /dev/null and b/examples/hono-tractor-store-2.0/public/cdn/img/product/800/CL-05-RD.webp differ diff --git a/examples/hono-tractor-store-2.0/public/cdn/img/product/800/CL-06-MT.webp b/examples/hono-tractor-store-2.0/public/cdn/img/product/800/CL-06-MT.webp new file mode 100644 index 0000000..57a2cad Binary files /dev/null and b/examples/hono-tractor-store-2.0/public/cdn/img/product/800/CL-06-MT.webp differ diff --git a/examples/hono-tractor-store-2.0/public/cdn/img/product/800/CL-06-YE.webp b/examples/hono-tractor-store-2.0/public/cdn/img/product/800/CL-06-YE.webp new file mode 100644 index 0000000..068620c Binary files /dev/null and b/examples/hono-tractor-store-2.0/public/cdn/img/product/800/CL-06-YE.webp differ diff --git a/examples/hono-tractor-store-2.0/public/cdn/img/product/800/CL-07-GR.webp b/examples/hono-tractor-store-2.0/public/cdn/img/product/800/CL-07-GR.webp new file mode 100644 index 0000000..1b229f6 Binary files /dev/null and b/examples/hono-tractor-store-2.0/public/cdn/img/product/800/CL-07-GR.webp differ diff --git a/examples/hono-tractor-store-2.0/public/cdn/img/product/800/CL-07-YE.webp b/examples/hono-tractor-store-2.0/public/cdn/img/product/800/CL-07-YE.webp new file mode 100644 index 0000000..5f0a803 Binary files /dev/null and b/examples/hono-tractor-store-2.0/public/cdn/img/product/800/CL-07-YE.webp differ diff --git a/examples/hono-tractor-store-2.0/public/cdn/img/product/800/CL-08-GR.webp b/examples/hono-tractor-store-2.0/public/cdn/img/product/800/CL-08-GR.webp new file mode 100644 index 0000000..8bb0947 Binary files /dev/null and b/examples/hono-tractor-store-2.0/public/cdn/img/product/800/CL-08-GR.webp differ diff --git a/examples/hono-tractor-store-2.0/public/cdn/img/product/800/CL-08-PI.webp b/examples/hono-tractor-store-2.0/public/cdn/img/product/800/CL-08-PI.webp new file mode 100644 index 0000000..2d72e73 Binary files /dev/null and b/examples/hono-tractor-store-2.0/public/cdn/img/product/800/CL-08-PI.webp differ diff --git a/examples/hono-tractor-store-2.0/public/cdn/img/product/800/CL-09-BL.webp b/examples/hono-tractor-store-2.0/public/cdn/img/product/800/CL-09-BL.webp new file mode 100644 index 0000000..9b4d22b Binary files /dev/null and b/examples/hono-tractor-store-2.0/public/cdn/img/product/800/CL-09-BL.webp differ diff --git a/examples/hono-tractor-store-2.0/public/cdn/img/product/800/CL-09-GR.webp b/examples/hono-tractor-store-2.0/public/cdn/img/product/800/CL-09-GR.webp new file mode 100644 index 0000000..22617f0 Binary files /dev/null and b/examples/hono-tractor-store-2.0/public/cdn/img/product/800/CL-09-GR.webp differ diff --git a/examples/hono-tractor-store-2.0/public/cdn/img/product/800/CL-10-SD.webp b/examples/hono-tractor-store-2.0/public/cdn/img/product/800/CL-10-SD.webp new file mode 100644 index 0000000..6393dec Binary files /dev/null and b/examples/hono-tractor-store-2.0/public/cdn/img/product/800/CL-10-SD.webp differ diff --git a/examples/hono-tractor-store-2.0/public/cdn/img/product/800/CL-10-VI.webp b/examples/hono-tractor-store-2.0/public/cdn/img/product/800/CL-10-VI.webp new file mode 100644 index 0000000..cd83e6a Binary files /dev/null and b/examples/hono-tractor-store-2.0/public/cdn/img/product/800/CL-10-VI.webp differ diff --git a/examples/hono-tractor-store-2.0/public/cdn/img/product/800/CL-11-SK.webp b/examples/hono-tractor-store-2.0/public/cdn/img/product/800/CL-11-SK.webp new file mode 100644 index 0000000..8480d9c Binary files /dev/null and b/examples/hono-tractor-store-2.0/public/cdn/img/product/800/CL-11-SK.webp differ diff --git a/examples/hono-tractor-store-2.0/public/cdn/img/product/800/CL-11-YE.webp b/examples/hono-tractor-store-2.0/public/cdn/img/product/800/CL-11-YE.webp new file mode 100644 index 0000000..98dc893 Binary files /dev/null and b/examples/hono-tractor-store-2.0/public/cdn/img/product/800/CL-11-YE.webp differ diff --git a/examples/hono-tractor-store-2.0/public/cdn/img/product/800/CL-12-BL.webp b/examples/hono-tractor-store-2.0/public/cdn/img/product/800/CL-12-BL.webp new file mode 100644 index 0000000..0b12d0d Binary files /dev/null and b/examples/hono-tractor-store-2.0/public/cdn/img/product/800/CL-12-BL.webp differ diff --git a/examples/hono-tractor-store-2.0/public/cdn/img/product/800/CL-12-RD.webp b/examples/hono-tractor-store-2.0/public/cdn/img/product/800/CL-12-RD.webp new file mode 100644 index 0000000..b97587d Binary files /dev/null and b/examples/hono-tractor-store-2.0/public/cdn/img/product/800/CL-12-RD.webp differ diff --git a/examples/hono-tractor-store-2.0/public/cdn/img/product/800/CL-13-BL.webp b/examples/hono-tractor-store-2.0/public/cdn/img/product/800/CL-13-BL.webp new file mode 100644 index 0000000..728e3ad Binary files /dev/null and b/examples/hono-tractor-store-2.0/public/cdn/img/product/800/CL-13-BL.webp differ diff --git a/examples/hono-tractor-store-2.0/public/cdn/img/product/800/CL-13-RD.webp b/examples/hono-tractor-store-2.0/public/cdn/img/product/800/CL-13-RD.webp new file mode 100644 index 0000000..0e7b09e Binary files /dev/null and b/examples/hono-tractor-store-2.0/public/cdn/img/product/800/CL-13-RD.webp differ diff --git a/examples/hono-tractor-store-2.0/public/cdn/img/product/800/CL-14-GR.webp b/examples/hono-tractor-store-2.0/public/cdn/img/product/800/CL-14-GR.webp new file mode 100644 index 0000000..aecdeab Binary files /dev/null and b/examples/hono-tractor-store-2.0/public/cdn/img/product/800/CL-14-GR.webp differ diff --git a/examples/hono-tractor-store-2.0/public/cdn/img/product/800/CL-14-RD.webp b/examples/hono-tractor-store-2.0/public/cdn/img/product/800/CL-14-RD.webp new file mode 100644 index 0000000..135cebd Binary files /dev/null and b/examples/hono-tractor-store-2.0/public/cdn/img/product/800/CL-14-RD.webp differ diff --git a/examples/hono-tractor-store-2.0/public/cdn/img/product/800/CL-15-PI.webp b/examples/hono-tractor-store-2.0/public/cdn/img/product/800/CL-15-PI.webp new file mode 100644 index 0000000..f8823dc Binary files /dev/null and b/examples/hono-tractor-store-2.0/public/cdn/img/product/800/CL-15-PI.webp differ diff --git a/examples/hono-tractor-store-2.0/public/cdn/img/product/800/CL-15-SD.webp b/examples/hono-tractor-store-2.0/public/cdn/img/product/800/CL-15-SD.webp new file mode 100644 index 0000000..7b65c04 Binary files /dev/null and b/examples/hono-tractor-store-2.0/public/cdn/img/product/800/CL-15-SD.webp differ diff --git a/examples/hono-tractor-store-2.0/public/cdn/img/product/convert.sh b/examples/hono-tractor-store-2.0/public/cdn/img/product/convert.sh new file mode 100755 index 0000000..c5afdbd --- /dev/null +++ b/examples/hono-tractor-store-2.0/public/cdn/img/product/convert.sh @@ -0,0 +1,28 @@ +#!/bin/bash + +# Directory containing the original PNG images +input_directory="./full" +# Array of target widths +declare -a sizes=(200 400 800) + +# Iterate through each file in the input directory +for file in "$input_directory"/*.png; do + # Extract filename without extension + filename=$(basename -- "$file") + filename="${filename%.*}" + + # Iterate through each size + for size in "${sizes[@]}"; do + # Create output directory if it doesn't exist + output_directory="./$size" + mkdir -p "$output_directory" + + # Define output filename + output_file="$output_directory/${filename}.webp" + + # Convert and resize the image + convert "$file" -resize "${size}x${size}" - | cwebp -m 6 -q 80 -o "$output_file" -- - + done +done + +echo "Conversion completed." diff --git a/examples/hono-tractor-store-2.0/public/cdn/img/product/full/AU-01-GR.png b/examples/hono-tractor-store-2.0/public/cdn/img/product/full/AU-01-GR.png new file mode 100644 index 0000000..520cfe8 Binary files /dev/null and b/examples/hono-tractor-store-2.0/public/cdn/img/product/full/AU-01-GR.png differ diff --git a/examples/hono-tractor-store-2.0/public/cdn/img/product/full/AU-01-SI.png b/examples/hono-tractor-store-2.0/public/cdn/img/product/full/AU-01-SI.png new file mode 100644 index 0000000..cec3aaf Binary files /dev/null and b/examples/hono-tractor-store-2.0/public/cdn/img/product/full/AU-01-SI.png differ diff --git a/examples/hono-tractor-store-2.0/public/cdn/img/product/full/AU-02-BL.png b/examples/hono-tractor-store-2.0/public/cdn/img/product/full/AU-02-BL.png new file mode 100644 index 0000000..3a5b005 Binary files /dev/null and b/examples/hono-tractor-store-2.0/public/cdn/img/product/full/AU-02-BL.png differ diff --git a/examples/hono-tractor-store-2.0/public/cdn/img/product/full/AU-02-GG.png b/examples/hono-tractor-store-2.0/public/cdn/img/product/full/AU-02-GG.png new file mode 100644 index 0000000..c0d829e Binary files /dev/null and b/examples/hono-tractor-store-2.0/public/cdn/img/product/full/AU-02-GG.png differ diff --git a/examples/hono-tractor-store-2.0/public/cdn/img/product/full/AU-02-OG.png b/examples/hono-tractor-store-2.0/public/cdn/img/product/full/AU-02-OG.png new file mode 100644 index 0000000..6607adf Binary files /dev/null and b/examples/hono-tractor-store-2.0/public/cdn/img/product/full/AU-02-OG.png differ diff --git a/examples/hono-tractor-store-2.0/public/cdn/img/product/full/AU-03-PL.png b/examples/hono-tractor-store-2.0/public/cdn/img/product/full/AU-03-PL.png new file mode 100644 index 0000000..6f2a934 Binary files /dev/null and b/examples/hono-tractor-store-2.0/public/cdn/img/product/full/AU-03-PL.png differ diff --git a/examples/hono-tractor-store-2.0/public/cdn/img/product/full/AU-03-RD.png b/examples/hono-tractor-store-2.0/public/cdn/img/product/full/AU-03-RD.png new file mode 100644 index 0000000..a63fa47 Binary files /dev/null and b/examples/hono-tractor-store-2.0/public/cdn/img/product/full/AU-03-RD.png differ diff --git a/examples/hono-tractor-store-2.0/public/cdn/img/product/full/AU-03-TQ.png b/examples/hono-tractor-store-2.0/public/cdn/img/product/full/AU-03-TQ.png new file mode 100644 index 0000000..30b6f7a Binary files /dev/null and b/examples/hono-tractor-store-2.0/public/cdn/img/product/full/AU-03-TQ.png differ diff --git a/examples/hono-tractor-store-2.0/public/cdn/img/product/full/AU-03-YE.png b/examples/hono-tractor-store-2.0/public/cdn/img/product/full/AU-03-YE.png new file mode 100644 index 0000000..a75a0f4 Binary files /dev/null and b/examples/hono-tractor-store-2.0/public/cdn/img/product/full/AU-03-YE.png differ diff --git a/examples/hono-tractor-store-2.0/public/cdn/img/product/full/AU-04-BK.png b/examples/hono-tractor-store-2.0/public/cdn/img/product/full/AU-04-BK.png new file mode 100644 index 0000000..c3912bd Binary files /dev/null and b/examples/hono-tractor-store-2.0/public/cdn/img/product/full/AU-04-BK.png differ diff --git a/examples/hono-tractor-store-2.0/public/cdn/img/product/full/AU-04-RD.png b/examples/hono-tractor-store-2.0/public/cdn/img/product/full/AU-04-RD.png new file mode 100644 index 0000000..e824995 Binary files /dev/null and b/examples/hono-tractor-store-2.0/public/cdn/img/product/full/AU-04-RD.png differ diff --git a/examples/hono-tractor-store-2.0/public/cdn/img/product/full/AU-05-ZH.png b/examples/hono-tractor-store-2.0/public/cdn/img/product/full/AU-05-ZH.png new file mode 100644 index 0000000..43ea94d Binary files /dev/null and b/examples/hono-tractor-store-2.0/public/cdn/img/product/full/AU-05-ZH.png differ diff --git a/examples/hono-tractor-store-2.0/public/cdn/img/product/full/AU-06-CZ.png b/examples/hono-tractor-store-2.0/public/cdn/img/product/full/AU-06-CZ.png new file mode 100644 index 0000000..918da6a Binary files /dev/null and b/examples/hono-tractor-store-2.0/public/cdn/img/product/full/AU-06-CZ.png differ diff --git a/examples/hono-tractor-store-2.0/public/cdn/img/product/full/AU-06-MT.png b/examples/hono-tractor-store-2.0/public/cdn/img/product/full/AU-06-MT.png new file mode 100644 index 0000000..cbd3255 Binary files /dev/null and b/examples/hono-tractor-store-2.0/public/cdn/img/product/full/AU-06-MT.png differ diff --git a/examples/hono-tractor-store-2.0/public/cdn/img/product/full/AU-07-MT.png b/examples/hono-tractor-store-2.0/public/cdn/img/product/full/AU-07-MT.png new file mode 100644 index 0000000..b07a45a Binary files /dev/null and b/examples/hono-tractor-store-2.0/public/cdn/img/product/full/AU-07-MT.png differ diff --git a/examples/hono-tractor-store-2.0/public/cdn/img/product/full/AU-07-YE.png b/examples/hono-tractor-store-2.0/public/cdn/img/product/full/AU-07-YE.png new file mode 100644 index 0000000..3533902 Binary files /dev/null and b/examples/hono-tractor-store-2.0/public/cdn/img/product/full/AU-07-YE.png differ diff --git a/examples/hono-tractor-store-2.0/public/cdn/img/product/full/AU-08-WH.png b/examples/hono-tractor-store-2.0/public/cdn/img/product/full/AU-08-WH.png new file mode 100644 index 0000000..fe780d0 Binary files /dev/null and b/examples/hono-tractor-store-2.0/public/cdn/img/product/full/AU-08-WH.png differ diff --git a/examples/hono-tractor-store-2.0/public/cdn/img/product/full/CL-01-GR.png b/examples/hono-tractor-store-2.0/public/cdn/img/product/full/CL-01-GR.png new file mode 100644 index 0000000..15be099 Binary files /dev/null and b/examples/hono-tractor-store-2.0/public/cdn/img/product/full/CL-01-GR.png differ diff --git a/examples/hono-tractor-store-2.0/public/cdn/img/product/full/CL-01-GY.png b/examples/hono-tractor-store-2.0/public/cdn/img/product/full/CL-01-GY.png new file mode 100644 index 0000000..da8e10e Binary files /dev/null and b/examples/hono-tractor-store-2.0/public/cdn/img/product/full/CL-01-GY.png differ diff --git a/examples/hono-tractor-store-2.0/public/cdn/img/product/full/CL-02-BL.png b/examples/hono-tractor-store-2.0/public/cdn/img/product/full/CL-02-BL.png new file mode 100644 index 0000000..33165b8 Binary files /dev/null and b/examples/hono-tractor-store-2.0/public/cdn/img/product/full/CL-02-BL.png differ diff --git a/examples/hono-tractor-store-2.0/public/cdn/img/product/full/CL-03-GR.png b/examples/hono-tractor-store-2.0/public/cdn/img/product/full/CL-03-GR.png new file mode 100644 index 0000000..9aef3ca Binary files /dev/null and b/examples/hono-tractor-store-2.0/public/cdn/img/product/full/CL-03-GR.png differ diff --git a/examples/hono-tractor-store-2.0/public/cdn/img/product/full/CL-03-PI.png b/examples/hono-tractor-store-2.0/public/cdn/img/product/full/CL-03-PI.png new file mode 100644 index 0000000..276353a Binary files /dev/null and b/examples/hono-tractor-store-2.0/public/cdn/img/product/full/CL-03-PI.png differ diff --git a/examples/hono-tractor-store-2.0/public/cdn/img/product/full/CL-03-YE.png b/examples/hono-tractor-store-2.0/public/cdn/img/product/full/CL-03-YE.png new file mode 100644 index 0000000..d33d3d0 Binary files /dev/null and b/examples/hono-tractor-store-2.0/public/cdn/img/product/full/CL-03-YE.png differ diff --git a/examples/hono-tractor-store-2.0/public/cdn/img/product/full/CL-04-BL.png b/examples/hono-tractor-store-2.0/public/cdn/img/product/full/CL-04-BL.png new file mode 100644 index 0000000..9e6ead4 Binary files /dev/null and b/examples/hono-tractor-store-2.0/public/cdn/img/product/full/CL-04-BL.png differ diff --git a/examples/hono-tractor-store-2.0/public/cdn/img/product/full/CL-04-RD.png b/examples/hono-tractor-store-2.0/public/cdn/img/product/full/CL-04-RD.png new file mode 100644 index 0000000..05ce7cd Binary files /dev/null and b/examples/hono-tractor-store-2.0/public/cdn/img/product/full/CL-04-RD.png differ diff --git a/examples/hono-tractor-store-2.0/public/cdn/img/product/full/CL-04-TQ.png b/examples/hono-tractor-store-2.0/public/cdn/img/product/full/CL-04-TQ.png new file mode 100644 index 0000000..bd88875 Binary files /dev/null and b/examples/hono-tractor-store-2.0/public/cdn/img/product/full/CL-04-TQ.png differ diff --git a/examples/hono-tractor-store-2.0/public/cdn/img/product/full/CL-05-PT.png b/examples/hono-tractor-store-2.0/public/cdn/img/product/full/CL-05-PT.png new file mode 100644 index 0000000..fba3e80 Binary files /dev/null and b/examples/hono-tractor-store-2.0/public/cdn/img/product/full/CL-05-PT.png differ diff --git a/examples/hono-tractor-store-2.0/public/cdn/img/product/full/CL-05-RD.png b/examples/hono-tractor-store-2.0/public/cdn/img/product/full/CL-05-RD.png new file mode 100644 index 0000000..a2e821b Binary files /dev/null and b/examples/hono-tractor-store-2.0/public/cdn/img/product/full/CL-05-RD.png differ diff --git a/examples/hono-tractor-store-2.0/public/cdn/img/product/full/CL-06-MT.png b/examples/hono-tractor-store-2.0/public/cdn/img/product/full/CL-06-MT.png new file mode 100644 index 0000000..ff3a09e Binary files /dev/null and b/examples/hono-tractor-store-2.0/public/cdn/img/product/full/CL-06-MT.png differ diff --git a/examples/hono-tractor-store-2.0/public/cdn/img/product/full/CL-06-YE.png b/examples/hono-tractor-store-2.0/public/cdn/img/product/full/CL-06-YE.png new file mode 100644 index 0000000..f859df8 Binary files /dev/null and b/examples/hono-tractor-store-2.0/public/cdn/img/product/full/CL-06-YE.png differ diff --git a/examples/hono-tractor-store-2.0/public/cdn/img/product/full/CL-07-GR.png b/examples/hono-tractor-store-2.0/public/cdn/img/product/full/CL-07-GR.png new file mode 100644 index 0000000..d6d8195 Binary files /dev/null and b/examples/hono-tractor-store-2.0/public/cdn/img/product/full/CL-07-GR.png differ diff --git a/examples/hono-tractor-store-2.0/public/cdn/img/product/full/CL-07-YE.png b/examples/hono-tractor-store-2.0/public/cdn/img/product/full/CL-07-YE.png new file mode 100644 index 0000000..69e8075 Binary files /dev/null and b/examples/hono-tractor-store-2.0/public/cdn/img/product/full/CL-07-YE.png differ diff --git a/examples/hono-tractor-store-2.0/public/cdn/img/product/full/CL-08-GR.png b/examples/hono-tractor-store-2.0/public/cdn/img/product/full/CL-08-GR.png new file mode 100644 index 0000000..5c1188e Binary files /dev/null and b/examples/hono-tractor-store-2.0/public/cdn/img/product/full/CL-08-GR.png differ diff --git a/examples/hono-tractor-store-2.0/public/cdn/img/product/full/CL-08-PI.png b/examples/hono-tractor-store-2.0/public/cdn/img/product/full/CL-08-PI.png new file mode 100644 index 0000000..c24a0b9 Binary files /dev/null and b/examples/hono-tractor-store-2.0/public/cdn/img/product/full/CL-08-PI.png differ diff --git a/examples/hono-tractor-store-2.0/public/cdn/img/product/full/CL-09-BL.png b/examples/hono-tractor-store-2.0/public/cdn/img/product/full/CL-09-BL.png new file mode 100644 index 0000000..d0e7d81 Binary files /dev/null and b/examples/hono-tractor-store-2.0/public/cdn/img/product/full/CL-09-BL.png differ diff --git a/examples/hono-tractor-store-2.0/public/cdn/img/product/full/CL-09-GR.png b/examples/hono-tractor-store-2.0/public/cdn/img/product/full/CL-09-GR.png new file mode 100644 index 0000000..dc79fb2 Binary files /dev/null and b/examples/hono-tractor-store-2.0/public/cdn/img/product/full/CL-09-GR.png differ diff --git a/examples/hono-tractor-store-2.0/public/cdn/img/product/full/CL-10-SD.png b/examples/hono-tractor-store-2.0/public/cdn/img/product/full/CL-10-SD.png new file mode 100644 index 0000000..0678602 Binary files /dev/null and b/examples/hono-tractor-store-2.0/public/cdn/img/product/full/CL-10-SD.png differ diff --git a/examples/hono-tractor-store-2.0/public/cdn/img/product/full/CL-10-VI.png b/examples/hono-tractor-store-2.0/public/cdn/img/product/full/CL-10-VI.png new file mode 100644 index 0000000..4bad110 Binary files /dev/null and b/examples/hono-tractor-store-2.0/public/cdn/img/product/full/CL-10-VI.png differ diff --git a/examples/hono-tractor-store-2.0/public/cdn/img/product/full/CL-11-SK.png b/examples/hono-tractor-store-2.0/public/cdn/img/product/full/CL-11-SK.png new file mode 100644 index 0000000..553a7e4 Binary files /dev/null and b/examples/hono-tractor-store-2.0/public/cdn/img/product/full/CL-11-SK.png differ diff --git a/examples/hono-tractor-store-2.0/public/cdn/img/product/full/CL-11-YE.png b/examples/hono-tractor-store-2.0/public/cdn/img/product/full/CL-11-YE.png new file mode 100644 index 0000000..3d49aa7 Binary files /dev/null and b/examples/hono-tractor-store-2.0/public/cdn/img/product/full/CL-11-YE.png differ diff --git a/examples/hono-tractor-store-2.0/public/cdn/img/product/full/CL-12-BL.png b/examples/hono-tractor-store-2.0/public/cdn/img/product/full/CL-12-BL.png new file mode 100644 index 0000000..7be14c6 Binary files /dev/null and b/examples/hono-tractor-store-2.0/public/cdn/img/product/full/CL-12-BL.png differ diff --git a/examples/hono-tractor-store-2.0/public/cdn/img/product/full/CL-12-RD.png b/examples/hono-tractor-store-2.0/public/cdn/img/product/full/CL-12-RD.png new file mode 100644 index 0000000..24e86e4 Binary files /dev/null and b/examples/hono-tractor-store-2.0/public/cdn/img/product/full/CL-12-RD.png differ diff --git a/examples/hono-tractor-store-2.0/public/cdn/img/product/full/CL-13-BL.png b/examples/hono-tractor-store-2.0/public/cdn/img/product/full/CL-13-BL.png new file mode 100644 index 0000000..b787ac1 Binary files /dev/null and b/examples/hono-tractor-store-2.0/public/cdn/img/product/full/CL-13-BL.png differ diff --git a/examples/hono-tractor-store-2.0/public/cdn/img/product/full/CL-13-RD.png b/examples/hono-tractor-store-2.0/public/cdn/img/product/full/CL-13-RD.png new file mode 100644 index 0000000..fd4b034 Binary files /dev/null and b/examples/hono-tractor-store-2.0/public/cdn/img/product/full/CL-13-RD.png differ diff --git a/examples/hono-tractor-store-2.0/public/cdn/img/product/full/CL-14-GR.png b/examples/hono-tractor-store-2.0/public/cdn/img/product/full/CL-14-GR.png new file mode 100644 index 0000000..353ad98 Binary files /dev/null and b/examples/hono-tractor-store-2.0/public/cdn/img/product/full/CL-14-GR.png differ diff --git a/examples/hono-tractor-store-2.0/public/cdn/img/product/full/CL-14-RD.png b/examples/hono-tractor-store-2.0/public/cdn/img/product/full/CL-14-RD.png new file mode 100644 index 0000000..9b6b4b8 Binary files /dev/null and b/examples/hono-tractor-store-2.0/public/cdn/img/product/full/CL-14-RD.png differ diff --git a/examples/hono-tractor-store-2.0/public/cdn/img/product/full/CL-15-PI.png b/examples/hono-tractor-store-2.0/public/cdn/img/product/full/CL-15-PI.png new file mode 100644 index 0000000..b826982 Binary files /dev/null and b/examples/hono-tractor-store-2.0/public/cdn/img/product/full/CL-15-PI.png differ diff --git a/examples/hono-tractor-store-2.0/public/cdn/img/product/full/CL-15-SD.png b/examples/hono-tractor-store-2.0/public/cdn/img/product/full/CL-15-SD.png new file mode 100644 index 0000000..39cb193 Binary files /dev/null and b/examples/hono-tractor-store-2.0/public/cdn/img/product/full/CL-15-SD.png differ diff --git a/examples/hono-tractor-store-2.0/public/cdn/img/scene/1000/autonomous.webp b/examples/hono-tractor-store-2.0/public/cdn/img/scene/1000/autonomous.webp new file mode 100644 index 0000000..d03c3b2 Binary files /dev/null and b/examples/hono-tractor-store-2.0/public/cdn/img/scene/1000/autonomous.webp differ diff --git a/examples/hono-tractor-store-2.0/public/cdn/img/scene/1000/classics.webp b/examples/hono-tractor-store-2.0/public/cdn/img/scene/1000/classics.webp new file mode 100644 index 0000000..ccb2149 Binary files /dev/null and b/examples/hono-tractor-store-2.0/public/cdn/img/scene/1000/classics.webp differ diff --git a/examples/hono-tractor-store-2.0/public/cdn/img/scene/500/autonomous.webp b/examples/hono-tractor-store-2.0/public/cdn/img/scene/500/autonomous.webp new file mode 100644 index 0000000..5d824a5 Binary files /dev/null and b/examples/hono-tractor-store-2.0/public/cdn/img/scene/500/autonomous.webp differ diff --git a/examples/hono-tractor-store-2.0/public/cdn/img/scene/500/classics.webp b/examples/hono-tractor-store-2.0/public/cdn/img/scene/500/classics.webp new file mode 100644 index 0000000..a0f59f5 Binary files /dev/null and b/examples/hono-tractor-store-2.0/public/cdn/img/scene/500/classics.webp differ diff --git a/examples/hono-tractor-store-2.0/public/cdn/img/scene/convert.sh b/examples/hono-tractor-store-2.0/public/cdn/img/scene/convert.sh new file mode 100755 index 0000000..42f83a5 --- /dev/null +++ b/examples/hono-tractor-store-2.0/public/cdn/img/scene/convert.sh @@ -0,0 +1,28 @@ +#!/bin/bash + +# Directory containing the original PNG images +input_directory="./full" +# Array of target widths +declare -a sizes=(500 1000) + +# Iterate through each file in the input directory +for file in "$input_directory"/*.jpg; do + # Extract filename without extension + filename=$(basename -- "$file") + filename="${filename%.*}" + + # Iterate through each size + for size in "${sizes[@]}"; do + # Create output directory if it doesn't exist + output_directory="./$size" + mkdir -p "$output_directory" + + # Define output filename + output_file="$output_directory/${filename}.webp" + + # Convert and resize the image + convert "$file" -resize "${size}x${size}" - | cwebp -m 6 -q 80 -o "$output_file" -- - + done +done + +echo "Conversion completed." diff --git a/examples/hono-tractor-store-2.0/public/cdn/img/scene/full/autonomous.jpg b/examples/hono-tractor-store-2.0/public/cdn/img/scene/full/autonomous.jpg new file mode 100644 index 0000000..e9f5222 Binary files /dev/null and b/examples/hono-tractor-store-2.0/public/cdn/img/scene/full/autonomous.jpg differ diff --git a/examples/hono-tractor-store-2.0/public/cdn/img/scene/full/classics.jpg b/examples/hono-tractor-store-2.0/public/cdn/img/scene/full/classics.jpg new file mode 100644 index 0000000..4a64acf Binary files /dev/null and b/examples/hono-tractor-store-2.0/public/cdn/img/scene/full/classics.jpg differ diff --git a/examples/hono-tractor-store-2.0/public/cdn/img/store/200/store-1.webp b/examples/hono-tractor-store-2.0/public/cdn/img/store/200/store-1.webp new file mode 100644 index 0000000..13e4681 Binary files /dev/null and b/examples/hono-tractor-store-2.0/public/cdn/img/store/200/store-1.webp differ diff --git a/examples/hono-tractor-store-2.0/public/cdn/img/store/200/store-2.webp b/examples/hono-tractor-store-2.0/public/cdn/img/store/200/store-2.webp new file mode 100644 index 0000000..aa087c9 Binary files /dev/null and b/examples/hono-tractor-store-2.0/public/cdn/img/store/200/store-2.webp differ diff --git a/examples/hono-tractor-store-2.0/public/cdn/img/store/200/store-3.webp b/examples/hono-tractor-store-2.0/public/cdn/img/store/200/store-3.webp new file mode 100644 index 0000000..e727ff8 Binary files /dev/null and b/examples/hono-tractor-store-2.0/public/cdn/img/store/200/store-3.webp differ diff --git a/examples/hono-tractor-store-2.0/public/cdn/img/store/200/store-4.webp b/examples/hono-tractor-store-2.0/public/cdn/img/store/200/store-4.webp new file mode 100644 index 0000000..6f48faf Binary files /dev/null and b/examples/hono-tractor-store-2.0/public/cdn/img/store/200/store-4.webp differ diff --git a/examples/hono-tractor-store-2.0/public/cdn/img/store/200/store-5.webp b/examples/hono-tractor-store-2.0/public/cdn/img/store/200/store-5.webp new file mode 100644 index 0000000..89cd8b1 Binary files /dev/null and b/examples/hono-tractor-store-2.0/public/cdn/img/store/200/store-5.webp differ diff --git a/examples/hono-tractor-store-2.0/public/cdn/img/store/400/store-1.webp b/examples/hono-tractor-store-2.0/public/cdn/img/store/400/store-1.webp new file mode 100644 index 0000000..c8214fe Binary files /dev/null and b/examples/hono-tractor-store-2.0/public/cdn/img/store/400/store-1.webp differ diff --git a/examples/hono-tractor-store-2.0/public/cdn/img/store/400/store-2.webp b/examples/hono-tractor-store-2.0/public/cdn/img/store/400/store-2.webp new file mode 100644 index 0000000..4a9970f Binary files /dev/null and b/examples/hono-tractor-store-2.0/public/cdn/img/store/400/store-2.webp differ diff --git a/examples/hono-tractor-store-2.0/public/cdn/img/store/400/store-3.webp b/examples/hono-tractor-store-2.0/public/cdn/img/store/400/store-3.webp new file mode 100644 index 0000000..fdd6b78 Binary files /dev/null and b/examples/hono-tractor-store-2.0/public/cdn/img/store/400/store-3.webp differ diff --git a/examples/hono-tractor-store-2.0/public/cdn/img/store/400/store-4.webp b/examples/hono-tractor-store-2.0/public/cdn/img/store/400/store-4.webp new file mode 100644 index 0000000..59aee7c Binary files /dev/null and b/examples/hono-tractor-store-2.0/public/cdn/img/store/400/store-4.webp differ diff --git a/examples/hono-tractor-store-2.0/public/cdn/img/store/400/store-5.webp b/examples/hono-tractor-store-2.0/public/cdn/img/store/400/store-5.webp new file mode 100644 index 0000000..663c110 Binary files /dev/null and b/examples/hono-tractor-store-2.0/public/cdn/img/store/400/store-5.webp differ diff --git a/examples/hono-tractor-store-2.0/public/cdn/img/store/800/store-1.webp b/examples/hono-tractor-store-2.0/public/cdn/img/store/800/store-1.webp new file mode 100644 index 0000000..21d4e4f Binary files /dev/null and b/examples/hono-tractor-store-2.0/public/cdn/img/store/800/store-1.webp differ diff --git a/examples/hono-tractor-store-2.0/public/cdn/img/store/800/store-2.webp b/examples/hono-tractor-store-2.0/public/cdn/img/store/800/store-2.webp new file mode 100644 index 0000000..35714ba Binary files /dev/null and b/examples/hono-tractor-store-2.0/public/cdn/img/store/800/store-2.webp differ diff --git a/examples/hono-tractor-store-2.0/public/cdn/img/store/800/store-3.webp b/examples/hono-tractor-store-2.0/public/cdn/img/store/800/store-3.webp new file mode 100644 index 0000000..2bf55b0 Binary files /dev/null and b/examples/hono-tractor-store-2.0/public/cdn/img/store/800/store-3.webp differ diff --git a/examples/hono-tractor-store-2.0/public/cdn/img/store/800/store-4.webp b/examples/hono-tractor-store-2.0/public/cdn/img/store/800/store-4.webp new file mode 100644 index 0000000..0facd29 Binary files /dev/null and b/examples/hono-tractor-store-2.0/public/cdn/img/store/800/store-4.webp differ diff --git a/examples/hono-tractor-store-2.0/public/cdn/img/store/800/store-5.webp b/examples/hono-tractor-store-2.0/public/cdn/img/store/800/store-5.webp new file mode 100644 index 0000000..0416187 Binary files /dev/null and b/examples/hono-tractor-store-2.0/public/cdn/img/store/800/store-5.webp differ diff --git a/examples/hono-tractor-store-2.0/public/cdn/img/store/convert.sh b/examples/hono-tractor-store-2.0/public/cdn/img/store/convert.sh new file mode 100755 index 0000000..c5afdbd --- /dev/null +++ b/examples/hono-tractor-store-2.0/public/cdn/img/store/convert.sh @@ -0,0 +1,28 @@ +#!/bin/bash + +# Directory containing the original PNG images +input_directory="./full" +# Array of target widths +declare -a sizes=(200 400 800) + +# Iterate through each file in the input directory +for file in "$input_directory"/*.png; do + # Extract filename without extension + filename=$(basename -- "$file") + filename="${filename%.*}" + + # Iterate through each size + for size in "${sizes[@]}"; do + # Create output directory if it doesn't exist + output_directory="./$size" + mkdir -p "$output_directory" + + # Define output filename + output_file="$output_directory/${filename}.webp" + + # Convert and resize the image + convert "$file" -resize "${size}x${size}" - | cwebp -m 6 -q 80 -o "$output_file" -- - + done +done + +echo "Conversion completed." diff --git a/examples/hono-tractor-store-2.0/public/cdn/img/store/full/store-1.png b/examples/hono-tractor-store-2.0/public/cdn/img/store/full/store-1.png new file mode 100644 index 0000000..525e03c Binary files /dev/null and b/examples/hono-tractor-store-2.0/public/cdn/img/store/full/store-1.png differ diff --git a/examples/hono-tractor-store-2.0/public/cdn/img/store/full/store-2.png b/examples/hono-tractor-store-2.0/public/cdn/img/store/full/store-2.png new file mode 100644 index 0000000..529ea60 Binary files /dev/null and b/examples/hono-tractor-store-2.0/public/cdn/img/store/full/store-2.png differ diff --git a/examples/hono-tractor-store-2.0/public/cdn/img/store/full/store-3.png b/examples/hono-tractor-store-2.0/public/cdn/img/store/full/store-3.png new file mode 100644 index 0000000..b1670fa Binary files /dev/null and b/examples/hono-tractor-store-2.0/public/cdn/img/store/full/store-3.png differ diff --git a/examples/hono-tractor-store-2.0/public/cdn/img/store/full/store-4.png b/examples/hono-tractor-store-2.0/public/cdn/img/store/full/store-4.png new file mode 100644 index 0000000..75888c0 Binary files /dev/null and b/examples/hono-tractor-store-2.0/public/cdn/img/store/full/store-4.png differ diff --git a/examples/hono-tractor-store-2.0/public/cdn/img/store/full/store-5.png b/examples/hono-tractor-store-2.0/public/cdn/img/store/full/store-5.png new file mode 100644 index 0000000..145f4ad Binary files /dev/null and b/examples/hono-tractor-store-2.0/public/cdn/img/store/full/store-5.png differ diff --git a/examples/hono-tractor-store-2.0/public/cdn/js/helper.js b/examples/hono-tractor-store-2.0/public/cdn/js/helper.js new file mode 100644 index 0000000..5723d74 --- /dev/null +++ b/examples/hono-tractor-store-2.0/public/cdn/js/helper.js @@ -0,0 +1,444 @@ +import roughjs from "https://cdn.jsdelivr.net/npm/roughjs@4.6.6/+esm"; + +// team specific styles +const config = { + explore: { + fill: "rgba(255, 90, 84, 0.1)", + stroke: "rgba(255, 90, 84, 1)", + hachureAngle: 30, + }, + decide: { + fill: "rgba(84, 255, 144, 0.1)", + stroke: "rgba(84, 255, 144, 1)", + hachureAngle: 60, + }, + checkout: { + fill: "rgba(255, 222, 84, 0.1)", + stroke: "rgba(255, 222, 84, 1)", + hachureAngle: 90, + }, +}; + +/** + * Sets the basic styles. + */ +function setBasicStyles() { + const style = document.createElement("style"); + style.innerHTML = ` +@import url('https://fonts.googleapis.com/css2?family=Pangolin&display=swap'); + +[data-boundary] { + position: relative; + background-size: 100% 100%; + background-repeat: no-repeat; +} +[data-boundary]::after { + display: block; + content: attr(data-boundary); + position: absolute; + bottom: -0.8rem; + right: 50%; + transform: translateX(50%); + padding: 0 0.5rem; + line-height: 1.5; + font-weight: bold; + pointer-events: none; + font-family: "Pangolin", cursive; + font-weight: 400; + font-style: normal; +} +[data-boundary$="-page"]::after { + top: 250px; + left: 0rem; + bottom: auto; + right: auto; + transform: rotate(-90deg); + transform-origin: 0 0; +} +[data-boundary^="explore-"]::after { background-color: ${config.explore.stroke}; color: white } +[data-boundary^="decide-"]::after { background-color: ${config.decide.stroke}; } +[data-boundary^="checkout-"]::after { background: ${config.checkout.stroke}; } + +html:not(.showBoundaries) [data-boundary] { background-image: none !important;} +html:not(.showBoundaries) [data-boundary]:after { display: none; } +html.showBoundaries img { mix-blend-mode: multiply; } +`; + document.head.appendChild(style); +} + +/** + * Generates a rounded rectangle SVG path. + * @param {object} options - The options for generating the rounded rectangle. + * @param {number} options.x - The x-coordinate of the top-left corner of the rectangle. + * @param {number} options.y - The y-coordinate of the top-left corner of the rectangle. + * @param {number} options.width - The width of the rectangle. + * @param {number} options.height - The height of the rectangle. + * @param {number} options.borderRadius - The border radius of the rectangle. + * @param {number} options.segmentLength - The length of each line segment. + * @returns {string} The SVG path representing the rounded rectangle. + */ +function generateRoundedRectangle({ + x, + y, + width, + height, + borderRadius, + segmentLength, +}) { + const maxRadius = Math.min(width / 2, height / 2); + borderRadius = Math.min(borderRadius, maxRadius); + + /** + * Generates line segments between two points. + * @param {number} startX - The x-coordinate of the starting point. + * @param {number} startY - The y-coordinate of the starting point. + * @param {number} endX - The x-coordinate of the ending point. + * @param {number} endY - The y-coordinate of the ending point. + * @param {number} segmentLength - The length of each line segment. + * @returns {string} The points representing the line segments. + */ + function generateLineSegments(startX, startY, endX, endY, segmentLength) { + let points = ""; + const dx = endX - startX; + const dy = endY - startY; + const distance = Math.sqrt(dx * dx + dy * dy); + const steps = Math.floor(distance / segmentLength); + const stepX = dx / steps; + const stepY = dy / steps; + + for (let i = 1; i <= steps; i++) { + const nextX = startX + stepX * i; + const nextY = startY + stepY * i; + points += `L${nextX},${nextY} `; + } + + return points; + } + + const pathData = [ + `M${x + borderRadius},${y}`, + generateLineSegments( + x + borderRadius, + y, + x + width - borderRadius, + y, + segmentLength, + ), + `Q${x + width},${y} ${x + width},${y + borderRadius}`, + generateLineSegments( + x + width, + y + borderRadius, + x + width, + y + height - borderRadius, + segmentLength, + ), + `Q${x + width},${y + height} ${x + width - borderRadius},${y + height}`, + generateLineSegments( + x + width - borderRadius, + y + height, + x + borderRadius, + y + height, + segmentLength, + ), + `Q${x},${y + height} ${x},${y + height - borderRadius}`, + generateLineSegments( + x, + y + height - borderRadius, + x, + y + borderRadius, + segmentLength, + ), + `Q${x},${y} ${x + borderRadius},${y}`, + "Z", + ]; + + return pathData.join(" "); +} + +/** + * Writes the SVG node to the cache for the given boundary, width, and height. + * @param {SVGElement} svgNode - The SVG node to be cached. + * @param {string} boundary - The boundary identifier. + * @param {number} width - The width of the boundary. + * @param {number} height - The height of the boundary. + */ +function writeBoundaryToCache(svgNode, boundary, width, height) { + const serializer = new XMLSerializer(); + const svgStr = serializer.serializeToString(svgNode); + const entry = { width, height, svg: svgStr }; + window.sessionStorage.setItem(`boundary-${boundary}`, JSON.stringify(entry)); +} + +/** + * Reads the SVG string from the cache for the given boundary, width, and height. + * @param {string} boundary - The boundary identifier. + * @param {number} width - The width of the boundary. + * @param {number} height - The height of the boundary. + * @returns {SVGElement|null} - The parsed SVG element or null if not found or dimensions don't match. + */ +function readBoundaryFromCache(boundary, width, height) { + const svgStr = window.sessionStorage.getItem(`boundary-${boundary}`); + if (!svgStr) { + return null; + } + const entry = JSON.parse(svgStr); + const tolerance = 30; + if ( + Math.abs(entry.width - width) >= tolerance || + Math.abs(entry.height - height) >= tolerance + ) { + return null; + } + const parser = new window.DOMParser(); + return parser.parseFromString(entry.svg, "image/svg+xml").firstChild; +} + +/** + * Sets the CSS background for the given boundary using the SVG node. + * @param {string} boundary - The boundary identifier. + * @param {SVGElement} svgNode - The SVG node. + */ +function setCssBackground(boundary, svgNode) { + const serializer = new XMLSerializer(); + const svgStr = serializer.serializeToString(svgNode); + const encodedSvg = encodeURIComponent(svgStr); + const url = `url("data:image/svg+xml,${encodedSvg}")`; + + const id = `${boundary}-style`; + let style = document.getElementById(id); + if (!style) { + style = document.createElement("style"); + style.id = id; + document.head.appendChild(style); + } + style.innerHTML = `[data-boundary="${boundary}"] { background-image: ${url}; }`; +} + +/** + * Generates a white background for the given rectangle. + * @param {string} rectangle - The rectangle coordinates. + * @returns {SVGElement} The generated white background SVG element. + */ +function generateWhiteBackground(rectangle) { + const bgNode = document.createElementNS("http://www.w3.org/2000/svg", "path"); + bgNode.setAttribute("d", rectangle); + bgNode.setAttribute("fill", "white"); + return bgNode; +} + +/** + * Generates a boundary for the given SVG element. + * @param {SVGElement} svg - The SVG element. + * @param {string} rectangle - The rectangle coordinates. + * @param {string} team - The team name. + * @param {boolean} isPage - Indicates if it's a page boundary. + * @returns {string} The generated boundary. + */ +function generateBoundary(svg, rectangle, team, isPage) { + const rc = roughjs.svg(svg); + return rc.path(rectangle, { + bowing: 0.5, + disableMultiStroke: true, + //fill: config[team].fill, + //fillStyle: "hachure", + //fillWeight: 1.5, + //hachureAngle: config[team].hachureAngle, + //hachureGap: 12, + preserveVertices: true, + roughness: isPage ? 5 : 3, + stroke: config[team].stroke, + strokeLineDash: null, + strokeWidth: isPage ? 20 : 3, + }); +} + +/** + * Generates a rough boundary for the given element. + * @param {HTMLElement} el - The element to generate the boundary for. + */ +function generateRoughBoundary(el) { + const clientRect = el.getBoundingClientRect(); + const width = Math.round(clientRect.width); + const height = Math.round(clientRect.height); + + const boundary = el.dataset.boundary; + const team = boundary.split("-")[0]; + const isPage = boundary.endsWith("-page"); + + // basic shape and position of the boundary + const inset = isPage ? -2 : 10; + const rectangle = generateRoundedRectangle({ + x: inset, + y: inset, + width: width - 2 * inset, + height: height - 2 * inset, + borderRadius: 10, + segmentLength: 150, + }); + + // svg document + const svg = document.createElementNS("http://www.w3.org/2000/svg", "svg"); + svg.setAttribute("width", width); + svg.setAttribute("height", height); + svg.setAttribute("preserveAspectRatio", "none"); + + // white background + svg.appendChild(generateWhiteBackground(rectangle)); + + // rough rectangle + let node = readBoundaryFromCache(boundary, width, height); + if (!node) { + node = generateBoundary(svg, rectangle, team, isPage); + writeBoundaryToCache(node, boundary, width, height); + } + svg.appendChild(node); + + // apply to DOM + setCssBackground(boundary, svg); +} + +/** + * Generate rough boundaries for all elements with the data-boundary attribute. + */ +function generateRoughBoundaries() { + const boundaries = document.querySelectorAll("[data-boundary]"); + [...boundaries].forEach(generateRoughBoundary); +} + +/** + * Toggle the boundaries based on the active state. + * @param {boolean} active - The active state of the boundaries. + */ +function toggleBoundaries(active) { + document.documentElement.classList.toggle("showBoundaries", active); + window.localStorage.setItem("showBoundaries", active); + + if (!active) { + return; + } + generateRoughBoundaries(); +} + +/** + * Show toggle button. + */ +function showToggleButton() { + const showBoundaries = + window.localStorage.getItem("showBoundaries") === "true"; + toggleBoundaries(showBoundaries); + + const checkbox = document.createElement("input"); + checkbox.type = "checkbox"; + checkbox.checked = showBoundaries; + checkbox.addEventListener("change", (e) => + toggleBoundaries(e.target.checked), + ); + + const checkboxView = document.createElement("div"); + checkboxView.classList.add("toggleView"); + + const label = document.createElement("label"); + label.appendChild(checkbox); + label.appendChild(checkboxView); + label.appendChild(document.createTextNode(" show team boundaries")); + + const container = document.createElement("div"); + container.classList.add("showBoundariesToggle"); + + const style = document.createElement("style"); + style.innerHTML = ` + .showBoundariesToggle { + position: fixed; + bottom: 10px; + left: 10px; + border-radius: 10px; + display: flex; + background-color: rgba(255, 255, 255, 0.8); + -webkit-user-select: none; + user-select: none; + box-shadow: 0 0 20px 10px rgba(235, 91, 89, 0.05); + border: 1px solid #eeebe2; + backdrop-filter: blur(5px); + -webkit-backdrop-filter: blur(5px); + margin-right: 10px; + } + + .showBoundariesToggle input { + display: none; + } + + .showBoundariesToggle label { + cursor: pointer; + padding: 20px; + display: flex; + } + + .toggleView { + position: relative; + display: inline-block; + width: 40px; + height: 20px; + border: 1px solid #ccc; + border-radius: 10px; + margin-right: 10px; + box-shadow: inset 0 0 5px rgba(0, 0, 0, 0.1); + background-color: #fff; + flex-shrink: 0; + } + + .toggleView::before { + content: ""; + display: block; + width: 18px; + height: 18px; + border-radius: 10px; + background-color: #fff; + box-shadow: 0 0 5px rgba(0, 0, 0, 0.1); + transition: transform 0.3s, width 0.3s; + } + + .toggleView::after { + top: 1px; + left: 1px; + position: absolute; + content: ""; + display: block; + width: 16px; + height: 16px; + border-radius: 10px; + background-color: #000; + opacity: 0.5; + transition: transform 0.3s; + } + + .showBoundariesToggle label:hover .toggleView::after { + opacity: 1; + } + + .showBoundariesToggle input:checked + .toggleView::before { + width: 38px; + box-shadow: inset 0 0 5px rgba(0, 0, 0, 0.1); + background-color: rgba(255, 90, 85, 1); + } + + .showBoundariesToggle input:checked + .toggleView::after { + transform: translateX(20px); + opacity: 1; + box-shadow: 0 0 5px rgba(0, 0, 0, 0.1); + } + `; + container.appendChild(style); + container.appendChild(label); + document.body.appendChild(container); +} + +/** + * initialize + */ + +setBasicStyles(); +showToggleButton(); +window.addEventListener("resize", () => { + window.requestAnimationFrame(generateRoughBoundaries); +}); +window.addEventListener("click", generateRoughBoundaries); diff --git a/examples/hono-tractor-store-2.0/src/checkout/actions.js b/examples/hono-tractor-store-2.0/src/checkout/actions.js new file mode 100644 index 0000000..ebf8cdb --- /dev/null +++ b/examples/hono-tractor-store-2.0/src/checkout/actions.js @@ -0,0 +1,47 @@ +import { readFromCookie, writeToCookie } from "./state.js"; + +/** + * Handles adding an item to the cart. + * @param {HonoContext} c - The hono context. + */ +export async function handleAddToCart(c) { + const body = await c.req.parseBody(); + const sku = body.sku; + + const items = readFromCookie(c); + + const lineItem = items.find((i) => i.sku === sku); + if (lineItem) { + lineItem.quantity++; + } else { + items.push({ sku, quantity: 1 }); + } + writeToCookie(items, c); +} + +/** + * Handles removing an item from the cart. + * @param {HonoContext} c - The hono context. + */ +export async function handleRemoveFromCart(c) { + const body = await c.req.parseBody(); + const sku = body.sku; + + const items = readFromCookie(c); + + const lineItem = items.find((i) => i.sku === sku); + if (lineItem) { + const index = items.indexOf(lineItem); + items.splice(index, 1); + } + + writeToCookie(items, c); +} + +/** + * Handles placing an order. + * @param {HonoContext} c - The hono context. + */ +export async function handlePlaceOrder(c) { + writeToCookie([], c); +} diff --git a/examples/hono-tractor-store-2.0/src/checkout/components/AddToCart.css b/examples/hono-tractor-store-2.0/src/checkout/components/AddToCart.css new file mode 100644 index 0000000..d109a23 --- /dev/null +++ b/examples/hono-tractor-store-2.0/src/checkout/components/AddToCart.css @@ -0,0 +1,37 @@ +.c_AddToCart { + padding: 1rem; + margin: 0 -1rem; +} + +.c_AddToCart__information { + display: flex; + justify-content: space-between; + align-items: center; + margin-bottom: 1rem; +} + +.c_AddToCart__stock { + display: block; +} + +.c_AddToCart__stock--ok { + color: green; +} + +.c_AddToCart__stock--empty { + color: red; +} + +.c_AddToCart__confirmed { + display: flex; + align-items: baseline; + gap: 0.75ch; +} + +.c_AddToCart__confirmed a { + color: inherit; +} + +.c_AddToCart__confirmed--hidden { + visibility: hidden; +} diff --git a/examples/hono-tractor-store-2.0/src/checkout/components/AddToCart.js b/examples/hono-tractor-store-2.0/src/checkout/components/AddToCart.js new file mode 100644 index 0000000..243db26 --- /dev/null +++ b/examples/hono-tractor-store-2.0/src/checkout/components/AddToCart.js @@ -0,0 +1,42 @@ +import data from "../database/index.js"; +import { html } from "../utils.js"; +import Button from "./Button.js"; + +/** + * AddToCart component. + * @param {object} props - The properties of the AddToCart component. + * @param {string} props.sku - The SKU of the variant to add to the cart. + * @returns {string} The AddToCart component markup. + */ +export default ({ sku }) => { + const variant = data.variants.find((p) => p.sku === sku); + const outOfStock = variant.inventory === 0; + return html`
+ +
+

${variant.price} Ø

+ ${variant.inventory > 0 + ? html`

+ ${variant.inventory} in stock, free shipping +

` + : html`

+ out of stock +

`} +
+ ${Button({ + disabled: outOfStock, + className: "c_AddToCart__button", + children: html`add to basket`, + variant: "primary", + })} +
+

Tractor was added.

+ View in basket. +
+
`; +}; diff --git a/examples/hono-tractor-store-2.0/src/checkout/components/Button.css b/examples/hono-tractor-store-2.0/src/checkout/components/Button.css new file mode 100644 index 0000000..c0d5205 --- /dev/null +++ b/examples/hono-tractor-store-2.0/src/checkout/components/Button.css @@ -0,0 +1,140 @@ +.c_Button--size-normal { + --button-height: 50px; +} + +.c_Button--size-small { + --button-height: 40px; +} + +.c_Button { + display: block; + height: var(--button-height); + width: 100%; + border-radius: calc(var(--button-height) / 2); + padding: 2px; + border: 0; + background: linear-gradient(180deg, rgb(168, 168, 168), rgb(255, 255, 255)), + var(--accent-color); + box-shadow: + 0 -2px 3px rgb(229, 229, 229), + 0 2px 3px 2px rgb(255, 255, 255), + 0 0 25px rgba(0, 0, 0, 0.05), + 0 -10px 5px rgb(255, 255, 255) inset; + position: relative; + text-transform: uppercase; + letter-spacing: 0.3em; + -webkit-tap-highlight-color: rgba(0, 0, 0, 0); + text-decoration: none; + font-size: 16px; +} + +.c_Button--primary { + --accent-color: #333; + color: #fff; +} + +.c_Button--secondary { + --accent-color: #ffffff; + color: #000; +} + +.c_Button--rounded.c_Button--size-normal { + @media (max-width: 499px) { + --button-height: 40px; + } + @media (min-width: 500px) { + --button-height: 66px; + } + width: var(--button-height); +} + +.c_Button--rounded.c_Button--size-small { + --button-height: 40px; + + width: var(--button-height); +} + +.c_Button--rounded .c_Button__inner { + padding: 0; +} + +@media (max-width: 499px) { + .c_Button--rounded svg { + width: 20px; + height: 20px; + } +} + +.c_Button[disabled] { + --accent-color: #d3d3d3; + pointer-events: none; +} + +.c_Button::before { + position: absolute; + top: 0; + right: 0; + bottom: 0; + border-radius: inherit; + left: 0; + background: linear-gradient( + 0deg, + rgba(0, 0, 0, 0.19), + rgba(255, 255, 255, 0.3) + ), + var(--accent-color); + content: ""; + box-shadow: 0 2px 1px -1px rgba(0, 0, 0, 0.1); + display: block; + transition: + transform 0.3s, + box-shadow 0.3s, + background 0.1s 0.2s; +} + +.c_Button__inner { + position: relative; + padding-left: 20px; + padding-right: 20px; + background-color: var(--accent-color); + height: calc(var(--button-height) - 4px); + border-radius: inherit; + display: grid; + place-content: center; + transition: + transform 0.3s, + background 0.3s, + box-shadow 0.3s; + -webkit-user-select: none; /* Safari */ + -ms-user-select: none; /* IE 10 and IE 11 */ + user-select: none; + white-space: nowrap; +} + +.c_Button:hover .c_Button__inner, +.c_Button:focus .c_Button__inner { + background: linear-gradient(0deg, rgba(0, 0, 0, 0.05), rgba(0, 0, 0, 0.05)), + var(--accent-color); +} + +.c_Button:active::before { + background: linear-gradient(0deg, rgba(0, 0, 0, 0.09), rgba(0, 0, 0, 0.16)), + var(--accent-color); + box-shadow: + 0 0 3px rgba(0, 0, 0, 0.6) inset, + 0 2px 1px -1px rgba(0, 0, 0, 0.1); + transform: scale(0.97); + transition: + all 0.1s, + background 0.05s; +} + +.c_Button:active .c_Button__inner { + transform: scale(0.97); + background: linear-gradient(0deg, rgba(0, 0, 0, 0.1), rgba(0, 0, 0, 0.1)), + var(--accent-color); + transition: all 0.1s; + box-shadow: + 0 5px 5px rgba(0, 0, 0, 0.2) inset, + 0 -3px 3px rgba(255, 255, 255, 0.2) inset; +} diff --git a/examples/hono-tractor-store-2.0/src/checkout/components/Button.js b/examples/hono-tractor-store-2.0/src/checkout/components/Button.js new file mode 100644 index 0000000..c036c32 --- /dev/null +++ b/examples/hono-tractor-store-2.0/src/checkout/components/Button.js @@ -0,0 +1,45 @@ +import { html } from "../utils.js"; + +/** + * Button component. + * @param {object} props - The properties of the button. + * @param {string} [props.href] - The href for the button if it's a link. + * @param {string} [props.type] - The type of the button. + * @param {string} [props.value] - The value of the button. + * @param {boolean} [props.disabled] - Whether the button is disabled. + * @param {boolean} [props.rounded] - Whether the button is rounded. + * @param {string} [props.className] - Additional CSS classes for the button. + * @param {string} [props.children] - The content inside the button. + * @param {string} [props.dataId] - The data-id attribute of the button. + * @param {('primary'|'secondary')} [props.variant] - The variant of the button. Valid options are 'primary' and 'secondary'. + * @param {string} [props.title] - The title attribute of the button. + * @param {('small'|'normal')} [props.size] - The size of the button. Valid options are 'small' and 'normalx'. + * @returns {string} The button markup. + */ +export default ({ + href, + type, + value, + disabled, + rounded, + className = "", + children, + dataId, + size = "normal", + variant = "secondary", + title, +}) => { + const tag = href ? "a" : "button"; + return html` <${tag} + ${disabled ? "disabled" : ""} + ${href ? `href="${href}"` : ""} + ${type ? `type="${type}"` : ""} + ${value ? `value="${value}"` : ""} + ${dataId ? `data-id="${dataId}"` : ""} + ${title ? `title="${title}"` : ""} + class="c_Button c_Button--${variant} ${className} ${rounded ? "c_Button--rounded" : ""} c_Button--size-${size}" + ontouchstart + > +
${children}
+ `; +}; diff --git a/examples/hono-tractor-store-2.0/src/checkout/components/CompactHeader.css b/examples/hono-tractor-store-2.0/src/checkout/components/CompactHeader.css new file mode 100644 index 0000000..791eb52 --- /dev/null +++ b/examples/hono-tractor-store-2.0/src/checkout/components/CompactHeader.css @@ -0,0 +1,22 @@ +.c_CompactHeader { + height: 135px; + display: flex; + margin: 0 0 2rem; + border-bottom: 1px solid #eeebe2; + box-shadow: 0 0 20px 10px #eb5b5920; + align-items: center; +} + +.c_CompactHeader__inner { + display: flex; + max-width: calc(1000px + (2 * var(--outer-space))); + padding: 0 var(--outer-space); + margin: 0 auto; + align-items: center; + flex: 1; +} + +.c_CompactHeader__logo { + display: block; + width: 270px; +} diff --git a/examples/hono-tractor-store-2.0/src/checkout/components/CompactHeader.js b/examples/hono-tractor-store-2.0/src/checkout/components/CompactHeader.js new file mode 100644 index 0000000..7c6a757 --- /dev/null +++ b/examples/hono-tractor-store-2.0/src/checkout/components/CompactHeader.js @@ -0,0 +1,15 @@ +import { html, IMAGE_SERVER } from "../utils.js"; + +export default () => { + return html`
+
+ + + +
+
`; +}; diff --git a/examples/hono-tractor-store-2.0/src/checkout/components/LineItem.css b/examples/hono-tractor-store-2.0/src/checkout/components/LineItem.css new file mode 100644 index 0000000..570c125 --- /dev/null +++ b/examples/hono-tractor-store-2.0/src/checkout/components/LineItem.css @@ -0,0 +1,52 @@ +.c_LineItem { + display: flex; + margin-bottom: 2rem; + flex-wrap: wrap; + gap: 2rem; + align-items: center; +} + +.c_LineItem__image { + flex-basis: 150px; + padding-right: 2rem; +} + +.c_LineItem__image img { + display: block; + aspect-ratio: 1 / 1; + width: 100%; + height: auto; + object-fit: contain; +} + +.c_LineItem__details { + flex-grow: 1; + display: flex; + gap: 1rem; + flex-wrap: wrap; + align-items: center; + justify-content: flex-end; +} + +.c_LineItem__name { + padding-right: 2rem; + flex-grow: 1; + color: inherit; + text-decoration: none; + min-width: 300px; +} + +.c_LineItem__quantity { + display: flex; + gap: 1rem; + align-items: center; +} + +.c_LineItem__price { + flex-basis: 100px; + text-align: end; +} + +.c_LineItem__removeIcon { + width: 33px; +} diff --git a/examples/hono-tractor-store-2.0/src/checkout/components/LineItem.js b/examples/hono-tractor-store-2.0/src/checkout/components/LineItem.js new file mode 100644 index 0000000..258803d --- /dev/null +++ b/examples/hono-tractor-store-2.0/src/checkout/components/LineItem.js @@ -0,0 +1,57 @@ +import { html, src, srcset } from "../utils.js"; +import Button from "./Button.js"; + +/** + * LineItem component. + * @param {LineItem} props - The line item. + * @returns {string} The LineItem component markup. + */ +export default ({ sku, id, name, quantity, total, image }) => { + const url = `/product/${id}?sku=${sku}`; + return html`
  • + + ${name} + +
    + + ${name}
    ${sku} +
    + +
    + ${quantity} + +
    + + ${Button({ + variant: "secondary", + rounded: true, + type: "submit", + value: "remove", + size: "small", + title: `Remove ${name} from cart`, + children: html` + + `, + })} +
    +
    +
    ${total} Ø
    +
    +
  • `; +}; diff --git a/examples/hono-tractor-store-2.0/src/checkout/components/Meta.js b/examples/hono-tractor-store-2.0/src/checkout/components/Meta.js new file mode 100644 index 0000000..0165473 --- /dev/null +++ b/examples/hono-tractor-store-2.0/src/checkout/components/Meta.js @@ -0,0 +1,37 @@ +import { html } from "../utils.js"; + +export default () => { + return html` + + + + + + + + + + + `; +}; diff --git a/examples/hono-tractor-store-2.0/src/checkout/components/MiniCart.css b/examples/hono-tractor-store-2.0/src/checkout/components/MiniCart.css new file mode 100644 index 0000000..7152c88 --- /dev/null +++ b/examples/hono-tractor-store-2.0/src/checkout/components/MiniCart.css @@ -0,0 +1,70 @@ +.c_MiniCart { + position: relative; + margin-right: 1.5rem; +} + +.c_MiniCart__quantity { + background-color: #ff5a55; + border-radius: 10px; + box-shadow: 0 0 3px rgba(0, 0, 0, 0.3); + color: rgb(255, 255, 255); + display: grid; + font-size: 12px; + font-variant-numeric: tabular-nums; + font-weight: bold; + height: 20px; + letter-spacing: normal; + min-width: 20px; + place-content: center; + position: absolute; + right: 0px; + text-align: center; + top: 0px; + transform: scale(1); + transition: all 0.3s; +} + +.c_MiniCart svg { + --minicart-translate: -2px; + transform: translateY(var(--minicart-translate)); +} + +.c_MiniCart__quantity:empty { + transform: scale(0); +} + +@keyframes bounce { + 0% { + transform: translateY(calc(var(--minicart-translate) + 0px)); + } + 33% { + transform: translateY(calc(var(--minicart-translate) + 6px)); + } + 100% { + transform: translateY(calc(var(--minicart-translate) + 0px)); + } +} + +.c_MiniCart--highlight svg { + animation: bounce 0.2s ease-out; +} + +@keyframes shake { + 0% { + transform: rotate(0deg); + } + 50% { + transform: rotate(6deg); + } + 100% { + transform: rotate(-6deg); + } +} + +.c_MiniCart--highlight svg g { + transform-origin: center 7px; + animation: shake 0.2s infinite ease-in-out; +} +.c_MiniCart { + padding: 1.5rem; +} diff --git a/examples/hono-tractor-store-2.0/src/checkout/components/MiniCart.js b/examples/hono-tractor-store-2.0/src/checkout/components/MiniCart.js new file mode 100644 index 0000000..9b40507 --- /dev/null +++ b/examples/hono-tractor-store-2.0/src/checkout/components/MiniCart.js @@ -0,0 +1,42 @@ +import { readFromCookie } from "../state.js"; +import { html } from "../utils.js"; +import Button from "./Button.js"; + +/** + * MiniCart component. + * @param {object} props - The properties of the MiniCart component. + * @param {HonoContext} props.c - The hono context. + * @returns {string} The MiniCart component markup. + */ +export default ({ c }) => { + const lineItems = readFromCookie(c); + const quantity = lineItems.reduce((t, { quantity }) => t + quantity, 0); + return html`
    + ${Button({ + variant: "secondary", + rounded: true, + href: "/checkout/cart", + className: "c_MiniCart__button", + children: html` + + + + + + + + +
    ${quantity || ""}
    + `, + })} +
    `; +}; diff --git a/examples/hono-tractor-store-2.0/src/checkout/components/Page.js b/examples/hono-tractor-store-2.0/src/checkout/components/Page.js new file mode 100644 index 0000000..466776f --- /dev/null +++ b/examples/hono-tractor-store-2.0/src/checkout/components/Page.js @@ -0,0 +1,22 @@ +import { html } from "../utils.js"; +import Meta from "./Meta.js"; + +export default ({ content }) => { + return html` + + + Tractor Store + + + + ${Meta()} + + + ${content} + + + + + + `; +}; diff --git a/examples/hono-tractor-store-2.0/src/checkout/database/database.json b/examples/hono-tractor-store-2.0/src/checkout/database/database.json new file mode 100644 index 0000000..d99386d --- /dev/null +++ b/examples/hono-tractor-store-2.0/src/checkout/database/database.json @@ -0,0 +1,380 @@ +{ + "variants": [ + { + "id": "AU-01", + "name": "TerraFirma AutoCultivator T-300 Silver", + "sku": "AU-01-SI", + "price": 1000, + "image": "/cdn/img/product/[size]/AU-01-SI.webp", + "inventory": 8 + }, + { + "id": "AU-02", + "name": "SmartFarm Titan Sunset Copper", + "sku": "AU-02-OG", + "price": 4100, + "image": "/cdn/img/product/[size]/AU-02-OG.webp", + "inventory": 4 + }, + { + "id": "AU-02", + "name": "SmartFarm Titan Cosmic Sapphire", + "sku": "AU-02-BL", + "price": 4000, + "image": "/cdn/img/product/[size]/AU-02-BL.webp", + "inventory": 3 + }, + { + "id": "AU-02", + "name": "SmartFarm Titan Verdant Shadow", + "sku": "AU-02-GG", + "price": 4000, + "image": "/cdn/img/product/[size]/AU-02-GG.webp", + "inventory": 6 + }, + { + "id": "AU-03", + "name": "FutureHarvest Navigator Turquoise Titan", + "sku": "AU-03-TQ", + "price": 1600, + "image": "/cdn/img/product/[size]/AU-03-TQ.webp", + "inventory": 9 + }, + { + "id": "AU-03", + "name": "FutureHarvest Navigator Majestic Violet", + "sku": "AU-03-PL", + "price": 1700, + "image": "/cdn/img/product/[size]/AU-03-PL.webp", + "inventory": 7 + }, + { + "id": "AU-03", + "name": "FutureHarvest Navigator Scarlet Dynamo", + "sku": "AU-03-RD", + "price": 1900, + "image": "/cdn/img/product/[size]/AU-03-RD.webp", + "inventory": 8 + }, + { + "id": "AU-03", + "name": "FutureHarvest Navigator Sunbeam Yellow", + "sku": "AU-03-YE", + "price": 1800, + "image": "/cdn/img/product/[size]/AU-03-YE.webp", + "inventory": 3 + }, + { + "id": "AU-04", + "name": "Sapphire Sunworker 460R Ruby Red", + "sku": "AU-04-RD", + "price": 8700, + "image": "/cdn/img/product/[size]/AU-04-RD.webp", + "inventory": 9 + }, + { + "id": "AU-04", + "name": "Sapphire Sunworker 460R Midnight Onyx", + "sku": "AU-04-BK", + "price": 8500, + "image": "/cdn/img/product/[size]/AU-04-BK.webp", + "inventory": 8 + }, + { + "id": "AU-05", + "name": "EcoGrow Crop Commander Zestful Horizon", + "sku": "AU-05-ZH", + "price": 3400, + "image": "/cdn/img/product/[size]/AU-05-ZH.webp", + "inventory": 8 + }, + { + "id": "AU-06", + "name": "FarmFleet Sovereign Canary Zenith", + "sku": "AU-06-CZ", + "price": 2200, + "image": "/cdn/img/product/[size]/AU-06-CZ.webp", + "inventory": 3 + }, + { + "id": "AU-06", + "name": "FarmFleet Sovereign Minted Jade", + "sku": "AU-06-MT", + "price": 2100, + "image": "/cdn/img/product/[size]/AU-06-MT.webp", + "inventory": 5 + }, + { + "id": "AU-07", + "name": "Verde Voyager Glacial Mint", + "sku": "AU-07-MT", + "price": 4000, + "image": "/cdn/img/product/[size]/AU-07-MT.webp", + "inventory": 4 + }, + { + "id": "AU-07", + "name": "Verde Voyager Sunbeam Yellow", + "sku": "AU-07-YE", + "price": 5000, + "image": "/cdn/img/product/[size]/AU-07-YE.webp", + "inventory": 9 + }, + { + "id": "AU-08", + "name": "Field Pioneer Polar White", + "sku": "AU-08-WH", + "price": 4500, + "image": "/cdn/img/product/[size]/AU-08-WH.webp", + "inventory": 4 + }, + { + "id": "CL-01", + "name": "Heritage Workhorse Verdant Field", + "sku": "CL-01-GR", + "price": 5700, + "image": "/cdn/img/product/[size]/CL-01-GR.webp", + "inventory": 8 + }, + { + "id": "CL-01", + "name": "Heritage Workhorse Stormy Sky", + "sku": "CL-01-GY", + "price": 6200, + "image": "/cdn/img/product/[size]/CL-01-GY.webp", + "inventory": 7 + }, + { + "id": "CL-02", + "name": "Falcon Crest Farm Cerulean Classic", + "sku": "CL-02-BL", + "price": 2600, + "image": "/cdn/img/product/[size]/CL-02-BL.webp", + "inventory": 1 + }, + { + "id": "CL-03", + "name": "Falcon Crest Work Meadow Green", + "sku": "CL-03-GR", + "price": 2300, + "image": "/cdn/img/product/[size]/CL-03-GR.webp", + "inventory": 7 + }, + { + "id": "CL-03", + "name": "Falcon Crest Work Rustic Rose", + "sku": "CL-03-PI", + "price": 2300, + "image": "/cdn/img/product/[size]/CL-03-PI.webp", + "inventory": 3 + }, + { + "id": "CL-03", + "name": "Falcon Crest Work Harvest Gold", + "sku": "CL-03-YE", + "price": 2300, + "image": "/cdn/img/product/[size]/CL-03-YE.webp", + "inventory": 6 + }, + { + "id": "CL-04", + "name": "Broadfield Majestic Oceanic Blue", + "sku": "CL-04-BL", + "price": 2200, + "image": "/cdn/img/product/[size]/CL-04-BL.webp", + "inventory": 6 + }, + { + "id": "CL-04", + "name": "Broadfield Majestic Rustic Crimson", + "sku": "CL-04-RD", + "price": 2200, + "image": "/cdn/img/product/[size]/CL-04-RD.webp", + "inventory": 3 + }, + { + "id": "CL-04", + "name": "Broadfield Majestic Aqua Green", + "sku": "CL-04-TQ", + "price": 2200, + "image": "/cdn/img/product/[size]/CL-04-TQ.webp", + "inventory": 0 + }, + { + "id": "CL-05", + "name": "Countryside Commander Pacific Teal", + "sku": "CL-05-PT", + "price": 2700, + "image": "/cdn/img/product/[size]/CL-05-PT.webp", + "inventory": 1 + }, + { + "id": "CL-05", + "name": "Countryside Commander Barn Red", + "sku": "CL-05-RD", + "price": 2700, + "image": "/cdn/img/product/[size]/CL-05-RD.webp", + "inventory": 1 + }, + { + "id": "CL-06", + "name": "Danamark Steadfast Emerald Forest", + "sku": "CL-06-MT", + "price": 2800, + "image": "/cdn/img/product/[size]/CL-06-MT.webp", + "inventory": 1 + }, + { + "id": "CL-06", + "name": "Danamark Steadfast Golden Wheat", + "sku": "CL-06-YE", + "price": 2800, + "image": "/cdn/img/product/[size]/CL-06-YE.webp", + "inventory": 2 + }, + { + "id": "CL-07", + "name": "Greenland Rover Forest Fern", + "sku": "CL-07-GR", + "price": 2900, + "image": "/cdn/img/product/[size]/CL-07-GR.webp", + "inventory": 4 + }, + { + "id": "CL-07", + "name": "Greenland Rover Autumn Amber", + "sku": "CL-07-YE", + "price": 2900, + "image": "/cdn/img/product/[size]/CL-07-YE.webp", + "inventory": 4 + }, + { + "id": "CL-08", + "name": "Holland Hamster Polder Green", + "sku": "CL-08-GR", + "price": 7750, + "image": "/cdn/img/product/[size]/CL-08-GR.webp", + "inventory": 8 + }, + { + "id": "CL-08", + "name": "Holland Hamster Tulip Magenta", + "sku": "CL-08-PI", + "price": 7900, + "image": "/cdn/img/product/[size]/CL-08-PI.webp", + "inventory": 3 + }, + { + "id": "CL-09", + "name": "TerraFirma Veneto Adriatic Blue", + "sku": "CL-09-BL", + "price": 2950, + "image": "/cdn/img/product/[size]/CL-09-BL.webp", + "inventory": 4 + }, + { + "id": "CL-09", + "name": "TerraFirma Veneto Tuscan Green", + "sku": "CL-09-GR", + "price": 2950, + "image": "/cdn/img/product/[size]/CL-09-GR.webp", + "inventory": 7 + }, + { + "id": "CL-10", + "name": "Global Gallant Sahara Dawn", + "sku": "CL-10-SD", + "price": 2600, + "image": "/cdn/img/product/[size]/CL-10-SD.webp", + "inventory": 6 + }, + { + "id": "CL-10", + "name": "Global Gallant Violet Vintage", + "sku": "CL-10-VI", + "price": 2600, + "image": "/cdn/img/product/[size]/CL-10-VI.webp", + "inventory": 2 + }, + { + "id": "CL-11", + "name": "Scandinavia Sower Baltic Blue", + "sku": "CL-11-SK", + "price": 3100, + "image": "/cdn/img/product/[size]/CL-11-SK.webp", + "inventory": 0 + }, + { + "id": "CL-11", + "name": "Scandinavia Sower Nordic Gold", + "sku": "CL-11-YE", + "price": 3100, + "image": "/cdn/img/product/[size]/CL-11-YE.webp", + "inventory": 3 + }, + { + "id": "CL-12", + "name": "Celerity Cruiser Velocity Blue", + "sku": "CL-12-BL", + "price": 3200, + "image": "/cdn/img/product/[size]/CL-12-BL.webp", + "inventory": 8 + }, + { + "id": "CL-12", + "name": "Celerity Cruiser Rally Red", + "sku": "CL-12-RD", + "price": 3200, + "image": "/cdn/img/product/[size]/CL-12-RD.webp", + "inventory": 8 + }, + { + "id": "CL-13", + "name": "Rapid Racer Speedway Blue", + "sku": "CL-13-BL", + "price": 7500, + "image": "/cdn/img/product/[size]/CL-13-BL.webp", + "inventory": 1 + }, + { + "id": "CL-13", + "name": "Rapid Racer Raceway Red", + "sku": "CL-13-RD", + "price": 7500, + "image": "/cdn/img/product/[size]/CL-13-RD.webp", + "inventory": 5 + }, + { + "id": "CL-14", + "name": "Caribbean Cruiser Emerald Grove", + "sku": "CL-14-GR", + "price": 2300, + "image": "/cdn/img/product/[size]/CL-14-GR.webp", + "inventory": 3 + }, + { + "id": "CL-14", + "name": "Caribbean Cruiser Ruby Fields", + "sku": "CL-14-RD", + "price": 2300, + "image": "/cdn/img/product/[size]/CL-14-RD.webp", + "inventory": 5 + }, + { + "id": "CL-15", + "name": "Fieldmaster Classic Vintage Pink", + "sku": "CL-15-PI", + "price": 6200, + "image": "/cdn/img/product/[size]/CL-15-PI.webp", + "inventory": 0 + }, + { + "id": "CL-15", + "name": "Fieldmaster Classic Sahara Dust", + "sku": "CL-15-SD", + "price": 6200, + "image": "/cdn/img/product/[size]/CL-15-SD.webp", + "inventory": 9 + } + ] +} \ No newline at end of file diff --git a/examples/hono-tractor-store-2.0/src/checkout/database/import.js b/examples/hono-tractor-store-2.0/src/checkout/database/import.js new file mode 100644 index 0000000..de84101 --- /dev/null +++ b/examples/hono-tractor-store-2.0/src/checkout/database/import.js @@ -0,0 +1,43 @@ +// reads product data from a central source and writes the necessary data for this system. +// here we are reading from a js file and writing to a json file. +// in a real world scenario, you would read from a product service and write to a database. + +import fs from "fs"; +import path from "path"; +import products from "../../../products.js"; + +/** + * Generates deterministic inventory (0-10) based on the name. + * @param {string} name - The name of the variant. + * @returns {number} - The inventory count of the variant. + */ +function getInventory(name) { + const hash = name + .split("") + .reduce((acc, char) => acc + char.charCodeAt(0), 0); + return hash % 11; +} + +/** + * @type {Database} + */ +const database = { + variants: products.flatMap((p) => { + return p.variants.map((v) => { + const name = `${p.name} ${v.name}`; + return { + id: p.id, + name, + sku: v.sku, + price: v.price, + image: v.image, + inventory: getInventory(name), + }; + }); + }), +}; + +const __dirname = path.dirname(new URL(import.meta.url).pathname); +const databaseFile = path.resolve(__dirname, "./database.json"); +console.log("Writing database to", databaseFile); +fs.writeFileSync(databaseFile, JSON.stringify(database, null, 2)); diff --git a/examples/hono-tractor-store-2.0/src/checkout/database/index.js b/examples/hono-tractor-store-2.0/src/checkout/database/index.js new file mode 100644 index 0000000..19eb799 --- /dev/null +++ b/examples/hono-tractor-store-2.0/src/checkout/database/index.js @@ -0,0 +1,5 @@ +/** + * @type {Database} + */ +import data from "./database.json" assert { type: "json" }; +export default data; diff --git a/examples/hono-tractor-store-2.0/src/checkout/index.js b/examples/hono-tractor-store-2.0/src/checkout/index.js new file mode 100644 index 0000000..f4e158b --- /dev/null +++ b/examples/hono-tractor-store-2.0/src/checkout/index.js @@ -0,0 +1,5 @@ +export { default as CartPage } from "./pages/CartPage.js"; +export { default as Checkout } from "./pages/Checkout.js"; +export { default as MiniCart } from "./components/MiniCart.js"; +export { default as Thanks } from "./pages/Thanks.js"; +export * from "./actions.js"; diff --git a/examples/hono-tractor-store-2.0/src/checkout/pages/CartPage.css b/examples/hono-tractor-store-2.0/src/checkout/pages/CartPage.css new file mode 100644 index 0000000..37fc8d3 --- /dev/null +++ b/examples/hono-tractor-store-2.0/src/checkout/pages/CartPage.css @@ -0,0 +1,35 @@ +.c_CartPage { + margin: 0 auto; + max-width: calc(1000px + var(--outer-space) * 2); + padding: 0 var(--outer-space); +} + +.c_CartPage__lineItems { + list-style: none; + padding: 0; +} + +.c_CartPage hr { + border: 0; + height: 2px; + background-color: black; +} + +.c_CartPage__total { + margin: 2rem 0 3rem; + text-align: right; + font-weight: bold; +} + +.c_CartPage__buttons { + display: flex; + flex-direction: row-reverse; + flex-wrap: wrap; + justify-content: space-between; + margin-bottom: 4rem; + gap: 2rem; +} + +.c_CartPage__buttons > * { + flex: 0; +} diff --git a/examples/hono-tractor-store-2.0/src/checkout/pages/CartPage.js b/examples/hono-tractor-store-2.0/src/checkout/pages/CartPage.js new file mode 100644 index 0000000..f397083 --- /dev/null +++ b/examples/hono-tractor-store-2.0/src/checkout/pages/CartPage.js @@ -0,0 +1,59 @@ +import Page from "../components/Page.js"; +import LineItem from "../components/LineItem.js"; +import data from "../database/index.js"; +import { readFromCookie } from "../state.js"; +import { html } from "../utils.js"; +import Header from "../../explore/components/Header.js"; +import Footer from "../../explore/components/Footer.js"; +import Recommendations from "../../explore/components/Recommendations.js"; +import Button from "../components/Button.js"; + +/** + * Converts cookie line items to cart line items. + * @param {CookieLineItem[]} items - List of cookie line items. + * @returns {LineItem[]} - Cart line items. + */ +function convertToLineItems(items) { + return items.reduce((res, { sku, quantity }) => { + const variant = data.variants.find((p) => p.sku === sku); + if (variant) { + res.push({ ...variant, quantity, total: variant.price * quantity }); + } + return res; + }, []); +} + +export default ({ c }) => { + const cookieLineItems = readFromCookie(c); + const lineItems = convertToLineItems(cookieLineItems); + const total = lineItems.reduce((res, { total }) => res + total, 0); + const skus = lineItems.map(({ sku }) => sku); + const content = html` + ${Header({ c })} +
    +

    Warenkorb

    + +
    +

    Total: ${total} Ø

    + +
    + ${Button({ + href: "/checkout/checkout", + children: "Checkout", + variant: "primary", + })} + ${Button({ + href: "/", + children: "Continue Shopping", + variant: "secondary", + })} +
    + + ${Recommendations({ skus })} +
    + ${Footer()} + `; + return Page({ content }); +}; diff --git a/examples/hono-tractor-store-2.0/src/checkout/pages/Checkout.css b/examples/hono-tractor-store-2.0/src/checkout/pages/Checkout.css new file mode 100644 index 0000000..256a923 --- /dev/null +++ b/examples/hono-tractor-store-2.0/src/checkout/pages/Checkout.css @@ -0,0 +1,50 @@ +.c_Checkout { + margin: 0 auto; + max-width: calc(1000px + var(--outer-space) * 2); + padding: 0 var(--outer-space); +} + +.c_Checkout fieldset { + border: 0; + border-bottom: 2px solid black; + padding: 0 0 2rem; + margin: 0; +} + +.c_Checkout__name { + display: flex; + gap: 0 4rem; + flex-wrap: wrap; +} + +.c_Checkout__buttons { + margin: 3rem 0 4rem; + display: flex; + flex-wrap: wrap; + gap: 2rem; + justify-content: space-between; + flex-direction: row-reverse; +} + +.c_Checkout__buttons > * { + flex: 0; +} + +.c_Checkout__label { + width: 100px; + display: inline-block; +} + +.c_Checkout__input { + height: 40px; + padding: 5px 10px; + font-size: 16px; + border-radius: 8px; + margin: 1rem 0; + border: 1px solid rgba(0, 0, 0, 0.2); + box-shadow: 0 2px 4px rgba(0, 0, 0, 0.1) inset; +} + +.c_Checkout__input:read-only { + background-color: rgba(0, 0, 0, 0.05); +} diff --git a/examples/hono-tractor-store-2.0/src/checkout/pages/Checkout.js b/examples/hono-tractor-store-2.0/src/checkout/pages/Checkout.js new file mode 100644 index 0000000..e49c727 --- /dev/null +++ b/examples/hono-tractor-store-2.0/src/checkout/pages/Checkout.js @@ -0,0 +1,78 @@ +import Page from "../components/Page.js"; +import CompactHeader from "../components/CompactHeader.js"; +import { html } from "../utils.js"; +import StorePicker from "../../explore/components/StorePicker.js"; + +// imports from other teams -> fragments +import Footer from "../../explore/components/Footer.js"; +import Button from "../components/Button.js"; + +export default () => { + const content = html` + ${CompactHeader()} +
    +

    Checkout

    +
    +

    Personal Data

    +
    +
    + + +
    +
    + + +
    +
    + +

    Store Pickup

    +
    +
    ${StorePicker()}
    + + +
    + +
    + ${Button({ + children: "place order", + type: "submit", + variant: "primary", + disabled: true, + })} + ${Button({ + href: "/checkout/cart", + children: "back to cart", + variant: "secondary", + })} +
    +
    +
    + ${Footer()} + `; + return Page({ content }); +}; diff --git a/examples/hono-tractor-store-2.0/src/checkout/pages/Thanks.css b/examples/hono-tractor-store-2.0/src/checkout/pages/Thanks.css new file mode 100644 index 0000000..c7ece18 --- /dev/null +++ b/examples/hono-tractor-store-2.0/src/checkout/pages/Thanks.css @@ -0,0 +1,15 @@ +.c_Thanks { + margin: 0 auto; + max-width: calc(500px + var(--outer-space) * 2); + padding: 0 var(--outer-space); + min-height: 50vh; +} + +.c_Thanks__title { + margin: 4rem 0; + font-size: 40px; +} + +.c_Thanks__text { + margin: 4rem 0; +} diff --git a/examples/hono-tractor-store-2.0/src/checkout/pages/Thanks.js b/examples/hono-tractor-store-2.0/src/checkout/pages/Thanks.js new file mode 100644 index 0000000..35ce8c9 --- /dev/null +++ b/examples/hono-tractor-store-2.0/src/checkout/pages/Thanks.js @@ -0,0 +1,29 @@ +import Page from "../components/Page.js"; +import Header from "../../explore/components/Header.js"; +import { html } from "../utils.js"; +import Footer from "../../explore/components/Footer.js"; +import Button from "../components/Button.js"; + +/** + * Thanks component. + * @param {object} props - The properties of the Thanks component. + * @param {HonoContext} props.c - The hono context. + * @returns {string} The Thanks component markup. + */ +export default ({ c }) => { + const content = html` + ${Header({ c })} +
    +

    Thanks for your order!

    +

    We'll notify you, when its ready for pickup.

    + + ${Button({ + href: "/", + children: "Continue Shopping", + variant: "secondary", + })} +
    + ${Footer()} + `; + return Page({ content }); +}; diff --git a/examples/hono-tractor-store-2.0/src/checkout/scripts.js b/examples/hono-tractor-store-2.0/src/checkout/scripts.js new file mode 100644 index 0000000..ead7682 --- /dev/null +++ b/examples/hono-tractor-store-2.0/src/checkout/scripts.js @@ -0,0 +1,114 @@ +/* client side javascript */ + +/** + * Checkout page + * - form validation + * - react to store selected event (explore) + */ +const $checkoutForm = document.querySelector(".c_Checkout__form"); +if ($checkoutForm) { + const $submit = $checkoutForm.querySelector("button[type=submit]"); + const $storeId = document.getElementById("c_storeId"); + + const update = () => { + const isValid = $checkoutForm.checkValidity() && $storeId.value; + $submit.disabled = !isValid; + }; + + $checkoutForm.addEventListener("input", update); + update(); + + const $storePicker = document.querySelector(".c_Checkout__store"); + $storePicker.addEventListener("explore:store-selected", function (e) { + console.log("checkout: store-selected", e, e.detail); + document.getElementById("c_storeId").value = e.detail; + update(); + }); +} + +/** + * Mini cart fragment + * - updated content on updated event + * - highlight animation + */ +document.addEventListener("checkout:cart-updated", async function () { + const $miniCart = document.querySelector(".c_MiniCart"); + if ($miniCart) { + // update mini cart + const res = await fetch("/checkout/mini-cart"); + const html = await res.text(); + $miniCart.outerHTML = html; + + // highlight updated mini cart + const $newMiniCart = document.querySelector(".c_MiniCart"); + $newMiniCart.classList.add("c_MiniCart--highlight"); + setTimeout(() => { + $newMiniCart.classList.remove("c_MiniCart--highlight"); + }, 600); + } +}); + +/** + * Add to cart fragment + * - api call + * - updated mini cart event + */ +const $addToCart = document.querySelector(".c_AddToCart"); +if ($addToCart) { + $addToCart.addEventListener("submit", async function (e) { + e.preventDefault(); + const formData = new URLSearchParams(new FormData($addToCart)); + const res = await fetch("/checkout/cart/add", { + method: "POST", + body: formData, + }); + if (res.ok) { + document.dispatchEvent(new Event("checkout:cart-updated")); + console.log($addToCart.querySelector(".c_AddToCart__confirmed")); + + $addToCart + .querySelector(".c_AddToCart__confirmed") + .classList.remove("c_AddToCart__confirmed--hidden"); + } + }); +} + +/** + * Thanks page + * - confetti on load + */ +const $thanksPage = document.querySelector(".c_Thanks"); +if ($thanksPage) { + import("https://cdn.jsdelivr.net/npm/canvas-confetti@1.9.2/+esm").then( + ({ default: confetti }) => { + var end = Date.now() + 1000; + + const settings = { + particleCount: 3, + scalar: 1.5, + colors: ["#FFDE54", "#FF5A54", "#54FF90"], + spread: 70, + }; + /** + * Animates confetti particles. + */ + function frame() { + confetti({ + ...settings, + angle: 60, + origin: { x: 0 }, + }); + confetti({ + ...settings, + angle: 120, + origin: { x: 1 }, + }); + + if (Date.now() < end) { + window.requestAnimationFrame(frame); + } + } + frame(); + }, + ); +} diff --git a/examples/hono-tractor-store-2.0/src/checkout/state.js b/examples/hono-tractor-store-2.0/src/checkout/state.js new file mode 100644 index 0000000..e07934b --- /dev/null +++ b/examples/hono-tractor-store-2.0/src/checkout/state.js @@ -0,0 +1,34 @@ +import { getCookie, setCookie } from "hono/cookie"; + +const ITEM_SEP = "|"; +const QTY_SEP = "_"; +const COOKIE = "c_cart"; + +/** + * Reads the line items from the cookie. + * @param {object} c - The hono context. + * @returns {CookieLineItem[]} An array of items read from the cookie. + */ +export function readFromCookie(c) { + const cookieStr = getCookie(c, COOKIE); + + if (!cookieStr) return []; + + return cookieStr.split(ITEM_SEP).map((item) => { + const [sku, quantity] = item.split(QTY_SEP); + return { sku, quantity: parseInt(quantity, 10) }; + }); +} + +/** + * Writes the line items to the cookie. + * @param {CookieLineItem[]} items - An array of items to write to the cookie. + * @param {object} c - The hono context. + */ +export function writeToCookie(items, c) { + const cookieStr = items + .map((item) => `${item.sku}${QTY_SEP}${item.quantity}`) + .join(ITEM_SEP); + console.log("writeToCookie", cookieStr); + setCookie(c, COOKIE, cookieStr, { httpOnly: true }); +} diff --git a/examples/hono-tractor-store-2.0/src/checkout/styles.css b/examples/hono-tractor-store-2.0/src/checkout/styles.css new file mode 100644 index 0000000..d4ffa57 --- /dev/null +++ b/examples/hono-tractor-store-2.0/src/checkout/styles.css @@ -0,0 +1,39 @@ +@import url("./pages/CartPage.css"); +@import url("./pages/Checkout.css"); +@import url("./pages/Thanks.css"); +@import url("./components/MiniCart.css"); +@import url("./components/AddToCart.css"); +@import url("./components/LineItem.css"); +@import url("./components/Button.css"); +@import url("./components/CompactHeader.css"); + +@font-face { + font-family: "Raleway"; + src: url("https://cdn.the-tractor.store/cdn/font/raleway-regular.woff2") + format("woff2"); + font-weight: normal; + font-style: normal; +} + +* { + box-sizing: border-box; +} + +html { + font-family: raleway, "Helvetica Neue", Helvetica, Arial, sans-serif; + font-size: 16px; +} + +body { + padding: 0; + margin: 0; + min-height: 100vh; +} + +p { + line-height: 1.5; +} + +:root { + --outer-space: 1.5rem; +} diff --git a/examples/hono-tractor-store-2.0/src/checkout/types.js b/examples/hono-tractor-store-2.0/src/checkout/types.js new file mode 100644 index 0000000..db9281b --- /dev/null +++ b/examples/hono-tractor-store-2.0/src/checkout/types.js @@ -0,0 +1,31 @@ +/** + * @typedef {object} Variant + * @property {string} id - The ID of the product the variant belongs to. + * @property {string} name - The name of the variant. + * @property {string} sku - The SKU of the variant. + * @property {number} price - The price of the variant. + * @property {string} image - The image URL of the variant. + * @property {number} inventory - The inventory count of the variant. + */ + +/** + * @typedef {object} Database + * @property {Variant[]} variants - The variants in the database. + */ + +/** + * @typedef {object} CookieLineItem + * @property {string} sku - The SKU of the line item. + * @property {number} quantity - The quantity of the line item in the cart. + */ + +/** + * LineItem component. + * @typedef {object} LineItem + * @property {string} id - The ID of the product. + * @property {string} name - The name of the variant. + * @property {string} sku - The SKU of the variant. + * @property {number} quantity - The quantity of the variant in the cart. + * @property {number} total - The total price of the variant in the cart. + * @property {string} image - The URL of the variant image. + */ diff --git a/examples/hono-tractor-store-2.0/src/checkout/utils.js b/examples/hono-tractor-store-2.0/src/checkout/utils.js new file mode 100644 index 0000000..33f29bd --- /dev/null +++ b/examples/hono-tractor-store-2.0/src/checkout/utils.js @@ -0,0 +1,29 @@ +// for prettier formatting +// see https://prettier.io/docs/en/options.html#embedded-language-formatting +export const html = String.raw; + +// use the image server if not using local images +export const IMAGE_SERVER = + typeof process === "undefined" || process.env.USE_LOCAL_IMAGES !== "true" + ? "https://cdn.the-tractor.store" + : ""; + +/** + * Replaces the placeholder "[size]" in the image URL with the specified size. + * @param {string} image - The original image URL. + * @param {number} size - The desired size for the image. + * @returns {string} - The modified image URL with the size placeholder replaced. + */ +export function src(image, size) { + return IMAGE_SERVER + image.replace("[size]", `${size}`); +} + +/** + * Generates the srcset attribute value for an image with different sizes. + * @param {string} image - The original image URL. + * @param {number[]} sizes - The array of sizes for the image. + * @returns {string} - The srcset attribute value. + */ +export function srcset(image, sizes = []) { + return sizes.map((size) => `${src(image, size)} ${size}w`).join(", "); +} diff --git a/examples/hono-tractor-store-2.0/src/decide/components/Meta.js b/examples/hono-tractor-store-2.0/src/decide/components/Meta.js new file mode 100644 index 0000000..0165473 --- /dev/null +++ b/examples/hono-tractor-store-2.0/src/decide/components/Meta.js @@ -0,0 +1,37 @@ +import { html } from "../utils.js"; + +export default () => { + return html` + + + + + + + + + + + `; +}; diff --git a/examples/hono-tractor-store-2.0/src/decide/components/VariantOption.css b/examples/hono-tractor-store-2.0/src/decide/components/VariantOption.css new file mode 100644 index 0000000..ad679fc --- /dev/null +++ b/examples/hono-tractor-store-2.0/src/decide/components/VariantOption.css @@ -0,0 +1,74 @@ +.d_VariantOption { + display: flex; + align-items: center; + gap: 5px; +} + +.d_VariantOption__color { + width: 15px; + aspect-ratio: 1; + border-radius: 50%; + display: inline-block; + position: relative; + background-color: var(--variant-color); + box-shadow: + 0 0 2px rgba(0, 0, 0, 0.5) inset, + 0px 2px 3px rgba(0, 0, 0, 0.1); +} + +.d_VariantOption__color::before, +.d_VariantOption__color::after { + content: ""; + display: block; + position: absolute; + top: 1px; + right: 1px; + bottom: 1px; + left: 1px; + border-radius: 50%; +} +.d_VariantOption__color::before { + background: linear-gradient( + to top, + rgba(0, 0, 0, 0.3), + rgba(0, 0, 0, 0.1) 60% + ); +} +.d_VariantOption__color::after { + background: linear-gradient( + to bottom, + transparent, + rgba(255, 255, 255, 0.9) 10%, + rgba(255, 255, 255, 0.8) 30%, + transparent 30% + ); + filter: blur(1px); +} + +.d_VariantOption > a { + color: inherit; + text-decoration: none; + position: relative; +} + +.d_VariantOption > strong { + font-weight: normal; + position: relative; +} + +.d_VariantOption > strong::before, +.d_VariantOption:hover > a::before { + content: ""; + display: block; + width: 100%; + height: 2px; + bottom: -2px; + position: absolute; +} + +.d_VariantOption > strong::before { + background-color: black; +} +.d_VariantOption:hover > a::before { + background-color: var(--variant-color); +} diff --git a/examples/hono-tractor-store-2.0/src/decide/components/VariantOption.js b/examples/hono-tractor-store-2.0/src/decide/components/VariantOption.js new file mode 100644 index 0000000..56d3b91 --- /dev/null +++ b/examples/hono-tractor-store-2.0/src/decide/components/VariantOption.js @@ -0,0 +1,19 @@ +import { html } from "../utils.js"; + +/** + * VariantOption component. + * @param {object} props - The properties of the VariantOption component. + * @param {string} props.sku - The SKU of the product variant. + * @param {string} props.name - The name of the product variant. + * @param {boolean} props.selected - Whether the variant is selected. + * @param {string} props.color - The color of the product variant. + * @returns {string} The VariantOption component markup. + */ +export default ({ sku, name, selected, color }) => { + return html`
  • + + ${selected + ? html`${name}` + : html`${name}`} +
  • `; +}; diff --git a/examples/hono-tractor-store-2.0/src/decide/database/database.json b/examples/hono-tractor-store-2.0/src/decide/database/database.json new file mode 100644 index 0000000..3f4ba9b --- /dev/null +++ b/examples/hono-tractor-store-2.0/src/decide/database/database.json @@ -0,0 +1,609 @@ +{ + "products": [ + { + "name": "TerraFirma AutoCultivator T-300", + "id": "AU-01", + "category": "autonomous", + "highlightsa": [ + "Precision GPS mapping optimizes field coverage.", + "Hybrid engine ensures eco-friendly extended operation.", + "Fully autonomous with smart obstacle detection and terrain adaptation." + ], + "variants": [ + { + "name": "Silver", + "image": "/cdn/img/product/[size]/AU-01-SI.webp", + "sku": "AU-01-SI", + "color": "#C0C0C0", + "price": 1000 + } + ] + }, + { + "name": "SmartFarm Titan", + "id": "AU-02", + "category": "autonomous", + "highlights": [ + "Advanced autopilot technology for precise farming operations.", + "Eco-friendly solar-assisted power system for sustainable use.", + "Intelligent AI for real-time field analysis and automated adjustments." + ], + "variants": [ + { + "name": "Sunset Copper", + "image": "/cdn/img/product/[size]/AU-02-OG.webp", + "sku": "AU-02-OG", + "color": "#dd5219", + "price": 4100 + }, + { + "name": "Cosmic Sapphire", + "image": "/cdn/img/product/[size]/AU-02-BL.webp", + "sku": "AU-02-BL", + "color": "#2A52BE", + "price": 4000 + }, + { + "name": "Verdant Shadow", + "image": "/cdn/img/product/[size]/AU-02-GG.webp", + "sku": "AU-02-GG", + "color": "#005A04", + "price": 4000 + } + ] + }, + { + "name": "FutureHarvest Navigator", + "id": "AU-03", + "category": "autonomous", + "highlights": [ + "Autonomous navigation with sub-inch accuracy", + "Solar-enhanced hybrid powertrain for extended operation", + "Real-time crop and soil health analytics" + ], + "variants": [ + { + "name": "Turquoise Titan", + "image": "/cdn/img/product/[size]/AU-03-TQ.webp", + "sku": "AU-03-TQ", + "color": "#169fb8", + "price": 1600 + }, + { + "name": "Majestic Violet", + "image": "/cdn/img/product/[size]/AU-03-PL.webp", + "sku": "AU-03-PL", + "color": "#9B5FC0", + "price": 1700 + }, + { + "name": "Scarlet Dynamo", + "image": "/cdn/img/product/[size]/AU-03-RD.webp", + "sku": "AU-03-RD", + "color": "#FF2400", + "price": 1900 + }, + { + "name": "Sunbeam Yellow", + "image": "/cdn/img/product/[size]/AU-03-YE.webp", + "sku": "AU-03-YE", + "color": "#faad00", + "price": 1800 + } + ] + }, + { + "name": "Sapphire Sunworker 460R", + "id": "AU-04", + "category": "autonomous", + "highlights": [ + "Next-generation autonomous guidance system for seamless operation", + "High-capacity energy storage for all-day work without recharge", + "Advanced analytics suite for precision soil and plant health management" + ], + "variants": [ + { + "name": "Ruby Red", + "image": "/cdn/img/product/[size]/AU-04-RD.webp", + "sku": "AU-04-RD", + "color": "#9B111E", + "price": 8700 + }, + { + "name": "Midnight Onyx", + "image": "/cdn/img/product/[size]/AU-04-BK.webp", + "sku": "AU-04-BK", + "color": "#353839", + "price": 8500 + } + ] + }, + { + "name": "EcoGrow Crop Commander", + "id": "AU-05", + "category": "autonomous", + "highlights": [ + "Ultra-precise field navigation technology", + "Dual-mode power system for maximum uptime", + "On-the-go field data analysis for smart farming decisions" + ], + "variants": [ + { + "name": "Zestful Horizon", + "image": "/cdn/img/product/[size]/AU-05-ZH.webp", + "sku": "AU-05-ZH", + "color": "#FFA07A", + "price": 3400 + } + ] + }, + { + "name": "FarmFleet Sovereign", + "id": "AU-06", + "category": "autonomous", + "highlights": [ + "Robust all-terrain adaptability for diverse farm landscapes", + "High-efficiency energy matrix for longer field endurance", + "Integrated crop management system with advanced diagnostics" + ], + "variants": [ + { + "name": "Canary Zenith", + "image": "/cdn/img/product/[size]/AU-06-CZ.webp", + "sku": "AU-06-CZ", + "color": "#FFD700", + "price": 2200 + }, + { + "name": "Minted Jade", + "color": "#628882", + "image": "/cdn/img/product/[size]/AU-06-MT.webp", + "sku": "AU-06-MT", + "price": 2100 + } + ] + }, + { + "name": "Verde Voyager", + "id": "AU-07", + "category": "autonomous", + "highlights": [ + "Adaptive drive system intelligently navigates through diverse field conditions", + "Clean energy operation with advanced solar battery technology", + "High-resolution field scanners for precise agronomy insights" + ], + "variants": [ + { + "name": "Glacial Mint", + "image": "/cdn/img/product/[size]/AU-07-MT.webp", + "sku": "AU-07-MT", + "color": "#AFDBD2", + "price": 4000 + }, + { + "name": "Sunbeam Yellow", + "image": "/cdn/img/product/[size]/AU-07-YE.webp", + "sku": "AU-07-YE", + "color": "#FFDA03", + "price": 5000 + } + ] + }, + { + "name": "Field Pioneer", + "id": "AU-08", + "category": "autonomous", + "highlights": [ + "Automated field traversal with intelligent pathfinding algorithms", + "Eco-friendly electric motors paired with high-capacity batteries", + "Real-time environmental monitoring for optimal crop growth" + ], + "variants": [ + { + "name": "Polar White", + "image": "/cdn/img/product/[size]/AU-08-WH.webp", + "sku": "AU-08-WH", + "color": "#E8E8E8", + "price": 4500 + } + ] + }, + { + "name": "Heritage Workhorse", + "id": "CL-01", + "category": "classic", + "highlights": [ + "Proven reliability with a touch of modern reliability enhancements", + "Robust construction equipped to withstand decades of labor", + "User-friendly operation with traditional manual controls" + ], + "variants": [ + { + "name": "Verdant Field", + "image": "/cdn/img/product/[size]/CL-01-GR.webp", + "sku": "CL-01-GR", + "color": "#6B8E23", + "price": 5700 + }, + { + "name": "Stormy Sky", + "image": "/cdn/img/product/[size]/CL-01-GY.webp", + "sku": "CL-01-GY", + "color": "#708090", + "price": 6200 + } + ] + }, + { + "name": "Falcon Crest Farm", + "id": "CL-02", + "category": "classic", + "highlights": [ + "Rugged simplicity meets classic design", + "Built-to-last machinery for reliable fieldwork", + "Ease of control with straightforward mechanical systems" + ], + "variants": [ + { + "name": "Cerulean Classic", + "image": "/cdn/img/product/[size]/CL-02-BL.webp", + "sku": "CL-02-BL", + "color": "#007BA7", + "price": 2600 + } + ] + }, + { + "name": "Falcon Crest Work", + "id": "CL-03", + "category": "classic", + "highlights": [ + "Vintage engineering with a legacy of durability", + "Powerful yet simple mechanics for easy operation and repair", + "Classic aesthetics with a robust body, built to last" + ], + "variants": [ + { + "name": "Meadow Green", + "image": "/cdn/img/product/[size]/CL-03-GR.webp", + "sku": "CL-03-GR", + "color": "#7CFC00", + "price": 2300 + }, + { + "name": "Rustic Rose", + "image": "/cdn/img/product/[size]/CL-03-PI.webp", + "sku": "CL-03-PI", + "color": "#b50018", + "price": 2300 + }, + { + "name": "Harvest Gold", + "image": "/cdn/img/product/[size]/CL-03-YE.webp", + "sku": "CL-03-YE", + "color": "#DA9100", + "price": 2300 + } + ] + }, + { + "name": "Broadfield Majestic", + "id": "CL-04", + "category": "classic", + "highlights": [ + "Built with the robust heart of early industrial workhorses", + "Simplified mechanics for unparalleled ease of use and maintenance", + "A testament to early agricultural machinery with a dependable engine" + ], + "variants": [ + { + "name": "Oceanic Blue", + "image": "/cdn/img/product/[size]/CL-04-BL.webp", + "sku": "CL-04-BL", + "color": "#0040a6", + "price": 2200 + }, + { + "name": "Rustic Crimson", + "image": "/cdn/img/product/[size]/CL-04-RD.webp", + "sku": "CL-04-RD", + "color": "#7B3F00", + "price": 2200 + }, + { + "name": "Aqua Green", + "image": "/cdn/img/product/[size]/CL-04-TQ.webp", + "sku": "CL-04-TQ", + "color": "#00b298", + "price": 2200 + } + ] + }, + { + "name": "Countryside Commander", + "id": "CL-05", + "category": "classic", + "highlights": [ + "Reliable performance with time-tested engineering", + "Rugged design for efficient operation across all types of terrain", + "Classic operator comfort with modern ergonomic enhancements" + ], + "variants": [ + { + "name": "Pacific Teal", + "image": "/cdn/img/product/[size]/CL-05-PT.webp", + "sku": "CL-05-PT", + "color": "#479da8", + "price": 2700 + }, + { + "name": "Barn Red", + "image": "/cdn/img/product/[size]/CL-05-RD.webp", + "sku": "CL-05-RD", + "color": "#7C0A02", + "price": 2700 + } + ] + }, + { + "name": "Danamark Steadfast", + "id": "CL-06", + "category": "classic", + "highlights": [ + "Engineered for the meticulous demands of Danish agriculture", + "Sturdy chassis and reliable mechanics for longevity", + "Utilitarian design with practical functionality and comfort" + ], + "variants": [ + { + "name": "Emerald Forest", + "image": "/cdn/img/product/[size]/CL-06-MT.webp", + "sku": "CL-06-MT", + "color": "#46f5bb", + "price": 2800 + }, + { + "name": "Golden Wheat", + "image": "/cdn/img/product/[size]/CL-06-YE.webp", + "sku": "CL-06-YE", + "color": "#faaf3f", + "price": 2800 + } + ] + }, + { + "name": "Greenland Rover", + "id": "CL-07", + "category": "classic", + "highlights": [ + "Engineered to tackle the diverse European terrain with ease", + "Sturdy and reliable mechanics known for their longevity", + "Ergonomically designed for comfort during long working hours" + ], + "variants": [ + { + "name": "Forest Fern", + "image": "/cdn/img/product/[size]/CL-07-GR.webp", + "sku": "CL-07-GR", + "color": "#2ea250", + "price": 2900 + }, + { + "name": "Autumn Amber", + "image": "/cdn/img/product/[size]/CL-07-YE.webp", + "sku": "CL-07-YE", + "color": "#FFBF00", + "price": 2900 + } + ] + }, + { + "name": "Holland Hamster", + "id": "CL-08", + "category": "classic", + "highlights": [ + "Dutch craftsmanship for precision and quality", + "Optimized for tulip fields and versatile European landscapes", + "Ergonomic design with a focus on operator comfort and efficiency" + ], + "variants": [ + { + "name": "Polder Green", + "image": "/cdn/img/product/[size]/CL-08-GR.webp", + "sku": "CL-08-GR", + "color": "#C2B280", + "price": 7750 + }, + { + "name": "Tulip Magenta", + "image": "/cdn/img/product/[size]/CL-08-PI.webp", + "sku": "CL-08-PI", + "color": "#D65282", + "price": 7900 + } + ] + }, + { + "name": "TerraFirma Veneto", + "id": "CL-09", + "category": "classic", + "highlights": [ + "Elegant Italian design with sleek lines and a vibrant aesthetic", + "Precision mechanics for vineyard and orchard maneuverability", + "Comfort-focused design with a flair for the dramatic" + ], + "variants": [ + { + "name": "Adriatic Blue", + "image": "/cdn/img/product/[size]/CL-09-BL.webp", + "sku": "CL-09-BL", + "color": "#2f6ea3", + "price": 2950 + }, + { + "name": "Tuscan Green", + "image": "/cdn/img/product/[size]/CL-09-GR.webp", + "sku": "CL-09-GR", + "color": "#518b2b", + "price": 2950 + } + ] + }, + { + "name": "Global Gallant", + "id": "CL-10", + "category": "classic", + "highlights": [ + "Retro design with a nod to the golden era of farming", + "Engine robustness that stands the test of time", + "Functional simplicity for ease of operation in any region" + ], + "variants": [ + { + "name": "Sahara Dawn", + "image": "/cdn/img/product/[size]/CL-10-SD.webp", + "sku": "CL-10-SD", + "color": "#b8a875", + "price": 2600 + }, + { + "name": "Violet Vintage", + "image": "/cdn/img/product/[size]/CL-10-VI.webp", + "sku": "CL-10-VI", + "color": "#8A2BE2", + "price": 2600 + } + ] + }, + { + "name": "Scandinavia Sower", + "id": "CL-11", + "category": "classic", + "highlights": [ + "Authentic Swedish engineering for optimal cold-climate performance", + "Sturdy build and mechanics for lifelong reliability", + "Iconic design reflecting the simplicity and efficiency of Scandinavian style" + ], + "variants": [ + { + "name": "Baltic Blue", + "image": "/cdn/img/product/[size]/CL-11-SK.webp", + "sku": "CL-11-SK", + "color": "#95c1f4", + "price": 3100 + }, + { + "name": "Nordic Gold", + "image": "/cdn/img/product/[size]/CL-11-YE.webp", + "sku": "CL-11-YE", + "color": "#FFD700", + "price": 3100 + } + ] + }, + { + "name": "Celerity Cruiser", + "id": "CL-12", + "category": "classic", + "highlights": [ + "A speedster in the classic tractor segment, unparalleled in quick task completion", + "Sleek design with aerodynamic contours for reduced drag", + "Enhanced gearbox for smooth acceleration and nimble handling" + ], + "variants": [ + { + "name": "Velocity Blue", + "image": "/cdn/img/product/[size]/CL-12-BL.webp", + "sku": "CL-12-BL", + "color": "#1E90FF", + "price": 3200 + }, + { + "name": "Rally Red", + "image": "/cdn/img/product/[size]/CL-12-RD.webp", + "sku": "CL-12-RD", + "color": "#ED2939", + "price": 3200 + } + ] + }, + { + "name": "Rapid Racer", + "id": "CL-13", + "category": "classic", + "highlights": [ + "Streamlined design for faster field operations", + "Optimized gear ratios for efficient power transmission", + "Advanced air flow system for superior engine cooling" + ], + "variants": [ + { + "name": "Speedway Blue", + "image": "/cdn/img/product/[size]/CL-13-BL.webp", + "sku": "CL-13-BL", + "color": "#2679a6", + "price": 7500 + }, + { + "name": "Raceway Red", + "image": "/cdn/img/product/[size]/CL-13-RD.webp", + "sku": "CL-13-RD", + "color": "#CF1020", + "price": 7500 + } + ] + }, + { + "name": "Caribbean Cruiser", + "id": "CL-14", + "category": "classic", + "highlights": [ + "Robust construction for enduring performance", + "Time-tested design with a proven track record", + "Easy-to-service mechanics for long-term reliability" + ], + "variants": [ + { + "name": "Emerald Grove", + "image": "/cdn/img/product/[size]/CL-14-GR.webp", + "sku": "CL-14-GR", + "color": "#57ae13", + "price": 2300 + }, + { + "name": "Ruby Fields", + "image": "/cdn/img/product/[size]/CL-14-RD.webp", + "sku": "CL-14-RD", + "color": "#cd2b1e", + "price": 2300 + } + ] + }, + { + "name": "Fieldmaster Classic", + "id": "CL-15", + "category": "classic", + "highlights": [ + "Timeless design with a focus on comfort and control", + "Efficient fuel consumption with a powerful engine", + "Versatile functionality for all types of agricultural work" + ], + "variants": [ + { + "name": "Vintage Pink", + "image": "/cdn/img/product/[size]/CL-15-PI.webp", + "sku": "CL-15-PI", + "color": "#e1949e", + "price": 6200 + }, + { + "name": "Sahara Dust", + "image": "/cdn/img/product/[size]/CL-15-SD.webp", + "sku": "CL-15-SD", + "color": "#dec78c", + "price": 6200 + } + ] + } + ] +} \ No newline at end of file diff --git a/examples/hono-tractor-store-2.0/src/decide/database/import.js b/examples/hono-tractor-store-2.0/src/decide/database/import.js new file mode 100644 index 0000000..8f810f9 --- /dev/null +++ b/examples/hono-tractor-store-2.0/src/decide/database/import.js @@ -0,0 +1,19 @@ +// reads product data from a central source and writes the necessary data for this system. +// here we are reading from a js file and writing to a json file. +// in a real world scenario, you would read from a product service and write to a database. + +import fs from "fs"; +import path from "path"; +import products from "../../../products.js"; + +/** + * @type {Database} + */ +const database = { + products, +}; + +const __dirname = path.dirname(new URL(import.meta.url).pathname); +const databaseFile = path.resolve(__dirname, "./database.json"); +console.log("Writing database to", databaseFile); +fs.writeFileSync(databaseFile, JSON.stringify(database, null, 2)); diff --git a/examples/hono-tractor-store-2.0/src/decide/database/index.js b/examples/hono-tractor-store-2.0/src/decide/database/index.js new file mode 100644 index 0000000..19eb799 --- /dev/null +++ b/examples/hono-tractor-store-2.0/src/decide/database/index.js @@ -0,0 +1,5 @@ +/** + * @type {Database} + */ +import data from "./database.json" assert { type: "json" }; +export default data; diff --git a/examples/hono-tractor-store-2.0/src/decide/index.js b/examples/hono-tractor-store-2.0/src/decide/index.js new file mode 100644 index 0000000..0524981 --- /dev/null +++ b/examples/hono-tractor-store-2.0/src/decide/index.js @@ -0,0 +1 @@ +export { default as ProductPage } from "./pages/ProductPage.js"; diff --git a/examples/hono-tractor-store-2.0/src/decide/pages/ProductPage.css b/examples/hono-tractor-store-2.0/src/decide/pages/ProductPage.css new file mode 100644 index 0000000..8ec51a8 --- /dev/null +++ b/examples/hono-tractor-store-2.0/src/decide/pages/ProductPage.css @@ -0,0 +1,63 @@ +.d_ProductPage { + margin: 0 auto; + max-width: calc(1000px + var(--outer-space) * 2); + padding: 0 var(--outer-space); +} + +.d_ProductPage__details { + @media (max-width: 499px) { + grid-template: + "image" + "information"; + } + + @media (min-width: 500px) and (max-width: 999px) { + grid-template: + ". image. " + ". information ." / 1fr 3fr 1fr; + } + + @media (min-width: 1000px) { + grid-template: "image information" 1fr / 4fr 5fr; + gap: 10%; + min-height: clamp(400px, calc(70vh - 400px), 650px); + } + + display: grid; + justify-content: space-between; + align-items: center; + margin-bottom: 1rem; +} + +.d_ProductPage__productImage { + grid-area: image; + width: 100%; + height: auto; +} + +.d_ProductPage__productInformation { + grid-area: information; +} + +.d_ProductPage__title { + margin: 0; + font-size: 40px; +} + +.d_ProductPage__highlights { + padding: 0; + list-style: none; +} + +.d_ProductPage__highlights > li { + margin-bottom: 1rem; +} + +.d_ProductPage__variants { + display: flex; + flex-wrap: wrap; + gap: 1.5rem; + list-style: none; + margin-top: 3rem; + padding: 0; +} diff --git a/examples/hono-tractor-store-2.0/src/decide/pages/ProductPage.js b/examples/hono-tractor-store-2.0/src/decide/pages/ProductPage.js new file mode 100644 index 0000000..59e0beb --- /dev/null +++ b/examples/hono-tractor-store-2.0/src/decide/pages/ProductPage.js @@ -0,0 +1,73 @@ +import VariantOption from "../components/VariantOption.js"; +import Header from "../../explore/components/Header.js"; +import Footer from "../../explore/components/Footer.js"; +import AddToCart from "../../checkout/components/AddToCart.js"; +import Recommendations from "../../explore/components/Recommendations.js"; +import { html, src, srcset } from "../utils.js"; +import data from "../database/index.js"; +import Meta from "../components/Meta.js"; + +/** + * ProductPage component. + * @param {object} props - The properties of the ProductPage component. + * @param {string} props.id - The ID of the product. + * @param {string} props.sku - The SKU of the selected variant. + * @param {HonoContext} props.c - The hone object. + * @returns {string} The ProductPage component markup. + */ +export default ({ id, sku, c }) => { + const { + name, + variants, + highlights = [], + } = data.products.find((p) => p.id === id); + const variant = variants.find((v) => v.sku === sku) || variants[0]; + + return html` + + + Tractor Store + + + + ${Meta()} + + + ${Header({ c })} +
    +
    + +
    +

    ${name}

    +
      + ${highlights + .map((highlight) => html`
    • ${highlight}
    • `) + .join("")} +
    +
      + ${variants + .map((v) => + VariantOption({ ...v, selected: v.sku === variant.sku }), + ) + .join("")} +
    + ${AddToCart({ sku: variant.sku })} +
    +
    + ${Recommendations({ skus: [variant.sku] })} +
    + ${Footer()} + + + + + + `; +}; diff --git a/examples/hono-tractor-store-2.0/src/decide/scripts.js b/examples/hono-tractor-store-2.0/src/decide/scripts.js new file mode 100644 index 0000000..2d3ccd2 --- /dev/null +++ b/examples/hono-tractor-store-2.0/src/decide/scripts.js @@ -0,0 +1 @@ +/* client side javascript */ diff --git a/examples/hono-tractor-store-2.0/src/decide/styles.css b/examples/hono-tractor-store-2.0/src/decide/styles.css new file mode 100644 index 0000000..0320128 --- /dev/null +++ b/examples/hono-tractor-store-2.0/src/decide/styles.css @@ -0,0 +1,32 @@ +@import url("./pages/ProductPage.css"); +@import url("./components/VariantOption.css"); + +@font-face { + font-family: "Raleway"; + src: url("https://cdn.the-tractor.store/cdn/font/Raleway-Regular.woff2") + format("woff2"); + font-weight: normal; + font-style: normal; +} + +* { + box-sizing: border-box; +} + +html { + font-family: Raleway, "Helvetica Neue", Helvetica, Arial, sans-serif; + font-size: 16px; +} + +body { + padding: 0; + margin: 0; +} + +p { + line-height: 1.5; +} + +:root { + --outer-space: 1.5rem; +} diff --git a/examples/hono-tractor-store-2.0/src/decide/types.js b/examples/hono-tractor-store-2.0/src/decide/types.js new file mode 100644 index 0000000..5cd0c0a --- /dev/null +++ b/examples/hono-tractor-store-2.0/src/decide/types.js @@ -0,0 +1,22 @@ +/** + * @typedef {object} Variant + * @property {string} name - The name of the variant. + * @property {string} image - The URL of the variant image. + * @property {string} sku - The SKU of the variant. + * @property {string} color - The color of the variant. + * @property {number} price - The price of the variant. + */ + +/** + * @typedef {object} Product + * @property {string} name - The name of the product. + * @property {string} id - The ID of the product. + * @property {string} category - The category of the product. + * @property {string[]} highlights - The highlights of the product. + * @property {Variant[]} variants - The variants of the product. + */ + +/** + * @typedef {object} Database + * @property {Product[]} products - The products in the database. + */ diff --git a/examples/hono-tractor-store-2.0/src/decide/utils.js b/examples/hono-tractor-store-2.0/src/decide/utils.js new file mode 100644 index 0000000..33f29bd --- /dev/null +++ b/examples/hono-tractor-store-2.0/src/decide/utils.js @@ -0,0 +1,29 @@ +// for prettier formatting +// see https://prettier.io/docs/en/options.html#embedded-language-formatting +export const html = String.raw; + +// use the image server if not using local images +export const IMAGE_SERVER = + typeof process === "undefined" || process.env.USE_LOCAL_IMAGES !== "true" + ? "https://cdn.the-tractor.store" + : ""; + +/** + * Replaces the placeholder "[size]" in the image URL with the specified size. + * @param {string} image - The original image URL. + * @param {number} size - The desired size for the image. + * @returns {string} - The modified image URL with the size placeholder replaced. + */ +export function src(image, size) { + return IMAGE_SERVER + image.replace("[size]", `${size}`); +} + +/** + * Generates the srcset attribute value for an image with different sizes. + * @param {string} image - The original image URL. + * @param {number[]} sizes - The array of sizes for the image. + * @returns {string} - The srcset attribute value. + */ +export function srcset(image, sizes = []) { + return sizes.map((size) => `${src(image, size)} ${size}w`).join(", "); +} diff --git a/examples/hono-tractor-store-2.0/src/explore/components/Button.css b/examples/hono-tractor-store-2.0/src/explore/components/Button.css new file mode 100644 index 0000000..3f13186 --- /dev/null +++ b/examples/hono-tractor-store-2.0/src/explore/components/Button.css @@ -0,0 +1,115 @@ +.e_Button { + --button-height: 50px; + display: block; + height: var(--button-height); + width: 100%; + border-radius: calc(var(--button-height) / 2); + padding: 2px; + border: 0; + background: linear-gradient(180deg, rgb(168, 168, 168), rgb(255, 255, 255)), + var(--accent-color); + box-shadow: + 0 -2px 3px rgb(229, 229, 229), + 0 2px 3px 2px rgb(255, 255, 255), + 0 0 25px rgba(0, 0, 0, 0.05), + 0 -10px 5px rgb(255, 255, 255) inset; + position: relative; + text-transform: uppercase; + letter-spacing: 0.3em; + -webkit-tap-highlight-color: rgba(0, 0, 0, 0); + text-decoration: none; + font-size: 16px; +} + +.e_Button--primary { + --accent-color: #ff5a55; + color: #fff; +} + +.e_Button--secondary { + --accent-color: #ffffff; + color: #000; +} + +.e_Button--rounded { + --button-height: 66px; + width: var(--button-height); +} + +.e_Button[disabled] { + --accent-color: #d3d3d3; + pointer-events: none; +} + +.e_Button::before { + position: absolute; + top: 0; + right: 0; + bottom: 0; + border-radius: inherit; + left: 0; + background: linear-gradient( + 0deg, + rgba(0, 0, 0, 0.19), + rgba(255, 255, 255, 0.3) + ), + var(--accent-color); + content: ""; + box-shadow: 0 2px 1px -1px rgba(0, 0, 0, 0.1); + display: block; + transition: + transform 0.3s, + box-shadow 0.3s, + background 0.1s 0.2s; +} + +.e_Button__inner { + position: relative; + padding-left: 20px; + padding-right: 20px; + background-color: var(--accent-color); + height: calc(var(--button-height) - 4px); + border-radius: inherit; + display: grid; + place-content: center; + transition: + transform 0.3s, + background 0.3s, + box-shadow 0.3s; + -webkit-user-select: none; /* Safari */ + -ms-user-select: none; /* IE 10 and IE 11 */ + user-select: none; + white-space: nowrap; +} + +.e_Button:hover .e_Button__inner, +.e_Button:focus .e_Button__inner { + background: linear-gradient(0deg, rgba(0, 0, 0, 0.05), rgba(0, 0, 0, 0.05)), + var(--accent-color); +} + +.e_Button:focus { + /* outline: none; */ +} + +.e_Button:active::before { + background: linear-gradient(0deg, rgba(0, 0, 0, 0.09), rgba(0, 0, 0, 0.16)), + var(--accent-color); + box-shadow: + 0 0 3px rgba(0, 0, 0, 0.6) inset, + 0 2px 1px -1px rgba(0, 0, 0, 0.1); + transform: scale(0.97); + transition: + all 0.1s, + background 0.05s; +} + +.e_Button:active .e_Button__inner { + transform: scale(0.97); + background: linear-gradient(0deg, rgba(0, 0, 0, 0.1), rgba(0, 0, 0, 0.1)), + var(--accent-color); + transition: all 0.1s; + box-shadow: + 0 5px 5px rgba(0, 0, 0, 0.2) inset, + 0 -3px 3px rgba(255, 255, 255, 0.2) inset; +} diff --git a/examples/hono-tractor-store-2.0/src/explore/components/Button.js b/examples/hono-tractor-store-2.0/src/explore/components/Button.js new file mode 100644 index 0000000..302b715 --- /dev/null +++ b/examples/hono-tractor-store-2.0/src/explore/components/Button.js @@ -0,0 +1,26 @@ +import { html } from "../utils.js"; + +export default ({ + href, + type, + value, + disabled, + rounded, + className, + children, + dataId, + variant = "secondary", +}) => { + const tag = href ? "a" : "button"; + return html` <${tag} + ${disabled ? "disabled" : ""} + ${href ? `href="${href}"` : ""} + ${type ? `type="${type}"` : ""} + ${value ? `value="${value}"` : ""} + ${dataId ? `data-id="${dataId}"` : ""} + class="e_Button e_Button--${variant} ${className} ${rounded ? "e_Button--rounded" : ""}" + ontouchstart + > +
    ${children}
    + `; +}; diff --git a/examples/hono-tractor-store-2.0/src/explore/components/Filter.css b/examples/hono-tractor-store-2.0/src/explore/components/Filter.css new file mode 100644 index 0000000..7ec2f41 --- /dev/null +++ b/examples/hono-tractor-store-2.0/src/explore/components/Filter.css @@ -0,0 +1,41 @@ +.e_Filter { + display: flex; + justify-content: flex-end; + margin-bottom: var(--outer-space); + gap: 1rem; +} + +.e_Filter ul { + display: flex; + list-style: none; + gap: 0.8rem; + padding: 0; + margin: 0; +} + +.e_Filter li { + position: relative; +} + +.e_Filter a { + color: inherit; + text-decoration: none; +} + +.e_Filter__filter--active::before, +.e_Filter a:hover::before { + content: ""; + display: block; + width: 100%; + height: 2px; + bottom: -2px; + position: absolute; +} + +.e_Filter__filter--active::before { + background-color: black; +} + +.e_Filter a:hover::before { + background-color: #ff5a55; +} diff --git a/examples/hono-tractor-store-2.0/src/explore/components/Filter.js b/examples/hono-tractor-store-2.0/src/explore/components/Filter.js new file mode 100644 index 0000000..5969a8a --- /dev/null +++ b/examples/hono-tractor-store-2.0/src/explore/components/Filter.js @@ -0,0 +1,16 @@ +import { html } from "../utils.js"; + +export default ({ filters }) => { + return html`
    + Filter: + +
    `; +}; diff --git a/examples/hono-tractor-store-2.0/src/explore/components/Footer.css b/examples/hono-tractor-store-2.0/src/explore/components/Footer.css new file mode 100644 index 0000000..30870f6 --- /dev/null +++ b/examples/hono-tractor-store-2.0/src/explore/components/Footer.css @@ -0,0 +1,138 @@ +.e_Footer { + max-width: calc(1000px + var(--outer-space) * 2); + margin: 1rem auto 2rem; + align-items: center; +} + +.e_Footer__cutter { + @media (min-width: 1100px) { + margin: 0 calc(var(--outer-space) * -1); + } + overflow: hidden; + padding: 30px 0 0; +} + +.e_Footer__inner { + @media (max-width: 999px) { + padding: 3rem var(--outer-space); + } + + @media (min-width: 1000px) { + display: flex; + padding: 3rem calc(2 * var(--outer-space)); + } + + @media (min-width: 1000px) and (max-width: 1099px) { + padding: 3rem var(--outer-space); + display: flex; + } + + min-height: 135px; + box-shadow: 0 10px 20px 10px #eb5b5920; + border-top: 1px solid #eeebe2; + mix-blend-mode: darken; +} + +.e_Footer__inner::before, +.e_Footer__inner::after { + position: absolute; + top: 0; + width: 48px; + height: calc(100% + 30px); +} + +@media (min-width: 1000px) { + .e_Footer__inner::before, + .e_Footer__inner::after { + content: ""; + display: block; + } +} + +@media (max-width: 1099px) { + .e_Footer__inner::before, + .e_Footer__inner::after { + width: var(--outer-space); + } +} + +@media (min-width: 1100px) { + .e_Footer__inner::before, + .e_Footer__inner::after { + width: calc(var(--outer-space) * 2); + } +} + +.e_Footer__inner::before { + left: 0; + background: linear-gradient( + 90deg, + rgba(255, 255, 255, 1), + rgba(255, 255, 255, 0) + ); +} + +@media (min-width: 1100px) { + .e_Footer__inner::before { + left: calc(var(--outer-space) * -1); + } +} + +.e_Footer__inner::after { + right: 0; + background: linear-gradient( + -90deg, + rgba(255, 255, 255, 1), + rgba(255, 255, 255, 0) + ); +} + +@media (min-width: 1100px) { + .e_Footer__inner::after { + right: calc(var(--outer-space) * -1); + } +} + +.e_Footer a { + color: #ff5a55; +} + +.e_Footer__initiative { + display: flex; + gap: 1rem; + align-items: flex-start; + flex: 1; + margin-bottom: 2rem; +} + +.e_Footer__initiative, +.e_Footer__credits { + flex-grow: 1; + flex-shrink: 1; + flex-basis: 50%; +} + +.e_Footer__initiative img { + margin-top: 4px; + width: 45px; +} + +.e_Footer__initiative p { + margin: 0; +} + +.e_Footer__credits h4 { + margin: 0; + font-size: 1em; + font-weight: normal; + color: #ff5a55; +} + +.e_Footer__credits p { + margin: 0 0 1rem; +} + +.e_Footer__credits img { + display: inline-block; + width: 15px; +} diff --git a/examples/hono-tractor-store-2.0/src/explore/components/Footer.js b/examples/hono-tractor-store-2.0/src/explore/components/Footer.js new file mode 100644 index 0000000..382b5c4 --- /dev/null +++ b/examples/hono-tractor-store-2.0/src/explore/components/Footer.js @@ -0,0 +1,53 @@ +import { html, IMAGE_SERVER } from "../utils.js"; + +export default () => { + return html``; +}; diff --git a/examples/hono-tractor-store-2.0/src/explore/components/Header.css b/examples/hono-tractor-store-2.0/src/explore/components/Header.css new file mode 100644 index 0000000..ab33f0d --- /dev/null +++ b/examples/hono-tractor-store-2.0/src/explore/components/Header.css @@ -0,0 +1,135 @@ +.e_Header { + max-width: calc(1000px + var(--outer-space) * 2); + margin: 1rem auto 0; + align-items: center; +} + +.e_Header__cutter { + @media (min-width: 1100px) { + margin: 0 calc(var(--outer-space) * -1); + } + overflow: hidden; + padding: 0 0 30px; +} + +.e_Header__inner { + @media (max-width: 999px) { + display: grid; + grid-template: + "logo mini-cart" + "navigation navigation"; + } + + @media (min-width: 1000px) { + padding: 0 var(--outer-space); + display: flex; + align-items: center; + flex-wrap: wrap; + justify-content: space-between; + } + + @media (min-width: 1000px) and (max-width: 1099px) { + padding: 0; + display: flex; + align-items: center; + flex-wrap: wrap; + justify-content: space-between; + } + + min-height: 135px; + box-shadow: 0 0 20px 10px #eb5b5920; + border-bottom: 1px solid #eeebe2; + mix-blend-mode: darken; + flex: 1; +} + +.e_Header__inner::before, +.e_Header__inner::after { + position: absolute; + top: 0; + width: 48px; + height: calc(100% + 30px); +} + +@media (min-width: 1000px) { + .e_Header__inner::before, + .e_Header__inner::after { + content: ""; + display: block; + } +} + +@media (max-width: 1099px) { + .e_Header__inner::before, + .e_Header__inner::after { + width: var(--outer-space); + } +} + +@media (min-width: 1100px) { + .e_Header__inner::before, + .e_Header__inner::after { + width: calc(var(--outer-space) * 2); + } +} + +.e_Header__inner::before { + left: 0; + background: linear-gradient( + 90deg, + rgba(255, 255, 255, 1), + rgba(255, 255, 255, 0) + ); +} + +@media (min-width: 1100px) { + .e_Header__inner::before { + left: calc(var(--outer-space) * -1); + } +} + +.e_Header__inner::after { + right: 0; + background: linear-gradient( + -90deg, + rgba(255, 255, 255, 1), + rgba(255, 255, 255, 0) + ); +} + +@media (min-width: 1100px) { + .e_Header__inner::after { + right: calc(var(--outer-space) * -1); + } +} + +.e_Header__logo { + @media (max-width: 499px) { + width: 170px; + } + + @media (min-width: 500px) { + width: 270px; + } + display: block; +} + +.e_Header__link { + grid-area: logo; + display: flex; + margin-left: var(--outer-space); + align-items: center; +} + +.e_Header__cart { + grid-area: mini-cart; + display: flex; + justify-content: flex-end; +} + +.e_Header__navigation { + @media (max-width: 999px) { + margin-bottom: 1rem; + } + grid-area: navigation; +} diff --git a/examples/hono-tractor-store-2.0/src/explore/components/Header.js b/examples/hono-tractor-store-2.0/src/explore/components/Header.js new file mode 100644 index 0000000..5faf85c --- /dev/null +++ b/examples/hono-tractor-store-2.0/src/explore/components/Header.js @@ -0,0 +1,27 @@ +import MiniCart from "../../checkout/components/MiniCart.js"; +import Navigation from "./Navigation.js"; +import { html, IMAGE_SERVER } from "../utils.js"; + +/** + * Header component. + * @param {object} props - The properties of the Header component. + * @param {HonoContext} props.c - The hono context. + * @returns {string} The Header component markup. + */ +export default ({ c }) => { + return html`
    +
    +
    + + + +
    ${Navigation()}
    +
    ${MiniCart({ c })}
    +
    +
    +
    `; +}; diff --git a/examples/hono-tractor-store-2.0/src/explore/components/Meta.js b/examples/hono-tractor-store-2.0/src/explore/components/Meta.js new file mode 100644 index 0000000..0165473 --- /dev/null +++ b/examples/hono-tractor-store-2.0/src/explore/components/Meta.js @@ -0,0 +1,37 @@ +import { html } from "../utils.js"; + +export default () => { + return html` + + + + + + + + + + + `; +}; diff --git a/examples/hono-tractor-store-2.0/src/explore/components/Navigation.css b/examples/hono-tractor-store-2.0/src/explore/components/Navigation.css new file mode 100644 index 0000000..e416811 --- /dev/null +++ b/examples/hono-tractor-store-2.0/src/explore/components/Navigation.css @@ -0,0 +1,58 @@ +.e_Navigation { + flex-grow: 1; +} + +.e_Navigation__list { + display: flex; + list-style: none; + padding: 0; + margin: 0; + justify-content: center; + gap: 2rem; +} + +.e_Navigation__item a { + position: relative; + display: block; + padding: 5px 20px; + color: #000; + text-transform: uppercase; + font-size: 13px; + letter-spacing: 4px; + text-decoration: none; + background: linear-gradient(0deg, #f5f5f5, #fff); + border-bottom: 1px solid #eeebe2; +} + +.e_Navigation__item:hover a, +.e_Navigation__item:focus a { + border-bottom-color: #757165; +} + +.e_Navigation__item a::before, +.e_Navigation__item a::after { + display: block; + content: ""; + position: absolute; + width: 20px; + height: calc(100% + 1px); + top: 0; +} + +.e_Navigation__item a::before { + left: 0; + background: linear-gradient( + -90deg, + rgba(255, 255, 255, 0), + rgba(255, 255, 255, 1) + ); +} + +.e_Navigation__item a::after { + right: 0; + background: linear-gradient( + 90deg, + rgba(255, 255, 255, 0), + rgba(255, 255, 255, 1) + ); +} diff --git a/examples/hono-tractor-store-2.0/src/explore/components/Navigation.js b/examples/hono-tractor-store-2.0/src/explore/components/Navigation.js new file mode 100644 index 0000000..50d3d16 --- /dev/null +++ b/examples/hono-tractor-store-2.0/src/explore/components/Navigation.js @@ -0,0 +1,10 @@ +import { html } from "../utils.js"; + +export default () => { + return html``; +}; diff --git a/examples/hono-tractor-store-2.0/src/explore/components/Product.css b/examples/hono-tractor-store-2.0/src/explore/components/Product.css new file mode 100644 index 0000000..aad3d81 --- /dev/null +++ b/examples/hono-tractor-store-2.0/src/explore/components/Product.css @@ -0,0 +1,29 @@ +.e_Product { + margin: 0; +} + +.e_Product_link { + text-decoration: none; + color: black; +} + +.e_Product_image { + width: 100%; + height: auto; + aspect-ratio: 1 / 1; + display: block; +} + +.e_Product_name { + margin: 12px 0 8px; + color: black; + text-align: center; + display: block; +} + +.e_Product_price { + margin: 8px 0; + color: black; + text-align: center; + display: block; +} diff --git a/examples/hono-tractor-store-2.0/src/explore/components/Product.js b/examples/hono-tractor-store-2.0/src/explore/components/Product.js new file mode 100644 index 0000000..9f651fe --- /dev/null +++ b/examples/hono-tractor-store-2.0/src/explore/components/Product.js @@ -0,0 +1,23 @@ +import { html, src, srcset, fmtprice } from "../utils.js"; + +/** + * Product component. + * @param {Product} props - The properties of the Product component. + * @returns {string} The Product component markup. + */ +export default ({ name, url, image, startPrice }) => { + return html`
  • + + + ${name} + ${fmtprice(startPrice)} + +
  • `; +}; diff --git a/examples/hono-tractor-store-2.0/src/explore/components/Recommendation.css b/examples/hono-tractor-store-2.0/src/explore/components/Recommendation.css new file mode 100644 index 0000000..5499588 --- /dev/null +++ b/examples/hono-tractor-store-2.0/src/explore/components/Recommendation.css @@ -0,0 +1,28 @@ +.e_Recommendation { + margin: 0; +} + +@media (min-width: 500px) and (max-width: 999px) { + .e_Recommendation:nth-child(4) { + display: none; + } +} + +.e_Recommendation_link { + text-decoration: none; + color: black; +} + +.e_Recommendation_image { + width: 100%; + height: auto; + aspect-ratio: 1 / 1; + display: block; +} + +.e_Recommendation_name { + margin: 1rem 0; + color: black; + text-align: center; + display: block; +} diff --git a/examples/hono-tractor-store-2.0/src/explore/components/Recommendation.js b/examples/hono-tractor-store-2.0/src/explore/components/Recommendation.js new file mode 100644 index 0000000..4b32f28 --- /dev/null +++ b/examples/hono-tractor-store-2.0/src/explore/components/Recommendation.js @@ -0,0 +1,22 @@ +import { html, src, srcset } from "../utils.js"; + +/** + * Recommendation component. + * @param {RecoItem} props - The properties of the Recommendation component. + * @returns {string} The Recommendation component markup. + */ +export default ({ image, url, name }) => { + return html`
  • + + + ${name} + +
  • `; +}; diff --git a/examples/hono-tractor-store-2.0/src/explore/components/Recommendations.css b/examples/hono-tractor-store-2.0/src/explore/components/Recommendations.css new file mode 100644 index 0000000..5e37c31 --- /dev/null +++ b/examples/hono-tractor-store-2.0/src/explore/components/Recommendations.css @@ -0,0 +1,24 @@ +.e_Recommendations { + padding: 1rem; + margin: 0 -1rem 3rem; +} + +.e_Recommendations_list { + @media (max-width: 499px) { + grid-template-columns: 1fr 1fr; + } + + @media (min-width: 500px) and (max-width: 999px) { + grid-template-columns: 1fr 1fr 1fr; + } + + @media (min-width: 1000px) { + grid-template-columns: repeat(4, 1fr); + } + + position: relative; + display: grid; + gap: 40px; + padding: 0; + list-style-type: none; +} diff --git a/examples/hono-tractor-store-2.0/src/explore/components/Recommendations.js b/examples/hono-tractor-store-2.0/src/explore/components/Recommendations.js new file mode 100644 index 0000000..1d6794f --- /dev/null +++ b/examples/hono-tractor-store-2.0/src/explore/components/Recommendations.js @@ -0,0 +1,83 @@ +import data from "../database/index.js"; +import { html } from "../utils.js"; +import Recommendation from "./Recommendation.js"; + +const r = data.recommendations; + +/** + * Calculates the average color of an array of colors. + * @param {number[][]} colors - The array of rgb. + * @returns {number[]} The average rgb. + */ +function averageColor(colors) { + const total = colors.reduce( + (acc, [r, g, b]) => [acc[0] + r, acc[1] + g, acc[2] + b], + [0, 0, 0], + ); + return total.map((c) => Math.round(c / colors.length)); +} + +/** + * Finds the colors of a list of SKUs. + * @param {string[]} skus - The array of SKUs. + * @returns {number[][]} The array of colors. + */ +function skusToColors(skus) { + return skus.filter((sku) => r[sku]).map((sku) => r[sku].rgb); +} + +/** + * Calculates the distance between two RGB colors. + * @param {number[]} rgb1 - The first RGB color. + * @param {number[]} rgb2 - The second RGB color. + * @returns {number} The distance between the colors. + */ +function colorDistance(rgb1, rgb2) { + const [r1, g1, b1] = rgb1; + const [r2, g2, b2] = rgb2; + return Math.sqrt( + Math.pow(r1 - r2, 2) + Math.pow(g1 - g2, 2) + Math.pow(b1 - b2, 2), + ); +} + +/** + * Finds recommendations based on color similarity. + * @param {string[]} skus - The array of SKUs. + * @param {number} [length=5] - The number of recommendations to return. + * @returns {RecoItem[]} The array of recommendations. + */ +function recosForSkus(skus, length = 4) { + const targetRgb = averageColor(skusToColors(skus)); + let distances = []; + + for (let sku in r) { + if (!skus.includes(sku)) { + const distance = colorDistance(targetRgb, r[sku].rgb); + distances.push({ sku, distance }); + } + } + + distances.sort((a, b) => a.distance - b.distance); + return distances.slice(0, length).map((d) => r[d.sku]); +} + +/** + * Recommendations component. + * @param {object} props - The properties of the Recommendations component. + * @param {string[]} props.skus - The SKUs of the variants to get recommendations for. + * @returns {string} The component markup. + */ +export default ({ skus }) => { + const recos = recosForSkus(skus); + return recos.length + ? html`
    +

    Recommendations

    + +
    ` + : ""; +}; diff --git a/examples/hono-tractor-store-2.0/src/explore/components/Store.js b/examples/hono-tractor-store-2.0/src/explore/components/Store.js new file mode 100644 index 0000000..781e3cd --- /dev/null +++ b/examples/hono-tractor-store-2.0/src/explore/components/Store.js @@ -0,0 +1,25 @@ +import { html, src, srcset } from "../utils.js"; + +/** + * Store component. + * @param {Store} props - The properties of the Store component. + * @returns {string} The Product component markup. + */ +export default ({ name, image, street, city }) => { + return html`
  • +
    + +

    + ${name}
    + ${street}
    + ${city} +

    +
    +
  • `; +}; diff --git a/examples/hono-tractor-store-2.0/src/explore/components/StorePicker.css b/examples/hono-tractor-store-2.0/src/explore/components/StorePicker.css new file mode 100644 index 0000000..d0cc7f0 --- /dev/null +++ b/examples/hono-tractor-store-2.0/src/explore/components/StorePicker.css @@ -0,0 +1,52 @@ +.e_StorePicker_control { + padding: 2rem; + margin: 0 0 0 -2rem; +} + +.e_StorePicker_dialog::backdrop { + backdrop-filter: blur(2px); +} + +.e_StorePicker_dialog { + overflow: visible; + border: none; + padding: 1rem 2rem; + max-height: unset; +} + +.e_StorePicker_list { + display: grid; + gap: 3rem; + list-style-type: none; + padding: 0; + grid-template-columns: repeat(2, 1fr); +} + +.e_StorePicker_image { + display: block; + max-width: 200px; + width: auto; + height: auto; +} + +.e_StorePicker_address { + width: 200px; + margin: 1rem 0; +} + +.e_StorePicker_control { + display: flex; + flex-wrap: wrap; + gap: 1rem; + max-width: 500px; +} + +.e_StorePicker_selected { + display: flex; + flex-wrap: wrap; + gap: 1rem; +} + +.e_StorePicker_selected:empty { + display: none; +} diff --git a/examples/hono-tractor-store-2.0/src/explore/components/StorePicker.js b/examples/hono-tractor-store-2.0/src/explore/components/StorePicker.js new file mode 100644 index 0000000..ba7332f --- /dev/null +++ b/examples/hono-tractor-store-2.0/src/explore/components/StorePicker.js @@ -0,0 +1,53 @@ +import data from "../database/index.js"; +import { html, src, srcset } from "../utils.js"; +import Button from "./Button.js"; + +export default () => { + return html`
    +
    +
    + ${Button({ + className: "e_StorePicker_choose", + type: "button", + children: "choose a store", + })} +
    + +
    +

    Stores

    +
      + ${data.stores + .map( + (s) => + html`
    • +
      + +

      + ${s.name}
      + ${s.street}
      + ${s.city} +

      +
      + ${Button({ + className: "e_StorePicker_select", + type: "button", + children: "select", + dataId: s.id, + })} +
    • `, + ) + .join("")} +
    +
    +
    +
    `; +}; diff --git a/examples/hono-tractor-store-2.0/src/explore/database/database.json b/examples/hono-tractor-store-2.0/src/explore/database/database.json new file mode 100644 index 0000000..2c8a98a --- /dev/null +++ b/examples/hono-tractor-store-2.0/src/explore/database/database.json @@ -0,0 +1,738 @@ +{ + "teaser": [ + { + "title": "Classic Tractors", + "image": "/cdn/img/scene/[size]/classics.webp", + "url": "/products/classic" + }, + { + "title": "Autonomous Tractors", + "image": "/cdn/img/scene/[size]/autonomous.webp", + "url": "/products/autonomous" + } + ], + "categories": [ + { + "key": "classic", + "name": "Classics", + "products": [ + { + "name": "Heritage Workhorse", + "id": "CL-01", + "image": "/cdn/img/product/[size]/CL-01-GR.webp", + "startPrice": 5700, + "url": "/product/CL-01" + }, + { + "name": "Falcon Crest Farm", + "id": "CL-02", + "image": "/cdn/img/product/[size]/CL-02-BL.webp", + "startPrice": 2600, + "url": "/product/CL-02" + }, + { + "name": "Falcon Crest Work", + "id": "CL-03", + "image": "/cdn/img/product/[size]/CL-03-GR.webp", + "startPrice": 2300, + "url": "/product/CL-03" + }, + { + "name": "Broadfield Majestic", + "id": "CL-04", + "image": "/cdn/img/product/[size]/CL-04-BL.webp", + "startPrice": 2200, + "url": "/product/CL-04" + }, + { + "name": "Countryside Commander", + "id": "CL-05", + "image": "/cdn/img/product/[size]/CL-05-PT.webp", + "startPrice": 2700, + "url": "/product/CL-05" + }, + { + "name": "Danamark Steadfast", + "id": "CL-06", + "image": "/cdn/img/product/[size]/CL-06-MT.webp", + "startPrice": 2800, + "url": "/product/CL-06" + }, + { + "name": "Greenland Rover", + "id": "CL-07", + "image": "/cdn/img/product/[size]/CL-07-GR.webp", + "startPrice": 2900, + "url": "/product/CL-07" + }, + { + "name": "Holland Hamster", + "id": "CL-08", + "image": "/cdn/img/product/[size]/CL-08-GR.webp", + "startPrice": 7750, + "url": "/product/CL-08" + }, + { + "name": "TerraFirma Veneto", + "id": "CL-09", + "image": "/cdn/img/product/[size]/CL-09-BL.webp", + "startPrice": 2950, + "url": "/product/CL-09" + }, + { + "name": "Global Gallant", + "id": "CL-10", + "image": "/cdn/img/product/[size]/CL-10-SD.webp", + "startPrice": 2600, + "url": "/product/CL-10" + }, + { + "name": "Scandinavia Sower", + "id": "CL-11", + "image": "/cdn/img/product/[size]/CL-11-SK.webp", + "startPrice": 3100, + "url": "/product/CL-11" + }, + { + "name": "Celerity Cruiser", + "id": "CL-12", + "image": "/cdn/img/product/[size]/CL-12-BL.webp", + "startPrice": 3200, + "url": "/product/CL-12" + }, + { + "name": "Rapid Racer", + "id": "CL-13", + "image": "/cdn/img/product/[size]/CL-13-BL.webp", + "startPrice": 7500, + "url": "/product/CL-13" + }, + { + "name": "Caribbean Cruiser", + "id": "CL-14", + "image": "/cdn/img/product/[size]/CL-14-GR.webp", + "startPrice": 2300, + "url": "/product/CL-14" + }, + { + "name": "Fieldmaster Classic", + "id": "CL-15", + "image": "/cdn/img/product/[size]/CL-15-PI.webp", + "startPrice": 6200, + "url": "/product/CL-15" + } + ] + }, + { + "key": "autonomous", + "name": "Autonomous", + "products": [ + { + "name": "TerraFirma AutoCultivator T-300", + "id": "AU-01", + "image": "/cdn/img/product/[size]/AU-01-SI.webp", + "startPrice": 1000, + "url": "/product/AU-01" + }, + { + "name": "SmartFarm Titan", + "id": "AU-02", + "image": "/cdn/img/product/[size]/AU-02-OG.webp", + "startPrice": 4000, + "url": "/product/AU-02" + }, + { + "name": "FutureHarvest Navigator", + "id": "AU-03", + "image": "/cdn/img/product/[size]/AU-03-TQ.webp", + "startPrice": 1600, + "url": "/product/AU-03" + }, + { + "name": "Sapphire Sunworker 460R", + "id": "AU-04", + "image": "/cdn/img/product/[size]/AU-04-RD.webp", + "startPrice": 8500, + "url": "/product/AU-04" + }, + { + "name": "EcoGrow Crop Commander", + "id": "AU-05", + "image": "/cdn/img/product/[size]/AU-05-ZH.webp", + "startPrice": 3400, + "url": "/product/AU-05" + }, + { + "name": "FarmFleet Sovereign", + "id": "AU-06", + "image": "/cdn/img/product/[size]/AU-06-CZ.webp", + "startPrice": 2100, + "url": "/product/AU-06" + }, + { + "name": "Verde Voyager", + "id": "AU-07", + "image": "/cdn/img/product/[size]/AU-07-MT.webp", + "startPrice": 4000, + "url": "/product/AU-07" + }, + { + "name": "Field Pioneer", + "id": "AU-08", + "image": "/cdn/img/product/[size]/AU-08-WH.webp", + "startPrice": 4500, + "url": "/product/AU-08" + } + ] + } + ], + "recommendations": { + "AU-01-SI": { + "name": "TerraFirma AutoCultivator T-300 Silver", + "sku": "AU-01-SI", + "image": "/cdn/img/product/[size]/AU-01-SI.webp", + "url": "/product/AU-01?sku=AU-01-SI", + "rgb": [ + 192, + 192, + 192 + ] + }, + "AU-02-OG": { + "name": "SmartFarm Titan Sunset Copper", + "sku": "AU-02-OG", + "image": "/cdn/img/product/[size]/AU-02-OG.webp", + "url": "/product/AU-02?sku=AU-02-OG", + "rgb": [ + 221, + 82, + 25 + ] + }, + "AU-02-BL": { + "name": "SmartFarm Titan Cosmic Sapphire", + "sku": "AU-02-BL", + "image": "/cdn/img/product/[size]/AU-02-BL.webp", + "url": "/product/AU-02?sku=AU-02-BL", + "rgb": [ + 42, + 82, + 190 + ] + }, + "AU-02-GG": { + "name": "SmartFarm Titan Verdant Shadow", + "sku": "AU-02-GG", + "image": "/cdn/img/product/[size]/AU-02-GG.webp", + "url": "/product/AU-02?sku=AU-02-GG", + "rgb": [ + 0, + 90, + 4 + ] + }, + "AU-03-TQ": { + "name": "FutureHarvest Navigator Turquoise Titan", + "sku": "AU-03-TQ", + "image": "/cdn/img/product/[size]/AU-03-TQ.webp", + "url": "/product/AU-03?sku=AU-03-TQ", + "rgb": [ + 22, + 159, + 184 + ] + }, + "AU-03-PL": { + "name": "FutureHarvest Navigator Majestic Violet", + "sku": "AU-03-PL", + "image": "/cdn/img/product/[size]/AU-03-PL.webp", + "url": "/product/AU-03?sku=AU-03-PL", + "rgb": [ + 155, + 95, + 192 + ] + }, + "AU-03-RD": { + "name": "FutureHarvest Navigator Scarlet Dynamo", + "sku": "AU-03-RD", + "image": "/cdn/img/product/[size]/AU-03-RD.webp", + "url": "/product/AU-03?sku=AU-03-RD", + "rgb": [ + 255, + 36, + 0 + ] + }, + "AU-03-YE": { + "name": "FutureHarvest Navigator Sunbeam Yellow", + "sku": "AU-03-YE", + "image": "/cdn/img/product/[size]/AU-03-YE.webp", + "url": "/product/AU-03?sku=AU-03-YE", + "rgb": [ + 250, + 173, + 0 + ] + }, + "AU-04-RD": { + "name": "Sapphire Sunworker 460R Ruby Red", + "sku": "AU-04-RD", + "image": "/cdn/img/product/[size]/AU-04-RD.webp", + "url": "/product/AU-04?sku=AU-04-RD", + "rgb": [ + 155, + 17, + 30 + ] + }, + "AU-04-BK": { + "name": "Sapphire Sunworker 460R Midnight Onyx", + "sku": "AU-04-BK", + "image": "/cdn/img/product/[size]/AU-04-BK.webp", + "url": "/product/AU-04?sku=AU-04-BK", + "rgb": [ + 53, + 56, + 57 + ] + }, + "AU-05-ZH": { + "name": "EcoGrow Crop Commander Zestful Horizon", + "sku": "AU-05-ZH", + "image": "/cdn/img/product/[size]/AU-05-ZH.webp", + "url": "/product/AU-05?sku=AU-05-ZH", + "rgb": [ + 255, + 160, + 122 + ] + }, + "AU-06-CZ": { + "name": "FarmFleet Sovereign Canary Zenith", + "sku": "AU-06-CZ", + "image": "/cdn/img/product/[size]/AU-06-CZ.webp", + "url": "/product/AU-06?sku=AU-06-CZ", + "rgb": [ + 255, + 215, + 0 + ] + }, + "AU-06-MT": { + "name": "FarmFleet Sovereign Minted Jade", + "sku": "AU-06-MT", + "image": "/cdn/img/product/[size]/AU-06-MT.webp", + "url": "/product/AU-06?sku=AU-06-MT", + "rgb": [ + 98, + 136, + 130 + ] + }, + "AU-07-MT": { + "name": "Verde Voyager Glacial Mint", + "sku": "AU-07-MT", + "image": "/cdn/img/product/[size]/AU-07-MT.webp", + "url": "/product/AU-07?sku=AU-07-MT", + "rgb": [ + 175, + 219, + 210 + ] + }, + "AU-07-YE": { + "name": "Verde Voyager Sunbeam Yellow", + "sku": "AU-07-YE", + "image": "/cdn/img/product/[size]/AU-07-YE.webp", + "url": "/product/AU-07?sku=AU-07-YE", + "rgb": [ + 255, + 218, + 3 + ] + }, + "AU-08-WH": { + "name": "Field Pioneer Polar White", + "sku": "AU-08-WH", + "image": "/cdn/img/product/[size]/AU-08-WH.webp", + "url": "/product/AU-08?sku=AU-08-WH", + "rgb": [ + 232, + 232, + 232 + ] + }, + "CL-01-GR": { + "name": "Heritage Workhorse Verdant Field", + "sku": "CL-01-GR", + "image": "/cdn/img/product/[size]/CL-01-GR.webp", + "url": "/product/CL-01?sku=CL-01-GR", + "rgb": [ + 107, + 142, + 35 + ] + }, + "CL-01-GY": { + "name": "Heritage Workhorse Stormy Sky", + "sku": "CL-01-GY", + "image": "/cdn/img/product/[size]/CL-01-GY.webp", + "url": "/product/CL-01?sku=CL-01-GY", + "rgb": [ + 112, + 128, + 144 + ] + }, + "CL-02-BL": { + "name": "Falcon Crest Farm Cerulean Classic", + "sku": "CL-02-BL", + "image": "/cdn/img/product/[size]/CL-02-BL.webp", + "url": "/product/CL-02?sku=CL-02-BL", + "rgb": [ + 0, + 123, + 167 + ] + }, + "CL-03-GR": { + "name": "Falcon Crest Work Meadow Green", + "sku": "CL-03-GR", + "image": "/cdn/img/product/[size]/CL-03-GR.webp", + "url": "/product/CL-03?sku=CL-03-GR", + "rgb": [ + 124, + 252, + 0 + ] + }, + "CL-03-PI": { + "name": "Falcon Crest Work Rustic Rose", + "sku": "CL-03-PI", + "image": "/cdn/img/product/[size]/CL-03-PI.webp", + "url": "/product/CL-03?sku=CL-03-PI", + "rgb": [ + 181, + 0, + 24 + ] + }, + "CL-03-YE": { + "name": "Falcon Crest Work Harvest Gold", + "sku": "CL-03-YE", + "image": "/cdn/img/product/[size]/CL-03-YE.webp", + "url": "/product/CL-03?sku=CL-03-YE", + "rgb": [ + 218, + 145, + 0 + ] + }, + "CL-04-BL": { + "name": "Broadfield Majestic Oceanic Blue", + "sku": "CL-04-BL", + "image": "/cdn/img/product/[size]/CL-04-BL.webp", + "url": "/product/CL-04?sku=CL-04-BL", + "rgb": [ + 0, + 64, + 166 + ] + }, + "CL-04-RD": { + "name": "Broadfield Majestic Rustic Crimson", + "sku": "CL-04-RD", + "image": "/cdn/img/product/[size]/CL-04-RD.webp", + "url": "/product/CL-04?sku=CL-04-RD", + "rgb": [ + 123, + 63, + 0 + ] + }, + "CL-04-TQ": { + "name": "Broadfield Majestic Aqua Green", + "sku": "CL-04-TQ", + "image": "/cdn/img/product/[size]/CL-04-TQ.webp", + "url": "/product/CL-04?sku=CL-04-TQ", + "rgb": [ + 0, + 178, + 152 + ] + }, + "CL-05-PT": { + "name": "Countryside Commander Pacific Teal", + "sku": "CL-05-PT", + "image": "/cdn/img/product/[size]/CL-05-PT.webp", + "url": "/product/CL-05?sku=CL-05-PT", + "rgb": [ + 71, + 157, + 168 + ] + }, + "CL-05-RD": { + "name": "Countryside Commander Barn Red", + "sku": "CL-05-RD", + "image": "/cdn/img/product/[size]/CL-05-RD.webp", + "url": "/product/CL-05?sku=CL-05-RD", + "rgb": [ + 124, + 10, + 2 + ] + }, + "CL-06-MT": { + "name": "Danamark Steadfast Emerald Forest", + "sku": "CL-06-MT", + "image": "/cdn/img/product/[size]/CL-06-MT.webp", + "url": "/product/CL-06?sku=CL-06-MT", + "rgb": [ + 70, + 245, + 187 + ] + }, + "CL-06-YE": { + "name": "Danamark Steadfast Golden Wheat", + "sku": "CL-06-YE", + "image": "/cdn/img/product/[size]/CL-06-YE.webp", + "url": "/product/CL-06?sku=CL-06-YE", + "rgb": [ + 250, + 175, + 63 + ] + }, + "CL-07-GR": { + "name": "Greenland Rover Forest Fern", + "sku": "CL-07-GR", + "image": "/cdn/img/product/[size]/CL-07-GR.webp", + "url": "/product/CL-07?sku=CL-07-GR", + "rgb": [ + 46, + 162, + 80 + ] + }, + "CL-07-YE": { + "name": "Greenland Rover Autumn Amber", + "sku": "CL-07-YE", + "image": "/cdn/img/product/[size]/CL-07-YE.webp", + "url": "/product/CL-07?sku=CL-07-YE", + "rgb": [ + 255, + 191, + 0 + ] + }, + "CL-08-GR": { + "name": "Holland Hamster Polder Green", + "sku": "CL-08-GR", + "image": "/cdn/img/product/[size]/CL-08-GR.webp", + "url": "/product/CL-08?sku=CL-08-GR", + "rgb": [ + 194, + 178, + 128 + ] + }, + "CL-08-PI": { + "name": "Holland Hamster Tulip Magenta", + "sku": "CL-08-PI", + "image": "/cdn/img/product/[size]/CL-08-PI.webp", + "url": "/product/CL-08?sku=CL-08-PI", + "rgb": [ + 214, + 82, + 130 + ] + }, + "CL-09-BL": { + "name": "TerraFirma Veneto Adriatic Blue", + "sku": "CL-09-BL", + "image": "/cdn/img/product/[size]/CL-09-BL.webp", + "url": "/product/CL-09?sku=CL-09-BL", + "rgb": [ + 47, + 110, + 163 + ] + }, + "CL-09-GR": { + "name": "TerraFirma Veneto Tuscan Green", + "sku": "CL-09-GR", + "image": "/cdn/img/product/[size]/CL-09-GR.webp", + "url": "/product/CL-09?sku=CL-09-GR", + "rgb": [ + 81, + 139, + 43 + ] + }, + "CL-10-SD": { + "name": "Global Gallant Sahara Dawn", + "sku": "CL-10-SD", + "image": "/cdn/img/product/[size]/CL-10-SD.webp", + "url": "/product/CL-10?sku=CL-10-SD", + "rgb": [ + 184, + 168, + 117 + ] + }, + "CL-10-VI": { + "name": "Global Gallant Violet Vintage", + "sku": "CL-10-VI", + "image": "/cdn/img/product/[size]/CL-10-VI.webp", + "url": "/product/CL-10?sku=CL-10-VI", + "rgb": [ + 138, + 43, + 226 + ] + }, + "CL-11-SK": { + "name": "Scandinavia Sower Baltic Blue", + "sku": "CL-11-SK", + "image": "/cdn/img/product/[size]/CL-11-SK.webp", + "url": "/product/CL-11?sku=CL-11-SK", + "rgb": [ + 149, + 193, + 244 + ] + }, + "CL-11-YE": { + "name": "Scandinavia Sower Nordic Gold", + "sku": "CL-11-YE", + "image": "/cdn/img/product/[size]/CL-11-YE.webp", + "url": "/product/CL-11?sku=CL-11-YE", + "rgb": [ + 255, + 215, + 0 + ] + }, + "CL-12-BL": { + "name": "Celerity Cruiser Velocity Blue", + "sku": "CL-12-BL", + "image": "/cdn/img/product/[size]/CL-12-BL.webp", + "url": "/product/CL-12?sku=CL-12-BL", + "rgb": [ + 30, + 144, + 255 + ] + }, + "CL-12-RD": { + "name": "Celerity Cruiser Rally Red", + "sku": "CL-12-RD", + "image": "/cdn/img/product/[size]/CL-12-RD.webp", + "url": "/product/CL-12?sku=CL-12-RD", + "rgb": [ + 237, + 41, + 57 + ] + }, + "CL-13-BL": { + "name": "Rapid Racer Speedway Blue", + "sku": "CL-13-BL", + "image": "/cdn/img/product/[size]/CL-13-BL.webp", + "url": "/product/CL-13?sku=CL-13-BL", + "rgb": [ + 38, + 121, + 166 + ] + }, + "CL-13-RD": { + "name": "Rapid Racer Raceway Red", + "sku": "CL-13-RD", + "image": "/cdn/img/product/[size]/CL-13-RD.webp", + "url": "/product/CL-13?sku=CL-13-RD", + "rgb": [ + 207, + 16, + 32 + ] + }, + "CL-14-GR": { + "name": "Caribbean Cruiser Emerald Grove", + "sku": "CL-14-GR", + "image": "/cdn/img/product/[size]/CL-14-GR.webp", + "url": "/product/CL-14?sku=CL-14-GR", + "rgb": [ + 87, + 174, + 19 + ] + }, + "CL-14-RD": { + "name": "Caribbean Cruiser Ruby Fields", + "sku": "CL-14-RD", + "image": "/cdn/img/product/[size]/CL-14-RD.webp", + "url": "/product/CL-14?sku=CL-14-RD", + "rgb": [ + 205, + 43, + 30 + ] + }, + "CL-15-PI": { + "name": "Fieldmaster Classic Vintage Pink", + "sku": "CL-15-PI", + "image": "/cdn/img/product/[size]/CL-15-PI.webp", + "url": "/product/CL-15?sku=CL-15-PI", + "rgb": [ + 225, + 148, + 158 + ] + }, + "CL-15-SD": { + "name": "Fieldmaster Classic Sahara Dust", + "sku": "CL-15-SD", + "image": "/cdn/img/product/[size]/CL-15-SD.webp", + "url": "/product/CL-15?sku=CL-15-SD", + "rgb": [ + 222, + 199, + 140 + ] + } + }, + "stores": [ + { + "id": "store-a", + "name": "Aurora Flagship Store", + "street": "Astronaut Way 1", + "city": "Arlington", + "image": "/cdn/img/store/[size]/store-1.webp" + }, + { + "id": "store-b", + "name": "Big Micro Machines", + "street": "Broadway 2", + "city": "Burlington", + "image": "/cdn/img/store/[size]/store-2.webp" + }, + { + "id": "store-c", + "name": "Central Mall", + "street": "Clown Street 3", + "city": "Cryo", + "image": "/cdn/img/store/[size]/store-3.webp" + }, + { + "id": "store-d", + "name": "Downtown Model Store", + "street": "Duck Street 4", + "city": "Davenport", + "image": "/cdn/img/store/[size]/store-4.webp" + } + ] +} \ No newline at end of file diff --git a/examples/hono-tractor-store-2.0/src/explore/database/import.js b/examples/hono-tractor-store-2.0/src/explore/database/import.js new file mode 100644 index 0000000..164a6de --- /dev/null +++ b/examples/hono-tractor-store-2.0/src/explore/database/import.js @@ -0,0 +1,148 @@ +// reads product data from a central source and writes the necessary data for this system. +// here we are reading from a js file and writing to a json file. +// in a real world scenario, you would read from a product service and write to a database. + +import fs from "fs"; +import path from "path"; +import products from "../../../products.js"; + +/** + * Generates the URL for a product. + * @param {string} id - The ID of the product. + * @param {string} sku - The SKU of the product variant. + * @returns {string} The URL of the product. + */ +export function productUrl(id, sku) { + const query = sku ? `?sku=${sku}` : ""; + return `/product/${id}${query}`; +} + +/** + * Calculates the starting price of a product's variants. + * @param {Variant[]} variants - The variants of the product. + * @returns {number} The starting price. + */ +function startPrice(variants) { + return variants.reduce((min, variant) => { + return Math.min(min, variant.price); + }, Infinity); +} + +/** + * Converts a product object to a formatted product. + * @param {Product} product - The product object. + * @returns {Product} The formatted product. + */ +function toProduct(product) { + return { + name: product.name, + id: product.id, + image: product.variants[0].image, + startPrice: startPrice(product.variants), + url: productUrl(product.id), + }; +} + +/** + * Converts a hex color string to an RGB array. + * @param {string} hex - The hex color string. + * @returns {number[]} The RGB array. + **/ +function hexToRgb(hex) { + var bigint = parseInt(hex.replace("#", ""), 16); + var r = (bigint >> 16) & 255; + var g = (bigint >> 8) & 255; + var b = bigint & 255; + return [r, g, b]; +} + +/** + * Converts a product object and a variant object to a formatted recommendation item. + * @param {Product} product - The product object. + * @param {Variant} variant - The variant object. + * @returns {RecoItem} The formatted recommendation item. + */ +function toRecoItem(product, variant) { + return { + name: `${product.name} ${variant.name}`, + sku: variant.sku, + image: variant.image, + url: productUrl(product.id, variant.sku), + rgb: hexToRgb(variant.color), + }; +} + +/** + * @type {Database} + */ +const database = { + teaser: [ + { + title: "Classic Tractors", + image: "/cdn/img/scene/[size]/classics.webp", + url: "/products/classic", + }, + { + title: "Autonomous Tractors", + image: "/cdn/img/scene/[size]/autonomous.webp", + url: "/products/autonomous", + }, + ], + categories: [ + { + key: "classic", + name: "Classics", + products: products.filter((p) => p.category === "classic").map(toProduct), + }, + { + key: "autonomous", + name: "Autonomous", + products: products + .filter((p) => p.category === "autonomous") + .map(toProduct), + }, + ], + recommendations: products + .flatMap((product) => + product.variants.map((variant) => toRecoItem(product, variant)), + ) + .reduce((res, variant) => { + res[variant.sku] = variant; + return res; + }, {}), + stores: [ + { + id: "store-a", + name: "Aurora Flagship Store", + street: "Astronaut Way 1", + city: "Arlington", + image: "/cdn/img/store/[size]/store-1.webp", + }, + { + id: "store-b", + name: "Big Micro Machines", + street: "Broadway 2", + city: "Burlington", + image: "/cdn/img/store/[size]/store-2.webp", + }, + { + id: "store-c", + name: "Central Mall", + street: "Clown Street 3", + city: "Cryo", + image: "/cdn/img/store/[size]/store-3.webp", + }, + { + id: "store-d", + name: "Downtown Model Store", + street: "Duck Street 4", + city: "Davenport", + image: "/cdn/img/store/[size]/store-4.webp", + }, + ], +}; + +const __dirname = path.dirname(new URL(import.meta.url).pathname); +const databaseFile = path.resolve(__dirname, "./database.json"); +console.log("Writing database to", databaseFile); +fs.writeFileSync(databaseFile, JSON.stringify(database, null, 2)); diff --git a/examples/hono-tractor-store-2.0/src/explore/database/index.js b/examples/hono-tractor-store-2.0/src/explore/database/index.js new file mode 100644 index 0000000..19eb799 --- /dev/null +++ b/examples/hono-tractor-store-2.0/src/explore/database/index.js @@ -0,0 +1,5 @@ +/** + * @type {Database} + */ +import data from "./database.json" assert { type: "json" }; +export default data; diff --git a/examples/hono-tractor-store-2.0/src/explore/index.js b/examples/hono-tractor-store-2.0/src/explore/index.js new file mode 100644 index 0000000..0d0d588 --- /dev/null +++ b/examples/hono-tractor-store-2.0/src/explore/index.js @@ -0,0 +1,3 @@ +export { default as HomePage } from "./pages/HomePage.js"; +export { default as StoresPage } from "./pages/StoresPage.js"; +export { default as CategoryPage } from "./pages/CategoryPage.js"; diff --git a/examples/hono-tractor-store-2.0/src/explore/pages/CategoryPage.css b/examples/hono-tractor-store-2.0/src/explore/pages/CategoryPage.css new file mode 100644 index 0000000..247d673 --- /dev/null +++ b/examples/hono-tractor-store-2.0/src/explore/pages/CategoryPage.css @@ -0,0 +1,43 @@ +.e_CategoryPage { + max-width: calc(1000px + var(--outer-space) * 2); + padding: 0 var(--outer-space); + margin: 0 auto; +} + +.e_CategoryPage_list { + display: grid; + + grid-gap: 40px; + padding: 0; + list-style-type: none; +} + +@media (max-width: 499px) { + .e_CategoryPage_list { + grid-template-columns: 1fr; + } +} + +@media (min-width: 500px) and (max-width: 999px) { + .e_CategoryPage_list { + grid-template-columns: 1fr 1fr; + } +} + +@media (min-width: 1000px) { + .e_CategoryPage_list { + grid-template-columns: 1fr 1fr 1fr; + } +} + +.e_CategoryPage__subline { + display: flex; + flex-wrap: wrap; + gap: 1em; + justify-content: space-between; +} + +.e_CategoryPage__subline * { + margin: 0; + line-height: 1.5; +} diff --git a/examples/hono-tractor-store-2.0/src/explore/pages/CategoryPage.js b/examples/hono-tractor-store-2.0/src/explore/pages/CategoryPage.js new file mode 100644 index 0000000..af3a002 --- /dev/null +++ b/examples/hono-tractor-store-2.0/src/explore/pages/CategoryPage.js @@ -0,0 +1,62 @@ +import data from "../database/index.js"; +import Header from "../components/Header.js"; +import Footer from "../components/Footer.js"; +import Product from "../components/Product.js"; +import Filter from "../components/Filter.js"; +import { html } from "../utils.js"; +import Meta from "../components/Meta.js"; + +/** + * CategoryPage component. + * @param {object} props - The properties of the CategoryPage component. + * @param {string} props.category - The category key. + * @param {HonoContext} props.c - The hone context. + * @returns {string} The CategoryPage component markup. + */ +export default ({ category, c }) => { + const cat = category && data.categories.find((c) => c.key === category); + + const title = cat ? cat.name : "All Machines"; + const products = cat + ? cat.products + : data.categories.flatMap((c) => c.products); + // sort products by price descending + products.sort((a, b) => b.startPrice - a.startPrice); + const filters = [ + { url: "/products", name: "All", active: !cat }, + ...data.categories.map((c) => ({ + url: `/products/${c.key}`, + name: c.name, + active: c.key === category, + })), + ]; + + return html` + + + Tractor Store + + + + ${Meta()} + + + ${Header({ c })} +
    +

    ${title}

    +
    +

    ${products.length} products

    + ${Filter({ filters })} +
    + +
    + ${Footer()} + + + + + + `; +}; diff --git a/examples/hono-tractor-store-2.0/src/explore/pages/HomePage.css b/examples/hono-tractor-store-2.0/src/explore/pages/HomePage.css new file mode 100644 index 0000000..7803305 --- /dev/null +++ b/examples/hono-tractor-store-2.0/src/explore/pages/HomePage.css @@ -0,0 +1,35 @@ +.e_HomePage { + @media (min-width: 500px) { + grid-template-columns: 1fr 1fr; + display: grid; + gap: 1rem; + } + + max-width: calc(1000px + var(--outer-space) * 2); + padding: 0 var(--outer-space); + margin: 3rem auto 0; +} + +.e_HomePage__categoryLink { + display: block; + position: relative; + margin-bottom: 2rem; + color: inherit; + text-align: center; + text-decoration: none; +} + +.e_HomePage__categoryLink:hover, +.e_HomePage__categoryLink:focus { + text-decoration: underline; +} + +.e_HomePage__categoryLink img { + width: 100%; + aspect-ratio: 1000 / 560; + margin-bottom: 0.75rem; +} + +.e_HomePage__recommendations { + grid-column: span 2; +} diff --git a/examples/hono-tractor-store-2.0/src/explore/pages/HomePage.js b/examples/hono-tractor-store-2.0/src/explore/pages/HomePage.js new file mode 100644 index 0000000..b87ba0b --- /dev/null +++ b/examples/hono-tractor-store-2.0/src/explore/pages/HomePage.js @@ -0,0 +1,54 @@ +import data from "../database/index.js"; +import Header from "../components/Header.js"; +import Footer from "../components/Footer.js"; +import Recommendations from "../components/Recommendations.js"; +import { html, src, srcset } from "../utils.js"; +import Meta from "../components/Meta.js"; + +/** + * HomePage component. + * @param {object} props - The properties of the HomePage component. + * @param {HonoContext} props.c - The hone context. + * @returns {string} The HomePage component markup. + */ +export default ({ c }) => { + return html` + + + Tractor Store + + + + ${Meta()} + + + ${Header({ c })} +
    + ${data.teaser + .map( + ({ title, image, url }) => + html` + ${title} + ${title} + `, + ) + .join("")} +
    + ${Recommendations({ + skus: ["CL-01-GY", "AU-07-MT"], + })} +
    +
    + ${Footer()} + + + + + + `; +}; diff --git a/examples/hono-tractor-store-2.0/src/explore/pages/StoresPage.css b/examples/hono-tractor-store-2.0/src/explore/pages/StoresPage.css new file mode 100644 index 0000000..5b747ea --- /dev/null +++ b/examples/hono-tractor-store-2.0/src/explore/pages/StoresPage.css @@ -0,0 +1,19 @@ +.e_StoresPage { + max-width: calc(1000px + var(--outer-space) * 2); + padding: 0 var(--outer-space); + margin: 0 auto; +} + +.e_StoresPage_list { + list-style: none; + padding: 0; + margin: 5em 0 4em; + display: flex; + justify-content: space-between; + gap: 2em; + flex-wrap: wrap; +} + +.e_StoresPage p { + max-width: 80ch; +} diff --git a/examples/hono-tractor-store-2.0/src/explore/pages/StoresPage.js b/examples/hono-tractor-store-2.0/src/explore/pages/StoresPage.js new file mode 100644 index 0000000..12344c5 --- /dev/null +++ b/examples/hono-tractor-store-2.0/src/explore/pages/StoresPage.js @@ -0,0 +1,45 @@ +import data from "../database/index.js"; +import Header from "../components/Header.js"; +import Footer from "../components/Footer.js"; +import Store from "../components/Store.js"; +import { html } from "../utils.js"; +import Meta from "../components/Meta.js"; + +/** + * StoresPage component. + * @param {object} props - The properties of the StoresPage component. + * @param {string} props.category - The category key. + * @param {HonoContext} props.c - The hone context. + * @returns {string} The StoresPage component markup. + */ +export default ({ c }) => { + return html` + + + Tractor Store + + + + ${Meta()} + + + ${Header({ c })} +
    +

    Our Stores

    +

    + Want to see our products in person? Visit one of our stores to see + our products up close and talk to our experts. We have stores in the + following locations: +

    + +
    + ${Footer()} + + + + + + `; +}; diff --git a/examples/hono-tractor-store-2.0/src/explore/scripts.js b/examples/hono-tractor-store-2.0/src/explore/scripts.js new file mode 100644 index 0000000..5442265 --- /dev/null +++ b/examples/hono-tractor-store-2.0/src/explore/scripts.js @@ -0,0 +1,28 @@ +/* client side javascript */ + +/** + * Store picker fragment + * - open dialog on button click + * - select store on button click + * - publish event on store selected + */ +const $picker = document.querySelector(".e_StorePicker"); +if ($picker) { + const dialog = $picker.querySelector(".e_StorePicker dialog"); + const chooseButton = $picker.querySelector(".e_StorePicker_choose"); + const selectButtons = $picker.querySelectorAll(".e_StorePicker_select"); + const selected = $picker.querySelector(".e_StorePicker_selected"); + + chooseButton.addEventListener("click", () => dialog.showModal()); + [...selectButtons].forEach((button) => { + button.addEventListener("click", (e) => { + const detail = e.currentTarget.getAttribute("data-id"); + $picker.dispatchEvent( + new CustomEvent("explore:store-selected", { bubbles: true, detail }), + ); + dialog.close(); + // copy selected store content to top level + selected.innerHTML = e.currentTarget.previousElementSibling.innerHTML; + }); + }); +} diff --git a/examples/hono-tractor-store-2.0/src/explore/styles.css b/examples/hono-tractor-store-2.0/src/explore/styles.css new file mode 100644 index 0000000..b1a6c06 --- /dev/null +++ b/examples/hono-tractor-store-2.0/src/explore/styles.css @@ -0,0 +1,43 @@ +@import url("./components/Header.css"); +@import url("./components/Navigation.css"); +@import url("./components/Footer.css"); +@import url("./components/StorePicker.css"); +@import url("./components/Product.css"); +@import url("./components/Recommendations.css"); +@import url("./components/Recommendation.css"); +@import url("./components/Button.css"); +@import url("./components/Filter.css"); +@import url("./pages/CategoryPage.css"); +@import url("./pages/StoresPage.css"); +@import url("./pages/HomePage.css"); + +@font-face { + font-family: "Raleway"; + src: url("https://cdn.the-tractor.store/cdn/font/raleway-regular.woff2") + format("woff2"); + font-weight: normal; + font-style: normal; +} + +* { + box-sizing: border-box; +} + +html { + font-family: Raleway, "Helvetica Neue", Helvetica, Arial, sans-serif; + font-size: 16px; +} + +body { + padding: 0; + margin: 0; + overflow-x: hidden; +} + +p { + line-height: 1.5; +} + +:root { + --outer-space: 1.5rem; +} diff --git a/examples/hono-tractor-store-2.0/src/explore/types.js b/examples/hono-tractor-store-2.0/src/explore/types.js new file mode 100644 index 0000000..ae1e689 --- /dev/null +++ b/examples/hono-tractor-store-2.0/src/explore/types.js @@ -0,0 +1,39 @@ +/** + * @typedef {object} Product + * @property {string} id - The ID of the product. + * @property {string} name - The name of the product. + * @property {string} image - The image URL of the product. + * @property {string} url - The URL of the product. + * @property {number} startPrice - The starting price of the product. + */ + +/** + * @typedef {object} Variant + * @property {string} name - The name of the variant. + * @property {string} sku - The SKU of the variant. + * @property {string} image - The image URL of the variant. + * @property {string} product - The ID of the product the variant belongs to. + * @property {string} url - The URL of the variant. + */ + +/** + * @typedef {object} RecoItem + * @property {string} name - The name of the recommendation item. + * @property {string} sku - The SKU of the recommendation item. + * @property {string} image - The image URL of the recommendation item. + * @property {string} url - The URL of the recommendation item. + * @property {number[]} rgb - The RGB color of the recommendation item. + */ + +/** + * @typedef {object} Category + * @property {string} key - The key of the category. + * @property {string} name - The name of the category. + * @property {Product[]} products - The products in the category. + */ + +/** + * @typedef {object} Database + * @property {Category[]} categories - The categories in the database. + * @property {{[key: string]: RecoItem}} recommendations - The recommendations in the database. + */ diff --git a/examples/hono-tractor-store-2.0/src/explore/utils.js b/examples/hono-tractor-store-2.0/src/explore/utils.js new file mode 100644 index 0000000..7d1c762 --- /dev/null +++ b/examples/hono-tractor-store-2.0/src/explore/utils.js @@ -0,0 +1,38 @@ +// for prettier formatting +// see https://prettier.io/docs/en/options.html#embedded-language-formatting +export const html = String.raw; + +// use the image server if not using local images +export const IMAGE_SERVER = + typeof process === "undefined" || process.env.USE_LOCAL_IMAGES !== "true" + ? "https://cdn.the-tractor.store" + : ""; + +/** + * Replaces the placeholder "[size]" in the image URL with the specified size. + * @param {string} image - The original image URL. + * @param {number} size - The desired size for the image. + * @returns {string} - The modified image URL with the size placeholder replaced. + */ +export function src(image, size) { + return IMAGE_SERVER + image.replace("[size]", `${size}`); +} + +/** + * Generates the srcset attribute value for an image with different sizes. + * @param {string} image - The original image URL. + * @param {number[]} sizes - The array of sizes for the image. + * @returns {string} - The srcset attribute value. + */ +export function srcset(image, sizes = []) { + return sizes.map((size) => `${src(image, size)} ${size}w`).join(", "); +} + +/** + * Formats a price value. + * @param {number} price - The price value to format. + * @returns {string} - The formatted price. + */ +export function fmtprice(price) { + return `${price},00 Ø`; +} diff --git a/examples/hono-tractor-store-2.0/src/server.cloudflare.js b/examples/hono-tractor-store-2.0/src/server.cloudflare.js new file mode 100644 index 0000000..88b9548 --- /dev/null +++ b/examples/hono-tractor-store-2.0/src/server.cloudflare.js @@ -0,0 +1,12 @@ +import createServer from "./server.js"; +import { serveStatic } from "hono/cloudflare-workers"; +import manifest from "__STATIC_CONTENT_MANIFEST"; + +const app = createServer(); + +app.use("/cdn/*", serveStatic({ root: "./", manifest })); +["explore", "decide", "checkout"].forEach((team) => { + app.use(`/${team}/static/*`, serveStatic({ root: `./`, manifest })); +}); + +export default app; diff --git a/examples/hono-tractor-store-2.0/src/server.js b/examples/hono-tractor-store-2.0/src/server.js new file mode 100644 index 0000000..f466755 --- /dev/null +++ b/examples/hono-tractor-store-2.0/src/server.js @@ -0,0 +1,68 @@ +import { Hono } from "hono"; +import { logger } from "hono/logger"; +import { HomePage, StoresPage, CategoryPage } from "./explore/index.js"; +import { ProductPage } from "./decide/index.js"; +import { + MiniCart, + CartPage, + Checkout, + Thanks, + handleAddToCart, + handleRemoveFromCart, + handlePlaceOrder, +} from "./checkout/index.js"; + +/** + * Creates a server instance. + * @returns {Hono} The server instance. + */ +export default function createServer() { + const app = new Hono(); + app.use(logger()); + + /** + * Team Explore + */ + app.get("/", async (c) => { + return c.html(HomePage({ c })); + }); + app.get("/stores", async (c) => { + return c.html(StoresPage({ c })); + }); + app.get("/products/:category?", async (c) => { + console.log("category", c.req.param("category")); + const category = c.req.param("category"); + return c.html(CategoryPage({ category, c })); + }); + + /** + * Team Decide + */ + app.get("/product/:id", async (c) => { + const { id } = c.req.param(); + const sku = c.req.query("sku"); + return c.html(ProductPage({ id, sku, c })); + }); + + /** + * Team Buy + */ + app.get("/checkout/cart", (c) => c.html(CartPage({ c }))); + app.get("/checkout/checkout", (c) => c.html(Checkout())); + app.get("/checkout/mini-cart", (c) => c.html(MiniCart({ c }))); + app.post("/checkout/cart/add", async (c) => { + await handleAddToCart(c); + return c.redirect("/checkout/cart"); + }); + app.post("/checkout/cart/remove", async (c) => { + await handleRemoveFromCart(c); + return c.redirect("/checkout/cart"); + }); + app.post("/checkout/place-order", async (c) => { + await handlePlaceOrder(c); + return c.redirect("/checkout/thanks"); + }); + app.get("/checkout/thanks", (c) => c.html(Thanks({ c }))); + + return app; +} diff --git a/examples/hono-tractor-store-2.0/src/server.node.js b/examples/hono-tractor-store-2.0/src/server.node.js new file mode 100644 index 0000000..9c24684 --- /dev/null +++ b/examples/hono-tractor-store-2.0/src/server.node.js @@ -0,0 +1,27 @@ +import createServer from "./server.js"; +import { serve } from "@hono/node-server"; +import { serveStatic } from "@hono/node-server/serve-static"; + +const app = createServer(); + +// Serve static files +const isProd = process.env.NODE_ENV === "production"; +const cacheControl = isProd ? "public, max-age=86400" : "no-store"; +const setHeaders = (res) => { + res.setHeader("Cache-Control", cacheControl); +}; + +const onNotFound = (path, c) => + console.log(`${path} is not found, request to ${c.req.path}`); + +app.use("/cdn/*", serveStatic({ root: "./public/", setHeaders, onNotFound })); +["explore", "decide", "checkout"].forEach((team) => { + app.use( + `/${team}/static/*`, + serveStatic({ root: `./public/`, setHeaders, onNotFound }), + ); +}); + +serve({ fetch: app.fetch, port: 3000 }, (info) => { + console.log(`Listening on http://localhost:${info.port}`); +}); diff --git a/examples/hono-tractor-store-2.0/src/types.js b/examples/hono-tractor-store-2.0/src/types.js new file mode 100644 index 0000000..70eaea8 --- /dev/null +++ b/examples/hono-tractor-store-2.0/src/types.js @@ -0,0 +1,16 @@ +/** + * HonoContext. + * @typedef {object} HonoContext + * @property {HonoRequest} req - The request object. + * @property {Function} html - Returns the HTML content. + * @property {Function} redirect - Redirects to a URL. + */ + +/** + * HonoRequest. + * @typedef {object} HonoRequest + * @property {Function} parseBody - Parses the request body. + * @property {Function} query - Returns the request query. + * @property {Function} param - Returns the request params. + * @property {string} path - Returns the request path. + */ diff --git a/examples/hono-tractor-store-2.0/wrangler.toml b/examples/hono-tractor-store-2.0/wrangler.toml new file mode 100644 index 0000000..bd69b53 --- /dev/null +++ b/examples/hono-tractor-store-2.0/wrangler.toml @@ -0,0 +1,6 @@ +name = "tractor-store-blueprint" +main = "src/server.cloudflare.js" +compatibility_date = "2024-03-12" + +[site] +bucket = "./public" \ No newline at end of file diff --git a/rspack_hmr/README.md b/rspack_hmr/README.md new file mode 100644 index 0000000..4edb088 --- /dev/null +++ b/rspack_hmr/README.md @@ -0,0 +1,101 @@ +# mf-runtime + +## How to run this example +First install all by running + +```sh +pnpm install && pnpm run install-all +``` + +After installation run: +`pnpm run start` + +Rspack remotes: +run `host` (localhost:3000) and `app2` + +runtime remotes: +run `runhost` (localhost:3003) and `app2` + +HMR should work fine in both cases! + +## How does it work + +We pay attention to all the `rspack.config.ts` in each of the modules. + +Let's start with `app_02` where it provides the component to others. + +Within [`app_02`'s `rspack.config.ts`](./app2/rspack.config.js), we expose two things (only one thing is used atm for other hosts) + +```js + new ModuleFederationPlugin({ + name: name, + filename: 'remoteEntry.js', + exposes: { + './Hello': './src/Hello.tsx', + './pi': './src/pi.ts', + }, + manifest: true, + + }), +``` + +The component is exposed from the configuration, while we define a public path (for other consuming application to find it) at: + +```js + output: { + path: __dirname + '/dist', + uniqueName: name1, + publicPath: 'http://localhost:3001/', + filename: '[name].js', + }, +``` +And of course, often time we run into `CORS` error so we also need to make sure the headers are configured correctly since we will be fetching part of the frontend from `app2` to other host application (in this case, dir name `host` and `runhost`): + +```js +headers: { + 'Access-Control-Allow-Origin': '*', + 'Access-Control-Allow-Methods': 'GET, POST, PUT, DELETE, PATCH, OPTIONS', + 'Access-Control-Allow-Headers': 'X-Requested-With, content-type, Authorization', + }, +``` + +Next we go into [`host/rspack.config.ts`](./host/rspack.config.js), to consume the remote module from other application we will need: +1. the app's unique name `app_02` +2. the public path (at the moment it runs on your local computer) +3. the module federation manifest +4. specify if there is any shared dependencies + +This part of the code is how `host` can find `app2`: + +```js + new ModuleFederationPlugin({ + name: name, + filename: 'remoteEntry.js', + remotes: { + app_02: 'app_02@http://localhost:3001/mf-manifest.json', + }, + + shared: ['react', 'react-dom'], + }), +``` + +When we are going to consume the `Hello` module from `app2`, we find the [`host/src/App.tsx`](./host/src/App.tsx) and import it just like every other React component with a path we have defined in `rspack.config.ts`: + +```tsx +import { Hello } from 'app_02/Hello'; + +``` +and then within the component: +```tsx +... +
    + +
    + + + +... +``` diff --git a/rspack_hmr/app2/.gitignore b/rspack_hmr/app2/.gitignore new file mode 100644 index 0000000..a547bf3 --- /dev/null +++ b/rspack_hmr/app2/.gitignore @@ -0,0 +1,24 @@ +# Logs +logs +*.log +npm-debug.log* +yarn-debug.log* +yarn-error.log* +pnpm-debug.log* +lerna-debug.log* + +node_modules +dist +dist-ssr +*.local + +# Editor directories and files +.vscode/* +!.vscode/extensions.json +.idea +.DS_Store +*.suo +*.ntvs* +*.njsproj +*.sln +*.sw? diff --git a/rspack_hmr/app2/index.html b/rspack_hmr/app2/index.html new file mode 100644 index 0000000..5dab944 --- /dev/null +++ b/rspack_hmr/app2/index.html @@ -0,0 +1,16 @@ + + + + + + + + Rspack + React + TS + + + + +
    + + + \ No newline at end of file diff --git a/rspack_hmr/app2/package.json b/rspack_hmr/app2/package.json new file mode 100644 index 0000000..46b245b --- /dev/null +++ b/rspack_hmr/app2/package.json @@ -0,0 +1,26 @@ +{ + "name": "@rspack-hmr/app2", + "private": true, + "version": "1.0.0", + "scripts": { + "dev": "NODE_ENV=development rspack serve", + "build": "NODE_ENV=production rspack build" + }, + "dependencies": { + "@module-federation/enhanced": "0.2.1", + "@module-federation/runtime": "0.2.1", + "@module-federation/sdk": "0.2.1", + "react": "^18.2.0", + "react-dom": "^18.2.0", + "zephyr-webpack-plugin": "^0.0.13" + }, + "devDependencies": { + "@rspack/cli": "0.7.4", + "@rspack/core": "0.7.4", + "@rspack/plugin-react-refresh": "0.7.4", + "@types/react": "18.3.3", + "@types/react-dom": "18.3.0", + "prettier": "3.3.2", + "react-refresh": "0.14.2" + } +} diff --git a/rspack_hmr/app2/pnpm-lock.yaml b/rspack_hmr/app2/pnpm-lock.yaml new file mode 100644 index 0000000..6359e06 --- /dev/null +++ b/rspack_hmr/app2/pnpm-lock.yaml @@ -0,0 +1,3163 @@ +lockfileVersion: '6.0' + +settings: + autoInstallPeers: true + excludeLinksFromLockfile: false + +dependencies: + '@module-federation/enhanced': + specifier: 0.2.1 + version: 0.2.1(typescript@5.5.3)(webpack@5.92.1) + '@module-federation/runtime': + specifier: 0.2.1 + version: 0.2.1 + '@module-federation/sdk': + specifier: 0.2.1 + version: 0.2.1 + react: + specifier: ^18.2.0 + version: 18.3.1 + react-dom: + specifier: ^18.2.0 + version: 18.3.1(react@18.3.1) + zephyr-webpack-plugin: + specifier: ^0.0.13 + version: 0.0.13 + +devDependencies: + '@rspack/cli': + specifier: 0.7.4 + version: 0.7.4(@rspack/core@0.7.4)(webpack@5.92.1) + '@rspack/core': + specifier: 0.7.4 + version: 0.7.4 + '@rspack/plugin-react-refresh': + specifier: 0.7.4 + version: 0.7.4(react-refresh@0.14.2) + '@types/react': + specifier: 18.3.3 + version: 18.3.3 + '@types/react-dom': + specifier: 18.3.0 + version: 18.3.0 + prettier: + specifier: 3.3.2 + version: 3.3.2 + react-refresh: + specifier: 0.14.2 + version: 0.14.2 + +packages: + + /@discoveryjs/json-ext@0.5.7: + resolution: {integrity: sha512-dBVuXR082gk3jsFp7Rd/JI4kytwGHecnCoTtXFb7DB6CNHp4rg5k1bhg0nWdLGLnOV71lmDzGQaLMy8iPLY0pw==} + engines: {node: '>=10.0.0'} + dev: true + + /@jridgewell/gen-mapping@0.3.5: + resolution: {integrity: sha512-IzL8ZoEDIBRWEzlCcRhOaCupYyN5gdIK+Q6fbFdPDg6HqX6jpkItn7DFIpW9LQzXG6Df9sA7+OKnq0qlz/GaQg==} + engines: {node: '>=6.0.0'} + dependencies: + '@jridgewell/set-array': 1.2.1 + '@jridgewell/sourcemap-codec': 1.4.15 + '@jridgewell/trace-mapping': 0.3.25 + + /@jridgewell/resolve-uri@3.1.2: + resolution: {integrity: sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==} + engines: {node: '>=6.0.0'} + + /@jridgewell/set-array@1.2.1: + resolution: {integrity: sha512-R8gLRTZeyp03ymzP/6Lil/28tGeGEzhx1q2k703KGWRAI1VdvPIXdG70VJc2pAMw3NA6JKL5hhFu1sJX0Mnn/A==} + engines: {node: '>=6.0.0'} + + /@jridgewell/source-map@0.3.6: + resolution: {integrity: sha512-1ZJTZebgqllO79ue2bm3rIGud/bOe0pP5BjSRCRxxYkEZS8STV7zN84UBbiYu7jy+eCKSnVIUgoWWE/tt+shMQ==} + dependencies: + '@jridgewell/gen-mapping': 0.3.5 + '@jridgewell/trace-mapping': 0.3.25 + + /@jridgewell/sourcemap-codec@1.4.15: + resolution: {integrity: sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg==} + + /@jridgewell/trace-mapping@0.3.25: + resolution: {integrity: sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ==} + dependencies: + '@jridgewell/resolve-uri': 3.1.2 + '@jridgewell/sourcemap-codec': 1.4.15 + + /@leichtgewicht/ip-codec@2.0.5: + resolution: {integrity: sha512-Vo+PSpZG2/fmgmiNzYK9qWRh8h/CHrwD0mo1h1DzL4yzHNSfWYujGTYsWGreD000gcgmZ7K4Ys6Tx9TxtsKdDw==} + dev: true + + /@module-federation/automatic-vendor-federation@1.2.1(webpack@5.92.1): + resolution: {integrity: sha512-73wxkXM7pbRZ6GGM90JP5IPTPvY3fvrhQyTVdMCUx85cQRWqnbzbibcsz3pkOMOeXyYAO4tXXsG13yNaEEGhJA==} + peerDependencies: + webpack: 5.91.0 + dependencies: + find-package-json: 1.2.0 + webpack: 5.92.1 + dev: false + + /@module-federation/bridge-react-webpack-plugin@0.2.1: + resolution: {integrity: sha512-dWqA4mm81yDBBWD452UiX3TXxFQPpu4KCArAIO72cISq5Llrsd0WbyUQY1DOWFN8wdhy5OwyMS5qj5wCNHXeew==} + dependencies: + '@module-federation/sdk': 0.2.1 + dev: false + + /@module-federation/dts-plugin@0.2.1(typescript@5.5.3): + resolution: {integrity: sha512-hr1w7KEaIVvoCB6mn1//+yZig099m6Ux3b5lW+w7SrH54dLzJHtIfllhWhZPZi5D9Y3mMuQlAxodsCD/sXQlKQ==} + peerDependencies: + typescript: ^4.9.0 || ^5.0.0 + vue-tsc: ^1.0.24 + peerDependenciesMeta: + vue-tsc: + optional: true + dependencies: + '@module-federation/managers': 0.2.1 + '@module-federation/sdk': 0.2.1 + '@module-federation/third-party-dts-extractor': 0.2.1 + adm-zip: 0.5.14 + ansi-colors: 4.1.3 + axios: 1.7.2 + chalk: 3.0.0 + fs-extra: 9.1.0 + isomorphic-ws: 5.0.0(ws@8.17.1) + koa: 2.11.0 + lodash.clonedeepwith: 4.5.0 + log4js: 6.9.1 + node-schedule: 2.1.1 + rambda: 9.2.1 + typescript: 5.5.3 + ws: 8.17.1 + transitivePeerDependencies: + - bufferutil + - debug + - supports-color + - utf-8-validate + dev: false + + /@module-federation/enhanced@0.2.1(typescript@5.5.3)(webpack@5.92.1): + resolution: {integrity: sha512-4iXsTU7HQUNtZMR4FAUTuctBQ9jOkYPINiCRveZjERW+UWC2g6KZ/rjbT5H5pBu/Ta6os8NSuNECtXGsT6Bprg==} + peerDependencies: + typescript: ^4.9.0 || ^5.0.0 + vue-tsc: ^1.0.24 + webpack: ^5.0.0 + peerDependenciesMeta: + typescript: + optional: true + vue-tsc: + optional: true + webpack: + optional: true + dependencies: + '@module-federation/bridge-react-webpack-plugin': 0.2.1 + '@module-federation/dts-plugin': 0.2.1(typescript@5.5.3) + '@module-federation/managers': 0.2.1 + '@module-federation/manifest': 0.2.1(typescript@5.5.3) + '@module-federation/rspack': 0.2.1(typescript@5.5.3) + '@module-federation/runtime-tools': 0.2.1 + '@module-federation/sdk': 0.2.1 + btoa: 1.2.1 + typescript: 5.5.3 + upath: 2.0.1 + webpack: 5.92.1 + transitivePeerDependencies: + - bufferutil + - debug + - supports-color + - utf-8-validate + dev: false + + /@module-federation/managers@0.2.1: + resolution: {integrity: sha512-x7Qon5YhLr9KPjig2zPkL76ZFLkvzDm7zrF2fVGO/wURWoeTougZ8vcUsDFrpEHxoQaC3OEgN0i5ZwEeRZlE2Q==} + dependencies: + '@module-federation/sdk': 0.2.1 + find-pkg: 2.0.0 + fs-extra: 9.1.0 + dev: false + + /@module-federation/manifest@0.2.1(typescript@5.5.3): + resolution: {integrity: sha512-Q0mw8ASPwCFdOvVrm7VHUMfki5MCtglb0FIPTDfhhHgVEQ6J2zW7WTu8/6HXY/SiorI1r1YBp9qhh0EzpMxgvA==} + dependencies: + '@module-federation/dts-plugin': 0.2.1(typescript@5.5.3) + '@module-federation/managers': 0.2.1 + '@module-federation/sdk': 0.2.1 + chalk: 3.0.0 + find-pkg: 2.0.0 + transitivePeerDependencies: + - bufferutil + - debug + - supports-color + - typescript + - utf-8-validate + - vue-tsc + dev: false + + /@module-federation/rspack@0.2.1(typescript@5.5.3): + resolution: {integrity: sha512-J6IGpHje69E7l6kJAZ++j35OqCJDmkj5vFdt4/nSosgAHH1hnVzTgZAvscvfsupgUntZn0HJWPNmXwBaOrccbw==} + dependencies: + '@module-federation/bridge-react-webpack-plugin': 0.2.1 + '@module-federation/dts-plugin': 0.2.1(typescript@5.5.3) + '@module-federation/managers': 0.2.1 + '@module-federation/manifest': 0.2.1(typescript@5.5.3) + '@module-federation/runtime-tools': 0.2.1 + '@module-federation/sdk': 0.2.1 + transitivePeerDependencies: + - bufferutil + - debug + - supports-color + - typescript + - utf-8-validate + - vue-tsc + dev: false + + /@module-federation/runtime-tools@0.1.6: + resolution: {integrity: sha512-7ILVnzMIa0Dlc0Blck5tVZG1tnk1MmLnuZpLOMpbdW+zl+N6wdMjjHMjEZFCUAJh2E5XJ3BREwfX8Ets0nIkLg==} + dependencies: + '@module-federation/runtime': 0.1.6 + '@module-federation/webpack-bundler-runtime': 0.1.6 + dev: true + + /@module-federation/runtime-tools@0.2.1: + resolution: {integrity: sha512-UUmEuvYWyubHfgavnqvkVmxI/Js1V4bYEMnIHTQsIn4j1DRe7DKhKeaFk+OxsAzspiIPZdEWrvmzehSYaSChJw==} + dependencies: + '@module-federation/runtime': 0.2.1 + '@module-federation/webpack-bundler-runtime': 0.2.1 + dev: false + + /@module-federation/runtime@0.1.6: + resolution: {integrity: sha512-nj6a+yJ+QxmcE89qmrTl4lphBIoAds0PFPVGnqLRWflwAP88jrCcrrTqRhARegkFDL+wE9AE04+h6jzlbIfMKg==} + dependencies: + '@module-federation/sdk': 0.1.6 + dev: true + + /@module-federation/runtime@0.2.1: + resolution: {integrity: sha512-uzp2Smg2yhJYnfYAlleFrDkVXi8b5MaEd9ve8YjrulCnhN3dAq4tQkwXOiryVtpGT5qVUBdfVoTW+HozYibEOw==} + dependencies: + '@module-federation/sdk': 0.2.1 + dev: false + + /@module-federation/sdk@0.1.6: + resolution: {integrity: sha512-qifXpyYLM7abUeEOIfv0oTkguZgRZuwh89YOAYIZJlkP6QbRG7DJMQvtM8X2yHXm9PTk0IYNnOJH0vNQCo6auQ==} + dev: true + + /@module-federation/sdk@0.2.1: + resolution: {integrity: sha512-t3136yds14EBb+BAvp3LJg8E8W+07tNweXUOt5NQfn4TROml6wF4TFyrLsaXi5F8c1C95IGYRxUNKjQ/ImLK6w==} + dev: false + + /@module-federation/third-party-dts-extractor@0.2.1: + resolution: {integrity: sha512-ws1xxpPcn1nE75jlc5jFeMaj65HdMiO9JN0Z661936q76C6gsjM0G+YQLRy/lr834/F4+zkRBaInyglM98I1eg==} + dependencies: + find-pkg: 2.0.0 + fs-extra: 9.1.0 + resolve: 1.22.8 + dev: false + + /@module-federation/webpack-bundler-runtime@0.1.6: + resolution: {integrity: sha512-K5WhKZ4RVNaMEtfHsd/9CNCgGKB0ipbm/tgweNNeC11mEuBTNxJ09Y630vg3WPkKv9vfMCuXg2p2Dk+Q/KWTSA==} + dependencies: + '@module-federation/runtime': 0.1.6 + '@module-federation/sdk': 0.1.6 + dev: true + + /@module-federation/webpack-bundler-runtime@0.2.1: + resolution: {integrity: sha512-8TdWq3TNd6fT6BayQRHtoonGfO5tyW/QjKJE/z2OWFFfG8JYF/dNWcOfLYm9Wui8Xts6nSyQIKhAD0tBifQtMw==} + dependencies: + '@module-federation/runtime': 0.2.1 + '@module-federation/sdk': 0.2.1 + dev: false + + /@polka/url@1.0.0-next.25: + resolution: {integrity: sha512-j7P6Rgr3mmtdkeDGTe0E/aYyWEWVtc5yFXtHCRHs28/jptDEWfaVOc5T7cblqy1XKPPfCxJc/8DwQ5YgLOZOVQ==} + dev: true + + /@rspack/binding-darwin-arm64@0.7.4: + resolution: {integrity: sha512-K78fUe9OhFTV61kHYCuahNkBXCFJMmqSGyIgNtLR9Psk82IVCHkvxY5565An1Quvo1UmgVh5R2YmylKE81mwiw==} + cpu: [arm64] + os: [darwin] + requiresBuild: true + dev: true + optional: true + + /@rspack/binding-darwin-x64@0.7.4: + resolution: {integrity: sha512-EQriu7oE+tZv25g5VJH6Ael74U42fmpb4zGs7wLmWyKfCtO6SegL3tJ8Jc6mMmp+vg949dVvkw7uB6TJjOqx2g==} + cpu: [x64] + os: [darwin] + requiresBuild: true + dev: true + optional: true + + /@rspack/binding-linux-arm64-gnu@0.7.4: + resolution: {integrity: sha512-yhJLkU1zEXMyHNWhh8pBEaK6cRAjFzRK2hqejhhZ0K+lqC0Af9bKvZyXXGrMfmmHlsh1VJ9VVmi21qcXr/kdzg==} + cpu: [arm64] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@rspack/binding-linux-arm64-musl@0.7.4: + resolution: {integrity: sha512-6GV3Ztl6Q1zdJmNo+dwHiJd2Y/IEH9qWOh4YHiyzYGbQQYpfhhLYwKexalWaAAhdMm6KKoeqzklgHImCINImEg==} + cpu: [arm64] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@rspack/binding-linux-x64-gnu@0.7.4: + resolution: {integrity: sha512-KFdAEIZ7mPnT0y198xVOa8vIT9tgpEFVidCSIlxdk65UGC59g6UxEQq1EVAbcBi1Ou6Zza/UtxIlzk6Ev6KDkQ==} + cpu: [x64] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@rspack/binding-linux-x64-musl@0.7.4: + resolution: {integrity: sha512-qekcXkv12oWRztZHXGzNAI92/O/+abU35/nGDycZmMtr+Qt2XS5hE1T9oBQ54yecIzUVDGNcYwhIMWBX6E2dmQ==} + cpu: [x64] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@rspack/binding-win32-arm64-msvc@0.7.4: + resolution: {integrity: sha512-D1BccimBVeA/k2ty/28ER/j3s/c0n0MtN4kpyjYwgRILVLRSr+rfbC75i8wYh8r8AXjhNWNG88LmrFN9e9i7Ug==} + cpu: [arm64] + os: [win32] + requiresBuild: true + dev: true + optional: true + + /@rspack/binding-win32-ia32-msvc@0.7.4: + resolution: {integrity: sha512-5//TZH0Y4fRuTQ/ZmNOVaIfPIQXtgNAI78QxvF8Amygk4Uqklpo3ceHGP+yZfZgjh3mzjoUK+22fWbq/cUmW0w==} + cpu: [ia32] + os: [win32] + requiresBuild: true + dev: true + optional: true + + /@rspack/binding-win32-x64-msvc@0.7.4: + resolution: {integrity: sha512-C3ZxIEYKvnjQbV19FfQE6CGO6vcGp2JcvSQCc6SHwU/KNxLDrI1pA7XUG5TKoGSsqVEDZN6H8fJxLUYPQBjJcg==} + cpu: [x64] + os: [win32] + requiresBuild: true + dev: true + optional: true + + /@rspack/binding@0.7.4: + resolution: {integrity: sha512-H1rTtYxbxe40miV2gYLPwIxEn2yMY6+bq+fjfiRu61kTvllexPMBYgFpKqSAc5Qyyto9j9uCkR4MJEYj2R/SQQ==} + optionalDependencies: + '@rspack/binding-darwin-arm64': 0.7.4 + '@rspack/binding-darwin-x64': 0.7.4 + '@rspack/binding-linux-arm64-gnu': 0.7.4 + '@rspack/binding-linux-arm64-musl': 0.7.4 + '@rspack/binding-linux-x64-gnu': 0.7.4 + '@rspack/binding-linux-x64-musl': 0.7.4 + '@rspack/binding-win32-arm64-msvc': 0.7.4 + '@rspack/binding-win32-ia32-msvc': 0.7.4 + '@rspack/binding-win32-x64-msvc': 0.7.4 + dev: true + + /@rspack/cli@0.7.4(@rspack/core@0.7.4)(webpack@5.92.1): + resolution: {integrity: sha512-UFQWYpgHqrtCzySif9F/ueBn8CbsGmlXOZRYnOzC9HzKXZY9JYgJFbT7EL7JfFe1LmBukF3yaTOuSgTbIxJkJQ==} + hasBin: true + peerDependencies: + '@rspack/core': '>=0.4.0' + dependencies: + '@discoveryjs/json-ext': 0.5.7 + '@rspack/core': 0.7.4 + '@rspack/dev-server': 0.7.4(@rspack/core@0.7.4)(webpack@5.92.1) + colorette: 2.0.19 + exit-hook: 3.2.0 + interpret: 3.1.1 + rechoir: 0.8.0 + semver: 6.3.1 + webpack-bundle-analyzer: 4.6.1 + yargs: 17.6.2 + transitivePeerDependencies: + - '@types/express' + - bufferutil + - debug + - supports-color + - utf-8-validate + - webpack + - webpack-cli + dev: true + + /@rspack/core@0.7.4: + resolution: {integrity: sha512-HECQ0WL8iVS1Mwq2W2hfrStZZbtTPl/GjDdAZDMToPqWtSVGww99UDGIYTHW8G6kawQ3GY6wa86WTQNfXEpSCA==} + engines: {node: '>=16.0.0'} + peerDependencies: + '@swc/helpers': '>=0.5.1' + peerDependenciesMeta: + '@swc/helpers': + optional: true + dependencies: + '@module-federation/runtime-tools': 0.1.6 + '@rspack/binding': 0.7.4 + caniuse-lite: 1.0.30001639 + tapable: 2.2.1 + webpack-sources: 3.2.3 + dev: true + + /@rspack/dev-server@0.7.4(@rspack/core@0.7.4)(webpack@5.92.1): + resolution: {integrity: sha512-mzc1gqZ0iMmqbsWiVSoRfZQiz2x1wGQc0uibyRzDxZ1Z9IqSjHwoZopVAN9aiR6CNWrSXRHy7KuyhCFfweOh0g==} + peerDependencies: + '@rspack/core': '*' + dependencies: + '@rspack/core': 0.7.4 + chokidar: 3.5.3 + connect-history-api-fallback: 2.0.0 + express: 4.19.2 + http-proxy-middleware: 2.0.6(@types/express@4.17.21) + mime-types: 2.1.35 + webpack-dev-middleware: 6.1.2(webpack@5.92.1) + webpack-dev-server: 4.13.1(webpack@5.92.1) + ws: 8.8.1 + transitivePeerDependencies: + - '@types/express' + - bufferutil + - debug + - supports-color + - utf-8-validate + - webpack + - webpack-cli + dev: true + + /@rspack/plugin-react-refresh@0.7.4(react-refresh@0.14.2): + resolution: {integrity: sha512-9tAJdG/xZ6hUtD5K5OVpwAl2yV2HFnNl5fU5aOR5VJ5Pk0rCsYwbEZRbRnmSZwzMWIKDnowhoTi+4Ha3JV3aeQ==} + peerDependencies: + react-refresh: '>=0.10.0 <1.0.0' + peerDependenciesMeta: + react-refresh: + optional: true + dependencies: + react-refresh: 0.14.2 + dev: true + + /@socket.io/component-emitter@3.1.2: + resolution: {integrity: sha512-9BCxFwvbGg/RsZK9tjXd8s4UcwR0MWeFQ1XEKIQVVvAGJyINdrqKMcTRyLoK8Rse1GjzLV9cwjWV1olXRWEXVA==} + dev: false + + /@types/body-parser@1.19.5: + resolution: {integrity: sha512-fB3Zu92ucau0iQ0JMCFQE7b/dv8Ot07NI3KaZIkIUNXq82k4eBAqUaneXfleGY9JWskeS9y+u0nXMyspcuQrCg==} + dependencies: + '@types/connect': 3.4.38 + '@types/node': 20.14.9 + dev: true + + /@types/bonjour@3.5.13: + resolution: {integrity: sha512-z9fJ5Im06zvUL548KvYNecEVlA7cVDkGUi6kZusb04mpyEFKCIZJvloCcmpmLaIahDpOQGHaHmG6imtPMmPXGQ==} + dependencies: + '@types/node': 20.14.9 + dev: true + + /@types/connect-history-api-fallback@1.5.4: + resolution: {integrity: sha512-n6Cr2xS1h4uAulPRdlw6Jl6s1oG8KrVilPN2yUITEs+K48EzMJJ3W1xy8K5eWuFvjp3R74AOIGSmp2UfBJ8HFw==} + dependencies: + '@types/express-serve-static-core': 4.19.5 + '@types/node': 20.14.9 + dev: true + + /@types/connect@3.4.38: + resolution: {integrity: sha512-K6uROf1LD88uDQqJCktA4yzL1YYAK6NgfsI0v/mTgyPKWsX1CnJ0XPSDhViejru1GcRkLWb8RlzFYJRqGUbaug==} + dependencies: + '@types/node': 20.14.9 + dev: true + + /@types/eslint-scope@3.7.7: + resolution: {integrity: sha512-MzMFlSLBqNF2gcHWO0G1vP/YQyfvrxZ0bF+u7mzUdZ1/xK4A4sru+nraZz5i3iEIk1l1uyicaDVTB4QbbEkAYg==} + dependencies: + '@types/eslint': 8.56.10 + '@types/estree': 1.0.5 + + /@types/eslint@8.56.10: + resolution: {integrity: sha512-Shavhk87gCtY2fhXDctcfS3e6FdxWkCx1iUZ9eEUbh7rTqlZT0/IzOkCOVt0fCjcFuZ9FPYfuezTBImfHCDBGQ==} + dependencies: + '@types/estree': 1.0.5 + '@types/json-schema': 7.0.15 + + /@types/estree@1.0.5: + resolution: {integrity: sha512-/kYRxGDLWzHOB7q+wtSUQlFrtcdUccpfy+X+9iMBpHK8QLLhx2wIPYuS5DYtR9Wa/YlZAbIovy7qVdB1Aq6Lyw==} + + /@types/express-serve-static-core@4.19.5: + resolution: {integrity: sha512-y6W03tvrACO72aijJ5uF02FRq5cgDR9lUxddQ8vyF+GvmjJQqbzDcJngEjURc+ZsG31VI3hODNZJ2URj86pzmg==} + dependencies: + '@types/node': 20.14.9 + '@types/qs': 6.9.15 + '@types/range-parser': 1.2.7 + '@types/send': 0.17.4 + dev: true + + /@types/express@4.17.21: + resolution: {integrity: sha512-ejlPM315qwLpaQlQDTjPdsUFSc6ZsP4AN6AlWnogPjQ7CVi7PYF3YVz+CY3jE2pwYf7E/7HlDAN0rV2GxTG0HQ==} + dependencies: + '@types/body-parser': 1.19.5 + '@types/express-serve-static-core': 4.19.5 + '@types/qs': 6.9.15 + '@types/serve-static': 1.15.7 + dev: true + + /@types/http-errors@2.0.4: + resolution: {integrity: sha512-D0CFMMtydbJAegzOyHjtiKPLlvnm3iTZyZRSZoLq2mRhDdmLfIWOCYPfQJ4cu2erKghU++QvjcUjp/5h7hESpA==} + dev: true + + /@types/http-proxy@1.17.14: + resolution: {integrity: sha512-SSrD0c1OQzlFX7pGu1eXxSEjemej64aaNPRhhVYUGqXh0BtldAAx37MG8btcumvpgKyZp1F5Gn3JkktdxiFv6w==} + dependencies: + '@types/node': 20.14.9 + dev: true + + /@types/json-schema@7.0.15: + resolution: {integrity: sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==} + + /@types/mime@1.3.5: + resolution: {integrity: sha512-/pyBZWSLD2n0dcHE3hq8s8ZvcETHtEuF+3E7XVt0Ig2nvsVQXdghHVcEkIWjy9A0wKfTn97a/PSDYohKIlnP/w==} + dev: true + + /@types/node-forge@1.3.11: + resolution: {integrity: sha512-FQx220y22OKNTqaByeBGqHWYz4cl94tpcxeFdvBo3wjG6XPBuZ0BNgNZRV5J5TFmmcsJ4IzsLkmGRiQbnYsBEQ==} + dependencies: + '@types/node': 20.14.9 + dev: true + + /@types/node@20.14.9: + resolution: {integrity: sha512-06OCtnTXtWOZBJlRApleWndH4JsRVs1pDCc8dLSQp+7PpUpX3ePdHyeNSFTeSe7FtKyQkrlPvHwJOW3SLd8Oyg==} + dependencies: + undici-types: 5.26.5 + + /@types/prop-types@15.7.12: + resolution: {integrity: sha512-5zvhXYtRNRluoE/jAp4GVsSduVUzNWKkOZrCDBWYtE7biZywwdC2AcEzg+cSMLFRfVgeAFqpfNabiPjxFddV1Q==} + dev: true + + /@types/qs@6.9.15: + resolution: {integrity: sha512-uXHQKES6DQKKCLh441Xv/dwxOq1TVS3JPUMlEqoEglvlhR6Mxnlew/Xq/LRVHpLyk7iK3zODe1qYHIMltO7XGg==} + dev: true + + /@types/range-parser@1.2.7: + resolution: {integrity: sha512-hKormJbkJqzQGhziax5PItDUTMAM9uE2XXQmM37dyd4hVM+5aVl7oVxMVUiVQn2oCQFN/LKCZdvSM0pFRqbSmQ==} + dev: true + + /@types/react-dom@18.3.0: + resolution: {integrity: sha512-EhwApuTmMBmXuFOikhQLIBUn6uFg81SwLMOAUgodJF14SOBOCMdU04gDoYi0WOJJHD144TL32z4yDqCW3dnkQg==} + dependencies: + '@types/react': 18.3.3 + dev: true + + /@types/react@18.3.3: + resolution: {integrity: sha512-hti/R0pS0q1/xx+TsI73XIqk26eBsISZ2R0wUijXIngRK9R/e7Xw/cXVxQK7R5JjW+SV4zGcn5hXjudkN/pLIw==} + dependencies: + '@types/prop-types': 15.7.12 + csstype: 3.1.3 + dev: true + + /@types/retry@0.12.0: + resolution: {integrity: sha512-wWKOClTTiizcZhXnPY4wikVAwmdYHp8q6DmC+EJUzAMsycb7HB32Kh9RN4+0gExjmPmZSAQjgURXIGATPegAvA==} + dev: true + + /@types/send@0.17.4: + resolution: {integrity: sha512-x2EM6TJOybec7c52BX0ZspPodMsQUd5L6PRwOunVyVUhXiBSKf3AezDL8Dgvgt5o0UfKNfuA0eMLr2wLT4AiBA==} + dependencies: + '@types/mime': 1.3.5 + '@types/node': 20.14.9 + dev: true + + /@types/serve-index@1.9.4: + resolution: {integrity: sha512-qLpGZ/c2fhSs5gnYsQxtDEq3Oy8SXPClIXkW5ghvAvsNuVSA8k+gCONcUCS/UjLEYvYps+e8uBtfgXgvhwfNug==} + dependencies: + '@types/express': 4.17.21 + dev: true + + /@types/serve-static@1.15.7: + resolution: {integrity: sha512-W8Ym+h8nhuRwaKPaDw34QUkwsGi6Rc4yYqvKFo5rm2FUEhCFbzVWrxXUxuKK8TASjWsysJY0nsmNCGhCOIsrOw==} + dependencies: + '@types/http-errors': 2.0.4 + '@types/node': 20.14.9 + '@types/send': 0.17.4 + dev: true + + /@types/sockjs@0.3.36: + resolution: {integrity: sha512-MK9V6NzAS1+Ud7JV9lJLFqW85VbC9dq3LmwZCuBe4wBDgKC0Kj/jd8Xl+nSviU+Qc3+m7umHHyHg//2KSa0a0Q==} + dependencies: + '@types/node': 20.14.9 + dev: true + + /@types/ws@8.5.10: + resolution: {integrity: sha512-vmQSUcfalpIq0R9q7uTo2lXs6eGIpt9wtnLdMv9LVpIjCA/+ufZRozlVoVelIYixx1ugCBKDhn89vnsEGOCx9A==} + dependencies: + '@types/node': 20.14.9 + dev: true + + /@webassemblyjs/ast@1.12.1: + resolution: {integrity: sha512-EKfMUOPRRUTy5UII4qJDGPpqfwjOmZ5jeGFwid9mnoqIFK+e0vqoi1qH56JpmZSzEL53jKnNzScdmftJyG5xWg==} + dependencies: + '@webassemblyjs/helper-numbers': 1.11.6 + '@webassemblyjs/helper-wasm-bytecode': 1.11.6 + + /@webassemblyjs/floating-point-hex-parser@1.11.6: + resolution: {integrity: sha512-ejAj9hfRJ2XMsNHk/v6Fu2dGS+i4UaXBXGemOfQ/JfQ6mdQg/WXtwleQRLLS4OvfDhv8rYnVwH27YJLMyYsxhw==} + + /@webassemblyjs/helper-api-error@1.11.6: + resolution: {integrity: sha512-o0YkoP4pVu4rN8aTJgAyj9hC2Sv5UlkzCHhxqWj8butaLvnpdc2jOwh4ewE6CX0txSfLn/UYaV/pheS2Txg//Q==} + + /@webassemblyjs/helper-buffer@1.12.1: + resolution: {integrity: sha512-nzJwQw99DNDKr9BVCOZcLuJJUlqkJh+kVzVl6Fmq/tI5ZtEyWT1KZMyOXltXLZJmDtvLCDgwsyrkohEtopTXCw==} + + /@webassemblyjs/helper-numbers@1.11.6: + resolution: {integrity: sha512-vUIhZ8LZoIWHBohiEObxVm6hwP034jwmc9kuq5GdHZH0wiLVLIPcMCdpJzG4C11cHoQ25TFIQj9kaVADVX7N3g==} + dependencies: + '@webassemblyjs/floating-point-hex-parser': 1.11.6 + '@webassemblyjs/helper-api-error': 1.11.6 + '@xtuc/long': 4.2.2 + + /@webassemblyjs/helper-wasm-bytecode@1.11.6: + resolution: {integrity: sha512-sFFHKwcmBprO9e7Icf0+gddyWYDViL8bpPjJJl0WHxCdETktXdmtWLGVzoHbqUcY4Be1LkNfwTmXOJUFZYSJdA==} + + /@webassemblyjs/helper-wasm-section@1.12.1: + resolution: {integrity: sha512-Jif4vfB6FJlUlSbgEMHUyk1j234GTNG9dBJ4XJdOySoj518Xj0oGsNi59cUQF4RRMS9ouBUxDDdyBVfPTypa5g==} + dependencies: + '@webassemblyjs/ast': 1.12.1 + '@webassemblyjs/helper-buffer': 1.12.1 + '@webassemblyjs/helper-wasm-bytecode': 1.11.6 + '@webassemblyjs/wasm-gen': 1.12.1 + + /@webassemblyjs/ieee754@1.11.6: + resolution: {integrity: sha512-LM4p2csPNvbij6U1f19v6WR56QZ8JcHg3QIJTlSwzFcmx6WSORicYj6I63f9yU1kEUtrpG+kjkiIAkevHpDXrg==} + dependencies: + '@xtuc/ieee754': 1.2.0 + + /@webassemblyjs/leb128@1.11.6: + resolution: {integrity: sha512-m7a0FhE67DQXgouf1tbN5XQcdWoNgaAuoULHIfGFIEVKA6tu/edls6XnIlkmS6FrXAquJRPni3ZZKjw6FSPjPQ==} + dependencies: + '@xtuc/long': 4.2.2 + + /@webassemblyjs/utf8@1.11.6: + resolution: {integrity: sha512-vtXf2wTQ3+up9Zsg8sa2yWiQpzSsMyXj0qViVP6xKGCUT8p8YJ6HqI7l5eCnWx1T/FYdsv07HQs2wTFbbof/RA==} + + /@webassemblyjs/wasm-edit@1.12.1: + resolution: {integrity: sha512-1DuwbVvADvS5mGnXbE+c9NfA8QRcZ6iKquqjjmR10k6o+zzsRVesil54DKexiowcFCPdr/Q0qaMgB01+SQ1u6g==} + dependencies: + '@webassemblyjs/ast': 1.12.1 + '@webassemblyjs/helper-buffer': 1.12.1 + '@webassemblyjs/helper-wasm-bytecode': 1.11.6 + '@webassemblyjs/helper-wasm-section': 1.12.1 + '@webassemblyjs/wasm-gen': 1.12.1 + '@webassemblyjs/wasm-opt': 1.12.1 + '@webassemblyjs/wasm-parser': 1.12.1 + '@webassemblyjs/wast-printer': 1.12.1 + + /@webassemblyjs/wasm-gen@1.12.1: + resolution: {integrity: sha512-TDq4Ojh9fcohAw6OIMXqiIcTq5KUXTGRkVxbSo1hQnSy6lAM5GSdfwWeSxpAo0YzgsgF182E/U0mDNhuA0tW7w==} + dependencies: + '@webassemblyjs/ast': 1.12.1 + '@webassemblyjs/helper-wasm-bytecode': 1.11.6 + '@webassemblyjs/ieee754': 1.11.6 + '@webassemblyjs/leb128': 1.11.6 + '@webassemblyjs/utf8': 1.11.6 + + /@webassemblyjs/wasm-opt@1.12.1: + resolution: {integrity: sha512-Jg99j/2gG2iaz3hijw857AVYekZe2SAskcqlWIZXjji5WStnOpVoat3gQfT/Q5tb2djnCjBtMocY/Su1GfxPBg==} + dependencies: + '@webassemblyjs/ast': 1.12.1 + '@webassemblyjs/helper-buffer': 1.12.1 + '@webassemblyjs/wasm-gen': 1.12.1 + '@webassemblyjs/wasm-parser': 1.12.1 + + /@webassemblyjs/wasm-parser@1.12.1: + resolution: {integrity: sha512-xikIi7c2FHXysxXe3COrVUPSheuBtpcfhbpFj4gmu7KRLYOzANztwUU0IbsqvMqzuNK2+glRGWCEqZo1WCLyAQ==} + dependencies: + '@webassemblyjs/ast': 1.12.1 + '@webassemblyjs/helper-api-error': 1.11.6 + '@webassemblyjs/helper-wasm-bytecode': 1.11.6 + '@webassemblyjs/ieee754': 1.11.6 + '@webassemblyjs/leb128': 1.11.6 + '@webassemblyjs/utf8': 1.11.6 + + /@webassemblyjs/wast-printer@1.12.1: + resolution: {integrity: sha512-+X4WAlOisVWQMikjbcvY2e0rwPsKQ9F688lksZhBcPycBBuii3O7m8FACbDMWDojpAqvjIncrG8J0XHKyQfVeA==} + dependencies: + '@webassemblyjs/ast': 1.12.1 + '@xtuc/long': 4.2.2 + + /@xtuc/ieee754@1.2.0: + resolution: {integrity: sha512-DX8nKgqcGwsc0eJSqYt5lwP4DH5FlHnmuWWBRy7X0NcaGR0ZtuyeESgMwTYVEtxmsNGY+qit4QYT/MIYTOTPeA==} + + /@xtuc/long@4.2.2: + resolution: {integrity: sha512-NuHqBY1PB/D8xU6s/thBgOAiAP7HOYDQ32+BFZILJ8ivkUkAHQnWfn6WhL79Owj1qmUnoN/YPhktdIoucipkAQ==} + + /accepts@1.3.8: + resolution: {integrity: sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw==} + engines: {node: '>= 0.6'} + dependencies: + mime-types: 2.1.35 + negotiator: 0.6.3 + + /acorn-import-attributes@1.9.5(acorn@8.12.0): + resolution: {integrity: sha512-n02Vykv5uA3eHGM/Z2dQrcD56kL8TyDb2p1+0P83PClMnC/nc+anbQRhIOWnSq4Ke/KvDPrY3C9hDtC/A3eHnQ==} + peerDependencies: + acorn: ^8 + dependencies: + acorn: 8.12.0 + + /acorn-walk@8.3.3: + resolution: {integrity: sha512-MxXdReSRhGO7VlFe1bRG/oI7/mdLV9B9JJT0N8vZOhF7gFRR5l3M8W9G8JxmKV+JC5mGqJ0QvqfSOLsCPa4nUw==} + engines: {node: '>=0.4.0'} + dependencies: + acorn: 8.12.0 + dev: true + + /acorn@8.12.0: + resolution: {integrity: sha512-RTvkC4w+KNXrM39/lWCUaG0IbRkWdCv7W/IOW9oU6SawyxulvkQy5HQPVTKxEjczcUvapcrw3cFx/60VN/NRNw==} + engines: {node: '>=0.4.0'} + hasBin: true + + /adm-zip@0.5.14: + resolution: {integrity: sha512-DnyqqifT4Jrcvb8USYjp6FHtBpEIz1mnXu6pTRHZ0RL69LbQYiO+0lDFg5+OKA7U29oWSs3a/i8fhn8ZcceIWg==} + engines: {node: '>=12.0'} + dev: false + + /ajv-formats@2.1.1(ajv@8.16.0): + resolution: {integrity: sha512-Wx0Kx52hxE7C18hkMEggYlEifqWZtYaRgouJor+WMdPnQyEK13vgEWyVNup7SoeeoLMsr4kf5h6dOW11I15MUA==} + peerDependencies: + ajv: ^8.0.0 + peerDependenciesMeta: + ajv: + optional: true + dependencies: + ajv: 8.16.0 + dev: true + + /ajv-keywords@3.5.2(ajv@6.12.6): + resolution: {integrity: sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ==} + peerDependencies: + ajv: ^6.9.1 + dependencies: + ajv: 6.12.6 + + /ajv-keywords@5.1.0(ajv@8.16.0): + resolution: {integrity: sha512-YCS/JNFAUyr5vAuhk1DWm1CBxRHW9LbJ2ozWeemrIqpbsqKjHVxYPyi5GC0rjZIT5JxJ3virVTS8wk4i/Z+krw==} + peerDependencies: + ajv: ^8.8.2 + dependencies: + ajv: 8.16.0 + fast-deep-equal: 3.1.3 + dev: true + + /ajv@6.12.6: + resolution: {integrity: sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==} + dependencies: + fast-deep-equal: 3.1.3 + fast-json-stable-stringify: 2.1.0 + json-schema-traverse: 0.4.1 + uri-js: 4.4.1 + + /ajv@8.16.0: + resolution: {integrity: sha512-F0twR8U1ZU67JIEtekUcLkXkoO5mMMmgGD8sK/xUFzJ805jxHQl92hImFAqqXMyMYjSPOyUPAwHYhB72g5sTXw==} + dependencies: + fast-deep-equal: 3.1.3 + json-schema-traverse: 1.0.0 + require-from-string: 2.0.2 + uri-js: 4.4.1 + dev: true + + /ansi-colors@4.1.3: + resolution: {integrity: sha512-/6w/C21Pm1A7aZitlI5Ni/2J6FFQN8i1Cvz3kHABAAbw93v/NlvKdVOqz7CCWz/3iv/JplRSEEZ83XION15ovw==} + engines: {node: '>=6'} + dev: false + + /ansi-html-community@0.0.8: + resolution: {integrity: sha512-1APHAyr3+PCamwNw3bXCPp4HFLONZt/yIH0sZp0/469KWNTEy+qN5jQ3GVX6DMZ1UXAi34yVwtTeaG/HpBuuzw==} + engines: {'0': node >= 0.8.0} + hasBin: true + dev: true + + /ansi-regex@5.0.1: + resolution: {integrity: sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==} + engines: {node: '>=8'} + dev: true + + /ansi-styles@4.3.0: + resolution: {integrity: sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==} + engines: {node: '>=8'} + dependencies: + color-convert: 2.0.1 + + /any-promise@1.3.0: + resolution: {integrity: sha512-7UvmKalWRt1wgjL1RrGxoSJW/0QZFIegpeGvZG9kjp8vrRu55XTHbwnqq2GpXm9uLbcuhxm3IqX9OB4MZR1b2A==} + dev: false + + /anymatch@3.1.3: + resolution: {integrity: sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==} + engines: {node: '>= 8'} + dependencies: + normalize-path: 3.0.0 + picomatch: 2.3.1 + dev: true + + /array-flatten@1.1.1: + resolution: {integrity: sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg==} + dev: true + + /asynckit@0.4.0: + resolution: {integrity: sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==} + dev: false + + /at-least-node@1.0.0: + resolution: {integrity: sha512-+q/t7Ekv1EDY2l6Gda6LLiX14rU9TV20Wa3ofeQmwPFZbOMo9DXrLbOjFaaclkXKWidIaopwAObQDqwWtGUjqg==} + engines: {node: '>= 4.0.0'} + dev: false + + /axios@1.7.2: + resolution: {integrity: sha512-2A8QhOMrbomlDuiLeK9XibIBzuHeRcqqNOHp0Cyp5EoJ1IFDh+XZH3A6BkXtv0K4gFGCI0Y4BM7B1wOEi0Rmgw==} + dependencies: + follow-redirects: 1.15.6 + form-data: 4.0.0 + proxy-from-env: 1.1.0 + transitivePeerDependencies: + - debug + dev: false + + /balanced-match@1.0.2: + resolution: {integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==} + dev: true + + /batch@0.6.1: + resolution: {integrity: sha512-x+VAiMRL6UPkx+kudNvxTl6hB2XNNCG2r+7wixVfIYwu/2HKRXimwQyaumLjMveWvT2Hkd/cAJw+QBMfJ/EKVw==} + dev: true + + /binary-extensions@2.3.0: + resolution: {integrity: sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw==} + engines: {node: '>=8'} + dev: true + + /body-parser@1.20.2: + resolution: {integrity: sha512-ml9pReCu3M61kGlqoTm2umSXTlRTuGTx0bfYj+uIUKKYycG5NtSbeetV3faSU6R7ajOPw0g/J1PvK4qNy7s5bA==} + engines: {node: '>= 0.8', npm: 1.2.8000 || >= 1.4.16} + dependencies: + bytes: 3.1.2 + content-type: 1.0.5 + debug: 2.6.9 + depd: 2.0.0 + destroy: 1.2.0 + http-errors: 2.0.0 + iconv-lite: 0.4.24 + on-finished: 2.4.1 + qs: 6.11.0 + raw-body: 2.5.2 + type-is: 1.6.18 + unpipe: 1.0.0 + transitivePeerDependencies: + - supports-color + dev: true + + /bonjour-service@1.2.1: + resolution: {integrity: sha512-oSzCS2zV14bh2kji6vNe7vrpJYCHGvcZnlffFQ1MEoX/WOeQ/teD8SYWKR942OI3INjq8OMNJlbPK5LLLUxFDw==} + dependencies: + fast-deep-equal: 3.1.3 + multicast-dns: 7.2.5 + dev: true + + /brace-expansion@1.1.11: + resolution: {integrity: sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==} + dependencies: + balanced-match: 1.0.2 + concat-map: 0.0.1 + dev: true + + /braces@3.0.3: + resolution: {integrity: sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==} + engines: {node: '>=8'} + dependencies: + fill-range: 7.1.1 + dev: true + + /browserslist@4.23.1: + resolution: {integrity: sha512-TUfofFo/KsK/bWZ9TWQ5O26tsWW4Uhmt8IYklbnUa70udB6P2wA7w7o4PY4muaEPBQaAX+CEnmmIA41NVHtPVw==} + engines: {node: ^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7} + hasBin: true + dependencies: + caniuse-lite: 1.0.30001639 + electron-to-chromium: 1.4.816 + node-releases: 2.0.14 + update-browserslist-db: 1.0.16(browserslist@4.23.1) + + /btoa@1.2.1: + resolution: {integrity: sha512-SB4/MIGlsiVkMcHmT+pSmIPoNDoHg+7cMzmt3Uxt628MTz2487DKSqK/fuhFBrkuqrYv5UCEnACpF4dTFNKc/g==} + engines: {node: '>= 0.4.0'} + hasBin: true + dev: false + + /buffer-from@1.1.2: + resolution: {integrity: sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==} + + /bundle-name@4.1.0: + resolution: {integrity: sha512-tjwM5exMg6BGRI+kNmTntNsvdZS1X8BFYS6tnJ2hdH0kVxM6/eVZ2xy+FqStSWvYmtfFMDLIxurorHwDKfDz5Q==} + engines: {node: '>=18'} + dependencies: + run-applescript: 7.0.0 + dev: false + + /bytes@3.0.0: + resolution: {integrity: sha512-pMhOfFDPiv9t5jjIXkHosWmkSyQbvsgEVNkz0ERHbuLh2T/7j4Mqqpz523Fe8MVY89KC6Sh/QfS2sM+SjgFDcw==} + engines: {node: '>= 0.8'} + dev: true + + /bytes@3.1.2: + resolution: {integrity: sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==} + engines: {node: '>= 0.8'} + dev: true + + /cache-content-type@1.0.1: + resolution: {integrity: sha512-IKufZ1o4Ut42YUrZSo8+qnMTrFuKkvyoLXUywKz9GJ5BrhOFGhLdkx9sG4KAnVvbY6kEcSFjLQul+DVmBm2bgA==} + engines: {node: '>= 6.0.0'} + dependencies: + mime-types: 2.1.35 + ylru: 1.4.0 + dev: false + + /call-bind@1.0.7: + resolution: {integrity: sha512-GHTSNSYICQ7scH7sZ+M2rFopRoLh8t2bLSW6BbgrtLsahOIB5iyAVJf9GjWK3cYTDaMj4XdBpM1cA6pIS0Kv2w==} + engines: {node: '>= 0.4'} + dependencies: + es-define-property: 1.0.0 + es-errors: 1.3.0 + function-bind: 1.1.2 + get-intrinsic: 1.2.4 + set-function-length: 1.2.2 + dev: true + + /caniuse-lite@1.0.30001639: + resolution: {integrity: sha512-eFHflNTBIlFwP2AIKaYuBQN/apnUoKNhBdza8ZnW/h2di4LCZ4xFqYlxUxo+LQ76KFI1PGcC1QDxMbxTZpSCAg==} + + /chalk@3.0.0: + resolution: {integrity: sha512-4D3B6Wf41KOYRFdszmDqMCGq5VV/uMAB273JILmO+3jAlh8X4qDtdtgCR3fxtbLEMzSx22QdhnDcJvu2u1fVwg==} + engines: {node: '>=8'} + dependencies: + ansi-styles: 4.3.0 + supports-color: 7.2.0 + dev: false + + /chalk@4.1.2: + resolution: {integrity: sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==} + engines: {node: '>=10'} + dependencies: + ansi-styles: 4.3.0 + supports-color: 7.2.0 + dev: true + + /chokidar@3.5.3: + resolution: {integrity: sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==} + engines: {node: '>= 8.10.0'} + dependencies: + anymatch: 3.1.3 + braces: 3.0.3 + glob-parent: 5.1.2 + is-binary-path: 2.1.0 + is-glob: 4.0.3 + normalize-path: 3.0.0 + readdirp: 3.6.0 + optionalDependencies: + fsevents: 2.3.3 + dev: true + + /chrome-trace-event@1.0.4: + resolution: {integrity: sha512-rNjApaLzuwaOTjCiT8lSDdGN1APCiqkChLMJxJPWLunPAt5fy8xgU9/jNOchV84wfIxrA0lRQB7oCT8jrn/wrQ==} + engines: {node: '>=6.0'} + + /ci-info@3.9.0: + resolution: {integrity: sha512-NIxF55hv4nSqQswkAeiOi1r83xy8JldOFDTWiug55KBu9Jnblncd2U6ViHmYgHf01TPZS77NJBhBMKdWj9HQMQ==} + engines: {node: '>=8'} + dev: false + + /cliui@8.0.1: + resolution: {integrity: sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==} + engines: {node: '>=12'} + dependencies: + string-width: 4.2.3 + strip-ansi: 6.0.1 + wrap-ansi: 7.0.0 + dev: true + + /co@4.6.0: + resolution: {integrity: sha512-QVb0dM5HvG+uaxitm8wONl7jltx8dqhfU33DcqtOZcLSVIKSDDLDi7+0LbAKiyI8hD9u42m2YxXSkMGWThaecQ==} + engines: {iojs: '>= 1.0.0', node: '>= 0.12.0'} + dev: false + + /color-convert@2.0.1: + resolution: {integrity: sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==} + engines: {node: '>=7.0.0'} + dependencies: + color-name: 1.1.4 + + /color-name@1.1.4: + resolution: {integrity: sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==} + + /colorette@2.0.19: + resolution: {integrity: sha512-3tlv/dIP7FWvj3BsbHrGLJ6l/oKh1O3TcgBqMn+yyCagOxc23fyzDS6HypQbgxWbkpDnf52p1LuR4eWDQ/K9WQ==} + dev: true + + /combined-stream@1.0.8: + resolution: {integrity: sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==} + engines: {node: '>= 0.8'} + dependencies: + delayed-stream: 1.0.0 + dev: false + + /commander@2.20.3: + resolution: {integrity: sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==} + + /commander@7.2.0: + resolution: {integrity: sha512-QrWXB+ZQSVPmIWIhtEO9H+gwHaMGYiF5ChvoJ+K9ZGHG/sVsa6yiesAD1GC/x46sET00Xlwo1u49RVVVzvcSkw==} + engines: {node: '>= 10'} + dev: true + + /compressible@2.0.18: + resolution: {integrity: sha512-AF3r7P5dWxL8MxyITRMlORQNaOA2IkAFaTr4k7BUumjPtRpGDTZpl0Pb1XCO6JeDCBdp126Cgs9sMxqSjgYyRg==} + engines: {node: '>= 0.6'} + dependencies: + mime-db: 1.52.0 + dev: true + + /compression@1.7.4: + resolution: {integrity: sha512-jaSIDzP9pZVS4ZfQ+TzvtiWhdpFhE2RDHz8QJkpX9SIpLq88VueF5jJw6t+6CUQcAoA6t+x89MLrWAqpfDE8iQ==} + engines: {node: '>= 0.8.0'} + dependencies: + accepts: 1.3.8 + bytes: 3.0.0 + compressible: 2.0.18 + debug: 2.6.9 + on-headers: 1.0.2 + safe-buffer: 5.1.2 + vary: 1.1.2 + transitivePeerDependencies: + - supports-color + dev: true + + /concat-map@0.0.1: + resolution: {integrity: sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==} + dev: true + + /connect-history-api-fallback@2.0.0: + resolution: {integrity: sha512-U73+6lQFmfiNPrYbXqr6kZ1i1wiRqXnp2nhMsINseWXO8lDau0LGEffJ8kQi4EjLZympVgRdvqjAgiZ1tgzDDA==} + engines: {node: '>=0.8'} + dev: true + + /content-disposition@0.5.4: + resolution: {integrity: sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ==} + engines: {node: '>= 0.6'} + dependencies: + safe-buffer: 5.2.1 + + /content-type@1.0.5: + resolution: {integrity: sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA==} + engines: {node: '>= 0.6'} + + /cookie-signature@1.0.6: + resolution: {integrity: sha512-QADzlaHc8icV8I7vbaJXJwod9HWYp8uCqf1xa4OfNu1T7JVxQIrUgOWtHdNDtPiywmFbiS12VjotIXLrKM3orQ==} + dev: true + + /cookie@0.6.0: + resolution: {integrity: sha512-U71cyTamuh1CRNCfpGY6to28lxvNwPG4Guz/EVjgf3Jmzv0vlDp1atT9eS5dDjMYHucpHbWns6Lwf3BKz6svdw==} + engines: {node: '>= 0.6'} + dev: true + + /cookies@0.8.0: + resolution: {integrity: sha512-8aPsApQfebXnuI+537McwYsDtjVxGm8gTIzQI3FDW6t5t/DAhERxtnbEPN/8RX+uZthoz4eCOgloXaE5cYyNow==} + engines: {node: '>= 0.8'} + dependencies: + depd: 2.0.0 + keygrip: 1.1.0 + dev: false + + /core-util-is@1.0.3: + resolution: {integrity: sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==} + dev: true + + /cron-parser@4.9.0: + resolution: {integrity: sha512-p0SaNjrHOnQeR8/VnfGbmg9te2kfyYSQ7Sc/j/6DtPL3JQvKxmjO9TSjNFpujqV3vEYYBvNNvXSxzyksBWAx1Q==} + engines: {node: '>=12.0.0'} + dependencies: + luxon: 3.4.4 + dev: false + + /cross-spawn@7.0.3: + resolution: {integrity: sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==} + engines: {node: '>= 8'} + dependencies: + path-key: 3.1.1 + shebang-command: 2.0.0 + which: 2.0.2 + dev: true + + /csstype@3.1.3: + resolution: {integrity: sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw==} + dev: true + + /date-format@4.0.14: + resolution: {integrity: sha512-39BOQLs9ZjKh0/patS9nrT8wc3ioX3/eA/zgbKNopnF2wCqJEoxywwwElATYvRsXdnOxA/OQeQoFZ3rFjVajhg==} + engines: {node: '>=4.0'} + dev: false + + /debug@2.6.9: + resolution: {integrity: sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==} + peerDependencies: + supports-color: '*' + peerDependenciesMeta: + supports-color: + optional: true + dependencies: + ms: 2.0.0 + dev: true + + /debug@3.1.0: + resolution: {integrity: sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==} + peerDependencies: + supports-color: '*' + peerDependenciesMeta: + supports-color: + optional: true + dependencies: + ms: 2.0.0 + dev: false + + /debug@4.3.5: + resolution: {integrity: sha512-pt0bNEmneDIvdL1Xsd9oDQ/wrQRkXDT4AUWlNZNPKvW5x/jyO9VFXkJUP07vQ2upmw5PlaITaPKc31jK13V+jg==} + engines: {node: '>=6.0'} + peerDependencies: + supports-color: '*' + peerDependenciesMeta: + supports-color: + optional: true + dependencies: + ms: 2.1.2 + + /deep-equal@1.0.1: + resolution: {integrity: sha512-bHtC0iYvWhyaTzvV3CZgPeZQqCOBGyGsVV7v4eevpdkLHfiSrXUdBG+qAuSz4RI70sszvjQ1QSZ98An1yNwpSw==} + dev: false + + /default-browser-id@5.0.0: + resolution: {integrity: sha512-A6p/pu/6fyBcA1TRz/GqWYPViplrftcW2gZC9q79ngNCKAeR/X3gcEdXQHl4KNXV+3wgIJ1CPkJQ3IHM6lcsyA==} + engines: {node: '>=18'} + dev: false + + /default-browser@5.2.1: + resolution: {integrity: sha512-WY/3TUME0x3KPYdRRxEJJvXRHV4PyPoUsxtZa78lwItwRQRHhd2U9xOscaT/YTf8uCXIAjeJOFBVEh/7FtD8Xg==} + engines: {node: '>=18'} + dependencies: + bundle-name: 4.1.0 + default-browser-id: 5.0.0 + dev: false + + /default-gateway@6.0.3: + resolution: {integrity: sha512-fwSOJsbbNzZ/CUFpqFBqYfYNLj1NbMPm8MMCIzHjC83iSJRBEGmDUxU+WP661BaBQImeC2yHwXtz+P/O9o+XEg==} + engines: {node: '>= 10'} + dependencies: + execa: 5.1.1 + dev: true + + /define-data-property@1.1.4: + resolution: {integrity: sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A==} + engines: {node: '>= 0.4'} + dependencies: + es-define-property: 1.0.0 + es-errors: 1.3.0 + gopd: 1.0.1 + dev: true + + /define-lazy-prop@2.0.0: + resolution: {integrity: sha512-Ds09qNh8yw3khSjiJjiUInaGX9xlqZDY7JVryGxdxV7NPeuqQfplOpQ66yJFZut3jLa5zOwkXw1g9EI2uKh4Og==} + engines: {node: '>=8'} + dev: true + + /define-lazy-prop@3.0.0: + resolution: {integrity: sha512-N+MeXYoqr3pOgn8xfyRPREN7gHakLYjhsHhWGT3fWAiL4IkAt0iDw14QiiEm2bE30c5XX5q0FtAA3CK5f9/BUg==} + engines: {node: '>=12'} + dev: false + + /delayed-stream@1.0.0: + resolution: {integrity: sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==} + engines: {node: '>=0.4.0'} + dev: false + + /delegates@1.0.0: + resolution: {integrity: sha512-bd2L678uiWATM6m5Z1VzNCErI3jiGzt6HGY8OVICs40JQq/HALfbyNJmp0UDakEY4pMMaN0Ly5om/B1VI/+xfQ==} + dev: false + + /depd@1.1.2: + resolution: {integrity: sha512-7emPTl6Dpo6JRXOXjLRxck+FlLRX5847cLKEn00PLAgc3g2hTZZgr+e4c2v6QpSmLeFP3n5yUo7ft6avBK/5jQ==} + engines: {node: '>= 0.6'} + + /depd@2.0.0: + resolution: {integrity: sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==} + engines: {node: '>= 0.8'} + + /destroy@1.2.0: + resolution: {integrity: sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg==} + engines: {node: '>= 0.8', npm: 1.2.8000 || >= 1.4.16} + + /detect-node@2.1.0: + resolution: {integrity: sha512-T0NIuQpnTvFDATNuHN5roPwSBG83rFsuO+MXXH9/3N1eFbn4wcPjttvjMLEPWJ0RGUYgQE7cGgS3tNxbqCGM7g==} + dev: true + + /dns-packet@5.6.1: + resolution: {integrity: sha512-l4gcSouhcgIKRvyy99RNVOgxXiicE+2jZoNmaNmZ6JXiGajBOJAesk1OBlJuM5k2c+eudGdLxDqXuPCKIj6kpw==} + engines: {node: '>=6'} + dependencies: + '@leichtgewicht/ip-codec': 2.0.5 + dev: true + + /duplexer@0.1.2: + resolution: {integrity: sha512-jtD6YG370ZCIi/9GTaJKQxWTZD045+4R4hTk/x1UyoqadyJ9x9CgSi1RlVDQF8U2sxLLSnFkCaMihqljHIWgMg==} + dev: true + + /ee-first@1.1.1: + resolution: {integrity: sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==} + + /electron-to-chromium@1.4.816: + resolution: {integrity: sha512-EKH5X5oqC6hLmiS7/vYtZHZFTNdhsYG5NVPRN6Yn0kQHNBlT59+xSM8HBy66P5fxWpKgZbPqb+diC64ng295Jw==} + + /emoji-regex@8.0.0: + resolution: {integrity: sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==} + dev: true + + /encodeurl@1.0.2: + resolution: {integrity: sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w==} + engines: {node: '>= 0.8'} + + /engine.io-client@6.5.4: + resolution: {integrity: sha512-GeZeeRjpD2qf49cZQ0Wvh/8NJNfeXkXXcoGh+F77oEAgo9gUHwT1fCRxSNU+YEEaysOJTnsFHmM5oAcPy4ntvQ==} + dependencies: + '@socket.io/component-emitter': 3.1.2 + debug: 4.3.5 + engine.io-parser: 5.2.2 + ws: 8.17.1 + xmlhttprequest-ssl: 2.0.0 + transitivePeerDependencies: + - bufferutil + - supports-color + - utf-8-validate + dev: false + + /engine.io-parser@5.2.2: + resolution: {integrity: sha512-RcyUFKA93/CXH20l4SoVvzZfrSDMOTUS3bWVpTt2FuFP+XYrL8i8oonHP7WInRyVHXh0n/ORtoeiE1os+8qkSw==} + engines: {node: '>=10.0.0'} + dev: false + + /enhanced-resolve@5.17.0: + resolution: {integrity: sha512-dwDPwZL0dmye8Txp2gzFmA6sxALaSvdRDjPH0viLcKrtlOL3tw62nWWweVD1SdILDTJrbrL6tdWVN58Wo6U3eA==} + engines: {node: '>=10.13.0'} + dependencies: + graceful-fs: 4.2.11 + tapable: 2.2.1 + + /error-inject@1.0.0: + resolution: {integrity: sha512-JM8N6PytDbmIYm1IhPWlo8vr3NtfjhDY/1MhD/a5b/aad/USE8a0+NsqE9d5n+GVGmuNkPQWm4bFQWv18d8tMg==} + dev: false + + /es-define-property@1.0.0: + resolution: {integrity: sha512-jxayLKShrEqqzJ0eumQbVhTYQM27CfT1T35+gCgDFoL82JLsXqTJ76zv6A0YLOgEnLUMvLzsDsGIrl8NFpT2gQ==} + engines: {node: '>= 0.4'} + dependencies: + get-intrinsic: 1.2.4 + dev: true + + /es-errors@1.3.0: + resolution: {integrity: sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==} + engines: {node: '>= 0.4'} + dev: true + + /es-module-lexer@1.5.4: + resolution: {integrity: sha512-MVNK56NiMrOwitFB7cqDwq0CQutbw+0BvLshJSse0MUNU+y1FC3bUS/AQg7oUng+/wKrrki7JfmwtVHkVfPLlw==} + + /escalade@3.1.2: + resolution: {integrity: sha512-ErCHMCae19vR8vQGe50xIsVomy19rg6gFu3+r3jkEO46suLMWBksvVyoGgQV+jOfl84ZSOSlmv6Gxa89PmTGmA==} + engines: {node: '>=6'} + + /escape-html@1.0.3: + resolution: {integrity: sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==} + + /eslint-scope@5.1.1: + resolution: {integrity: sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==} + engines: {node: '>=8.0.0'} + dependencies: + esrecurse: 4.3.0 + estraverse: 4.3.0 + + /esrecurse@4.3.0: + resolution: {integrity: sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==} + engines: {node: '>=4.0'} + dependencies: + estraverse: 5.3.0 + + /estraverse@4.3.0: + resolution: {integrity: sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==} + engines: {node: '>=4.0'} + + /estraverse@5.3.0: + resolution: {integrity: sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==} + engines: {node: '>=4.0'} + + /etag@1.8.1: + resolution: {integrity: sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==} + engines: {node: '>= 0.6'} + dev: true + + /eventemitter3@4.0.7: + resolution: {integrity: sha512-8guHBZCwKnFhYdHr2ysuRWErTwhoN2X8XELRlrRwpmfeY2jjuUN4taQMsULKUVo1K4DvZl+0pgfyoysHxvmvEw==} + dev: true + + /events@3.3.0: + resolution: {integrity: sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==} + engines: {node: '>=0.8.x'} + + /execa@5.1.1: + resolution: {integrity: sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==} + engines: {node: '>=10'} + dependencies: + cross-spawn: 7.0.3 + get-stream: 6.0.1 + human-signals: 2.1.0 + is-stream: 2.0.1 + merge-stream: 2.0.0 + npm-run-path: 4.0.1 + onetime: 5.1.2 + signal-exit: 3.0.7 + strip-final-newline: 2.0.0 + dev: true + + /exit-hook@3.2.0: + resolution: {integrity: sha512-aIQN7Q04HGAV/I5BszisuHTZHXNoC23WtLkxdCLuYZMdWviRD0TMIt2bnUBi9MrHaF/hH8b3gwG9iaAUHKnJGA==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + dev: true + + /expand-tilde@2.0.2: + resolution: {integrity: sha512-A5EmesHW6rfnZ9ysHQjPdJRni0SRar0tjtG5MNtm9n5TUvsYU8oozprtRD4AqHxcZWWlVuAmQo2nWKfN9oyjTw==} + engines: {node: '>=0.10.0'} + dependencies: + homedir-polyfill: 1.0.3 + dev: false + + /express@4.19.2: + resolution: {integrity: sha512-5T6nhjsT+EOMzuck8JjBHARTHfMht0POzlA60WV2pMD3gyXw2LZnZ+ueGdNxG+0calOJcWKbpFcuzLZ91YWq9Q==} + engines: {node: '>= 0.10.0'} + dependencies: + accepts: 1.3.8 + array-flatten: 1.1.1 + body-parser: 1.20.2 + content-disposition: 0.5.4 + content-type: 1.0.5 + cookie: 0.6.0 + cookie-signature: 1.0.6 + debug: 2.6.9 + depd: 2.0.0 + encodeurl: 1.0.2 + escape-html: 1.0.3 + etag: 1.8.1 + finalhandler: 1.2.0 + fresh: 0.5.2 + http-errors: 2.0.0 + merge-descriptors: 1.0.1 + methods: 1.1.2 + on-finished: 2.4.1 + parseurl: 1.3.3 + path-to-regexp: 0.1.7 + proxy-addr: 2.0.7 + qs: 6.11.0 + range-parser: 1.2.1 + safe-buffer: 5.2.1 + send: 0.18.0 + serve-static: 1.15.0 + setprototypeof: 1.2.0 + statuses: 2.0.1 + type-is: 1.6.18 + utils-merge: 1.0.1 + vary: 1.1.2 + transitivePeerDependencies: + - supports-color + dev: true + + /fast-deep-equal@3.1.3: + resolution: {integrity: sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==} + + /fast-json-stable-stringify@2.1.0: + resolution: {integrity: sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==} + + /faye-websocket@0.11.4: + resolution: {integrity: sha512-CzbClwlXAuiRQAlUyfqPgvPoNKTckTPGfwZV4ZdAhVcP2lh9KUxJg2b5GkE7XbjKQ3YJnQ9z6D9ntLAlB+tP8g==} + engines: {node: '>=0.8.0'} + dependencies: + websocket-driver: 0.7.4 + dev: true + + /fill-range@7.1.1: + resolution: {integrity: sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==} + engines: {node: '>=8'} + dependencies: + to-regex-range: 5.0.1 + dev: true + + /finalhandler@1.2.0: + resolution: {integrity: sha512-5uXcUVftlQMFnWC9qu/svkWv3GTd2PfUhK/3PLkYNAe7FbqJMt3515HaxE6eRL74GdsriiwujiawdaB1BpEISg==} + engines: {node: '>= 0.8'} + dependencies: + debug: 2.6.9 + encodeurl: 1.0.2 + escape-html: 1.0.3 + on-finished: 2.4.1 + parseurl: 1.3.3 + statuses: 2.0.1 + unpipe: 1.0.0 + transitivePeerDependencies: + - supports-color + dev: true + + /find-file-up@2.0.1: + resolution: {integrity: sha512-qVdaUhYO39zmh28/JLQM5CoYN9byEOKEH4qfa8K1eNV17W0UUMJ9WgbR/hHFH+t5rcl+6RTb5UC7ck/I+uRkpQ==} + engines: {node: '>=8'} + dependencies: + resolve-dir: 1.0.1 + dev: false + + /find-package-json@1.2.0: + resolution: {integrity: sha512-+SOGcLGYDJHtyqHd87ysBhmaeQ95oWspDKnMXBrnQ9Eq4OkLNqejgoaD8xVWu6GPa0B6roa6KinCMEMcVeqONw==} + dev: false + + /find-pkg@2.0.0: + resolution: {integrity: sha512-WgZ+nKbELDa6N3i/9nrHeNznm+lY3z4YfhDDWgW+5P0pdmMj26bxaxU11ookgY3NyP9GC7HvZ9etp0jRFqGEeQ==} + engines: {node: '>=8'} + dependencies: + find-file-up: 2.0.1 + dev: false + + /flatted@3.3.1: + resolution: {integrity: sha512-X8cqMLLie7KsNUDSdzeN8FYK9rEt4Dt67OsG/DNGnYTSDBG4uFAJFBnUeiV+zCVAvwFy56IjM9sH51jVaEhNxw==} + dev: false + + /follow-redirects@1.15.6: + resolution: {integrity: sha512-wWN62YITEaOpSK584EZXJafH1AGpO8RVgElfkuXbTOrPX4fIfOyEpW/CsiNd8JdYrAoOvafRTOEnvsO++qCqFA==} + engines: {node: '>=4.0'} + peerDependencies: + debug: '*' + peerDependenciesMeta: + debug: + optional: true + + /form-data@4.0.0: + resolution: {integrity: sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww==} + engines: {node: '>= 6'} + dependencies: + asynckit: 0.4.0 + combined-stream: 1.0.8 + mime-types: 2.1.35 + dev: false + + /forwarded@0.2.0: + resolution: {integrity: sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==} + engines: {node: '>= 0.6'} + dev: true + + /fresh@0.5.2: + resolution: {integrity: sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q==} + engines: {node: '>= 0.6'} + + /fs-extra@8.1.0: + resolution: {integrity: sha512-yhlQgA6mnOJUKOsRUFsgJdQCvkKhcz8tlZG5HBQfReYZy46OwLcY+Zia0mtdHsOo9y/hP+CxMN0TU9QxoOtG4g==} + engines: {node: '>=6 <7 || >=8'} + dependencies: + graceful-fs: 4.2.11 + jsonfile: 4.0.0 + universalify: 0.1.2 + dev: false + + /fs-extra@9.1.0: + resolution: {integrity: sha512-hcg3ZmepS30/7BSFqRvoo3DOMQu7IjqxO5nCDt+zM9XWjb33Wg7ziNT+Qvqbuc3+gWpzO02JubVyk2G4Zvo1OQ==} + engines: {node: '>=10'} + dependencies: + at-least-node: 1.0.0 + graceful-fs: 4.2.11 + jsonfile: 6.1.0 + universalify: 2.0.1 + dev: false + + /fs-monkey@1.0.6: + resolution: {integrity: sha512-b1FMfwetIKymC0eioW7mTywihSQE4oLzQn1dB6rZB5fx/3NpNEdAWeCSMB+60/AeT0TCXsxzAlcYVEFCTAksWg==} + dev: true + + /fs.realpath@1.0.0: + resolution: {integrity: sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==} + dev: true + + /fsevents@2.3.3: + resolution: {integrity: sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==} + engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0} + os: [darwin] + requiresBuild: true + dev: true + optional: true + + /function-bind@1.1.2: + resolution: {integrity: sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==} + + /get-caller-file@2.0.5: + resolution: {integrity: sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==} + engines: {node: 6.* || 8.* || >= 10.*} + dev: true + + /get-intrinsic@1.2.4: + resolution: {integrity: sha512-5uYhsJH8VJBTv7oslg4BznJYhDoRI6waYCxMmCdnTrcCrHA/fCFKoTFz2JKKE0HdDFUF7/oQuhzumXJK7paBRQ==} + engines: {node: '>= 0.4'} + dependencies: + es-errors: 1.3.0 + function-bind: 1.1.2 + has-proto: 1.0.3 + has-symbols: 1.0.3 + hasown: 2.0.2 + dev: true + + /get-stream@6.0.1: + resolution: {integrity: sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==} + engines: {node: '>=10'} + dev: true + + /glob-parent@5.1.2: + resolution: {integrity: sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==} + engines: {node: '>= 6'} + dependencies: + is-glob: 4.0.3 + dev: true + + /glob-to-regexp@0.4.1: + resolution: {integrity: sha512-lkX1HJXwyMcprw/5YUZc2s7DrpAiHB21/V+E1rHUrVNokkvB6bqMzT0VfV6/86ZNabt1k14YOIaT7nDvOX3Iiw==} + + /glob@7.2.3: + resolution: {integrity: sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==} + deprecated: Glob versions prior to v9 are no longer supported + dependencies: + fs.realpath: 1.0.0 + inflight: 1.0.6 + inherits: 2.0.4 + minimatch: 3.1.2 + once: 1.4.0 + path-is-absolute: 1.0.1 + dev: true + + /global-modules@1.0.0: + resolution: {integrity: sha512-sKzpEkf11GpOFuw0Zzjzmt4B4UZwjOcG757PPvrfhxcLFbq0wpsgpOqxpxtxFiCG4DtG93M6XRVbF2oGdev7bg==} + engines: {node: '>=0.10.0'} + dependencies: + global-prefix: 1.0.2 + is-windows: 1.0.2 + resolve-dir: 1.0.1 + dev: false + + /global-prefix@1.0.2: + resolution: {integrity: sha512-5lsx1NUDHtSjfg0eHlmYvZKv8/nVqX4ckFbM+FrGcQ+04KWcWFo9P5MxPZYSzUvyzmdTbI7Eix8Q4IbELDqzKg==} + engines: {node: '>=0.10.0'} + dependencies: + expand-tilde: 2.0.2 + homedir-polyfill: 1.0.3 + ini: 1.3.8 + is-windows: 1.0.2 + which: 1.3.1 + dev: false + + /gopd@1.0.1: + resolution: {integrity: sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA==} + dependencies: + get-intrinsic: 1.2.4 + dev: true + + /graceful-fs@4.2.11: + resolution: {integrity: sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==} + + /gzip-size@6.0.0: + resolution: {integrity: sha512-ax7ZYomf6jqPTQ4+XCpUGyXKHk5WweS+e05MBO4/y3WJ5RkmPXNKvX+bx1behVILVwr6JSQvZAku021CHPXG3Q==} + engines: {node: '>=10'} + dependencies: + duplexer: 0.1.2 + dev: true + + /handle-thing@2.0.1: + resolution: {integrity: sha512-9Qn4yBxelxoh2Ow62nP+Ka/kMnOXRi8BXnRaUwezLNhqelnN49xKz4F/dPP8OYLxLxq6JDtZb2i9XznUQbNPTg==} + dev: true + + /has-flag@4.0.0: + resolution: {integrity: sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==} + engines: {node: '>=8'} + + /has-property-descriptors@1.0.2: + resolution: {integrity: sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg==} + dependencies: + es-define-property: 1.0.0 + dev: true + + /has-proto@1.0.3: + resolution: {integrity: sha512-SJ1amZAJUiZS+PhsVLf5tGydlaVB8EdFpaSO4gmiUKUOxk8qzn5AIy4ZeJUmh22znIdk/uMAUT2pl3FxzVUH+Q==} + engines: {node: '>= 0.4'} + dev: true + + /has-symbols@1.0.3: + resolution: {integrity: sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==} + engines: {node: '>= 0.4'} + + /has-tostringtag@1.0.2: + resolution: {integrity: sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==} + engines: {node: '>= 0.4'} + dependencies: + has-symbols: 1.0.3 + dev: false + + /hasown@2.0.2: + resolution: {integrity: sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==} + engines: {node: '>= 0.4'} + dependencies: + function-bind: 1.1.2 + + /homedir-polyfill@1.0.3: + resolution: {integrity: sha512-eSmmWE5bZTK2Nou4g0AI3zZ9rswp7GRKoKXS1BLUkvPviOqs4YTN1djQIqrXy9k5gEtdLPy86JjRwsNM9tnDcA==} + engines: {node: '>=0.10.0'} + dependencies: + parse-passwd: 1.0.0 + dev: false + + /hpack.js@2.1.6: + resolution: {integrity: sha512-zJxVehUdMGIKsRaNt7apO2Gqp0BdqW5yaiGHXXmbpvxgBYVZnAql+BJb4RO5ad2MgpbZKn5G6nMnegrH1FcNYQ==} + dependencies: + inherits: 2.0.4 + obuf: 1.1.2 + readable-stream: 2.3.8 + wbuf: 1.7.3 + dev: true + + /html-entities@2.5.2: + resolution: {integrity: sha512-K//PSRMQk4FZ78Kyau+mZurHn3FH0Vwr+H36eE0rPbeYkRRi9YxceYPhuN60UwWorxyKHhqoAJl2OFKa4BVtaA==} + dev: true + + /http-assert@1.5.0: + resolution: {integrity: sha512-uPpH7OKX4H25hBmU6G1jWNaqJGpTXxey+YOUizJUAgu0AjLUeC8D73hTrhvDS5D+GJN1DN1+hhc/eF/wpxtp0w==} + engines: {node: '>= 0.8'} + dependencies: + deep-equal: 1.0.1 + http-errors: 1.8.1 + dev: false + + /http-deceiver@1.2.7: + resolution: {integrity: sha512-LmpOGxTfbpgtGVxJrj5k7asXHCgNZp5nLfp+hWc8QQRqtb7fUy6kRY3BO1h9ddF6yIPYUARgxGOwB42DnxIaNw==} + dev: true + + /http-errors@1.6.3: + resolution: {integrity: sha512-lks+lVC8dgGyh97jxvxeYTWQFvh4uw4yC12gVl63Cg30sjPX4wuGcdkICVXDAESr6OJGjqGA8Iz5mkeN6zlD7A==} + engines: {node: '>= 0.6'} + dependencies: + depd: 1.1.2 + inherits: 2.0.3 + setprototypeof: 1.1.0 + statuses: 1.5.0 + dev: true + + /http-errors@1.8.1: + resolution: {integrity: sha512-Kpk9Sm7NmI+RHhnj6OIWDI1d6fIoFAtFt9RLaTMRlg/8w49juAStsrBgp0Dp4OdxdVbRIeKhtCUvoi/RuAhO4g==} + engines: {node: '>= 0.6'} + dependencies: + depd: 1.1.2 + inherits: 2.0.4 + setprototypeof: 1.2.0 + statuses: 1.5.0 + toidentifier: 1.0.1 + dev: false + + /http-errors@2.0.0: + resolution: {integrity: sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==} + engines: {node: '>= 0.8'} + dependencies: + depd: 2.0.0 + inherits: 2.0.4 + setprototypeof: 1.2.0 + statuses: 2.0.1 + toidentifier: 1.0.1 + dev: true + + /http-parser-js@0.5.8: + resolution: {integrity: sha512-SGeBX54F94Wgu5RH3X5jsDtf4eHyRogWX1XGT3b4HuW3tQPM4AaBzoUji/4AAJNXCEOWZ5O0DgZmJw1947gD5Q==} + dev: true + + /http-proxy-middleware@2.0.6(@types/express@4.17.21): + resolution: {integrity: sha512-ya/UeJ6HVBYxrgYotAZo1KvPWlgB48kUJLDePFeneHsVujFaW5WNj2NgWCAE//B1Dl02BIfYlpNgBy8Kf8Rjmw==} + engines: {node: '>=12.0.0'} + peerDependencies: + '@types/express': ^4.17.13 + peerDependenciesMeta: + '@types/express': + optional: true + dependencies: + '@types/express': 4.17.21 + '@types/http-proxy': 1.17.14 + http-proxy: 1.18.1 + is-glob: 4.0.3 + is-plain-obj: 3.0.0 + micromatch: 4.0.7 + transitivePeerDependencies: + - debug + dev: true + + /http-proxy@1.18.1: + resolution: {integrity: sha512-7mz/721AbnJwIVbnaSv1Cz3Am0ZLT/UBwkC92VlxhXv/k/BBQfM2fXElQNC27BVGr0uwUpplYPQM9LnaBMR5NQ==} + engines: {node: '>=8.0.0'} + dependencies: + eventemitter3: 4.0.7 + follow-redirects: 1.15.6 + requires-port: 1.0.0 + transitivePeerDependencies: + - debug + dev: true + + /human-signals@2.1.0: + resolution: {integrity: sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==} + engines: {node: '>=10.17.0'} + dev: true + + /iconv-lite@0.4.24: + resolution: {integrity: sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==} + engines: {node: '>=0.10.0'} + dependencies: + safer-buffer: 2.1.2 + dev: true + + /inflight@1.0.6: + resolution: {integrity: sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==} + deprecated: This module is not supported, and leaks memory. Do not use it. Check out lru-cache if you want a good and tested way to coalesce async requests by a key value, which is much more comprehensive and powerful. + dependencies: + once: 1.4.0 + wrappy: 1.0.2 + dev: true + + /inherits@2.0.3: + resolution: {integrity: sha512-x00IRNXNy63jwGkJmzPigoySHbaqpNuzKbBOmzK+g2OdZpQ9w+sxCN+VSB3ja7IAge2OP2qpfxTjeNcyjmW1uw==} + dev: true + + /inherits@2.0.4: + resolution: {integrity: sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==} + + /ini@1.3.8: + resolution: {integrity: sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==} + dev: false + + /interpret@3.1.1: + resolution: {integrity: sha512-6xwYfHbajpoF0xLW+iwLkhwgvLoZDfjYfoFNu8ftMoXINzwuymNLd9u/KmwtdT2GbR+/Cz66otEGEVVUHX9QLQ==} + engines: {node: '>=10.13.0'} + dev: true + + /ipaddr.js@1.9.1: + resolution: {integrity: sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==} + engines: {node: '>= 0.10'} + dev: true + + /ipaddr.js@2.2.0: + resolution: {integrity: sha512-Ag3wB2o37wslZS19hZqorUnrnzSkpOVy+IiiDEiTqNubEYpYuHWIf6K4psgN2ZWKExS4xhVCrRVfb/wfW8fWJA==} + engines: {node: '>= 10'} + dev: true + + /is-binary-path@2.1.0: + resolution: {integrity: sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==} + engines: {node: '>=8'} + dependencies: + binary-extensions: 2.3.0 + dev: true + + /is-ci@3.0.1: + resolution: {integrity: sha512-ZYvCgrefwqoQ6yTyYUbQu64HsITZ3NfKX1lzaEYdkTDcfKzzCI/wthRRYKkdjHKFVgNiXKAKm65Zo1pk2as/QQ==} + hasBin: true + dependencies: + ci-info: 3.9.0 + dev: false + + /is-core-module@2.14.0: + resolution: {integrity: sha512-a5dFJih5ZLYlRtDc0dZWP7RiKr6xIKzmn/oAYCDvdLThadVgyJwlaoQPmRtMSpz+rk0OGAgIu+TcM9HUF0fk1A==} + engines: {node: '>= 0.4'} + dependencies: + hasown: 2.0.2 + + /is-docker@2.2.1: + resolution: {integrity: sha512-F+i2BKsFrH66iaUFc0woD8sLy8getkwTwtOBjvs56Cx4CgJDeKQeqfz8wAYiSb8JOprWhHH5p77PbmYCvvUuXQ==} + engines: {node: '>=8'} + hasBin: true + dev: true + + /is-docker@3.0.0: + resolution: {integrity: sha512-eljcgEDlEns/7AXFosB5K/2nCM4P7FQPkGc/DWLy5rmFEWvZayGrik1d9/QIY5nJ4f9YsVvBkA6kJpHn9rISdQ==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + hasBin: true + dev: false + + /is-extglob@2.1.1: + resolution: {integrity: sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==} + engines: {node: '>=0.10.0'} + dev: true + + /is-fullwidth-code-point@3.0.0: + resolution: {integrity: sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==} + engines: {node: '>=8'} + dev: true + + /is-generator-function@1.0.10: + resolution: {integrity: sha512-jsEjy9l3yiXEQ+PsXdmBwEPcOxaXWLspKdplFUVI9vq1iZgIekeC0L167qeu86czQaxed3q/Uzuw0swL0irL8A==} + engines: {node: '>= 0.4'} + dependencies: + has-tostringtag: 1.0.2 + dev: false + + /is-glob@4.0.3: + resolution: {integrity: sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==} + engines: {node: '>=0.10.0'} + dependencies: + is-extglob: 2.1.1 + dev: true + + /is-inside-container@1.0.0: + resolution: {integrity: sha512-KIYLCCJghfHZxqjYBE7rEy0OBuTd5xCHS7tHVgvCLkx7StIoaxwNW3hCALgEUjFfeRk+MG/Qxmp/vtETEF3tRA==} + engines: {node: '>=14.16'} + hasBin: true + dependencies: + is-docker: 3.0.0 + dev: false + + /is-number@7.0.0: + resolution: {integrity: sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==} + engines: {node: '>=0.12.0'} + dev: true + + /is-plain-obj@3.0.0: + resolution: {integrity: sha512-gwsOE28k+23GP1B6vFl1oVh/WOzmawBrKwo5Ev6wMKzPkaXaCDIQKzLnvsA42DRlbVTWorkgTKIviAKCWkfUwA==} + engines: {node: '>=10'} + dev: true + + /is-stream@2.0.1: + resolution: {integrity: sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==} + engines: {node: '>=8'} + dev: true + + /is-windows@1.0.2: + resolution: {integrity: sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA==} + engines: {node: '>=0.10.0'} + dev: false + + /is-wsl@2.2.0: + resolution: {integrity: sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww==} + engines: {node: '>=8'} + dependencies: + is-docker: 2.2.1 + dev: true + + /is-wsl@3.1.0: + resolution: {integrity: sha512-UcVfVfaK4Sc4m7X3dUSoHoozQGBEFeDC+zVo06t98xe8CzHSZZBekNXH+tu0NalHolcJ/QAGqS46Hef7QXBIMw==} + engines: {node: '>=16'} + dependencies: + is-inside-container: 1.0.0 + dev: false + + /isarray@1.0.0: + resolution: {integrity: sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==} + dev: true + + /isexe@2.0.0: + resolution: {integrity: sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==} + + /isomorphic-ws@5.0.0(ws@8.17.1): + resolution: {integrity: sha512-muId7Zzn9ywDsyXgTIafTry2sV3nySZeUDe6YedVd1Hvuuep5AsIlqK+XefWpYTyJG5e503F2xIuT2lcU6rCSw==} + peerDependencies: + ws: '*' + dependencies: + ws: 8.17.1 + dev: false + + /jest-worker@27.5.1: + resolution: {integrity: sha512-7vuh85V5cdDofPyxn58nrPjBktZo0u9x1g8WtjQol+jZDaE+fhN+cIvTj11GndBnMnyfrUOG1sZQxCdjKh+DKg==} + engines: {node: '>= 10.13.0'} + dependencies: + '@types/node': 20.14.9 + merge-stream: 2.0.0 + supports-color: 8.1.1 + + /jose@5.6.2: + resolution: {integrity: sha512-F1t1/WZJ4JdmCE/XoMYw1dPOW5g8JF0xGm6Ox2fwaCAPlCzt+4Bh0EWP59iQuZNHHauDkCdjx+kCZSh5z/PGow==} + dev: false + + /js-tokens@4.0.0: + resolution: {integrity: sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==} + dev: false + + /json-parse-even-better-errors@2.3.1: + resolution: {integrity: sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==} + + /json-schema-traverse@0.4.1: + resolution: {integrity: sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==} + + /json-schema-traverse@1.0.0: + resolution: {integrity: sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==} + dev: true + + /jsonfile@4.0.0: + resolution: {integrity: sha512-m6F1R3z8jjlf2imQHS2Qez5sjKWQzbuuhuJ/FKYFRZvPE3PuHcSMVZzfsLhGVOkfd20obL5SWEBew5ShlquNxg==} + optionalDependencies: + graceful-fs: 4.2.11 + dev: false + + /jsonfile@6.1.0: + resolution: {integrity: sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==} + dependencies: + universalify: 2.0.1 + optionalDependencies: + graceful-fs: 4.2.11 + dev: false + + /keygrip@1.1.0: + resolution: {integrity: sha512-iYSchDJ+liQ8iwbSI2QqsQOvqv58eJCEanyJPJi+Khyu8smkcKSFUCbPwzFcL7YVtZ6eONjqRX/38caJ7QjRAQ==} + engines: {node: '>= 0.6'} + dependencies: + tsscmp: 1.0.6 + dev: false + + /koa-compose@3.2.1: + resolution: {integrity: sha512-8gen2cvKHIZ35eDEik5WOo8zbVp9t4cP8p4hW4uE55waxolLRexKKrqfCpwhGVppnB40jWeF8bZeTVg99eZgPw==} + dependencies: + any-promise: 1.3.0 + dev: false + + /koa-compose@4.1.0: + resolution: {integrity: sha512-8ODW8TrDuMYvXRwra/Kh7/rJo9BtOfPc6qO8eAfC80CnCvSjSl0bkRM24X6/XBBEyj0v1nRUQ1LyOy3dbqOWXw==} + dev: false + + /koa-convert@1.2.0: + resolution: {integrity: sha512-K9XqjmEDStGX09v3oxR7t5uPRy0jqJdvodHa6wxWTHrTfDq0WUNnYTOOUZN6g8OM8oZQXprQASbiIXG2Ez8ehA==} + engines: {node: '>= 4'} + dependencies: + co: 4.6.0 + koa-compose: 3.2.1 + dev: false + + /koa@2.11.0: + resolution: {integrity: sha512-EpR9dElBTDlaDgyhDMiLkXrPwp6ZqgAIBvhhmxQ9XN4TFgW+gEz6tkcsNI6BnUbUftrKDjVFj4lW2/J2aNBMMA==} + engines: {node: ^4.8.4 || ^6.10.1 || ^7.10.1 || >= 8.1.4} + dependencies: + accepts: 1.3.8 + cache-content-type: 1.0.1 + content-disposition: 0.5.4 + content-type: 1.0.5 + cookies: 0.8.0 + debug: 3.1.0 + delegates: 1.0.0 + depd: 1.1.2 + destroy: 1.2.0 + encodeurl: 1.0.2 + error-inject: 1.0.0 + escape-html: 1.0.3 + fresh: 0.5.2 + http-assert: 1.5.0 + http-errors: 1.8.1 + is-generator-function: 1.0.10 + koa-compose: 4.1.0 + koa-convert: 1.2.0 + on-finished: 2.4.1 + only: 0.0.2 + parseurl: 1.3.3 + statuses: 1.5.0 + type-is: 1.6.18 + vary: 1.1.2 + transitivePeerDependencies: + - supports-color + dev: false + + /launch-editor@2.8.0: + resolution: {integrity: sha512-vJranOAJrI/llyWGRQqiDM+adrw+k83fvmmx3+nV47g3+36xM15jE+zyZ6Ffel02+xSvuM0b2GDRosXZkbb6wA==} + dependencies: + picocolors: 1.0.1 + shell-quote: 1.8.1 + dev: true + + /loader-runner@4.3.0: + resolution: {integrity: sha512-3R/1M+yS3j5ou80Me59j7F9IMs4PXs3VqRrm0TU3AbKPxlmpoY1TNscJV/oGJXo8qCatFGTfDbY6W6ipGOYXfg==} + engines: {node: '>=6.11.5'} + + /lodash.clonedeepwith@4.5.0: + resolution: {integrity: sha512-QRBRSxhbtsX1nc0baxSkkK5WlVTTm/s48DSukcGcWZwIyI8Zz+lB+kFiELJXtzfH4Aj6kMWQ1VWW4U5uUDgZMA==} + dev: false + + /lodash@4.17.21: + resolution: {integrity: sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==} + dev: true + + /log4js@6.9.1: + resolution: {integrity: sha512-1somDdy9sChrr9/f4UlzhdaGfDR2c/SaD2a4T7qEkG4jTS57/B3qmnjLYePwQ8cqWnUHZI0iAKxMBpCZICiZ2g==} + engines: {node: '>=8.0'} + dependencies: + date-format: 4.0.14 + debug: 4.3.5 + flatted: 3.3.1 + rfdc: 1.4.1 + streamroller: 3.1.5 + transitivePeerDependencies: + - supports-color + dev: false + + /long-timeout@0.1.1: + resolution: {integrity: sha512-BFRuQUqc7x2NWxfJBCyUrN8iYUYznzL9JROmRz1gZ6KlOIgmoD+njPVbb+VNn2nGMKggMsK79iUNErillsrx7w==} + dev: false + + /loose-envify@1.4.0: + resolution: {integrity: sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==} + hasBin: true + dependencies: + js-tokens: 4.0.0 + dev: false + + /luxon@3.4.4: + resolution: {integrity: sha512-zobTr7akeGHnv7eBOXcRgMeCP6+uyYsczwmeRCauvpvaAltgNyTbLH/+VaEAPUeWBT+1GuNmz4wC/6jtQzbbVA==} + engines: {node: '>=12'} + dev: false + + /media-typer@0.3.0: + resolution: {integrity: sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ==} + engines: {node: '>= 0.6'} + + /memfs@3.5.3: + resolution: {integrity: sha512-UERzLsxzllchadvbPs5aolHh65ISpKpM+ccLbOJ8/vvpBKmAWf+la7dXFy7Mr0ySHbdHrFv5kGFCUHHe6GFEmw==} + engines: {node: '>= 4.0.0'} + dependencies: + fs-monkey: 1.0.6 + dev: true + + /merge-descriptors@1.0.1: + resolution: {integrity: sha512-cCi6g3/Zr1iqQi6ySbseM1Xvooa98N0w31jzUYrXPX2xqObmFGHJ0tQ5u74H3mVh7wLouTseZyYIq39g8cNp1w==} + dev: true + + /merge-stream@2.0.0: + resolution: {integrity: sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==} + + /methods@1.1.2: + resolution: {integrity: sha512-iclAHeNqNm68zFtnZ0e+1L2yUIdvzNoauKU4WBA3VvH/vPFieF7qfRlwUZU+DA9P9bPXIS90ulxoUoCH23sV2w==} + engines: {node: '>= 0.6'} + dev: true + + /micromatch@4.0.7: + resolution: {integrity: sha512-LPP/3KorzCwBxfeUuZmaR6bG2kdeHSbe0P2tY3FLRU4vYrjYz5hI4QZwV0njUx3jeuKe67YukQ1LSPZBKDqO/Q==} + engines: {node: '>=8.6'} + dependencies: + braces: 3.0.3 + picomatch: 2.3.1 + dev: true + + /mime-db@1.52.0: + resolution: {integrity: sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==} + engines: {node: '>= 0.6'} + + /mime-types@2.1.35: + resolution: {integrity: sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==} + engines: {node: '>= 0.6'} + dependencies: + mime-db: 1.52.0 + + /mime@1.6.0: + resolution: {integrity: sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==} + engines: {node: '>=4'} + hasBin: true + dev: true + + /mimic-fn@2.1.0: + resolution: {integrity: sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==} + engines: {node: '>=6'} + dev: true + + /minimalistic-assert@1.0.1: + resolution: {integrity: sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A==} + dev: true + + /minimatch@3.1.2: + resolution: {integrity: sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==} + dependencies: + brace-expansion: 1.1.11 + dev: true + + /mrmime@1.0.1: + resolution: {integrity: sha512-hzzEagAgDyoU1Q6yg5uI+AorQgdvMCur3FcKf7NhMKWsaYg+RnbTyHRa/9IlLF9rf455MOCtcqqrQQ83pPP7Uw==} + engines: {node: '>=10'} + dev: true + + /ms@2.0.0: + resolution: {integrity: sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==} + + /ms@2.1.2: + resolution: {integrity: sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==} + + /ms@2.1.3: + resolution: {integrity: sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==} + dev: true + + /multicast-dns@7.2.5: + resolution: {integrity: sha512-2eznPJP8z2BFLX50tf0LuODrpINqP1RVIm/CObbTcBRITQgmC/TjcREF1NeTBzIcR5XO/ukWo+YHOjBbFwIupg==} + hasBin: true + dependencies: + dns-packet: 5.6.1 + thunky: 1.1.0 + dev: true + + /negotiator@0.6.3: + resolution: {integrity: sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==} + engines: {node: '>= 0.6'} + + /neo-async@2.6.2: + resolution: {integrity: sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==} + + /node-forge@1.3.1: + resolution: {integrity: sha512-dPEtOeMvF9VMcYV/1Wb8CPoVAXtp6MKMlcbAt4ddqmGqUJ6fQZFXkNZNkNlfevtNkGtaSoXf/vNNNSvgrdXwtA==} + engines: {node: '>= 6.13.0'} + dev: true + + /node-persist@4.0.1: + resolution: {integrity: sha512-QtRjwAlcOQChQpfG6odtEhxYmA3nS5XYr+bx9JRjwahl1TM3sm9J3CCn51/MI0eoHRb2DrkEsCOFo8sq8jG5sQ==} + engines: {node: '>=10.12.0'} + dev: false + + /node-releases@2.0.14: + resolution: {integrity: sha512-y10wOWt8yZpqXmOgRo77WaHEmhYQYGNA6y421PKsKYWEK8aW+cqAphborZDhqfyKrbZEN92CN1X2KbafY2s7Yw==} + + /node-schedule@2.1.1: + resolution: {integrity: sha512-OXdegQq03OmXEjt2hZP33W2YPs/E5BcFQks46+G2gAxs4gHOIVD1u7EqlYLYSKsaIpyKCK9Gbk0ta1/gjRSMRQ==} + engines: {node: '>=6'} + dependencies: + cron-parser: 4.9.0 + long-timeout: 0.1.1 + sorted-array-functions: 1.3.0 + dev: false + + /normalize-path@3.0.0: + resolution: {integrity: sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==} + engines: {node: '>=0.10.0'} + dev: true + + /npm-run-path@4.0.1: + resolution: {integrity: sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==} + engines: {node: '>=8'} + dependencies: + path-key: 3.1.1 + dev: true + + /object-inspect@1.13.2: + resolution: {integrity: sha512-IRZSRuzJiynemAXPYtPe5BoI/RESNYR7TYm50MC5Mqbd3Jmw5y790sErYw3V6SryFJD64b74qQQs9wn5Bg/k3g==} + engines: {node: '>= 0.4'} + dev: true + + /obuf@1.1.2: + resolution: {integrity: sha512-PX1wu0AmAdPqOL1mWhqmlOd8kOIZQwGZw6rh7uby9fTc5lhaOWFLX3I6R1hrF9k3zUY40e6igsLGkDXK92LJNg==} + dev: true + + /on-finished@2.4.1: + resolution: {integrity: sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==} + engines: {node: '>= 0.8'} + dependencies: + ee-first: 1.1.1 + + /on-headers@1.0.2: + resolution: {integrity: sha512-pZAE+FJLoyITytdqK0U5s+FIpjN0JP3OzFi/u8Rx+EV5/W+JTWGXG8xFzevE7AjBfDqHv/8vL8qQsIhHnqRkrA==} + engines: {node: '>= 0.8'} + dev: true + + /once@1.4.0: + resolution: {integrity: sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==} + dependencies: + wrappy: 1.0.2 + dev: true + + /onetime@5.1.2: + resolution: {integrity: sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==} + engines: {node: '>=6'} + dependencies: + mimic-fn: 2.1.0 + dev: true + + /only@0.0.2: + resolution: {integrity: sha512-Fvw+Jemq5fjjyWz6CpKx6w9s7xxqo3+JCyM0WXWeCSOboZ8ABkyvP8ID4CZuChA/wxSx+XSJmdOm8rGVyJ1hdQ==} + dev: false + + /open@10.1.0: + resolution: {integrity: sha512-mnkeQ1qP5Ue2wd+aivTD3NHd/lZ96Lu0jgf0pwktLPtx6cTZiH7tyeGRRHs0zX0rbrahXPnXlUnbeXyaBBuIaw==} + engines: {node: '>=18'} + dependencies: + default-browser: 5.2.1 + define-lazy-prop: 3.0.0 + is-inside-container: 1.0.0 + is-wsl: 3.1.0 + dev: false + + /open@8.4.2: + resolution: {integrity: sha512-7x81NCL719oNbsq/3mh+hVrAWmFuEYUqrq/Iw3kUzH8ReypT9QQ0BLoJS7/G9k6N81XjW4qHWtjWwe/9eLy1EQ==} + engines: {node: '>=12'} + dependencies: + define-lazy-prop: 2.0.0 + is-docker: 2.2.1 + is-wsl: 2.2.0 + dev: true + + /opener@1.5.2: + resolution: {integrity: sha512-ur5UIdyw5Y7yEj9wLzhqXiy6GZ3Mwx0yGI+5sMn2r0N0v3cKJvUmFH5yPP+WXh9e0xfyzyJX95D8l088DNFj7A==} + hasBin: true + dev: true + + /p-retry@4.6.2: + resolution: {integrity: sha512-312Id396EbJdvRONlngUx0NydfrIQ5lsYu0znKVUzVvArzEIt08V1qhtyESbGVd1FGX7UKtiFp5uwKZdM8wIuQ==} + engines: {node: '>=8'} + dependencies: + '@types/retry': 0.12.0 + retry: 0.13.1 + dev: true + + /parse-passwd@1.0.0: + resolution: {integrity: sha512-1Y1A//QUXEZK7YKz+rD9WydcE1+EuPr6ZBgKecAB8tmoW6UFv0NREVJe1p+jRxtThkcbbKkfwIbWJe/IeE6m2Q==} + engines: {node: '>=0.10.0'} + dev: false + + /parseurl@1.3.3: + resolution: {integrity: sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==} + engines: {node: '>= 0.8'} + + /path-is-absolute@1.0.1: + resolution: {integrity: sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==} + engines: {node: '>=0.10.0'} + dev: true + + /path-key@3.1.1: + resolution: {integrity: sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==} + engines: {node: '>=8'} + dev: true + + /path-parse@1.0.7: + resolution: {integrity: sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==} + + /path-to-regexp@0.1.7: + resolution: {integrity: sha512-5DFkuoqlv1uYQKxy8omFBeJPQcdoE07Kv2sferDCrAq1ohOU+MSDswDIbnx3YAM60qIOnYa53wBhXW0EbMonrQ==} + dev: true + + /picocolors@1.0.1: + resolution: {integrity: sha512-anP1Z8qwhkbmu7MFP5iTt+wQKXgwzf7zTyGlcdzabySa9vd0Xt392U0rVmz9poOaBj0uHJKyyo9/upk0HrEQew==} + + /picomatch@2.3.1: + resolution: {integrity: sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==} + engines: {node: '>=8.6'} + dev: true + + /prettier@3.3.2: + resolution: {integrity: sha512-rAVeHYMcv8ATV5d508CFdn+8/pHPpXeIid1DdrPwXnaAdH7cqjVbpJaT5eq4yRAFU/lsbwYwSF/n5iNrdJHPQA==} + engines: {node: '>=14'} + hasBin: true + dev: true + + /process-nextick-args@2.0.1: + resolution: {integrity: sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==} + dev: true + + /proxy-addr@2.0.7: + resolution: {integrity: sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==} + engines: {node: '>= 0.10'} + dependencies: + forwarded: 0.2.0 + ipaddr.js: 1.9.1 + dev: true + + /proxy-from-env@1.1.0: + resolution: {integrity: sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==} + dev: false + + /punycode@2.3.1: + resolution: {integrity: sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==} + engines: {node: '>=6'} + + /qs@6.11.0: + resolution: {integrity: sha512-MvjoMCJwEarSbUYk5O+nmoSzSutSsTwF85zcHPQ9OrlFoZOYIjaqBAJIqIXjptyD5vThxGq52Xu/MaJzRkIk4Q==} + engines: {node: '>=0.6'} + dependencies: + side-channel: 1.0.6 + dev: true + + /rambda@9.2.1: + resolution: {integrity: sha512-6Dp+QQVQuAuhwBlbIvL2FjJVHCKF29W+n9ca/BMTVDqpj+Q7KKqUh7UAINEna8aaB2/oRvPuL5hViCTQARa70Q==} + dev: false + + /randombytes@2.1.0: + resolution: {integrity: sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==} + dependencies: + safe-buffer: 5.2.1 + + /range-parser@1.2.1: + resolution: {integrity: sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==} + engines: {node: '>= 0.6'} + dev: true + + /raw-body@2.5.2: + resolution: {integrity: sha512-8zGqypfENjCIqGhgXToC8aB2r7YrBX+AQAfIPs/Mlk+BtPTztOvTS01NRW/3Eh60J+a48lt8qsCzirQ6loCVfA==} + engines: {node: '>= 0.8'} + dependencies: + bytes: 3.1.2 + http-errors: 2.0.0 + iconv-lite: 0.4.24 + unpipe: 1.0.0 + dev: true + + /react-dom@18.3.1(react@18.3.1): + resolution: {integrity: sha512-5m4nQKp+rZRb09LNH59GM4BxTh9251/ylbKIbpe7TpGxfJ+9kv6BLkLBXIjjspbgbnIBNqlI23tRnTWT0snUIw==} + peerDependencies: + react: ^18.3.1 + dependencies: + loose-envify: 1.4.0 + react: 18.3.1 + scheduler: 0.23.2 + dev: false + + /react-refresh@0.14.2: + resolution: {integrity: sha512-jCvmsr+1IUSMUyzOkRcvnVbX3ZYC6g9TDrDbFuFmRDq7PD4yaGbLKNQL6k2jnArV8hjYxh7hVhAZB6s9HDGpZA==} + engines: {node: '>=0.10.0'} + dev: true + + /react@18.3.1: + resolution: {integrity: sha512-wS+hAgJShR0KhEvPJArfuPVN1+Hz1t0Y6n5jLrGQbkb4urgPE/0Rve+1kMB1v/oWgHgm4WIcV+i7F2pTVj+2iQ==} + engines: {node: '>=0.10.0'} + dependencies: + loose-envify: 1.4.0 + dev: false + + /readable-stream@2.3.8: + resolution: {integrity: sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==} + dependencies: + core-util-is: 1.0.3 + inherits: 2.0.4 + isarray: 1.0.0 + process-nextick-args: 2.0.1 + safe-buffer: 5.1.2 + string_decoder: 1.1.1 + util-deprecate: 1.0.2 + dev: true + + /readable-stream@3.6.2: + resolution: {integrity: sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==} + engines: {node: '>= 6'} + dependencies: + inherits: 2.0.4 + string_decoder: 1.3.0 + util-deprecate: 1.0.2 + dev: true + + /readdirp@3.6.0: + resolution: {integrity: sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==} + engines: {node: '>=8.10.0'} + dependencies: + picomatch: 2.3.1 + dev: true + + /rechoir@0.8.0: + resolution: {integrity: sha512-/vxpCXddiX8NGfGO/mTafwjq4aFa/71pvamip0++IQk3zG8cbCj0fifNPrjjF1XMXUne91jL9OoxmdykoEtifQ==} + engines: {node: '>= 10.13.0'} + dependencies: + resolve: 1.22.8 + dev: true + + /require-directory@2.1.1: + resolution: {integrity: sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==} + engines: {node: '>=0.10.0'} + dev: true + + /require-from-string@2.0.2: + resolution: {integrity: sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==} + engines: {node: '>=0.10.0'} + dev: true + + /requires-port@1.0.0: + resolution: {integrity: sha512-KigOCHcocU3XODJxsu8i/j8T9tzT4adHiecwORRQ0ZZFcp7ahwXuRU1m+yuO90C5ZUyGeGfocHDI14M3L3yDAQ==} + dev: true + + /resolve-dir@1.0.1: + resolution: {integrity: sha512-R7uiTjECzvOsWSfdM0QKFNBVFcK27aHOUwdvK53BcW8zqnGdYp0Fbj82cy54+2A4P2tFM22J5kRfe1R+lM/1yg==} + engines: {node: '>=0.10.0'} + dependencies: + expand-tilde: 2.0.2 + global-modules: 1.0.0 + dev: false + + /resolve@1.22.8: + resolution: {integrity: sha512-oKWePCxqpd6FlLvGV1VU0x7bkPmmCNolxzjMf4NczoDnQcIWrAF+cPtZn5i6n+RfD2d9i0tzpKnG6Yk168yIyw==} + hasBin: true + dependencies: + is-core-module: 2.14.0 + path-parse: 1.0.7 + supports-preserve-symlinks-flag: 1.0.0 + + /retry@0.13.1: + resolution: {integrity: sha512-XQBQ3I8W1Cge0Seh+6gjj03LbmRFWuoszgK9ooCpwYIrhhoO80pfq4cUkU5DkknwfOfFteRwlZ56PYOGYyFWdg==} + engines: {node: '>= 4'} + dev: true + + /rfdc@1.4.1: + resolution: {integrity: sha512-q1b3N5QkRUWUl7iyylaaj3kOpIT0N2i9MqIEQXP73GVsN9cw3fdx8X63cEmWhJGi2PPCF23Ijp7ktmd39rawIA==} + dev: false + + /rimraf@3.0.2: + resolution: {integrity: sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==} + deprecated: Rimraf versions prior to v4 are no longer supported + hasBin: true + dependencies: + glob: 7.2.3 + dev: true + + /run-applescript@7.0.0: + resolution: {integrity: sha512-9by4Ij99JUr/MCFBUkDKLWK3G9HVXmabKz9U5MlIAIuvuzkiOicRYs8XJLxX+xahD+mLiiCYDqF9dKAgtzKP1A==} + engines: {node: '>=18'} + dev: false + + /safe-buffer@5.1.2: + resolution: {integrity: sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==} + dev: true + + /safe-buffer@5.2.1: + resolution: {integrity: sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==} + + /safer-buffer@2.1.2: + resolution: {integrity: sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==} + dev: true + + /scheduler@0.23.2: + resolution: {integrity: sha512-UOShsPwz7NrMUqhR6t0hWjFduvOzbtv7toDH1/hIrfRNIDBnnBWd0CwJTGvTpngVlmwGCdP9/Zl/tVrDqcuYzQ==} + dependencies: + loose-envify: 1.4.0 + dev: false + + /schema-utils@3.3.0: + resolution: {integrity: sha512-pN/yOAvcC+5rQ5nERGuwrjLlYvLTbCibnZ1I7B1LaiAz9BRBlE9GMgE/eqV30P7aJQUf7Ddimy/RsbYO/GrVGg==} + engines: {node: '>= 10.13.0'} + dependencies: + '@types/json-schema': 7.0.15 + ajv: 6.12.6 + ajv-keywords: 3.5.2(ajv@6.12.6) + + /schema-utils@4.2.0: + resolution: {integrity: sha512-L0jRsrPpjdckP3oPug3/VxNKt2trR8TcabrM6FOAAlvC/9Phcmm+cuAgTlxBqdBR1WJx7Naj9WHw+aOmheSVbw==} + engines: {node: '>= 12.13.0'} + dependencies: + '@types/json-schema': 7.0.15 + ajv: 8.16.0 + ajv-formats: 2.1.1(ajv@8.16.0) + ajv-keywords: 5.1.0(ajv@8.16.0) + dev: true + + /select-hose@2.0.0: + resolution: {integrity: sha512-mEugaLK+YfkijB4fx0e6kImuJdCIt2LxCRcbEYPqRGCs4F2ogyfZU5IAZRdjCP8JPq2AtdNoC/Dux63d9Kiryg==} + dev: true + + /selfsigned@2.4.1: + resolution: {integrity: sha512-th5B4L2U+eGLq1TVh7zNRGBapioSORUeymIydxgFpwww9d2qyKvtuPU2jJuHvYAwwqi2Y596QBL3eEqcPEYL8Q==} + engines: {node: '>=10'} + dependencies: + '@types/node-forge': 1.3.11 + node-forge: 1.3.1 + dev: true + + /semver@6.3.1: + resolution: {integrity: sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==} + hasBin: true + dev: true + + /send@0.18.0: + resolution: {integrity: sha512-qqWzuOjSFOuqPjFe4NOsMLafToQQwBSOEpS+FwEt3A2V3vKubTquT3vmLTQpFgMXp8AlFWFuP1qKaJZOtPpVXg==} + engines: {node: '>= 0.8.0'} + dependencies: + debug: 2.6.9 + depd: 2.0.0 + destroy: 1.2.0 + encodeurl: 1.0.2 + escape-html: 1.0.3 + etag: 1.8.1 + fresh: 0.5.2 + http-errors: 2.0.0 + mime: 1.6.0 + ms: 2.1.3 + on-finished: 2.4.1 + range-parser: 1.2.1 + statuses: 2.0.1 + transitivePeerDependencies: + - supports-color + dev: true + + /serialize-javascript@6.0.2: + resolution: {integrity: sha512-Saa1xPByTTq2gdeFZYLLo+RFE35NHZkAbqZeWNd3BpzppeVisAqpDjcp8dyf6uIvEqJRd46jemmyA4iFIeVk8g==} + dependencies: + randombytes: 2.1.0 + + /serve-index@1.9.1: + resolution: {integrity: sha512-pXHfKNP4qujrtteMrSBb0rc8HJ9Ms/GrXwcUtUtD5s4ewDJI8bT3Cz2zTVRMKtri49pLx2e0Ya8ziP5Ya2pZZw==} + engines: {node: '>= 0.8.0'} + dependencies: + accepts: 1.3.8 + batch: 0.6.1 + debug: 2.6.9 + escape-html: 1.0.3 + http-errors: 1.6.3 + mime-types: 2.1.35 + parseurl: 1.3.3 + transitivePeerDependencies: + - supports-color + dev: true + + /serve-static@1.15.0: + resolution: {integrity: sha512-XGuRDNjXUijsUL0vl6nSD7cwURuzEgglbOaFuZM9g3kwDXOWVTck0jLzjPzGD+TazWbboZYu52/9/XPdUgne9g==} + engines: {node: '>= 0.8.0'} + dependencies: + encodeurl: 1.0.2 + escape-html: 1.0.3 + parseurl: 1.3.3 + send: 0.18.0 + transitivePeerDependencies: + - supports-color + dev: true + + /set-function-length@1.2.2: + resolution: {integrity: sha512-pgRc4hJ4/sNjWCSS9AmnS40x3bNMDTknHgL5UaMBTMyJnU90EgWh1Rz+MC9eFu4BuN/UwZjKQuY/1v3rM7HMfg==} + engines: {node: '>= 0.4'} + dependencies: + define-data-property: 1.1.4 + es-errors: 1.3.0 + function-bind: 1.1.2 + get-intrinsic: 1.2.4 + gopd: 1.0.1 + has-property-descriptors: 1.0.2 + dev: true + + /setprototypeof@1.1.0: + resolution: {integrity: sha512-BvE/TwpZX4FXExxOxZyRGQQv651MSwmWKZGqvmPcRIjDqWub67kTKuIMx43cZZrS/cBBzwBcNDWoFxt2XEFIpQ==} + dev: true + + /setprototypeof@1.2.0: + resolution: {integrity: sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==} + + /shebang-command@2.0.0: + resolution: {integrity: sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==} + engines: {node: '>=8'} + dependencies: + shebang-regex: 3.0.0 + dev: true + + /shebang-regex@3.0.0: + resolution: {integrity: sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==} + engines: {node: '>=8'} + dev: true + + /shell-quote@1.8.1: + resolution: {integrity: sha512-6j1W9l1iAs/4xYBI1SYOVZyFcCis9b4KCLQ8fgAGG07QvzaRLVVRQvAy85yNmmZSjYjg4MWh4gNvlPujU/5LpA==} + dev: true + + /side-channel@1.0.6: + resolution: {integrity: sha512-fDW/EZ6Q9RiO8eFG8Hj+7u/oW+XrPTIChwCOM2+th2A6OblDtYYIpve9m+KvI9Z4C9qSEXlaGR6bTEYHReuglA==} + engines: {node: '>= 0.4'} + dependencies: + call-bind: 1.0.7 + es-errors: 1.3.0 + get-intrinsic: 1.2.4 + object-inspect: 1.13.2 + dev: true + + /signal-exit@3.0.7: + resolution: {integrity: sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==} + dev: true + + /sirv@1.0.19: + resolution: {integrity: sha512-JuLThK3TnZG1TAKDwNIqNq6QA2afLOCcm+iE8D1Kj3GA40pSPsxQjjJl0J8X3tsR7T+CP1GavpzLwYkgVLWrZQ==} + engines: {node: '>= 10'} + dependencies: + '@polka/url': 1.0.0-next.25 + mrmime: 1.0.1 + totalist: 1.1.0 + dev: true + + /socket.io-client@4.7.5: + resolution: {integrity: sha512-sJ/tqHOCe7Z50JCBCXrsY3I2k03iOiUe+tj1OmKeD2lXPiGH/RUCdTZFoqVyN7l1MnpIzPrGtLcijffmeouNlQ==} + engines: {node: '>=10.0.0'} + dependencies: + '@socket.io/component-emitter': 3.1.2 + debug: 4.3.5 + engine.io-client: 6.5.4 + socket.io-parser: 4.2.4 + transitivePeerDependencies: + - bufferutil + - supports-color + - utf-8-validate + dev: false + + /socket.io-parser@4.2.4: + resolution: {integrity: sha512-/GbIKmo8ioc+NIWIhwdecY0ge+qVBSMdgxGygevmdHj24bsfgtCmcUUcQ5ZzcylGFHsN3k4HB4Cgkl96KVnuew==} + engines: {node: '>=10.0.0'} + dependencies: + '@socket.io/component-emitter': 3.1.2 + debug: 4.3.5 + transitivePeerDependencies: + - supports-color + dev: false + + /sockjs@0.3.24: + resolution: {integrity: sha512-GJgLTZ7vYb/JtPSSZ10hsOYIvEYsjbNU+zPdIHcUaWVNUEPivzxku31865sSSud0Da0W4lEeOPlmw93zLQchuQ==} + dependencies: + faye-websocket: 0.11.4 + uuid: 8.3.2 + websocket-driver: 0.7.4 + dev: true + + /sorted-array-functions@1.3.0: + resolution: {integrity: sha512-2sqgzeFlid6N4Z2fUQ1cvFmTOLRi/sEDzSQ0OKYchqgoPmQBVyM3959qYx3fpS6Esef80KjmpgPeEr028dP3OA==} + dev: false + + /source-map-support@0.5.21: + resolution: {integrity: sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==} + dependencies: + buffer-from: 1.1.2 + source-map: 0.6.1 + + /source-map@0.6.1: + resolution: {integrity: sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==} + engines: {node: '>=0.10.0'} + + /spdy-transport@3.0.0: + resolution: {integrity: sha512-hsLVFE5SjA6TCisWeJXFKniGGOpBgMLmerfO2aCyCU5s7nJ/rpAepqmFifv/GCbSbueEeAJJnmSQ2rKC/g8Fcw==} + dependencies: + debug: 4.3.5 + detect-node: 2.1.0 + hpack.js: 2.1.6 + obuf: 1.1.2 + readable-stream: 3.6.2 + wbuf: 1.7.3 + transitivePeerDependencies: + - supports-color + dev: true + + /spdy@4.0.2: + resolution: {integrity: sha512-r46gZQZQV+Kl9oItvl1JZZqJKGr+oEkB08A6BzkiR7593/7IbtuncXHd2YoYeTsG4157ZssMu9KYvUHLcjcDoA==} + engines: {node: '>=6.0.0'} + dependencies: + debug: 4.3.5 + handle-thing: 2.0.1 + http-deceiver: 1.2.7 + select-hose: 2.0.0 + spdy-transport: 3.0.0 + transitivePeerDependencies: + - supports-color + dev: true + + /statuses@1.5.0: + resolution: {integrity: sha512-OpZ3zP+jT1PI7I8nemJX4AKmAX070ZkYPVWV/AaKTJl+tXCTGyVdC1a4SL8RUQYEwk/f34ZX8UTykN68FwrqAA==} + engines: {node: '>= 0.6'} + + /statuses@2.0.1: + resolution: {integrity: sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==} + engines: {node: '>= 0.8'} + dev: true + + /streamroller@3.1.5: + resolution: {integrity: sha512-KFxaM7XT+irxvdqSP1LGLgNWbYN7ay5owZ3r/8t77p+EtSUAfUgtl7be3xtqtOmGUl9K9YPO2ca8133RlTjvKw==} + engines: {node: '>=8.0'} + dependencies: + date-format: 4.0.14 + debug: 4.3.5 + fs-extra: 8.1.0 + transitivePeerDependencies: + - supports-color + dev: false + + /string-width@4.2.3: + resolution: {integrity: sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==} + engines: {node: '>=8'} + dependencies: + emoji-regex: 8.0.0 + is-fullwidth-code-point: 3.0.0 + strip-ansi: 6.0.1 + dev: true + + /string_decoder@1.1.1: + resolution: {integrity: sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==} + dependencies: + safe-buffer: 5.1.2 + dev: true + + /string_decoder@1.3.0: + resolution: {integrity: sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==} + dependencies: + safe-buffer: 5.2.1 + dev: true + + /strip-ansi@6.0.1: + resolution: {integrity: sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==} + engines: {node: '>=8'} + dependencies: + ansi-regex: 5.0.1 + dev: true + + /strip-final-newline@2.0.0: + resolution: {integrity: sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==} + engines: {node: '>=6'} + dev: true + + /supports-color@7.2.0: + resolution: {integrity: sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==} + engines: {node: '>=8'} + dependencies: + has-flag: 4.0.0 + + /supports-color@8.1.1: + resolution: {integrity: sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==} + engines: {node: '>=10'} + dependencies: + has-flag: 4.0.0 + + /supports-preserve-symlinks-flag@1.0.0: + resolution: {integrity: sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==} + engines: {node: '>= 0.4'} + + /tapable@2.2.1: + resolution: {integrity: sha512-GNzQvQTOIP6RyTfE2Qxb8ZVlNmw0n88vp1szwWRimP02mnTsx3Wtn5qRdqY9w2XduFNUgvOwhNnQsjwCp+kqaQ==} + engines: {node: '>=6'} + + /terser-webpack-plugin@5.3.10(webpack@5.92.1): + resolution: {integrity: sha512-BKFPWlPDndPs+NGGCr1U59t0XScL5317Y0UReNrHaw9/FwhPENlq6bfgs+4yPfyP51vqC1bQ4rp1EfXW5ZSH9w==} + engines: {node: '>= 10.13.0'} + peerDependencies: + '@swc/core': '*' + esbuild: '*' + uglify-js: '*' + webpack: ^5.1.0 + peerDependenciesMeta: + '@swc/core': + optional: true + esbuild: + optional: true + uglify-js: + optional: true + dependencies: + '@jridgewell/trace-mapping': 0.3.25 + jest-worker: 27.5.1 + schema-utils: 3.3.0 + serialize-javascript: 6.0.2 + terser: 5.31.1 + webpack: 5.92.1 + + /terser@5.31.1: + resolution: {integrity: sha512-37upzU1+viGvuFtBo9NPufCb9dwM0+l9hMxYyWfBA+fbwrPqNJAhbZ6W47bBFnZHKHTUBnMvi87434qq+qnxOg==} + engines: {node: '>=10'} + hasBin: true + dependencies: + '@jridgewell/source-map': 0.3.6 + acorn: 8.12.0 + commander: 2.20.3 + source-map-support: 0.5.21 + + /thunky@1.1.0: + resolution: {integrity: sha512-eHY7nBftgThBqOyHGVN+l8gF0BucP09fMo0oO/Lb0w1OF80dJv+lDVpXG60WMQvkcxAkNybKsrEIE3ZtKGmPrA==} + dev: true + + /to-regex-range@5.0.1: + resolution: {integrity: sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==} + engines: {node: '>=8.0'} + dependencies: + is-number: 7.0.0 + dev: true + + /toidentifier@1.0.1: + resolution: {integrity: sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==} + engines: {node: '>=0.6'} + + /totalist@1.1.0: + resolution: {integrity: sha512-gduQwd1rOdDMGxFG1gEvhV88Oirdo2p+KjoYFU7k2g+i7n6AFFbDQ5kMPUsW0pNbfQsB/cwXvT1i4Bue0s9g5g==} + engines: {node: '>=6'} + dev: true + + /tslib@2.6.3: + resolution: {integrity: sha512-xNvxJEOUiWPGhUuUdQgAJPKOOJfGnIyKySOc09XkKsgdUV/3E2zvwZYdejjmRgPCgcym1juLH3226yA7sEFJKQ==} + dev: false + + /tsscmp@1.0.6: + resolution: {integrity: sha512-LxhtAkPDTkVCMQjt2h6eBVY28KCjikZqZfMcC15YBeNjkgUpdCfBu5HoiOTDu86v6smE8yOjyEktJ8hlbANHQA==} + engines: {node: '>=0.6.x'} + dev: false + + /type-is@1.6.18: + resolution: {integrity: sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==} + engines: {node: '>= 0.6'} + dependencies: + media-typer: 0.3.0 + mime-types: 2.1.35 + + /typescript@5.5.3: + resolution: {integrity: sha512-/hreyEujaB0w76zKo6717l3L0o/qEUtRgdvUBvlkhoWeOVMjMuHNHk0BRBzikzuGDqNmPQbg5ifMEqsHLiIUcQ==} + engines: {node: '>=14.17'} + hasBin: true + dev: false + + /undici-types@5.26.5: + resolution: {integrity: sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA==} + + /universalify@0.1.2: + resolution: {integrity: sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==} + engines: {node: '>= 4.0.0'} + dev: false + + /universalify@2.0.1: + resolution: {integrity: sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==} + engines: {node: '>= 10.0.0'} + dev: false + + /unpipe@1.0.0: + resolution: {integrity: sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==} + engines: {node: '>= 0.8'} + dev: true + + /upath@2.0.1: + resolution: {integrity: sha512-1uEe95xksV1O0CYKXo8vQvN1JEbtJp7lb7C5U9HMsIp6IVwntkH/oNUzyVNQSd4S1sYk2FpSSW44FqMc8qee5w==} + engines: {node: '>=4'} + dev: false + + /update-browserslist-db@1.0.16(browserslist@4.23.1): + resolution: {integrity: sha512-KVbTxlBYlckhF5wgfyZXTWnMn7MMZjMu9XG8bPlliUOP9ThaF4QnhP8qrjrH7DRzHfSk0oQv1wToW+iA5GajEQ==} + hasBin: true + peerDependencies: + browserslist: '>= 4.21.0' + dependencies: + browserslist: 4.23.1 + escalade: 3.1.2 + picocolors: 1.0.1 + + /uri-js@4.4.1: + resolution: {integrity: sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==} + dependencies: + punycode: 2.3.1 + + /util-deprecate@1.0.2: + resolution: {integrity: sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==} + dev: true + + /utils-merge@1.0.1: + resolution: {integrity: sha512-pMZTvIkT1d+TFGvDOqodOclx0QWkkgi6Tdoa8gC8ffGAAqz9pzPTZWAybbsHHoED/ztMtkv/VoYTYyShUn81hA==} + engines: {node: '>= 0.4.0'} + dev: true + + /uuid@8.3.2: + resolution: {integrity: sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==} + hasBin: true + + /vary@1.1.2: + resolution: {integrity: sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==} + engines: {node: '>= 0.8'} + + /watchpack@2.4.1: + resolution: {integrity: sha512-8wrBCMtVhqcXP2Sup1ctSkga6uc2Bx0IIvKyT7yTFier5AXHooSI+QyQQAtTb7+E0IUCCKyTFmXqdqgum2XWGg==} + engines: {node: '>=10.13.0'} + dependencies: + glob-to-regexp: 0.4.1 + graceful-fs: 4.2.11 + + /wbuf@1.7.3: + resolution: {integrity: sha512-O84QOnr0icsbFGLS0O3bI5FswxzRr8/gHwWkDlQFskhSPryQXvrTMxjxGP4+iWYoauLoBvfDpkrOauZ+0iZpDA==} + dependencies: + minimalistic-assert: 1.0.1 + dev: true + + /webpack-bundle-analyzer@4.6.1: + resolution: {integrity: sha512-oKz9Oz9j3rUciLNfpGFjOb49/jEpXNmWdVH8Ls//zNcnLlQdTGXQQMsBbb/gR7Zl8WNLxVCq+0Hqbx3zv6twBw==} + engines: {node: '>= 10.13.0'} + hasBin: true + dependencies: + acorn: 8.12.0 + acorn-walk: 8.3.3 + chalk: 4.1.2 + commander: 7.2.0 + gzip-size: 6.0.0 + lodash: 4.17.21 + opener: 1.5.2 + sirv: 1.0.19 + ws: 7.5.10 + transitivePeerDependencies: + - bufferutil + - utf-8-validate + dev: true + + /webpack-dev-middleware@5.3.4(webpack@5.92.1): + resolution: {integrity: sha512-BVdTqhhs+0IfoeAf7EoH5WE+exCmqGerHfDM0IL096Px60Tq2Mn9MAbnaGUe6HiMa41KMCYF19gyzZmBcq/o4Q==} + engines: {node: '>= 12.13.0'} + peerDependencies: + webpack: ^4.0.0 || ^5.0.0 + dependencies: + colorette: 2.0.19 + memfs: 3.5.3 + mime-types: 2.1.35 + range-parser: 1.2.1 + schema-utils: 4.2.0 + webpack: 5.92.1 + dev: true + + /webpack-dev-middleware@6.1.2(webpack@5.92.1): + resolution: {integrity: sha512-Wu+EHmX326YPYUpQLKmKbTyZZJIB8/n6R09pTmB03kJmnMsVPTo9COzHZFr01txwaCAuZvfBJE4ZCHRcKs5JaQ==} + engines: {node: '>= 14.15.0'} + peerDependencies: + webpack: ^5.0.0 + peerDependenciesMeta: + webpack: + optional: true + dependencies: + colorette: 2.0.19 + memfs: 3.5.3 + mime-types: 2.1.35 + range-parser: 1.2.1 + schema-utils: 4.2.0 + webpack: 5.92.1 + dev: true + + /webpack-dev-server@4.13.1(webpack@5.92.1): + resolution: {integrity: sha512-5tWg00bnWbYgkN+pd5yISQKDejRBYGEw15RaEEslH+zdbNDxxaZvEAO2WulaSaFKb5n3YG8JXsGaDsut1D0xdA==} + engines: {node: '>= 12.13.0'} + hasBin: true + peerDependencies: + webpack: ^4.37.0 || ^5.0.0 + webpack-cli: '*' + peerDependenciesMeta: + webpack: + optional: true + webpack-cli: + optional: true + dependencies: + '@types/bonjour': 3.5.13 + '@types/connect-history-api-fallback': 1.5.4 + '@types/express': 4.17.21 + '@types/serve-index': 1.9.4 + '@types/serve-static': 1.15.7 + '@types/sockjs': 0.3.36 + '@types/ws': 8.5.10 + ansi-html-community: 0.0.8 + bonjour-service: 1.2.1 + chokidar: 3.5.3 + colorette: 2.0.19 + compression: 1.7.4 + connect-history-api-fallback: 2.0.0 + default-gateway: 6.0.3 + express: 4.19.2 + graceful-fs: 4.2.11 + html-entities: 2.5.2 + http-proxy-middleware: 2.0.6(@types/express@4.17.21) + ipaddr.js: 2.2.0 + launch-editor: 2.8.0 + open: 8.4.2 + p-retry: 4.6.2 + rimraf: 3.0.2 + schema-utils: 4.2.0 + selfsigned: 2.4.1 + serve-index: 1.9.1 + sockjs: 0.3.24 + spdy: 4.0.2 + webpack: 5.92.1 + webpack-dev-middleware: 5.3.4(webpack@5.92.1) + ws: 8.17.1 + transitivePeerDependencies: + - bufferutil + - debug + - supports-color + - utf-8-validate + dev: true + + /webpack-sources@3.2.3: + resolution: {integrity: sha512-/DyMEOrDgLKKIG0fmvtz+4dUX/3Ghozwgm6iPp8KRhvn+eQf9+Q7GWxVNMk3+uCPWfdXYC4ExGBckIXdFEfH1w==} + engines: {node: '>=10.13.0'} + + /webpack@5.92.1: + resolution: {integrity: sha512-JECQ7IwJb+7fgUFBlrJzbyu3GEuNBcdqr1LD7IbSzwkSmIevTm8PF+wej3Oxuz/JFBUZ6O1o43zsPkwm1C4TmA==} + engines: {node: '>=10.13.0'} + hasBin: true + peerDependencies: + webpack-cli: '*' + peerDependenciesMeta: + webpack-cli: + optional: true + dependencies: + '@types/eslint-scope': 3.7.7 + '@types/estree': 1.0.5 + '@webassemblyjs/ast': 1.12.1 + '@webassemblyjs/wasm-edit': 1.12.1 + '@webassemblyjs/wasm-parser': 1.12.1 + acorn: 8.12.0 + acorn-import-attributes: 1.9.5(acorn@8.12.0) + browserslist: 4.23.1 + chrome-trace-event: 1.0.4 + enhanced-resolve: 5.17.0 + es-module-lexer: 1.5.4 + eslint-scope: 5.1.1 + events: 3.3.0 + glob-to-regexp: 0.4.1 + graceful-fs: 4.2.11 + json-parse-even-better-errors: 2.3.1 + loader-runner: 4.3.0 + mime-types: 2.1.35 + neo-async: 2.6.2 + schema-utils: 3.3.0 + tapable: 2.2.1 + terser-webpack-plugin: 5.3.10(webpack@5.92.1) + watchpack: 2.4.1 + webpack-sources: 3.2.3 + transitivePeerDependencies: + - '@swc/core' + - esbuild + - uglify-js + + /websocket-driver@0.7.4: + resolution: {integrity: sha512-b17KeDIQVjvb0ssuSDF2cYXSg2iztliJ4B9WdsuB6J952qCPKmnVq4DyW5motImXHDC1cBT/1UezrJVsKw5zjg==} + engines: {node: '>=0.8.0'} + dependencies: + http-parser-js: 0.5.8 + safe-buffer: 5.2.1 + websocket-extensions: 0.1.4 + dev: true + + /websocket-extensions@0.1.4: + resolution: {integrity: sha512-OqedPIGOfsDlo31UNwYbCFMSaO9m9G/0faIHj5/dZFDMFqPTcx6UwqyOy3COEaEOg/9VsGIpdqn62W5KhoKSpg==} + engines: {node: '>=0.8.0'} + dev: true + + /which@1.3.1: + resolution: {integrity: sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==} + hasBin: true + dependencies: + isexe: 2.0.0 + dev: false + + /which@2.0.2: + resolution: {integrity: sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==} + engines: {node: '>= 8'} + hasBin: true + dependencies: + isexe: 2.0.0 + dev: true + + /wrap-ansi@7.0.0: + resolution: {integrity: sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==} + engines: {node: '>=10'} + dependencies: + ansi-styles: 4.3.0 + string-width: 4.2.3 + strip-ansi: 6.0.1 + dev: true + + /wrappy@1.0.2: + resolution: {integrity: sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==} + dev: true + + /ws@7.5.10: + resolution: {integrity: sha512-+dbF1tHwZpXcbOJdVOkzLDxZP1ailvSxM6ZweXTegylPny803bFhA+vqBYw4s31NSAk4S2Qz+AKXK9a4wkdjcQ==} + engines: {node: '>=8.3.0'} + peerDependencies: + bufferutil: ^4.0.1 + utf-8-validate: ^5.0.2 + peerDependenciesMeta: + bufferutil: + optional: true + utf-8-validate: + optional: true + dev: true + + /ws@8.17.1: + resolution: {integrity: sha512-6XQFvXTkbfUOZOKKILFG1PDK2NDQs4azKQl26T0YS5CxqWLgXajbPZ+h4gZekJyRqFU8pvnbAbbs/3TgRPy+GQ==} + engines: {node: '>=10.0.0'} + peerDependencies: + bufferutil: ^4.0.1 + utf-8-validate: '>=5.0.2' + peerDependenciesMeta: + bufferutil: + optional: true + utf-8-validate: + optional: true + + /ws@8.8.1: + resolution: {integrity: sha512-bGy2JzvzkPowEJV++hF07hAD6niYSr0JzBNo/J29WsB57A2r7Wlc1UFcTR9IzrPvuNVO4B8LGqF8qcpsVOhJCA==} + engines: {node: '>=10.0.0'} + peerDependencies: + bufferutil: ^4.0.1 + utf-8-validate: ^5.0.2 + peerDependenciesMeta: + bufferutil: + optional: true + utf-8-validate: + optional: true + dev: true + + /xmlhttprequest-ssl@2.0.0: + resolution: {integrity: sha512-QKxVRxiRACQcVuQEYFsI1hhkrMlrXHPegbbd1yn9UHOmRxY+si12nQYzri3vbzt8VdTTRviqcKxcyllFas5z2A==} + engines: {node: '>=0.4.0'} + dev: false + + /y18n@5.0.8: + resolution: {integrity: sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==} + engines: {node: '>=10'} + dev: true + + /yargs-parser@21.1.1: + resolution: {integrity: sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==} + engines: {node: '>=12'} + dev: true + + /yargs@17.6.2: + resolution: {integrity: sha512-1/9UrdHjDZc0eOU0HxOHoS78C69UD3JRMvzlJ7S79S2nTaWRA/whGCTV8o9e/N/1Va9YIV7Q4sOxD8VV4pCWOw==} + engines: {node: '>=12'} + dependencies: + cliui: 8.0.1 + escalade: 3.1.2 + get-caller-file: 2.0.5 + require-directory: 2.1.1 + string-width: 4.2.3 + y18n: 5.0.8 + yargs-parser: 21.1.1 + dev: true + + /ylru@1.4.0: + resolution: {integrity: sha512-2OQsPNEmBCvXuFlIni/a+Rn+R2pHW9INm0BxXJ4hVDA8TirqMj+J/Rp9ItLatT/5pZqWwefVrTQcHpixsxnVlA==} + engines: {node: '>= 4.0.0'} + dev: false + + /zephyr-agent@0.0.13: + resolution: {integrity: sha512-MxSthGw3OVs80dG6JWeauIGdvMLpfpS2DxlfWVdQjqMnvnU/2OToOxGX+f6qdfpnu1bu+jd/QetPjmwBHxYLxg==} + dependencies: + is-ci: 3.0.1 + jose: 5.6.2 + open: 10.1.0 + socket.io-client: 4.7.5 + tslib: 2.6.3 + uuid: 8.3.2 + zephyr-edge-contract: 0.0.13 + transitivePeerDependencies: + - bufferutil + - supports-color + - utf-8-validate + dev: false + + /zephyr-edge-contract@0.0.13: + resolution: {integrity: sha512-RvYPYjQnC54GDTxG/dvMvjYfQcjmCxA/ugqs3/W1L280o3z3gxiFyM0Wo+4Zca3V/GCo03isvbs0KGJwj2VD8Q==} + dependencies: + debug: 4.3.5 + node-persist: 4.0.1 + tslib: 2.6.3 + transitivePeerDependencies: + - supports-color + dev: false + + /zephyr-webpack-plugin@0.0.13: + resolution: {integrity: sha512-LEFrj8gNzAzrCKSomSwLWMqFqpVgOVxJVmMwzQy3cZ4yAQeNgpjLAm5BOccE3MoewPWqdgzTCjEbqdIK+TyMFQ==} + dependencies: + '@module-federation/automatic-vendor-federation': 1.2.1(webpack@5.92.1) + is-ci: 3.0.1 + tslib: 2.6.3 + webpack: 5.92.1 + zephyr-agent: 0.0.13 + zephyr-edge-contract: 0.0.13 + transitivePeerDependencies: + - '@swc/core' + - bufferutil + - esbuild + - supports-color + - uglify-js + - utf-8-validate + - webpack-cli + dev: false diff --git a/rspack_hmr/app2/rspack.config.js b/rspack_hmr/app2/rspack.config.js new file mode 100644 index 0000000..e76e13b --- /dev/null +++ b/rspack_hmr/app2/rspack.config.js @@ -0,0 +1,110 @@ +const rspack = require('@rspack/core'); +const refreshPlugin = require('@rspack/plugin-react-refresh'); +const isDev = process.env.NODE_ENV === 'development'; + +const path = require('path'); +const deps = require('./package.json').dependencies; +console.log({ deps }); +const { ModuleFederationPlugin } = require('@module-federation/enhanced/rspack'); + +const name = 'app_02'; +const name1 = name + '1'; +/** + * @type {import('@rspack/cli').Configuration} + */ +module.exports = { + entry: { + main: './src/index.tsx', + }, + resolve: { + extensions: ['...', '.ts', '.tsx', '.jsx'], + }, + + devtool: 'source-map', + optimization: { + minimize: false, + }, + devServer: { + port: 3001, + hot: true, + static: { + directory: path.join(__dirname, 'build'), + }, + liveReload: false, + headers: { + 'Access-Control-Allow-Origin': '*', + 'Access-Control-Allow-Methods': 'GET, POST, PUT, DELETE, PATCH, OPTIONS', + 'Access-Control-Allow-Headers': 'X-Requested-With, content-type, Authorization', + }, + }, + optimization: { minimize: false }, + output: { + path: __dirname + '/dist', + uniqueName: name1, + publicPath: 'http://localhost:3001/', + filename: '[name].js', + }, + watch: true, + module: { + rules: [ + { + test: /\.svg$/, + type: 'asset', + }, + { + test: /\.(jsx?|tsx?)$/, + exclude: /(node_modules|\.webpack)/, + use: [ + { + loader: 'builtin:swc-loader', + options: { + sourceMap: true, + jsc: { + parser: { + syntax: 'typescript', + tsx: true, + }, + transform: { + react: { + runtime: 'automatic', + development: isDev, + refresh: isDev, + }, + }, + }, + env: { + targets: ['chrome >= 87', 'edge >= 88', 'firefox >= 78', 'safari >= 14'], + }, + }, + }, + ], + }, + ], + }, + plugins: [ + new rspack.DefinePlugin({ + 'process.env.NODE_ENV': JSON.stringify(process.env.NODE_ENV), + }), + new rspack.ProgressPlugin({}), + isDev && new rspack.HotModuleReplacementPlugin(), + + new rspack.HtmlRspackPlugin({ + template: './index.html', + excludedChunks: [name], + filename: 'index.html', + inject: true, + publicPath: '/', + }), + new ModuleFederationPlugin({ + name: name, + filename: 'remoteEntry.js', + exposes: { + './Hello': './src/Hello.tsx', + './pi': './src/pi.ts', + }, + manifest: true, + + }), + isDev ? new refreshPlugin() : null, + ].filter(Boolean), +}; diff --git a/rspack_hmr/app2/src/App.css b/rspack_hmr/app2/src/App.css new file mode 100644 index 0000000..2c5e2ef --- /dev/null +++ b/rspack_hmr/app2/src/App.css @@ -0,0 +1,41 @@ +#root { + max-width: 1280px; + margin: 0 auto; + padding: 2rem; + text-align: center; +} + +.logo { + height: 6em; + padding: 1.5em; + will-change: filter; +} +.logo:hover { + filter: drop-shadow(0 0 2em #646cffaa); +} +.logo.react:hover { + filter: drop-shadow(0 0 2em #61dafbaa); +} + +@keyframes logo-spin { + from { + transform: rotate(0deg); + } + to { + transform: rotate(360deg); + } +} + +@media (prefers-reduced-motion: no-preference) { + a:nth-of-type(2) .logo { + animation: logo-spin infinite 20s linear; + } +} + +.card { + padding: 2em; +} + +.read-the-docs { + color: #888; +} diff --git a/rspack_hmr/app2/src/App.tsx b/rspack_hmr/app2/src/App.tsx new file mode 100644 index 0000000..86f291d --- /dev/null +++ b/rspack_hmr/app2/src/App.tsx @@ -0,0 +1,21 @@ +import './App.css'; +import { Hello } from './Hello'; + +function App() { + return ( +
    +
    +

    App_02 :)

    +

    + This is currently in app2
    while we are using the{' '} + 'Hello'module ourselves, we are also exposing it and + providing it to other applications. +

    + + +
    +
    + ); +} + +export default App; diff --git a/rspack_hmr/app2/src/Hello.tsx b/rspack_hmr/app2/src/Hello.tsx new file mode 100644 index 0000000..2fc4fa9 --- /dev/null +++ b/rspack_hmr/app2/src/Hello.tsx @@ -0,0 +1,16 @@ +interface Props { + name: string; +} + +export const Hello = ({ name }: Props) => { + return ( +
    + + <Hello name="{name}"> from app2 + +
    + Hello, from app_02, {name}! +
    +
    + ); +}; diff --git a/rspack_hmr/app2/src/assets/react.svg b/rspack_hmr/app2/src/assets/react.svg new file mode 100644 index 0000000..6c87de9 --- /dev/null +++ b/rspack_hmr/app2/src/assets/react.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/rspack_hmr/app2/src/bootstrap.tsx b/rspack_hmr/app2/src/bootstrap.tsx new file mode 100644 index 0000000..8c4462a --- /dev/null +++ b/rspack_hmr/app2/src/bootstrap.tsx @@ -0,0 +1,10 @@ +import React from 'react'; +import ReactDOM from 'react-dom/client'; +import App from './App.tsx'; +import './index.css'; + +ReactDOM.createRoot(document.getElementById('root') as HTMLElement).render( + + + , +); diff --git a/rspack_hmr/app2/src/index.css b/rspack_hmr/app2/src/index.css new file mode 100644 index 0000000..0d181ba --- /dev/null +++ b/rspack_hmr/app2/src/index.css @@ -0,0 +1,70 @@ +:root { + font-family: Inter, Avenir, Helvetica, Arial, sans-serif; + font-size: 16px; + line-height: 24px; + font-weight: 400; + + color-scheme: light dark; + color: rgba(255, 255, 255, 0.87); + background-color: #242424; + + font-synthesis: none; + text-rendering: optimizeLegibility; + -webkit-font-smoothing: antialiased; + -moz-osx-font-smoothing: grayscale; + -webkit-text-size-adjust: 100%; +} + +a { + font-weight: 500; + color: #646cff; + text-decoration: inherit; +} +a:hover { + color: #535bf2; +} + +body { + margin: 0; + display: flex; + place-items: center; + min-width: 640px; + min-height: 100vh; +} + +h1 { + font-size: 3.2em; + line-height: 1.1; +} + +button { + border-radius: 8px; + border: 1px solid transparent; + padding: 0.6em 1.2em; + font-size: 1em; + font-weight: 500; + font-family: inherit; + background-color: #1a1a1a; + cursor: pointer; + transition: border-color 0.25s; +} +button:hover { + border-color: #646cff; +} +button:focus, +button:focus-visible { + outline: 4px auto -webkit-focus-ring-color; +} + +@media (prefers-color-scheme: light) { + :root { + color: #213547; + background-color: #ffffff; + } + a:hover { + color: #747bff; + } + button { + background-color: #f9f9f9; + } +} diff --git a/rspack_hmr/app2/src/index.tsx b/rspack_hmr/app2/src/index.tsx new file mode 100644 index 0000000..b93c7a0 --- /dev/null +++ b/rspack_hmr/app2/src/index.tsx @@ -0,0 +1 @@ +import('./bootstrap'); diff --git a/rspack_hmr/app2/src/pi.ts b/rspack_hmr/app2/src/pi.ts new file mode 100644 index 0000000..37493ec --- /dev/null +++ b/rspack_hmr/app2/src/pi.ts @@ -0,0 +1,3 @@ +export default function pi() { + return 3.141592653589793; +} diff --git a/rspack_hmr/app2/src/react-env.d.ts b/rspack_hmr/app2/src/react-env.d.ts new file mode 100644 index 0000000..bd4c10d --- /dev/null +++ b/rspack_hmr/app2/src/react-env.d.ts @@ -0,0 +1,213 @@ +// CSS modules +type CSSModuleClasses = { readonly [key: string]: string }; + +declare module '*.module.css' { + const classes: CSSModuleClasses; + export default classes; +} +declare module '*.module.scss' { + const classes: CSSModuleClasses; + export default classes; +} +declare module '*.module.sass' { + const classes: CSSModuleClasses; + export default classes; +} +declare module '*.module.less' { + const classes: CSSModuleClasses; + export default classes; +} +declare module '*.module.styl' { + const classes: CSSModuleClasses; + export default classes; +} +declare module '*.module.stylus' { + const classes: CSSModuleClasses; + export default classes; +} +declare module '*.module.pcss' { + const classes: CSSModuleClasses; + export default classes; +} +declare module '*.module.sss' { + const classes: CSSModuleClasses; + export default classes; +} + +// CSS +declare module '*.css' { + /** + * @deprecated Use `import style from './style.css?inline'` instead. + */ + const css: string; + export default css; +} +declare module '*.scss' { + /** + * @deprecated Use `import style from './style.scss?inline'` instead. + */ + const css: string; + export default css; +} +declare module '*.sass' { + /** + * @deprecated Use `import style from './style.sass?inline'` instead. + */ + const css: string; + export default css; +} +declare module '*.less' { + /** + * @deprecated Use `import style from './style.less?inline'` instead. + */ + const css: string; + export default css; +} +declare module '*.styl' { + /** + * @deprecated Use `import style from './style.styl?inline'` instead. + */ + const css: string; + export default css; +} +declare module '*.stylus' { + /** + * @deprecated Use `import style from './style.stylus?inline'` instead. + */ + const css: string; + export default css; +} +declare module '*.pcss' { + /** + * @deprecated Use `import style from './style.pcss?inline'` instead. + */ + const css: string; + export default css; +} +declare module '*.sss' { + /** + * @deprecated Use `import style from './style.sss?inline'` instead. + */ + const css: string; + export default css; +} + +// images +declare module '*.png' { + const src: string; + export default src; +} +declare module '*.jpg' { + const src: string; + export default src; +} +declare module '*.jpeg' { + const src: string; + export default src; +} +declare module '*.jfif' { + const src: string; + export default src; +} +declare module '*.pjpeg' { + const src: string; + export default src; +} +declare module '*.pjp' { + const src: string; + export default src; +} +declare module '*.gif' { + const src: string; + export default src; +} +declare module '*.svg' { + const ReactComponent: React.FC>; + const content: string; + + export { ReactComponent }; + export default content; +} +declare module '*.ico' { + const src: string; + export default src; +} +declare module '*.webp' { + const src: string; + export default src; +} +declare module '*.avif' { + const src: string; + export default src; +} + +// media +declare module '*.mp4' { + const src: string; + export default src; +} +declare module '*.webm' { + const src: string; + export default src; +} +declare module '*.ogg' { + const src: string; + export default src; +} +declare module '*.mp3' { + const src: string; + export default src; +} +declare module '*.wav' { + const src: string; + export default src; +} +declare module '*.flac' { + const src: string; + export default src; +} +declare module '*.aac' { + const src: string; + export default src; +} + +declare module '*.opus' { + const src: string; + export default src; +} + +// fonts +declare module '*.woff' { + const src: string; + export default src; +} +declare module '*.woff2' { + const src: string; + export default src; +} +declare module '*.eot' { + const src: string; + export default src; +} +declare module '*.ttf' { + const src: string; + export default src; +} +declare module '*.otf' { + const src: string; + export default src; +} + +// other +declare module '*.webmanifest' { + const src: string; + export default src; +} +declare module '*.pdf' { + const src: string; + export default src; +} +declare module '*.txt' { + const src: string; + export default src; +} diff --git a/rspack_hmr/app2/tsconfig.json b/rspack_hmr/app2/tsconfig.json new file mode 100644 index 0000000..1f067d6 --- /dev/null +++ b/rspack_hmr/app2/tsconfig.json @@ -0,0 +1,18 @@ +{ + "compilerOptions": { + "target": "ES6", + "lib": ["DOM", "DOM.Iterable", "ESNext"], + "module": "ESNext", + "moduleResolution": "bundler", + "allowImportingTsExtensions": true, + "resolveJsonModule": true, + "isolatedModules": true, + "noEmit": true, + "jsx": "react-jsx", + "strict": true, + "noUnusedLocals": true, + "noUnusedParameters": true, + "noFallthroughCasesInSwitch": true + }, + "include": ["src"] +} diff --git a/rspack_hmr/host/.gitignore b/rspack_hmr/host/.gitignore new file mode 100644 index 0000000..a547bf3 --- /dev/null +++ b/rspack_hmr/host/.gitignore @@ -0,0 +1,24 @@ +# Logs +logs +*.log +npm-debug.log* +yarn-debug.log* +yarn-error.log* +pnpm-debug.log* +lerna-debug.log* + +node_modules +dist +dist-ssr +*.local + +# Editor directories and files +.vscode/* +!.vscode/extensions.json +.idea +.DS_Store +*.suo +*.ntvs* +*.njsproj +*.sln +*.sw? diff --git a/rspack_hmr/host/@mf-types/app_02/Hello.d.ts b/rspack_hmr/host/@mf-types/app_02/Hello.d.ts new file mode 100644 index 0000000..965f617 --- /dev/null +++ b/rspack_hmr/host/@mf-types/app_02/Hello.d.ts @@ -0,0 +1,2 @@ +export * from './compiled-types/Hello'; +export { default } from './compiled-types/Hello'; \ No newline at end of file diff --git a/rspack_hmr/host/@mf-types/app_02/apis.d.ts b/rspack_hmr/host/@mf-types/app_02/apis.d.ts new file mode 100644 index 0000000..2cc44cb --- /dev/null +++ b/rspack_hmr/host/@mf-types/app_02/apis.d.ts @@ -0,0 +1,3 @@ + + export type RemoteKeys = 'app_02/Hello' | 'app_02/pi'; + type PackageType = T extends 'app_02/pi' ? typeof import('app_02/pi') :T extends 'app_02/Hello' ? typeof import('app_02/Hello') :any; \ No newline at end of file diff --git a/rspack_hmr/host/@mf-types/app_02/compiled-types/Hello.d.ts b/rspack_hmr/host/@mf-types/app_02/compiled-types/Hello.d.ts new file mode 100644 index 0000000..a70e0b7 --- /dev/null +++ b/rspack_hmr/host/@mf-types/app_02/compiled-types/Hello.d.ts @@ -0,0 +1,5 @@ +interface Props { + name: string; +} +export declare const Hello: ({ name }: Props) => import("react/jsx-runtime").JSX.Element; +export {}; diff --git a/rspack_hmr/host/@mf-types/app_02/compiled-types/pi.d.ts b/rspack_hmr/host/@mf-types/app_02/compiled-types/pi.d.ts new file mode 100644 index 0000000..98a0b63 --- /dev/null +++ b/rspack_hmr/host/@mf-types/app_02/compiled-types/pi.d.ts @@ -0,0 +1 @@ +export default function pi(): number; diff --git a/rspack_hmr/host/@mf-types/app_02/pi.d.ts b/rspack_hmr/host/@mf-types/app_02/pi.d.ts new file mode 100644 index 0000000..b1d8b3d --- /dev/null +++ b/rspack_hmr/host/@mf-types/app_02/pi.d.ts @@ -0,0 +1,2 @@ +export * from './compiled-types/pi'; +export { default } from './compiled-types/pi'; \ No newline at end of file diff --git a/rspack_hmr/host/@mf-types/index.d.ts b/rspack_hmr/host/@mf-types/index.d.ts new file mode 100644 index 0000000..38e2a4f --- /dev/null +++ b/rspack_hmr/host/@mf-types/index.d.ts @@ -0,0 +1,23 @@ +import type { PackageType as PackageType_0,RemoteKeys as RemoteKeys_0 } from './app_02/apis.d.ts'; + declare module "@module-federation/runtime" { + type RemoteKeys = RemoteKeys_0; + type PackageType = T extends RemoteKeys_0 ? PackageType_0 : +Y ; + export function loadRemote(packageName: T): Promise>; + export function loadRemote(packageName: T): Promise>; + } +declare module "@module-federation/enhanced/runtime" { + type RemoteKeys = RemoteKeys_0; + type PackageType = T extends RemoteKeys_0 ? PackageType_0 : +Y ; + export function loadRemote(packageName: T): Promise>; + export function loadRemote(packageName: T): Promise>; + } +declare module "@module-federation/runtime-tools" { + type RemoteKeys = RemoteKeys_0; + type PackageType = T extends RemoteKeys_0 ? PackageType_0 : +Y ; + export function loadRemote(packageName: T): Promise>; + export function loadRemote(packageName: T): Promise>; + } + \ No newline at end of file diff --git a/rspack_hmr/host/index.html b/rspack_hmr/host/index.html new file mode 100644 index 0000000..2dc4b39 --- /dev/null +++ b/rspack_hmr/host/index.html @@ -0,0 +1,16 @@ + + + + + + + + rspack + react + ts + + + + +
    + + + \ No newline at end of file diff --git a/rspack_hmr/host/package.json b/rspack_hmr/host/package.json new file mode 100644 index 0000000..76a981b --- /dev/null +++ b/rspack_hmr/host/package.json @@ -0,0 +1,26 @@ +{ + "name": "@rspack-hmr/rspack-host", + "private": true, + "version": "1.0.0", + "scripts": { + "dev": "NODE_ENV=development rspack serve", + "build": "NODE_ENV=production rspack build" + }, + "dependencies": { + "@module-federation/enhanced": "0.2.1", + "@module-federation/runtime": "0.2.1", + "@module-federation/sdk": "0.2.1", + "react": "^18.2.0", + "react-dom": "^18.2.0", + "zephyr-webpack-plugin": "^0.0.13" + }, + "devDependencies": { + "@rspack/cli": "0.7.4", + "@rspack/core": "0.7.4", + "@rspack/plugin-react-refresh": "0.7.4", + "@types/react": "18.3.3", + "@types/react-dom": "18.3.0", + "prettier": "3.3.2", + "react-refresh": "0.14.2" + } +} diff --git a/rspack_hmr/host/pnpm-lock.yaml b/rspack_hmr/host/pnpm-lock.yaml new file mode 100644 index 0000000..6359e06 --- /dev/null +++ b/rspack_hmr/host/pnpm-lock.yaml @@ -0,0 +1,3163 @@ +lockfileVersion: '6.0' + +settings: + autoInstallPeers: true + excludeLinksFromLockfile: false + +dependencies: + '@module-federation/enhanced': + specifier: 0.2.1 + version: 0.2.1(typescript@5.5.3)(webpack@5.92.1) + '@module-federation/runtime': + specifier: 0.2.1 + version: 0.2.1 + '@module-federation/sdk': + specifier: 0.2.1 + version: 0.2.1 + react: + specifier: ^18.2.0 + version: 18.3.1 + react-dom: + specifier: ^18.2.0 + version: 18.3.1(react@18.3.1) + zephyr-webpack-plugin: + specifier: ^0.0.13 + version: 0.0.13 + +devDependencies: + '@rspack/cli': + specifier: 0.7.4 + version: 0.7.4(@rspack/core@0.7.4)(webpack@5.92.1) + '@rspack/core': + specifier: 0.7.4 + version: 0.7.4 + '@rspack/plugin-react-refresh': + specifier: 0.7.4 + version: 0.7.4(react-refresh@0.14.2) + '@types/react': + specifier: 18.3.3 + version: 18.3.3 + '@types/react-dom': + specifier: 18.3.0 + version: 18.3.0 + prettier: + specifier: 3.3.2 + version: 3.3.2 + react-refresh: + specifier: 0.14.2 + version: 0.14.2 + +packages: + + /@discoveryjs/json-ext@0.5.7: + resolution: {integrity: sha512-dBVuXR082gk3jsFp7Rd/JI4kytwGHecnCoTtXFb7DB6CNHp4rg5k1bhg0nWdLGLnOV71lmDzGQaLMy8iPLY0pw==} + engines: {node: '>=10.0.0'} + dev: true + + /@jridgewell/gen-mapping@0.3.5: + resolution: {integrity: sha512-IzL8ZoEDIBRWEzlCcRhOaCupYyN5gdIK+Q6fbFdPDg6HqX6jpkItn7DFIpW9LQzXG6Df9sA7+OKnq0qlz/GaQg==} + engines: {node: '>=6.0.0'} + dependencies: + '@jridgewell/set-array': 1.2.1 + '@jridgewell/sourcemap-codec': 1.4.15 + '@jridgewell/trace-mapping': 0.3.25 + + /@jridgewell/resolve-uri@3.1.2: + resolution: {integrity: sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==} + engines: {node: '>=6.0.0'} + + /@jridgewell/set-array@1.2.1: + resolution: {integrity: sha512-R8gLRTZeyp03ymzP/6Lil/28tGeGEzhx1q2k703KGWRAI1VdvPIXdG70VJc2pAMw3NA6JKL5hhFu1sJX0Mnn/A==} + engines: {node: '>=6.0.0'} + + /@jridgewell/source-map@0.3.6: + resolution: {integrity: sha512-1ZJTZebgqllO79ue2bm3rIGud/bOe0pP5BjSRCRxxYkEZS8STV7zN84UBbiYu7jy+eCKSnVIUgoWWE/tt+shMQ==} + dependencies: + '@jridgewell/gen-mapping': 0.3.5 + '@jridgewell/trace-mapping': 0.3.25 + + /@jridgewell/sourcemap-codec@1.4.15: + resolution: {integrity: sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg==} + + /@jridgewell/trace-mapping@0.3.25: + resolution: {integrity: sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ==} + dependencies: + '@jridgewell/resolve-uri': 3.1.2 + '@jridgewell/sourcemap-codec': 1.4.15 + + /@leichtgewicht/ip-codec@2.0.5: + resolution: {integrity: sha512-Vo+PSpZG2/fmgmiNzYK9qWRh8h/CHrwD0mo1h1DzL4yzHNSfWYujGTYsWGreD000gcgmZ7K4Ys6Tx9TxtsKdDw==} + dev: true + + /@module-federation/automatic-vendor-federation@1.2.1(webpack@5.92.1): + resolution: {integrity: sha512-73wxkXM7pbRZ6GGM90JP5IPTPvY3fvrhQyTVdMCUx85cQRWqnbzbibcsz3pkOMOeXyYAO4tXXsG13yNaEEGhJA==} + peerDependencies: + webpack: 5.91.0 + dependencies: + find-package-json: 1.2.0 + webpack: 5.92.1 + dev: false + + /@module-federation/bridge-react-webpack-plugin@0.2.1: + resolution: {integrity: sha512-dWqA4mm81yDBBWD452UiX3TXxFQPpu4KCArAIO72cISq5Llrsd0WbyUQY1DOWFN8wdhy5OwyMS5qj5wCNHXeew==} + dependencies: + '@module-federation/sdk': 0.2.1 + dev: false + + /@module-federation/dts-plugin@0.2.1(typescript@5.5.3): + resolution: {integrity: sha512-hr1w7KEaIVvoCB6mn1//+yZig099m6Ux3b5lW+w7SrH54dLzJHtIfllhWhZPZi5D9Y3mMuQlAxodsCD/sXQlKQ==} + peerDependencies: + typescript: ^4.9.0 || ^5.0.0 + vue-tsc: ^1.0.24 + peerDependenciesMeta: + vue-tsc: + optional: true + dependencies: + '@module-federation/managers': 0.2.1 + '@module-federation/sdk': 0.2.1 + '@module-federation/third-party-dts-extractor': 0.2.1 + adm-zip: 0.5.14 + ansi-colors: 4.1.3 + axios: 1.7.2 + chalk: 3.0.0 + fs-extra: 9.1.0 + isomorphic-ws: 5.0.0(ws@8.17.1) + koa: 2.11.0 + lodash.clonedeepwith: 4.5.0 + log4js: 6.9.1 + node-schedule: 2.1.1 + rambda: 9.2.1 + typescript: 5.5.3 + ws: 8.17.1 + transitivePeerDependencies: + - bufferutil + - debug + - supports-color + - utf-8-validate + dev: false + + /@module-federation/enhanced@0.2.1(typescript@5.5.3)(webpack@5.92.1): + resolution: {integrity: sha512-4iXsTU7HQUNtZMR4FAUTuctBQ9jOkYPINiCRveZjERW+UWC2g6KZ/rjbT5H5pBu/Ta6os8NSuNECtXGsT6Bprg==} + peerDependencies: + typescript: ^4.9.0 || ^5.0.0 + vue-tsc: ^1.0.24 + webpack: ^5.0.0 + peerDependenciesMeta: + typescript: + optional: true + vue-tsc: + optional: true + webpack: + optional: true + dependencies: + '@module-federation/bridge-react-webpack-plugin': 0.2.1 + '@module-federation/dts-plugin': 0.2.1(typescript@5.5.3) + '@module-federation/managers': 0.2.1 + '@module-federation/manifest': 0.2.1(typescript@5.5.3) + '@module-federation/rspack': 0.2.1(typescript@5.5.3) + '@module-federation/runtime-tools': 0.2.1 + '@module-federation/sdk': 0.2.1 + btoa: 1.2.1 + typescript: 5.5.3 + upath: 2.0.1 + webpack: 5.92.1 + transitivePeerDependencies: + - bufferutil + - debug + - supports-color + - utf-8-validate + dev: false + + /@module-federation/managers@0.2.1: + resolution: {integrity: sha512-x7Qon5YhLr9KPjig2zPkL76ZFLkvzDm7zrF2fVGO/wURWoeTougZ8vcUsDFrpEHxoQaC3OEgN0i5ZwEeRZlE2Q==} + dependencies: + '@module-federation/sdk': 0.2.1 + find-pkg: 2.0.0 + fs-extra: 9.1.0 + dev: false + + /@module-federation/manifest@0.2.1(typescript@5.5.3): + resolution: {integrity: sha512-Q0mw8ASPwCFdOvVrm7VHUMfki5MCtglb0FIPTDfhhHgVEQ6J2zW7WTu8/6HXY/SiorI1r1YBp9qhh0EzpMxgvA==} + dependencies: + '@module-federation/dts-plugin': 0.2.1(typescript@5.5.3) + '@module-federation/managers': 0.2.1 + '@module-federation/sdk': 0.2.1 + chalk: 3.0.0 + find-pkg: 2.0.0 + transitivePeerDependencies: + - bufferutil + - debug + - supports-color + - typescript + - utf-8-validate + - vue-tsc + dev: false + + /@module-federation/rspack@0.2.1(typescript@5.5.3): + resolution: {integrity: sha512-J6IGpHje69E7l6kJAZ++j35OqCJDmkj5vFdt4/nSosgAHH1hnVzTgZAvscvfsupgUntZn0HJWPNmXwBaOrccbw==} + dependencies: + '@module-federation/bridge-react-webpack-plugin': 0.2.1 + '@module-federation/dts-plugin': 0.2.1(typescript@5.5.3) + '@module-federation/managers': 0.2.1 + '@module-federation/manifest': 0.2.1(typescript@5.5.3) + '@module-federation/runtime-tools': 0.2.1 + '@module-federation/sdk': 0.2.1 + transitivePeerDependencies: + - bufferutil + - debug + - supports-color + - typescript + - utf-8-validate + - vue-tsc + dev: false + + /@module-federation/runtime-tools@0.1.6: + resolution: {integrity: sha512-7ILVnzMIa0Dlc0Blck5tVZG1tnk1MmLnuZpLOMpbdW+zl+N6wdMjjHMjEZFCUAJh2E5XJ3BREwfX8Ets0nIkLg==} + dependencies: + '@module-federation/runtime': 0.1.6 + '@module-federation/webpack-bundler-runtime': 0.1.6 + dev: true + + /@module-federation/runtime-tools@0.2.1: + resolution: {integrity: sha512-UUmEuvYWyubHfgavnqvkVmxI/Js1V4bYEMnIHTQsIn4j1DRe7DKhKeaFk+OxsAzspiIPZdEWrvmzehSYaSChJw==} + dependencies: + '@module-federation/runtime': 0.2.1 + '@module-federation/webpack-bundler-runtime': 0.2.1 + dev: false + + /@module-federation/runtime@0.1.6: + resolution: {integrity: sha512-nj6a+yJ+QxmcE89qmrTl4lphBIoAds0PFPVGnqLRWflwAP88jrCcrrTqRhARegkFDL+wE9AE04+h6jzlbIfMKg==} + dependencies: + '@module-federation/sdk': 0.1.6 + dev: true + + /@module-federation/runtime@0.2.1: + resolution: {integrity: sha512-uzp2Smg2yhJYnfYAlleFrDkVXi8b5MaEd9ve8YjrulCnhN3dAq4tQkwXOiryVtpGT5qVUBdfVoTW+HozYibEOw==} + dependencies: + '@module-federation/sdk': 0.2.1 + dev: false + + /@module-federation/sdk@0.1.6: + resolution: {integrity: sha512-qifXpyYLM7abUeEOIfv0oTkguZgRZuwh89YOAYIZJlkP6QbRG7DJMQvtM8X2yHXm9PTk0IYNnOJH0vNQCo6auQ==} + dev: true + + /@module-federation/sdk@0.2.1: + resolution: {integrity: sha512-t3136yds14EBb+BAvp3LJg8E8W+07tNweXUOt5NQfn4TROml6wF4TFyrLsaXi5F8c1C95IGYRxUNKjQ/ImLK6w==} + dev: false + + /@module-federation/third-party-dts-extractor@0.2.1: + resolution: {integrity: sha512-ws1xxpPcn1nE75jlc5jFeMaj65HdMiO9JN0Z661936q76C6gsjM0G+YQLRy/lr834/F4+zkRBaInyglM98I1eg==} + dependencies: + find-pkg: 2.0.0 + fs-extra: 9.1.0 + resolve: 1.22.8 + dev: false + + /@module-federation/webpack-bundler-runtime@0.1.6: + resolution: {integrity: sha512-K5WhKZ4RVNaMEtfHsd/9CNCgGKB0ipbm/tgweNNeC11mEuBTNxJ09Y630vg3WPkKv9vfMCuXg2p2Dk+Q/KWTSA==} + dependencies: + '@module-federation/runtime': 0.1.6 + '@module-federation/sdk': 0.1.6 + dev: true + + /@module-federation/webpack-bundler-runtime@0.2.1: + resolution: {integrity: sha512-8TdWq3TNd6fT6BayQRHtoonGfO5tyW/QjKJE/z2OWFFfG8JYF/dNWcOfLYm9Wui8Xts6nSyQIKhAD0tBifQtMw==} + dependencies: + '@module-federation/runtime': 0.2.1 + '@module-federation/sdk': 0.2.1 + dev: false + + /@polka/url@1.0.0-next.25: + resolution: {integrity: sha512-j7P6Rgr3mmtdkeDGTe0E/aYyWEWVtc5yFXtHCRHs28/jptDEWfaVOc5T7cblqy1XKPPfCxJc/8DwQ5YgLOZOVQ==} + dev: true + + /@rspack/binding-darwin-arm64@0.7.4: + resolution: {integrity: sha512-K78fUe9OhFTV61kHYCuahNkBXCFJMmqSGyIgNtLR9Psk82IVCHkvxY5565An1Quvo1UmgVh5R2YmylKE81mwiw==} + cpu: [arm64] + os: [darwin] + requiresBuild: true + dev: true + optional: true + + /@rspack/binding-darwin-x64@0.7.4: + resolution: {integrity: sha512-EQriu7oE+tZv25g5VJH6Ael74U42fmpb4zGs7wLmWyKfCtO6SegL3tJ8Jc6mMmp+vg949dVvkw7uB6TJjOqx2g==} + cpu: [x64] + os: [darwin] + requiresBuild: true + dev: true + optional: true + + /@rspack/binding-linux-arm64-gnu@0.7.4: + resolution: {integrity: sha512-yhJLkU1zEXMyHNWhh8pBEaK6cRAjFzRK2hqejhhZ0K+lqC0Af9bKvZyXXGrMfmmHlsh1VJ9VVmi21qcXr/kdzg==} + cpu: [arm64] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@rspack/binding-linux-arm64-musl@0.7.4: + resolution: {integrity: sha512-6GV3Ztl6Q1zdJmNo+dwHiJd2Y/IEH9qWOh4YHiyzYGbQQYpfhhLYwKexalWaAAhdMm6KKoeqzklgHImCINImEg==} + cpu: [arm64] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@rspack/binding-linux-x64-gnu@0.7.4: + resolution: {integrity: sha512-KFdAEIZ7mPnT0y198xVOa8vIT9tgpEFVidCSIlxdk65UGC59g6UxEQq1EVAbcBi1Ou6Zza/UtxIlzk6Ev6KDkQ==} + cpu: [x64] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@rspack/binding-linux-x64-musl@0.7.4: + resolution: {integrity: sha512-qekcXkv12oWRztZHXGzNAI92/O/+abU35/nGDycZmMtr+Qt2XS5hE1T9oBQ54yecIzUVDGNcYwhIMWBX6E2dmQ==} + cpu: [x64] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@rspack/binding-win32-arm64-msvc@0.7.4: + resolution: {integrity: sha512-D1BccimBVeA/k2ty/28ER/j3s/c0n0MtN4kpyjYwgRILVLRSr+rfbC75i8wYh8r8AXjhNWNG88LmrFN9e9i7Ug==} + cpu: [arm64] + os: [win32] + requiresBuild: true + dev: true + optional: true + + /@rspack/binding-win32-ia32-msvc@0.7.4: + resolution: {integrity: sha512-5//TZH0Y4fRuTQ/ZmNOVaIfPIQXtgNAI78QxvF8Amygk4Uqklpo3ceHGP+yZfZgjh3mzjoUK+22fWbq/cUmW0w==} + cpu: [ia32] + os: [win32] + requiresBuild: true + dev: true + optional: true + + /@rspack/binding-win32-x64-msvc@0.7.4: + resolution: {integrity: sha512-C3ZxIEYKvnjQbV19FfQE6CGO6vcGp2JcvSQCc6SHwU/KNxLDrI1pA7XUG5TKoGSsqVEDZN6H8fJxLUYPQBjJcg==} + cpu: [x64] + os: [win32] + requiresBuild: true + dev: true + optional: true + + /@rspack/binding@0.7.4: + resolution: {integrity: sha512-H1rTtYxbxe40miV2gYLPwIxEn2yMY6+bq+fjfiRu61kTvllexPMBYgFpKqSAc5Qyyto9j9uCkR4MJEYj2R/SQQ==} + optionalDependencies: + '@rspack/binding-darwin-arm64': 0.7.4 + '@rspack/binding-darwin-x64': 0.7.4 + '@rspack/binding-linux-arm64-gnu': 0.7.4 + '@rspack/binding-linux-arm64-musl': 0.7.4 + '@rspack/binding-linux-x64-gnu': 0.7.4 + '@rspack/binding-linux-x64-musl': 0.7.4 + '@rspack/binding-win32-arm64-msvc': 0.7.4 + '@rspack/binding-win32-ia32-msvc': 0.7.4 + '@rspack/binding-win32-x64-msvc': 0.7.4 + dev: true + + /@rspack/cli@0.7.4(@rspack/core@0.7.4)(webpack@5.92.1): + resolution: {integrity: sha512-UFQWYpgHqrtCzySif9F/ueBn8CbsGmlXOZRYnOzC9HzKXZY9JYgJFbT7EL7JfFe1LmBukF3yaTOuSgTbIxJkJQ==} + hasBin: true + peerDependencies: + '@rspack/core': '>=0.4.0' + dependencies: + '@discoveryjs/json-ext': 0.5.7 + '@rspack/core': 0.7.4 + '@rspack/dev-server': 0.7.4(@rspack/core@0.7.4)(webpack@5.92.1) + colorette: 2.0.19 + exit-hook: 3.2.0 + interpret: 3.1.1 + rechoir: 0.8.0 + semver: 6.3.1 + webpack-bundle-analyzer: 4.6.1 + yargs: 17.6.2 + transitivePeerDependencies: + - '@types/express' + - bufferutil + - debug + - supports-color + - utf-8-validate + - webpack + - webpack-cli + dev: true + + /@rspack/core@0.7.4: + resolution: {integrity: sha512-HECQ0WL8iVS1Mwq2W2hfrStZZbtTPl/GjDdAZDMToPqWtSVGww99UDGIYTHW8G6kawQ3GY6wa86WTQNfXEpSCA==} + engines: {node: '>=16.0.0'} + peerDependencies: + '@swc/helpers': '>=0.5.1' + peerDependenciesMeta: + '@swc/helpers': + optional: true + dependencies: + '@module-federation/runtime-tools': 0.1.6 + '@rspack/binding': 0.7.4 + caniuse-lite: 1.0.30001639 + tapable: 2.2.1 + webpack-sources: 3.2.3 + dev: true + + /@rspack/dev-server@0.7.4(@rspack/core@0.7.4)(webpack@5.92.1): + resolution: {integrity: sha512-mzc1gqZ0iMmqbsWiVSoRfZQiz2x1wGQc0uibyRzDxZ1Z9IqSjHwoZopVAN9aiR6CNWrSXRHy7KuyhCFfweOh0g==} + peerDependencies: + '@rspack/core': '*' + dependencies: + '@rspack/core': 0.7.4 + chokidar: 3.5.3 + connect-history-api-fallback: 2.0.0 + express: 4.19.2 + http-proxy-middleware: 2.0.6(@types/express@4.17.21) + mime-types: 2.1.35 + webpack-dev-middleware: 6.1.2(webpack@5.92.1) + webpack-dev-server: 4.13.1(webpack@5.92.1) + ws: 8.8.1 + transitivePeerDependencies: + - '@types/express' + - bufferutil + - debug + - supports-color + - utf-8-validate + - webpack + - webpack-cli + dev: true + + /@rspack/plugin-react-refresh@0.7.4(react-refresh@0.14.2): + resolution: {integrity: sha512-9tAJdG/xZ6hUtD5K5OVpwAl2yV2HFnNl5fU5aOR5VJ5Pk0rCsYwbEZRbRnmSZwzMWIKDnowhoTi+4Ha3JV3aeQ==} + peerDependencies: + react-refresh: '>=0.10.0 <1.0.0' + peerDependenciesMeta: + react-refresh: + optional: true + dependencies: + react-refresh: 0.14.2 + dev: true + + /@socket.io/component-emitter@3.1.2: + resolution: {integrity: sha512-9BCxFwvbGg/RsZK9tjXd8s4UcwR0MWeFQ1XEKIQVVvAGJyINdrqKMcTRyLoK8Rse1GjzLV9cwjWV1olXRWEXVA==} + dev: false + + /@types/body-parser@1.19.5: + resolution: {integrity: sha512-fB3Zu92ucau0iQ0JMCFQE7b/dv8Ot07NI3KaZIkIUNXq82k4eBAqUaneXfleGY9JWskeS9y+u0nXMyspcuQrCg==} + dependencies: + '@types/connect': 3.4.38 + '@types/node': 20.14.9 + dev: true + + /@types/bonjour@3.5.13: + resolution: {integrity: sha512-z9fJ5Im06zvUL548KvYNecEVlA7cVDkGUi6kZusb04mpyEFKCIZJvloCcmpmLaIahDpOQGHaHmG6imtPMmPXGQ==} + dependencies: + '@types/node': 20.14.9 + dev: true + + /@types/connect-history-api-fallback@1.5.4: + resolution: {integrity: sha512-n6Cr2xS1h4uAulPRdlw6Jl6s1oG8KrVilPN2yUITEs+K48EzMJJ3W1xy8K5eWuFvjp3R74AOIGSmp2UfBJ8HFw==} + dependencies: + '@types/express-serve-static-core': 4.19.5 + '@types/node': 20.14.9 + dev: true + + /@types/connect@3.4.38: + resolution: {integrity: sha512-K6uROf1LD88uDQqJCktA4yzL1YYAK6NgfsI0v/mTgyPKWsX1CnJ0XPSDhViejru1GcRkLWb8RlzFYJRqGUbaug==} + dependencies: + '@types/node': 20.14.9 + dev: true + + /@types/eslint-scope@3.7.7: + resolution: {integrity: sha512-MzMFlSLBqNF2gcHWO0G1vP/YQyfvrxZ0bF+u7mzUdZ1/xK4A4sru+nraZz5i3iEIk1l1uyicaDVTB4QbbEkAYg==} + dependencies: + '@types/eslint': 8.56.10 + '@types/estree': 1.0.5 + + /@types/eslint@8.56.10: + resolution: {integrity: sha512-Shavhk87gCtY2fhXDctcfS3e6FdxWkCx1iUZ9eEUbh7rTqlZT0/IzOkCOVt0fCjcFuZ9FPYfuezTBImfHCDBGQ==} + dependencies: + '@types/estree': 1.0.5 + '@types/json-schema': 7.0.15 + + /@types/estree@1.0.5: + resolution: {integrity: sha512-/kYRxGDLWzHOB7q+wtSUQlFrtcdUccpfy+X+9iMBpHK8QLLhx2wIPYuS5DYtR9Wa/YlZAbIovy7qVdB1Aq6Lyw==} + + /@types/express-serve-static-core@4.19.5: + resolution: {integrity: sha512-y6W03tvrACO72aijJ5uF02FRq5cgDR9lUxddQ8vyF+GvmjJQqbzDcJngEjURc+ZsG31VI3hODNZJ2URj86pzmg==} + dependencies: + '@types/node': 20.14.9 + '@types/qs': 6.9.15 + '@types/range-parser': 1.2.7 + '@types/send': 0.17.4 + dev: true + + /@types/express@4.17.21: + resolution: {integrity: sha512-ejlPM315qwLpaQlQDTjPdsUFSc6ZsP4AN6AlWnogPjQ7CVi7PYF3YVz+CY3jE2pwYf7E/7HlDAN0rV2GxTG0HQ==} + dependencies: + '@types/body-parser': 1.19.5 + '@types/express-serve-static-core': 4.19.5 + '@types/qs': 6.9.15 + '@types/serve-static': 1.15.7 + dev: true + + /@types/http-errors@2.0.4: + resolution: {integrity: sha512-D0CFMMtydbJAegzOyHjtiKPLlvnm3iTZyZRSZoLq2mRhDdmLfIWOCYPfQJ4cu2erKghU++QvjcUjp/5h7hESpA==} + dev: true + + /@types/http-proxy@1.17.14: + resolution: {integrity: sha512-SSrD0c1OQzlFX7pGu1eXxSEjemej64aaNPRhhVYUGqXh0BtldAAx37MG8btcumvpgKyZp1F5Gn3JkktdxiFv6w==} + dependencies: + '@types/node': 20.14.9 + dev: true + + /@types/json-schema@7.0.15: + resolution: {integrity: sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==} + + /@types/mime@1.3.5: + resolution: {integrity: sha512-/pyBZWSLD2n0dcHE3hq8s8ZvcETHtEuF+3E7XVt0Ig2nvsVQXdghHVcEkIWjy9A0wKfTn97a/PSDYohKIlnP/w==} + dev: true + + /@types/node-forge@1.3.11: + resolution: {integrity: sha512-FQx220y22OKNTqaByeBGqHWYz4cl94tpcxeFdvBo3wjG6XPBuZ0BNgNZRV5J5TFmmcsJ4IzsLkmGRiQbnYsBEQ==} + dependencies: + '@types/node': 20.14.9 + dev: true + + /@types/node@20.14.9: + resolution: {integrity: sha512-06OCtnTXtWOZBJlRApleWndH4JsRVs1pDCc8dLSQp+7PpUpX3ePdHyeNSFTeSe7FtKyQkrlPvHwJOW3SLd8Oyg==} + dependencies: + undici-types: 5.26.5 + + /@types/prop-types@15.7.12: + resolution: {integrity: sha512-5zvhXYtRNRluoE/jAp4GVsSduVUzNWKkOZrCDBWYtE7biZywwdC2AcEzg+cSMLFRfVgeAFqpfNabiPjxFddV1Q==} + dev: true + + /@types/qs@6.9.15: + resolution: {integrity: sha512-uXHQKES6DQKKCLh441Xv/dwxOq1TVS3JPUMlEqoEglvlhR6Mxnlew/Xq/LRVHpLyk7iK3zODe1qYHIMltO7XGg==} + dev: true + + /@types/range-parser@1.2.7: + resolution: {integrity: sha512-hKormJbkJqzQGhziax5PItDUTMAM9uE2XXQmM37dyd4hVM+5aVl7oVxMVUiVQn2oCQFN/LKCZdvSM0pFRqbSmQ==} + dev: true + + /@types/react-dom@18.3.0: + resolution: {integrity: sha512-EhwApuTmMBmXuFOikhQLIBUn6uFg81SwLMOAUgodJF14SOBOCMdU04gDoYi0WOJJHD144TL32z4yDqCW3dnkQg==} + dependencies: + '@types/react': 18.3.3 + dev: true + + /@types/react@18.3.3: + resolution: {integrity: sha512-hti/R0pS0q1/xx+TsI73XIqk26eBsISZ2R0wUijXIngRK9R/e7Xw/cXVxQK7R5JjW+SV4zGcn5hXjudkN/pLIw==} + dependencies: + '@types/prop-types': 15.7.12 + csstype: 3.1.3 + dev: true + + /@types/retry@0.12.0: + resolution: {integrity: sha512-wWKOClTTiizcZhXnPY4wikVAwmdYHp8q6DmC+EJUzAMsycb7HB32Kh9RN4+0gExjmPmZSAQjgURXIGATPegAvA==} + dev: true + + /@types/send@0.17.4: + resolution: {integrity: sha512-x2EM6TJOybec7c52BX0ZspPodMsQUd5L6PRwOunVyVUhXiBSKf3AezDL8Dgvgt5o0UfKNfuA0eMLr2wLT4AiBA==} + dependencies: + '@types/mime': 1.3.5 + '@types/node': 20.14.9 + dev: true + + /@types/serve-index@1.9.4: + resolution: {integrity: sha512-qLpGZ/c2fhSs5gnYsQxtDEq3Oy8SXPClIXkW5ghvAvsNuVSA8k+gCONcUCS/UjLEYvYps+e8uBtfgXgvhwfNug==} + dependencies: + '@types/express': 4.17.21 + dev: true + + /@types/serve-static@1.15.7: + resolution: {integrity: sha512-W8Ym+h8nhuRwaKPaDw34QUkwsGi6Rc4yYqvKFo5rm2FUEhCFbzVWrxXUxuKK8TASjWsysJY0nsmNCGhCOIsrOw==} + dependencies: + '@types/http-errors': 2.0.4 + '@types/node': 20.14.9 + '@types/send': 0.17.4 + dev: true + + /@types/sockjs@0.3.36: + resolution: {integrity: sha512-MK9V6NzAS1+Ud7JV9lJLFqW85VbC9dq3LmwZCuBe4wBDgKC0Kj/jd8Xl+nSviU+Qc3+m7umHHyHg//2KSa0a0Q==} + dependencies: + '@types/node': 20.14.9 + dev: true + + /@types/ws@8.5.10: + resolution: {integrity: sha512-vmQSUcfalpIq0R9q7uTo2lXs6eGIpt9wtnLdMv9LVpIjCA/+ufZRozlVoVelIYixx1ugCBKDhn89vnsEGOCx9A==} + dependencies: + '@types/node': 20.14.9 + dev: true + + /@webassemblyjs/ast@1.12.1: + resolution: {integrity: sha512-EKfMUOPRRUTy5UII4qJDGPpqfwjOmZ5jeGFwid9mnoqIFK+e0vqoi1qH56JpmZSzEL53jKnNzScdmftJyG5xWg==} + dependencies: + '@webassemblyjs/helper-numbers': 1.11.6 + '@webassemblyjs/helper-wasm-bytecode': 1.11.6 + + /@webassemblyjs/floating-point-hex-parser@1.11.6: + resolution: {integrity: sha512-ejAj9hfRJ2XMsNHk/v6Fu2dGS+i4UaXBXGemOfQ/JfQ6mdQg/WXtwleQRLLS4OvfDhv8rYnVwH27YJLMyYsxhw==} + + /@webassemblyjs/helper-api-error@1.11.6: + resolution: {integrity: sha512-o0YkoP4pVu4rN8aTJgAyj9hC2Sv5UlkzCHhxqWj8butaLvnpdc2jOwh4ewE6CX0txSfLn/UYaV/pheS2Txg//Q==} + + /@webassemblyjs/helper-buffer@1.12.1: + resolution: {integrity: sha512-nzJwQw99DNDKr9BVCOZcLuJJUlqkJh+kVzVl6Fmq/tI5ZtEyWT1KZMyOXltXLZJmDtvLCDgwsyrkohEtopTXCw==} + + /@webassemblyjs/helper-numbers@1.11.6: + resolution: {integrity: sha512-vUIhZ8LZoIWHBohiEObxVm6hwP034jwmc9kuq5GdHZH0wiLVLIPcMCdpJzG4C11cHoQ25TFIQj9kaVADVX7N3g==} + dependencies: + '@webassemblyjs/floating-point-hex-parser': 1.11.6 + '@webassemblyjs/helper-api-error': 1.11.6 + '@xtuc/long': 4.2.2 + + /@webassemblyjs/helper-wasm-bytecode@1.11.6: + resolution: {integrity: sha512-sFFHKwcmBprO9e7Icf0+gddyWYDViL8bpPjJJl0WHxCdETktXdmtWLGVzoHbqUcY4Be1LkNfwTmXOJUFZYSJdA==} + + /@webassemblyjs/helper-wasm-section@1.12.1: + resolution: {integrity: sha512-Jif4vfB6FJlUlSbgEMHUyk1j234GTNG9dBJ4XJdOySoj518Xj0oGsNi59cUQF4RRMS9ouBUxDDdyBVfPTypa5g==} + dependencies: + '@webassemblyjs/ast': 1.12.1 + '@webassemblyjs/helper-buffer': 1.12.1 + '@webassemblyjs/helper-wasm-bytecode': 1.11.6 + '@webassemblyjs/wasm-gen': 1.12.1 + + /@webassemblyjs/ieee754@1.11.6: + resolution: {integrity: sha512-LM4p2csPNvbij6U1f19v6WR56QZ8JcHg3QIJTlSwzFcmx6WSORicYj6I63f9yU1kEUtrpG+kjkiIAkevHpDXrg==} + dependencies: + '@xtuc/ieee754': 1.2.0 + + /@webassemblyjs/leb128@1.11.6: + resolution: {integrity: sha512-m7a0FhE67DQXgouf1tbN5XQcdWoNgaAuoULHIfGFIEVKA6tu/edls6XnIlkmS6FrXAquJRPni3ZZKjw6FSPjPQ==} + dependencies: + '@xtuc/long': 4.2.2 + + /@webassemblyjs/utf8@1.11.6: + resolution: {integrity: sha512-vtXf2wTQ3+up9Zsg8sa2yWiQpzSsMyXj0qViVP6xKGCUT8p8YJ6HqI7l5eCnWx1T/FYdsv07HQs2wTFbbof/RA==} + + /@webassemblyjs/wasm-edit@1.12.1: + resolution: {integrity: sha512-1DuwbVvADvS5mGnXbE+c9NfA8QRcZ6iKquqjjmR10k6o+zzsRVesil54DKexiowcFCPdr/Q0qaMgB01+SQ1u6g==} + dependencies: + '@webassemblyjs/ast': 1.12.1 + '@webassemblyjs/helper-buffer': 1.12.1 + '@webassemblyjs/helper-wasm-bytecode': 1.11.6 + '@webassemblyjs/helper-wasm-section': 1.12.1 + '@webassemblyjs/wasm-gen': 1.12.1 + '@webassemblyjs/wasm-opt': 1.12.1 + '@webassemblyjs/wasm-parser': 1.12.1 + '@webassemblyjs/wast-printer': 1.12.1 + + /@webassemblyjs/wasm-gen@1.12.1: + resolution: {integrity: sha512-TDq4Ojh9fcohAw6OIMXqiIcTq5KUXTGRkVxbSo1hQnSy6lAM5GSdfwWeSxpAo0YzgsgF182E/U0mDNhuA0tW7w==} + dependencies: + '@webassemblyjs/ast': 1.12.1 + '@webassemblyjs/helper-wasm-bytecode': 1.11.6 + '@webassemblyjs/ieee754': 1.11.6 + '@webassemblyjs/leb128': 1.11.6 + '@webassemblyjs/utf8': 1.11.6 + + /@webassemblyjs/wasm-opt@1.12.1: + resolution: {integrity: sha512-Jg99j/2gG2iaz3hijw857AVYekZe2SAskcqlWIZXjji5WStnOpVoat3gQfT/Q5tb2djnCjBtMocY/Su1GfxPBg==} + dependencies: + '@webassemblyjs/ast': 1.12.1 + '@webassemblyjs/helper-buffer': 1.12.1 + '@webassemblyjs/wasm-gen': 1.12.1 + '@webassemblyjs/wasm-parser': 1.12.1 + + /@webassemblyjs/wasm-parser@1.12.1: + resolution: {integrity: sha512-xikIi7c2FHXysxXe3COrVUPSheuBtpcfhbpFj4gmu7KRLYOzANztwUU0IbsqvMqzuNK2+glRGWCEqZo1WCLyAQ==} + dependencies: + '@webassemblyjs/ast': 1.12.1 + '@webassemblyjs/helper-api-error': 1.11.6 + '@webassemblyjs/helper-wasm-bytecode': 1.11.6 + '@webassemblyjs/ieee754': 1.11.6 + '@webassemblyjs/leb128': 1.11.6 + '@webassemblyjs/utf8': 1.11.6 + + /@webassemblyjs/wast-printer@1.12.1: + resolution: {integrity: sha512-+X4WAlOisVWQMikjbcvY2e0rwPsKQ9F688lksZhBcPycBBuii3O7m8FACbDMWDojpAqvjIncrG8J0XHKyQfVeA==} + dependencies: + '@webassemblyjs/ast': 1.12.1 + '@xtuc/long': 4.2.2 + + /@xtuc/ieee754@1.2.0: + resolution: {integrity: sha512-DX8nKgqcGwsc0eJSqYt5lwP4DH5FlHnmuWWBRy7X0NcaGR0ZtuyeESgMwTYVEtxmsNGY+qit4QYT/MIYTOTPeA==} + + /@xtuc/long@4.2.2: + resolution: {integrity: sha512-NuHqBY1PB/D8xU6s/thBgOAiAP7HOYDQ32+BFZILJ8ivkUkAHQnWfn6WhL79Owj1qmUnoN/YPhktdIoucipkAQ==} + + /accepts@1.3.8: + resolution: {integrity: sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw==} + engines: {node: '>= 0.6'} + dependencies: + mime-types: 2.1.35 + negotiator: 0.6.3 + + /acorn-import-attributes@1.9.5(acorn@8.12.0): + resolution: {integrity: sha512-n02Vykv5uA3eHGM/Z2dQrcD56kL8TyDb2p1+0P83PClMnC/nc+anbQRhIOWnSq4Ke/KvDPrY3C9hDtC/A3eHnQ==} + peerDependencies: + acorn: ^8 + dependencies: + acorn: 8.12.0 + + /acorn-walk@8.3.3: + resolution: {integrity: sha512-MxXdReSRhGO7VlFe1bRG/oI7/mdLV9B9JJT0N8vZOhF7gFRR5l3M8W9G8JxmKV+JC5mGqJ0QvqfSOLsCPa4nUw==} + engines: {node: '>=0.4.0'} + dependencies: + acorn: 8.12.0 + dev: true + + /acorn@8.12.0: + resolution: {integrity: sha512-RTvkC4w+KNXrM39/lWCUaG0IbRkWdCv7W/IOW9oU6SawyxulvkQy5HQPVTKxEjczcUvapcrw3cFx/60VN/NRNw==} + engines: {node: '>=0.4.0'} + hasBin: true + + /adm-zip@0.5.14: + resolution: {integrity: sha512-DnyqqifT4Jrcvb8USYjp6FHtBpEIz1mnXu6pTRHZ0RL69LbQYiO+0lDFg5+OKA7U29oWSs3a/i8fhn8ZcceIWg==} + engines: {node: '>=12.0'} + dev: false + + /ajv-formats@2.1.1(ajv@8.16.0): + resolution: {integrity: sha512-Wx0Kx52hxE7C18hkMEggYlEifqWZtYaRgouJor+WMdPnQyEK13vgEWyVNup7SoeeoLMsr4kf5h6dOW11I15MUA==} + peerDependencies: + ajv: ^8.0.0 + peerDependenciesMeta: + ajv: + optional: true + dependencies: + ajv: 8.16.0 + dev: true + + /ajv-keywords@3.5.2(ajv@6.12.6): + resolution: {integrity: sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ==} + peerDependencies: + ajv: ^6.9.1 + dependencies: + ajv: 6.12.6 + + /ajv-keywords@5.1.0(ajv@8.16.0): + resolution: {integrity: sha512-YCS/JNFAUyr5vAuhk1DWm1CBxRHW9LbJ2ozWeemrIqpbsqKjHVxYPyi5GC0rjZIT5JxJ3virVTS8wk4i/Z+krw==} + peerDependencies: + ajv: ^8.8.2 + dependencies: + ajv: 8.16.0 + fast-deep-equal: 3.1.3 + dev: true + + /ajv@6.12.6: + resolution: {integrity: sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==} + dependencies: + fast-deep-equal: 3.1.3 + fast-json-stable-stringify: 2.1.0 + json-schema-traverse: 0.4.1 + uri-js: 4.4.1 + + /ajv@8.16.0: + resolution: {integrity: sha512-F0twR8U1ZU67JIEtekUcLkXkoO5mMMmgGD8sK/xUFzJ805jxHQl92hImFAqqXMyMYjSPOyUPAwHYhB72g5sTXw==} + dependencies: + fast-deep-equal: 3.1.3 + json-schema-traverse: 1.0.0 + require-from-string: 2.0.2 + uri-js: 4.4.1 + dev: true + + /ansi-colors@4.1.3: + resolution: {integrity: sha512-/6w/C21Pm1A7aZitlI5Ni/2J6FFQN8i1Cvz3kHABAAbw93v/NlvKdVOqz7CCWz/3iv/JplRSEEZ83XION15ovw==} + engines: {node: '>=6'} + dev: false + + /ansi-html-community@0.0.8: + resolution: {integrity: sha512-1APHAyr3+PCamwNw3bXCPp4HFLONZt/yIH0sZp0/469KWNTEy+qN5jQ3GVX6DMZ1UXAi34yVwtTeaG/HpBuuzw==} + engines: {'0': node >= 0.8.0} + hasBin: true + dev: true + + /ansi-regex@5.0.1: + resolution: {integrity: sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==} + engines: {node: '>=8'} + dev: true + + /ansi-styles@4.3.0: + resolution: {integrity: sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==} + engines: {node: '>=8'} + dependencies: + color-convert: 2.0.1 + + /any-promise@1.3.0: + resolution: {integrity: sha512-7UvmKalWRt1wgjL1RrGxoSJW/0QZFIegpeGvZG9kjp8vrRu55XTHbwnqq2GpXm9uLbcuhxm3IqX9OB4MZR1b2A==} + dev: false + + /anymatch@3.1.3: + resolution: {integrity: sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==} + engines: {node: '>= 8'} + dependencies: + normalize-path: 3.0.0 + picomatch: 2.3.1 + dev: true + + /array-flatten@1.1.1: + resolution: {integrity: sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg==} + dev: true + + /asynckit@0.4.0: + resolution: {integrity: sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==} + dev: false + + /at-least-node@1.0.0: + resolution: {integrity: sha512-+q/t7Ekv1EDY2l6Gda6LLiX14rU9TV20Wa3ofeQmwPFZbOMo9DXrLbOjFaaclkXKWidIaopwAObQDqwWtGUjqg==} + engines: {node: '>= 4.0.0'} + dev: false + + /axios@1.7.2: + resolution: {integrity: sha512-2A8QhOMrbomlDuiLeK9XibIBzuHeRcqqNOHp0Cyp5EoJ1IFDh+XZH3A6BkXtv0K4gFGCI0Y4BM7B1wOEi0Rmgw==} + dependencies: + follow-redirects: 1.15.6 + form-data: 4.0.0 + proxy-from-env: 1.1.0 + transitivePeerDependencies: + - debug + dev: false + + /balanced-match@1.0.2: + resolution: {integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==} + dev: true + + /batch@0.6.1: + resolution: {integrity: sha512-x+VAiMRL6UPkx+kudNvxTl6hB2XNNCG2r+7wixVfIYwu/2HKRXimwQyaumLjMveWvT2Hkd/cAJw+QBMfJ/EKVw==} + dev: true + + /binary-extensions@2.3.0: + resolution: {integrity: sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw==} + engines: {node: '>=8'} + dev: true + + /body-parser@1.20.2: + resolution: {integrity: sha512-ml9pReCu3M61kGlqoTm2umSXTlRTuGTx0bfYj+uIUKKYycG5NtSbeetV3faSU6R7ajOPw0g/J1PvK4qNy7s5bA==} + engines: {node: '>= 0.8', npm: 1.2.8000 || >= 1.4.16} + dependencies: + bytes: 3.1.2 + content-type: 1.0.5 + debug: 2.6.9 + depd: 2.0.0 + destroy: 1.2.0 + http-errors: 2.0.0 + iconv-lite: 0.4.24 + on-finished: 2.4.1 + qs: 6.11.0 + raw-body: 2.5.2 + type-is: 1.6.18 + unpipe: 1.0.0 + transitivePeerDependencies: + - supports-color + dev: true + + /bonjour-service@1.2.1: + resolution: {integrity: sha512-oSzCS2zV14bh2kji6vNe7vrpJYCHGvcZnlffFQ1MEoX/WOeQ/teD8SYWKR942OI3INjq8OMNJlbPK5LLLUxFDw==} + dependencies: + fast-deep-equal: 3.1.3 + multicast-dns: 7.2.5 + dev: true + + /brace-expansion@1.1.11: + resolution: {integrity: sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==} + dependencies: + balanced-match: 1.0.2 + concat-map: 0.0.1 + dev: true + + /braces@3.0.3: + resolution: {integrity: sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==} + engines: {node: '>=8'} + dependencies: + fill-range: 7.1.1 + dev: true + + /browserslist@4.23.1: + resolution: {integrity: sha512-TUfofFo/KsK/bWZ9TWQ5O26tsWW4Uhmt8IYklbnUa70udB6P2wA7w7o4PY4muaEPBQaAX+CEnmmIA41NVHtPVw==} + engines: {node: ^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7} + hasBin: true + dependencies: + caniuse-lite: 1.0.30001639 + electron-to-chromium: 1.4.816 + node-releases: 2.0.14 + update-browserslist-db: 1.0.16(browserslist@4.23.1) + + /btoa@1.2.1: + resolution: {integrity: sha512-SB4/MIGlsiVkMcHmT+pSmIPoNDoHg+7cMzmt3Uxt628MTz2487DKSqK/fuhFBrkuqrYv5UCEnACpF4dTFNKc/g==} + engines: {node: '>= 0.4.0'} + hasBin: true + dev: false + + /buffer-from@1.1.2: + resolution: {integrity: sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==} + + /bundle-name@4.1.0: + resolution: {integrity: sha512-tjwM5exMg6BGRI+kNmTntNsvdZS1X8BFYS6tnJ2hdH0kVxM6/eVZ2xy+FqStSWvYmtfFMDLIxurorHwDKfDz5Q==} + engines: {node: '>=18'} + dependencies: + run-applescript: 7.0.0 + dev: false + + /bytes@3.0.0: + resolution: {integrity: sha512-pMhOfFDPiv9t5jjIXkHosWmkSyQbvsgEVNkz0ERHbuLh2T/7j4Mqqpz523Fe8MVY89KC6Sh/QfS2sM+SjgFDcw==} + engines: {node: '>= 0.8'} + dev: true + + /bytes@3.1.2: + resolution: {integrity: sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==} + engines: {node: '>= 0.8'} + dev: true + + /cache-content-type@1.0.1: + resolution: {integrity: sha512-IKufZ1o4Ut42YUrZSo8+qnMTrFuKkvyoLXUywKz9GJ5BrhOFGhLdkx9sG4KAnVvbY6kEcSFjLQul+DVmBm2bgA==} + engines: {node: '>= 6.0.0'} + dependencies: + mime-types: 2.1.35 + ylru: 1.4.0 + dev: false + + /call-bind@1.0.7: + resolution: {integrity: sha512-GHTSNSYICQ7scH7sZ+M2rFopRoLh8t2bLSW6BbgrtLsahOIB5iyAVJf9GjWK3cYTDaMj4XdBpM1cA6pIS0Kv2w==} + engines: {node: '>= 0.4'} + dependencies: + es-define-property: 1.0.0 + es-errors: 1.3.0 + function-bind: 1.1.2 + get-intrinsic: 1.2.4 + set-function-length: 1.2.2 + dev: true + + /caniuse-lite@1.0.30001639: + resolution: {integrity: sha512-eFHflNTBIlFwP2AIKaYuBQN/apnUoKNhBdza8ZnW/h2di4LCZ4xFqYlxUxo+LQ76KFI1PGcC1QDxMbxTZpSCAg==} + + /chalk@3.0.0: + resolution: {integrity: sha512-4D3B6Wf41KOYRFdszmDqMCGq5VV/uMAB273JILmO+3jAlh8X4qDtdtgCR3fxtbLEMzSx22QdhnDcJvu2u1fVwg==} + engines: {node: '>=8'} + dependencies: + ansi-styles: 4.3.0 + supports-color: 7.2.0 + dev: false + + /chalk@4.1.2: + resolution: {integrity: sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==} + engines: {node: '>=10'} + dependencies: + ansi-styles: 4.3.0 + supports-color: 7.2.0 + dev: true + + /chokidar@3.5.3: + resolution: {integrity: sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==} + engines: {node: '>= 8.10.0'} + dependencies: + anymatch: 3.1.3 + braces: 3.0.3 + glob-parent: 5.1.2 + is-binary-path: 2.1.0 + is-glob: 4.0.3 + normalize-path: 3.0.0 + readdirp: 3.6.0 + optionalDependencies: + fsevents: 2.3.3 + dev: true + + /chrome-trace-event@1.0.4: + resolution: {integrity: sha512-rNjApaLzuwaOTjCiT8lSDdGN1APCiqkChLMJxJPWLunPAt5fy8xgU9/jNOchV84wfIxrA0lRQB7oCT8jrn/wrQ==} + engines: {node: '>=6.0'} + + /ci-info@3.9.0: + resolution: {integrity: sha512-NIxF55hv4nSqQswkAeiOi1r83xy8JldOFDTWiug55KBu9Jnblncd2U6ViHmYgHf01TPZS77NJBhBMKdWj9HQMQ==} + engines: {node: '>=8'} + dev: false + + /cliui@8.0.1: + resolution: {integrity: sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==} + engines: {node: '>=12'} + dependencies: + string-width: 4.2.3 + strip-ansi: 6.0.1 + wrap-ansi: 7.0.0 + dev: true + + /co@4.6.0: + resolution: {integrity: sha512-QVb0dM5HvG+uaxitm8wONl7jltx8dqhfU33DcqtOZcLSVIKSDDLDi7+0LbAKiyI8hD9u42m2YxXSkMGWThaecQ==} + engines: {iojs: '>= 1.0.0', node: '>= 0.12.0'} + dev: false + + /color-convert@2.0.1: + resolution: {integrity: sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==} + engines: {node: '>=7.0.0'} + dependencies: + color-name: 1.1.4 + + /color-name@1.1.4: + resolution: {integrity: sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==} + + /colorette@2.0.19: + resolution: {integrity: sha512-3tlv/dIP7FWvj3BsbHrGLJ6l/oKh1O3TcgBqMn+yyCagOxc23fyzDS6HypQbgxWbkpDnf52p1LuR4eWDQ/K9WQ==} + dev: true + + /combined-stream@1.0.8: + resolution: {integrity: sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==} + engines: {node: '>= 0.8'} + dependencies: + delayed-stream: 1.0.0 + dev: false + + /commander@2.20.3: + resolution: {integrity: sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==} + + /commander@7.2.0: + resolution: {integrity: sha512-QrWXB+ZQSVPmIWIhtEO9H+gwHaMGYiF5ChvoJ+K9ZGHG/sVsa6yiesAD1GC/x46sET00Xlwo1u49RVVVzvcSkw==} + engines: {node: '>= 10'} + dev: true + + /compressible@2.0.18: + resolution: {integrity: sha512-AF3r7P5dWxL8MxyITRMlORQNaOA2IkAFaTr4k7BUumjPtRpGDTZpl0Pb1XCO6JeDCBdp126Cgs9sMxqSjgYyRg==} + engines: {node: '>= 0.6'} + dependencies: + mime-db: 1.52.0 + dev: true + + /compression@1.7.4: + resolution: {integrity: sha512-jaSIDzP9pZVS4ZfQ+TzvtiWhdpFhE2RDHz8QJkpX9SIpLq88VueF5jJw6t+6CUQcAoA6t+x89MLrWAqpfDE8iQ==} + engines: {node: '>= 0.8.0'} + dependencies: + accepts: 1.3.8 + bytes: 3.0.0 + compressible: 2.0.18 + debug: 2.6.9 + on-headers: 1.0.2 + safe-buffer: 5.1.2 + vary: 1.1.2 + transitivePeerDependencies: + - supports-color + dev: true + + /concat-map@0.0.1: + resolution: {integrity: sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==} + dev: true + + /connect-history-api-fallback@2.0.0: + resolution: {integrity: sha512-U73+6lQFmfiNPrYbXqr6kZ1i1wiRqXnp2nhMsINseWXO8lDau0LGEffJ8kQi4EjLZympVgRdvqjAgiZ1tgzDDA==} + engines: {node: '>=0.8'} + dev: true + + /content-disposition@0.5.4: + resolution: {integrity: sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ==} + engines: {node: '>= 0.6'} + dependencies: + safe-buffer: 5.2.1 + + /content-type@1.0.5: + resolution: {integrity: sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA==} + engines: {node: '>= 0.6'} + + /cookie-signature@1.0.6: + resolution: {integrity: sha512-QADzlaHc8icV8I7vbaJXJwod9HWYp8uCqf1xa4OfNu1T7JVxQIrUgOWtHdNDtPiywmFbiS12VjotIXLrKM3orQ==} + dev: true + + /cookie@0.6.0: + resolution: {integrity: sha512-U71cyTamuh1CRNCfpGY6to28lxvNwPG4Guz/EVjgf3Jmzv0vlDp1atT9eS5dDjMYHucpHbWns6Lwf3BKz6svdw==} + engines: {node: '>= 0.6'} + dev: true + + /cookies@0.8.0: + resolution: {integrity: sha512-8aPsApQfebXnuI+537McwYsDtjVxGm8gTIzQI3FDW6t5t/DAhERxtnbEPN/8RX+uZthoz4eCOgloXaE5cYyNow==} + engines: {node: '>= 0.8'} + dependencies: + depd: 2.0.0 + keygrip: 1.1.0 + dev: false + + /core-util-is@1.0.3: + resolution: {integrity: sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==} + dev: true + + /cron-parser@4.9.0: + resolution: {integrity: sha512-p0SaNjrHOnQeR8/VnfGbmg9te2kfyYSQ7Sc/j/6DtPL3JQvKxmjO9TSjNFpujqV3vEYYBvNNvXSxzyksBWAx1Q==} + engines: {node: '>=12.0.0'} + dependencies: + luxon: 3.4.4 + dev: false + + /cross-spawn@7.0.3: + resolution: {integrity: sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==} + engines: {node: '>= 8'} + dependencies: + path-key: 3.1.1 + shebang-command: 2.0.0 + which: 2.0.2 + dev: true + + /csstype@3.1.3: + resolution: {integrity: sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw==} + dev: true + + /date-format@4.0.14: + resolution: {integrity: sha512-39BOQLs9ZjKh0/patS9nrT8wc3ioX3/eA/zgbKNopnF2wCqJEoxywwwElATYvRsXdnOxA/OQeQoFZ3rFjVajhg==} + engines: {node: '>=4.0'} + dev: false + + /debug@2.6.9: + resolution: {integrity: sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==} + peerDependencies: + supports-color: '*' + peerDependenciesMeta: + supports-color: + optional: true + dependencies: + ms: 2.0.0 + dev: true + + /debug@3.1.0: + resolution: {integrity: sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==} + peerDependencies: + supports-color: '*' + peerDependenciesMeta: + supports-color: + optional: true + dependencies: + ms: 2.0.0 + dev: false + + /debug@4.3.5: + resolution: {integrity: sha512-pt0bNEmneDIvdL1Xsd9oDQ/wrQRkXDT4AUWlNZNPKvW5x/jyO9VFXkJUP07vQ2upmw5PlaITaPKc31jK13V+jg==} + engines: {node: '>=6.0'} + peerDependencies: + supports-color: '*' + peerDependenciesMeta: + supports-color: + optional: true + dependencies: + ms: 2.1.2 + + /deep-equal@1.0.1: + resolution: {integrity: sha512-bHtC0iYvWhyaTzvV3CZgPeZQqCOBGyGsVV7v4eevpdkLHfiSrXUdBG+qAuSz4RI70sszvjQ1QSZ98An1yNwpSw==} + dev: false + + /default-browser-id@5.0.0: + resolution: {integrity: sha512-A6p/pu/6fyBcA1TRz/GqWYPViplrftcW2gZC9q79ngNCKAeR/X3gcEdXQHl4KNXV+3wgIJ1CPkJQ3IHM6lcsyA==} + engines: {node: '>=18'} + dev: false + + /default-browser@5.2.1: + resolution: {integrity: sha512-WY/3TUME0x3KPYdRRxEJJvXRHV4PyPoUsxtZa78lwItwRQRHhd2U9xOscaT/YTf8uCXIAjeJOFBVEh/7FtD8Xg==} + engines: {node: '>=18'} + dependencies: + bundle-name: 4.1.0 + default-browser-id: 5.0.0 + dev: false + + /default-gateway@6.0.3: + resolution: {integrity: sha512-fwSOJsbbNzZ/CUFpqFBqYfYNLj1NbMPm8MMCIzHjC83iSJRBEGmDUxU+WP661BaBQImeC2yHwXtz+P/O9o+XEg==} + engines: {node: '>= 10'} + dependencies: + execa: 5.1.1 + dev: true + + /define-data-property@1.1.4: + resolution: {integrity: sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A==} + engines: {node: '>= 0.4'} + dependencies: + es-define-property: 1.0.0 + es-errors: 1.3.0 + gopd: 1.0.1 + dev: true + + /define-lazy-prop@2.0.0: + resolution: {integrity: sha512-Ds09qNh8yw3khSjiJjiUInaGX9xlqZDY7JVryGxdxV7NPeuqQfplOpQ66yJFZut3jLa5zOwkXw1g9EI2uKh4Og==} + engines: {node: '>=8'} + dev: true + + /define-lazy-prop@3.0.0: + resolution: {integrity: sha512-N+MeXYoqr3pOgn8xfyRPREN7gHakLYjhsHhWGT3fWAiL4IkAt0iDw14QiiEm2bE30c5XX5q0FtAA3CK5f9/BUg==} + engines: {node: '>=12'} + dev: false + + /delayed-stream@1.0.0: + resolution: {integrity: sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==} + engines: {node: '>=0.4.0'} + dev: false + + /delegates@1.0.0: + resolution: {integrity: sha512-bd2L678uiWATM6m5Z1VzNCErI3jiGzt6HGY8OVICs40JQq/HALfbyNJmp0UDakEY4pMMaN0Ly5om/B1VI/+xfQ==} + dev: false + + /depd@1.1.2: + resolution: {integrity: sha512-7emPTl6Dpo6JRXOXjLRxck+FlLRX5847cLKEn00PLAgc3g2hTZZgr+e4c2v6QpSmLeFP3n5yUo7ft6avBK/5jQ==} + engines: {node: '>= 0.6'} + + /depd@2.0.0: + resolution: {integrity: sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==} + engines: {node: '>= 0.8'} + + /destroy@1.2.0: + resolution: {integrity: sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg==} + engines: {node: '>= 0.8', npm: 1.2.8000 || >= 1.4.16} + + /detect-node@2.1.0: + resolution: {integrity: sha512-T0NIuQpnTvFDATNuHN5roPwSBG83rFsuO+MXXH9/3N1eFbn4wcPjttvjMLEPWJ0RGUYgQE7cGgS3tNxbqCGM7g==} + dev: true + + /dns-packet@5.6.1: + resolution: {integrity: sha512-l4gcSouhcgIKRvyy99RNVOgxXiicE+2jZoNmaNmZ6JXiGajBOJAesk1OBlJuM5k2c+eudGdLxDqXuPCKIj6kpw==} + engines: {node: '>=6'} + dependencies: + '@leichtgewicht/ip-codec': 2.0.5 + dev: true + + /duplexer@0.1.2: + resolution: {integrity: sha512-jtD6YG370ZCIi/9GTaJKQxWTZD045+4R4hTk/x1UyoqadyJ9x9CgSi1RlVDQF8U2sxLLSnFkCaMihqljHIWgMg==} + dev: true + + /ee-first@1.1.1: + resolution: {integrity: sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==} + + /electron-to-chromium@1.4.816: + resolution: {integrity: sha512-EKH5X5oqC6hLmiS7/vYtZHZFTNdhsYG5NVPRN6Yn0kQHNBlT59+xSM8HBy66P5fxWpKgZbPqb+diC64ng295Jw==} + + /emoji-regex@8.0.0: + resolution: {integrity: sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==} + dev: true + + /encodeurl@1.0.2: + resolution: {integrity: sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w==} + engines: {node: '>= 0.8'} + + /engine.io-client@6.5.4: + resolution: {integrity: sha512-GeZeeRjpD2qf49cZQ0Wvh/8NJNfeXkXXcoGh+F77oEAgo9gUHwT1fCRxSNU+YEEaysOJTnsFHmM5oAcPy4ntvQ==} + dependencies: + '@socket.io/component-emitter': 3.1.2 + debug: 4.3.5 + engine.io-parser: 5.2.2 + ws: 8.17.1 + xmlhttprequest-ssl: 2.0.0 + transitivePeerDependencies: + - bufferutil + - supports-color + - utf-8-validate + dev: false + + /engine.io-parser@5.2.2: + resolution: {integrity: sha512-RcyUFKA93/CXH20l4SoVvzZfrSDMOTUS3bWVpTt2FuFP+XYrL8i8oonHP7WInRyVHXh0n/ORtoeiE1os+8qkSw==} + engines: {node: '>=10.0.0'} + dev: false + + /enhanced-resolve@5.17.0: + resolution: {integrity: sha512-dwDPwZL0dmye8Txp2gzFmA6sxALaSvdRDjPH0viLcKrtlOL3tw62nWWweVD1SdILDTJrbrL6tdWVN58Wo6U3eA==} + engines: {node: '>=10.13.0'} + dependencies: + graceful-fs: 4.2.11 + tapable: 2.2.1 + + /error-inject@1.0.0: + resolution: {integrity: sha512-JM8N6PytDbmIYm1IhPWlo8vr3NtfjhDY/1MhD/a5b/aad/USE8a0+NsqE9d5n+GVGmuNkPQWm4bFQWv18d8tMg==} + dev: false + + /es-define-property@1.0.0: + resolution: {integrity: sha512-jxayLKShrEqqzJ0eumQbVhTYQM27CfT1T35+gCgDFoL82JLsXqTJ76zv6A0YLOgEnLUMvLzsDsGIrl8NFpT2gQ==} + engines: {node: '>= 0.4'} + dependencies: + get-intrinsic: 1.2.4 + dev: true + + /es-errors@1.3.0: + resolution: {integrity: sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==} + engines: {node: '>= 0.4'} + dev: true + + /es-module-lexer@1.5.4: + resolution: {integrity: sha512-MVNK56NiMrOwitFB7cqDwq0CQutbw+0BvLshJSse0MUNU+y1FC3bUS/AQg7oUng+/wKrrki7JfmwtVHkVfPLlw==} + + /escalade@3.1.2: + resolution: {integrity: sha512-ErCHMCae19vR8vQGe50xIsVomy19rg6gFu3+r3jkEO46suLMWBksvVyoGgQV+jOfl84ZSOSlmv6Gxa89PmTGmA==} + engines: {node: '>=6'} + + /escape-html@1.0.3: + resolution: {integrity: sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==} + + /eslint-scope@5.1.1: + resolution: {integrity: sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==} + engines: {node: '>=8.0.0'} + dependencies: + esrecurse: 4.3.0 + estraverse: 4.3.0 + + /esrecurse@4.3.0: + resolution: {integrity: sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==} + engines: {node: '>=4.0'} + dependencies: + estraverse: 5.3.0 + + /estraverse@4.3.0: + resolution: {integrity: sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==} + engines: {node: '>=4.0'} + + /estraverse@5.3.0: + resolution: {integrity: sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==} + engines: {node: '>=4.0'} + + /etag@1.8.1: + resolution: {integrity: sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==} + engines: {node: '>= 0.6'} + dev: true + + /eventemitter3@4.0.7: + resolution: {integrity: sha512-8guHBZCwKnFhYdHr2ysuRWErTwhoN2X8XELRlrRwpmfeY2jjuUN4taQMsULKUVo1K4DvZl+0pgfyoysHxvmvEw==} + dev: true + + /events@3.3.0: + resolution: {integrity: sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==} + engines: {node: '>=0.8.x'} + + /execa@5.1.1: + resolution: {integrity: sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==} + engines: {node: '>=10'} + dependencies: + cross-spawn: 7.0.3 + get-stream: 6.0.1 + human-signals: 2.1.0 + is-stream: 2.0.1 + merge-stream: 2.0.0 + npm-run-path: 4.0.1 + onetime: 5.1.2 + signal-exit: 3.0.7 + strip-final-newline: 2.0.0 + dev: true + + /exit-hook@3.2.0: + resolution: {integrity: sha512-aIQN7Q04HGAV/I5BszisuHTZHXNoC23WtLkxdCLuYZMdWviRD0TMIt2bnUBi9MrHaF/hH8b3gwG9iaAUHKnJGA==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + dev: true + + /expand-tilde@2.0.2: + resolution: {integrity: sha512-A5EmesHW6rfnZ9ysHQjPdJRni0SRar0tjtG5MNtm9n5TUvsYU8oozprtRD4AqHxcZWWlVuAmQo2nWKfN9oyjTw==} + engines: {node: '>=0.10.0'} + dependencies: + homedir-polyfill: 1.0.3 + dev: false + + /express@4.19.2: + resolution: {integrity: sha512-5T6nhjsT+EOMzuck8JjBHARTHfMht0POzlA60WV2pMD3gyXw2LZnZ+ueGdNxG+0calOJcWKbpFcuzLZ91YWq9Q==} + engines: {node: '>= 0.10.0'} + dependencies: + accepts: 1.3.8 + array-flatten: 1.1.1 + body-parser: 1.20.2 + content-disposition: 0.5.4 + content-type: 1.0.5 + cookie: 0.6.0 + cookie-signature: 1.0.6 + debug: 2.6.9 + depd: 2.0.0 + encodeurl: 1.0.2 + escape-html: 1.0.3 + etag: 1.8.1 + finalhandler: 1.2.0 + fresh: 0.5.2 + http-errors: 2.0.0 + merge-descriptors: 1.0.1 + methods: 1.1.2 + on-finished: 2.4.1 + parseurl: 1.3.3 + path-to-regexp: 0.1.7 + proxy-addr: 2.0.7 + qs: 6.11.0 + range-parser: 1.2.1 + safe-buffer: 5.2.1 + send: 0.18.0 + serve-static: 1.15.0 + setprototypeof: 1.2.0 + statuses: 2.0.1 + type-is: 1.6.18 + utils-merge: 1.0.1 + vary: 1.1.2 + transitivePeerDependencies: + - supports-color + dev: true + + /fast-deep-equal@3.1.3: + resolution: {integrity: sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==} + + /fast-json-stable-stringify@2.1.0: + resolution: {integrity: sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==} + + /faye-websocket@0.11.4: + resolution: {integrity: sha512-CzbClwlXAuiRQAlUyfqPgvPoNKTckTPGfwZV4ZdAhVcP2lh9KUxJg2b5GkE7XbjKQ3YJnQ9z6D9ntLAlB+tP8g==} + engines: {node: '>=0.8.0'} + dependencies: + websocket-driver: 0.7.4 + dev: true + + /fill-range@7.1.1: + resolution: {integrity: sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==} + engines: {node: '>=8'} + dependencies: + to-regex-range: 5.0.1 + dev: true + + /finalhandler@1.2.0: + resolution: {integrity: sha512-5uXcUVftlQMFnWC9qu/svkWv3GTd2PfUhK/3PLkYNAe7FbqJMt3515HaxE6eRL74GdsriiwujiawdaB1BpEISg==} + engines: {node: '>= 0.8'} + dependencies: + debug: 2.6.9 + encodeurl: 1.0.2 + escape-html: 1.0.3 + on-finished: 2.4.1 + parseurl: 1.3.3 + statuses: 2.0.1 + unpipe: 1.0.0 + transitivePeerDependencies: + - supports-color + dev: true + + /find-file-up@2.0.1: + resolution: {integrity: sha512-qVdaUhYO39zmh28/JLQM5CoYN9byEOKEH4qfa8K1eNV17W0UUMJ9WgbR/hHFH+t5rcl+6RTb5UC7ck/I+uRkpQ==} + engines: {node: '>=8'} + dependencies: + resolve-dir: 1.0.1 + dev: false + + /find-package-json@1.2.0: + resolution: {integrity: sha512-+SOGcLGYDJHtyqHd87ysBhmaeQ95oWspDKnMXBrnQ9Eq4OkLNqejgoaD8xVWu6GPa0B6roa6KinCMEMcVeqONw==} + dev: false + + /find-pkg@2.0.0: + resolution: {integrity: sha512-WgZ+nKbELDa6N3i/9nrHeNznm+lY3z4YfhDDWgW+5P0pdmMj26bxaxU11ookgY3NyP9GC7HvZ9etp0jRFqGEeQ==} + engines: {node: '>=8'} + dependencies: + find-file-up: 2.0.1 + dev: false + + /flatted@3.3.1: + resolution: {integrity: sha512-X8cqMLLie7KsNUDSdzeN8FYK9rEt4Dt67OsG/DNGnYTSDBG4uFAJFBnUeiV+zCVAvwFy56IjM9sH51jVaEhNxw==} + dev: false + + /follow-redirects@1.15.6: + resolution: {integrity: sha512-wWN62YITEaOpSK584EZXJafH1AGpO8RVgElfkuXbTOrPX4fIfOyEpW/CsiNd8JdYrAoOvafRTOEnvsO++qCqFA==} + engines: {node: '>=4.0'} + peerDependencies: + debug: '*' + peerDependenciesMeta: + debug: + optional: true + + /form-data@4.0.0: + resolution: {integrity: sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww==} + engines: {node: '>= 6'} + dependencies: + asynckit: 0.4.0 + combined-stream: 1.0.8 + mime-types: 2.1.35 + dev: false + + /forwarded@0.2.0: + resolution: {integrity: sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==} + engines: {node: '>= 0.6'} + dev: true + + /fresh@0.5.2: + resolution: {integrity: sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q==} + engines: {node: '>= 0.6'} + + /fs-extra@8.1.0: + resolution: {integrity: sha512-yhlQgA6mnOJUKOsRUFsgJdQCvkKhcz8tlZG5HBQfReYZy46OwLcY+Zia0mtdHsOo9y/hP+CxMN0TU9QxoOtG4g==} + engines: {node: '>=6 <7 || >=8'} + dependencies: + graceful-fs: 4.2.11 + jsonfile: 4.0.0 + universalify: 0.1.2 + dev: false + + /fs-extra@9.1.0: + resolution: {integrity: sha512-hcg3ZmepS30/7BSFqRvoo3DOMQu7IjqxO5nCDt+zM9XWjb33Wg7ziNT+Qvqbuc3+gWpzO02JubVyk2G4Zvo1OQ==} + engines: {node: '>=10'} + dependencies: + at-least-node: 1.0.0 + graceful-fs: 4.2.11 + jsonfile: 6.1.0 + universalify: 2.0.1 + dev: false + + /fs-monkey@1.0.6: + resolution: {integrity: sha512-b1FMfwetIKymC0eioW7mTywihSQE4oLzQn1dB6rZB5fx/3NpNEdAWeCSMB+60/AeT0TCXsxzAlcYVEFCTAksWg==} + dev: true + + /fs.realpath@1.0.0: + resolution: {integrity: sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==} + dev: true + + /fsevents@2.3.3: + resolution: {integrity: sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==} + engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0} + os: [darwin] + requiresBuild: true + dev: true + optional: true + + /function-bind@1.1.2: + resolution: {integrity: sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==} + + /get-caller-file@2.0.5: + resolution: {integrity: sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==} + engines: {node: 6.* || 8.* || >= 10.*} + dev: true + + /get-intrinsic@1.2.4: + resolution: {integrity: sha512-5uYhsJH8VJBTv7oslg4BznJYhDoRI6waYCxMmCdnTrcCrHA/fCFKoTFz2JKKE0HdDFUF7/oQuhzumXJK7paBRQ==} + engines: {node: '>= 0.4'} + dependencies: + es-errors: 1.3.0 + function-bind: 1.1.2 + has-proto: 1.0.3 + has-symbols: 1.0.3 + hasown: 2.0.2 + dev: true + + /get-stream@6.0.1: + resolution: {integrity: sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==} + engines: {node: '>=10'} + dev: true + + /glob-parent@5.1.2: + resolution: {integrity: sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==} + engines: {node: '>= 6'} + dependencies: + is-glob: 4.0.3 + dev: true + + /glob-to-regexp@0.4.1: + resolution: {integrity: sha512-lkX1HJXwyMcprw/5YUZc2s7DrpAiHB21/V+E1rHUrVNokkvB6bqMzT0VfV6/86ZNabt1k14YOIaT7nDvOX3Iiw==} + + /glob@7.2.3: + resolution: {integrity: sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==} + deprecated: Glob versions prior to v9 are no longer supported + dependencies: + fs.realpath: 1.0.0 + inflight: 1.0.6 + inherits: 2.0.4 + minimatch: 3.1.2 + once: 1.4.0 + path-is-absolute: 1.0.1 + dev: true + + /global-modules@1.0.0: + resolution: {integrity: sha512-sKzpEkf11GpOFuw0Zzjzmt4B4UZwjOcG757PPvrfhxcLFbq0wpsgpOqxpxtxFiCG4DtG93M6XRVbF2oGdev7bg==} + engines: {node: '>=0.10.0'} + dependencies: + global-prefix: 1.0.2 + is-windows: 1.0.2 + resolve-dir: 1.0.1 + dev: false + + /global-prefix@1.0.2: + resolution: {integrity: sha512-5lsx1NUDHtSjfg0eHlmYvZKv8/nVqX4ckFbM+FrGcQ+04KWcWFo9P5MxPZYSzUvyzmdTbI7Eix8Q4IbELDqzKg==} + engines: {node: '>=0.10.0'} + dependencies: + expand-tilde: 2.0.2 + homedir-polyfill: 1.0.3 + ini: 1.3.8 + is-windows: 1.0.2 + which: 1.3.1 + dev: false + + /gopd@1.0.1: + resolution: {integrity: sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA==} + dependencies: + get-intrinsic: 1.2.4 + dev: true + + /graceful-fs@4.2.11: + resolution: {integrity: sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==} + + /gzip-size@6.0.0: + resolution: {integrity: sha512-ax7ZYomf6jqPTQ4+XCpUGyXKHk5WweS+e05MBO4/y3WJ5RkmPXNKvX+bx1behVILVwr6JSQvZAku021CHPXG3Q==} + engines: {node: '>=10'} + dependencies: + duplexer: 0.1.2 + dev: true + + /handle-thing@2.0.1: + resolution: {integrity: sha512-9Qn4yBxelxoh2Ow62nP+Ka/kMnOXRi8BXnRaUwezLNhqelnN49xKz4F/dPP8OYLxLxq6JDtZb2i9XznUQbNPTg==} + dev: true + + /has-flag@4.0.0: + resolution: {integrity: sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==} + engines: {node: '>=8'} + + /has-property-descriptors@1.0.2: + resolution: {integrity: sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg==} + dependencies: + es-define-property: 1.0.0 + dev: true + + /has-proto@1.0.3: + resolution: {integrity: sha512-SJ1amZAJUiZS+PhsVLf5tGydlaVB8EdFpaSO4gmiUKUOxk8qzn5AIy4ZeJUmh22znIdk/uMAUT2pl3FxzVUH+Q==} + engines: {node: '>= 0.4'} + dev: true + + /has-symbols@1.0.3: + resolution: {integrity: sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==} + engines: {node: '>= 0.4'} + + /has-tostringtag@1.0.2: + resolution: {integrity: sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==} + engines: {node: '>= 0.4'} + dependencies: + has-symbols: 1.0.3 + dev: false + + /hasown@2.0.2: + resolution: {integrity: sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==} + engines: {node: '>= 0.4'} + dependencies: + function-bind: 1.1.2 + + /homedir-polyfill@1.0.3: + resolution: {integrity: sha512-eSmmWE5bZTK2Nou4g0AI3zZ9rswp7GRKoKXS1BLUkvPviOqs4YTN1djQIqrXy9k5gEtdLPy86JjRwsNM9tnDcA==} + engines: {node: '>=0.10.0'} + dependencies: + parse-passwd: 1.0.0 + dev: false + + /hpack.js@2.1.6: + resolution: {integrity: sha512-zJxVehUdMGIKsRaNt7apO2Gqp0BdqW5yaiGHXXmbpvxgBYVZnAql+BJb4RO5ad2MgpbZKn5G6nMnegrH1FcNYQ==} + dependencies: + inherits: 2.0.4 + obuf: 1.1.2 + readable-stream: 2.3.8 + wbuf: 1.7.3 + dev: true + + /html-entities@2.5.2: + resolution: {integrity: sha512-K//PSRMQk4FZ78Kyau+mZurHn3FH0Vwr+H36eE0rPbeYkRRi9YxceYPhuN60UwWorxyKHhqoAJl2OFKa4BVtaA==} + dev: true + + /http-assert@1.5.0: + resolution: {integrity: sha512-uPpH7OKX4H25hBmU6G1jWNaqJGpTXxey+YOUizJUAgu0AjLUeC8D73hTrhvDS5D+GJN1DN1+hhc/eF/wpxtp0w==} + engines: {node: '>= 0.8'} + dependencies: + deep-equal: 1.0.1 + http-errors: 1.8.1 + dev: false + + /http-deceiver@1.2.7: + resolution: {integrity: sha512-LmpOGxTfbpgtGVxJrj5k7asXHCgNZp5nLfp+hWc8QQRqtb7fUy6kRY3BO1h9ddF6yIPYUARgxGOwB42DnxIaNw==} + dev: true + + /http-errors@1.6.3: + resolution: {integrity: sha512-lks+lVC8dgGyh97jxvxeYTWQFvh4uw4yC12gVl63Cg30sjPX4wuGcdkICVXDAESr6OJGjqGA8Iz5mkeN6zlD7A==} + engines: {node: '>= 0.6'} + dependencies: + depd: 1.1.2 + inherits: 2.0.3 + setprototypeof: 1.1.0 + statuses: 1.5.0 + dev: true + + /http-errors@1.8.1: + resolution: {integrity: sha512-Kpk9Sm7NmI+RHhnj6OIWDI1d6fIoFAtFt9RLaTMRlg/8w49juAStsrBgp0Dp4OdxdVbRIeKhtCUvoi/RuAhO4g==} + engines: {node: '>= 0.6'} + dependencies: + depd: 1.1.2 + inherits: 2.0.4 + setprototypeof: 1.2.0 + statuses: 1.5.0 + toidentifier: 1.0.1 + dev: false + + /http-errors@2.0.0: + resolution: {integrity: sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==} + engines: {node: '>= 0.8'} + dependencies: + depd: 2.0.0 + inherits: 2.0.4 + setprototypeof: 1.2.0 + statuses: 2.0.1 + toidentifier: 1.0.1 + dev: true + + /http-parser-js@0.5.8: + resolution: {integrity: sha512-SGeBX54F94Wgu5RH3X5jsDtf4eHyRogWX1XGT3b4HuW3tQPM4AaBzoUji/4AAJNXCEOWZ5O0DgZmJw1947gD5Q==} + dev: true + + /http-proxy-middleware@2.0.6(@types/express@4.17.21): + resolution: {integrity: sha512-ya/UeJ6HVBYxrgYotAZo1KvPWlgB48kUJLDePFeneHsVujFaW5WNj2NgWCAE//B1Dl02BIfYlpNgBy8Kf8Rjmw==} + engines: {node: '>=12.0.0'} + peerDependencies: + '@types/express': ^4.17.13 + peerDependenciesMeta: + '@types/express': + optional: true + dependencies: + '@types/express': 4.17.21 + '@types/http-proxy': 1.17.14 + http-proxy: 1.18.1 + is-glob: 4.0.3 + is-plain-obj: 3.0.0 + micromatch: 4.0.7 + transitivePeerDependencies: + - debug + dev: true + + /http-proxy@1.18.1: + resolution: {integrity: sha512-7mz/721AbnJwIVbnaSv1Cz3Am0ZLT/UBwkC92VlxhXv/k/BBQfM2fXElQNC27BVGr0uwUpplYPQM9LnaBMR5NQ==} + engines: {node: '>=8.0.0'} + dependencies: + eventemitter3: 4.0.7 + follow-redirects: 1.15.6 + requires-port: 1.0.0 + transitivePeerDependencies: + - debug + dev: true + + /human-signals@2.1.0: + resolution: {integrity: sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==} + engines: {node: '>=10.17.0'} + dev: true + + /iconv-lite@0.4.24: + resolution: {integrity: sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==} + engines: {node: '>=0.10.0'} + dependencies: + safer-buffer: 2.1.2 + dev: true + + /inflight@1.0.6: + resolution: {integrity: sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==} + deprecated: This module is not supported, and leaks memory. Do not use it. Check out lru-cache if you want a good and tested way to coalesce async requests by a key value, which is much more comprehensive and powerful. + dependencies: + once: 1.4.0 + wrappy: 1.0.2 + dev: true + + /inherits@2.0.3: + resolution: {integrity: sha512-x00IRNXNy63jwGkJmzPigoySHbaqpNuzKbBOmzK+g2OdZpQ9w+sxCN+VSB3ja7IAge2OP2qpfxTjeNcyjmW1uw==} + dev: true + + /inherits@2.0.4: + resolution: {integrity: sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==} + + /ini@1.3.8: + resolution: {integrity: sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==} + dev: false + + /interpret@3.1.1: + resolution: {integrity: sha512-6xwYfHbajpoF0xLW+iwLkhwgvLoZDfjYfoFNu8ftMoXINzwuymNLd9u/KmwtdT2GbR+/Cz66otEGEVVUHX9QLQ==} + engines: {node: '>=10.13.0'} + dev: true + + /ipaddr.js@1.9.1: + resolution: {integrity: sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==} + engines: {node: '>= 0.10'} + dev: true + + /ipaddr.js@2.2.0: + resolution: {integrity: sha512-Ag3wB2o37wslZS19hZqorUnrnzSkpOVy+IiiDEiTqNubEYpYuHWIf6K4psgN2ZWKExS4xhVCrRVfb/wfW8fWJA==} + engines: {node: '>= 10'} + dev: true + + /is-binary-path@2.1.0: + resolution: {integrity: sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==} + engines: {node: '>=8'} + dependencies: + binary-extensions: 2.3.0 + dev: true + + /is-ci@3.0.1: + resolution: {integrity: sha512-ZYvCgrefwqoQ6yTyYUbQu64HsITZ3NfKX1lzaEYdkTDcfKzzCI/wthRRYKkdjHKFVgNiXKAKm65Zo1pk2as/QQ==} + hasBin: true + dependencies: + ci-info: 3.9.0 + dev: false + + /is-core-module@2.14.0: + resolution: {integrity: sha512-a5dFJih5ZLYlRtDc0dZWP7RiKr6xIKzmn/oAYCDvdLThadVgyJwlaoQPmRtMSpz+rk0OGAgIu+TcM9HUF0fk1A==} + engines: {node: '>= 0.4'} + dependencies: + hasown: 2.0.2 + + /is-docker@2.2.1: + resolution: {integrity: sha512-F+i2BKsFrH66iaUFc0woD8sLy8getkwTwtOBjvs56Cx4CgJDeKQeqfz8wAYiSb8JOprWhHH5p77PbmYCvvUuXQ==} + engines: {node: '>=8'} + hasBin: true + dev: true + + /is-docker@3.0.0: + resolution: {integrity: sha512-eljcgEDlEns/7AXFosB5K/2nCM4P7FQPkGc/DWLy5rmFEWvZayGrik1d9/QIY5nJ4f9YsVvBkA6kJpHn9rISdQ==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + hasBin: true + dev: false + + /is-extglob@2.1.1: + resolution: {integrity: sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==} + engines: {node: '>=0.10.0'} + dev: true + + /is-fullwidth-code-point@3.0.0: + resolution: {integrity: sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==} + engines: {node: '>=8'} + dev: true + + /is-generator-function@1.0.10: + resolution: {integrity: sha512-jsEjy9l3yiXEQ+PsXdmBwEPcOxaXWLspKdplFUVI9vq1iZgIekeC0L167qeu86czQaxed3q/Uzuw0swL0irL8A==} + engines: {node: '>= 0.4'} + dependencies: + has-tostringtag: 1.0.2 + dev: false + + /is-glob@4.0.3: + resolution: {integrity: sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==} + engines: {node: '>=0.10.0'} + dependencies: + is-extglob: 2.1.1 + dev: true + + /is-inside-container@1.0.0: + resolution: {integrity: sha512-KIYLCCJghfHZxqjYBE7rEy0OBuTd5xCHS7tHVgvCLkx7StIoaxwNW3hCALgEUjFfeRk+MG/Qxmp/vtETEF3tRA==} + engines: {node: '>=14.16'} + hasBin: true + dependencies: + is-docker: 3.0.0 + dev: false + + /is-number@7.0.0: + resolution: {integrity: sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==} + engines: {node: '>=0.12.0'} + dev: true + + /is-plain-obj@3.0.0: + resolution: {integrity: sha512-gwsOE28k+23GP1B6vFl1oVh/WOzmawBrKwo5Ev6wMKzPkaXaCDIQKzLnvsA42DRlbVTWorkgTKIviAKCWkfUwA==} + engines: {node: '>=10'} + dev: true + + /is-stream@2.0.1: + resolution: {integrity: sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==} + engines: {node: '>=8'} + dev: true + + /is-windows@1.0.2: + resolution: {integrity: sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA==} + engines: {node: '>=0.10.0'} + dev: false + + /is-wsl@2.2.0: + resolution: {integrity: sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww==} + engines: {node: '>=8'} + dependencies: + is-docker: 2.2.1 + dev: true + + /is-wsl@3.1.0: + resolution: {integrity: sha512-UcVfVfaK4Sc4m7X3dUSoHoozQGBEFeDC+zVo06t98xe8CzHSZZBekNXH+tu0NalHolcJ/QAGqS46Hef7QXBIMw==} + engines: {node: '>=16'} + dependencies: + is-inside-container: 1.0.0 + dev: false + + /isarray@1.0.0: + resolution: {integrity: sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==} + dev: true + + /isexe@2.0.0: + resolution: {integrity: sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==} + + /isomorphic-ws@5.0.0(ws@8.17.1): + resolution: {integrity: sha512-muId7Zzn9ywDsyXgTIafTry2sV3nySZeUDe6YedVd1Hvuuep5AsIlqK+XefWpYTyJG5e503F2xIuT2lcU6rCSw==} + peerDependencies: + ws: '*' + dependencies: + ws: 8.17.1 + dev: false + + /jest-worker@27.5.1: + resolution: {integrity: sha512-7vuh85V5cdDofPyxn58nrPjBktZo0u9x1g8WtjQol+jZDaE+fhN+cIvTj11GndBnMnyfrUOG1sZQxCdjKh+DKg==} + engines: {node: '>= 10.13.0'} + dependencies: + '@types/node': 20.14.9 + merge-stream: 2.0.0 + supports-color: 8.1.1 + + /jose@5.6.2: + resolution: {integrity: sha512-F1t1/WZJ4JdmCE/XoMYw1dPOW5g8JF0xGm6Ox2fwaCAPlCzt+4Bh0EWP59iQuZNHHauDkCdjx+kCZSh5z/PGow==} + dev: false + + /js-tokens@4.0.0: + resolution: {integrity: sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==} + dev: false + + /json-parse-even-better-errors@2.3.1: + resolution: {integrity: sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==} + + /json-schema-traverse@0.4.1: + resolution: {integrity: sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==} + + /json-schema-traverse@1.0.0: + resolution: {integrity: sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==} + dev: true + + /jsonfile@4.0.0: + resolution: {integrity: sha512-m6F1R3z8jjlf2imQHS2Qez5sjKWQzbuuhuJ/FKYFRZvPE3PuHcSMVZzfsLhGVOkfd20obL5SWEBew5ShlquNxg==} + optionalDependencies: + graceful-fs: 4.2.11 + dev: false + + /jsonfile@6.1.0: + resolution: {integrity: sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==} + dependencies: + universalify: 2.0.1 + optionalDependencies: + graceful-fs: 4.2.11 + dev: false + + /keygrip@1.1.0: + resolution: {integrity: sha512-iYSchDJ+liQ8iwbSI2QqsQOvqv58eJCEanyJPJi+Khyu8smkcKSFUCbPwzFcL7YVtZ6eONjqRX/38caJ7QjRAQ==} + engines: {node: '>= 0.6'} + dependencies: + tsscmp: 1.0.6 + dev: false + + /koa-compose@3.2.1: + resolution: {integrity: sha512-8gen2cvKHIZ35eDEik5WOo8zbVp9t4cP8p4hW4uE55waxolLRexKKrqfCpwhGVppnB40jWeF8bZeTVg99eZgPw==} + dependencies: + any-promise: 1.3.0 + dev: false + + /koa-compose@4.1.0: + resolution: {integrity: sha512-8ODW8TrDuMYvXRwra/Kh7/rJo9BtOfPc6qO8eAfC80CnCvSjSl0bkRM24X6/XBBEyj0v1nRUQ1LyOy3dbqOWXw==} + dev: false + + /koa-convert@1.2.0: + resolution: {integrity: sha512-K9XqjmEDStGX09v3oxR7t5uPRy0jqJdvodHa6wxWTHrTfDq0WUNnYTOOUZN6g8OM8oZQXprQASbiIXG2Ez8ehA==} + engines: {node: '>= 4'} + dependencies: + co: 4.6.0 + koa-compose: 3.2.1 + dev: false + + /koa@2.11.0: + resolution: {integrity: sha512-EpR9dElBTDlaDgyhDMiLkXrPwp6ZqgAIBvhhmxQ9XN4TFgW+gEz6tkcsNI6BnUbUftrKDjVFj4lW2/J2aNBMMA==} + engines: {node: ^4.8.4 || ^6.10.1 || ^7.10.1 || >= 8.1.4} + dependencies: + accepts: 1.3.8 + cache-content-type: 1.0.1 + content-disposition: 0.5.4 + content-type: 1.0.5 + cookies: 0.8.0 + debug: 3.1.0 + delegates: 1.0.0 + depd: 1.1.2 + destroy: 1.2.0 + encodeurl: 1.0.2 + error-inject: 1.0.0 + escape-html: 1.0.3 + fresh: 0.5.2 + http-assert: 1.5.0 + http-errors: 1.8.1 + is-generator-function: 1.0.10 + koa-compose: 4.1.0 + koa-convert: 1.2.0 + on-finished: 2.4.1 + only: 0.0.2 + parseurl: 1.3.3 + statuses: 1.5.0 + type-is: 1.6.18 + vary: 1.1.2 + transitivePeerDependencies: + - supports-color + dev: false + + /launch-editor@2.8.0: + resolution: {integrity: sha512-vJranOAJrI/llyWGRQqiDM+adrw+k83fvmmx3+nV47g3+36xM15jE+zyZ6Ffel02+xSvuM0b2GDRosXZkbb6wA==} + dependencies: + picocolors: 1.0.1 + shell-quote: 1.8.1 + dev: true + + /loader-runner@4.3.0: + resolution: {integrity: sha512-3R/1M+yS3j5ou80Me59j7F9IMs4PXs3VqRrm0TU3AbKPxlmpoY1TNscJV/oGJXo8qCatFGTfDbY6W6ipGOYXfg==} + engines: {node: '>=6.11.5'} + + /lodash.clonedeepwith@4.5.0: + resolution: {integrity: sha512-QRBRSxhbtsX1nc0baxSkkK5WlVTTm/s48DSukcGcWZwIyI8Zz+lB+kFiELJXtzfH4Aj6kMWQ1VWW4U5uUDgZMA==} + dev: false + + /lodash@4.17.21: + resolution: {integrity: sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==} + dev: true + + /log4js@6.9.1: + resolution: {integrity: sha512-1somDdy9sChrr9/f4UlzhdaGfDR2c/SaD2a4T7qEkG4jTS57/B3qmnjLYePwQ8cqWnUHZI0iAKxMBpCZICiZ2g==} + engines: {node: '>=8.0'} + dependencies: + date-format: 4.0.14 + debug: 4.3.5 + flatted: 3.3.1 + rfdc: 1.4.1 + streamroller: 3.1.5 + transitivePeerDependencies: + - supports-color + dev: false + + /long-timeout@0.1.1: + resolution: {integrity: sha512-BFRuQUqc7x2NWxfJBCyUrN8iYUYznzL9JROmRz1gZ6KlOIgmoD+njPVbb+VNn2nGMKggMsK79iUNErillsrx7w==} + dev: false + + /loose-envify@1.4.0: + resolution: {integrity: sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==} + hasBin: true + dependencies: + js-tokens: 4.0.0 + dev: false + + /luxon@3.4.4: + resolution: {integrity: sha512-zobTr7akeGHnv7eBOXcRgMeCP6+uyYsczwmeRCauvpvaAltgNyTbLH/+VaEAPUeWBT+1GuNmz4wC/6jtQzbbVA==} + engines: {node: '>=12'} + dev: false + + /media-typer@0.3.0: + resolution: {integrity: sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ==} + engines: {node: '>= 0.6'} + + /memfs@3.5.3: + resolution: {integrity: sha512-UERzLsxzllchadvbPs5aolHh65ISpKpM+ccLbOJ8/vvpBKmAWf+la7dXFy7Mr0ySHbdHrFv5kGFCUHHe6GFEmw==} + engines: {node: '>= 4.0.0'} + dependencies: + fs-monkey: 1.0.6 + dev: true + + /merge-descriptors@1.0.1: + resolution: {integrity: sha512-cCi6g3/Zr1iqQi6ySbseM1Xvooa98N0w31jzUYrXPX2xqObmFGHJ0tQ5u74H3mVh7wLouTseZyYIq39g8cNp1w==} + dev: true + + /merge-stream@2.0.0: + resolution: {integrity: sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==} + + /methods@1.1.2: + resolution: {integrity: sha512-iclAHeNqNm68zFtnZ0e+1L2yUIdvzNoauKU4WBA3VvH/vPFieF7qfRlwUZU+DA9P9bPXIS90ulxoUoCH23sV2w==} + engines: {node: '>= 0.6'} + dev: true + + /micromatch@4.0.7: + resolution: {integrity: sha512-LPP/3KorzCwBxfeUuZmaR6bG2kdeHSbe0P2tY3FLRU4vYrjYz5hI4QZwV0njUx3jeuKe67YukQ1LSPZBKDqO/Q==} + engines: {node: '>=8.6'} + dependencies: + braces: 3.0.3 + picomatch: 2.3.1 + dev: true + + /mime-db@1.52.0: + resolution: {integrity: sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==} + engines: {node: '>= 0.6'} + + /mime-types@2.1.35: + resolution: {integrity: sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==} + engines: {node: '>= 0.6'} + dependencies: + mime-db: 1.52.0 + + /mime@1.6.0: + resolution: {integrity: sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==} + engines: {node: '>=4'} + hasBin: true + dev: true + + /mimic-fn@2.1.0: + resolution: {integrity: sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==} + engines: {node: '>=6'} + dev: true + + /minimalistic-assert@1.0.1: + resolution: {integrity: sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A==} + dev: true + + /minimatch@3.1.2: + resolution: {integrity: sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==} + dependencies: + brace-expansion: 1.1.11 + dev: true + + /mrmime@1.0.1: + resolution: {integrity: sha512-hzzEagAgDyoU1Q6yg5uI+AorQgdvMCur3FcKf7NhMKWsaYg+RnbTyHRa/9IlLF9rf455MOCtcqqrQQ83pPP7Uw==} + engines: {node: '>=10'} + dev: true + + /ms@2.0.0: + resolution: {integrity: sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==} + + /ms@2.1.2: + resolution: {integrity: sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==} + + /ms@2.1.3: + resolution: {integrity: sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==} + dev: true + + /multicast-dns@7.2.5: + resolution: {integrity: sha512-2eznPJP8z2BFLX50tf0LuODrpINqP1RVIm/CObbTcBRITQgmC/TjcREF1NeTBzIcR5XO/ukWo+YHOjBbFwIupg==} + hasBin: true + dependencies: + dns-packet: 5.6.1 + thunky: 1.1.0 + dev: true + + /negotiator@0.6.3: + resolution: {integrity: sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==} + engines: {node: '>= 0.6'} + + /neo-async@2.6.2: + resolution: {integrity: sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==} + + /node-forge@1.3.1: + resolution: {integrity: sha512-dPEtOeMvF9VMcYV/1Wb8CPoVAXtp6MKMlcbAt4ddqmGqUJ6fQZFXkNZNkNlfevtNkGtaSoXf/vNNNSvgrdXwtA==} + engines: {node: '>= 6.13.0'} + dev: true + + /node-persist@4.0.1: + resolution: {integrity: sha512-QtRjwAlcOQChQpfG6odtEhxYmA3nS5XYr+bx9JRjwahl1TM3sm9J3CCn51/MI0eoHRb2DrkEsCOFo8sq8jG5sQ==} + engines: {node: '>=10.12.0'} + dev: false + + /node-releases@2.0.14: + resolution: {integrity: sha512-y10wOWt8yZpqXmOgRo77WaHEmhYQYGNA6y421PKsKYWEK8aW+cqAphborZDhqfyKrbZEN92CN1X2KbafY2s7Yw==} + + /node-schedule@2.1.1: + resolution: {integrity: sha512-OXdegQq03OmXEjt2hZP33W2YPs/E5BcFQks46+G2gAxs4gHOIVD1u7EqlYLYSKsaIpyKCK9Gbk0ta1/gjRSMRQ==} + engines: {node: '>=6'} + dependencies: + cron-parser: 4.9.0 + long-timeout: 0.1.1 + sorted-array-functions: 1.3.0 + dev: false + + /normalize-path@3.0.0: + resolution: {integrity: sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==} + engines: {node: '>=0.10.0'} + dev: true + + /npm-run-path@4.0.1: + resolution: {integrity: sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==} + engines: {node: '>=8'} + dependencies: + path-key: 3.1.1 + dev: true + + /object-inspect@1.13.2: + resolution: {integrity: sha512-IRZSRuzJiynemAXPYtPe5BoI/RESNYR7TYm50MC5Mqbd3Jmw5y790sErYw3V6SryFJD64b74qQQs9wn5Bg/k3g==} + engines: {node: '>= 0.4'} + dev: true + + /obuf@1.1.2: + resolution: {integrity: sha512-PX1wu0AmAdPqOL1mWhqmlOd8kOIZQwGZw6rh7uby9fTc5lhaOWFLX3I6R1hrF9k3zUY40e6igsLGkDXK92LJNg==} + dev: true + + /on-finished@2.4.1: + resolution: {integrity: sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==} + engines: {node: '>= 0.8'} + dependencies: + ee-first: 1.1.1 + + /on-headers@1.0.2: + resolution: {integrity: sha512-pZAE+FJLoyITytdqK0U5s+FIpjN0JP3OzFi/u8Rx+EV5/W+JTWGXG8xFzevE7AjBfDqHv/8vL8qQsIhHnqRkrA==} + engines: {node: '>= 0.8'} + dev: true + + /once@1.4.0: + resolution: {integrity: sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==} + dependencies: + wrappy: 1.0.2 + dev: true + + /onetime@5.1.2: + resolution: {integrity: sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==} + engines: {node: '>=6'} + dependencies: + mimic-fn: 2.1.0 + dev: true + + /only@0.0.2: + resolution: {integrity: sha512-Fvw+Jemq5fjjyWz6CpKx6w9s7xxqo3+JCyM0WXWeCSOboZ8ABkyvP8ID4CZuChA/wxSx+XSJmdOm8rGVyJ1hdQ==} + dev: false + + /open@10.1.0: + resolution: {integrity: sha512-mnkeQ1qP5Ue2wd+aivTD3NHd/lZ96Lu0jgf0pwktLPtx6cTZiH7tyeGRRHs0zX0rbrahXPnXlUnbeXyaBBuIaw==} + engines: {node: '>=18'} + dependencies: + default-browser: 5.2.1 + define-lazy-prop: 3.0.0 + is-inside-container: 1.0.0 + is-wsl: 3.1.0 + dev: false + + /open@8.4.2: + resolution: {integrity: sha512-7x81NCL719oNbsq/3mh+hVrAWmFuEYUqrq/Iw3kUzH8ReypT9QQ0BLoJS7/G9k6N81XjW4qHWtjWwe/9eLy1EQ==} + engines: {node: '>=12'} + dependencies: + define-lazy-prop: 2.0.0 + is-docker: 2.2.1 + is-wsl: 2.2.0 + dev: true + + /opener@1.5.2: + resolution: {integrity: sha512-ur5UIdyw5Y7yEj9wLzhqXiy6GZ3Mwx0yGI+5sMn2r0N0v3cKJvUmFH5yPP+WXh9e0xfyzyJX95D8l088DNFj7A==} + hasBin: true + dev: true + + /p-retry@4.6.2: + resolution: {integrity: sha512-312Id396EbJdvRONlngUx0NydfrIQ5lsYu0znKVUzVvArzEIt08V1qhtyESbGVd1FGX7UKtiFp5uwKZdM8wIuQ==} + engines: {node: '>=8'} + dependencies: + '@types/retry': 0.12.0 + retry: 0.13.1 + dev: true + + /parse-passwd@1.0.0: + resolution: {integrity: sha512-1Y1A//QUXEZK7YKz+rD9WydcE1+EuPr6ZBgKecAB8tmoW6UFv0NREVJe1p+jRxtThkcbbKkfwIbWJe/IeE6m2Q==} + engines: {node: '>=0.10.0'} + dev: false + + /parseurl@1.3.3: + resolution: {integrity: sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==} + engines: {node: '>= 0.8'} + + /path-is-absolute@1.0.1: + resolution: {integrity: sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==} + engines: {node: '>=0.10.0'} + dev: true + + /path-key@3.1.1: + resolution: {integrity: sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==} + engines: {node: '>=8'} + dev: true + + /path-parse@1.0.7: + resolution: {integrity: sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==} + + /path-to-regexp@0.1.7: + resolution: {integrity: sha512-5DFkuoqlv1uYQKxy8omFBeJPQcdoE07Kv2sferDCrAq1ohOU+MSDswDIbnx3YAM60qIOnYa53wBhXW0EbMonrQ==} + dev: true + + /picocolors@1.0.1: + resolution: {integrity: sha512-anP1Z8qwhkbmu7MFP5iTt+wQKXgwzf7zTyGlcdzabySa9vd0Xt392U0rVmz9poOaBj0uHJKyyo9/upk0HrEQew==} + + /picomatch@2.3.1: + resolution: {integrity: sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==} + engines: {node: '>=8.6'} + dev: true + + /prettier@3.3.2: + resolution: {integrity: sha512-rAVeHYMcv8ATV5d508CFdn+8/pHPpXeIid1DdrPwXnaAdH7cqjVbpJaT5eq4yRAFU/lsbwYwSF/n5iNrdJHPQA==} + engines: {node: '>=14'} + hasBin: true + dev: true + + /process-nextick-args@2.0.1: + resolution: {integrity: sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==} + dev: true + + /proxy-addr@2.0.7: + resolution: {integrity: sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==} + engines: {node: '>= 0.10'} + dependencies: + forwarded: 0.2.0 + ipaddr.js: 1.9.1 + dev: true + + /proxy-from-env@1.1.0: + resolution: {integrity: sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==} + dev: false + + /punycode@2.3.1: + resolution: {integrity: sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==} + engines: {node: '>=6'} + + /qs@6.11.0: + resolution: {integrity: sha512-MvjoMCJwEarSbUYk5O+nmoSzSutSsTwF85zcHPQ9OrlFoZOYIjaqBAJIqIXjptyD5vThxGq52Xu/MaJzRkIk4Q==} + engines: {node: '>=0.6'} + dependencies: + side-channel: 1.0.6 + dev: true + + /rambda@9.2.1: + resolution: {integrity: sha512-6Dp+QQVQuAuhwBlbIvL2FjJVHCKF29W+n9ca/BMTVDqpj+Q7KKqUh7UAINEna8aaB2/oRvPuL5hViCTQARa70Q==} + dev: false + + /randombytes@2.1.0: + resolution: {integrity: sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==} + dependencies: + safe-buffer: 5.2.1 + + /range-parser@1.2.1: + resolution: {integrity: sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==} + engines: {node: '>= 0.6'} + dev: true + + /raw-body@2.5.2: + resolution: {integrity: sha512-8zGqypfENjCIqGhgXToC8aB2r7YrBX+AQAfIPs/Mlk+BtPTztOvTS01NRW/3Eh60J+a48lt8qsCzirQ6loCVfA==} + engines: {node: '>= 0.8'} + dependencies: + bytes: 3.1.2 + http-errors: 2.0.0 + iconv-lite: 0.4.24 + unpipe: 1.0.0 + dev: true + + /react-dom@18.3.1(react@18.3.1): + resolution: {integrity: sha512-5m4nQKp+rZRb09LNH59GM4BxTh9251/ylbKIbpe7TpGxfJ+9kv6BLkLBXIjjspbgbnIBNqlI23tRnTWT0snUIw==} + peerDependencies: + react: ^18.3.1 + dependencies: + loose-envify: 1.4.0 + react: 18.3.1 + scheduler: 0.23.2 + dev: false + + /react-refresh@0.14.2: + resolution: {integrity: sha512-jCvmsr+1IUSMUyzOkRcvnVbX3ZYC6g9TDrDbFuFmRDq7PD4yaGbLKNQL6k2jnArV8hjYxh7hVhAZB6s9HDGpZA==} + engines: {node: '>=0.10.0'} + dev: true + + /react@18.3.1: + resolution: {integrity: sha512-wS+hAgJShR0KhEvPJArfuPVN1+Hz1t0Y6n5jLrGQbkb4urgPE/0Rve+1kMB1v/oWgHgm4WIcV+i7F2pTVj+2iQ==} + engines: {node: '>=0.10.0'} + dependencies: + loose-envify: 1.4.0 + dev: false + + /readable-stream@2.3.8: + resolution: {integrity: sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==} + dependencies: + core-util-is: 1.0.3 + inherits: 2.0.4 + isarray: 1.0.0 + process-nextick-args: 2.0.1 + safe-buffer: 5.1.2 + string_decoder: 1.1.1 + util-deprecate: 1.0.2 + dev: true + + /readable-stream@3.6.2: + resolution: {integrity: sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==} + engines: {node: '>= 6'} + dependencies: + inherits: 2.0.4 + string_decoder: 1.3.0 + util-deprecate: 1.0.2 + dev: true + + /readdirp@3.6.0: + resolution: {integrity: sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==} + engines: {node: '>=8.10.0'} + dependencies: + picomatch: 2.3.1 + dev: true + + /rechoir@0.8.0: + resolution: {integrity: sha512-/vxpCXddiX8NGfGO/mTafwjq4aFa/71pvamip0++IQk3zG8cbCj0fifNPrjjF1XMXUne91jL9OoxmdykoEtifQ==} + engines: {node: '>= 10.13.0'} + dependencies: + resolve: 1.22.8 + dev: true + + /require-directory@2.1.1: + resolution: {integrity: sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==} + engines: {node: '>=0.10.0'} + dev: true + + /require-from-string@2.0.2: + resolution: {integrity: sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==} + engines: {node: '>=0.10.0'} + dev: true + + /requires-port@1.0.0: + resolution: {integrity: sha512-KigOCHcocU3XODJxsu8i/j8T9tzT4adHiecwORRQ0ZZFcp7ahwXuRU1m+yuO90C5ZUyGeGfocHDI14M3L3yDAQ==} + dev: true + + /resolve-dir@1.0.1: + resolution: {integrity: sha512-R7uiTjECzvOsWSfdM0QKFNBVFcK27aHOUwdvK53BcW8zqnGdYp0Fbj82cy54+2A4P2tFM22J5kRfe1R+lM/1yg==} + engines: {node: '>=0.10.0'} + dependencies: + expand-tilde: 2.0.2 + global-modules: 1.0.0 + dev: false + + /resolve@1.22.8: + resolution: {integrity: sha512-oKWePCxqpd6FlLvGV1VU0x7bkPmmCNolxzjMf4NczoDnQcIWrAF+cPtZn5i6n+RfD2d9i0tzpKnG6Yk168yIyw==} + hasBin: true + dependencies: + is-core-module: 2.14.0 + path-parse: 1.0.7 + supports-preserve-symlinks-flag: 1.0.0 + + /retry@0.13.1: + resolution: {integrity: sha512-XQBQ3I8W1Cge0Seh+6gjj03LbmRFWuoszgK9ooCpwYIrhhoO80pfq4cUkU5DkknwfOfFteRwlZ56PYOGYyFWdg==} + engines: {node: '>= 4'} + dev: true + + /rfdc@1.4.1: + resolution: {integrity: sha512-q1b3N5QkRUWUl7iyylaaj3kOpIT0N2i9MqIEQXP73GVsN9cw3fdx8X63cEmWhJGi2PPCF23Ijp7ktmd39rawIA==} + dev: false + + /rimraf@3.0.2: + resolution: {integrity: sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==} + deprecated: Rimraf versions prior to v4 are no longer supported + hasBin: true + dependencies: + glob: 7.2.3 + dev: true + + /run-applescript@7.0.0: + resolution: {integrity: sha512-9by4Ij99JUr/MCFBUkDKLWK3G9HVXmabKz9U5MlIAIuvuzkiOicRYs8XJLxX+xahD+mLiiCYDqF9dKAgtzKP1A==} + engines: {node: '>=18'} + dev: false + + /safe-buffer@5.1.2: + resolution: {integrity: sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==} + dev: true + + /safe-buffer@5.2.1: + resolution: {integrity: sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==} + + /safer-buffer@2.1.2: + resolution: {integrity: sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==} + dev: true + + /scheduler@0.23.2: + resolution: {integrity: sha512-UOShsPwz7NrMUqhR6t0hWjFduvOzbtv7toDH1/hIrfRNIDBnnBWd0CwJTGvTpngVlmwGCdP9/Zl/tVrDqcuYzQ==} + dependencies: + loose-envify: 1.4.0 + dev: false + + /schema-utils@3.3.0: + resolution: {integrity: sha512-pN/yOAvcC+5rQ5nERGuwrjLlYvLTbCibnZ1I7B1LaiAz9BRBlE9GMgE/eqV30P7aJQUf7Ddimy/RsbYO/GrVGg==} + engines: {node: '>= 10.13.0'} + dependencies: + '@types/json-schema': 7.0.15 + ajv: 6.12.6 + ajv-keywords: 3.5.2(ajv@6.12.6) + + /schema-utils@4.2.0: + resolution: {integrity: sha512-L0jRsrPpjdckP3oPug3/VxNKt2trR8TcabrM6FOAAlvC/9Phcmm+cuAgTlxBqdBR1WJx7Naj9WHw+aOmheSVbw==} + engines: {node: '>= 12.13.0'} + dependencies: + '@types/json-schema': 7.0.15 + ajv: 8.16.0 + ajv-formats: 2.1.1(ajv@8.16.0) + ajv-keywords: 5.1.0(ajv@8.16.0) + dev: true + + /select-hose@2.0.0: + resolution: {integrity: sha512-mEugaLK+YfkijB4fx0e6kImuJdCIt2LxCRcbEYPqRGCs4F2ogyfZU5IAZRdjCP8JPq2AtdNoC/Dux63d9Kiryg==} + dev: true + + /selfsigned@2.4.1: + resolution: {integrity: sha512-th5B4L2U+eGLq1TVh7zNRGBapioSORUeymIydxgFpwww9d2qyKvtuPU2jJuHvYAwwqi2Y596QBL3eEqcPEYL8Q==} + engines: {node: '>=10'} + dependencies: + '@types/node-forge': 1.3.11 + node-forge: 1.3.1 + dev: true + + /semver@6.3.1: + resolution: {integrity: sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==} + hasBin: true + dev: true + + /send@0.18.0: + resolution: {integrity: sha512-qqWzuOjSFOuqPjFe4NOsMLafToQQwBSOEpS+FwEt3A2V3vKubTquT3vmLTQpFgMXp8AlFWFuP1qKaJZOtPpVXg==} + engines: {node: '>= 0.8.0'} + dependencies: + debug: 2.6.9 + depd: 2.0.0 + destroy: 1.2.0 + encodeurl: 1.0.2 + escape-html: 1.0.3 + etag: 1.8.1 + fresh: 0.5.2 + http-errors: 2.0.0 + mime: 1.6.0 + ms: 2.1.3 + on-finished: 2.4.1 + range-parser: 1.2.1 + statuses: 2.0.1 + transitivePeerDependencies: + - supports-color + dev: true + + /serialize-javascript@6.0.2: + resolution: {integrity: sha512-Saa1xPByTTq2gdeFZYLLo+RFE35NHZkAbqZeWNd3BpzppeVisAqpDjcp8dyf6uIvEqJRd46jemmyA4iFIeVk8g==} + dependencies: + randombytes: 2.1.0 + + /serve-index@1.9.1: + resolution: {integrity: sha512-pXHfKNP4qujrtteMrSBb0rc8HJ9Ms/GrXwcUtUtD5s4ewDJI8bT3Cz2zTVRMKtri49pLx2e0Ya8ziP5Ya2pZZw==} + engines: {node: '>= 0.8.0'} + dependencies: + accepts: 1.3.8 + batch: 0.6.1 + debug: 2.6.9 + escape-html: 1.0.3 + http-errors: 1.6.3 + mime-types: 2.1.35 + parseurl: 1.3.3 + transitivePeerDependencies: + - supports-color + dev: true + + /serve-static@1.15.0: + resolution: {integrity: sha512-XGuRDNjXUijsUL0vl6nSD7cwURuzEgglbOaFuZM9g3kwDXOWVTck0jLzjPzGD+TazWbboZYu52/9/XPdUgne9g==} + engines: {node: '>= 0.8.0'} + dependencies: + encodeurl: 1.0.2 + escape-html: 1.0.3 + parseurl: 1.3.3 + send: 0.18.0 + transitivePeerDependencies: + - supports-color + dev: true + + /set-function-length@1.2.2: + resolution: {integrity: sha512-pgRc4hJ4/sNjWCSS9AmnS40x3bNMDTknHgL5UaMBTMyJnU90EgWh1Rz+MC9eFu4BuN/UwZjKQuY/1v3rM7HMfg==} + engines: {node: '>= 0.4'} + dependencies: + define-data-property: 1.1.4 + es-errors: 1.3.0 + function-bind: 1.1.2 + get-intrinsic: 1.2.4 + gopd: 1.0.1 + has-property-descriptors: 1.0.2 + dev: true + + /setprototypeof@1.1.0: + resolution: {integrity: sha512-BvE/TwpZX4FXExxOxZyRGQQv651MSwmWKZGqvmPcRIjDqWub67kTKuIMx43cZZrS/cBBzwBcNDWoFxt2XEFIpQ==} + dev: true + + /setprototypeof@1.2.0: + resolution: {integrity: sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==} + + /shebang-command@2.0.0: + resolution: {integrity: sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==} + engines: {node: '>=8'} + dependencies: + shebang-regex: 3.0.0 + dev: true + + /shebang-regex@3.0.0: + resolution: {integrity: sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==} + engines: {node: '>=8'} + dev: true + + /shell-quote@1.8.1: + resolution: {integrity: sha512-6j1W9l1iAs/4xYBI1SYOVZyFcCis9b4KCLQ8fgAGG07QvzaRLVVRQvAy85yNmmZSjYjg4MWh4gNvlPujU/5LpA==} + dev: true + + /side-channel@1.0.6: + resolution: {integrity: sha512-fDW/EZ6Q9RiO8eFG8Hj+7u/oW+XrPTIChwCOM2+th2A6OblDtYYIpve9m+KvI9Z4C9qSEXlaGR6bTEYHReuglA==} + engines: {node: '>= 0.4'} + dependencies: + call-bind: 1.0.7 + es-errors: 1.3.0 + get-intrinsic: 1.2.4 + object-inspect: 1.13.2 + dev: true + + /signal-exit@3.0.7: + resolution: {integrity: sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==} + dev: true + + /sirv@1.0.19: + resolution: {integrity: sha512-JuLThK3TnZG1TAKDwNIqNq6QA2afLOCcm+iE8D1Kj3GA40pSPsxQjjJl0J8X3tsR7T+CP1GavpzLwYkgVLWrZQ==} + engines: {node: '>= 10'} + dependencies: + '@polka/url': 1.0.0-next.25 + mrmime: 1.0.1 + totalist: 1.1.0 + dev: true + + /socket.io-client@4.7.5: + resolution: {integrity: sha512-sJ/tqHOCe7Z50JCBCXrsY3I2k03iOiUe+tj1OmKeD2lXPiGH/RUCdTZFoqVyN7l1MnpIzPrGtLcijffmeouNlQ==} + engines: {node: '>=10.0.0'} + dependencies: + '@socket.io/component-emitter': 3.1.2 + debug: 4.3.5 + engine.io-client: 6.5.4 + socket.io-parser: 4.2.4 + transitivePeerDependencies: + - bufferutil + - supports-color + - utf-8-validate + dev: false + + /socket.io-parser@4.2.4: + resolution: {integrity: sha512-/GbIKmo8ioc+NIWIhwdecY0ge+qVBSMdgxGygevmdHj24bsfgtCmcUUcQ5ZzcylGFHsN3k4HB4Cgkl96KVnuew==} + engines: {node: '>=10.0.0'} + dependencies: + '@socket.io/component-emitter': 3.1.2 + debug: 4.3.5 + transitivePeerDependencies: + - supports-color + dev: false + + /sockjs@0.3.24: + resolution: {integrity: sha512-GJgLTZ7vYb/JtPSSZ10hsOYIvEYsjbNU+zPdIHcUaWVNUEPivzxku31865sSSud0Da0W4lEeOPlmw93zLQchuQ==} + dependencies: + faye-websocket: 0.11.4 + uuid: 8.3.2 + websocket-driver: 0.7.4 + dev: true + + /sorted-array-functions@1.3.0: + resolution: {integrity: sha512-2sqgzeFlid6N4Z2fUQ1cvFmTOLRi/sEDzSQ0OKYchqgoPmQBVyM3959qYx3fpS6Esef80KjmpgPeEr028dP3OA==} + dev: false + + /source-map-support@0.5.21: + resolution: {integrity: sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==} + dependencies: + buffer-from: 1.1.2 + source-map: 0.6.1 + + /source-map@0.6.1: + resolution: {integrity: sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==} + engines: {node: '>=0.10.0'} + + /spdy-transport@3.0.0: + resolution: {integrity: sha512-hsLVFE5SjA6TCisWeJXFKniGGOpBgMLmerfO2aCyCU5s7nJ/rpAepqmFifv/GCbSbueEeAJJnmSQ2rKC/g8Fcw==} + dependencies: + debug: 4.3.5 + detect-node: 2.1.0 + hpack.js: 2.1.6 + obuf: 1.1.2 + readable-stream: 3.6.2 + wbuf: 1.7.3 + transitivePeerDependencies: + - supports-color + dev: true + + /spdy@4.0.2: + resolution: {integrity: sha512-r46gZQZQV+Kl9oItvl1JZZqJKGr+oEkB08A6BzkiR7593/7IbtuncXHd2YoYeTsG4157ZssMu9KYvUHLcjcDoA==} + engines: {node: '>=6.0.0'} + dependencies: + debug: 4.3.5 + handle-thing: 2.0.1 + http-deceiver: 1.2.7 + select-hose: 2.0.0 + spdy-transport: 3.0.0 + transitivePeerDependencies: + - supports-color + dev: true + + /statuses@1.5.0: + resolution: {integrity: sha512-OpZ3zP+jT1PI7I8nemJX4AKmAX070ZkYPVWV/AaKTJl+tXCTGyVdC1a4SL8RUQYEwk/f34ZX8UTykN68FwrqAA==} + engines: {node: '>= 0.6'} + + /statuses@2.0.1: + resolution: {integrity: sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==} + engines: {node: '>= 0.8'} + dev: true + + /streamroller@3.1.5: + resolution: {integrity: sha512-KFxaM7XT+irxvdqSP1LGLgNWbYN7ay5owZ3r/8t77p+EtSUAfUgtl7be3xtqtOmGUl9K9YPO2ca8133RlTjvKw==} + engines: {node: '>=8.0'} + dependencies: + date-format: 4.0.14 + debug: 4.3.5 + fs-extra: 8.1.0 + transitivePeerDependencies: + - supports-color + dev: false + + /string-width@4.2.3: + resolution: {integrity: sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==} + engines: {node: '>=8'} + dependencies: + emoji-regex: 8.0.0 + is-fullwidth-code-point: 3.0.0 + strip-ansi: 6.0.1 + dev: true + + /string_decoder@1.1.1: + resolution: {integrity: sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==} + dependencies: + safe-buffer: 5.1.2 + dev: true + + /string_decoder@1.3.0: + resolution: {integrity: sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==} + dependencies: + safe-buffer: 5.2.1 + dev: true + + /strip-ansi@6.0.1: + resolution: {integrity: sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==} + engines: {node: '>=8'} + dependencies: + ansi-regex: 5.0.1 + dev: true + + /strip-final-newline@2.0.0: + resolution: {integrity: sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==} + engines: {node: '>=6'} + dev: true + + /supports-color@7.2.0: + resolution: {integrity: sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==} + engines: {node: '>=8'} + dependencies: + has-flag: 4.0.0 + + /supports-color@8.1.1: + resolution: {integrity: sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==} + engines: {node: '>=10'} + dependencies: + has-flag: 4.0.0 + + /supports-preserve-symlinks-flag@1.0.0: + resolution: {integrity: sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==} + engines: {node: '>= 0.4'} + + /tapable@2.2.1: + resolution: {integrity: sha512-GNzQvQTOIP6RyTfE2Qxb8ZVlNmw0n88vp1szwWRimP02mnTsx3Wtn5qRdqY9w2XduFNUgvOwhNnQsjwCp+kqaQ==} + engines: {node: '>=6'} + + /terser-webpack-plugin@5.3.10(webpack@5.92.1): + resolution: {integrity: sha512-BKFPWlPDndPs+NGGCr1U59t0XScL5317Y0UReNrHaw9/FwhPENlq6bfgs+4yPfyP51vqC1bQ4rp1EfXW5ZSH9w==} + engines: {node: '>= 10.13.0'} + peerDependencies: + '@swc/core': '*' + esbuild: '*' + uglify-js: '*' + webpack: ^5.1.0 + peerDependenciesMeta: + '@swc/core': + optional: true + esbuild: + optional: true + uglify-js: + optional: true + dependencies: + '@jridgewell/trace-mapping': 0.3.25 + jest-worker: 27.5.1 + schema-utils: 3.3.0 + serialize-javascript: 6.0.2 + terser: 5.31.1 + webpack: 5.92.1 + + /terser@5.31.1: + resolution: {integrity: sha512-37upzU1+viGvuFtBo9NPufCb9dwM0+l9hMxYyWfBA+fbwrPqNJAhbZ6W47bBFnZHKHTUBnMvi87434qq+qnxOg==} + engines: {node: '>=10'} + hasBin: true + dependencies: + '@jridgewell/source-map': 0.3.6 + acorn: 8.12.0 + commander: 2.20.3 + source-map-support: 0.5.21 + + /thunky@1.1.0: + resolution: {integrity: sha512-eHY7nBftgThBqOyHGVN+l8gF0BucP09fMo0oO/Lb0w1OF80dJv+lDVpXG60WMQvkcxAkNybKsrEIE3ZtKGmPrA==} + dev: true + + /to-regex-range@5.0.1: + resolution: {integrity: sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==} + engines: {node: '>=8.0'} + dependencies: + is-number: 7.0.0 + dev: true + + /toidentifier@1.0.1: + resolution: {integrity: sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==} + engines: {node: '>=0.6'} + + /totalist@1.1.0: + resolution: {integrity: sha512-gduQwd1rOdDMGxFG1gEvhV88Oirdo2p+KjoYFU7k2g+i7n6AFFbDQ5kMPUsW0pNbfQsB/cwXvT1i4Bue0s9g5g==} + engines: {node: '>=6'} + dev: true + + /tslib@2.6.3: + resolution: {integrity: sha512-xNvxJEOUiWPGhUuUdQgAJPKOOJfGnIyKySOc09XkKsgdUV/3E2zvwZYdejjmRgPCgcym1juLH3226yA7sEFJKQ==} + dev: false + + /tsscmp@1.0.6: + resolution: {integrity: sha512-LxhtAkPDTkVCMQjt2h6eBVY28KCjikZqZfMcC15YBeNjkgUpdCfBu5HoiOTDu86v6smE8yOjyEktJ8hlbANHQA==} + engines: {node: '>=0.6.x'} + dev: false + + /type-is@1.6.18: + resolution: {integrity: sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==} + engines: {node: '>= 0.6'} + dependencies: + media-typer: 0.3.0 + mime-types: 2.1.35 + + /typescript@5.5.3: + resolution: {integrity: sha512-/hreyEujaB0w76zKo6717l3L0o/qEUtRgdvUBvlkhoWeOVMjMuHNHk0BRBzikzuGDqNmPQbg5ifMEqsHLiIUcQ==} + engines: {node: '>=14.17'} + hasBin: true + dev: false + + /undici-types@5.26.5: + resolution: {integrity: sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA==} + + /universalify@0.1.2: + resolution: {integrity: sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==} + engines: {node: '>= 4.0.0'} + dev: false + + /universalify@2.0.1: + resolution: {integrity: sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==} + engines: {node: '>= 10.0.0'} + dev: false + + /unpipe@1.0.0: + resolution: {integrity: sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==} + engines: {node: '>= 0.8'} + dev: true + + /upath@2.0.1: + resolution: {integrity: sha512-1uEe95xksV1O0CYKXo8vQvN1JEbtJp7lb7C5U9HMsIp6IVwntkH/oNUzyVNQSd4S1sYk2FpSSW44FqMc8qee5w==} + engines: {node: '>=4'} + dev: false + + /update-browserslist-db@1.0.16(browserslist@4.23.1): + resolution: {integrity: sha512-KVbTxlBYlckhF5wgfyZXTWnMn7MMZjMu9XG8bPlliUOP9ThaF4QnhP8qrjrH7DRzHfSk0oQv1wToW+iA5GajEQ==} + hasBin: true + peerDependencies: + browserslist: '>= 4.21.0' + dependencies: + browserslist: 4.23.1 + escalade: 3.1.2 + picocolors: 1.0.1 + + /uri-js@4.4.1: + resolution: {integrity: sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==} + dependencies: + punycode: 2.3.1 + + /util-deprecate@1.0.2: + resolution: {integrity: sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==} + dev: true + + /utils-merge@1.0.1: + resolution: {integrity: sha512-pMZTvIkT1d+TFGvDOqodOclx0QWkkgi6Tdoa8gC8ffGAAqz9pzPTZWAybbsHHoED/ztMtkv/VoYTYyShUn81hA==} + engines: {node: '>= 0.4.0'} + dev: true + + /uuid@8.3.2: + resolution: {integrity: sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==} + hasBin: true + + /vary@1.1.2: + resolution: {integrity: sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==} + engines: {node: '>= 0.8'} + + /watchpack@2.4.1: + resolution: {integrity: sha512-8wrBCMtVhqcXP2Sup1ctSkga6uc2Bx0IIvKyT7yTFier5AXHooSI+QyQQAtTb7+E0IUCCKyTFmXqdqgum2XWGg==} + engines: {node: '>=10.13.0'} + dependencies: + glob-to-regexp: 0.4.1 + graceful-fs: 4.2.11 + + /wbuf@1.7.3: + resolution: {integrity: sha512-O84QOnr0icsbFGLS0O3bI5FswxzRr8/gHwWkDlQFskhSPryQXvrTMxjxGP4+iWYoauLoBvfDpkrOauZ+0iZpDA==} + dependencies: + minimalistic-assert: 1.0.1 + dev: true + + /webpack-bundle-analyzer@4.6.1: + resolution: {integrity: sha512-oKz9Oz9j3rUciLNfpGFjOb49/jEpXNmWdVH8Ls//zNcnLlQdTGXQQMsBbb/gR7Zl8WNLxVCq+0Hqbx3zv6twBw==} + engines: {node: '>= 10.13.0'} + hasBin: true + dependencies: + acorn: 8.12.0 + acorn-walk: 8.3.3 + chalk: 4.1.2 + commander: 7.2.0 + gzip-size: 6.0.0 + lodash: 4.17.21 + opener: 1.5.2 + sirv: 1.0.19 + ws: 7.5.10 + transitivePeerDependencies: + - bufferutil + - utf-8-validate + dev: true + + /webpack-dev-middleware@5.3.4(webpack@5.92.1): + resolution: {integrity: sha512-BVdTqhhs+0IfoeAf7EoH5WE+exCmqGerHfDM0IL096Px60Tq2Mn9MAbnaGUe6HiMa41KMCYF19gyzZmBcq/o4Q==} + engines: {node: '>= 12.13.0'} + peerDependencies: + webpack: ^4.0.0 || ^5.0.0 + dependencies: + colorette: 2.0.19 + memfs: 3.5.3 + mime-types: 2.1.35 + range-parser: 1.2.1 + schema-utils: 4.2.0 + webpack: 5.92.1 + dev: true + + /webpack-dev-middleware@6.1.2(webpack@5.92.1): + resolution: {integrity: sha512-Wu+EHmX326YPYUpQLKmKbTyZZJIB8/n6R09pTmB03kJmnMsVPTo9COzHZFr01txwaCAuZvfBJE4ZCHRcKs5JaQ==} + engines: {node: '>= 14.15.0'} + peerDependencies: + webpack: ^5.0.0 + peerDependenciesMeta: + webpack: + optional: true + dependencies: + colorette: 2.0.19 + memfs: 3.5.3 + mime-types: 2.1.35 + range-parser: 1.2.1 + schema-utils: 4.2.0 + webpack: 5.92.1 + dev: true + + /webpack-dev-server@4.13.1(webpack@5.92.1): + resolution: {integrity: sha512-5tWg00bnWbYgkN+pd5yISQKDejRBYGEw15RaEEslH+zdbNDxxaZvEAO2WulaSaFKb5n3YG8JXsGaDsut1D0xdA==} + engines: {node: '>= 12.13.0'} + hasBin: true + peerDependencies: + webpack: ^4.37.0 || ^5.0.0 + webpack-cli: '*' + peerDependenciesMeta: + webpack: + optional: true + webpack-cli: + optional: true + dependencies: + '@types/bonjour': 3.5.13 + '@types/connect-history-api-fallback': 1.5.4 + '@types/express': 4.17.21 + '@types/serve-index': 1.9.4 + '@types/serve-static': 1.15.7 + '@types/sockjs': 0.3.36 + '@types/ws': 8.5.10 + ansi-html-community: 0.0.8 + bonjour-service: 1.2.1 + chokidar: 3.5.3 + colorette: 2.0.19 + compression: 1.7.4 + connect-history-api-fallback: 2.0.0 + default-gateway: 6.0.3 + express: 4.19.2 + graceful-fs: 4.2.11 + html-entities: 2.5.2 + http-proxy-middleware: 2.0.6(@types/express@4.17.21) + ipaddr.js: 2.2.0 + launch-editor: 2.8.0 + open: 8.4.2 + p-retry: 4.6.2 + rimraf: 3.0.2 + schema-utils: 4.2.0 + selfsigned: 2.4.1 + serve-index: 1.9.1 + sockjs: 0.3.24 + spdy: 4.0.2 + webpack: 5.92.1 + webpack-dev-middleware: 5.3.4(webpack@5.92.1) + ws: 8.17.1 + transitivePeerDependencies: + - bufferutil + - debug + - supports-color + - utf-8-validate + dev: true + + /webpack-sources@3.2.3: + resolution: {integrity: sha512-/DyMEOrDgLKKIG0fmvtz+4dUX/3Ghozwgm6iPp8KRhvn+eQf9+Q7GWxVNMk3+uCPWfdXYC4ExGBckIXdFEfH1w==} + engines: {node: '>=10.13.0'} + + /webpack@5.92.1: + resolution: {integrity: sha512-JECQ7IwJb+7fgUFBlrJzbyu3GEuNBcdqr1LD7IbSzwkSmIevTm8PF+wej3Oxuz/JFBUZ6O1o43zsPkwm1C4TmA==} + engines: {node: '>=10.13.0'} + hasBin: true + peerDependencies: + webpack-cli: '*' + peerDependenciesMeta: + webpack-cli: + optional: true + dependencies: + '@types/eslint-scope': 3.7.7 + '@types/estree': 1.0.5 + '@webassemblyjs/ast': 1.12.1 + '@webassemblyjs/wasm-edit': 1.12.1 + '@webassemblyjs/wasm-parser': 1.12.1 + acorn: 8.12.0 + acorn-import-attributes: 1.9.5(acorn@8.12.0) + browserslist: 4.23.1 + chrome-trace-event: 1.0.4 + enhanced-resolve: 5.17.0 + es-module-lexer: 1.5.4 + eslint-scope: 5.1.1 + events: 3.3.0 + glob-to-regexp: 0.4.1 + graceful-fs: 4.2.11 + json-parse-even-better-errors: 2.3.1 + loader-runner: 4.3.0 + mime-types: 2.1.35 + neo-async: 2.6.2 + schema-utils: 3.3.0 + tapable: 2.2.1 + terser-webpack-plugin: 5.3.10(webpack@5.92.1) + watchpack: 2.4.1 + webpack-sources: 3.2.3 + transitivePeerDependencies: + - '@swc/core' + - esbuild + - uglify-js + + /websocket-driver@0.7.4: + resolution: {integrity: sha512-b17KeDIQVjvb0ssuSDF2cYXSg2iztliJ4B9WdsuB6J952qCPKmnVq4DyW5motImXHDC1cBT/1UezrJVsKw5zjg==} + engines: {node: '>=0.8.0'} + dependencies: + http-parser-js: 0.5.8 + safe-buffer: 5.2.1 + websocket-extensions: 0.1.4 + dev: true + + /websocket-extensions@0.1.4: + resolution: {integrity: sha512-OqedPIGOfsDlo31UNwYbCFMSaO9m9G/0faIHj5/dZFDMFqPTcx6UwqyOy3COEaEOg/9VsGIpdqn62W5KhoKSpg==} + engines: {node: '>=0.8.0'} + dev: true + + /which@1.3.1: + resolution: {integrity: sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==} + hasBin: true + dependencies: + isexe: 2.0.0 + dev: false + + /which@2.0.2: + resolution: {integrity: sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==} + engines: {node: '>= 8'} + hasBin: true + dependencies: + isexe: 2.0.0 + dev: true + + /wrap-ansi@7.0.0: + resolution: {integrity: sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==} + engines: {node: '>=10'} + dependencies: + ansi-styles: 4.3.0 + string-width: 4.2.3 + strip-ansi: 6.0.1 + dev: true + + /wrappy@1.0.2: + resolution: {integrity: sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==} + dev: true + + /ws@7.5.10: + resolution: {integrity: sha512-+dbF1tHwZpXcbOJdVOkzLDxZP1ailvSxM6ZweXTegylPny803bFhA+vqBYw4s31NSAk4S2Qz+AKXK9a4wkdjcQ==} + engines: {node: '>=8.3.0'} + peerDependencies: + bufferutil: ^4.0.1 + utf-8-validate: ^5.0.2 + peerDependenciesMeta: + bufferutil: + optional: true + utf-8-validate: + optional: true + dev: true + + /ws@8.17.1: + resolution: {integrity: sha512-6XQFvXTkbfUOZOKKILFG1PDK2NDQs4azKQl26T0YS5CxqWLgXajbPZ+h4gZekJyRqFU8pvnbAbbs/3TgRPy+GQ==} + engines: {node: '>=10.0.0'} + peerDependencies: + bufferutil: ^4.0.1 + utf-8-validate: '>=5.0.2' + peerDependenciesMeta: + bufferutil: + optional: true + utf-8-validate: + optional: true + + /ws@8.8.1: + resolution: {integrity: sha512-bGy2JzvzkPowEJV++hF07hAD6niYSr0JzBNo/J29WsB57A2r7Wlc1UFcTR9IzrPvuNVO4B8LGqF8qcpsVOhJCA==} + engines: {node: '>=10.0.0'} + peerDependencies: + bufferutil: ^4.0.1 + utf-8-validate: ^5.0.2 + peerDependenciesMeta: + bufferutil: + optional: true + utf-8-validate: + optional: true + dev: true + + /xmlhttprequest-ssl@2.0.0: + resolution: {integrity: sha512-QKxVRxiRACQcVuQEYFsI1hhkrMlrXHPegbbd1yn9UHOmRxY+si12nQYzri3vbzt8VdTTRviqcKxcyllFas5z2A==} + engines: {node: '>=0.4.0'} + dev: false + + /y18n@5.0.8: + resolution: {integrity: sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==} + engines: {node: '>=10'} + dev: true + + /yargs-parser@21.1.1: + resolution: {integrity: sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==} + engines: {node: '>=12'} + dev: true + + /yargs@17.6.2: + resolution: {integrity: sha512-1/9UrdHjDZc0eOU0HxOHoS78C69UD3JRMvzlJ7S79S2nTaWRA/whGCTV8o9e/N/1Va9YIV7Q4sOxD8VV4pCWOw==} + engines: {node: '>=12'} + dependencies: + cliui: 8.0.1 + escalade: 3.1.2 + get-caller-file: 2.0.5 + require-directory: 2.1.1 + string-width: 4.2.3 + y18n: 5.0.8 + yargs-parser: 21.1.1 + dev: true + + /ylru@1.4.0: + resolution: {integrity: sha512-2OQsPNEmBCvXuFlIni/a+Rn+R2pHW9INm0BxXJ4hVDA8TirqMj+J/Rp9ItLatT/5pZqWwefVrTQcHpixsxnVlA==} + engines: {node: '>= 4.0.0'} + dev: false + + /zephyr-agent@0.0.13: + resolution: {integrity: sha512-MxSthGw3OVs80dG6JWeauIGdvMLpfpS2DxlfWVdQjqMnvnU/2OToOxGX+f6qdfpnu1bu+jd/QetPjmwBHxYLxg==} + dependencies: + is-ci: 3.0.1 + jose: 5.6.2 + open: 10.1.0 + socket.io-client: 4.7.5 + tslib: 2.6.3 + uuid: 8.3.2 + zephyr-edge-contract: 0.0.13 + transitivePeerDependencies: + - bufferutil + - supports-color + - utf-8-validate + dev: false + + /zephyr-edge-contract@0.0.13: + resolution: {integrity: sha512-RvYPYjQnC54GDTxG/dvMvjYfQcjmCxA/ugqs3/W1L280o3z3gxiFyM0Wo+4Zca3V/GCo03isvbs0KGJwj2VD8Q==} + dependencies: + debug: 4.3.5 + node-persist: 4.0.1 + tslib: 2.6.3 + transitivePeerDependencies: + - supports-color + dev: false + + /zephyr-webpack-plugin@0.0.13: + resolution: {integrity: sha512-LEFrj8gNzAzrCKSomSwLWMqFqpVgOVxJVmMwzQy3cZ4yAQeNgpjLAm5BOccE3MoewPWqdgzTCjEbqdIK+TyMFQ==} + dependencies: + '@module-federation/automatic-vendor-federation': 1.2.1(webpack@5.92.1) + is-ci: 3.0.1 + tslib: 2.6.3 + webpack: 5.92.1 + zephyr-agent: 0.0.13 + zephyr-edge-contract: 0.0.13 + transitivePeerDependencies: + - '@swc/core' + - bufferutil + - esbuild + - supports-color + - uglify-js + - utf-8-validate + - webpack-cli + dev: false diff --git a/rspack_hmr/host/rspack.config.js b/rspack_hmr/host/rspack.config.js new file mode 100644 index 0000000..defe4ff --- /dev/null +++ b/rspack_hmr/host/rspack.config.js @@ -0,0 +1,111 @@ +const rspack = require('@rspack/core'); +const refreshPlugin = require('@rspack/plugin-react-refresh'); +const isDev = process.env.NODE_ENV === 'development'; + +const path = require('path'); +const deps = require('./package.json').dependencies; +console.log({ deps }); +const { ModuleFederationPlugin } = require('@module-federation/enhanced/rspack'); + +const name = 'app_01'; +const name1 = name + '1'; +/** + * @type {import('@rspack/cli').Configuration} + */ +module.exports = { + //context: __dirname, + entry: { + main: './src/index.tsx', + }, + resolve: { + extensions: ['...', '.ts', '.tsx', '.jsx'], + }, + optimization: { + minimize: false, + }, + devServer: { + port: 3000, + hot: true, + static: { + directory: path.join(__dirname, 'build'), + }, + liveReload: false, + headers: { + 'Access-Control-Allow-Origin': '*', + 'Access-Control-Allow-Methods': 'GET, POST, PUT, DELETE, PATCH, OPTIONS', + 'Access-Control-Allow-Headers': 'X-Requested-With, content-type, Authorization', + }, + }, + + devtool: 'source-map', + optimization: { minimize: false }, + output: { + path: __dirname + '/dist', + uniqueName: name1, + publicPath: 'http://localhost:3000/', + filename: '[name].js', + }, + watch: true, + module: { + rules: [ + { + test: /\.svg$/, + type: 'asset', + }, + { + test: /\.(jsx?|tsx?)$/, + + exclude: /(node_modules|\.webpack)/, + use: [ + { + loader: 'builtin:swc-loader', + options: { + sourceMap: true, + jsc: { + parser: { + syntax: 'typescript', + tsx: true, + }, + transform: { + react: { + runtime: 'automatic', + development: isDev, + refresh: isDev, + }, + }, + }, + env: { + targets: ['chrome >= 87', 'edge >= 88', 'firefox >= 78', 'safari >= 14'], + }, + }, + }, + ], + }, + ], + }, + plugins: [ + new rspack.DefinePlugin({ + 'process.env.NODE_ENV': JSON.stringify(process.env.NODE_ENV), + }), + new rspack.ProgressPlugin({}), + + isDev && new rspack.HotModuleReplacementPlugin(), + new rspack.HtmlRspackPlugin({ + template: './index.html', + excludedChunks: [name], + filename: 'index.html', + inject: true, + publicPath: '/', + }), + new ModuleFederationPlugin({ + name: name, + filename: 'remoteEntry.js', + remotes: { + app_02: 'app_02@http://localhost:3001/mf-manifest.json', + }, + + shared: ['react', 'react-dom'], + }), + isDev ? new refreshPlugin() : null, + ].filter(Boolean), +}; diff --git a/rspack_hmr/host/src/App.css b/rspack_hmr/host/src/App.css new file mode 100644 index 0000000..0d75132 --- /dev/null +++ b/rspack_hmr/host/src/App.css @@ -0,0 +1,43 @@ +#root { + max-width: 1280px; + margin: 0 auto; + padding: 2rem; + text-align: center; +} + +.logo { + position: absolute; + top: 10rem; + height: 2em; + padding: 1.5em; + will-change: filter; +} +.logo:hover { + filter: drop-shadow(0 0 2em #646cffaa); +} +.logo.react:hover { + filter: drop-shadow(0 0 2em #61dafbaa); +} + +@keyframes logo-spin { + from { + transform: rotate(0deg); + } + to { + transform: rotate(360deg); + } +} + +@media (prefers-reduced-motion: no-preference) { + a:nth-of-type(2) .logo { + animation: logo-spin infinite 20s linear; + } +} + +.card { + padding: 2em; +} + +.read-the-docs { + color: #888; +} diff --git a/rspack_hmr/host/src/App.tsx b/rspack_hmr/host/src/App.tsx new file mode 100644 index 0000000..415d664 --- /dev/null +++ b/rspack_hmr/host/src/App.tsx @@ -0,0 +1,30 @@ +import './App.css'; +import { Hello } from 'app_02/Hello'; + +function App() { + return ( +
    +
    +

    Host :)

    +

    + This is currently in a host app.{' '} +

      +
    • Directory name: host
    • +
    • package.json name: @rspack-hmr/rspack-host
    • +
    {' '} +
    We are taking the 'Hello'module from App_02 +

    +
    + +
    + + +
    +
    + ); +} + +export default App; diff --git a/rspack_hmr/host/src/bootstrap.tsx b/rspack_hmr/host/src/bootstrap.tsx new file mode 100644 index 0000000..8c4462a --- /dev/null +++ b/rspack_hmr/host/src/bootstrap.tsx @@ -0,0 +1,10 @@ +import React from 'react'; +import ReactDOM from 'react-dom/client'; +import App from './App.tsx'; +import './index.css'; + +ReactDOM.createRoot(document.getElementById('root') as HTMLElement).render( + + + , +); diff --git a/rspack_hmr/host/src/index.css b/rspack_hmr/host/src/index.css new file mode 100644 index 0000000..917888c --- /dev/null +++ b/rspack_hmr/host/src/index.css @@ -0,0 +1,70 @@ +:root { + font-family: Inter, Avenir, Helvetica, Arial, sans-serif; + font-size: 16px; + line-height: 24px; + font-weight: 400; + + color-scheme: light dark; + color: rgba(255, 255, 255, 0.87); + background-color: #242424; + + font-synthesis: none; + text-rendering: optimizeLegibility; + -webkit-font-smoothing: antialiased; + -moz-osx-font-smoothing: grayscale; + -webkit-text-size-adjust: 100%; +} + +a { + font-weight: 500; + color: #646cff; + text-decoration: inherit; +} +a:hover { + color: #535bf2; +} + +body { + margin: 0; + display: flex; + place-items: center; + min-width: 320px; + min-height: 100vh; +} + +h1 { + font-size: 3.2em; + line-height: 1.1; +} + +button { + border-radius: 8px; + border: 1px solid transparent; + padding: 0.6em 1.2em; + font-size: 1em; + font-weight: 500; + font-family: inherit; + background-color: #1a1a1a; + cursor: pointer; + transition: border-color 0.25s; +} +button:hover { + border-color: #646cff; +} +button:focus, +button:focus-visible { + outline: 4px auto -webkit-focus-ring-color; +} + +@media (prefers-color-scheme: light) { + :root { + color: #213547; + background-color: #ffffff; + } + a:hover { + color: #747bff; + } + button { + background-color: #f9f9f9; + } +} diff --git a/rspack_hmr/host/src/index.tsx b/rspack_hmr/host/src/index.tsx new file mode 100644 index 0000000..b93c7a0 --- /dev/null +++ b/rspack_hmr/host/src/index.tsx @@ -0,0 +1 @@ +import('./bootstrap'); diff --git a/rspack_hmr/host/src/react-env.d.ts b/rspack_hmr/host/src/react-env.d.ts new file mode 100644 index 0000000..bd4c10d --- /dev/null +++ b/rspack_hmr/host/src/react-env.d.ts @@ -0,0 +1,213 @@ +// CSS modules +type CSSModuleClasses = { readonly [key: string]: string }; + +declare module '*.module.css' { + const classes: CSSModuleClasses; + export default classes; +} +declare module '*.module.scss' { + const classes: CSSModuleClasses; + export default classes; +} +declare module '*.module.sass' { + const classes: CSSModuleClasses; + export default classes; +} +declare module '*.module.less' { + const classes: CSSModuleClasses; + export default classes; +} +declare module '*.module.styl' { + const classes: CSSModuleClasses; + export default classes; +} +declare module '*.module.stylus' { + const classes: CSSModuleClasses; + export default classes; +} +declare module '*.module.pcss' { + const classes: CSSModuleClasses; + export default classes; +} +declare module '*.module.sss' { + const classes: CSSModuleClasses; + export default classes; +} + +// CSS +declare module '*.css' { + /** + * @deprecated Use `import style from './style.css?inline'` instead. + */ + const css: string; + export default css; +} +declare module '*.scss' { + /** + * @deprecated Use `import style from './style.scss?inline'` instead. + */ + const css: string; + export default css; +} +declare module '*.sass' { + /** + * @deprecated Use `import style from './style.sass?inline'` instead. + */ + const css: string; + export default css; +} +declare module '*.less' { + /** + * @deprecated Use `import style from './style.less?inline'` instead. + */ + const css: string; + export default css; +} +declare module '*.styl' { + /** + * @deprecated Use `import style from './style.styl?inline'` instead. + */ + const css: string; + export default css; +} +declare module '*.stylus' { + /** + * @deprecated Use `import style from './style.stylus?inline'` instead. + */ + const css: string; + export default css; +} +declare module '*.pcss' { + /** + * @deprecated Use `import style from './style.pcss?inline'` instead. + */ + const css: string; + export default css; +} +declare module '*.sss' { + /** + * @deprecated Use `import style from './style.sss?inline'` instead. + */ + const css: string; + export default css; +} + +// images +declare module '*.png' { + const src: string; + export default src; +} +declare module '*.jpg' { + const src: string; + export default src; +} +declare module '*.jpeg' { + const src: string; + export default src; +} +declare module '*.jfif' { + const src: string; + export default src; +} +declare module '*.pjpeg' { + const src: string; + export default src; +} +declare module '*.pjp' { + const src: string; + export default src; +} +declare module '*.gif' { + const src: string; + export default src; +} +declare module '*.svg' { + const ReactComponent: React.FC>; + const content: string; + + export { ReactComponent }; + export default content; +} +declare module '*.ico' { + const src: string; + export default src; +} +declare module '*.webp' { + const src: string; + export default src; +} +declare module '*.avif' { + const src: string; + export default src; +} + +// media +declare module '*.mp4' { + const src: string; + export default src; +} +declare module '*.webm' { + const src: string; + export default src; +} +declare module '*.ogg' { + const src: string; + export default src; +} +declare module '*.mp3' { + const src: string; + export default src; +} +declare module '*.wav' { + const src: string; + export default src; +} +declare module '*.flac' { + const src: string; + export default src; +} +declare module '*.aac' { + const src: string; + export default src; +} + +declare module '*.opus' { + const src: string; + export default src; +} + +// fonts +declare module '*.woff' { + const src: string; + export default src; +} +declare module '*.woff2' { + const src: string; + export default src; +} +declare module '*.eot' { + const src: string; + export default src; +} +declare module '*.ttf' { + const src: string; + export default src; +} +declare module '*.otf' { + const src: string; + export default src; +} + +// other +declare module '*.webmanifest' { + const src: string; + export default src; +} +declare module '*.pdf' { + const src: string; + export default src; +} +declare module '*.txt' { + const src: string; + export default src; +} diff --git a/rspack_hmr/host/tsconfig.json b/rspack_hmr/host/tsconfig.json new file mode 100644 index 0000000..cb52ef7 --- /dev/null +++ b/rspack_hmr/host/tsconfig.json @@ -0,0 +1,21 @@ +{ + "compilerOptions": { + "target": "ES6", + "lib": ["DOM", "DOM.Iterable", "ESNext"], + "module": "ESNext", + "moduleResolution": "bundler", + "allowImportingTsExtensions": true, + "resolveJsonModule": true, + "isolatedModules": true, + "noEmit": true, + "jsx": "react-jsx", + "strict": true, + "noUnusedLocals": true, + "noUnusedParameters": true, + "noFallthroughCasesInSwitch": true, + "paths": { + "*": ["./@mf-types/*"] + } + }, + "include": ["src"] +} diff --git a/rspack_hmr/package.json b/rspack_hmr/package.json new file mode 100644 index 0000000..9745597 --- /dev/null +++ b/rspack_hmr/package.json @@ -0,0 +1,14 @@ +{ + "name": "rspack-hmr", + "scripts": { + "install-all": "concurrently \"pnpm i --filter @rspack-hmr/rspack-host\" \"pnpm i --filter @rspack-hmr/app2\" \"pnpm i --filter @rspack-hmr/rspack-runhost\"", + "start": "pnpm run --filter @rspack-hmr/* dev", + "build": "pnpm run --filter @rspack-hmr/* build" + }, + "devDependencies": { + "concurrently": "^8.2.2" + }, + "engines": { + "node": "20.x" + } +} \ No newline at end of file diff --git a/rspack_hmr/pnpm-lock.yaml b/rspack_hmr/pnpm-lock.yaml new file mode 100644 index 0000000..949480e --- /dev/null +++ b/rspack_hmr/pnpm-lock.yaml @@ -0,0 +1,204 @@ +lockfileVersion: '6.0' + +settings: + autoInstallPeers: true + excludeLinksFromLockfile: false + +devDependencies: + concurrently: + specifier: ^8.2.2 + version: 8.2.2 + +packages: + + /@babel/runtime@7.24.7: + resolution: {integrity: sha512-UwgBRMjJP+xv857DCngvqXI3Iq6J4v0wXmwc6sapg+zyhbwmQX67LUEFrkK5tbyJ30jGuG3ZvWpBiB9LCy1kWw==} + engines: {node: '>=6.9.0'} + dependencies: + regenerator-runtime: 0.14.1 + dev: true + + /ansi-regex@5.0.1: + resolution: {integrity: sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==} + engines: {node: '>=8'} + dev: true + + /ansi-styles@4.3.0: + resolution: {integrity: sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==} + engines: {node: '>=8'} + dependencies: + color-convert: 2.0.1 + dev: true + + /chalk@4.1.2: + resolution: {integrity: sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==} + engines: {node: '>=10'} + dependencies: + ansi-styles: 4.3.0 + supports-color: 7.2.0 + dev: true + + /cliui@8.0.1: + resolution: {integrity: sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==} + engines: {node: '>=12'} + dependencies: + string-width: 4.2.3 + strip-ansi: 6.0.1 + wrap-ansi: 7.0.0 + dev: true + + /color-convert@2.0.1: + resolution: {integrity: sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==} + engines: {node: '>=7.0.0'} + dependencies: + color-name: 1.1.4 + dev: true + + /color-name@1.1.4: + resolution: {integrity: sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==} + dev: true + + /concurrently@8.2.2: + resolution: {integrity: sha512-1dP4gpXFhei8IOtlXRE/T/4H88ElHgTiUzh71YUmtjTEHMSRS2Z/fgOxHSxxusGHogsRfxNq1vyAwxSC+EVyDg==} + engines: {node: ^14.13.0 || >=16.0.0} + hasBin: true + dependencies: + chalk: 4.1.2 + date-fns: 2.30.0 + lodash: 4.17.21 + rxjs: 7.8.1 + shell-quote: 1.8.1 + spawn-command: 0.0.2 + supports-color: 8.1.1 + tree-kill: 1.2.2 + yargs: 17.7.2 + dev: true + + /date-fns@2.30.0: + resolution: {integrity: sha512-fnULvOpxnC5/Vg3NCiWelDsLiUc9bRwAPs/+LfTLNvetFCtCTN+yQz15C/fs4AwX1R9K5GLtLfn8QW+dWisaAw==} + engines: {node: '>=0.11'} + dependencies: + '@babel/runtime': 7.24.7 + dev: true + + /emoji-regex@8.0.0: + resolution: {integrity: sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==} + dev: true + + /escalade@3.1.2: + resolution: {integrity: sha512-ErCHMCae19vR8vQGe50xIsVomy19rg6gFu3+r3jkEO46suLMWBksvVyoGgQV+jOfl84ZSOSlmv6Gxa89PmTGmA==} + engines: {node: '>=6'} + dev: true + + /get-caller-file@2.0.5: + resolution: {integrity: sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==} + engines: {node: 6.* || 8.* || >= 10.*} + dev: true + + /has-flag@4.0.0: + resolution: {integrity: sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==} + engines: {node: '>=8'} + dev: true + + /is-fullwidth-code-point@3.0.0: + resolution: {integrity: sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==} + engines: {node: '>=8'} + dev: true + + /lodash@4.17.21: + resolution: {integrity: sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==} + dev: true + + /regenerator-runtime@0.14.1: + resolution: {integrity: sha512-dYnhHh0nJoMfnkZs6GmmhFknAGRrLznOu5nc9ML+EJxGvrx6H7teuevqVqCuPcPK//3eDrrjQhehXVx9cnkGdw==} + dev: true + + /require-directory@2.1.1: + resolution: {integrity: sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==} + engines: {node: '>=0.10.0'} + dev: true + + /rxjs@7.8.1: + resolution: {integrity: sha512-AA3TVj+0A2iuIoQkWEK/tqFjBq2j+6PO6Y0zJcvzLAFhEFIO3HL0vls9hWLncZbAAbK0mar7oZ4V079I/qPMxg==} + dependencies: + tslib: 2.6.3 + dev: true + + /shell-quote@1.8.1: + resolution: {integrity: sha512-6j1W9l1iAs/4xYBI1SYOVZyFcCis9b4KCLQ8fgAGG07QvzaRLVVRQvAy85yNmmZSjYjg4MWh4gNvlPujU/5LpA==} + dev: true + + /spawn-command@0.0.2: + resolution: {integrity: sha512-zC8zGoGkmc8J9ndvml8Xksr1Amk9qBujgbF0JAIWO7kXr43w0h/0GJNM/Vustixu+YE8N/MTrQ7N31FvHUACxQ==} + dev: true + + /string-width@4.2.3: + resolution: {integrity: sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==} + engines: {node: '>=8'} + dependencies: + emoji-regex: 8.0.0 + is-fullwidth-code-point: 3.0.0 + strip-ansi: 6.0.1 + dev: true + + /strip-ansi@6.0.1: + resolution: {integrity: sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==} + engines: {node: '>=8'} + dependencies: + ansi-regex: 5.0.1 + dev: true + + /supports-color@7.2.0: + resolution: {integrity: sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==} + engines: {node: '>=8'} + dependencies: + has-flag: 4.0.0 + dev: true + + /supports-color@8.1.1: + resolution: {integrity: sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==} + engines: {node: '>=10'} + dependencies: + has-flag: 4.0.0 + dev: true + + /tree-kill@1.2.2: + resolution: {integrity: sha512-L0Orpi8qGpRG//Nd+H90vFB+3iHnue1zSSGmNOOCh1GLJ7rUKVwV2HvijphGQS2UmhUZewS9VgvxYIdgr+fG1A==} + hasBin: true + dev: true + + /tslib@2.6.3: + resolution: {integrity: sha512-xNvxJEOUiWPGhUuUdQgAJPKOOJfGnIyKySOc09XkKsgdUV/3E2zvwZYdejjmRgPCgcym1juLH3226yA7sEFJKQ==} + dev: true + + /wrap-ansi@7.0.0: + resolution: {integrity: sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==} + engines: {node: '>=10'} + dependencies: + ansi-styles: 4.3.0 + string-width: 4.2.3 + strip-ansi: 6.0.1 + dev: true + + /y18n@5.0.8: + resolution: {integrity: sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==} + engines: {node: '>=10'} + dev: true + + /yargs-parser@21.1.1: + resolution: {integrity: sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==} + engines: {node: '>=12'} + dev: true + + /yargs@17.7.2: + resolution: {integrity: sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==} + engines: {node: '>=12'} + dependencies: + cliui: 8.0.1 + escalade: 3.1.2 + get-caller-file: 2.0.5 + require-directory: 2.1.1 + string-width: 4.2.3 + y18n: 5.0.8 + yargs-parser: 21.1.1 + dev: true diff --git a/rspack_hmr/runhost/.gitignore b/rspack_hmr/runhost/.gitignore new file mode 100644 index 0000000..a547bf3 --- /dev/null +++ b/rspack_hmr/runhost/.gitignore @@ -0,0 +1,24 @@ +# Logs +logs +*.log +npm-debug.log* +yarn-debug.log* +yarn-error.log* +pnpm-debug.log* +lerna-debug.log* + +node_modules +dist +dist-ssr +*.local + +# Editor directories and files +.vscode/* +!.vscode/extensions.json +.idea +.DS_Store +*.suo +*.ntvs* +*.njsproj +*.sln +*.sw? diff --git a/rspack_hmr/runhost/@mf-types/a2/Hello.d.ts b/rspack_hmr/runhost/@mf-types/a2/Hello.d.ts new file mode 100644 index 0000000..965f617 --- /dev/null +++ b/rspack_hmr/runhost/@mf-types/a2/Hello.d.ts @@ -0,0 +1,2 @@ +export * from './compiled-types/Hello'; +export { default } from './compiled-types/Hello'; \ No newline at end of file diff --git a/rspack_hmr/runhost/@mf-types/a2/apis.d.ts b/rspack_hmr/runhost/@mf-types/a2/apis.d.ts new file mode 100644 index 0000000..3515229 --- /dev/null +++ b/rspack_hmr/runhost/@mf-types/a2/apis.d.ts @@ -0,0 +1,3 @@ + + export type RemoteKeys = 'a2/Hello' | 'a2/pi'; + type PackageType = T extends 'a2/pi' ? typeof import('a2/pi') :T extends 'a2/Hello' ? typeof import('a2/Hello') :any; \ No newline at end of file diff --git a/rspack_hmr/runhost/@mf-types/a2/compiled-types/Hello.d.ts b/rspack_hmr/runhost/@mf-types/a2/compiled-types/Hello.d.ts new file mode 100644 index 0000000..a70e0b7 --- /dev/null +++ b/rspack_hmr/runhost/@mf-types/a2/compiled-types/Hello.d.ts @@ -0,0 +1,5 @@ +interface Props { + name: string; +} +export declare const Hello: ({ name }: Props) => import("react/jsx-runtime").JSX.Element; +export {}; diff --git a/rspack_hmr/runhost/@mf-types/a2/compiled-types/pi.d.ts b/rspack_hmr/runhost/@mf-types/a2/compiled-types/pi.d.ts new file mode 100644 index 0000000..98a0b63 --- /dev/null +++ b/rspack_hmr/runhost/@mf-types/a2/compiled-types/pi.d.ts @@ -0,0 +1 @@ +export default function pi(): number; diff --git a/rspack_hmr/runhost/@mf-types/a2/pi.d.ts b/rspack_hmr/runhost/@mf-types/a2/pi.d.ts new file mode 100644 index 0000000..b1d8b3d --- /dev/null +++ b/rspack_hmr/runhost/@mf-types/a2/pi.d.ts @@ -0,0 +1,2 @@ +export * from './compiled-types/pi'; +export { default } from './compiled-types/pi'; \ No newline at end of file diff --git a/rspack_hmr/runhost/@mf-types/index.d.ts b/rspack_hmr/runhost/@mf-types/index.d.ts new file mode 100644 index 0000000..8c6b3d4 --- /dev/null +++ b/rspack_hmr/runhost/@mf-types/index.d.ts @@ -0,0 +1,23 @@ +import type { PackageType as PackageType_0,RemoteKeys as RemoteKeys_0 } from './a2/apis.d.ts'; + declare module "@module-federation/runtime" { + type RemoteKeys = RemoteKeys_0; + type PackageType = T extends RemoteKeys_0 ? PackageType_0 : +Y ; + export function loadRemote(packageName: T): Promise>; + export function loadRemote(packageName: T): Promise>; + } +declare module "@module-federation/enhanced/runtime" { + type RemoteKeys = RemoteKeys_0; + type PackageType = T extends RemoteKeys_0 ? PackageType_0 : +Y ; + export function loadRemote(packageName: T): Promise>; + export function loadRemote(packageName: T): Promise>; + } +declare module "@module-federation/runtime-tools" { + type RemoteKeys = RemoteKeys_0; + type PackageType = T extends RemoteKeys_0 ? PackageType_0 : +Y ; + export function loadRemote(packageName: T): Promise>; + export function loadRemote(packageName: T): Promise>; + } + \ No newline at end of file diff --git a/rspack_hmr/runhost/index.html b/rspack_hmr/runhost/index.html new file mode 100644 index 0000000..5dab944 --- /dev/null +++ b/rspack_hmr/runhost/index.html @@ -0,0 +1,16 @@ + + + + + + + + Rspack + React + TS + + + + +
    + + + \ No newline at end of file diff --git a/rspack_hmr/runhost/package.json b/rspack_hmr/runhost/package.json new file mode 100644 index 0000000..3b2e1b5 --- /dev/null +++ b/rspack_hmr/runhost/package.json @@ -0,0 +1,26 @@ +{ + "name": "@rspack-hmr/rspack-runhost", + "private": true, + "version": "1.0.0", + "scripts": { + "dev": "NODE_ENV=development rspack serve", + "build": "NODE_ENV=production rspack build" + }, + "dependencies": { + "@module-federation/enhanced": "0.2.1", + "@module-federation/runtime": "0.2.1", + "@module-federation/sdk": "0.2.1", + "react": "^18.2.0", + "react-dom": "^18.2.0", + "zephyr-webpack-plugin": "^0.0.13" + }, + "devDependencies": { + "@rspack/cli": "0.7.4", + "@rspack/core": "0.7.4", + "@rspack/plugin-react-refresh": "0.7.4", + "@types/react": "18.3.3", + "@types/react-dom": "18.3.0", + "prettier": "3.3.2", + "react-refresh": "0.14.2" + } +} diff --git a/rspack_hmr/runhost/pnpm-lock.yaml b/rspack_hmr/runhost/pnpm-lock.yaml new file mode 100644 index 0000000..6359e06 --- /dev/null +++ b/rspack_hmr/runhost/pnpm-lock.yaml @@ -0,0 +1,3163 @@ +lockfileVersion: '6.0' + +settings: + autoInstallPeers: true + excludeLinksFromLockfile: false + +dependencies: + '@module-federation/enhanced': + specifier: 0.2.1 + version: 0.2.1(typescript@5.5.3)(webpack@5.92.1) + '@module-federation/runtime': + specifier: 0.2.1 + version: 0.2.1 + '@module-federation/sdk': + specifier: 0.2.1 + version: 0.2.1 + react: + specifier: ^18.2.0 + version: 18.3.1 + react-dom: + specifier: ^18.2.0 + version: 18.3.1(react@18.3.1) + zephyr-webpack-plugin: + specifier: ^0.0.13 + version: 0.0.13 + +devDependencies: + '@rspack/cli': + specifier: 0.7.4 + version: 0.7.4(@rspack/core@0.7.4)(webpack@5.92.1) + '@rspack/core': + specifier: 0.7.4 + version: 0.7.4 + '@rspack/plugin-react-refresh': + specifier: 0.7.4 + version: 0.7.4(react-refresh@0.14.2) + '@types/react': + specifier: 18.3.3 + version: 18.3.3 + '@types/react-dom': + specifier: 18.3.0 + version: 18.3.0 + prettier: + specifier: 3.3.2 + version: 3.3.2 + react-refresh: + specifier: 0.14.2 + version: 0.14.2 + +packages: + + /@discoveryjs/json-ext@0.5.7: + resolution: {integrity: sha512-dBVuXR082gk3jsFp7Rd/JI4kytwGHecnCoTtXFb7DB6CNHp4rg5k1bhg0nWdLGLnOV71lmDzGQaLMy8iPLY0pw==} + engines: {node: '>=10.0.0'} + dev: true + + /@jridgewell/gen-mapping@0.3.5: + resolution: {integrity: sha512-IzL8ZoEDIBRWEzlCcRhOaCupYyN5gdIK+Q6fbFdPDg6HqX6jpkItn7DFIpW9LQzXG6Df9sA7+OKnq0qlz/GaQg==} + engines: {node: '>=6.0.0'} + dependencies: + '@jridgewell/set-array': 1.2.1 + '@jridgewell/sourcemap-codec': 1.4.15 + '@jridgewell/trace-mapping': 0.3.25 + + /@jridgewell/resolve-uri@3.1.2: + resolution: {integrity: sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==} + engines: {node: '>=6.0.0'} + + /@jridgewell/set-array@1.2.1: + resolution: {integrity: sha512-R8gLRTZeyp03ymzP/6Lil/28tGeGEzhx1q2k703KGWRAI1VdvPIXdG70VJc2pAMw3NA6JKL5hhFu1sJX0Mnn/A==} + engines: {node: '>=6.0.0'} + + /@jridgewell/source-map@0.3.6: + resolution: {integrity: sha512-1ZJTZebgqllO79ue2bm3rIGud/bOe0pP5BjSRCRxxYkEZS8STV7zN84UBbiYu7jy+eCKSnVIUgoWWE/tt+shMQ==} + dependencies: + '@jridgewell/gen-mapping': 0.3.5 + '@jridgewell/trace-mapping': 0.3.25 + + /@jridgewell/sourcemap-codec@1.4.15: + resolution: {integrity: sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg==} + + /@jridgewell/trace-mapping@0.3.25: + resolution: {integrity: sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ==} + dependencies: + '@jridgewell/resolve-uri': 3.1.2 + '@jridgewell/sourcemap-codec': 1.4.15 + + /@leichtgewicht/ip-codec@2.0.5: + resolution: {integrity: sha512-Vo+PSpZG2/fmgmiNzYK9qWRh8h/CHrwD0mo1h1DzL4yzHNSfWYujGTYsWGreD000gcgmZ7K4Ys6Tx9TxtsKdDw==} + dev: true + + /@module-federation/automatic-vendor-federation@1.2.1(webpack@5.92.1): + resolution: {integrity: sha512-73wxkXM7pbRZ6GGM90JP5IPTPvY3fvrhQyTVdMCUx85cQRWqnbzbibcsz3pkOMOeXyYAO4tXXsG13yNaEEGhJA==} + peerDependencies: + webpack: 5.91.0 + dependencies: + find-package-json: 1.2.0 + webpack: 5.92.1 + dev: false + + /@module-federation/bridge-react-webpack-plugin@0.2.1: + resolution: {integrity: sha512-dWqA4mm81yDBBWD452UiX3TXxFQPpu4KCArAIO72cISq5Llrsd0WbyUQY1DOWFN8wdhy5OwyMS5qj5wCNHXeew==} + dependencies: + '@module-federation/sdk': 0.2.1 + dev: false + + /@module-federation/dts-plugin@0.2.1(typescript@5.5.3): + resolution: {integrity: sha512-hr1w7KEaIVvoCB6mn1//+yZig099m6Ux3b5lW+w7SrH54dLzJHtIfllhWhZPZi5D9Y3mMuQlAxodsCD/sXQlKQ==} + peerDependencies: + typescript: ^4.9.0 || ^5.0.0 + vue-tsc: ^1.0.24 + peerDependenciesMeta: + vue-tsc: + optional: true + dependencies: + '@module-federation/managers': 0.2.1 + '@module-federation/sdk': 0.2.1 + '@module-federation/third-party-dts-extractor': 0.2.1 + adm-zip: 0.5.14 + ansi-colors: 4.1.3 + axios: 1.7.2 + chalk: 3.0.0 + fs-extra: 9.1.0 + isomorphic-ws: 5.0.0(ws@8.17.1) + koa: 2.11.0 + lodash.clonedeepwith: 4.5.0 + log4js: 6.9.1 + node-schedule: 2.1.1 + rambda: 9.2.1 + typescript: 5.5.3 + ws: 8.17.1 + transitivePeerDependencies: + - bufferutil + - debug + - supports-color + - utf-8-validate + dev: false + + /@module-federation/enhanced@0.2.1(typescript@5.5.3)(webpack@5.92.1): + resolution: {integrity: sha512-4iXsTU7HQUNtZMR4FAUTuctBQ9jOkYPINiCRveZjERW+UWC2g6KZ/rjbT5H5pBu/Ta6os8NSuNECtXGsT6Bprg==} + peerDependencies: + typescript: ^4.9.0 || ^5.0.0 + vue-tsc: ^1.0.24 + webpack: ^5.0.0 + peerDependenciesMeta: + typescript: + optional: true + vue-tsc: + optional: true + webpack: + optional: true + dependencies: + '@module-federation/bridge-react-webpack-plugin': 0.2.1 + '@module-federation/dts-plugin': 0.2.1(typescript@5.5.3) + '@module-federation/managers': 0.2.1 + '@module-federation/manifest': 0.2.1(typescript@5.5.3) + '@module-federation/rspack': 0.2.1(typescript@5.5.3) + '@module-federation/runtime-tools': 0.2.1 + '@module-federation/sdk': 0.2.1 + btoa: 1.2.1 + typescript: 5.5.3 + upath: 2.0.1 + webpack: 5.92.1 + transitivePeerDependencies: + - bufferutil + - debug + - supports-color + - utf-8-validate + dev: false + + /@module-federation/managers@0.2.1: + resolution: {integrity: sha512-x7Qon5YhLr9KPjig2zPkL76ZFLkvzDm7zrF2fVGO/wURWoeTougZ8vcUsDFrpEHxoQaC3OEgN0i5ZwEeRZlE2Q==} + dependencies: + '@module-federation/sdk': 0.2.1 + find-pkg: 2.0.0 + fs-extra: 9.1.0 + dev: false + + /@module-federation/manifest@0.2.1(typescript@5.5.3): + resolution: {integrity: sha512-Q0mw8ASPwCFdOvVrm7VHUMfki5MCtglb0FIPTDfhhHgVEQ6J2zW7WTu8/6HXY/SiorI1r1YBp9qhh0EzpMxgvA==} + dependencies: + '@module-federation/dts-plugin': 0.2.1(typescript@5.5.3) + '@module-federation/managers': 0.2.1 + '@module-federation/sdk': 0.2.1 + chalk: 3.0.0 + find-pkg: 2.0.0 + transitivePeerDependencies: + - bufferutil + - debug + - supports-color + - typescript + - utf-8-validate + - vue-tsc + dev: false + + /@module-federation/rspack@0.2.1(typescript@5.5.3): + resolution: {integrity: sha512-J6IGpHje69E7l6kJAZ++j35OqCJDmkj5vFdt4/nSosgAHH1hnVzTgZAvscvfsupgUntZn0HJWPNmXwBaOrccbw==} + dependencies: + '@module-federation/bridge-react-webpack-plugin': 0.2.1 + '@module-federation/dts-plugin': 0.2.1(typescript@5.5.3) + '@module-federation/managers': 0.2.1 + '@module-federation/manifest': 0.2.1(typescript@5.5.3) + '@module-federation/runtime-tools': 0.2.1 + '@module-federation/sdk': 0.2.1 + transitivePeerDependencies: + - bufferutil + - debug + - supports-color + - typescript + - utf-8-validate + - vue-tsc + dev: false + + /@module-federation/runtime-tools@0.1.6: + resolution: {integrity: sha512-7ILVnzMIa0Dlc0Blck5tVZG1tnk1MmLnuZpLOMpbdW+zl+N6wdMjjHMjEZFCUAJh2E5XJ3BREwfX8Ets0nIkLg==} + dependencies: + '@module-federation/runtime': 0.1.6 + '@module-federation/webpack-bundler-runtime': 0.1.6 + dev: true + + /@module-federation/runtime-tools@0.2.1: + resolution: {integrity: sha512-UUmEuvYWyubHfgavnqvkVmxI/Js1V4bYEMnIHTQsIn4j1DRe7DKhKeaFk+OxsAzspiIPZdEWrvmzehSYaSChJw==} + dependencies: + '@module-federation/runtime': 0.2.1 + '@module-federation/webpack-bundler-runtime': 0.2.1 + dev: false + + /@module-federation/runtime@0.1.6: + resolution: {integrity: sha512-nj6a+yJ+QxmcE89qmrTl4lphBIoAds0PFPVGnqLRWflwAP88jrCcrrTqRhARegkFDL+wE9AE04+h6jzlbIfMKg==} + dependencies: + '@module-federation/sdk': 0.1.6 + dev: true + + /@module-federation/runtime@0.2.1: + resolution: {integrity: sha512-uzp2Smg2yhJYnfYAlleFrDkVXi8b5MaEd9ve8YjrulCnhN3dAq4tQkwXOiryVtpGT5qVUBdfVoTW+HozYibEOw==} + dependencies: + '@module-federation/sdk': 0.2.1 + dev: false + + /@module-federation/sdk@0.1.6: + resolution: {integrity: sha512-qifXpyYLM7abUeEOIfv0oTkguZgRZuwh89YOAYIZJlkP6QbRG7DJMQvtM8X2yHXm9PTk0IYNnOJH0vNQCo6auQ==} + dev: true + + /@module-federation/sdk@0.2.1: + resolution: {integrity: sha512-t3136yds14EBb+BAvp3LJg8E8W+07tNweXUOt5NQfn4TROml6wF4TFyrLsaXi5F8c1C95IGYRxUNKjQ/ImLK6w==} + dev: false + + /@module-federation/third-party-dts-extractor@0.2.1: + resolution: {integrity: sha512-ws1xxpPcn1nE75jlc5jFeMaj65HdMiO9JN0Z661936q76C6gsjM0G+YQLRy/lr834/F4+zkRBaInyglM98I1eg==} + dependencies: + find-pkg: 2.0.0 + fs-extra: 9.1.0 + resolve: 1.22.8 + dev: false + + /@module-federation/webpack-bundler-runtime@0.1.6: + resolution: {integrity: sha512-K5WhKZ4RVNaMEtfHsd/9CNCgGKB0ipbm/tgweNNeC11mEuBTNxJ09Y630vg3WPkKv9vfMCuXg2p2Dk+Q/KWTSA==} + dependencies: + '@module-federation/runtime': 0.1.6 + '@module-federation/sdk': 0.1.6 + dev: true + + /@module-federation/webpack-bundler-runtime@0.2.1: + resolution: {integrity: sha512-8TdWq3TNd6fT6BayQRHtoonGfO5tyW/QjKJE/z2OWFFfG8JYF/dNWcOfLYm9Wui8Xts6nSyQIKhAD0tBifQtMw==} + dependencies: + '@module-federation/runtime': 0.2.1 + '@module-federation/sdk': 0.2.1 + dev: false + + /@polka/url@1.0.0-next.25: + resolution: {integrity: sha512-j7P6Rgr3mmtdkeDGTe0E/aYyWEWVtc5yFXtHCRHs28/jptDEWfaVOc5T7cblqy1XKPPfCxJc/8DwQ5YgLOZOVQ==} + dev: true + + /@rspack/binding-darwin-arm64@0.7.4: + resolution: {integrity: sha512-K78fUe9OhFTV61kHYCuahNkBXCFJMmqSGyIgNtLR9Psk82IVCHkvxY5565An1Quvo1UmgVh5R2YmylKE81mwiw==} + cpu: [arm64] + os: [darwin] + requiresBuild: true + dev: true + optional: true + + /@rspack/binding-darwin-x64@0.7.4: + resolution: {integrity: sha512-EQriu7oE+tZv25g5VJH6Ael74U42fmpb4zGs7wLmWyKfCtO6SegL3tJ8Jc6mMmp+vg949dVvkw7uB6TJjOqx2g==} + cpu: [x64] + os: [darwin] + requiresBuild: true + dev: true + optional: true + + /@rspack/binding-linux-arm64-gnu@0.7.4: + resolution: {integrity: sha512-yhJLkU1zEXMyHNWhh8pBEaK6cRAjFzRK2hqejhhZ0K+lqC0Af9bKvZyXXGrMfmmHlsh1VJ9VVmi21qcXr/kdzg==} + cpu: [arm64] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@rspack/binding-linux-arm64-musl@0.7.4: + resolution: {integrity: sha512-6GV3Ztl6Q1zdJmNo+dwHiJd2Y/IEH9qWOh4YHiyzYGbQQYpfhhLYwKexalWaAAhdMm6KKoeqzklgHImCINImEg==} + cpu: [arm64] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@rspack/binding-linux-x64-gnu@0.7.4: + resolution: {integrity: sha512-KFdAEIZ7mPnT0y198xVOa8vIT9tgpEFVidCSIlxdk65UGC59g6UxEQq1EVAbcBi1Ou6Zza/UtxIlzk6Ev6KDkQ==} + cpu: [x64] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@rspack/binding-linux-x64-musl@0.7.4: + resolution: {integrity: sha512-qekcXkv12oWRztZHXGzNAI92/O/+abU35/nGDycZmMtr+Qt2XS5hE1T9oBQ54yecIzUVDGNcYwhIMWBX6E2dmQ==} + cpu: [x64] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@rspack/binding-win32-arm64-msvc@0.7.4: + resolution: {integrity: sha512-D1BccimBVeA/k2ty/28ER/j3s/c0n0MtN4kpyjYwgRILVLRSr+rfbC75i8wYh8r8AXjhNWNG88LmrFN9e9i7Ug==} + cpu: [arm64] + os: [win32] + requiresBuild: true + dev: true + optional: true + + /@rspack/binding-win32-ia32-msvc@0.7.4: + resolution: {integrity: sha512-5//TZH0Y4fRuTQ/ZmNOVaIfPIQXtgNAI78QxvF8Amygk4Uqklpo3ceHGP+yZfZgjh3mzjoUK+22fWbq/cUmW0w==} + cpu: [ia32] + os: [win32] + requiresBuild: true + dev: true + optional: true + + /@rspack/binding-win32-x64-msvc@0.7.4: + resolution: {integrity: sha512-C3ZxIEYKvnjQbV19FfQE6CGO6vcGp2JcvSQCc6SHwU/KNxLDrI1pA7XUG5TKoGSsqVEDZN6H8fJxLUYPQBjJcg==} + cpu: [x64] + os: [win32] + requiresBuild: true + dev: true + optional: true + + /@rspack/binding@0.7.4: + resolution: {integrity: sha512-H1rTtYxbxe40miV2gYLPwIxEn2yMY6+bq+fjfiRu61kTvllexPMBYgFpKqSAc5Qyyto9j9uCkR4MJEYj2R/SQQ==} + optionalDependencies: + '@rspack/binding-darwin-arm64': 0.7.4 + '@rspack/binding-darwin-x64': 0.7.4 + '@rspack/binding-linux-arm64-gnu': 0.7.4 + '@rspack/binding-linux-arm64-musl': 0.7.4 + '@rspack/binding-linux-x64-gnu': 0.7.4 + '@rspack/binding-linux-x64-musl': 0.7.4 + '@rspack/binding-win32-arm64-msvc': 0.7.4 + '@rspack/binding-win32-ia32-msvc': 0.7.4 + '@rspack/binding-win32-x64-msvc': 0.7.4 + dev: true + + /@rspack/cli@0.7.4(@rspack/core@0.7.4)(webpack@5.92.1): + resolution: {integrity: sha512-UFQWYpgHqrtCzySif9F/ueBn8CbsGmlXOZRYnOzC9HzKXZY9JYgJFbT7EL7JfFe1LmBukF3yaTOuSgTbIxJkJQ==} + hasBin: true + peerDependencies: + '@rspack/core': '>=0.4.0' + dependencies: + '@discoveryjs/json-ext': 0.5.7 + '@rspack/core': 0.7.4 + '@rspack/dev-server': 0.7.4(@rspack/core@0.7.4)(webpack@5.92.1) + colorette: 2.0.19 + exit-hook: 3.2.0 + interpret: 3.1.1 + rechoir: 0.8.0 + semver: 6.3.1 + webpack-bundle-analyzer: 4.6.1 + yargs: 17.6.2 + transitivePeerDependencies: + - '@types/express' + - bufferutil + - debug + - supports-color + - utf-8-validate + - webpack + - webpack-cli + dev: true + + /@rspack/core@0.7.4: + resolution: {integrity: sha512-HECQ0WL8iVS1Mwq2W2hfrStZZbtTPl/GjDdAZDMToPqWtSVGww99UDGIYTHW8G6kawQ3GY6wa86WTQNfXEpSCA==} + engines: {node: '>=16.0.0'} + peerDependencies: + '@swc/helpers': '>=0.5.1' + peerDependenciesMeta: + '@swc/helpers': + optional: true + dependencies: + '@module-federation/runtime-tools': 0.1.6 + '@rspack/binding': 0.7.4 + caniuse-lite: 1.0.30001639 + tapable: 2.2.1 + webpack-sources: 3.2.3 + dev: true + + /@rspack/dev-server@0.7.4(@rspack/core@0.7.4)(webpack@5.92.1): + resolution: {integrity: sha512-mzc1gqZ0iMmqbsWiVSoRfZQiz2x1wGQc0uibyRzDxZ1Z9IqSjHwoZopVAN9aiR6CNWrSXRHy7KuyhCFfweOh0g==} + peerDependencies: + '@rspack/core': '*' + dependencies: + '@rspack/core': 0.7.4 + chokidar: 3.5.3 + connect-history-api-fallback: 2.0.0 + express: 4.19.2 + http-proxy-middleware: 2.0.6(@types/express@4.17.21) + mime-types: 2.1.35 + webpack-dev-middleware: 6.1.2(webpack@5.92.1) + webpack-dev-server: 4.13.1(webpack@5.92.1) + ws: 8.8.1 + transitivePeerDependencies: + - '@types/express' + - bufferutil + - debug + - supports-color + - utf-8-validate + - webpack + - webpack-cli + dev: true + + /@rspack/plugin-react-refresh@0.7.4(react-refresh@0.14.2): + resolution: {integrity: sha512-9tAJdG/xZ6hUtD5K5OVpwAl2yV2HFnNl5fU5aOR5VJ5Pk0rCsYwbEZRbRnmSZwzMWIKDnowhoTi+4Ha3JV3aeQ==} + peerDependencies: + react-refresh: '>=0.10.0 <1.0.0' + peerDependenciesMeta: + react-refresh: + optional: true + dependencies: + react-refresh: 0.14.2 + dev: true + + /@socket.io/component-emitter@3.1.2: + resolution: {integrity: sha512-9BCxFwvbGg/RsZK9tjXd8s4UcwR0MWeFQ1XEKIQVVvAGJyINdrqKMcTRyLoK8Rse1GjzLV9cwjWV1olXRWEXVA==} + dev: false + + /@types/body-parser@1.19.5: + resolution: {integrity: sha512-fB3Zu92ucau0iQ0JMCFQE7b/dv8Ot07NI3KaZIkIUNXq82k4eBAqUaneXfleGY9JWskeS9y+u0nXMyspcuQrCg==} + dependencies: + '@types/connect': 3.4.38 + '@types/node': 20.14.9 + dev: true + + /@types/bonjour@3.5.13: + resolution: {integrity: sha512-z9fJ5Im06zvUL548KvYNecEVlA7cVDkGUi6kZusb04mpyEFKCIZJvloCcmpmLaIahDpOQGHaHmG6imtPMmPXGQ==} + dependencies: + '@types/node': 20.14.9 + dev: true + + /@types/connect-history-api-fallback@1.5.4: + resolution: {integrity: sha512-n6Cr2xS1h4uAulPRdlw6Jl6s1oG8KrVilPN2yUITEs+K48EzMJJ3W1xy8K5eWuFvjp3R74AOIGSmp2UfBJ8HFw==} + dependencies: + '@types/express-serve-static-core': 4.19.5 + '@types/node': 20.14.9 + dev: true + + /@types/connect@3.4.38: + resolution: {integrity: sha512-K6uROf1LD88uDQqJCktA4yzL1YYAK6NgfsI0v/mTgyPKWsX1CnJ0XPSDhViejru1GcRkLWb8RlzFYJRqGUbaug==} + dependencies: + '@types/node': 20.14.9 + dev: true + + /@types/eslint-scope@3.7.7: + resolution: {integrity: sha512-MzMFlSLBqNF2gcHWO0G1vP/YQyfvrxZ0bF+u7mzUdZ1/xK4A4sru+nraZz5i3iEIk1l1uyicaDVTB4QbbEkAYg==} + dependencies: + '@types/eslint': 8.56.10 + '@types/estree': 1.0.5 + + /@types/eslint@8.56.10: + resolution: {integrity: sha512-Shavhk87gCtY2fhXDctcfS3e6FdxWkCx1iUZ9eEUbh7rTqlZT0/IzOkCOVt0fCjcFuZ9FPYfuezTBImfHCDBGQ==} + dependencies: + '@types/estree': 1.0.5 + '@types/json-schema': 7.0.15 + + /@types/estree@1.0.5: + resolution: {integrity: sha512-/kYRxGDLWzHOB7q+wtSUQlFrtcdUccpfy+X+9iMBpHK8QLLhx2wIPYuS5DYtR9Wa/YlZAbIovy7qVdB1Aq6Lyw==} + + /@types/express-serve-static-core@4.19.5: + resolution: {integrity: sha512-y6W03tvrACO72aijJ5uF02FRq5cgDR9lUxddQ8vyF+GvmjJQqbzDcJngEjURc+ZsG31VI3hODNZJ2URj86pzmg==} + dependencies: + '@types/node': 20.14.9 + '@types/qs': 6.9.15 + '@types/range-parser': 1.2.7 + '@types/send': 0.17.4 + dev: true + + /@types/express@4.17.21: + resolution: {integrity: sha512-ejlPM315qwLpaQlQDTjPdsUFSc6ZsP4AN6AlWnogPjQ7CVi7PYF3YVz+CY3jE2pwYf7E/7HlDAN0rV2GxTG0HQ==} + dependencies: + '@types/body-parser': 1.19.5 + '@types/express-serve-static-core': 4.19.5 + '@types/qs': 6.9.15 + '@types/serve-static': 1.15.7 + dev: true + + /@types/http-errors@2.0.4: + resolution: {integrity: sha512-D0CFMMtydbJAegzOyHjtiKPLlvnm3iTZyZRSZoLq2mRhDdmLfIWOCYPfQJ4cu2erKghU++QvjcUjp/5h7hESpA==} + dev: true + + /@types/http-proxy@1.17.14: + resolution: {integrity: sha512-SSrD0c1OQzlFX7pGu1eXxSEjemej64aaNPRhhVYUGqXh0BtldAAx37MG8btcumvpgKyZp1F5Gn3JkktdxiFv6w==} + dependencies: + '@types/node': 20.14.9 + dev: true + + /@types/json-schema@7.0.15: + resolution: {integrity: sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==} + + /@types/mime@1.3.5: + resolution: {integrity: sha512-/pyBZWSLD2n0dcHE3hq8s8ZvcETHtEuF+3E7XVt0Ig2nvsVQXdghHVcEkIWjy9A0wKfTn97a/PSDYohKIlnP/w==} + dev: true + + /@types/node-forge@1.3.11: + resolution: {integrity: sha512-FQx220y22OKNTqaByeBGqHWYz4cl94tpcxeFdvBo3wjG6XPBuZ0BNgNZRV5J5TFmmcsJ4IzsLkmGRiQbnYsBEQ==} + dependencies: + '@types/node': 20.14.9 + dev: true + + /@types/node@20.14.9: + resolution: {integrity: sha512-06OCtnTXtWOZBJlRApleWndH4JsRVs1pDCc8dLSQp+7PpUpX3ePdHyeNSFTeSe7FtKyQkrlPvHwJOW3SLd8Oyg==} + dependencies: + undici-types: 5.26.5 + + /@types/prop-types@15.7.12: + resolution: {integrity: sha512-5zvhXYtRNRluoE/jAp4GVsSduVUzNWKkOZrCDBWYtE7biZywwdC2AcEzg+cSMLFRfVgeAFqpfNabiPjxFddV1Q==} + dev: true + + /@types/qs@6.9.15: + resolution: {integrity: sha512-uXHQKES6DQKKCLh441Xv/dwxOq1TVS3JPUMlEqoEglvlhR6Mxnlew/Xq/LRVHpLyk7iK3zODe1qYHIMltO7XGg==} + dev: true + + /@types/range-parser@1.2.7: + resolution: {integrity: sha512-hKormJbkJqzQGhziax5PItDUTMAM9uE2XXQmM37dyd4hVM+5aVl7oVxMVUiVQn2oCQFN/LKCZdvSM0pFRqbSmQ==} + dev: true + + /@types/react-dom@18.3.0: + resolution: {integrity: sha512-EhwApuTmMBmXuFOikhQLIBUn6uFg81SwLMOAUgodJF14SOBOCMdU04gDoYi0WOJJHD144TL32z4yDqCW3dnkQg==} + dependencies: + '@types/react': 18.3.3 + dev: true + + /@types/react@18.3.3: + resolution: {integrity: sha512-hti/R0pS0q1/xx+TsI73XIqk26eBsISZ2R0wUijXIngRK9R/e7Xw/cXVxQK7R5JjW+SV4zGcn5hXjudkN/pLIw==} + dependencies: + '@types/prop-types': 15.7.12 + csstype: 3.1.3 + dev: true + + /@types/retry@0.12.0: + resolution: {integrity: sha512-wWKOClTTiizcZhXnPY4wikVAwmdYHp8q6DmC+EJUzAMsycb7HB32Kh9RN4+0gExjmPmZSAQjgURXIGATPegAvA==} + dev: true + + /@types/send@0.17.4: + resolution: {integrity: sha512-x2EM6TJOybec7c52BX0ZspPodMsQUd5L6PRwOunVyVUhXiBSKf3AezDL8Dgvgt5o0UfKNfuA0eMLr2wLT4AiBA==} + dependencies: + '@types/mime': 1.3.5 + '@types/node': 20.14.9 + dev: true + + /@types/serve-index@1.9.4: + resolution: {integrity: sha512-qLpGZ/c2fhSs5gnYsQxtDEq3Oy8SXPClIXkW5ghvAvsNuVSA8k+gCONcUCS/UjLEYvYps+e8uBtfgXgvhwfNug==} + dependencies: + '@types/express': 4.17.21 + dev: true + + /@types/serve-static@1.15.7: + resolution: {integrity: sha512-W8Ym+h8nhuRwaKPaDw34QUkwsGi6Rc4yYqvKFo5rm2FUEhCFbzVWrxXUxuKK8TASjWsysJY0nsmNCGhCOIsrOw==} + dependencies: + '@types/http-errors': 2.0.4 + '@types/node': 20.14.9 + '@types/send': 0.17.4 + dev: true + + /@types/sockjs@0.3.36: + resolution: {integrity: sha512-MK9V6NzAS1+Ud7JV9lJLFqW85VbC9dq3LmwZCuBe4wBDgKC0Kj/jd8Xl+nSviU+Qc3+m7umHHyHg//2KSa0a0Q==} + dependencies: + '@types/node': 20.14.9 + dev: true + + /@types/ws@8.5.10: + resolution: {integrity: sha512-vmQSUcfalpIq0R9q7uTo2lXs6eGIpt9wtnLdMv9LVpIjCA/+ufZRozlVoVelIYixx1ugCBKDhn89vnsEGOCx9A==} + dependencies: + '@types/node': 20.14.9 + dev: true + + /@webassemblyjs/ast@1.12.1: + resolution: {integrity: sha512-EKfMUOPRRUTy5UII4qJDGPpqfwjOmZ5jeGFwid9mnoqIFK+e0vqoi1qH56JpmZSzEL53jKnNzScdmftJyG5xWg==} + dependencies: + '@webassemblyjs/helper-numbers': 1.11.6 + '@webassemblyjs/helper-wasm-bytecode': 1.11.6 + + /@webassemblyjs/floating-point-hex-parser@1.11.6: + resolution: {integrity: sha512-ejAj9hfRJ2XMsNHk/v6Fu2dGS+i4UaXBXGemOfQ/JfQ6mdQg/WXtwleQRLLS4OvfDhv8rYnVwH27YJLMyYsxhw==} + + /@webassemblyjs/helper-api-error@1.11.6: + resolution: {integrity: sha512-o0YkoP4pVu4rN8aTJgAyj9hC2Sv5UlkzCHhxqWj8butaLvnpdc2jOwh4ewE6CX0txSfLn/UYaV/pheS2Txg//Q==} + + /@webassemblyjs/helper-buffer@1.12.1: + resolution: {integrity: sha512-nzJwQw99DNDKr9BVCOZcLuJJUlqkJh+kVzVl6Fmq/tI5ZtEyWT1KZMyOXltXLZJmDtvLCDgwsyrkohEtopTXCw==} + + /@webassemblyjs/helper-numbers@1.11.6: + resolution: {integrity: sha512-vUIhZ8LZoIWHBohiEObxVm6hwP034jwmc9kuq5GdHZH0wiLVLIPcMCdpJzG4C11cHoQ25TFIQj9kaVADVX7N3g==} + dependencies: + '@webassemblyjs/floating-point-hex-parser': 1.11.6 + '@webassemblyjs/helper-api-error': 1.11.6 + '@xtuc/long': 4.2.2 + + /@webassemblyjs/helper-wasm-bytecode@1.11.6: + resolution: {integrity: sha512-sFFHKwcmBprO9e7Icf0+gddyWYDViL8bpPjJJl0WHxCdETktXdmtWLGVzoHbqUcY4Be1LkNfwTmXOJUFZYSJdA==} + + /@webassemblyjs/helper-wasm-section@1.12.1: + resolution: {integrity: sha512-Jif4vfB6FJlUlSbgEMHUyk1j234GTNG9dBJ4XJdOySoj518Xj0oGsNi59cUQF4RRMS9ouBUxDDdyBVfPTypa5g==} + dependencies: + '@webassemblyjs/ast': 1.12.1 + '@webassemblyjs/helper-buffer': 1.12.1 + '@webassemblyjs/helper-wasm-bytecode': 1.11.6 + '@webassemblyjs/wasm-gen': 1.12.1 + + /@webassemblyjs/ieee754@1.11.6: + resolution: {integrity: sha512-LM4p2csPNvbij6U1f19v6WR56QZ8JcHg3QIJTlSwzFcmx6WSORicYj6I63f9yU1kEUtrpG+kjkiIAkevHpDXrg==} + dependencies: + '@xtuc/ieee754': 1.2.0 + + /@webassemblyjs/leb128@1.11.6: + resolution: {integrity: sha512-m7a0FhE67DQXgouf1tbN5XQcdWoNgaAuoULHIfGFIEVKA6tu/edls6XnIlkmS6FrXAquJRPni3ZZKjw6FSPjPQ==} + dependencies: + '@xtuc/long': 4.2.2 + + /@webassemblyjs/utf8@1.11.6: + resolution: {integrity: sha512-vtXf2wTQ3+up9Zsg8sa2yWiQpzSsMyXj0qViVP6xKGCUT8p8YJ6HqI7l5eCnWx1T/FYdsv07HQs2wTFbbof/RA==} + + /@webassemblyjs/wasm-edit@1.12.1: + resolution: {integrity: sha512-1DuwbVvADvS5mGnXbE+c9NfA8QRcZ6iKquqjjmR10k6o+zzsRVesil54DKexiowcFCPdr/Q0qaMgB01+SQ1u6g==} + dependencies: + '@webassemblyjs/ast': 1.12.1 + '@webassemblyjs/helper-buffer': 1.12.1 + '@webassemblyjs/helper-wasm-bytecode': 1.11.6 + '@webassemblyjs/helper-wasm-section': 1.12.1 + '@webassemblyjs/wasm-gen': 1.12.1 + '@webassemblyjs/wasm-opt': 1.12.1 + '@webassemblyjs/wasm-parser': 1.12.1 + '@webassemblyjs/wast-printer': 1.12.1 + + /@webassemblyjs/wasm-gen@1.12.1: + resolution: {integrity: sha512-TDq4Ojh9fcohAw6OIMXqiIcTq5KUXTGRkVxbSo1hQnSy6lAM5GSdfwWeSxpAo0YzgsgF182E/U0mDNhuA0tW7w==} + dependencies: + '@webassemblyjs/ast': 1.12.1 + '@webassemblyjs/helper-wasm-bytecode': 1.11.6 + '@webassemblyjs/ieee754': 1.11.6 + '@webassemblyjs/leb128': 1.11.6 + '@webassemblyjs/utf8': 1.11.6 + + /@webassemblyjs/wasm-opt@1.12.1: + resolution: {integrity: sha512-Jg99j/2gG2iaz3hijw857AVYekZe2SAskcqlWIZXjji5WStnOpVoat3gQfT/Q5tb2djnCjBtMocY/Su1GfxPBg==} + dependencies: + '@webassemblyjs/ast': 1.12.1 + '@webassemblyjs/helper-buffer': 1.12.1 + '@webassemblyjs/wasm-gen': 1.12.1 + '@webassemblyjs/wasm-parser': 1.12.1 + + /@webassemblyjs/wasm-parser@1.12.1: + resolution: {integrity: sha512-xikIi7c2FHXysxXe3COrVUPSheuBtpcfhbpFj4gmu7KRLYOzANztwUU0IbsqvMqzuNK2+glRGWCEqZo1WCLyAQ==} + dependencies: + '@webassemblyjs/ast': 1.12.1 + '@webassemblyjs/helper-api-error': 1.11.6 + '@webassemblyjs/helper-wasm-bytecode': 1.11.6 + '@webassemblyjs/ieee754': 1.11.6 + '@webassemblyjs/leb128': 1.11.6 + '@webassemblyjs/utf8': 1.11.6 + + /@webassemblyjs/wast-printer@1.12.1: + resolution: {integrity: sha512-+X4WAlOisVWQMikjbcvY2e0rwPsKQ9F688lksZhBcPycBBuii3O7m8FACbDMWDojpAqvjIncrG8J0XHKyQfVeA==} + dependencies: + '@webassemblyjs/ast': 1.12.1 + '@xtuc/long': 4.2.2 + + /@xtuc/ieee754@1.2.0: + resolution: {integrity: sha512-DX8nKgqcGwsc0eJSqYt5lwP4DH5FlHnmuWWBRy7X0NcaGR0ZtuyeESgMwTYVEtxmsNGY+qit4QYT/MIYTOTPeA==} + + /@xtuc/long@4.2.2: + resolution: {integrity: sha512-NuHqBY1PB/D8xU6s/thBgOAiAP7HOYDQ32+BFZILJ8ivkUkAHQnWfn6WhL79Owj1qmUnoN/YPhktdIoucipkAQ==} + + /accepts@1.3.8: + resolution: {integrity: sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw==} + engines: {node: '>= 0.6'} + dependencies: + mime-types: 2.1.35 + negotiator: 0.6.3 + + /acorn-import-attributes@1.9.5(acorn@8.12.0): + resolution: {integrity: sha512-n02Vykv5uA3eHGM/Z2dQrcD56kL8TyDb2p1+0P83PClMnC/nc+anbQRhIOWnSq4Ke/KvDPrY3C9hDtC/A3eHnQ==} + peerDependencies: + acorn: ^8 + dependencies: + acorn: 8.12.0 + + /acorn-walk@8.3.3: + resolution: {integrity: sha512-MxXdReSRhGO7VlFe1bRG/oI7/mdLV9B9JJT0N8vZOhF7gFRR5l3M8W9G8JxmKV+JC5mGqJ0QvqfSOLsCPa4nUw==} + engines: {node: '>=0.4.0'} + dependencies: + acorn: 8.12.0 + dev: true + + /acorn@8.12.0: + resolution: {integrity: sha512-RTvkC4w+KNXrM39/lWCUaG0IbRkWdCv7W/IOW9oU6SawyxulvkQy5HQPVTKxEjczcUvapcrw3cFx/60VN/NRNw==} + engines: {node: '>=0.4.0'} + hasBin: true + + /adm-zip@0.5.14: + resolution: {integrity: sha512-DnyqqifT4Jrcvb8USYjp6FHtBpEIz1mnXu6pTRHZ0RL69LbQYiO+0lDFg5+OKA7U29oWSs3a/i8fhn8ZcceIWg==} + engines: {node: '>=12.0'} + dev: false + + /ajv-formats@2.1.1(ajv@8.16.0): + resolution: {integrity: sha512-Wx0Kx52hxE7C18hkMEggYlEifqWZtYaRgouJor+WMdPnQyEK13vgEWyVNup7SoeeoLMsr4kf5h6dOW11I15MUA==} + peerDependencies: + ajv: ^8.0.0 + peerDependenciesMeta: + ajv: + optional: true + dependencies: + ajv: 8.16.0 + dev: true + + /ajv-keywords@3.5.2(ajv@6.12.6): + resolution: {integrity: sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ==} + peerDependencies: + ajv: ^6.9.1 + dependencies: + ajv: 6.12.6 + + /ajv-keywords@5.1.0(ajv@8.16.0): + resolution: {integrity: sha512-YCS/JNFAUyr5vAuhk1DWm1CBxRHW9LbJ2ozWeemrIqpbsqKjHVxYPyi5GC0rjZIT5JxJ3virVTS8wk4i/Z+krw==} + peerDependencies: + ajv: ^8.8.2 + dependencies: + ajv: 8.16.0 + fast-deep-equal: 3.1.3 + dev: true + + /ajv@6.12.6: + resolution: {integrity: sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==} + dependencies: + fast-deep-equal: 3.1.3 + fast-json-stable-stringify: 2.1.0 + json-schema-traverse: 0.4.1 + uri-js: 4.4.1 + + /ajv@8.16.0: + resolution: {integrity: sha512-F0twR8U1ZU67JIEtekUcLkXkoO5mMMmgGD8sK/xUFzJ805jxHQl92hImFAqqXMyMYjSPOyUPAwHYhB72g5sTXw==} + dependencies: + fast-deep-equal: 3.1.3 + json-schema-traverse: 1.0.0 + require-from-string: 2.0.2 + uri-js: 4.4.1 + dev: true + + /ansi-colors@4.1.3: + resolution: {integrity: sha512-/6w/C21Pm1A7aZitlI5Ni/2J6FFQN8i1Cvz3kHABAAbw93v/NlvKdVOqz7CCWz/3iv/JplRSEEZ83XION15ovw==} + engines: {node: '>=6'} + dev: false + + /ansi-html-community@0.0.8: + resolution: {integrity: sha512-1APHAyr3+PCamwNw3bXCPp4HFLONZt/yIH0sZp0/469KWNTEy+qN5jQ3GVX6DMZ1UXAi34yVwtTeaG/HpBuuzw==} + engines: {'0': node >= 0.8.0} + hasBin: true + dev: true + + /ansi-regex@5.0.1: + resolution: {integrity: sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==} + engines: {node: '>=8'} + dev: true + + /ansi-styles@4.3.0: + resolution: {integrity: sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==} + engines: {node: '>=8'} + dependencies: + color-convert: 2.0.1 + + /any-promise@1.3.0: + resolution: {integrity: sha512-7UvmKalWRt1wgjL1RrGxoSJW/0QZFIegpeGvZG9kjp8vrRu55XTHbwnqq2GpXm9uLbcuhxm3IqX9OB4MZR1b2A==} + dev: false + + /anymatch@3.1.3: + resolution: {integrity: sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==} + engines: {node: '>= 8'} + dependencies: + normalize-path: 3.0.0 + picomatch: 2.3.1 + dev: true + + /array-flatten@1.1.1: + resolution: {integrity: sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg==} + dev: true + + /asynckit@0.4.0: + resolution: {integrity: sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==} + dev: false + + /at-least-node@1.0.0: + resolution: {integrity: sha512-+q/t7Ekv1EDY2l6Gda6LLiX14rU9TV20Wa3ofeQmwPFZbOMo9DXrLbOjFaaclkXKWidIaopwAObQDqwWtGUjqg==} + engines: {node: '>= 4.0.0'} + dev: false + + /axios@1.7.2: + resolution: {integrity: sha512-2A8QhOMrbomlDuiLeK9XibIBzuHeRcqqNOHp0Cyp5EoJ1IFDh+XZH3A6BkXtv0K4gFGCI0Y4BM7B1wOEi0Rmgw==} + dependencies: + follow-redirects: 1.15.6 + form-data: 4.0.0 + proxy-from-env: 1.1.0 + transitivePeerDependencies: + - debug + dev: false + + /balanced-match@1.0.2: + resolution: {integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==} + dev: true + + /batch@0.6.1: + resolution: {integrity: sha512-x+VAiMRL6UPkx+kudNvxTl6hB2XNNCG2r+7wixVfIYwu/2HKRXimwQyaumLjMveWvT2Hkd/cAJw+QBMfJ/EKVw==} + dev: true + + /binary-extensions@2.3.0: + resolution: {integrity: sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw==} + engines: {node: '>=8'} + dev: true + + /body-parser@1.20.2: + resolution: {integrity: sha512-ml9pReCu3M61kGlqoTm2umSXTlRTuGTx0bfYj+uIUKKYycG5NtSbeetV3faSU6R7ajOPw0g/J1PvK4qNy7s5bA==} + engines: {node: '>= 0.8', npm: 1.2.8000 || >= 1.4.16} + dependencies: + bytes: 3.1.2 + content-type: 1.0.5 + debug: 2.6.9 + depd: 2.0.0 + destroy: 1.2.0 + http-errors: 2.0.0 + iconv-lite: 0.4.24 + on-finished: 2.4.1 + qs: 6.11.0 + raw-body: 2.5.2 + type-is: 1.6.18 + unpipe: 1.0.0 + transitivePeerDependencies: + - supports-color + dev: true + + /bonjour-service@1.2.1: + resolution: {integrity: sha512-oSzCS2zV14bh2kji6vNe7vrpJYCHGvcZnlffFQ1MEoX/WOeQ/teD8SYWKR942OI3INjq8OMNJlbPK5LLLUxFDw==} + dependencies: + fast-deep-equal: 3.1.3 + multicast-dns: 7.2.5 + dev: true + + /brace-expansion@1.1.11: + resolution: {integrity: sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==} + dependencies: + balanced-match: 1.0.2 + concat-map: 0.0.1 + dev: true + + /braces@3.0.3: + resolution: {integrity: sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==} + engines: {node: '>=8'} + dependencies: + fill-range: 7.1.1 + dev: true + + /browserslist@4.23.1: + resolution: {integrity: sha512-TUfofFo/KsK/bWZ9TWQ5O26tsWW4Uhmt8IYklbnUa70udB6P2wA7w7o4PY4muaEPBQaAX+CEnmmIA41NVHtPVw==} + engines: {node: ^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7} + hasBin: true + dependencies: + caniuse-lite: 1.0.30001639 + electron-to-chromium: 1.4.816 + node-releases: 2.0.14 + update-browserslist-db: 1.0.16(browserslist@4.23.1) + + /btoa@1.2.1: + resolution: {integrity: sha512-SB4/MIGlsiVkMcHmT+pSmIPoNDoHg+7cMzmt3Uxt628MTz2487DKSqK/fuhFBrkuqrYv5UCEnACpF4dTFNKc/g==} + engines: {node: '>= 0.4.0'} + hasBin: true + dev: false + + /buffer-from@1.1.2: + resolution: {integrity: sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==} + + /bundle-name@4.1.0: + resolution: {integrity: sha512-tjwM5exMg6BGRI+kNmTntNsvdZS1X8BFYS6tnJ2hdH0kVxM6/eVZ2xy+FqStSWvYmtfFMDLIxurorHwDKfDz5Q==} + engines: {node: '>=18'} + dependencies: + run-applescript: 7.0.0 + dev: false + + /bytes@3.0.0: + resolution: {integrity: sha512-pMhOfFDPiv9t5jjIXkHosWmkSyQbvsgEVNkz0ERHbuLh2T/7j4Mqqpz523Fe8MVY89KC6Sh/QfS2sM+SjgFDcw==} + engines: {node: '>= 0.8'} + dev: true + + /bytes@3.1.2: + resolution: {integrity: sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==} + engines: {node: '>= 0.8'} + dev: true + + /cache-content-type@1.0.1: + resolution: {integrity: sha512-IKufZ1o4Ut42YUrZSo8+qnMTrFuKkvyoLXUywKz9GJ5BrhOFGhLdkx9sG4KAnVvbY6kEcSFjLQul+DVmBm2bgA==} + engines: {node: '>= 6.0.0'} + dependencies: + mime-types: 2.1.35 + ylru: 1.4.0 + dev: false + + /call-bind@1.0.7: + resolution: {integrity: sha512-GHTSNSYICQ7scH7sZ+M2rFopRoLh8t2bLSW6BbgrtLsahOIB5iyAVJf9GjWK3cYTDaMj4XdBpM1cA6pIS0Kv2w==} + engines: {node: '>= 0.4'} + dependencies: + es-define-property: 1.0.0 + es-errors: 1.3.0 + function-bind: 1.1.2 + get-intrinsic: 1.2.4 + set-function-length: 1.2.2 + dev: true + + /caniuse-lite@1.0.30001639: + resolution: {integrity: sha512-eFHflNTBIlFwP2AIKaYuBQN/apnUoKNhBdza8ZnW/h2di4LCZ4xFqYlxUxo+LQ76KFI1PGcC1QDxMbxTZpSCAg==} + + /chalk@3.0.0: + resolution: {integrity: sha512-4D3B6Wf41KOYRFdszmDqMCGq5VV/uMAB273JILmO+3jAlh8X4qDtdtgCR3fxtbLEMzSx22QdhnDcJvu2u1fVwg==} + engines: {node: '>=8'} + dependencies: + ansi-styles: 4.3.0 + supports-color: 7.2.0 + dev: false + + /chalk@4.1.2: + resolution: {integrity: sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==} + engines: {node: '>=10'} + dependencies: + ansi-styles: 4.3.0 + supports-color: 7.2.0 + dev: true + + /chokidar@3.5.3: + resolution: {integrity: sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==} + engines: {node: '>= 8.10.0'} + dependencies: + anymatch: 3.1.3 + braces: 3.0.3 + glob-parent: 5.1.2 + is-binary-path: 2.1.0 + is-glob: 4.0.3 + normalize-path: 3.0.0 + readdirp: 3.6.0 + optionalDependencies: + fsevents: 2.3.3 + dev: true + + /chrome-trace-event@1.0.4: + resolution: {integrity: sha512-rNjApaLzuwaOTjCiT8lSDdGN1APCiqkChLMJxJPWLunPAt5fy8xgU9/jNOchV84wfIxrA0lRQB7oCT8jrn/wrQ==} + engines: {node: '>=6.0'} + + /ci-info@3.9.0: + resolution: {integrity: sha512-NIxF55hv4nSqQswkAeiOi1r83xy8JldOFDTWiug55KBu9Jnblncd2U6ViHmYgHf01TPZS77NJBhBMKdWj9HQMQ==} + engines: {node: '>=8'} + dev: false + + /cliui@8.0.1: + resolution: {integrity: sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==} + engines: {node: '>=12'} + dependencies: + string-width: 4.2.3 + strip-ansi: 6.0.1 + wrap-ansi: 7.0.0 + dev: true + + /co@4.6.0: + resolution: {integrity: sha512-QVb0dM5HvG+uaxitm8wONl7jltx8dqhfU33DcqtOZcLSVIKSDDLDi7+0LbAKiyI8hD9u42m2YxXSkMGWThaecQ==} + engines: {iojs: '>= 1.0.0', node: '>= 0.12.0'} + dev: false + + /color-convert@2.0.1: + resolution: {integrity: sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==} + engines: {node: '>=7.0.0'} + dependencies: + color-name: 1.1.4 + + /color-name@1.1.4: + resolution: {integrity: sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==} + + /colorette@2.0.19: + resolution: {integrity: sha512-3tlv/dIP7FWvj3BsbHrGLJ6l/oKh1O3TcgBqMn+yyCagOxc23fyzDS6HypQbgxWbkpDnf52p1LuR4eWDQ/K9WQ==} + dev: true + + /combined-stream@1.0.8: + resolution: {integrity: sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==} + engines: {node: '>= 0.8'} + dependencies: + delayed-stream: 1.0.0 + dev: false + + /commander@2.20.3: + resolution: {integrity: sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==} + + /commander@7.2.0: + resolution: {integrity: sha512-QrWXB+ZQSVPmIWIhtEO9H+gwHaMGYiF5ChvoJ+K9ZGHG/sVsa6yiesAD1GC/x46sET00Xlwo1u49RVVVzvcSkw==} + engines: {node: '>= 10'} + dev: true + + /compressible@2.0.18: + resolution: {integrity: sha512-AF3r7P5dWxL8MxyITRMlORQNaOA2IkAFaTr4k7BUumjPtRpGDTZpl0Pb1XCO6JeDCBdp126Cgs9sMxqSjgYyRg==} + engines: {node: '>= 0.6'} + dependencies: + mime-db: 1.52.0 + dev: true + + /compression@1.7.4: + resolution: {integrity: sha512-jaSIDzP9pZVS4ZfQ+TzvtiWhdpFhE2RDHz8QJkpX9SIpLq88VueF5jJw6t+6CUQcAoA6t+x89MLrWAqpfDE8iQ==} + engines: {node: '>= 0.8.0'} + dependencies: + accepts: 1.3.8 + bytes: 3.0.0 + compressible: 2.0.18 + debug: 2.6.9 + on-headers: 1.0.2 + safe-buffer: 5.1.2 + vary: 1.1.2 + transitivePeerDependencies: + - supports-color + dev: true + + /concat-map@0.0.1: + resolution: {integrity: sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==} + dev: true + + /connect-history-api-fallback@2.0.0: + resolution: {integrity: sha512-U73+6lQFmfiNPrYbXqr6kZ1i1wiRqXnp2nhMsINseWXO8lDau0LGEffJ8kQi4EjLZympVgRdvqjAgiZ1tgzDDA==} + engines: {node: '>=0.8'} + dev: true + + /content-disposition@0.5.4: + resolution: {integrity: sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ==} + engines: {node: '>= 0.6'} + dependencies: + safe-buffer: 5.2.1 + + /content-type@1.0.5: + resolution: {integrity: sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA==} + engines: {node: '>= 0.6'} + + /cookie-signature@1.0.6: + resolution: {integrity: sha512-QADzlaHc8icV8I7vbaJXJwod9HWYp8uCqf1xa4OfNu1T7JVxQIrUgOWtHdNDtPiywmFbiS12VjotIXLrKM3orQ==} + dev: true + + /cookie@0.6.0: + resolution: {integrity: sha512-U71cyTamuh1CRNCfpGY6to28lxvNwPG4Guz/EVjgf3Jmzv0vlDp1atT9eS5dDjMYHucpHbWns6Lwf3BKz6svdw==} + engines: {node: '>= 0.6'} + dev: true + + /cookies@0.8.0: + resolution: {integrity: sha512-8aPsApQfebXnuI+537McwYsDtjVxGm8gTIzQI3FDW6t5t/DAhERxtnbEPN/8RX+uZthoz4eCOgloXaE5cYyNow==} + engines: {node: '>= 0.8'} + dependencies: + depd: 2.0.0 + keygrip: 1.1.0 + dev: false + + /core-util-is@1.0.3: + resolution: {integrity: sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==} + dev: true + + /cron-parser@4.9.0: + resolution: {integrity: sha512-p0SaNjrHOnQeR8/VnfGbmg9te2kfyYSQ7Sc/j/6DtPL3JQvKxmjO9TSjNFpujqV3vEYYBvNNvXSxzyksBWAx1Q==} + engines: {node: '>=12.0.0'} + dependencies: + luxon: 3.4.4 + dev: false + + /cross-spawn@7.0.3: + resolution: {integrity: sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==} + engines: {node: '>= 8'} + dependencies: + path-key: 3.1.1 + shebang-command: 2.0.0 + which: 2.0.2 + dev: true + + /csstype@3.1.3: + resolution: {integrity: sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw==} + dev: true + + /date-format@4.0.14: + resolution: {integrity: sha512-39BOQLs9ZjKh0/patS9nrT8wc3ioX3/eA/zgbKNopnF2wCqJEoxywwwElATYvRsXdnOxA/OQeQoFZ3rFjVajhg==} + engines: {node: '>=4.0'} + dev: false + + /debug@2.6.9: + resolution: {integrity: sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==} + peerDependencies: + supports-color: '*' + peerDependenciesMeta: + supports-color: + optional: true + dependencies: + ms: 2.0.0 + dev: true + + /debug@3.1.0: + resolution: {integrity: sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==} + peerDependencies: + supports-color: '*' + peerDependenciesMeta: + supports-color: + optional: true + dependencies: + ms: 2.0.0 + dev: false + + /debug@4.3.5: + resolution: {integrity: sha512-pt0bNEmneDIvdL1Xsd9oDQ/wrQRkXDT4AUWlNZNPKvW5x/jyO9VFXkJUP07vQ2upmw5PlaITaPKc31jK13V+jg==} + engines: {node: '>=6.0'} + peerDependencies: + supports-color: '*' + peerDependenciesMeta: + supports-color: + optional: true + dependencies: + ms: 2.1.2 + + /deep-equal@1.0.1: + resolution: {integrity: sha512-bHtC0iYvWhyaTzvV3CZgPeZQqCOBGyGsVV7v4eevpdkLHfiSrXUdBG+qAuSz4RI70sszvjQ1QSZ98An1yNwpSw==} + dev: false + + /default-browser-id@5.0.0: + resolution: {integrity: sha512-A6p/pu/6fyBcA1TRz/GqWYPViplrftcW2gZC9q79ngNCKAeR/X3gcEdXQHl4KNXV+3wgIJ1CPkJQ3IHM6lcsyA==} + engines: {node: '>=18'} + dev: false + + /default-browser@5.2.1: + resolution: {integrity: sha512-WY/3TUME0x3KPYdRRxEJJvXRHV4PyPoUsxtZa78lwItwRQRHhd2U9xOscaT/YTf8uCXIAjeJOFBVEh/7FtD8Xg==} + engines: {node: '>=18'} + dependencies: + bundle-name: 4.1.0 + default-browser-id: 5.0.0 + dev: false + + /default-gateway@6.0.3: + resolution: {integrity: sha512-fwSOJsbbNzZ/CUFpqFBqYfYNLj1NbMPm8MMCIzHjC83iSJRBEGmDUxU+WP661BaBQImeC2yHwXtz+P/O9o+XEg==} + engines: {node: '>= 10'} + dependencies: + execa: 5.1.1 + dev: true + + /define-data-property@1.1.4: + resolution: {integrity: sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A==} + engines: {node: '>= 0.4'} + dependencies: + es-define-property: 1.0.0 + es-errors: 1.3.0 + gopd: 1.0.1 + dev: true + + /define-lazy-prop@2.0.0: + resolution: {integrity: sha512-Ds09qNh8yw3khSjiJjiUInaGX9xlqZDY7JVryGxdxV7NPeuqQfplOpQ66yJFZut3jLa5zOwkXw1g9EI2uKh4Og==} + engines: {node: '>=8'} + dev: true + + /define-lazy-prop@3.0.0: + resolution: {integrity: sha512-N+MeXYoqr3pOgn8xfyRPREN7gHakLYjhsHhWGT3fWAiL4IkAt0iDw14QiiEm2bE30c5XX5q0FtAA3CK5f9/BUg==} + engines: {node: '>=12'} + dev: false + + /delayed-stream@1.0.0: + resolution: {integrity: sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==} + engines: {node: '>=0.4.0'} + dev: false + + /delegates@1.0.0: + resolution: {integrity: sha512-bd2L678uiWATM6m5Z1VzNCErI3jiGzt6HGY8OVICs40JQq/HALfbyNJmp0UDakEY4pMMaN0Ly5om/B1VI/+xfQ==} + dev: false + + /depd@1.1.2: + resolution: {integrity: sha512-7emPTl6Dpo6JRXOXjLRxck+FlLRX5847cLKEn00PLAgc3g2hTZZgr+e4c2v6QpSmLeFP3n5yUo7ft6avBK/5jQ==} + engines: {node: '>= 0.6'} + + /depd@2.0.0: + resolution: {integrity: sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==} + engines: {node: '>= 0.8'} + + /destroy@1.2.0: + resolution: {integrity: sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg==} + engines: {node: '>= 0.8', npm: 1.2.8000 || >= 1.4.16} + + /detect-node@2.1.0: + resolution: {integrity: sha512-T0NIuQpnTvFDATNuHN5roPwSBG83rFsuO+MXXH9/3N1eFbn4wcPjttvjMLEPWJ0RGUYgQE7cGgS3tNxbqCGM7g==} + dev: true + + /dns-packet@5.6.1: + resolution: {integrity: sha512-l4gcSouhcgIKRvyy99RNVOgxXiicE+2jZoNmaNmZ6JXiGajBOJAesk1OBlJuM5k2c+eudGdLxDqXuPCKIj6kpw==} + engines: {node: '>=6'} + dependencies: + '@leichtgewicht/ip-codec': 2.0.5 + dev: true + + /duplexer@0.1.2: + resolution: {integrity: sha512-jtD6YG370ZCIi/9GTaJKQxWTZD045+4R4hTk/x1UyoqadyJ9x9CgSi1RlVDQF8U2sxLLSnFkCaMihqljHIWgMg==} + dev: true + + /ee-first@1.1.1: + resolution: {integrity: sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==} + + /electron-to-chromium@1.4.816: + resolution: {integrity: sha512-EKH5X5oqC6hLmiS7/vYtZHZFTNdhsYG5NVPRN6Yn0kQHNBlT59+xSM8HBy66P5fxWpKgZbPqb+diC64ng295Jw==} + + /emoji-regex@8.0.0: + resolution: {integrity: sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==} + dev: true + + /encodeurl@1.0.2: + resolution: {integrity: sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w==} + engines: {node: '>= 0.8'} + + /engine.io-client@6.5.4: + resolution: {integrity: sha512-GeZeeRjpD2qf49cZQ0Wvh/8NJNfeXkXXcoGh+F77oEAgo9gUHwT1fCRxSNU+YEEaysOJTnsFHmM5oAcPy4ntvQ==} + dependencies: + '@socket.io/component-emitter': 3.1.2 + debug: 4.3.5 + engine.io-parser: 5.2.2 + ws: 8.17.1 + xmlhttprequest-ssl: 2.0.0 + transitivePeerDependencies: + - bufferutil + - supports-color + - utf-8-validate + dev: false + + /engine.io-parser@5.2.2: + resolution: {integrity: sha512-RcyUFKA93/CXH20l4SoVvzZfrSDMOTUS3bWVpTt2FuFP+XYrL8i8oonHP7WInRyVHXh0n/ORtoeiE1os+8qkSw==} + engines: {node: '>=10.0.0'} + dev: false + + /enhanced-resolve@5.17.0: + resolution: {integrity: sha512-dwDPwZL0dmye8Txp2gzFmA6sxALaSvdRDjPH0viLcKrtlOL3tw62nWWweVD1SdILDTJrbrL6tdWVN58Wo6U3eA==} + engines: {node: '>=10.13.0'} + dependencies: + graceful-fs: 4.2.11 + tapable: 2.2.1 + + /error-inject@1.0.0: + resolution: {integrity: sha512-JM8N6PytDbmIYm1IhPWlo8vr3NtfjhDY/1MhD/a5b/aad/USE8a0+NsqE9d5n+GVGmuNkPQWm4bFQWv18d8tMg==} + dev: false + + /es-define-property@1.0.0: + resolution: {integrity: sha512-jxayLKShrEqqzJ0eumQbVhTYQM27CfT1T35+gCgDFoL82JLsXqTJ76zv6A0YLOgEnLUMvLzsDsGIrl8NFpT2gQ==} + engines: {node: '>= 0.4'} + dependencies: + get-intrinsic: 1.2.4 + dev: true + + /es-errors@1.3.0: + resolution: {integrity: sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==} + engines: {node: '>= 0.4'} + dev: true + + /es-module-lexer@1.5.4: + resolution: {integrity: sha512-MVNK56NiMrOwitFB7cqDwq0CQutbw+0BvLshJSse0MUNU+y1FC3bUS/AQg7oUng+/wKrrki7JfmwtVHkVfPLlw==} + + /escalade@3.1.2: + resolution: {integrity: sha512-ErCHMCae19vR8vQGe50xIsVomy19rg6gFu3+r3jkEO46suLMWBksvVyoGgQV+jOfl84ZSOSlmv6Gxa89PmTGmA==} + engines: {node: '>=6'} + + /escape-html@1.0.3: + resolution: {integrity: sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==} + + /eslint-scope@5.1.1: + resolution: {integrity: sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==} + engines: {node: '>=8.0.0'} + dependencies: + esrecurse: 4.3.0 + estraverse: 4.3.0 + + /esrecurse@4.3.0: + resolution: {integrity: sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==} + engines: {node: '>=4.0'} + dependencies: + estraverse: 5.3.0 + + /estraverse@4.3.0: + resolution: {integrity: sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==} + engines: {node: '>=4.0'} + + /estraverse@5.3.0: + resolution: {integrity: sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==} + engines: {node: '>=4.0'} + + /etag@1.8.1: + resolution: {integrity: sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==} + engines: {node: '>= 0.6'} + dev: true + + /eventemitter3@4.0.7: + resolution: {integrity: sha512-8guHBZCwKnFhYdHr2ysuRWErTwhoN2X8XELRlrRwpmfeY2jjuUN4taQMsULKUVo1K4DvZl+0pgfyoysHxvmvEw==} + dev: true + + /events@3.3.0: + resolution: {integrity: sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==} + engines: {node: '>=0.8.x'} + + /execa@5.1.1: + resolution: {integrity: sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==} + engines: {node: '>=10'} + dependencies: + cross-spawn: 7.0.3 + get-stream: 6.0.1 + human-signals: 2.1.0 + is-stream: 2.0.1 + merge-stream: 2.0.0 + npm-run-path: 4.0.1 + onetime: 5.1.2 + signal-exit: 3.0.7 + strip-final-newline: 2.0.0 + dev: true + + /exit-hook@3.2.0: + resolution: {integrity: sha512-aIQN7Q04HGAV/I5BszisuHTZHXNoC23WtLkxdCLuYZMdWviRD0TMIt2bnUBi9MrHaF/hH8b3gwG9iaAUHKnJGA==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + dev: true + + /expand-tilde@2.0.2: + resolution: {integrity: sha512-A5EmesHW6rfnZ9ysHQjPdJRni0SRar0tjtG5MNtm9n5TUvsYU8oozprtRD4AqHxcZWWlVuAmQo2nWKfN9oyjTw==} + engines: {node: '>=0.10.0'} + dependencies: + homedir-polyfill: 1.0.3 + dev: false + + /express@4.19.2: + resolution: {integrity: sha512-5T6nhjsT+EOMzuck8JjBHARTHfMht0POzlA60WV2pMD3gyXw2LZnZ+ueGdNxG+0calOJcWKbpFcuzLZ91YWq9Q==} + engines: {node: '>= 0.10.0'} + dependencies: + accepts: 1.3.8 + array-flatten: 1.1.1 + body-parser: 1.20.2 + content-disposition: 0.5.4 + content-type: 1.0.5 + cookie: 0.6.0 + cookie-signature: 1.0.6 + debug: 2.6.9 + depd: 2.0.0 + encodeurl: 1.0.2 + escape-html: 1.0.3 + etag: 1.8.1 + finalhandler: 1.2.0 + fresh: 0.5.2 + http-errors: 2.0.0 + merge-descriptors: 1.0.1 + methods: 1.1.2 + on-finished: 2.4.1 + parseurl: 1.3.3 + path-to-regexp: 0.1.7 + proxy-addr: 2.0.7 + qs: 6.11.0 + range-parser: 1.2.1 + safe-buffer: 5.2.1 + send: 0.18.0 + serve-static: 1.15.0 + setprototypeof: 1.2.0 + statuses: 2.0.1 + type-is: 1.6.18 + utils-merge: 1.0.1 + vary: 1.1.2 + transitivePeerDependencies: + - supports-color + dev: true + + /fast-deep-equal@3.1.3: + resolution: {integrity: sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==} + + /fast-json-stable-stringify@2.1.0: + resolution: {integrity: sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==} + + /faye-websocket@0.11.4: + resolution: {integrity: sha512-CzbClwlXAuiRQAlUyfqPgvPoNKTckTPGfwZV4ZdAhVcP2lh9KUxJg2b5GkE7XbjKQ3YJnQ9z6D9ntLAlB+tP8g==} + engines: {node: '>=0.8.0'} + dependencies: + websocket-driver: 0.7.4 + dev: true + + /fill-range@7.1.1: + resolution: {integrity: sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==} + engines: {node: '>=8'} + dependencies: + to-regex-range: 5.0.1 + dev: true + + /finalhandler@1.2.0: + resolution: {integrity: sha512-5uXcUVftlQMFnWC9qu/svkWv3GTd2PfUhK/3PLkYNAe7FbqJMt3515HaxE6eRL74GdsriiwujiawdaB1BpEISg==} + engines: {node: '>= 0.8'} + dependencies: + debug: 2.6.9 + encodeurl: 1.0.2 + escape-html: 1.0.3 + on-finished: 2.4.1 + parseurl: 1.3.3 + statuses: 2.0.1 + unpipe: 1.0.0 + transitivePeerDependencies: + - supports-color + dev: true + + /find-file-up@2.0.1: + resolution: {integrity: sha512-qVdaUhYO39zmh28/JLQM5CoYN9byEOKEH4qfa8K1eNV17W0UUMJ9WgbR/hHFH+t5rcl+6RTb5UC7ck/I+uRkpQ==} + engines: {node: '>=8'} + dependencies: + resolve-dir: 1.0.1 + dev: false + + /find-package-json@1.2.0: + resolution: {integrity: sha512-+SOGcLGYDJHtyqHd87ysBhmaeQ95oWspDKnMXBrnQ9Eq4OkLNqejgoaD8xVWu6GPa0B6roa6KinCMEMcVeqONw==} + dev: false + + /find-pkg@2.0.0: + resolution: {integrity: sha512-WgZ+nKbELDa6N3i/9nrHeNznm+lY3z4YfhDDWgW+5P0pdmMj26bxaxU11ookgY3NyP9GC7HvZ9etp0jRFqGEeQ==} + engines: {node: '>=8'} + dependencies: + find-file-up: 2.0.1 + dev: false + + /flatted@3.3.1: + resolution: {integrity: sha512-X8cqMLLie7KsNUDSdzeN8FYK9rEt4Dt67OsG/DNGnYTSDBG4uFAJFBnUeiV+zCVAvwFy56IjM9sH51jVaEhNxw==} + dev: false + + /follow-redirects@1.15.6: + resolution: {integrity: sha512-wWN62YITEaOpSK584EZXJafH1AGpO8RVgElfkuXbTOrPX4fIfOyEpW/CsiNd8JdYrAoOvafRTOEnvsO++qCqFA==} + engines: {node: '>=4.0'} + peerDependencies: + debug: '*' + peerDependenciesMeta: + debug: + optional: true + + /form-data@4.0.0: + resolution: {integrity: sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww==} + engines: {node: '>= 6'} + dependencies: + asynckit: 0.4.0 + combined-stream: 1.0.8 + mime-types: 2.1.35 + dev: false + + /forwarded@0.2.0: + resolution: {integrity: sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==} + engines: {node: '>= 0.6'} + dev: true + + /fresh@0.5.2: + resolution: {integrity: sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q==} + engines: {node: '>= 0.6'} + + /fs-extra@8.1.0: + resolution: {integrity: sha512-yhlQgA6mnOJUKOsRUFsgJdQCvkKhcz8tlZG5HBQfReYZy46OwLcY+Zia0mtdHsOo9y/hP+CxMN0TU9QxoOtG4g==} + engines: {node: '>=6 <7 || >=8'} + dependencies: + graceful-fs: 4.2.11 + jsonfile: 4.0.0 + universalify: 0.1.2 + dev: false + + /fs-extra@9.1.0: + resolution: {integrity: sha512-hcg3ZmepS30/7BSFqRvoo3DOMQu7IjqxO5nCDt+zM9XWjb33Wg7ziNT+Qvqbuc3+gWpzO02JubVyk2G4Zvo1OQ==} + engines: {node: '>=10'} + dependencies: + at-least-node: 1.0.0 + graceful-fs: 4.2.11 + jsonfile: 6.1.0 + universalify: 2.0.1 + dev: false + + /fs-monkey@1.0.6: + resolution: {integrity: sha512-b1FMfwetIKymC0eioW7mTywihSQE4oLzQn1dB6rZB5fx/3NpNEdAWeCSMB+60/AeT0TCXsxzAlcYVEFCTAksWg==} + dev: true + + /fs.realpath@1.0.0: + resolution: {integrity: sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==} + dev: true + + /fsevents@2.3.3: + resolution: {integrity: sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==} + engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0} + os: [darwin] + requiresBuild: true + dev: true + optional: true + + /function-bind@1.1.2: + resolution: {integrity: sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==} + + /get-caller-file@2.0.5: + resolution: {integrity: sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==} + engines: {node: 6.* || 8.* || >= 10.*} + dev: true + + /get-intrinsic@1.2.4: + resolution: {integrity: sha512-5uYhsJH8VJBTv7oslg4BznJYhDoRI6waYCxMmCdnTrcCrHA/fCFKoTFz2JKKE0HdDFUF7/oQuhzumXJK7paBRQ==} + engines: {node: '>= 0.4'} + dependencies: + es-errors: 1.3.0 + function-bind: 1.1.2 + has-proto: 1.0.3 + has-symbols: 1.0.3 + hasown: 2.0.2 + dev: true + + /get-stream@6.0.1: + resolution: {integrity: sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==} + engines: {node: '>=10'} + dev: true + + /glob-parent@5.1.2: + resolution: {integrity: sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==} + engines: {node: '>= 6'} + dependencies: + is-glob: 4.0.3 + dev: true + + /glob-to-regexp@0.4.1: + resolution: {integrity: sha512-lkX1HJXwyMcprw/5YUZc2s7DrpAiHB21/V+E1rHUrVNokkvB6bqMzT0VfV6/86ZNabt1k14YOIaT7nDvOX3Iiw==} + + /glob@7.2.3: + resolution: {integrity: sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==} + deprecated: Glob versions prior to v9 are no longer supported + dependencies: + fs.realpath: 1.0.0 + inflight: 1.0.6 + inherits: 2.0.4 + minimatch: 3.1.2 + once: 1.4.0 + path-is-absolute: 1.0.1 + dev: true + + /global-modules@1.0.0: + resolution: {integrity: sha512-sKzpEkf11GpOFuw0Zzjzmt4B4UZwjOcG757PPvrfhxcLFbq0wpsgpOqxpxtxFiCG4DtG93M6XRVbF2oGdev7bg==} + engines: {node: '>=0.10.0'} + dependencies: + global-prefix: 1.0.2 + is-windows: 1.0.2 + resolve-dir: 1.0.1 + dev: false + + /global-prefix@1.0.2: + resolution: {integrity: sha512-5lsx1NUDHtSjfg0eHlmYvZKv8/nVqX4ckFbM+FrGcQ+04KWcWFo9P5MxPZYSzUvyzmdTbI7Eix8Q4IbELDqzKg==} + engines: {node: '>=0.10.0'} + dependencies: + expand-tilde: 2.0.2 + homedir-polyfill: 1.0.3 + ini: 1.3.8 + is-windows: 1.0.2 + which: 1.3.1 + dev: false + + /gopd@1.0.1: + resolution: {integrity: sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA==} + dependencies: + get-intrinsic: 1.2.4 + dev: true + + /graceful-fs@4.2.11: + resolution: {integrity: sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==} + + /gzip-size@6.0.0: + resolution: {integrity: sha512-ax7ZYomf6jqPTQ4+XCpUGyXKHk5WweS+e05MBO4/y3WJ5RkmPXNKvX+bx1behVILVwr6JSQvZAku021CHPXG3Q==} + engines: {node: '>=10'} + dependencies: + duplexer: 0.1.2 + dev: true + + /handle-thing@2.0.1: + resolution: {integrity: sha512-9Qn4yBxelxoh2Ow62nP+Ka/kMnOXRi8BXnRaUwezLNhqelnN49xKz4F/dPP8OYLxLxq6JDtZb2i9XznUQbNPTg==} + dev: true + + /has-flag@4.0.0: + resolution: {integrity: sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==} + engines: {node: '>=8'} + + /has-property-descriptors@1.0.2: + resolution: {integrity: sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg==} + dependencies: + es-define-property: 1.0.0 + dev: true + + /has-proto@1.0.3: + resolution: {integrity: sha512-SJ1amZAJUiZS+PhsVLf5tGydlaVB8EdFpaSO4gmiUKUOxk8qzn5AIy4ZeJUmh22znIdk/uMAUT2pl3FxzVUH+Q==} + engines: {node: '>= 0.4'} + dev: true + + /has-symbols@1.0.3: + resolution: {integrity: sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==} + engines: {node: '>= 0.4'} + + /has-tostringtag@1.0.2: + resolution: {integrity: sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==} + engines: {node: '>= 0.4'} + dependencies: + has-symbols: 1.0.3 + dev: false + + /hasown@2.0.2: + resolution: {integrity: sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==} + engines: {node: '>= 0.4'} + dependencies: + function-bind: 1.1.2 + + /homedir-polyfill@1.0.3: + resolution: {integrity: sha512-eSmmWE5bZTK2Nou4g0AI3zZ9rswp7GRKoKXS1BLUkvPviOqs4YTN1djQIqrXy9k5gEtdLPy86JjRwsNM9tnDcA==} + engines: {node: '>=0.10.0'} + dependencies: + parse-passwd: 1.0.0 + dev: false + + /hpack.js@2.1.6: + resolution: {integrity: sha512-zJxVehUdMGIKsRaNt7apO2Gqp0BdqW5yaiGHXXmbpvxgBYVZnAql+BJb4RO5ad2MgpbZKn5G6nMnegrH1FcNYQ==} + dependencies: + inherits: 2.0.4 + obuf: 1.1.2 + readable-stream: 2.3.8 + wbuf: 1.7.3 + dev: true + + /html-entities@2.5.2: + resolution: {integrity: sha512-K//PSRMQk4FZ78Kyau+mZurHn3FH0Vwr+H36eE0rPbeYkRRi9YxceYPhuN60UwWorxyKHhqoAJl2OFKa4BVtaA==} + dev: true + + /http-assert@1.5.0: + resolution: {integrity: sha512-uPpH7OKX4H25hBmU6G1jWNaqJGpTXxey+YOUizJUAgu0AjLUeC8D73hTrhvDS5D+GJN1DN1+hhc/eF/wpxtp0w==} + engines: {node: '>= 0.8'} + dependencies: + deep-equal: 1.0.1 + http-errors: 1.8.1 + dev: false + + /http-deceiver@1.2.7: + resolution: {integrity: sha512-LmpOGxTfbpgtGVxJrj5k7asXHCgNZp5nLfp+hWc8QQRqtb7fUy6kRY3BO1h9ddF6yIPYUARgxGOwB42DnxIaNw==} + dev: true + + /http-errors@1.6.3: + resolution: {integrity: sha512-lks+lVC8dgGyh97jxvxeYTWQFvh4uw4yC12gVl63Cg30sjPX4wuGcdkICVXDAESr6OJGjqGA8Iz5mkeN6zlD7A==} + engines: {node: '>= 0.6'} + dependencies: + depd: 1.1.2 + inherits: 2.0.3 + setprototypeof: 1.1.0 + statuses: 1.5.0 + dev: true + + /http-errors@1.8.1: + resolution: {integrity: sha512-Kpk9Sm7NmI+RHhnj6OIWDI1d6fIoFAtFt9RLaTMRlg/8w49juAStsrBgp0Dp4OdxdVbRIeKhtCUvoi/RuAhO4g==} + engines: {node: '>= 0.6'} + dependencies: + depd: 1.1.2 + inherits: 2.0.4 + setprototypeof: 1.2.0 + statuses: 1.5.0 + toidentifier: 1.0.1 + dev: false + + /http-errors@2.0.0: + resolution: {integrity: sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==} + engines: {node: '>= 0.8'} + dependencies: + depd: 2.0.0 + inherits: 2.0.4 + setprototypeof: 1.2.0 + statuses: 2.0.1 + toidentifier: 1.0.1 + dev: true + + /http-parser-js@0.5.8: + resolution: {integrity: sha512-SGeBX54F94Wgu5RH3X5jsDtf4eHyRogWX1XGT3b4HuW3tQPM4AaBzoUji/4AAJNXCEOWZ5O0DgZmJw1947gD5Q==} + dev: true + + /http-proxy-middleware@2.0.6(@types/express@4.17.21): + resolution: {integrity: sha512-ya/UeJ6HVBYxrgYotAZo1KvPWlgB48kUJLDePFeneHsVujFaW5WNj2NgWCAE//B1Dl02BIfYlpNgBy8Kf8Rjmw==} + engines: {node: '>=12.0.0'} + peerDependencies: + '@types/express': ^4.17.13 + peerDependenciesMeta: + '@types/express': + optional: true + dependencies: + '@types/express': 4.17.21 + '@types/http-proxy': 1.17.14 + http-proxy: 1.18.1 + is-glob: 4.0.3 + is-plain-obj: 3.0.0 + micromatch: 4.0.7 + transitivePeerDependencies: + - debug + dev: true + + /http-proxy@1.18.1: + resolution: {integrity: sha512-7mz/721AbnJwIVbnaSv1Cz3Am0ZLT/UBwkC92VlxhXv/k/BBQfM2fXElQNC27BVGr0uwUpplYPQM9LnaBMR5NQ==} + engines: {node: '>=8.0.0'} + dependencies: + eventemitter3: 4.0.7 + follow-redirects: 1.15.6 + requires-port: 1.0.0 + transitivePeerDependencies: + - debug + dev: true + + /human-signals@2.1.0: + resolution: {integrity: sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==} + engines: {node: '>=10.17.0'} + dev: true + + /iconv-lite@0.4.24: + resolution: {integrity: sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==} + engines: {node: '>=0.10.0'} + dependencies: + safer-buffer: 2.1.2 + dev: true + + /inflight@1.0.6: + resolution: {integrity: sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==} + deprecated: This module is not supported, and leaks memory. Do not use it. Check out lru-cache if you want a good and tested way to coalesce async requests by a key value, which is much more comprehensive and powerful. + dependencies: + once: 1.4.0 + wrappy: 1.0.2 + dev: true + + /inherits@2.0.3: + resolution: {integrity: sha512-x00IRNXNy63jwGkJmzPigoySHbaqpNuzKbBOmzK+g2OdZpQ9w+sxCN+VSB3ja7IAge2OP2qpfxTjeNcyjmW1uw==} + dev: true + + /inherits@2.0.4: + resolution: {integrity: sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==} + + /ini@1.3.8: + resolution: {integrity: sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==} + dev: false + + /interpret@3.1.1: + resolution: {integrity: sha512-6xwYfHbajpoF0xLW+iwLkhwgvLoZDfjYfoFNu8ftMoXINzwuymNLd9u/KmwtdT2GbR+/Cz66otEGEVVUHX9QLQ==} + engines: {node: '>=10.13.0'} + dev: true + + /ipaddr.js@1.9.1: + resolution: {integrity: sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==} + engines: {node: '>= 0.10'} + dev: true + + /ipaddr.js@2.2.0: + resolution: {integrity: sha512-Ag3wB2o37wslZS19hZqorUnrnzSkpOVy+IiiDEiTqNubEYpYuHWIf6K4psgN2ZWKExS4xhVCrRVfb/wfW8fWJA==} + engines: {node: '>= 10'} + dev: true + + /is-binary-path@2.1.0: + resolution: {integrity: sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==} + engines: {node: '>=8'} + dependencies: + binary-extensions: 2.3.0 + dev: true + + /is-ci@3.0.1: + resolution: {integrity: sha512-ZYvCgrefwqoQ6yTyYUbQu64HsITZ3NfKX1lzaEYdkTDcfKzzCI/wthRRYKkdjHKFVgNiXKAKm65Zo1pk2as/QQ==} + hasBin: true + dependencies: + ci-info: 3.9.0 + dev: false + + /is-core-module@2.14.0: + resolution: {integrity: sha512-a5dFJih5ZLYlRtDc0dZWP7RiKr6xIKzmn/oAYCDvdLThadVgyJwlaoQPmRtMSpz+rk0OGAgIu+TcM9HUF0fk1A==} + engines: {node: '>= 0.4'} + dependencies: + hasown: 2.0.2 + + /is-docker@2.2.1: + resolution: {integrity: sha512-F+i2BKsFrH66iaUFc0woD8sLy8getkwTwtOBjvs56Cx4CgJDeKQeqfz8wAYiSb8JOprWhHH5p77PbmYCvvUuXQ==} + engines: {node: '>=8'} + hasBin: true + dev: true + + /is-docker@3.0.0: + resolution: {integrity: sha512-eljcgEDlEns/7AXFosB5K/2nCM4P7FQPkGc/DWLy5rmFEWvZayGrik1d9/QIY5nJ4f9YsVvBkA6kJpHn9rISdQ==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + hasBin: true + dev: false + + /is-extglob@2.1.1: + resolution: {integrity: sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==} + engines: {node: '>=0.10.0'} + dev: true + + /is-fullwidth-code-point@3.0.0: + resolution: {integrity: sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==} + engines: {node: '>=8'} + dev: true + + /is-generator-function@1.0.10: + resolution: {integrity: sha512-jsEjy9l3yiXEQ+PsXdmBwEPcOxaXWLspKdplFUVI9vq1iZgIekeC0L167qeu86czQaxed3q/Uzuw0swL0irL8A==} + engines: {node: '>= 0.4'} + dependencies: + has-tostringtag: 1.0.2 + dev: false + + /is-glob@4.0.3: + resolution: {integrity: sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==} + engines: {node: '>=0.10.0'} + dependencies: + is-extglob: 2.1.1 + dev: true + + /is-inside-container@1.0.0: + resolution: {integrity: sha512-KIYLCCJghfHZxqjYBE7rEy0OBuTd5xCHS7tHVgvCLkx7StIoaxwNW3hCALgEUjFfeRk+MG/Qxmp/vtETEF3tRA==} + engines: {node: '>=14.16'} + hasBin: true + dependencies: + is-docker: 3.0.0 + dev: false + + /is-number@7.0.0: + resolution: {integrity: sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==} + engines: {node: '>=0.12.0'} + dev: true + + /is-plain-obj@3.0.0: + resolution: {integrity: sha512-gwsOE28k+23GP1B6vFl1oVh/WOzmawBrKwo5Ev6wMKzPkaXaCDIQKzLnvsA42DRlbVTWorkgTKIviAKCWkfUwA==} + engines: {node: '>=10'} + dev: true + + /is-stream@2.0.1: + resolution: {integrity: sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==} + engines: {node: '>=8'} + dev: true + + /is-windows@1.0.2: + resolution: {integrity: sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA==} + engines: {node: '>=0.10.0'} + dev: false + + /is-wsl@2.2.0: + resolution: {integrity: sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww==} + engines: {node: '>=8'} + dependencies: + is-docker: 2.2.1 + dev: true + + /is-wsl@3.1.0: + resolution: {integrity: sha512-UcVfVfaK4Sc4m7X3dUSoHoozQGBEFeDC+zVo06t98xe8CzHSZZBekNXH+tu0NalHolcJ/QAGqS46Hef7QXBIMw==} + engines: {node: '>=16'} + dependencies: + is-inside-container: 1.0.0 + dev: false + + /isarray@1.0.0: + resolution: {integrity: sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==} + dev: true + + /isexe@2.0.0: + resolution: {integrity: sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==} + + /isomorphic-ws@5.0.0(ws@8.17.1): + resolution: {integrity: sha512-muId7Zzn9ywDsyXgTIafTry2sV3nySZeUDe6YedVd1Hvuuep5AsIlqK+XefWpYTyJG5e503F2xIuT2lcU6rCSw==} + peerDependencies: + ws: '*' + dependencies: + ws: 8.17.1 + dev: false + + /jest-worker@27.5.1: + resolution: {integrity: sha512-7vuh85V5cdDofPyxn58nrPjBktZo0u9x1g8WtjQol+jZDaE+fhN+cIvTj11GndBnMnyfrUOG1sZQxCdjKh+DKg==} + engines: {node: '>= 10.13.0'} + dependencies: + '@types/node': 20.14.9 + merge-stream: 2.0.0 + supports-color: 8.1.1 + + /jose@5.6.2: + resolution: {integrity: sha512-F1t1/WZJ4JdmCE/XoMYw1dPOW5g8JF0xGm6Ox2fwaCAPlCzt+4Bh0EWP59iQuZNHHauDkCdjx+kCZSh5z/PGow==} + dev: false + + /js-tokens@4.0.0: + resolution: {integrity: sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==} + dev: false + + /json-parse-even-better-errors@2.3.1: + resolution: {integrity: sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==} + + /json-schema-traverse@0.4.1: + resolution: {integrity: sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==} + + /json-schema-traverse@1.0.0: + resolution: {integrity: sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==} + dev: true + + /jsonfile@4.0.0: + resolution: {integrity: sha512-m6F1R3z8jjlf2imQHS2Qez5sjKWQzbuuhuJ/FKYFRZvPE3PuHcSMVZzfsLhGVOkfd20obL5SWEBew5ShlquNxg==} + optionalDependencies: + graceful-fs: 4.2.11 + dev: false + + /jsonfile@6.1.0: + resolution: {integrity: sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==} + dependencies: + universalify: 2.0.1 + optionalDependencies: + graceful-fs: 4.2.11 + dev: false + + /keygrip@1.1.0: + resolution: {integrity: sha512-iYSchDJ+liQ8iwbSI2QqsQOvqv58eJCEanyJPJi+Khyu8smkcKSFUCbPwzFcL7YVtZ6eONjqRX/38caJ7QjRAQ==} + engines: {node: '>= 0.6'} + dependencies: + tsscmp: 1.0.6 + dev: false + + /koa-compose@3.2.1: + resolution: {integrity: sha512-8gen2cvKHIZ35eDEik5WOo8zbVp9t4cP8p4hW4uE55waxolLRexKKrqfCpwhGVppnB40jWeF8bZeTVg99eZgPw==} + dependencies: + any-promise: 1.3.0 + dev: false + + /koa-compose@4.1.0: + resolution: {integrity: sha512-8ODW8TrDuMYvXRwra/Kh7/rJo9BtOfPc6qO8eAfC80CnCvSjSl0bkRM24X6/XBBEyj0v1nRUQ1LyOy3dbqOWXw==} + dev: false + + /koa-convert@1.2.0: + resolution: {integrity: sha512-K9XqjmEDStGX09v3oxR7t5uPRy0jqJdvodHa6wxWTHrTfDq0WUNnYTOOUZN6g8OM8oZQXprQASbiIXG2Ez8ehA==} + engines: {node: '>= 4'} + dependencies: + co: 4.6.0 + koa-compose: 3.2.1 + dev: false + + /koa@2.11.0: + resolution: {integrity: sha512-EpR9dElBTDlaDgyhDMiLkXrPwp6ZqgAIBvhhmxQ9XN4TFgW+gEz6tkcsNI6BnUbUftrKDjVFj4lW2/J2aNBMMA==} + engines: {node: ^4.8.4 || ^6.10.1 || ^7.10.1 || >= 8.1.4} + dependencies: + accepts: 1.3.8 + cache-content-type: 1.0.1 + content-disposition: 0.5.4 + content-type: 1.0.5 + cookies: 0.8.0 + debug: 3.1.0 + delegates: 1.0.0 + depd: 1.1.2 + destroy: 1.2.0 + encodeurl: 1.0.2 + error-inject: 1.0.0 + escape-html: 1.0.3 + fresh: 0.5.2 + http-assert: 1.5.0 + http-errors: 1.8.1 + is-generator-function: 1.0.10 + koa-compose: 4.1.0 + koa-convert: 1.2.0 + on-finished: 2.4.1 + only: 0.0.2 + parseurl: 1.3.3 + statuses: 1.5.0 + type-is: 1.6.18 + vary: 1.1.2 + transitivePeerDependencies: + - supports-color + dev: false + + /launch-editor@2.8.0: + resolution: {integrity: sha512-vJranOAJrI/llyWGRQqiDM+adrw+k83fvmmx3+nV47g3+36xM15jE+zyZ6Ffel02+xSvuM0b2GDRosXZkbb6wA==} + dependencies: + picocolors: 1.0.1 + shell-quote: 1.8.1 + dev: true + + /loader-runner@4.3.0: + resolution: {integrity: sha512-3R/1M+yS3j5ou80Me59j7F9IMs4PXs3VqRrm0TU3AbKPxlmpoY1TNscJV/oGJXo8qCatFGTfDbY6W6ipGOYXfg==} + engines: {node: '>=6.11.5'} + + /lodash.clonedeepwith@4.5.0: + resolution: {integrity: sha512-QRBRSxhbtsX1nc0baxSkkK5WlVTTm/s48DSukcGcWZwIyI8Zz+lB+kFiELJXtzfH4Aj6kMWQ1VWW4U5uUDgZMA==} + dev: false + + /lodash@4.17.21: + resolution: {integrity: sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==} + dev: true + + /log4js@6.9.1: + resolution: {integrity: sha512-1somDdy9sChrr9/f4UlzhdaGfDR2c/SaD2a4T7qEkG4jTS57/B3qmnjLYePwQ8cqWnUHZI0iAKxMBpCZICiZ2g==} + engines: {node: '>=8.0'} + dependencies: + date-format: 4.0.14 + debug: 4.3.5 + flatted: 3.3.1 + rfdc: 1.4.1 + streamroller: 3.1.5 + transitivePeerDependencies: + - supports-color + dev: false + + /long-timeout@0.1.1: + resolution: {integrity: sha512-BFRuQUqc7x2NWxfJBCyUrN8iYUYznzL9JROmRz1gZ6KlOIgmoD+njPVbb+VNn2nGMKggMsK79iUNErillsrx7w==} + dev: false + + /loose-envify@1.4.0: + resolution: {integrity: sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==} + hasBin: true + dependencies: + js-tokens: 4.0.0 + dev: false + + /luxon@3.4.4: + resolution: {integrity: sha512-zobTr7akeGHnv7eBOXcRgMeCP6+uyYsczwmeRCauvpvaAltgNyTbLH/+VaEAPUeWBT+1GuNmz4wC/6jtQzbbVA==} + engines: {node: '>=12'} + dev: false + + /media-typer@0.3.0: + resolution: {integrity: sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ==} + engines: {node: '>= 0.6'} + + /memfs@3.5.3: + resolution: {integrity: sha512-UERzLsxzllchadvbPs5aolHh65ISpKpM+ccLbOJ8/vvpBKmAWf+la7dXFy7Mr0ySHbdHrFv5kGFCUHHe6GFEmw==} + engines: {node: '>= 4.0.0'} + dependencies: + fs-monkey: 1.0.6 + dev: true + + /merge-descriptors@1.0.1: + resolution: {integrity: sha512-cCi6g3/Zr1iqQi6ySbseM1Xvooa98N0w31jzUYrXPX2xqObmFGHJ0tQ5u74H3mVh7wLouTseZyYIq39g8cNp1w==} + dev: true + + /merge-stream@2.0.0: + resolution: {integrity: sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==} + + /methods@1.1.2: + resolution: {integrity: sha512-iclAHeNqNm68zFtnZ0e+1L2yUIdvzNoauKU4WBA3VvH/vPFieF7qfRlwUZU+DA9P9bPXIS90ulxoUoCH23sV2w==} + engines: {node: '>= 0.6'} + dev: true + + /micromatch@4.0.7: + resolution: {integrity: sha512-LPP/3KorzCwBxfeUuZmaR6bG2kdeHSbe0P2tY3FLRU4vYrjYz5hI4QZwV0njUx3jeuKe67YukQ1LSPZBKDqO/Q==} + engines: {node: '>=8.6'} + dependencies: + braces: 3.0.3 + picomatch: 2.3.1 + dev: true + + /mime-db@1.52.0: + resolution: {integrity: sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==} + engines: {node: '>= 0.6'} + + /mime-types@2.1.35: + resolution: {integrity: sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==} + engines: {node: '>= 0.6'} + dependencies: + mime-db: 1.52.0 + + /mime@1.6.0: + resolution: {integrity: sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==} + engines: {node: '>=4'} + hasBin: true + dev: true + + /mimic-fn@2.1.0: + resolution: {integrity: sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==} + engines: {node: '>=6'} + dev: true + + /minimalistic-assert@1.0.1: + resolution: {integrity: sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A==} + dev: true + + /minimatch@3.1.2: + resolution: {integrity: sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==} + dependencies: + brace-expansion: 1.1.11 + dev: true + + /mrmime@1.0.1: + resolution: {integrity: sha512-hzzEagAgDyoU1Q6yg5uI+AorQgdvMCur3FcKf7NhMKWsaYg+RnbTyHRa/9IlLF9rf455MOCtcqqrQQ83pPP7Uw==} + engines: {node: '>=10'} + dev: true + + /ms@2.0.0: + resolution: {integrity: sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==} + + /ms@2.1.2: + resolution: {integrity: sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==} + + /ms@2.1.3: + resolution: {integrity: sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==} + dev: true + + /multicast-dns@7.2.5: + resolution: {integrity: sha512-2eznPJP8z2BFLX50tf0LuODrpINqP1RVIm/CObbTcBRITQgmC/TjcREF1NeTBzIcR5XO/ukWo+YHOjBbFwIupg==} + hasBin: true + dependencies: + dns-packet: 5.6.1 + thunky: 1.1.0 + dev: true + + /negotiator@0.6.3: + resolution: {integrity: sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==} + engines: {node: '>= 0.6'} + + /neo-async@2.6.2: + resolution: {integrity: sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==} + + /node-forge@1.3.1: + resolution: {integrity: sha512-dPEtOeMvF9VMcYV/1Wb8CPoVAXtp6MKMlcbAt4ddqmGqUJ6fQZFXkNZNkNlfevtNkGtaSoXf/vNNNSvgrdXwtA==} + engines: {node: '>= 6.13.0'} + dev: true + + /node-persist@4.0.1: + resolution: {integrity: sha512-QtRjwAlcOQChQpfG6odtEhxYmA3nS5XYr+bx9JRjwahl1TM3sm9J3CCn51/MI0eoHRb2DrkEsCOFo8sq8jG5sQ==} + engines: {node: '>=10.12.0'} + dev: false + + /node-releases@2.0.14: + resolution: {integrity: sha512-y10wOWt8yZpqXmOgRo77WaHEmhYQYGNA6y421PKsKYWEK8aW+cqAphborZDhqfyKrbZEN92CN1X2KbafY2s7Yw==} + + /node-schedule@2.1.1: + resolution: {integrity: sha512-OXdegQq03OmXEjt2hZP33W2YPs/E5BcFQks46+G2gAxs4gHOIVD1u7EqlYLYSKsaIpyKCK9Gbk0ta1/gjRSMRQ==} + engines: {node: '>=6'} + dependencies: + cron-parser: 4.9.0 + long-timeout: 0.1.1 + sorted-array-functions: 1.3.0 + dev: false + + /normalize-path@3.0.0: + resolution: {integrity: sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==} + engines: {node: '>=0.10.0'} + dev: true + + /npm-run-path@4.0.1: + resolution: {integrity: sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==} + engines: {node: '>=8'} + dependencies: + path-key: 3.1.1 + dev: true + + /object-inspect@1.13.2: + resolution: {integrity: sha512-IRZSRuzJiynemAXPYtPe5BoI/RESNYR7TYm50MC5Mqbd3Jmw5y790sErYw3V6SryFJD64b74qQQs9wn5Bg/k3g==} + engines: {node: '>= 0.4'} + dev: true + + /obuf@1.1.2: + resolution: {integrity: sha512-PX1wu0AmAdPqOL1mWhqmlOd8kOIZQwGZw6rh7uby9fTc5lhaOWFLX3I6R1hrF9k3zUY40e6igsLGkDXK92LJNg==} + dev: true + + /on-finished@2.4.1: + resolution: {integrity: sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==} + engines: {node: '>= 0.8'} + dependencies: + ee-first: 1.1.1 + + /on-headers@1.0.2: + resolution: {integrity: sha512-pZAE+FJLoyITytdqK0U5s+FIpjN0JP3OzFi/u8Rx+EV5/W+JTWGXG8xFzevE7AjBfDqHv/8vL8qQsIhHnqRkrA==} + engines: {node: '>= 0.8'} + dev: true + + /once@1.4.0: + resolution: {integrity: sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==} + dependencies: + wrappy: 1.0.2 + dev: true + + /onetime@5.1.2: + resolution: {integrity: sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==} + engines: {node: '>=6'} + dependencies: + mimic-fn: 2.1.0 + dev: true + + /only@0.0.2: + resolution: {integrity: sha512-Fvw+Jemq5fjjyWz6CpKx6w9s7xxqo3+JCyM0WXWeCSOboZ8ABkyvP8ID4CZuChA/wxSx+XSJmdOm8rGVyJ1hdQ==} + dev: false + + /open@10.1.0: + resolution: {integrity: sha512-mnkeQ1qP5Ue2wd+aivTD3NHd/lZ96Lu0jgf0pwktLPtx6cTZiH7tyeGRRHs0zX0rbrahXPnXlUnbeXyaBBuIaw==} + engines: {node: '>=18'} + dependencies: + default-browser: 5.2.1 + define-lazy-prop: 3.0.0 + is-inside-container: 1.0.0 + is-wsl: 3.1.0 + dev: false + + /open@8.4.2: + resolution: {integrity: sha512-7x81NCL719oNbsq/3mh+hVrAWmFuEYUqrq/Iw3kUzH8ReypT9QQ0BLoJS7/G9k6N81XjW4qHWtjWwe/9eLy1EQ==} + engines: {node: '>=12'} + dependencies: + define-lazy-prop: 2.0.0 + is-docker: 2.2.1 + is-wsl: 2.2.0 + dev: true + + /opener@1.5.2: + resolution: {integrity: sha512-ur5UIdyw5Y7yEj9wLzhqXiy6GZ3Mwx0yGI+5sMn2r0N0v3cKJvUmFH5yPP+WXh9e0xfyzyJX95D8l088DNFj7A==} + hasBin: true + dev: true + + /p-retry@4.6.2: + resolution: {integrity: sha512-312Id396EbJdvRONlngUx0NydfrIQ5lsYu0znKVUzVvArzEIt08V1qhtyESbGVd1FGX7UKtiFp5uwKZdM8wIuQ==} + engines: {node: '>=8'} + dependencies: + '@types/retry': 0.12.0 + retry: 0.13.1 + dev: true + + /parse-passwd@1.0.0: + resolution: {integrity: sha512-1Y1A//QUXEZK7YKz+rD9WydcE1+EuPr6ZBgKecAB8tmoW6UFv0NREVJe1p+jRxtThkcbbKkfwIbWJe/IeE6m2Q==} + engines: {node: '>=0.10.0'} + dev: false + + /parseurl@1.3.3: + resolution: {integrity: sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==} + engines: {node: '>= 0.8'} + + /path-is-absolute@1.0.1: + resolution: {integrity: sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==} + engines: {node: '>=0.10.0'} + dev: true + + /path-key@3.1.1: + resolution: {integrity: sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==} + engines: {node: '>=8'} + dev: true + + /path-parse@1.0.7: + resolution: {integrity: sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==} + + /path-to-regexp@0.1.7: + resolution: {integrity: sha512-5DFkuoqlv1uYQKxy8omFBeJPQcdoE07Kv2sferDCrAq1ohOU+MSDswDIbnx3YAM60qIOnYa53wBhXW0EbMonrQ==} + dev: true + + /picocolors@1.0.1: + resolution: {integrity: sha512-anP1Z8qwhkbmu7MFP5iTt+wQKXgwzf7zTyGlcdzabySa9vd0Xt392U0rVmz9poOaBj0uHJKyyo9/upk0HrEQew==} + + /picomatch@2.3.1: + resolution: {integrity: sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==} + engines: {node: '>=8.6'} + dev: true + + /prettier@3.3.2: + resolution: {integrity: sha512-rAVeHYMcv8ATV5d508CFdn+8/pHPpXeIid1DdrPwXnaAdH7cqjVbpJaT5eq4yRAFU/lsbwYwSF/n5iNrdJHPQA==} + engines: {node: '>=14'} + hasBin: true + dev: true + + /process-nextick-args@2.0.1: + resolution: {integrity: sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==} + dev: true + + /proxy-addr@2.0.7: + resolution: {integrity: sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==} + engines: {node: '>= 0.10'} + dependencies: + forwarded: 0.2.0 + ipaddr.js: 1.9.1 + dev: true + + /proxy-from-env@1.1.0: + resolution: {integrity: sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==} + dev: false + + /punycode@2.3.1: + resolution: {integrity: sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==} + engines: {node: '>=6'} + + /qs@6.11.0: + resolution: {integrity: sha512-MvjoMCJwEarSbUYk5O+nmoSzSutSsTwF85zcHPQ9OrlFoZOYIjaqBAJIqIXjptyD5vThxGq52Xu/MaJzRkIk4Q==} + engines: {node: '>=0.6'} + dependencies: + side-channel: 1.0.6 + dev: true + + /rambda@9.2.1: + resolution: {integrity: sha512-6Dp+QQVQuAuhwBlbIvL2FjJVHCKF29W+n9ca/BMTVDqpj+Q7KKqUh7UAINEna8aaB2/oRvPuL5hViCTQARa70Q==} + dev: false + + /randombytes@2.1.0: + resolution: {integrity: sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==} + dependencies: + safe-buffer: 5.2.1 + + /range-parser@1.2.1: + resolution: {integrity: sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==} + engines: {node: '>= 0.6'} + dev: true + + /raw-body@2.5.2: + resolution: {integrity: sha512-8zGqypfENjCIqGhgXToC8aB2r7YrBX+AQAfIPs/Mlk+BtPTztOvTS01NRW/3Eh60J+a48lt8qsCzirQ6loCVfA==} + engines: {node: '>= 0.8'} + dependencies: + bytes: 3.1.2 + http-errors: 2.0.0 + iconv-lite: 0.4.24 + unpipe: 1.0.0 + dev: true + + /react-dom@18.3.1(react@18.3.1): + resolution: {integrity: sha512-5m4nQKp+rZRb09LNH59GM4BxTh9251/ylbKIbpe7TpGxfJ+9kv6BLkLBXIjjspbgbnIBNqlI23tRnTWT0snUIw==} + peerDependencies: + react: ^18.3.1 + dependencies: + loose-envify: 1.4.0 + react: 18.3.1 + scheduler: 0.23.2 + dev: false + + /react-refresh@0.14.2: + resolution: {integrity: sha512-jCvmsr+1IUSMUyzOkRcvnVbX3ZYC6g9TDrDbFuFmRDq7PD4yaGbLKNQL6k2jnArV8hjYxh7hVhAZB6s9HDGpZA==} + engines: {node: '>=0.10.0'} + dev: true + + /react@18.3.1: + resolution: {integrity: sha512-wS+hAgJShR0KhEvPJArfuPVN1+Hz1t0Y6n5jLrGQbkb4urgPE/0Rve+1kMB1v/oWgHgm4WIcV+i7F2pTVj+2iQ==} + engines: {node: '>=0.10.0'} + dependencies: + loose-envify: 1.4.0 + dev: false + + /readable-stream@2.3.8: + resolution: {integrity: sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==} + dependencies: + core-util-is: 1.0.3 + inherits: 2.0.4 + isarray: 1.0.0 + process-nextick-args: 2.0.1 + safe-buffer: 5.1.2 + string_decoder: 1.1.1 + util-deprecate: 1.0.2 + dev: true + + /readable-stream@3.6.2: + resolution: {integrity: sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==} + engines: {node: '>= 6'} + dependencies: + inherits: 2.0.4 + string_decoder: 1.3.0 + util-deprecate: 1.0.2 + dev: true + + /readdirp@3.6.0: + resolution: {integrity: sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==} + engines: {node: '>=8.10.0'} + dependencies: + picomatch: 2.3.1 + dev: true + + /rechoir@0.8.0: + resolution: {integrity: sha512-/vxpCXddiX8NGfGO/mTafwjq4aFa/71pvamip0++IQk3zG8cbCj0fifNPrjjF1XMXUne91jL9OoxmdykoEtifQ==} + engines: {node: '>= 10.13.0'} + dependencies: + resolve: 1.22.8 + dev: true + + /require-directory@2.1.1: + resolution: {integrity: sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==} + engines: {node: '>=0.10.0'} + dev: true + + /require-from-string@2.0.2: + resolution: {integrity: sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==} + engines: {node: '>=0.10.0'} + dev: true + + /requires-port@1.0.0: + resolution: {integrity: sha512-KigOCHcocU3XODJxsu8i/j8T9tzT4adHiecwORRQ0ZZFcp7ahwXuRU1m+yuO90C5ZUyGeGfocHDI14M3L3yDAQ==} + dev: true + + /resolve-dir@1.0.1: + resolution: {integrity: sha512-R7uiTjECzvOsWSfdM0QKFNBVFcK27aHOUwdvK53BcW8zqnGdYp0Fbj82cy54+2A4P2tFM22J5kRfe1R+lM/1yg==} + engines: {node: '>=0.10.0'} + dependencies: + expand-tilde: 2.0.2 + global-modules: 1.0.0 + dev: false + + /resolve@1.22.8: + resolution: {integrity: sha512-oKWePCxqpd6FlLvGV1VU0x7bkPmmCNolxzjMf4NczoDnQcIWrAF+cPtZn5i6n+RfD2d9i0tzpKnG6Yk168yIyw==} + hasBin: true + dependencies: + is-core-module: 2.14.0 + path-parse: 1.0.7 + supports-preserve-symlinks-flag: 1.0.0 + + /retry@0.13.1: + resolution: {integrity: sha512-XQBQ3I8W1Cge0Seh+6gjj03LbmRFWuoszgK9ooCpwYIrhhoO80pfq4cUkU5DkknwfOfFteRwlZ56PYOGYyFWdg==} + engines: {node: '>= 4'} + dev: true + + /rfdc@1.4.1: + resolution: {integrity: sha512-q1b3N5QkRUWUl7iyylaaj3kOpIT0N2i9MqIEQXP73GVsN9cw3fdx8X63cEmWhJGi2PPCF23Ijp7ktmd39rawIA==} + dev: false + + /rimraf@3.0.2: + resolution: {integrity: sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==} + deprecated: Rimraf versions prior to v4 are no longer supported + hasBin: true + dependencies: + glob: 7.2.3 + dev: true + + /run-applescript@7.0.0: + resolution: {integrity: sha512-9by4Ij99JUr/MCFBUkDKLWK3G9HVXmabKz9U5MlIAIuvuzkiOicRYs8XJLxX+xahD+mLiiCYDqF9dKAgtzKP1A==} + engines: {node: '>=18'} + dev: false + + /safe-buffer@5.1.2: + resolution: {integrity: sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==} + dev: true + + /safe-buffer@5.2.1: + resolution: {integrity: sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==} + + /safer-buffer@2.1.2: + resolution: {integrity: sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==} + dev: true + + /scheduler@0.23.2: + resolution: {integrity: sha512-UOShsPwz7NrMUqhR6t0hWjFduvOzbtv7toDH1/hIrfRNIDBnnBWd0CwJTGvTpngVlmwGCdP9/Zl/tVrDqcuYzQ==} + dependencies: + loose-envify: 1.4.0 + dev: false + + /schema-utils@3.3.0: + resolution: {integrity: sha512-pN/yOAvcC+5rQ5nERGuwrjLlYvLTbCibnZ1I7B1LaiAz9BRBlE9GMgE/eqV30P7aJQUf7Ddimy/RsbYO/GrVGg==} + engines: {node: '>= 10.13.0'} + dependencies: + '@types/json-schema': 7.0.15 + ajv: 6.12.6 + ajv-keywords: 3.5.2(ajv@6.12.6) + + /schema-utils@4.2.0: + resolution: {integrity: sha512-L0jRsrPpjdckP3oPug3/VxNKt2trR8TcabrM6FOAAlvC/9Phcmm+cuAgTlxBqdBR1WJx7Naj9WHw+aOmheSVbw==} + engines: {node: '>= 12.13.0'} + dependencies: + '@types/json-schema': 7.0.15 + ajv: 8.16.0 + ajv-formats: 2.1.1(ajv@8.16.0) + ajv-keywords: 5.1.0(ajv@8.16.0) + dev: true + + /select-hose@2.0.0: + resolution: {integrity: sha512-mEugaLK+YfkijB4fx0e6kImuJdCIt2LxCRcbEYPqRGCs4F2ogyfZU5IAZRdjCP8JPq2AtdNoC/Dux63d9Kiryg==} + dev: true + + /selfsigned@2.4.1: + resolution: {integrity: sha512-th5B4L2U+eGLq1TVh7zNRGBapioSORUeymIydxgFpwww9d2qyKvtuPU2jJuHvYAwwqi2Y596QBL3eEqcPEYL8Q==} + engines: {node: '>=10'} + dependencies: + '@types/node-forge': 1.3.11 + node-forge: 1.3.1 + dev: true + + /semver@6.3.1: + resolution: {integrity: sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==} + hasBin: true + dev: true + + /send@0.18.0: + resolution: {integrity: sha512-qqWzuOjSFOuqPjFe4NOsMLafToQQwBSOEpS+FwEt3A2V3vKubTquT3vmLTQpFgMXp8AlFWFuP1qKaJZOtPpVXg==} + engines: {node: '>= 0.8.0'} + dependencies: + debug: 2.6.9 + depd: 2.0.0 + destroy: 1.2.0 + encodeurl: 1.0.2 + escape-html: 1.0.3 + etag: 1.8.1 + fresh: 0.5.2 + http-errors: 2.0.0 + mime: 1.6.0 + ms: 2.1.3 + on-finished: 2.4.1 + range-parser: 1.2.1 + statuses: 2.0.1 + transitivePeerDependencies: + - supports-color + dev: true + + /serialize-javascript@6.0.2: + resolution: {integrity: sha512-Saa1xPByTTq2gdeFZYLLo+RFE35NHZkAbqZeWNd3BpzppeVisAqpDjcp8dyf6uIvEqJRd46jemmyA4iFIeVk8g==} + dependencies: + randombytes: 2.1.0 + + /serve-index@1.9.1: + resolution: {integrity: sha512-pXHfKNP4qujrtteMrSBb0rc8HJ9Ms/GrXwcUtUtD5s4ewDJI8bT3Cz2zTVRMKtri49pLx2e0Ya8ziP5Ya2pZZw==} + engines: {node: '>= 0.8.0'} + dependencies: + accepts: 1.3.8 + batch: 0.6.1 + debug: 2.6.9 + escape-html: 1.0.3 + http-errors: 1.6.3 + mime-types: 2.1.35 + parseurl: 1.3.3 + transitivePeerDependencies: + - supports-color + dev: true + + /serve-static@1.15.0: + resolution: {integrity: sha512-XGuRDNjXUijsUL0vl6nSD7cwURuzEgglbOaFuZM9g3kwDXOWVTck0jLzjPzGD+TazWbboZYu52/9/XPdUgne9g==} + engines: {node: '>= 0.8.0'} + dependencies: + encodeurl: 1.0.2 + escape-html: 1.0.3 + parseurl: 1.3.3 + send: 0.18.0 + transitivePeerDependencies: + - supports-color + dev: true + + /set-function-length@1.2.2: + resolution: {integrity: sha512-pgRc4hJ4/sNjWCSS9AmnS40x3bNMDTknHgL5UaMBTMyJnU90EgWh1Rz+MC9eFu4BuN/UwZjKQuY/1v3rM7HMfg==} + engines: {node: '>= 0.4'} + dependencies: + define-data-property: 1.1.4 + es-errors: 1.3.0 + function-bind: 1.1.2 + get-intrinsic: 1.2.4 + gopd: 1.0.1 + has-property-descriptors: 1.0.2 + dev: true + + /setprototypeof@1.1.0: + resolution: {integrity: sha512-BvE/TwpZX4FXExxOxZyRGQQv651MSwmWKZGqvmPcRIjDqWub67kTKuIMx43cZZrS/cBBzwBcNDWoFxt2XEFIpQ==} + dev: true + + /setprototypeof@1.2.0: + resolution: {integrity: sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==} + + /shebang-command@2.0.0: + resolution: {integrity: sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==} + engines: {node: '>=8'} + dependencies: + shebang-regex: 3.0.0 + dev: true + + /shebang-regex@3.0.0: + resolution: {integrity: sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==} + engines: {node: '>=8'} + dev: true + + /shell-quote@1.8.1: + resolution: {integrity: sha512-6j1W9l1iAs/4xYBI1SYOVZyFcCis9b4KCLQ8fgAGG07QvzaRLVVRQvAy85yNmmZSjYjg4MWh4gNvlPujU/5LpA==} + dev: true + + /side-channel@1.0.6: + resolution: {integrity: sha512-fDW/EZ6Q9RiO8eFG8Hj+7u/oW+XrPTIChwCOM2+th2A6OblDtYYIpve9m+KvI9Z4C9qSEXlaGR6bTEYHReuglA==} + engines: {node: '>= 0.4'} + dependencies: + call-bind: 1.0.7 + es-errors: 1.3.0 + get-intrinsic: 1.2.4 + object-inspect: 1.13.2 + dev: true + + /signal-exit@3.0.7: + resolution: {integrity: sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==} + dev: true + + /sirv@1.0.19: + resolution: {integrity: sha512-JuLThK3TnZG1TAKDwNIqNq6QA2afLOCcm+iE8D1Kj3GA40pSPsxQjjJl0J8X3tsR7T+CP1GavpzLwYkgVLWrZQ==} + engines: {node: '>= 10'} + dependencies: + '@polka/url': 1.0.0-next.25 + mrmime: 1.0.1 + totalist: 1.1.0 + dev: true + + /socket.io-client@4.7.5: + resolution: {integrity: sha512-sJ/tqHOCe7Z50JCBCXrsY3I2k03iOiUe+tj1OmKeD2lXPiGH/RUCdTZFoqVyN7l1MnpIzPrGtLcijffmeouNlQ==} + engines: {node: '>=10.0.0'} + dependencies: + '@socket.io/component-emitter': 3.1.2 + debug: 4.3.5 + engine.io-client: 6.5.4 + socket.io-parser: 4.2.4 + transitivePeerDependencies: + - bufferutil + - supports-color + - utf-8-validate + dev: false + + /socket.io-parser@4.2.4: + resolution: {integrity: sha512-/GbIKmo8ioc+NIWIhwdecY0ge+qVBSMdgxGygevmdHj24bsfgtCmcUUcQ5ZzcylGFHsN3k4HB4Cgkl96KVnuew==} + engines: {node: '>=10.0.0'} + dependencies: + '@socket.io/component-emitter': 3.1.2 + debug: 4.3.5 + transitivePeerDependencies: + - supports-color + dev: false + + /sockjs@0.3.24: + resolution: {integrity: sha512-GJgLTZ7vYb/JtPSSZ10hsOYIvEYsjbNU+zPdIHcUaWVNUEPivzxku31865sSSud0Da0W4lEeOPlmw93zLQchuQ==} + dependencies: + faye-websocket: 0.11.4 + uuid: 8.3.2 + websocket-driver: 0.7.4 + dev: true + + /sorted-array-functions@1.3.0: + resolution: {integrity: sha512-2sqgzeFlid6N4Z2fUQ1cvFmTOLRi/sEDzSQ0OKYchqgoPmQBVyM3959qYx3fpS6Esef80KjmpgPeEr028dP3OA==} + dev: false + + /source-map-support@0.5.21: + resolution: {integrity: sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==} + dependencies: + buffer-from: 1.1.2 + source-map: 0.6.1 + + /source-map@0.6.1: + resolution: {integrity: sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==} + engines: {node: '>=0.10.0'} + + /spdy-transport@3.0.0: + resolution: {integrity: sha512-hsLVFE5SjA6TCisWeJXFKniGGOpBgMLmerfO2aCyCU5s7nJ/rpAepqmFifv/GCbSbueEeAJJnmSQ2rKC/g8Fcw==} + dependencies: + debug: 4.3.5 + detect-node: 2.1.0 + hpack.js: 2.1.6 + obuf: 1.1.2 + readable-stream: 3.6.2 + wbuf: 1.7.3 + transitivePeerDependencies: + - supports-color + dev: true + + /spdy@4.0.2: + resolution: {integrity: sha512-r46gZQZQV+Kl9oItvl1JZZqJKGr+oEkB08A6BzkiR7593/7IbtuncXHd2YoYeTsG4157ZssMu9KYvUHLcjcDoA==} + engines: {node: '>=6.0.0'} + dependencies: + debug: 4.3.5 + handle-thing: 2.0.1 + http-deceiver: 1.2.7 + select-hose: 2.0.0 + spdy-transport: 3.0.0 + transitivePeerDependencies: + - supports-color + dev: true + + /statuses@1.5.0: + resolution: {integrity: sha512-OpZ3zP+jT1PI7I8nemJX4AKmAX070ZkYPVWV/AaKTJl+tXCTGyVdC1a4SL8RUQYEwk/f34ZX8UTykN68FwrqAA==} + engines: {node: '>= 0.6'} + + /statuses@2.0.1: + resolution: {integrity: sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==} + engines: {node: '>= 0.8'} + dev: true + + /streamroller@3.1.5: + resolution: {integrity: sha512-KFxaM7XT+irxvdqSP1LGLgNWbYN7ay5owZ3r/8t77p+EtSUAfUgtl7be3xtqtOmGUl9K9YPO2ca8133RlTjvKw==} + engines: {node: '>=8.0'} + dependencies: + date-format: 4.0.14 + debug: 4.3.5 + fs-extra: 8.1.0 + transitivePeerDependencies: + - supports-color + dev: false + + /string-width@4.2.3: + resolution: {integrity: sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==} + engines: {node: '>=8'} + dependencies: + emoji-regex: 8.0.0 + is-fullwidth-code-point: 3.0.0 + strip-ansi: 6.0.1 + dev: true + + /string_decoder@1.1.1: + resolution: {integrity: sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==} + dependencies: + safe-buffer: 5.1.2 + dev: true + + /string_decoder@1.3.0: + resolution: {integrity: sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==} + dependencies: + safe-buffer: 5.2.1 + dev: true + + /strip-ansi@6.0.1: + resolution: {integrity: sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==} + engines: {node: '>=8'} + dependencies: + ansi-regex: 5.0.1 + dev: true + + /strip-final-newline@2.0.0: + resolution: {integrity: sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==} + engines: {node: '>=6'} + dev: true + + /supports-color@7.2.0: + resolution: {integrity: sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==} + engines: {node: '>=8'} + dependencies: + has-flag: 4.0.0 + + /supports-color@8.1.1: + resolution: {integrity: sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==} + engines: {node: '>=10'} + dependencies: + has-flag: 4.0.0 + + /supports-preserve-symlinks-flag@1.0.0: + resolution: {integrity: sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==} + engines: {node: '>= 0.4'} + + /tapable@2.2.1: + resolution: {integrity: sha512-GNzQvQTOIP6RyTfE2Qxb8ZVlNmw0n88vp1szwWRimP02mnTsx3Wtn5qRdqY9w2XduFNUgvOwhNnQsjwCp+kqaQ==} + engines: {node: '>=6'} + + /terser-webpack-plugin@5.3.10(webpack@5.92.1): + resolution: {integrity: sha512-BKFPWlPDndPs+NGGCr1U59t0XScL5317Y0UReNrHaw9/FwhPENlq6bfgs+4yPfyP51vqC1bQ4rp1EfXW5ZSH9w==} + engines: {node: '>= 10.13.0'} + peerDependencies: + '@swc/core': '*' + esbuild: '*' + uglify-js: '*' + webpack: ^5.1.0 + peerDependenciesMeta: + '@swc/core': + optional: true + esbuild: + optional: true + uglify-js: + optional: true + dependencies: + '@jridgewell/trace-mapping': 0.3.25 + jest-worker: 27.5.1 + schema-utils: 3.3.0 + serialize-javascript: 6.0.2 + terser: 5.31.1 + webpack: 5.92.1 + + /terser@5.31.1: + resolution: {integrity: sha512-37upzU1+viGvuFtBo9NPufCb9dwM0+l9hMxYyWfBA+fbwrPqNJAhbZ6W47bBFnZHKHTUBnMvi87434qq+qnxOg==} + engines: {node: '>=10'} + hasBin: true + dependencies: + '@jridgewell/source-map': 0.3.6 + acorn: 8.12.0 + commander: 2.20.3 + source-map-support: 0.5.21 + + /thunky@1.1.0: + resolution: {integrity: sha512-eHY7nBftgThBqOyHGVN+l8gF0BucP09fMo0oO/Lb0w1OF80dJv+lDVpXG60WMQvkcxAkNybKsrEIE3ZtKGmPrA==} + dev: true + + /to-regex-range@5.0.1: + resolution: {integrity: sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==} + engines: {node: '>=8.0'} + dependencies: + is-number: 7.0.0 + dev: true + + /toidentifier@1.0.1: + resolution: {integrity: sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==} + engines: {node: '>=0.6'} + + /totalist@1.1.0: + resolution: {integrity: sha512-gduQwd1rOdDMGxFG1gEvhV88Oirdo2p+KjoYFU7k2g+i7n6AFFbDQ5kMPUsW0pNbfQsB/cwXvT1i4Bue0s9g5g==} + engines: {node: '>=6'} + dev: true + + /tslib@2.6.3: + resolution: {integrity: sha512-xNvxJEOUiWPGhUuUdQgAJPKOOJfGnIyKySOc09XkKsgdUV/3E2zvwZYdejjmRgPCgcym1juLH3226yA7sEFJKQ==} + dev: false + + /tsscmp@1.0.6: + resolution: {integrity: sha512-LxhtAkPDTkVCMQjt2h6eBVY28KCjikZqZfMcC15YBeNjkgUpdCfBu5HoiOTDu86v6smE8yOjyEktJ8hlbANHQA==} + engines: {node: '>=0.6.x'} + dev: false + + /type-is@1.6.18: + resolution: {integrity: sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==} + engines: {node: '>= 0.6'} + dependencies: + media-typer: 0.3.0 + mime-types: 2.1.35 + + /typescript@5.5.3: + resolution: {integrity: sha512-/hreyEujaB0w76zKo6717l3L0o/qEUtRgdvUBvlkhoWeOVMjMuHNHk0BRBzikzuGDqNmPQbg5ifMEqsHLiIUcQ==} + engines: {node: '>=14.17'} + hasBin: true + dev: false + + /undici-types@5.26.5: + resolution: {integrity: sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA==} + + /universalify@0.1.2: + resolution: {integrity: sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==} + engines: {node: '>= 4.0.0'} + dev: false + + /universalify@2.0.1: + resolution: {integrity: sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==} + engines: {node: '>= 10.0.0'} + dev: false + + /unpipe@1.0.0: + resolution: {integrity: sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==} + engines: {node: '>= 0.8'} + dev: true + + /upath@2.0.1: + resolution: {integrity: sha512-1uEe95xksV1O0CYKXo8vQvN1JEbtJp7lb7C5U9HMsIp6IVwntkH/oNUzyVNQSd4S1sYk2FpSSW44FqMc8qee5w==} + engines: {node: '>=4'} + dev: false + + /update-browserslist-db@1.0.16(browserslist@4.23.1): + resolution: {integrity: sha512-KVbTxlBYlckhF5wgfyZXTWnMn7MMZjMu9XG8bPlliUOP9ThaF4QnhP8qrjrH7DRzHfSk0oQv1wToW+iA5GajEQ==} + hasBin: true + peerDependencies: + browserslist: '>= 4.21.0' + dependencies: + browserslist: 4.23.1 + escalade: 3.1.2 + picocolors: 1.0.1 + + /uri-js@4.4.1: + resolution: {integrity: sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==} + dependencies: + punycode: 2.3.1 + + /util-deprecate@1.0.2: + resolution: {integrity: sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==} + dev: true + + /utils-merge@1.0.1: + resolution: {integrity: sha512-pMZTvIkT1d+TFGvDOqodOclx0QWkkgi6Tdoa8gC8ffGAAqz9pzPTZWAybbsHHoED/ztMtkv/VoYTYyShUn81hA==} + engines: {node: '>= 0.4.0'} + dev: true + + /uuid@8.3.2: + resolution: {integrity: sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==} + hasBin: true + + /vary@1.1.2: + resolution: {integrity: sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==} + engines: {node: '>= 0.8'} + + /watchpack@2.4.1: + resolution: {integrity: sha512-8wrBCMtVhqcXP2Sup1ctSkga6uc2Bx0IIvKyT7yTFier5AXHooSI+QyQQAtTb7+E0IUCCKyTFmXqdqgum2XWGg==} + engines: {node: '>=10.13.0'} + dependencies: + glob-to-regexp: 0.4.1 + graceful-fs: 4.2.11 + + /wbuf@1.7.3: + resolution: {integrity: sha512-O84QOnr0icsbFGLS0O3bI5FswxzRr8/gHwWkDlQFskhSPryQXvrTMxjxGP4+iWYoauLoBvfDpkrOauZ+0iZpDA==} + dependencies: + minimalistic-assert: 1.0.1 + dev: true + + /webpack-bundle-analyzer@4.6.1: + resolution: {integrity: sha512-oKz9Oz9j3rUciLNfpGFjOb49/jEpXNmWdVH8Ls//zNcnLlQdTGXQQMsBbb/gR7Zl8WNLxVCq+0Hqbx3zv6twBw==} + engines: {node: '>= 10.13.0'} + hasBin: true + dependencies: + acorn: 8.12.0 + acorn-walk: 8.3.3 + chalk: 4.1.2 + commander: 7.2.0 + gzip-size: 6.0.0 + lodash: 4.17.21 + opener: 1.5.2 + sirv: 1.0.19 + ws: 7.5.10 + transitivePeerDependencies: + - bufferutil + - utf-8-validate + dev: true + + /webpack-dev-middleware@5.3.4(webpack@5.92.1): + resolution: {integrity: sha512-BVdTqhhs+0IfoeAf7EoH5WE+exCmqGerHfDM0IL096Px60Tq2Mn9MAbnaGUe6HiMa41KMCYF19gyzZmBcq/o4Q==} + engines: {node: '>= 12.13.0'} + peerDependencies: + webpack: ^4.0.0 || ^5.0.0 + dependencies: + colorette: 2.0.19 + memfs: 3.5.3 + mime-types: 2.1.35 + range-parser: 1.2.1 + schema-utils: 4.2.0 + webpack: 5.92.1 + dev: true + + /webpack-dev-middleware@6.1.2(webpack@5.92.1): + resolution: {integrity: sha512-Wu+EHmX326YPYUpQLKmKbTyZZJIB8/n6R09pTmB03kJmnMsVPTo9COzHZFr01txwaCAuZvfBJE4ZCHRcKs5JaQ==} + engines: {node: '>= 14.15.0'} + peerDependencies: + webpack: ^5.0.0 + peerDependenciesMeta: + webpack: + optional: true + dependencies: + colorette: 2.0.19 + memfs: 3.5.3 + mime-types: 2.1.35 + range-parser: 1.2.1 + schema-utils: 4.2.0 + webpack: 5.92.1 + dev: true + + /webpack-dev-server@4.13.1(webpack@5.92.1): + resolution: {integrity: sha512-5tWg00bnWbYgkN+pd5yISQKDejRBYGEw15RaEEslH+zdbNDxxaZvEAO2WulaSaFKb5n3YG8JXsGaDsut1D0xdA==} + engines: {node: '>= 12.13.0'} + hasBin: true + peerDependencies: + webpack: ^4.37.0 || ^5.0.0 + webpack-cli: '*' + peerDependenciesMeta: + webpack: + optional: true + webpack-cli: + optional: true + dependencies: + '@types/bonjour': 3.5.13 + '@types/connect-history-api-fallback': 1.5.4 + '@types/express': 4.17.21 + '@types/serve-index': 1.9.4 + '@types/serve-static': 1.15.7 + '@types/sockjs': 0.3.36 + '@types/ws': 8.5.10 + ansi-html-community: 0.0.8 + bonjour-service: 1.2.1 + chokidar: 3.5.3 + colorette: 2.0.19 + compression: 1.7.4 + connect-history-api-fallback: 2.0.0 + default-gateway: 6.0.3 + express: 4.19.2 + graceful-fs: 4.2.11 + html-entities: 2.5.2 + http-proxy-middleware: 2.0.6(@types/express@4.17.21) + ipaddr.js: 2.2.0 + launch-editor: 2.8.0 + open: 8.4.2 + p-retry: 4.6.2 + rimraf: 3.0.2 + schema-utils: 4.2.0 + selfsigned: 2.4.1 + serve-index: 1.9.1 + sockjs: 0.3.24 + spdy: 4.0.2 + webpack: 5.92.1 + webpack-dev-middleware: 5.3.4(webpack@5.92.1) + ws: 8.17.1 + transitivePeerDependencies: + - bufferutil + - debug + - supports-color + - utf-8-validate + dev: true + + /webpack-sources@3.2.3: + resolution: {integrity: sha512-/DyMEOrDgLKKIG0fmvtz+4dUX/3Ghozwgm6iPp8KRhvn+eQf9+Q7GWxVNMk3+uCPWfdXYC4ExGBckIXdFEfH1w==} + engines: {node: '>=10.13.0'} + + /webpack@5.92.1: + resolution: {integrity: sha512-JECQ7IwJb+7fgUFBlrJzbyu3GEuNBcdqr1LD7IbSzwkSmIevTm8PF+wej3Oxuz/JFBUZ6O1o43zsPkwm1C4TmA==} + engines: {node: '>=10.13.0'} + hasBin: true + peerDependencies: + webpack-cli: '*' + peerDependenciesMeta: + webpack-cli: + optional: true + dependencies: + '@types/eslint-scope': 3.7.7 + '@types/estree': 1.0.5 + '@webassemblyjs/ast': 1.12.1 + '@webassemblyjs/wasm-edit': 1.12.1 + '@webassemblyjs/wasm-parser': 1.12.1 + acorn: 8.12.0 + acorn-import-attributes: 1.9.5(acorn@8.12.0) + browserslist: 4.23.1 + chrome-trace-event: 1.0.4 + enhanced-resolve: 5.17.0 + es-module-lexer: 1.5.4 + eslint-scope: 5.1.1 + events: 3.3.0 + glob-to-regexp: 0.4.1 + graceful-fs: 4.2.11 + json-parse-even-better-errors: 2.3.1 + loader-runner: 4.3.0 + mime-types: 2.1.35 + neo-async: 2.6.2 + schema-utils: 3.3.0 + tapable: 2.2.1 + terser-webpack-plugin: 5.3.10(webpack@5.92.1) + watchpack: 2.4.1 + webpack-sources: 3.2.3 + transitivePeerDependencies: + - '@swc/core' + - esbuild + - uglify-js + + /websocket-driver@0.7.4: + resolution: {integrity: sha512-b17KeDIQVjvb0ssuSDF2cYXSg2iztliJ4B9WdsuB6J952qCPKmnVq4DyW5motImXHDC1cBT/1UezrJVsKw5zjg==} + engines: {node: '>=0.8.0'} + dependencies: + http-parser-js: 0.5.8 + safe-buffer: 5.2.1 + websocket-extensions: 0.1.4 + dev: true + + /websocket-extensions@0.1.4: + resolution: {integrity: sha512-OqedPIGOfsDlo31UNwYbCFMSaO9m9G/0faIHj5/dZFDMFqPTcx6UwqyOy3COEaEOg/9VsGIpdqn62W5KhoKSpg==} + engines: {node: '>=0.8.0'} + dev: true + + /which@1.3.1: + resolution: {integrity: sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==} + hasBin: true + dependencies: + isexe: 2.0.0 + dev: false + + /which@2.0.2: + resolution: {integrity: sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==} + engines: {node: '>= 8'} + hasBin: true + dependencies: + isexe: 2.0.0 + dev: true + + /wrap-ansi@7.0.0: + resolution: {integrity: sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==} + engines: {node: '>=10'} + dependencies: + ansi-styles: 4.3.0 + string-width: 4.2.3 + strip-ansi: 6.0.1 + dev: true + + /wrappy@1.0.2: + resolution: {integrity: sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==} + dev: true + + /ws@7.5.10: + resolution: {integrity: sha512-+dbF1tHwZpXcbOJdVOkzLDxZP1ailvSxM6ZweXTegylPny803bFhA+vqBYw4s31NSAk4S2Qz+AKXK9a4wkdjcQ==} + engines: {node: '>=8.3.0'} + peerDependencies: + bufferutil: ^4.0.1 + utf-8-validate: ^5.0.2 + peerDependenciesMeta: + bufferutil: + optional: true + utf-8-validate: + optional: true + dev: true + + /ws@8.17.1: + resolution: {integrity: sha512-6XQFvXTkbfUOZOKKILFG1PDK2NDQs4azKQl26T0YS5CxqWLgXajbPZ+h4gZekJyRqFU8pvnbAbbs/3TgRPy+GQ==} + engines: {node: '>=10.0.0'} + peerDependencies: + bufferutil: ^4.0.1 + utf-8-validate: '>=5.0.2' + peerDependenciesMeta: + bufferutil: + optional: true + utf-8-validate: + optional: true + + /ws@8.8.1: + resolution: {integrity: sha512-bGy2JzvzkPowEJV++hF07hAD6niYSr0JzBNo/J29WsB57A2r7Wlc1UFcTR9IzrPvuNVO4B8LGqF8qcpsVOhJCA==} + engines: {node: '>=10.0.0'} + peerDependencies: + bufferutil: ^4.0.1 + utf-8-validate: ^5.0.2 + peerDependenciesMeta: + bufferutil: + optional: true + utf-8-validate: + optional: true + dev: true + + /xmlhttprequest-ssl@2.0.0: + resolution: {integrity: sha512-QKxVRxiRACQcVuQEYFsI1hhkrMlrXHPegbbd1yn9UHOmRxY+si12nQYzri3vbzt8VdTTRviqcKxcyllFas5z2A==} + engines: {node: '>=0.4.0'} + dev: false + + /y18n@5.0.8: + resolution: {integrity: sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==} + engines: {node: '>=10'} + dev: true + + /yargs-parser@21.1.1: + resolution: {integrity: sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==} + engines: {node: '>=12'} + dev: true + + /yargs@17.6.2: + resolution: {integrity: sha512-1/9UrdHjDZc0eOU0HxOHoS78C69UD3JRMvzlJ7S79S2nTaWRA/whGCTV8o9e/N/1Va9YIV7Q4sOxD8VV4pCWOw==} + engines: {node: '>=12'} + dependencies: + cliui: 8.0.1 + escalade: 3.1.2 + get-caller-file: 2.0.5 + require-directory: 2.1.1 + string-width: 4.2.3 + y18n: 5.0.8 + yargs-parser: 21.1.1 + dev: true + + /ylru@1.4.0: + resolution: {integrity: sha512-2OQsPNEmBCvXuFlIni/a+Rn+R2pHW9INm0BxXJ4hVDA8TirqMj+J/Rp9ItLatT/5pZqWwefVrTQcHpixsxnVlA==} + engines: {node: '>= 4.0.0'} + dev: false + + /zephyr-agent@0.0.13: + resolution: {integrity: sha512-MxSthGw3OVs80dG6JWeauIGdvMLpfpS2DxlfWVdQjqMnvnU/2OToOxGX+f6qdfpnu1bu+jd/QetPjmwBHxYLxg==} + dependencies: + is-ci: 3.0.1 + jose: 5.6.2 + open: 10.1.0 + socket.io-client: 4.7.5 + tslib: 2.6.3 + uuid: 8.3.2 + zephyr-edge-contract: 0.0.13 + transitivePeerDependencies: + - bufferutil + - supports-color + - utf-8-validate + dev: false + + /zephyr-edge-contract@0.0.13: + resolution: {integrity: sha512-RvYPYjQnC54GDTxG/dvMvjYfQcjmCxA/ugqs3/W1L280o3z3gxiFyM0Wo+4Zca3V/GCo03isvbs0KGJwj2VD8Q==} + dependencies: + debug: 4.3.5 + node-persist: 4.0.1 + tslib: 2.6.3 + transitivePeerDependencies: + - supports-color + dev: false + + /zephyr-webpack-plugin@0.0.13: + resolution: {integrity: sha512-LEFrj8gNzAzrCKSomSwLWMqFqpVgOVxJVmMwzQy3cZ4yAQeNgpjLAm5BOccE3MoewPWqdgzTCjEbqdIK+TyMFQ==} + dependencies: + '@module-federation/automatic-vendor-federation': 1.2.1(webpack@5.92.1) + is-ci: 3.0.1 + tslib: 2.6.3 + webpack: 5.92.1 + zephyr-agent: 0.0.13 + zephyr-edge-contract: 0.0.13 + transitivePeerDependencies: + - '@swc/core' + - bufferutil + - esbuild + - supports-color + - uglify-js + - utf-8-validate + - webpack-cli + dev: false diff --git a/rspack_hmr/runhost/rspack.config.js b/rspack_hmr/runhost/rspack.config.js new file mode 100644 index 0000000..70e9512 --- /dev/null +++ b/rspack_hmr/runhost/rspack.config.js @@ -0,0 +1,109 @@ +const rspack = require('@rspack/core'); +const refreshPlugin = require('@rspack/plugin-react-refresh'); +const { withZephyr } = require("zephyr-webpack-plugin") +const isDev = process.env.NODE_ENV === 'development'; + +const path = require('path'); +const deps = require('./package.json').dependencies; +console.log({ deps }); +const { ModuleFederationPlugin } = require('@module-federation/enhanced/rspack'); + +const name = 'runhost'; +const name1 = name + '1'; +/** + * @type {import('@rspack/cli').Configuration} + */ +module.exports = { + //context: __dirname, + entry: { + main: './src/index.tsx', + }, + resolve: { + extensions: ['...', '.ts', '.tsx', '.jsx'], + }, + devServer: { + port: 3003, + hot: true, + static: { + directory: path.join(__dirname, 'build'), + }, + liveReload: false, + headers: { + 'Access-Control-Allow-Origin': '*', + 'Access-Control-Allow-Methods': 'GET, POST, PUT, DELETE, PATCH, OPTIONS', + 'Access-Control-Allow-Headers': 'X-Requested-With, content-type, Authorization', + }, + }, + + devtool: 'source-map', + optimization: { minimize: false }, + output: { + path: __dirname + '/dist', + uniqueName: name1, + publicPath: 'http://localhost:3003/', + filename: '[name].js', + }, + watch: true, + module: { + rules: [ + { + test: /\.svg$/, + type: 'asset', + }, + { + test: /\.(jsx?|tsx?)$/, + + exclude: /(node_modules|\.webpack)/, + use: [ + { + loader: 'builtin:swc-loader', + options: { + sourceMap: true, + jsc: { + parser: { + syntax: 'typescript', + tsx: true, + }, + transform: { + react: { + runtime: 'automatic', + development: isDev, + refresh: isDev, + }, + }, + }, + env: { + targets: ['chrome >= 87', 'edge >= 88', 'firefox >= 78', 'safari >= 14'], + }, + }, + }, + ], + }, + ], + }, + plugins: [ + new rspack.DefinePlugin({ + 'process.env.NODE_ENV': JSON.stringify(process.env.NODE_ENV), + }), + new rspack.ProgressPlugin({}), + + isDev && new rspack.HotModuleReplacementPlugin(), + new rspack.HtmlRspackPlugin({ + template: './index.html', + excludedChunks: [name], + filename: 'index.html', + inject: true, + publicPath: '/', + }), + new ModuleFederationPlugin({ + name: name, + filename: 'remoteEntry.js', + // remotes: { + // app_02: "app_02@http://localhost:3001/mf-manifest.json", + // }, + + shared: ['react', 'react-dom'], + }), + isDev ? new refreshPlugin() : null, + ].filter(Boolean), +}; diff --git a/rspack_hmr/runhost/src/App.css b/rspack_hmr/runhost/src/App.css new file mode 100644 index 0000000..2c5e2ef --- /dev/null +++ b/rspack_hmr/runhost/src/App.css @@ -0,0 +1,41 @@ +#root { + max-width: 1280px; + margin: 0 auto; + padding: 2rem; + text-align: center; +} + +.logo { + height: 6em; + padding: 1.5em; + will-change: filter; +} +.logo:hover { + filter: drop-shadow(0 0 2em #646cffaa); +} +.logo.react:hover { + filter: drop-shadow(0 0 2em #61dafbaa); +} + +@keyframes logo-spin { + from { + transform: rotate(0deg); + } + to { + transform: rotate(360deg); + } +} + +@media (prefers-reduced-motion: no-preference) { + a:nth-of-type(2) .logo { + animation: logo-spin infinite 20s linear; + } +} + +.card { + padding: 2em; +} + +.read-the-docs { + color: #888; +} diff --git a/rspack_hmr/runhost/src/App.tsx b/rspack_hmr/runhost/src/App.tsx new file mode 100644 index 0000000..c768602 --- /dev/null +++ b/rspack_hmr/runhost/src/App.tsx @@ -0,0 +1,30 @@ +import './App.css'; +import { lazy, Suspense } from 'react'; +import { loadRemote } from '@module-federation/runtime'; +//@ts-ignore +const Hello = lazy(() => + loadRemote('a2/Hello').then(module => ({ default: module.Hello })), +); +function App() { + return ( +
    +
    +

    Runhost :)

    +

    + This is currently in the runhost app.{' '} +

      +
    • Directory name: runhost
    • +
    • package.json name: @rspack-hmr/rspack-runhost
    • +
    {' '} +
    We are taking the 'Hello'module from App_02 +

    + + + + +
    +
    + ); +} + +export default App; diff --git a/rspack_hmr/runhost/src/bootstrap.tsx b/rspack_hmr/runhost/src/bootstrap.tsx new file mode 100644 index 0000000..faffd42 --- /dev/null +++ b/rspack_hmr/runhost/src/bootstrap.tsx @@ -0,0 +1,83 @@ +import React from 'react'; +import ReactDOM from 'react-dom/client'; +import App from './App.tsx'; +import './index.css'; +import { FederationRuntimePlugin, init, loadRemote } from '@module-federation/enhanced/runtime'; + +const runtimePlugin: () => FederationRuntimePlugin = function () { + return { + name: 'my-runtime-plugin', + beforeInit(args) { + console.log('beforeInit: ', args); + return args; + }, + beforeRequest(args) { + console.log('beforeRequest: ', args); + return args; + }, + + // loadRemoteSnapshot(args) { + // console.log("loadRemoteSnapshot: ", args); + // if (args.manifestJson && (args.manifestJson.metaData as any).publicPath.includes("placeholder")) { + // (args.manifestJson.metaData as any).publicPath = (args.manifestJson.metaData as any).publicPath.replace( + // "placeholder", + // args.manifestUrl?.split("/")[2].split(":")[0], + // ); + // } + // if ((args.remoteSnapshot as any).publicPath.includes("placeholder")) { + // (args.remoteSnapshot as any).publicPath = (args.remoteSnapshot as any).publicPath.replace( + // "placeholder", + // args.manifestUrl?.split("/")[2].split(":")[0], + // ); + // } + // return args; + //}, + + afterResolve(args) { + console.log('afterResolve', args); + return args; + }, + onLoad(args) { + console.log('onLoad: ', args); + return args; + }, + async loadShare(args) { + console.log('loadShare:', args); + return args; + }, + async beforeLoadShare(args) { + console.log('beforeloadShare:', args); + return args; + }, + // async initContainer(args) { + // console.log("initContainer: ", args); + // args.origin.snapshotHandler.manifestCache.forEach((manifest, index) => { + // console.log(args); + // manifest.metaData.publicPath = manifest.metaData.publicPath.replace( + // "placeholder", + // args.remoteInfo.entry.split("/")[2].split(":")[0], + // ); + // console.log("manifest: ", manifest); + // }); + // console.log("args after", args); + //return args; + //}, + }; +}; + +export async function renderApp() { + init({ + name: 'runhost', + remotes: [{ name: '@app_02', entry: 'http://localhost:3001/mf-manifest.json', alias: 'a2' }], + plugins: [runtimePlugin()], + }); + + loadRemote('a2/pi').then(module => { + console.log('results from pi in app02: ', (module as any).default()); + }); + ReactDOM.createRoot(document.getElementById('root') as HTMLElement).render( + + + , + ); +} diff --git a/rspack_hmr/runhost/src/index.css b/rspack_hmr/runhost/src/index.css new file mode 100644 index 0000000..917888c --- /dev/null +++ b/rspack_hmr/runhost/src/index.css @@ -0,0 +1,70 @@ +:root { + font-family: Inter, Avenir, Helvetica, Arial, sans-serif; + font-size: 16px; + line-height: 24px; + font-weight: 400; + + color-scheme: light dark; + color: rgba(255, 255, 255, 0.87); + background-color: #242424; + + font-synthesis: none; + text-rendering: optimizeLegibility; + -webkit-font-smoothing: antialiased; + -moz-osx-font-smoothing: grayscale; + -webkit-text-size-adjust: 100%; +} + +a { + font-weight: 500; + color: #646cff; + text-decoration: inherit; +} +a:hover { + color: #535bf2; +} + +body { + margin: 0; + display: flex; + place-items: center; + min-width: 320px; + min-height: 100vh; +} + +h1 { + font-size: 3.2em; + line-height: 1.1; +} + +button { + border-radius: 8px; + border: 1px solid transparent; + padding: 0.6em 1.2em; + font-size: 1em; + font-weight: 500; + font-family: inherit; + background-color: #1a1a1a; + cursor: pointer; + transition: border-color 0.25s; +} +button:hover { + border-color: #646cff; +} +button:focus, +button:focus-visible { + outline: 4px auto -webkit-focus-ring-color; +} + +@media (prefers-color-scheme: light) { + :root { + color: #213547; + background-color: #ffffff; + } + a:hover { + color: #747bff; + } + button { + background-color: #f9f9f9; + } +} diff --git a/rspack_hmr/runhost/src/index.tsx b/rspack_hmr/runhost/src/index.tsx new file mode 100644 index 0000000..2e6eb1a --- /dev/null +++ b/rspack_hmr/runhost/src/index.tsx @@ -0,0 +1,3 @@ +import('./bootstrap').then(async ({ renderApp }) => { + await renderApp(); +}); diff --git a/rspack_hmr/runhost/src/react-env.d.ts b/rspack_hmr/runhost/src/react-env.d.ts new file mode 100644 index 0000000..bd4c10d --- /dev/null +++ b/rspack_hmr/runhost/src/react-env.d.ts @@ -0,0 +1,213 @@ +// CSS modules +type CSSModuleClasses = { readonly [key: string]: string }; + +declare module '*.module.css' { + const classes: CSSModuleClasses; + export default classes; +} +declare module '*.module.scss' { + const classes: CSSModuleClasses; + export default classes; +} +declare module '*.module.sass' { + const classes: CSSModuleClasses; + export default classes; +} +declare module '*.module.less' { + const classes: CSSModuleClasses; + export default classes; +} +declare module '*.module.styl' { + const classes: CSSModuleClasses; + export default classes; +} +declare module '*.module.stylus' { + const classes: CSSModuleClasses; + export default classes; +} +declare module '*.module.pcss' { + const classes: CSSModuleClasses; + export default classes; +} +declare module '*.module.sss' { + const classes: CSSModuleClasses; + export default classes; +} + +// CSS +declare module '*.css' { + /** + * @deprecated Use `import style from './style.css?inline'` instead. + */ + const css: string; + export default css; +} +declare module '*.scss' { + /** + * @deprecated Use `import style from './style.scss?inline'` instead. + */ + const css: string; + export default css; +} +declare module '*.sass' { + /** + * @deprecated Use `import style from './style.sass?inline'` instead. + */ + const css: string; + export default css; +} +declare module '*.less' { + /** + * @deprecated Use `import style from './style.less?inline'` instead. + */ + const css: string; + export default css; +} +declare module '*.styl' { + /** + * @deprecated Use `import style from './style.styl?inline'` instead. + */ + const css: string; + export default css; +} +declare module '*.stylus' { + /** + * @deprecated Use `import style from './style.stylus?inline'` instead. + */ + const css: string; + export default css; +} +declare module '*.pcss' { + /** + * @deprecated Use `import style from './style.pcss?inline'` instead. + */ + const css: string; + export default css; +} +declare module '*.sss' { + /** + * @deprecated Use `import style from './style.sss?inline'` instead. + */ + const css: string; + export default css; +} + +// images +declare module '*.png' { + const src: string; + export default src; +} +declare module '*.jpg' { + const src: string; + export default src; +} +declare module '*.jpeg' { + const src: string; + export default src; +} +declare module '*.jfif' { + const src: string; + export default src; +} +declare module '*.pjpeg' { + const src: string; + export default src; +} +declare module '*.pjp' { + const src: string; + export default src; +} +declare module '*.gif' { + const src: string; + export default src; +} +declare module '*.svg' { + const ReactComponent: React.FC>; + const content: string; + + export { ReactComponent }; + export default content; +} +declare module '*.ico' { + const src: string; + export default src; +} +declare module '*.webp' { + const src: string; + export default src; +} +declare module '*.avif' { + const src: string; + export default src; +} + +// media +declare module '*.mp4' { + const src: string; + export default src; +} +declare module '*.webm' { + const src: string; + export default src; +} +declare module '*.ogg' { + const src: string; + export default src; +} +declare module '*.mp3' { + const src: string; + export default src; +} +declare module '*.wav' { + const src: string; + export default src; +} +declare module '*.flac' { + const src: string; + export default src; +} +declare module '*.aac' { + const src: string; + export default src; +} + +declare module '*.opus' { + const src: string; + export default src; +} + +// fonts +declare module '*.woff' { + const src: string; + export default src; +} +declare module '*.woff2' { + const src: string; + export default src; +} +declare module '*.eot' { + const src: string; + export default src; +} +declare module '*.ttf' { + const src: string; + export default src; +} +declare module '*.otf' { + const src: string; + export default src; +} + +// other +declare module '*.webmanifest' { + const src: string; + export default src; +} +declare module '*.pdf' { + const src: string; + export default src; +} +declare module '*.txt' { + const src: string; + export default src; +} diff --git a/rspack_hmr/runhost/tsconfig.json b/rspack_hmr/runhost/tsconfig.json new file mode 100644 index 0000000..cb52ef7 --- /dev/null +++ b/rspack_hmr/runhost/tsconfig.json @@ -0,0 +1,21 @@ +{ + "compilerOptions": { + "target": "ES6", + "lib": ["DOM", "DOM.Iterable", "ESNext"], + "module": "ESNext", + "moduleResolution": "bundler", + "allowImportingTsExtensions": true, + "resolveJsonModule": true, + "isolatedModules": true, + "noEmit": true, + "jsx": "react-jsx", + "strict": true, + "noUnusedLocals": true, + "noUnusedParameters": true, + "noFallthroughCasesInSwitch": true, + "paths": { + "*": ["./@mf-types/*"] + } + }, + "include": ["src"] +}