From 9d914374df0918e306a500a25f5f7965ccf3ff6a Mon Sep 17 00:00:00 2001 From: Jackson Chen <90215880+Sma1lboy@users.noreply.github.com> Date: Thu, 28 Nov 2024 10:07:21 -0600 Subject: [PATCH 01/71] feat(backent): adding react-ts template (#56) ## Summary by CodeRabbit ## Release Notes - **New Features** - Introduced a new template for React applications using TypeScript and Vite, including essential setup files. - Added a main HTML entry point for the application. - Configured ESLint for improved code quality and best practices in TypeScript and React environments. - **Documentation** - Added a README file outlining setup instructions and recommended configurations for the template. - **Configuration** - New TypeScript and Vite configuration files created to optimize the development environment. --- backend/template/react-ts/.gitignore | 24 + backend/template/react-ts/README.md | 50 + backend/template/react-ts/eslint.config.js | 28 + backend/template/react-ts/index.html | 13 + backend/template/react-ts/package-lock.json | 3041 ++++++++++++++++++ backend/template/react-ts/package.json | 30 + backend/template/react-ts/public/codefox.svg | 29 + backend/template/react-ts/src/index.jsx | 6 + backend/template/react-ts/src/vite-env.d.ts | 1 + backend/template/react-ts/tsconfig.app.json | 26 + backend/template/react-ts/tsconfig.json | 7 + backend/template/react-ts/tsconfig.node.json | 24 + backend/template/react-ts/vite.config.ts | 7 + pnpm-lock.yaml | 9 +- 14 files changed, 3291 insertions(+), 4 deletions(-) create mode 100644 backend/template/react-ts/.gitignore create mode 100644 backend/template/react-ts/README.md create mode 100644 backend/template/react-ts/eslint.config.js create mode 100644 backend/template/react-ts/index.html create mode 100644 backend/template/react-ts/package-lock.json create mode 100644 backend/template/react-ts/package.json create mode 100644 backend/template/react-ts/public/codefox.svg create mode 100644 backend/template/react-ts/src/index.jsx create mode 100644 backend/template/react-ts/src/vite-env.d.ts create mode 100644 backend/template/react-ts/tsconfig.app.json create mode 100644 backend/template/react-ts/tsconfig.json create mode 100644 backend/template/react-ts/tsconfig.node.json create mode 100644 backend/template/react-ts/vite.config.ts diff --git a/backend/template/react-ts/.gitignore b/backend/template/react-ts/.gitignore new file mode 100644 index 00000000..a547bf36 --- /dev/null +++ b/backend/template/react-ts/.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/backend/template/react-ts/README.md b/backend/template/react-ts/README.md new file mode 100644 index 00000000..74872fd4 --- /dev/null +++ b/backend/template/react-ts/README.md @@ -0,0 +1,50 @@ +# React + TypeScript + Vite + +This template provides a minimal setup to get React working in Vite with HMR and some ESLint rules. + +Currently, two official plugins are available: + +- [@vitejs/plugin-react](https://github.com/vitejs/vite-plugin-react/blob/main/packages/plugin-react/README.md) uses [Babel](https://babeljs.io/) for Fast Refresh +- [@vitejs/plugin-react-swc](https://github.com/vitejs/vite-plugin-react-swc) uses [SWC](https://swc.rs/) for Fast Refresh + +## Expanding the ESLint configuration + +If you are developing a production application, we recommend updating the configuration to enable type aware lint rules: + +- Configure the top-level `parserOptions` property like this: + +```js +export default tseslint.config({ + languageOptions: { + // other options... + parserOptions: { + project: ['./tsconfig.node.json', './tsconfig.app.json'], + tsconfigRootDir: import.meta.dirname, + }, + }, +}) +``` + +- Replace `tseslint.configs.recommended` to `tseslint.configs.recommendedTypeChecked` or `tseslint.configs.strictTypeChecked` +- Optionally add `...tseslint.configs.stylisticTypeChecked` +- Install [eslint-plugin-react](https://github.com/jsx-eslint/eslint-plugin-react) and update the config: + +```js +// eslint.config.js +import react from 'eslint-plugin-react' + +export default tseslint.config({ + // Set the react version + settings: { react: { version: '18.3' } }, + plugins: { + // Add the react plugin + react, + }, + rules: { + // other rules... + // Enable its recommended rules + ...react.configs.recommended.rules, + ...react.configs['jsx-runtime'].rules, + }, +}) +``` diff --git a/backend/template/react-ts/eslint.config.js b/backend/template/react-ts/eslint.config.js new file mode 100644 index 00000000..092408a9 --- /dev/null +++ b/backend/template/react-ts/eslint.config.js @@ -0,0 +1,28 @@ +import js from '@eslint/js' +import globals from 'globals' +import reactHooks from 'eslint-plugin-react-hooks' +import reactRefresh from 'eslint-plugin-react-refresh' +import tseslint from 'typescript-eslint' + +export default tseslint.config( + { ignores: ['dist'] }, + { + extends: [js.configs.recommended, ...tseslint.configs.recommended], + files: ['**/*.{ts,tsx}'], + languageOptions: { + ecmaVersion: 2020, + globals: globals.browser, + }, + plugins: { + 'react-hooks': reactHooks, + 'react-refresh': reactRefresh, + }, + rules: { + ...reactHooks.configs.recommended.rules, + 'react-refresh/only-export-components': [ + 'warn', + { allowConstantExport: true }, + ], + }, + }, +) diff --git a/backend/template/react-ts/index.html b/backend/template/react-ts/index.html new file mode 100644 index 00000000..6c13993e --- /dev/null +++ b/backend/template/react-ts/index.html @@ -0,0 +1,13 @@ + + + + + + + Codefox generated project + + +
+ + + diff --git a/backend/template/react-ts/package-lock.json b/backend/template/react-ts/package-lock.json new file mode 100644 index 00000000..99341101 --- /dev/null +++ b/backend/template/react-ts/package-lock.json @@ -0,0 +1,3041 @@ +{ + "name": "react-ts", + "version": "0.0.0", + "lockfileVersion": 3, + "requires": true, + "packages": { + "": { + "name": "react-ts", + "version": "0.0.0", + "dependencies": { + "react": "^18.3.1", + "react-dom": "^18.3.1", + "react-router": "^7.0.1" + }, + "devDependencies": { + "@eslint/js": "^9.15.0", + "@types/react": "^18.3.12", + "@types/react-dom": "^18.3.1", + "@vitejs/plugin-react": "^4.3.4", + "eslint": "^9.15.0", + "eslint-plugin-react-hooks": "^5.0.0", + "eslint-plugin-react-refresh": "^0.4.14", + "globals": "^15.12.0", + "typescript": "~5.6.2", + "typescript-eslint": "^8.15.0", + "vite": "^6.0.1" + } + }, + "node_modules/@ampproject/remapping": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/@ampproject/remapping/-/remapping-2.3.0.tgz", + "integrity": "sha512-30iZtAPgz+LTIYoeivqYo853f02jBYSd5uGnGpkFV0M3xOt9aN73erkgYAmZU43x4VfqcnLxW9Kpg3R5LC4YYw==", + "dev": true, + "dependencies": { + "@jridgewell/gen-mapping": "^0.3.5", + "@jridgewell/trace-mapping": "^0.3.24" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@babel/code-frame": { + "version": "7.26.2", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.26.2.tgz", + "integrity": "sha512-RJlIHRueQgwWitWgF8OdFYGZX328Ax5BCemNGlqHfplnRT9ESi8JkFlvaVYbS+UubVY6dpv87Fs2u5M29iNFVQ==", + "dev": true, + "dependencies": { + "@babel/helper-validator-identifier": "^7.25.9", + "js-tokens": "^4.0.0", + "picocolors": "^1.0.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/compat-data": { + "version": "7.26.2", + "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.26.2.tgz", + "integrity": "sha512-Z0WgzSEa+aUcdiJuCIqgujCshpMWgUpgOxXotrYPSA53hA3qopNaqcJpyr0hVb1FeWdnqFA35/fUtXgBK8srQg==", + "dev": true, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/core": { + "version": "7.26.0", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.26.0.tgz", + "integrity": "sha512-i1SLeK+DzNnQ3LL/CswPCa/E5u4lh1k6IAEphON8F+cXt0t9euTshDru0q7/IqMa1PMPz5RnHuHscF8/ZJsStg==", + "dev": true, + "dependencies": { + "@ampproject/remapping": "^2.2.0", + "@babel/code-frame": "^7.26.0", + "@babel/generator": "^7.26.0", + "@babel/helper-compilation-targets": "^7.25.9", + "@babel/helper-module-transforms": "^7.26.0", + "@babel/helpers": "^7.26.0", + "@babel/parser": "^7.26.0", + "@babel/template": "^7.25.9", + "@babel/traverse": "^7.25.9", + "@babel/types": "^7.26.0", + "convert-source-map": "^2.0.0", + "debug": "^4.1.0", + "gensync": "^1.0.0-beta.2", + "json5": "^2.2.3", + "semver": "^6.3.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/babel" + } + }, + "node_modules/@babel/generator": { + "version": "7.26.2", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.26.2.tgz", + "integrity": "sha512-zevQbhbau95nkoxSq3f/DC/SC+EEOUZd3DYqfSkMhY2/wfSeaHV1Ew4vk8e+x8lja31IbyuUa2uQ3JONqKbysw==", + "dev": true, + "dependencies": { + "@babel/parser": "^7.26.2", + "@babel/types": "^7.26.0", + "@jridgewell/gen-mapping": "^0.3.5", + "@jridgewell/trace-mapping": "^0.3.25", + "jsesc": "^3.0.2" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-compilation-targets": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.25.9.tgz", + "integrity": "sha512-j9Db8Suy6yV/VHa4qzrj9yZfZxhLWQdVnRlXxmKLYlhWUVB1sB2G5sxuWYXk/whHD9iW76PmNzxZ4UCnTQTVEQ==", + "dev": true, + "dependencies": { + "@babel/compat-data": "^7.25.9", + "@babel/helper-validator-option": "^7.25.9", + "browserslist": "^4.24.0", + "lru-cache": "^5.1.1", + "semver": "^6.3.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-module-imports": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.25.9.tgz", + "integrity": "sha512-tnUA4RsrmflIM6W6RFTLFSXITtl0wKjgpnLgXyowocVPrbYrLUXSBXDgTs8BlbmIzIdlBySRQjINYs2BAkiLtw==", + "dev": true, + "dependencies": { + "@babel/traverse": "^7.25.9", + "@babel/types": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-module-transforms": { + "version": "7.26.0", + "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.26.0.tgz", + "integrity": "sha512-xO+xu6B5K2czEnQye6BHA7DolFFmS3LB7stHZFaOLb1pAwO1HWLS8fXA+eh0A2yIvltPVmx3eNNDBJA2SLHXFw==", + "dev": true, + "dependencies": { + "@babel/helper-module-imports": "^7.25.9", + "@babel/helper-validator-identifier": "^7.25.9", + "@babel/traverse": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/helper-plugin-utils": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.25.9.tgz", + "integrity": "sha512-kSMlyUVdWe25rEsRGviIgOWnoT/nfABVWlqt9N19/dIPWViAOW2s9wznP5tURbs/IDuNk4gPy3YdYRgH3uxhBw==", + "dev": true, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-string-parser": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.25.9.tgz", + "integrity": "sha512-4A/SCr/2KLd5jrtOMFzaKjVtAei3+2r/NChoBNoZ3EyP/+GlhoaEGoWOZUmFmoITP7zOJyHIMm+DYRd8o3PvHA==", + "dev": true, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-validator-identifier": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.25.9.tgz", + "integrity": "sha512-Ed61U6XJc3CVRfkERJWDz4dJwKe7iLmmJsbOGu9wSloNSFttHV0I8g6UAgb7qnK5ly5bGLPd4oXZlxCdANBOWQ==", + "dev": true, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-validator-option": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.25.9.tgz", + "integrity": "sha512-e/zv1co8pp55dNdEcCynfj9X7nyUKUXoUEwfXqaZt0omVOmDe9oOTdKStH4GmAw6zxMFs50ZayuMfHDKlO7Tfw==", + "dev": true, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helpers": { + "version": "7.26.0", + "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.26.0.tgz", + "integrity": "sha512-tbhNuIxNcVb21pInl3ZSjksLCvgdZy9KwJ8brv993QtIVKJBBkYXz4q4ZbAv31GdnC+R90np23L5FbEBlthAEw==", + "dev": true, + "dependencies": { + "@babel/template": "^7.25.9", + "@babel/types": "^7.26.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/parser": { + "version": "7.26.2", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.26.2.tgz", + "integrity": "sha512-DWMCZH9WA4Maitz2q21SRKHo9QXZxkDsbNZoVD62gusNtNBBqDg9i7uOhASfTfIGNzW+O+r7+jAlM8dwphcJKQ==", + "dev": true, + "dependencies": { + "@babel/types": "^7.26.0" + }, + "bin": { + "parser": "bin/babel-parser.js" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@babel/plugin-transform-react-jsx-self": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-self/-/plugin-transform-react-jsx-self-7.25.9.tgz", + "integrity": "sha512-y8quW6p0WHkEhmErnfe58r7x0A70uKphQm8Sp8cV7tjNQwK56sNVK0M73LK3WuYmsuyrftut4xAkjjgU0twaMg==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-react-jsx-source": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-source/-/plugin-transform-react-jsx-source-7.25.9.tgz", + "integrity": "sha512-+iqjT8xmXhhYv4/uiYd8FNQsraMFZIfxVSqxxVSZP0WbbSAWvBXAul0m/zu+7Vv4O/3WtApy9pmaTMiumEZgfg==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/template": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.25.9.tgz", + "integrity": "sha512-9DGttpmPvIxBb/2uwpVo3dqJ+O6RooAFOS+lB+xDqoE2PVCE8nfoHMdZLpfCQRLwvohzXISPZcgxt80xLfsuwg==", + "dev": true, + "dependencies": { + "@babel/code-frame": "^7.25.9", + "@babel/parser": "^7.25.9", + "@babel/types": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/traverse": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.25.9.tgz", + "integrity": "sha512-ZCuvfwOwlz/bawvAuvcj8rrithP2/N55Tzz342AkTvq4qaWbGfmCk/tKhNaV2cthijKrPAA8SRJV5WWe7IBMJw==", + "dev": true, + "dependencies": { + "@babel/code-frame": "^7.25.9", + "@babel/generator": "^7.25.9", + "@babel/parser": "^7.25.9", + "@babel/template": "^7.25.9", + "@babel/types": "^7.25.9", + "debug": "^4.3.1", + "globals": "^11.1.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/traverse/node_modules/globals": { + "version": "11.12.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz", + "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/@babel/types": { + "version": "7.26.0", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.26.0.tgz", + "integrity": "sha512-Z/yiTPj+lDVnF7lWeKCIJzaIkI0vYO87dMpZ4bg4TDrFe4XXLFWL1TbXU27gBP3QccxV9mZICCrnjnYlJjXHOA==", + "dev": true, + "dependencies": { + "@babel/helper-string-parser": "^7.25.9", + "@babel/helper-validator-identifier": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@esbuild/aix-ppc64": { + "version": "0.24.0", + "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.24.0.tgz", + "integrity": "sha512-WtKdFM7ls47zkKHFVzMz8opM7LkcsIp9amDUBIAWirg70RM71WRSjdILPsY5Uv1D42ZpUfaPILDlfactHgsRkw==", + "cpu": [ + "ppc64" + ], + "dev": true, + "optional": true, + "os": [ + "aix" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/android-arm": { + "version": "0.24.0", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.24.0.tgz", + "integrity": "sha512-arAtTPo76fJ/ICkXWetLCc9EwEHKaeya4vMrReVlEIUCAUncH7M4bhMQ+M9Vf+FFOZJdTNMXNBrWwW+OXWpSew==", + "cpu": [ + "arm" + ], + "dev": true, + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/android-arm64": { + "version": "0.24.0", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.24.0.tgz", + "integrity": "sha512-Vsm497xFM7tTIPYK9bNTYJyF/lsP590Qc1WxJdlB6ljCbdZKU9SY8i7+Iin4kyhV/KV5J2rOKsBQbB77Ab7L/w==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/android-x64": { + "version": "0.24.0", + "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.24.0.tgz", + "integrity": "sha512-t8GrvnFkiIY7pa7mMgJd7p8p8qqYIz1NYiAoKc75Zyv73L3DZW++oYMSHPRarcotTKuSs6m3hTOa5CKHaS02TQ==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/darwin-arm64": { + "version": "0.24.0", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.24.0.tgz", + "integrity": "sha512-CKyDpRbK1hXwv79soeTJNHb5EiG6ct3efd/FTPdzOWdbZZfGhpbcqIpiD0+vwmpu0wTIL97ZRPZu8vUt46nBSw==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/darwin-x64": { + "version": "0.24.0", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.24.0.tgz", + "integrity": "sha512-rgtz6flkVkh58od4PwTRqxbKH9cOjaXCMZgWD905JOzjFKW+7EiUObfd/Kav+A6Gyud6WZk9w+xu6QLytdi2OA==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/freebsd-arm64": { + "version": "0.24.0", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.24.0.tgz", + "integrity": "sha512-6Mtdq5nHggwfDNLAHkPlyLBpE5L6hwsuXZX8XNmHno9JuL2+bg2BX5tRkwjyfn6sKbxZTq68suOjgWqCicvPXA==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/freebsd-x64": { + "version": "0.24.0", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.24.0.tgz", + "integrity": "sha512-D3H+xh3/zphoX8ck4S2RxKR6gHlHDXXzOf6f/9dbFt/NRBDIE33+cVa49Kil4WUjxMGW0ZIYBYtaGCa2+OsQwQ==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-arm": { + "version": "0.24.0", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.24.0.tgz", + "integrity": "sha512-gJKIi2IjRo5G6Glxb8d3DzYXlxdEj2NlkixPsqePSZMhLudqPhtZ4BUrpIuTjJYXxvF9njql+vRjB2oaC9XpBw==", + "cpu": [ + "arm" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-arm64": { + "version": "0.24.0", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.24.0.tgz", + "integrity": "sha512-TDijPXTOeE3eaMkRYpcy3LarIg13dS9wWHRdwYRnzlwlA370rNdZqbcp0WTyyV/k2zSxfko52+C7jU5F9Tfj1g==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-ia32": { + "version": "0.24.0", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.24.0.tgz", + "integrity": "sha512-K40ip1LAcA0byL05TbCQ4yJ4swvnbzHscRmUilrmP9Am7//0UjPreh4lpYzvThT2Quw66MhjG//20mrufm40mA==", + "cpu": [ + "ia32" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-loong64": { + "version": "0.24.0", + "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.24.0.tgz", + "integrity": "sha512-0mswrYP/9ai+CU0BzBfPMZ8RVm3RGAN/lmOMgW4aFUSOQBjA31UP8Mr6DDhWSuMwj7jaWOT0p0WoZ6jeHhrD7g==", + "cpu": [ + "loong64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-mips64el": { + "version": "0.24.0", + "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.24.0.tgz", + "integrity": "sha512-hIKvXm0/3w/5+RDtCJeXqMZGkI2s4oMUGj3/jM0QzhgIASWrGO5/RlzAzm5nNh/awHE0A19h/CvHQe6FaBNrRA==", + "cpu": [ + "mips64el" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-ppc64": { + "version": "0.24.0", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.24.0.tgz", + "integrity": "sha512-HcZh5BNq0aC52UoocJxaKORfFODWXZxtBaaZNuN3PUX3MoDsChsZqopzi5UupRhPHSEHotoiptqikjN/B77mYQ==", + "cpu": [ + "ppc64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-riscv64": { + "version": "0.24.0", + "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.24.0.tgz", + "integrity": "sha512-bEh7dMn/h3QxeR2KTy1DUszQjUrIHPZKyO6aN1X4BCnhfYhuQqedHaa5MxSQA/06j3GpiIlFGSsy1c7Gf9padw==", + "cpu": [ + "riscv64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-s390x": { + "version": "0.24.0", + "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.24.0.tgz", + "integrity": "sha512-ZcQ6+qRkw1UcZGPyrCiHHkmBaj9SiCD8Oqd556HldP+QlpUIe2Wgn3ehQGVoPOvZvtHm8HPx+bH20c9pvbkX3g==", + "cpu": [ + "s390x" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-x64": { + "version": "0.24.0", + "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.24.0.tgz", + "integrity": "sha512-vbutsFqQ+foy3wSSbmjBXXIJ6PL3scghJoM8zCL142cGaZKAdCZHyf+Bpu/MmX9zT9Q0zFBVKb36Ma5Fzfa8xA==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/netbsd-x64": { + "version": "0.24.0", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.24.0.tgz", + "integrity": "sha512-hjQ0R/ulkO8fCYFsG0FZoH+pWgTTDreqpqY7UnQntnaKv95uP5iW3+dChxnx7C3trQQU40S+OgWhUVwCjVFLvg==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "netbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/openbsd-arm64": { + "version": "0.24.0", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-arm64/-/openbsd-arm64-0.24.0.tgz", + "integrity": "sha512-MD9uzzkPQbYehwcN583yx3Tu5M8EIoTD+tUgKF982WYL9Pf5rKy9ltgD0eUgs8pvKnmizxjXZyLt0z6DC3rRXg==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "openbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/openbsd-x64": { + "version": "0.24.0", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.24.0.tgz", + "integrity": "sha512-4ir0aY1NGUhIC1hdoCzr1+5b43mw99uNwVzhIq1OY3QcEwPDO3B7WNXBzaKY5Nsf1+N11i1eOfFcq+D/gOS15Q==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "openbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/sunos-x64": { + "version": "0.24.0", + "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.24.0.tgz", + "integrity": "sha512-jVzdzsbM5xrotH+W5f1s+JtUy1UWgjU0Cf4wMvffTB8m6wP5/kx0KiaLHlbJO+dMgtxKV8RQ/JvtlFcdZ1zCPA==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "sunos" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/win32-arm64": { + "version": "0.24.0", + "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.24.0.tgz", + "integrity": "sha512-iKc8GAslzRpBytO2/aN3d2yb2z8XTVfNV0PjGlCxKo5SgWmNXx82I/Q3aG1tFfS+A2igVCY97TJ8tnYwpUWLCA==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/win32-ia32": { + "version": "0.24.0", + "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.24.0.tgz", + "integrity": "sha512-vQW36KZolfIudCcTnaTpmLQ24Ha1RjygBo39/aLkM2kmjkWmZGEJ5Gn9l5/7tzXA42QGIoWbICfg6KLLkIw6yw==", + "cpu": [ + "ia32" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/win32-x64": { + "version": "0.24.0", + "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.24.0.tgz", + "integrity": "sha512-7IAFPrjSQIJrGsK6flwg7NFmwBoSTyF3rl7If0hNUFQU4ilTsEPL6GuMuU9BfIWVVGuRnuIidkSMC+c0Otu8IA==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@eslint-community/eslint-utils": { + "version": "4.4.1", + "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.4.1.tgz", + "integrity": "sha512-s3O3waFUrMV8P/XaF/+ZTp1X9XBZW1a4B97ZnjQF2KYWaFD2A8KyFBsrsfSjEmjn3RGWAIuvlneuZm3CUK3jbA==", + "dev": true, + "dependencies": { + "eslint-visitor-keys": "^3.4.3" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + }, + "peerDependencies": { + "eslint": "^6.0.0 || ^7.0.0 || >=8.0.0" + } + }, + "node_modules/@eslint-community/eslint-utils/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==", + "dev": true, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/@eslint-community/regexpp": { + "version": "4.12.1", + "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.12.1.tgz", + "integrity": "sha512-CCZCDJuduB9OUkFkY2IgppNZMi2lBQgD2qzwXkEia16cge2pijY/aXi96CJMquDMn3nJdlPV1A5KrJEXwfLNzQ==", + "dev": true, + "engines": { + "node": "^12.0.0 || ^14.0.0 || >=16.0.0" + } + }, + "node_modules/@eslint/config-array": { + "version": "0.19.0", + "resolved": "https://registry.npmjs.org/@eslint/config-array/-/config-array-0.19.0.tgz", + "integrity": "sha512-zdHg2FPIFNKPdcHWtiNT+jEFCHYVplAXRDlQDyqy0zGx/q2parwh7brGJSiTxRk/TSMkbM//zt/f5CHgyTyaSQ==", + "dev": true, + "dependencies": { + "@eslint/object-schema": "^2.1.4", + "debug": "^4.3.1", + "minimatch": "^3.1.2" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + } + }, + "node_modules/@eslint/core": { + "version": "0.9.0", + "resolved": "https://registry.npmjs.org/@eslint/core/-/core-0.9.0.tgz", + "integrity": "sha512-7ATR9F0e4W85D/0w7cU0SNj7qkAexMG+bAHEZOjo9akvGuhHE2m7umzWzfnpa0XAg5Kxc1BWmtPMV67jJ+9VUg==", + "dev": true, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + } + }, + "node_modules/@eslint/eslintrc": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-3.2.0.tgz", + "integrity": "sha512-grOjVNN8P3hjJn/eIETF1wwd12DdnwFDoyceUJLYYdkpbwq3nLi+4fqrTAONx7XDALqlL220wC/RHSC/QTI/0w==", + "dev": true, + "dependencies": { + "ajv": "^6.12.4", + "debug": "^4.3.2", + "espree": "^10.0.1", + "globals": "^14.0.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": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/@eslint/eslintrc/node_modules/globals": { + "version": "14.0.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-14.0.0.tgz", + "integrity": "sha512-oahGvuMGQlPw/ivIYBjVSrWAfWLBeku5tpPE2fOPLi+WHffIWbuh2tCjhyQhTBPMf5E9jDEH4FOmTYgYwbKwtQ==", + "dev": true, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@eslint/js": { + "version": "9.15.0", + "resolved": "https://registry.npmjs.org/@eslint/js/-/js-9.15.0.tgz", + "integrity": "sha512-tMTqrY+EzbXmKJR5ToI8lxu7jaN5EdmrBFJpQk5JmSlyLsx6o4t27r883K5xsLuCYCpfKBCGswMSWXsM+jB7lg==", + "dev": true, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + } + }, + "node_modules/@eslint/object-schema": { + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/@eslint/object-schema/-/object-schema-2.1.4.tgz", + "integrity": "sha512-BsWiH1yFGjXXS2yvrf5LyuoSIIbPrGUWob917o+BTKuZ7qJdxX8aJLRxs1fS9n6r7vESrq1OUqb68dANcFXuQQ==", + "dev": true, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + } + }, + "node_modules/@eslint/plugin-kit": { + "version": "0.2.3", + "resolved": "https://registry.npmjs.org/@eslint/plugin-kit/-/plugin-kit-0.2.3.tgz", + "integrity": "sha512-2b/g5hRmpbb1o4GnTZax9N9m0FXzz9OV42ZzI4rDDMDuHUqigAiQCEWChBWCY4ztAGVRjoWT19v0yMmc5/L5kA==", + "dev": true, + "dependencies": { + "levn": "^0.4.1" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + } + }, + "node_modules/@humanfs/core": { + "version": "0.19.1", + "resolved": "https://registry.npmjs.org/@humanfs/core/-/core-0.19.1.tgz", + "integrity": "sha512-5DyQ4+1JEUzejeK1JGICcideyfUbGixgS9jNgex5nqkW+cY7WZhxBigmieN5Qnw9ZosSNVC9KQKyb+GUaGyKUA==", + "dev": true, + "engines": { + "node": ">=18.18.0" + } + }, + "node_modules/@humanfs/node": { + "version": "0.16.6", + "resolved": "https://registry.npmjs.org/@humanfs/node/-/node-0.16.6.tgz", + "integrity": "sha512-YuI2ZHQL78Q5HbhDiBA1X4LmYdXCKCMQIfw0pw7piHJwyREFebJUvrQN4cMssyES6x+vfUbx1CIpaQUKYdQZOw==", + "dev": true, + "dependencies": { + "@humanfs/core": "^0.19.1", + "@humanwhocodes/retry": "^0.3.0" + }, + "engines": { + "node": ">=18.18.0" + } + }, + "node_modules/@humanfs/node/node_modules/@humanwhocodes/retry": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/@humanwhocodes/retry/-/retry-0.3.1.tgz", + "integrity": "sha512-JBxkERygn7Bv/GbN5Rv8Ul6LVknS+5Bp6RgDC/O8gEBU/yeH5Ui5C/OlWrTb6qct7LjjfT6Re2NxB0ln0yYybA==", + "dev": true, + "engines": { + "node": ">=18.18" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/nzakas" + } + }, + "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==", + "dev": true, + "engines": { + "node": ">=12.22" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/nzakas" + } + }, + "node_modules/@humanwhocodes/retry": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/@humanwhocodes/retry/-/retry-0.4.1.tgz", + "integrity": "sha512-c7hNEllBlenFTHBky65mhq8WD2kbN9Q6gk0bTk8lSBvc554jpXSkST1iePudpt7+A/AQvuHs9EMqjHDXMY1lrA==", + "dev": true, + "engines": { + "node": ">=18.18" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/nzakas" + } + }, + "node_modules/@jridgewell/gen-mapping": { + "version": "0.3.5", + "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.5.tgz", + "integrity": "sha512-IzL8ZoEDIBRWEzlCcRhOaCupYyN5gdIK+Q6fbFdPDg6HqX6jpkItn7DFIpW9LQzXG6Df9sA7+OKnq0qlz/GaQg==", + "dev": true, + "dependencies": { + "@jridgewell/set-array": "^1.2.1", + "@jridgewell/sourcemap-codec": "^1.4.10", + "@jridgewell/trace-mapping": "^0.3.24" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "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/set-array": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.2.1.tgz", + "integrity": "sha512-R8gLRTZeyp03ymzP/6Lil/28tGeGEzhx1q2k703KGWRAI1VdvPIXdG70VJc2pAMw3NA6JKL5hhFu1sJX0Mnn/A==", + "dev": true, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/sourcemap-codec": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.0.tgz", + "integrity": "sha512-gv3ZRaISU3fjPAgNsriBRqGWQL6quFx04YMPW/zD8XMLsU32mhCCbfbO6KZFLjvYpCZ8zyDEgqsgf+PwPaM7GQ==", + "dev": true + }, + "node_modules/@jridgewell/trace-mapping": { + "version": "0.3.25", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.25.tgz", + "integrity": "sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ==", + "dev": true, + "dependencies": { + "@jridgewell/resolve-uri": "^3.1.0", + "@jridgewell/sourcemap-codec": "^1.4.14" + } + }, + "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==", + "dev": true, + "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==", + "dev": true, + "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==", + "dev": true, + "dependencies": { + "@nodelib/fs.scandir": "2.1.5", + "fastq": "^1.6.0" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/@rollup/rollup-android-arm-eabi": { + "version": "4.27.4", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.27.4.tgz", + "integrity": "sha512-2Y3JT6f5MrQkICUyRVCw4oa0sutfAsgaSsb0Lmmy1Wi2y7X5vT9Euqw4gOsCyy0YfKURBg35nhUKZS4mDcfULw==", + "cpu": [ + "arm" + ], + "dev": true, + "optional": true, + "os": [ + "android" + ] + }, + "node_modules/@rollup/rollup-android-arm64": { + "version": "4.27.4", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.27.4.tgz", + "integrity": "sha512-wzKRQXISyi9UdCVRqEd0H4cMpzvHYt1f/C3CoIjES6cG++RHKhrBj2+29nPF0IB5kpy9MS71vs07fvrNGAl/iA==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "android" + ] + }, + "node_modules/@rollup/rollup-darwin-arm64": { + "version": "4.27.4", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.27.4.tgz", + "integrity": "sha512-PlNiRQapift4LNS8DPUHuDX/IdXiLjf8mc5vdEmUR0fF/pyy2qWwzdLjB+iZquGr8LuN4LnUoSEvKRwjSVYz3Q==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "darwin" + ] + }, + "node_modules/@rollup/rollup-darwin-x64": { + "version": "4.27.4", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.27.4.tgz", + "integrity": "sha512-o9bH2dbdgBDJaXWJCDTNDYa171ACUdzpxSZt+u/AAeQ20Nk5x+IhA+zsGmrQtpkLiumRJEYef68gcpn2ooXhSQ==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "darwin" + ] + }, + "node_modules/@rollup/rollup-freebsd-arm64": { + "version": "4.27.4", + "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-arm64/-/rollup-freebsd-arm64-4.27.4.tgz", + "integrity": "sha512-NBI2/i2hT9Q+HySSHTBh52da7isru4aAAo6qC3I7QFVsuhxi2gM8t/EI9EVcILiHLj1vfi+VGGPaLOUENn7pmw==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "freebsd" + ] + }, + "node_modules/@rollup/rollup-freebsd-x64": { + "version": "4.27.4", + "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-x64/-/rollup-freebsd-x64-4.27.4.tgz", + "integrity": "sha512-wYcC5ycW2zvqtDYrE7deary2P2UFmSh85PUpAx+dwTCO9uw3sgzD6Gv9n5X4vLaQKsrfTSZZ7Z7uynQozPVvWA==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "freebsd" + ] + }, + "node_modules/@rollup/rollup-linux-arm-gnueabihf": { + "version": "4.27.4", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.27.4.tgz", + "integrity": "sha512-9OwUnK/xKw6DyRlgx8UizeqRFOfi9mf5TYCw1uolDaJSbUmBxP85DE6T4ouCMoN6pXw8ZoTeZCSEfSaYo+/s1w==", + "cpu": [ + "arm" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-arm-musleabihf": { + "version": "4.27.4", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.27.4.tgz", + "integrity": "sha512-Vgdo4fpuphS9V24WOV+KwkCVJ72u7idTgQaBoLRD0UxBAWTF9GWurJO9YD9yh00BzbkhpeXtm6na+MvJU7Z73A==", + "cpu": [ + "arm" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-arm64-gnu": { + "version": "4.27.4", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.27.4.tgz", + "integrity": "sha512-pleyNgyd1kkBkw2kOqlBx+0atfIIkkExOTiifoODo6qKDSpnc6WzUY5RhHdmTdIJXBdSnh6JknnYTtmQyobrVg==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-arm64-musl": { + "version": "4.27.4", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.27.4.tgz", + "integrity": "sha512-caluiUXvUuVyCHr5DxL8ohaaFFzPGmgmMvwmqAITMpV/Q+tPoaHZ/PWa3t8B2WyoRcIIuu1hkaW5KkeTDNSnMA==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-powerpc64le-gnu": { + "version": "4.27.4", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-powerpc64le-gnu/-/rollup-linux-powerpc64le-gnu-4.27.4.tgz", + "integrity": "sha512-FScrpHrO60hARyHh7s1zHE97u0KlT/RECzCKAdmI+LEoC1eDh/RDji9JgFqyO+wPDb86Oa/sXkily1+oi4FzJQ==", + "cpu": [ + "ppc64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-riscv64-gnu": { + "version": "4.27.4", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.27.4.tgz", + "integrity": "sha512-qyyprhyGb7+RBfMPeww9FlHwKkCXdKHeGgSqmIXw9VSUtvyFZ6WZRtnxgbuz76FK7LyoN8t/eINRbPUcvXB5fw==", + "cpu": [ + "riscv64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-s390x-gnu": { + "version": "4.27.4", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.27.4.tgz", + "integrity": "sha512-PFz+y2kb6tbh7m3A7nA9++eInGcDVZUACulf/KzDtovvdTizHpZaJty7Gp0lFwSQcrnebHOqxF1MaKZd7psVRg==", + "cpu": [ + "s390x" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-x64-gnu": { + "version": "4.27.4", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.27.4.tgz", + "integrity": "sha512-Ni8mMtfo+o/G7DVtweXXV/Ol2TFf63KYjTtoZ5f078AUgJTmaIJnj4JFU7TK/9SVWTaSJGxPi5zMDgK4w+Ez7Q==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-x64-musl": { + "version": "4.27.4", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.27.4.tgz", + "integrity": "sha512-5AeeAF1PB9TUzD+3cROzFTnAJAcVUGLuR8ng0E0WXGkYhp6RD6L+6szYVX+64Rs0r72019KHZS1ka1q+zU/wUw==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-win32-arm64-msvc": { + "version": "4.27.4", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.27.4.tgz", + "integrity": "sha512-yOpVsA4K5qVwu2CaS3hHxluWIK5HQTjNV4tWjQXluMiiiu4pJj4BN98CvxohNCpcjMeTXk/ZMJBRbgRg8HBB6A==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@rollup/rollup-win32-ia32-msvc": { + "version": "4.27.4", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.27.4.tgz", + "integrity": "sha512-KtwEJOaHAVJlxV92rNYiG9JQwQAdhBlrjNRp7P9L8Cb4Rer3in+0A+IPhJC9y68WAi9H0sX4AiG2NTsVlmqJeQ==", + "cpu": [ + "ia32" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@rollup/rollup-win32-x64-msvc": { + "version": "4.27.4", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.27.4.tgz", + "integrity": "sha512-3j4jx1TppORdTAoBJRd+/wJRGCPC0ETWkXOecJ6PPZLj6SptXkrXcNqdj0oclbKML6FkQltdz7bBA3rUSirZug==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@types/babel__core": { + "version": "7.20.5", + "resolved": "https://registry.npmjs.org/@types/babel__core/-/babel__core-7.20.5.tgz", + "integrity": "sha512-qoQprZvz5wQFJwMDqeseRXWv3rqMvhgpbXFfVyWhbx9X47POIA6i/+dXefEmZKoAgOaTdaIgNSMqMIU61yRyzA==", + "dev": true, + "dependencies": { + "@babel/parser": "^7.20.7", + "@babel/types": "^7.20.7", + "@types/babel__generator": "*", + "@types/babel__template": "*", + "@types/babel__traverse": "*" + } + }, + "node_modules/@types/babel__generator": { + "version": "7.6.8", + "resolved": "https://registry.npmjs.org/@types/babel__generator/-/babel__generator-7.6.8.tgz", + "integrity": "sha512-ASsj+tpEDsEiFr1arWrlN6V3mdfjRMZt6LtK/Vp/kreFLnr5QH5+DhvD5nINYZXzwJvXeGq+05iUXcAzVrqWtw==", + "dev": true, + "dependencies": { + "@babel/types": "^7.0.0" + } + }, + "node_modules/@types/babel__template": { + "version": "7.4.4", + "resolved": "https://registry.npmjs.org/@types/babel__template/-/babel__template-7.4.4.tgz", + "integrity": "sha512-h/NUaSyG5EyxBIp8YRxo4RMe2/qQgvyowRwVMzhYhBCONbW8PUsg4lkFMrhgZhUe5z3L3MiLDuvyJ/CaPa2A8A==", + "dev": true, + "dependencies": { + "@babel/parser": "^7.1.0", + "@babel/types": "^7.0.0" + } + }, + "node_modules/@types/babel__traverse": { + "version": "7.20.6", + "resolved": "https://registry.npmjs.org/@types/babel__traverse/-/babel__traverse-7.20.6.tgz", + "integrity": "sha512-r1bzfrm0tomOI8g1SzvCaQHo6Lcv6zu0EA+W2kHrt8dyrHQxGzBBL4kdkzIS+jBMV+EYcMAEAqXqYaLJq5rOZg==", + "dev": true, + "dependencies": { + "@babel/types": "^7.20.7" + } + }, + "node_modules/@types/cookie": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/@types/cookie/-/cookie-0.6.0.tgz", + "integrity": "sha512-4Kh9a6B2bQciAhf7FSuMRRkUWecJgJu9nPnx3yzpsfXX/c50REIqpHY4C82bXP90qrLtXtkDxTZosYO3UpOwlA==" + }, + "node_modules/@types/estree": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.6.tgz", + "integrity": "sha512-AYnb1nQyY49te+VRAVgmzfcgjYS91mY5P0TKUDCLEM+gNnA+3T6rWITXRLYCpahpqSQbN5cE+gHpnPyXjHWxcw==", + "dev": true + }, + "node_modules/@types/json-schema": { + "version": "7.0.15", + "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.15.tgz", + "integrity": "sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==", + "dev": true + }, + "node_modules/@types/prop-types": { + "version": "15.7.13", + "resolved": "https://registry.npmjs.org/@types/prop-types/-/prop-types-15.7.13.tgz", + "integrity": "sha512-hCZTSvwbzWGvhqxp/RqVqwU999pBf2vp7hzIjiYOsl8wqOmUxkQ6ddw1cV3l8811+kdUFus/q4d1Y3E3SyEifA==", + "dev": true + }, + "node_modules/@types/react": { + "version": "18.3.12", + "resolved": "https://registry.npmjs.org/@types/react/-/react-18.3.12.tgz", + "integrity": "sha512-D2wOSq/d6Agt28q7rSI3jhU7G6aiuzljDGZ2hTZHIkrTLUI+AF3WMeKkEZ9nN2fkBAlcktT6vcZjDFiIhMYEQw==", + "dev": true, + "dependencies": { + "@types/prop-types": "*", + "csstype": "^3.0.2" + } + }, + "node_modules/@types/react-dom": { + "version": "18.3.1", + "resolved": "https://registry.npmjs.org/@types/react-dom/-/react-dom-18.3.1.tgz", + "integrity": "sha512-qW1Mfv8taImTthu4KoXgDfLuk4bydU6Q/TkADnDWWHwi4NX4BR+LWfTp2sVmTqRrsHvyDDTelgelxJ+SsejKKQ==", + "dev": true, + "dependencies": { + "@types/react": "*" + } + }, + "node_modules/@typescript-eslint/eslint-plugin": { + "version": "8.16.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-8.16.0.tgz", + "integrity": "sha512-5YTHKV8MYlyMI6BaEG7crQ9BhSc8RxzshOReKwZwRWN0+XvvTOm+L/UYLCYxFpfwYuAAqhxiq4yae0CMFwbL7Q==", + "dev": true, + "dependencies": { + "@eslint-community/regexpp": "^4.10.0", + "@typescript-eslint/scope-manager": "8.16.0", + "@typescript-eslint/type-utils": "8.16.0", + "@typescript-eslint/utils": "8.16.0", + "@typescript-eslint/visitor-keys": "8.16.0", + "graphemer": "^1.4.0", + "ignore": "^5.3.1", + "natural-compare": "^1.4.0", + "ts-api-utils": "^1.3.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "@typescript-eslint/parser": "^8.0.0 || ^8.0.0-alpha.0", + "eslint": "^8.57.0 || ^9.0.0" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/@typescript-eslint/parser": { + "version": "8.16.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-8.16.0.tgz", + "integrity": "sha512-D7DbgGFtsqIPIFMPJwCad9Gfi/hC0PWErRRHFnaCWoEDYi5tQUDiJCTmGUbBiLzjqAck4KcXt9Ayj0CNlIrF+w==", + "dev": true, + "dependencies": { + "@typescript-eslint/scope-manager": "8.16.0", + "@typescript-eslint/types": "8.16.0", + "@typescript-eslint/typescript-estree": "8.16.0", + "@typescript-eslint/visitor-keys": "8.16.0", + "debug": "^4.3.4" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^8.57.0 || ^9.0.0" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/@typescript-eslint/scope-manager": { + "version": "8.16.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-8.16.0.tgz", + "integrity": "sha512-mwsZWubQvBki2t5565uxF0EYvG+FwdFb8bMtDuGQLdCCnGPrDEDvm1gtfynuKlnpzeBRqdFCkMf9jg1fnAK8sg==", + "dev": true, + "dependencies": { + "@typescript-eslint/types": "8.16.0", + "@typescript-eslint/visitor-keys": "8.16.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@typescript-eslint/type-utils": { + "version": "8.16.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-8.16.0.tgz", + "integrity": "sha512-IqZHGG+g1XCWX9NyqnI/0CX5LL8/18awQqmkZSl2ynn8F76j579dByc0jhfVSnSnhf7zv76mKBQv9HQFKvDCgg==", + "dev": true, + "dependencies": { + "@typescript-eslint/typescript-estree": "8.16.0", + "@typescript-eslint/utils": "8.16.0", + "debug": "^4.3.4", + "ts-api-utils": "^1.3.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^8.57.0 || ^9.0.0" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/@typescript-eslint/types": { + "version": "8.16.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.16.0.tgz", + "integrity": "sha512-NzrHj6thBAOSE4d9bsuRNMvk+BvaQvmY4dDglgkgGC0EW/tB3Kelnp3tAKH87GEwzoxgeQn9fNGRyFJM/xd+GQ==", + "dev": true, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@typescript-eslint/typescript-estree": { + "version": "8.16.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-8.16.0.tgz", + "integrity": "sha512-E2+9IzzXMc1iaBy9zmo+UYvluE3TW7bCGWSF41hVWUE01o8nzr1rvOQYSxelxr6StUvRcTMe633eY8mXASMaNw==", + "dev": true, + "dependencies": { + "@typescript-eslint/types": "8.16.0", + "@typescript-eslint/visitor-keys": "8.16.0", + "debug": "^4.3.4", + "fast-glob": "^3.3.2", + "is-glob": "^4.0.3", + "minimatch": "^9.0.4", + "semver": "^7.6.0", + "ts-api-utils": "^1.3.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/@typescript-eslint/typescript-estree/node_modules/brace-expansion": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", + "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", + "dev": true, + "dependencies": { + "balanced-match": "^1.0.0" + } + }, + "node_modules/@typescript-eslint/typescript-estree/node_modules/minimatch": { + "version": "9.0.5", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.5.tgz", + "integrity": "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==", + "dev": true, + "dependencies": { + "brace-expansion": "^2.0.1" + }, + "engines": { + "node": ">=16 || 14 >=14.17" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/@typescript-eslint/typescript-estree/node_modules/semver": { + "version": "7.6.3", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.3.tgz", + "integrity": "sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A==", + "dev": true, + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/@typescript-eslint/utils": { + "version": "8.16.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-8.16.0.tgz", + "integrity": "sha512-C1zRy/mOL8Pj157GiX4kaw7iyRLKfJXBR3L82hk5kS/GyHcOFmy4YUq/zfZti72I9wnuQtA/+xzft4wCC8PJdA==", + "dev": true, + "dependencies": { + "@eslint-community/eslint-utils": "^4.4.0", + "@typescript-eslint/scope-manager": "8.16.0", + "@typescript-eslint/types": "8.16.0", + "@typescript-eslint/typescript-estree": "8.16.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^8.57.0 || ^9.0.0" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/@typescript-eslint/visitor-keys": { + "version": "8.16.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-8.16.0.tgz", + "integrity": "sha512-pq19gbaMOmFE3CbL0ZB8J8BFCo2ckfHBfaIsaOZgBIF4EoISJIdLX5xRhd0FGB0LlHReNRuzoJoMGpTjq8F2CQ==", + "dev": true, + "dependencies": { + "@typescript-eslint/types": "8.16.0", + "eslint-visitor-keys": "^4.2.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@vitejs/plugin-react": { + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/@vitejs/plugin-react/-/plugin-react-4.3.4.tgz", + "integrity": "sha512-SCCPBJtYLdE8PX/7ZQAs1QAZ8Jqwih+0VBLum1EGqmCCQal+MIUqLCzj3ZUy8ufbC0cAM4LRlSTm7IQJwWT4ug==", + "dev": true, + "dependencies": { + "@babel/core": "^7.26.0", + "@babel/plugin-transform-react-jsx-self": "^7.25.9", + "@babel/plugin-transform-react-jsx-source": "^7.25.9", + "@types/babel__core": "^7.20.5", + "react-refresh": "^0.14.2" + }, + "engines": { + "node": "^14.18.0 || >=16.0.0" + }, + "peerDependencies": { + "vite": "^4.2.0 || ^5.0.0 || ^6.0.0" + } + }, + "node_modules/acorn": { + "version": "8.14.0", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.14.0.tgz", + "integrity": "sha512-cl669nCJTZBsL97OF4kUQm5g5hC2uihk0NxY3WENAC0TYdILVkAyHymAntgxGkl7K+t0cXIrH5siy5S4XkFycA==", + "dev": true, + "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==", + "dev": true, + "peerDependencies": { + "acorn": "^6.0.0 || ^7.0.0 || ^8.0.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==", + "dev": true, + "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-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "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==", + "dev": true + }, + "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==", + "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==", + "dev": true, + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/braces": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.3.tgz", + "integrity": "sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==", + "dev": true, + "dependencies": { + "fill-range": "^7.1.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/browserslist": { + "version": "4.24.2", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.24.2.tgz", + "integrity": "sha512-ZIc+Q62revdMcqC6aChtW4jz3My3klmCO1fEmINZY/8J3EpBg5/A/D0AKmBveUh6pgoeycoMkVMko84tuYS+Gg==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/browserslist" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "dependencies": { + "caniuse-lite": "^1.0.30001669", + "electron-to-chromium": "^1.5.41", + "node-releases": "^2.0.18", + "update-browserslist-db": "^1.1.1" + }, + "bin": { + "browserslist": "cli.js" + }, + "engines": { + "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7" + } + }, + "node_modules/callsites": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", + "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/caniuse-lite": { + "version": "1.0.30001684", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001684.tgz", + "integrity": "sha512-G1LRwLIQjBQoyq0ZJGqGIJUXzJ8irpbjHLpVRXDvBEScFJ9b17sgK6vlx0GAJFE21okD7zXl08rRRUfq6HdoEQ==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/caniuse-lite" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ] + }, + "node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "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/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==", + "dev": true, + "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==", + "dev": true + }, + "node_modules/concat-map": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==", + "dev": true + }, + "node_modules/convert-source-map": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-2.0.0.tgz", + "integrity": "sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==", + "dev": true + }, + "node_modules/cookie": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/cookie/-/cookie-1.0.2.tgz", + "integrity": "sha512-9Kr/j4O16ISv8zBBhJoi4bXOYNTkFLOqSL3UDB0njXxCXNezjeyVrJyGOWtgfs/q2km1gwBcfH8q1yEGoMYunA==", + "engines": { + "node": ">=18" + } + }, + "node_modules/cross-spawn": { + "version": "7.0.6", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.6.tgz", + "integrity": "sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==", + "dev": true, + "dependencies": { + "path-key": "^3.1.0", + "shebang-command": "^2.0.0", + "which": "^2.0.1" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/csstype": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.1.3.tgz", + "integrity": "sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw==", + "dev": true + }, + "node_modules/debug": { + "version": "4.3.7", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.7.tgz", + "integrity": "sha512-Er2nc/H7RrMXZBFCEim6TCmMk02Z8vLC2Rbi1KEBggpo0fS6l0S1nnapwmIi3yW/+GOJap1Krg4w0Hg80oCqgQ==", + "dev": true, + "dependencies": { + "ms": "^2.1.3" + }, + "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==", + "dev": true + }, + "node_modules/electron-to-chromium": { + "version": "1.5.66", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.66.tgz", + "integrity": "sha512-pI2QF6+i+zjPbqRzJwkMvtvkdI7MjVbSh2g8dlMguDJIXEPw+kwasS1Jl+YGPEBfGVxsVgGUratAKymPdPo2vQ==", + "dev": true + }, + "node_modules/esbuild": { + "version": "0.24.0", + "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.24.0.tgz", + "integrity": "sha512-FuLPevChGDshgSicjisSooU0cemp/sGXR841D5LHMB7mTVOmsEHcAxaH3irL53+8YDIeVNQEySh4DaYU/iuPqQ==", + "dev": true, + "hasInstallScript": true, + "bin": { + "esbuild": "bin/esbuild" + }, + "engines": { + "node": ">=18" + }, + "optionalDependencies": { + "@esbuild/aix-ppc64": "0.24.0", + "@esbuild/android-arm": "0.24.0", + "@esbuild/android-arm64": "0.24.0", + "@esbuild/android-x64": "0.24.0", + "@esbuild/darwin-arm64": "0.24.0", + "@esbuild/darwin-x64": "0.24.0", + "@esbuild/freebsd-arm64": "0.24.0", + "@esbuild/freebsd-x64": "0.24.0", + "@esbuild/linux-arm": "0.24.0", + "@esbuild/linux-arm64": "0.24.0", + "@esbuild/linux-ia32": "0.24.0", + "@esbuild/linux-loong64": "0.24.0", + "@esbuild/linux-mips64el": "0.24.0", + "@esbuild/linux-ppc64": "0.24.0", + "@esbuild/linux-riscv64": "0.24.0", + "@esbuild/linux-s390x": "0.24.0", + "@esbuild/linux-x64": "0.24.0", + "@esbuild/netbsd-x64": "0.24.0", + "@esbuild/openbsd-arm64": "0.24.0", + "@esbuild/openbsd-x64": "0.24.0", + "@esbuild/sunos-x64": "0.24.0", + "@esbuild/win32-arm64": "0.24.0", + "@esbuild/win32-ia32": "0.24.0", + "@esbuild/win32-x64": "0.24.0" + } + }, + "node_modules/escalade": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.2.0.tgz", + "integrity": "sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "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==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/eslint": { + "version": "9.15.0", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-9.15.0.tgz", + "integrity": "sha512-7CrWySmIibCgT1Os28lUU6upBshZ+GxybLOrmRzi08kS8MBuO8QA7pXEgYgY5W8vK3e74xv0lpjo9DbaGU9Rkw==", + "dev": true, + "dependencies": { + "@eslint-community/eslint-utils": "^4.2.0", + "@eslint-community/regexpp": "^4.12.1", + "@eslint/config-array": "^0.19.0", + "@eslint/core": "^0.9.0", + "@eslint/eslintrc": "^3.2.0", + "@eslint/js": "9.15.0", + "@eslint/plugin-kit": "^0.2.3", + "@humanfs/node": "^0.16.6", + "@humanwhocodes/module-importer": "^1.0.1", + "@humanwhocodes/retry": "^0.4.1", + "@types/estree": "^1.0.6", + "@types/json-schema": "^7.0.15", + "ajv": "^6.12.4", + "chalk": "^4.0.0", + "cross-spawn": "^7.0.5", + "debug": "^4.3.2", + "escape-string-regexp": "^4.0.0", + "eslint-scope": "^8.2.0", + "eslint-visitor-keys": "^4.2.0", + "espree": "^10.3.0", + "esquery": "^1.5.0", + "esutils": "^2.0.2", + "fast-deep-equal": "^3.1.3", + "file-entry-cache": "^8.0.0", + "find-up": "^5.0.0", + "glob-parent": "^6.0.2", + "ignore": "^5.2.0", + "imurmurhash": "^0.1.4", + "is-glob": "^4.0.0", + "json-stable-stringify-without-jsonify": "^1.0.1", + "lodash.merge": "^4.6.2", + "minimatch": "^3.1.2", + "natural-compare": "^1.4.0", + "optionator": "^0.9.3" + }, + "bin": { + "eslint": "bin/eslint.js" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "url": "https://eslint.org/donate" + }, + "peerDependencies": { + "jiti": "*" + }, + "peerDependenciesMeta": { + "jiti": { + "optional": true + } + } + }, + "node_modules/eslint-plugin-react-hooks": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-react-hooks/-/eslint-plugin-react-hooks-5.0.0.tgz", + "integrity": "sha512-hIOwI+5hYGpJEc4uPRmz2ulCjAGD/N13Lukkh8cLV0i2IRk/bdZDYjgLVHj+U9Z704kLIdIO6iueGvxNur0sgw==", + "dev": true, + "engines": { + "node": ">=10" + }, + "peerDependencies": { + "eslint": "^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0-0 || ^9.0.0" + } + }, + "node_modules/eslint-plugin-react-refresh": { + "version": "0.4.14", + "resolved": "https://registry.npmjs.org/eslint-plugin-react-refresh/-/eslint-plugin-react-refresh-0.4.14.tgz", + "integrity": "sha512-aXvzCTK7ZBv1e7fahFuR3Z/fyQQSIQ711yPgYRj+Oj64tyTgO4iQIDmYXDBqvSWQ/FA4OSCsXOStlF+noU0/NA==", + "dev": true, + "peerDependencies": { + "eslint": ">=7" + } + }, + "node_modules/eslint-scope": { + "version": "8.2.0", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-8.2.0.tgz", + "integrity": "sha512-PHlWUfG6lvPc3yvP5A4PNyBL1W8fkDUccmI21JUu/+GKZBoH/W5u6usENXUrWFRsyoW5ACUjFGgAFQp5gUlb/A==", + "dev": true, + "dependencies": { + "esrecurse": "^4.3.0", + "estraverse": "^5.2.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/eslint-visitor-keys": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-4.2.0.tgz", + "integrity": "sha512-UyLnSehNt62FFhSwjZlHmeokpRK59rcz29j+F1/aDgbkbRTk7wIc9XzdoasMUbRNKDM0qQt/+BJ4BrpFeABemw==", + "dev": true, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/espree": { + "version": "10.3.0", + "resolved": "https://registry.npmjs.org/espree/-/espree-10.3.0.tgz", + "integrity": "sha512-0QYC8b24HWY8zjRnDTL6RiHfDbAWn63qb4LMj1Z4b076A4une81+z03Kg7l7mn/48PUTqoLptSXez8oknU8Clg==", + "dev": true, + "dependencies": { + "acorn": "^8.14.0", + "acorn-jsx": "^5.3.2", + "eslint-visitor-keys": "^4.2.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/esquery": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.6.0.tgz", + "integrity": "sha512-ca9pw9fomFcKPvFLXhBKUK90ZvGibiGOvRJNbjljY7s7uq/5YO4BOzcYtJqExdx99rF6aAcnRxHmcUHcz6sQsg==", + "dev": true, + "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==", + "dev": true, + "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==", + "dev": true, + "engines": { + "node": ">=4.0" + } + }, + "node_modules/esutils": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", + "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "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==", + "dev": true + }, + "node_modules/fast-glob": { + "version": "3.3.2", + "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.2.tgz", + "integrity": "sha512-oX2ruAFQwf/Orj8m737Y5adxDQO0LAB7/S5MnxCdTNDd4p6BsyIVsv9JQsATbTSq8KHRpLwIHbVlUNatxd+1Ow==", + "dev": true, + "dependencies": { + "@nodelib/fs.stat": "^2.0.2", + "@nodelib/fs.walk": "^1.2.3", + "glob-parent": "^5.1.2", + "merge2": "^1.3.0", + "micromatch": "^4.0.4" + }, + "engines": { + "node": ">=8.6.0" + } + }, + "node_modules/fast-glob/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/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==", + "dev": true + }, + "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==", + "dev": true + }, + "node_modules/fastq": { + "version": "1.17.1", + "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.17.1.tgz", + "integrity": "sha512-sRVD3lWVIXWg6By68ZN7vho9a1pQcN/WBFaAAsDDFzlJjvoGx0P8z7V1t72grFJfJhu3YPZBuu25f7Kaw2jN1w==", + "dev": true, + "dependencies": { + "reusify": "^1.0.4" + } + }, + "node_modules/file-entry-cache": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-8.0.0.tgz", + "integrity": "sha512-XXTUwCvisa5oacNGRP9SfNtYBNAMi+RPwBFmblZEF7N7swHYQS6/Zfk7SRwx4D5j3CH211YNRco1DEMNVfZCnQ==", + "dev": true, + "dependencies": { + "flat-cache": "^4.0.0" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/fill-range": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.1.1.tgz", + "integrity": "sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==", + "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==", + "dev": true, + "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": "4.0.1", + "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-4.0.1.tgz", + "integrity": "sha512-f7ccFPK3SXFHpx15UIGyRJ/FJQctuKZ0zVuN3frBo4HnK3cay9VEW0R6yPYFHC0AgqhukPzKjq22t5DmAyqGyw==", + "dev": true, + "dependencies": { + "flatted": "^3.2.9", + "keyv": "^4.5.4" + }, + "engines": { + "node": ">=16" + } + }, + "node_modules/flatted": { + "version": "3.3.2", + "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.3.2.tgz", + "integrity": "sha512-AiwGJM8YcNOaobumgtng+6NHuOqC3A7MixFeDafM3X9cIUM+xUXoS5Vfgf+OihAYe20fxqNM9yPBXJzRtZ/4eA==", + "dev": true + }, + "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/gensync": { + "version": "1.0.0-beta.2", + "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz", + "integrity": "sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==", + "dev": true, + "engines": { + "node": ">=6.9.0" + } + }, + "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==", + "dev": true, + "dependencies": { + "is-glob": "^4.0.3" + }, + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/globals": { + "version": "15.12.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-15.12.0.tgz", + "integrity": "sha512-1+gLErljJFhbOVyaetcwJiJ4+eLe45S2E7P5UiZ9xGfeq3ATQf5DOv9G7MH3gGbKQLkzmNh2DxfZwLdw+j6oTQ==", + "dev": true, + "engines": { + "node": ">=18" + }, + "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==", + "dev": true + }, + "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==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/ignore": { + "version": "5.3.2", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.2.tgz", + "integrity": "sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==", + "dev": true, + "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==", + "dev": true, + "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==", + "dev": true, + "engines": { + "node": ">=0.8.19" + } + }, + "node_modules/is-extglob": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", + "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", + "dev": true, + "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==", + "dev": true, + "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/isexe": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", + "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", + "dev": true + }, + "node_modules/js-tokens": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", + "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==" + }, + "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==", + "dev": true, + "dependencies": { + "argparse": "^2.0.1" + }, + "bin": { + "js-yaml": "bin/js-yaml.js" + } + }, + "node_modules/jsesc": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-3.0.2.tgz", + "integrity": "sha512-xKqzzWXDttJuOcawBt4KnKHHIf5oQ/Cxax+0PWFG+DFDgHNAdi+TXECADI+RYiFUMmx8792xsMbbgXj4CwnP4g==", + "dev": true, + "bin": { + "jsesc": "bin/jsesc" + }, + "engines": { + "node": ">=6" + } + }, + "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==", + "dev": true + }, + "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==", + "dev": true + }, + "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==", + "dev": true + }, + "node_modules/json5": { + "version": "2.2.3", + "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz", + "integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==", + "dev": true, + "bin": { + "json5": "lib/cli.js" + }, + "engines": { + "node": ">=6" + } + }, + "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==", + "dev": true, + "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==", + "dev": true, + "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==", + "dev": true, + "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==", + "dev": true + }, + "node_modules/loose-envify": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz", + "integrity": "sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==", + "dependencies": { + "js-tokens": "^3.0.0 || ^4.0.0" + }, + "bin": { + "loose-envify": "cli.js" + } + }, + "node_modules/lru-cache": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz", + "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==", + "dev": true, + "dependencies": { + "yallist": "^3.0.2" + } + }, + "node_modules/merge2": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", + "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==", + "dev": true, + "engines": { + "node": ">= 8" + } + }, + "node_modules/micromatch": { + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.8.tgz", + "integrity": "sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==", + "dev": true, + "dependencies": { + "braces": "^3.0.3", + "picomatch": "^2.3.1" + }, + "engines": { + "node": ">=8.6" + } + }, + "node_modules/minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "dev": true, + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/ms": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", + "dev": true + }, + "node_modules/nanoid": { + "version": "3.3.8", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.8.tgz", + "integrity": "sha512-WNLf5Sd8oZxOm+TzppcYk8gVOgP+l58xNy58D0nbUnOxOWRWvlcCV4kUF7ltmI6PsrLl/BgKEyS4mqsGChFN0w==", + "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==", + "dev": true + }, + "node_modules/node-releases": { + "version": "2.0.18", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.18.tgz", + "integrity": "sha512-d9VeXT4SJ7ZeOqGX6R5EM022wpL+eWPooLI+5UpWn2jCT1aosUQEhQP214x33Wkwx3JQMvIm+tIoVOdodFS40g==", + "dev": true + }, + "node_modules/optionator": { + "version": "0.9.4", + "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.4.tgz", + "integrity": "sha512-6IpQ7mKUxRcZNLIObR0hz7lxsapSSIYNZJwXPGeF0mTVqGKFIXj1DQcMoT22S3ROcLyY/rz0PWaWZ9ayWmad9g==", + "dev": true, + "dependencies": { + "deep-is": "^0.1.3", + "fast-levenshtein": "^2.0.6", + "levn": "^0.4.1", + "prelude-ls": "^1.2.1", + "type-check": "^0.4.0", + "word-wrap": "^1.2.5" + }, + "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==", + "dev": true, + "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==", + "dev": true, + "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==", + "dev": true, + "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==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "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==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/picocolors": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz", + "integrity": "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==", + "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/postcss": { + "version": "8.4.49", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.49.tgz", + "integrity": "sha512-OCVPnIObs4N29kxTjzLfUryOkvZEq+pf8jTF0lg8E7uETuWHA+v7j3c/xJmiqpX450191LlmZfUKkXxkTry7nA==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/postcss" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "dependencies": { + "nanoid": "^3.3.7", + "picocolors": "^1.1.1", + "source-map-js": "^1.2.1" + }, + "engines": { + "node": "^10 || ^12 || >=14" + } + }, + "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==", + "dev": true, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/punycode": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz", + "integrity": "sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==", + "dev": true, + "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==", + "dev": true, + "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/react": { + "version": "18.3.1", + "resolved": "https://registry.npmjs.org/react/-/react-18.3.1.tgz", + "integrity": "sha512-wS+hAgJShR0KhEvPJArfuPVN1+Hz1t0Y6n5jLrGQbkb4urgPE/0Rve+1kMB1v/oWgHgm4WIcV+i7F2pTVj+2iQ==", + "dependencies": { + "loose-envify": "^1.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/react-dom": { + "version": "18.3.1", + "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-18.3.1.tgz", + "integrity": "sha512-5m4nQKp+rZRb09LNH59GM4BxTh9251/ylbKIbpe7TpGxfJ+9kv6BLkLBXIjjspbgbnIBNqlI23tRnTWT0snUIw==", + "dependencies": { + "loose-envify": "^1.1.0", + "scheduler": "^0.23.2" + }, + "peerDependencies": { + "react": "^18.3.1" + } + }, + "node_modules/react-refresh": { + "version": "0.14.2", + "resolved": "https://registry.npmjs.org/react-refresh/-/react-refresh-0.14.2.tgz", + "integrity": "sha512-jCvmsr+1IUSMUyzOkRcvnVbX3ZYC6g9TDrDbFuFmRDq7PD4yaGbLKNQL6k2jnArV8hjYxh7hVhAZB6s9HDGpZA==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/react-router": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/react-router/-/react-router-7.0.1.tgz", + "integrity": "sha512-WVAhv9oWCNsja5AkK6KLpXJDSJCQizOIyOd4vvB/+eHGbYx5vkhcmcmwWjQ9yqkRClogi+xjEg9fNEOd5EX/tw==", + "dependencies": { + "@types/cookie": "^0.6.0", + "cookie": "^1.0.1", + "set-cookie-parser": "^2.6.0", + "turbo-stream": "2.4.0" + }, + "engines": { + "node": ">=20.0.0" + }, + "peerDependencies": { + "react": ">=18", + "react-dom": ">=18" + }, + "peerDependenciesMeta": { + "react-dom": { + "optional": true + } + } + }, + "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==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/reusify": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz", + "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==", + "dev": true, + "engines": { + "iojs": ">=1.0.0", + "node": ">=0.10.0" + } + }, + "node_modules/rollup": { + "version": "4.27.4", + "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.27.4.tgz", + "integrity": "sha512-RLKxqHEMjh/RGLsDxAEsaLO3mWgyoU6x9w6n1ikAzet4B3gI2/3yP6PWY2p9QzRTh6MfEIXB3MwsOY0Iv3vNrw==", + "dev": true, + "dependencies": { + "@types/estree": "1.0.6" + }, + "bin": { + "rollup": "dist/bin/rollup" + }, + "engines": { + "node": ">=18.0.0", + "npm": ">=8.0.0" + }, + "optionalDependencies": { + "@rollup/rollup-android-arm-eabi": "4.27.4", + "@rollup/rollup-android-arm64": "4.27.4", + "@rollup/rollup-darwin-arm64": "4.27.4", + "@rollup/rollup-darwin-x64": "4.27.4", + "@rollup/rollup-freebsd-arm64": "4.27.4", + "@rollup/rollup-freebsd-x64": "4.27.4", + "@rollup/rollup-linux-arm-gnueabihf": "4.27.4", + "@rollup/rollup-linux-arm-musleabihf": "4.27.4", + "@rollup/rollup-linux-arm64-gnu": "4.27.4", + "@rollup/rollup-linux-arm64-musl": "4.27.4", + "@rollup/rollup-linux-powerpc64le-gnu": "4.27.4", + "@rollup/rollup-linux-riscv64-gnu": "4.27.4", + "@rollup/rollup-linux-s390x-gnu": "4.27.4", + "@rollup/rollup-linux-x64-gnu": "4.27.4", + "@rollup/rollup-linux-x64-musl": "4.27.4", + "@rollup/rollup-win32-arm64-msvc": "4.27.4", + "@rollup/rollup-win32-ia32-msvc": "4.27.4", + "@rollup/rollup-win32-x64-msvc": "4.27.4", + "fsevents": "~2.3.2" + } + }, + "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==", + "dev": true, + "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/scheduler": { + "version": "0.23.2", + "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.23.2.tgz", + "integrity": "sha512-UOShsPwz7NrMUqhR6t0hWjFduvOzbtv7toDH1/hIrfRNIDBnnBWd0CwJTGvTpngVlmwGCdP9/Zl/tVrDqcuYzQ==", + "dependencies": { + "loose-envify": "^1.1.0" + } + }, + "node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "dev": true, + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/set-cookie-parser": { + "version": "2.7.1", + "resolved": "https://registry.npmjs.org/set-cookie-parser/-/set-cookie-parser-2.7.1.tgz", + "integrity": "sha512-IOc8uWeOZgnb3ptbCURJWNjWUPcO3ZnTTdzsurqERrP6nPyv+paC55vJM0LpOlT2ne+Ix+9+CRG1MNLlyZ4GjQ==" + }, + "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==", + "dev": true, + "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==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/source-map-js": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.1.tgz", + "integrity": "sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "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==", + "dev": true, + "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==", + "dev": true, + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "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/ts-api-utils": { + "version": "1.4.2", + "resolved": "https://registry.npmjs.org/ts-api-utils/-/ts-api-utils-1.4.2.tgz", + "integrity": "sha512-ZF5gQIQa/UmzfvxbHZI3JXN0/Jt+vnAfAviNRAMc491laiK6YCLpCW9ft8oaCRFOTxCZtUTE6XB0ZQAe3olntw==", + "dev": true, + "engines": { + "node": ">=16" + }, + "peerDependencies": { + "typescript": ">=4.2.0" + } + }, + "node_modules/turbo-stream": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/turbo-stream/-/turbo-stream-2.4.0.tgz", + "integrity": "sha512-FHncC10WpBd2eOmGwpmQsWLDoK4cqsA/UT/GqNoaKOQnT8uzhtCbg3EoUDMvqpOSAI0S26mr0rkjzbOO6S3v1g==" + }, + "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==", + "dev": true, + "dependencies": { + "prelude-ls": "^1.2.1" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/typescript": { + "version": "5.6.3", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.6.3.tgz", + "integrity": "sha512-hjcS1mhfuyi4WW8IWtjP7brDrG2cuDZukyrYrSauoXGNgx0S7zceP07adYkJycEr56BOUTNPzbInooiN3fn1qw==", + "dev": true, + "bin": { + "tsc": "bin/tsc", + "tsserver": "bin/tsserver" + }, + "engines": { + "node": ">=14.17" + } + }, + "node_modules/typescript-eslint": { + "version": "8.16.0", + "resolved": "https://registry.npmjs.org/typescript-eslint/-/typescript-eslint-8.16.0.tgz", + "integrity": "sha512-wDkVmlY6O2do4V+lZd0GtRfbtXbeD0q9WygwXXSJnC1xorE8eqyC2L1tJimqpSeFrOzRlYtWnUp/uzgHQOgfBQ==", + "dev": true, + "dependencies": { + "@typescript-eslint/eslint-plugin": "8.16.0", + "@typescript-eslint/parser": "8.16.0", + "@typescript-eslint/utils": "8.16.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^8.57.0 || ^9.0.0" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/update-browserslist-db": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.1.1.tgz", + "integrity": "sha512-R8UzCaa9Az+38REPiJ1tXlImTJXlVfgHZsglwBD/k6nj76ctsH1E3q4doGrukiLQd3sGQYu56r5+lo5r94l29A==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/browserslist" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "dependencies": { + "escalade": "^3.2.0", + "picocolors": "^1.1.0" + }, + "bin": { + "update-browserslist-db": "cli.js" + }, + "peerDependencies": { + "browserslist": ">= 4.21.0" + } + }, + "node_modules/uri-js": { + "version": "4.4.1", + "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", + "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", + "dev": true, + "dependencies": { + "punycode": "^2.1.0" + } + }, + "node_modules/vite": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/vite/-/vite-6.0.1.tgz", + "integrity": "sha512-Ldn6gorLGr4mCdFnmeAOLweJxZ34HjKnDm4HGo6P66IEqTxQb36VEdFJQENKxWjupNfoIjvRUnswjn1hpYEpjQ==", + "dev": true, + "dependencies": { + "esbuild": "^0.24.0", + "postcss": "^8.4.49", + "rollup": "^4.23.0" + }, + "bin": { + "vite": "bin/vite.js" + }, + "engines": { + "node": "^18.0.0 || ^20.0.0 || >=22.0.0" + }, + "funding": { + "url": "https://github.com/vitejs/vite?sponsor=1" + }, + "optionalDependencies": { + "fsevents": "~2.3.3" + }, + "peerDependencies": { + "@types/node": "^18.0.0 || ^20.0.0 || >=22.0.0", + "jiti": ">=1.21.0", + "less": "*", + "lightningcss": "^1.21.0", + "sass": "*", + "sass-embedded": "*", + "stylus": "*", + "sugarss": "*", + "terser": "^5.16.0", + "tsx": "^4.8.1", + "yaml": "^2.4.2" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + }, + "jiti": { + "optional": true + }, + "less": { + "optional": true + }, + "lightningcss": { + "optional": true + }, + "sass": { + "optional": true + }, + "sass-embedded": { + "optional": true + }, + "stylus": { + "optional": true + }, + "sugarss": { + "optional": true + }, + "terser": { + "optional": true + }, + "tsx": { + "optional": true + }, + "yaml": { + "optional": true + } + } + }, + "node_modules/which": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", + "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", + "dev": true, + "dependencies": { + "isexe": "^2.0.0" + }, + "bin": { + "node-which": "bin/node-which" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/word-wrap": { + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.5.tgz", + "integrity": "sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/yallist": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", + "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==", + "dev": true + }, + "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==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + } + } +} diff --git a/backend/template/react-ts/package.json b/backend/template/react-ts/package.json new file mode 100644 index 00000000..a49320d8 --- /dev/null +++ b/backend/template/react-ts/package.json @@ -0,0 +1,30 @@ +{ + "name": "codefox", + "private": true, + "version": "0.0.0", + "type": "module", + "scripts": { + "dev": "vite", + "build": "tsc -b && vite build", + "lint": "eslint .", + "preview": "vite preview" + }, + "dependencies": { + "react": "^18.3.1", + "react-dom": "^18.3.1", + "react-router": "^7.0.1" + }, + "devDependencies": { + "@eslint/js": "^9.15.0", + "@types/react": "^18.3.12", + "@types/react-dom": "^18.3.1", + "@vitejs/plugin-react": "^4.3.4", + "eslint": "^9.15.0", + "eslint-plugin-react-hooks": "^5.0.0", + "eslint-plugin-react-refresh": "^0.4.14", + "globals": "^15.12.0", + "typescript": "~5.6.2", + "typescript-eslint": "^8.15.0", + "vite": "^6.0.1" + } +} \ No newline at end of file diff --git a/backend/template/react-ts/public/codefox.svg b/backend/template/react-ts/public/codefox.svg new file mode 100644 index 00000000..f1c44cd9 --- /dev/null +++ b/backend/template/react-ts/public/codefox.svg @@ -0,0 +1,29 @@ + + + +Created with Fabric.js 5.2.4 + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/backend/template/react-ts/src/index.jsx b/backend/template/react-ts/src/index.jsx new file mode 100644 index 00000000..ec867e9e --- /dev/null +++ b/backend/template/react-ts/src/index.jsx @@ -0,0 +1,6 @@ +import { StrictMode } from 'react'; +import { createRoot } from 'react-dom/client'; + +createRoot(document.getElementById('root')).render( + Hello world, +); diff --git a/backend/template/react-ts/src/vite-env.d.ts b/backend/template/react-ts/src/vite-env.d.ts new file mode 100644 index 00000000..11f02fe2 --- /dev/null +++ b/backend/template/react-ts/src/vite-env.d.ts @@ -0,0 +1 @@ +/// diff --git a/backend/template/react-ts/tsconfig.app.json b/backend/template/react-ts/tsconfig.app.json new file mode 100644 index 00000000..358ca9ba --- /dev/null +++ b/backend/template/react-ts/tsconfig.app.json @@ -0,0 +1,26 @@ +{ + "compilerOptions": { + "tsBuildInfoFile": "./node_modules/.tmp/tsconfig.app.tsbuildinfo", + "target": "ES2020", + "useDefineForClassFields": true, + "lib": ["ES2020", "DOM", "DOM.Iterable"], + "module": "ESNext", + "skipLibCheck": true, + + /* Bundler mode */ + "moduleResolution": "bundler", + "allowImportingTsExtensions": true, + "isolatedModules": true, + "moduleDetection": "force", + "noEmit": true, + "jsx": "react-jsx", + + /* Linting */ + "strict": true, + "noUnusedLocals": true, + "noUnusedParameters": true, + "noFallthroughCasesInSwitch": true, + "noUncheckedSideEffectImports": true + }, + "include": ["src"] +} diff --git a/backend/template/react-ts/tsconfig.json b/backend/template/react-ts/tsconfig.json new file mode 100644 index 00000000..1ffef600 --- /dev/null +++ b/backend/template/react-ts/tsconfig.json @@ -0,0 +1,7 @@ +{ + "files": [], + "references": [ + { "path": "./tsconfig.app.json" }, + { "path": "./tsconfig.node.json" } + ] +} diff --git a/backend/template/react-ts/tsconfig.node.json b/backend/template/react-ts/tsconfig.node.json new file mode 100644 index 00000000..db0becc8 --- /dev/null +++ b/backend/template/react-ts/tsconfig.node.json @@ -0,0 +1,24 @@ +{ + "compilerOptions": { + "tsBuildInfoFile": "./node_modules/.tmp/tsconfig.node.tsbuildinfo", + "target": "ES2022", + "lib": ["ES2023"], + "module": "ESNext", + "skipLibCheck": true, + + /* Bundler mode */ + "moduleResolution": "bundler", + "allowImportingTsExtensions": true, + "isolatedModules": true, + "moduleDetection": "force", + "noEmit": true, + + /* Linting */ + "strict": true, + "noUnusedLocals": true, + "noUnusedParameters": true, + "noFallthroughCasesInSwitch": true, + "noUncheckedSideEffectImports": true + }, + "include": ["vite.config.ts"] +} diff --git a/backend/template/react-ts/vite.config.ts b/backend/template/react-ts/vite.config.ts new file mode 100644 index 00000000..8b0f57b9 --- /dev/null +++ b/backend/template/react-ts/vite.config.ts @@ -0,0 +1,7 @@ +import { defineConfig } from 'vite' +import react from '@vitejs/plugin-react' + +// https://vite.dev/config/ +export default defineConfig({ + plugins: [react()], +}) diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index d9cd14fc..463b45ea 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -101,8 +101,10 @@ importers: version: 0.11.0(graphql@16.9.0) typeorm: specifier: ^0.3.20 - version: 0.3.20(sqlite3@5.1.7)(ts-node@10.9.2(@swc/core@1.9.2(@swc/helpers@0.5.5))(@types/node@20.17.5)(typescript@5.6.3)) + uuid: + specifier: ^10.0.0 + version: 10.0.0 devDependencies: '@eslint/eslintrc': specifier: ^3.1.0 @@ -13555,7 +13557,6 @@ snapshots: strip-ansi: 6.0.1 wide-align: 1.1.5 - gauge@4.0.4: dependencies: aproba: 2.0.0 @@ -13872,7 +13873,7 @@ snapshots: isstream: 0.1.2 jsonwebtoken: 9.0.2 mime-types: 2.1.35 - retry-axios: 2.6.0(axios@1.7.4(debug@4.3.7)) + retry-axios: 2.6.0(axios@1.7.4) tough-cookie: 4.1.4 transitivePeerDependencies: - supports-color @@ -16461,7 +16462,7 @@ snapshots: onetime: 7.0.0 signal-exit: 4.1.0 - retry-axios@2.6.0(axios@1.7.4(debug@4.3.7)): + retry-axios@2.6.0(axios@1.7.4): dependencies: axios: 1.7.4(debug@4.3.7) From 8b6646e32c60d1521c15dcafef5e75bbd335ddfd Mon Sep 17 00:00:00 2001 From: ZHallen122 Date: Tue, 31 Dec 2024 02:08:11 -0500 Subject: [PATCH 02/71] init frontend code generate --- .../handlers/frontend-code-generate/index.ts | 89 +++++++++++++++++++ .../handlers/frontend-code-generate/prompt.ts | 10 ++- 2 files changed, 96 insertions(+), 3 deletions(-) create mode 100644 backend/src/build-system/handlers/frontend-code-generate/index.ts diff --git a/backend/src/build-system/handlers/frontend-code-generate/index.ts b/backend/src/build-system/handlers/frontend-code-generate/index.ts new file mode 100644 index 00000000..56cc85bf --- /dev/null +++ b/backend/src/build-system/handlers/frontend-code-generate/index.ts @@ -0,0 +1,89 @@ +// frontend-code.handler.ts +import { BuildHandler, BuildResult } from 'src/build-system/types'; +import { BuilderContext } from 'src/build-system/context'; +import { Logger } from '@nestjs/common'; + +// Utility functions (similar to your parseGenerateTag, removeCodeBlockFences) +import { + parseGenerateTag, + removeCodeBlockFences, +} from 'src/build-system/utils/database-utils'; + +// The function from step #1 +import { generateFrontEndCodePrompt } from './prompt'; + +/** + * FrontendCodeHandler is responsible for generating the frontend codebase + * based on the provided sitemap, data mapping documents, backend requirement documents, + * frontendDependencyFile, frontendDependenciesContext, . + */ +export class FrontendCodeHandler implements BuildHandler { + readonly id = 'op:FRONTEND:CODE'; + readonly logger: Logger = new Logger('FrontendCodeHandler'); + + /** + * Executes the handler to generate frontend code. + * @param context - The builder context containing configuration and utilities. + * @param args - The variadic arguments required for generating the frontend code. + * @returns A BuildResult containing the generated code and related data. + */ + async run(context: BuilderContext): Promise> { + this.logger.log('Generating Frontend Code...'); + + // 1. Retrieve the necessary input from context + const sitemapDoc = context.getNodeData('op:UX:SMD'); + const uxDataMapDoc = context.getNodeData('op:UX:DATAMAP:DOC'); + const backendRequirementDoc = context.getNodeData('op:BACKEND:REQ'); + + // 2. Grab any globally stored context as needed + const currentFilePath = + context.getGlobalContext('currentFrontendFile') || + 'src/pages/Home/index.tsx'; + const dependencyFilePath = + context.getGlobalContext('frontendDependencyFile') || 'dependencies.json'; + const dependenciesContext = + context.getGlobalContext('frontendDependenciesContext') || ''; + + // 3. Generate the prompt + const frontendCodePrompt = generateFrontEndCodePrompt( + sitemapDoc, + uxDataMapDoc, + backendRequirementDoc.overview, + currentFilePath, + dependencyFilePath, + dependenciesContext, + ); + + this.logger.debug('Generated frontend code prompt.'); + + try { + // 4. Call the model + const modelResponse = await context.model.chatSync( + { + content: frontendCodePrompt, + }, + 'gpt-4o-mini', // or whichever model you need + ); + + // 5. Parse the output + const generatedCode = removeCodeBlockFences( + parseGenerateTag(modelResponse), + ); + + this.logger.debug('Frontend code generated and parsed successfully.'); + + // 6. Return success + return { + success: true, + data: generatedCode, + }; + } catch (error) { + // 7. Return error + this.logger.error('Error during frontend code generation:', error); + return { + success: false, + error: new Error('Failed to generate frontend code.'), + }; + } + } +} diff --git a/backend/src/build-system/handlers/frontend-code-generate/prompt.ts b/backend/src/build-system/handlers/frontend-code-generate/prompt.ts index 0eb48aec..5b893b19 100644 --- a/backend/src/build-system/handlers/frontend-code-generate/prompt.ts +++ b/backend/src/build-system/handlers/frontend-code-generate/prompt.ts @@ -1,8 +1,10 @@ export const generateFrontEndCodePrompt = ( sitemapDoc: string, uxDatamapDoc: string, + backendRequirementDoc: string, currentFile: string, - dependencyFile: string, + dependencyFilePath: string, + dependenciesContext: string, ): string => { return `You are an expert frontend developer. Your task is to generate complete and production-ready React or Next.js frontend code based on the provided inputs. @@ -12,8 +14,10 @@ export const generateFrontEndCodePrompt = ( - Sitemap Documentation: ${sitemapDoc} - UX Datamap Documentation: ${uxDatamapDoc} - - Current File Context: ${currentFile} - - Dependency File: ${dependencyFile} + - Backend Requirement Documentation: ${backendRequirementDoc} + - Current File: ${currentFile} + - dependencyFilePath: ${dependencyFilePath} + - Dependency File: ${dependenciesContext} ### Instructions and Rules: File Requirements: From 2d610e9b01747e385713ce0a8ccabc2f8ea48dae Mon Sep 17 00:00:00 2001 From: ZHallen122 Date: Fri, 3 Jan 2025 22:35:25 -0500 Subject: [PATCH 03/71] FileGeneratorUtil --- .../build-system/utils/file_generator_util.ts | 148 ++++++++++++++++++ 1 file changed, 148 insertions(+) create mode 100644 backend/src/build-system/utils/file_generator_util.ts diff --git a/backend/src/build-system/utils/file_generator_util.ts b/backend/src/build-system/utils/file_generator_util.ts new file mode 100644 index 00000000..6413c533 --- /dev/null +++ b/backend/src/build-system/utils/file_generator_util.ts @@ -0,0 +1,148 @@ +import * as fs from 'fs/promises'; +import * as path from 'path'; +import { Logger } from '@nestjs/common'; +import { VirtualDirectory } from '../virtual-dir'; +import { extractJsonFromMarkdown } from 'src/build-system/utils/strings'; +import normalizePath from 'normalize-path'; +import toposort from 'toposort'; + +const logger = new Logger('FileGeneratorUtil'); +let virtualDir: VirtualDirectory; + +/** + * Generates files based on JSON extracted from a Markdown document. + * Ensures dependency order is maintained during file creation. + */ +export async function generateFiles( + markdownContent: string, + projectSrcPath: string, + virtualDirectory: VirtualDirectory, +): Promise { + virtualDir = virtualDirectory; + const jsonData = extractJsonFromMarkdown(markdownContent); + + const { graph, nodes } = buildDependencyGraph(jsonData); + detectCycles(graph); + validateAgainstVirtualDirectory(nodes); + + const sortedFiles = getSortedFiles(graph, nodes); + + for (const file of sortedFiles) { + const fullPath = normalizePath(path.resolve(projectSrcPath, file)); + logger.log(`Generating file in dependency order: ${fullPath}`); + await createFile(fullPath); + } + + logger.log('All files generated successfully.'); +} + +/** + * Constructs a dependency graph from the provided JSON structure. + * Each file entry includes dependencies that must be resolved first. + */ +export function buildDependencyGraph(jsonData: { + files: Record; +}): { graph: [string, string][]; nodes: Set } { + const graph: [string, string][] = []; + const nodes = new Set(); + + logger.log('Parsing JSON data to build dependency graph'); + + Object.entries(jsonData.files).forEach(([fileName, details]) => { + nodes.add(fileName); + details.dependsOn.forEach((dep) => { + const resolvedDep = resolveDependency(fileName, dep); + graph.push([resolvedDep, fileName]); + nodes.add(resolvedDep); + }); + }); + + return { graph, nodes }; +} + +/** + * Detects cycles in the dependency graph to prevent infinite loops. + */ +export function detectCycles(graph: [string, string][]): void { + try { + toposort(graph); + } catch (error) { + if (error.message.includes('cycle')) { + throw new Error( + `Circular dependency detected in the file structure: ${error.message}`, + ); + } + throw error; + } +} + +/** + * Performs a topological sort on the dependency graph and ensures all files are ordered correctly. + */ +export function getSortedFiles( + graph: [string, string][], + nodes: Set, +): string[] { + const sortedFiles = toposort(graph).reverse(); + + Array.from(nodes).forEach((node) => { + if (!sortedFiles.includes(node)) { + sortedFiles.unshift(node); + } + }); + + return sortedFiles; +} + +/** + * Resolves dependency paths relative to the current file. + * Adds an index file extension if missing. + */ +export function resolveDependency( + currentFile: string, + dependency: string, +): string { + const currentDir = path.dirname(currentFile); + const hasExtension = path.extname(dependency).length > 0; + + if (!hasExtension) { + dependency = path.join(dependency, 'index.ts'); + } + + const resolvedPath = path.join(currentDir, dependency).replace(/\\/g, '/'); + logger.log(`Resolved dependency: ${resolvedPath}`); + return resolvedPath; +} + +/** + * Validates that all dependencies exist within the virtual directory structure before file generation. + */ +export function validateAgainstVirtualDirectory(nodes: Set): void { + const invalidFiles: string[] = []; + + nodes.forEach((filePath) => { + if (!virtualDir.isValidFile(filePath)) { + invalidFiles.push(filePath); + } + }); + + if (invalidFiles.length > 0) { + throw new Error( + `The following files do not exist in the project structure:\n${invalidFiles.join('\n')}`, + ); + } +} + +/** + * Creates a file at the specified path, ensuring required directories exist first. + * The file is created with a simple placeholder comment. + */ +export async function createFile(filePath: string): Promise { + const dir = path.dirname(filePath); + await fs.mkdir(dir, { recursive: true }); + + const content = `// Generated file: ${path.basename(filePath)}`; + await fs.writeFile(filePath, content, 'utf8'); + + logger.log(`File created: ${filePath}`); +} From cd4fe5fbff54d6fe8a5d1a9f33e8dfb73b4700a9 Mon Sep 17 00:00:00 2001 From: ZHallen122 Date: Sat, 4 Jan 2025 01:08:42 -0500 Subject: [PATCH 04/71] update frontend code generator for fully generate --- .../handlers/frontend-code-generate/index.ts | 132 ++++++++++++------ .../build-system/utils/file_generator_util.ts | 56 ++++++-- 2 files changed, 131 insertions(+), 57 deletions(-) diff --git a/backend/src/build-system/handlers/frontend-code-generate/index.ts b/backend/src/build-system/handlers/frontend-code-generate/index.ts index 56cc85bf..a7ae5619 100644 --- a/backend/src/build-system/handlers/frontend-code-generate/index.ts +++ b/backend/src/build-system/handlers/frontend-code-generate/index.ts @@ -2,6 +2,14 @@ import { BuildHandler, BuildResult } from 'src/build-system/types'; import { BuilderContext } from 'src/build-system/context'; import { Logger } from '@nestjs/common'; +import { + generateFilesDependency, + createFile, +} from '../../utils/file_generator_util'; +import { VirtualDirectory } from '../../virtual-dir'; +import normalizePath from 'normalize-path'; +import * as path from 'path'; +import { readFile } from 'fs/promises'; // Utility functions (similar to your parseGenerateTag, removeCodeBlockFences) import { @@ -20,6 +28,7 @@ import { generateFrontEndCodePrompt } from './prompt'; export class FrontendCodeHandler implements BuildHandler { readonly id = 'op:FRONTEND:CODE'; readonly logger: Logger = new Logger('FrontendCodeHandler'); + private virtualDir: VirtualDirectory; /** * Executes the handler to generate frontend code. @@ -34,56 +43,95 @@ export class FrontendCodeHandler implements BuildHandler { const sitemapDoc = context.getNodeData('op:UX:SMD'); const uxDataMapDoc = context.getNodeData('op:UX:DATAMAP:DOC'); const backendRequirementDoc = context.getNodeData('op:BACKEND:REQ'); + const fileArchDoc = context.getNodeData('op:FILE:ARCH'); // 2. Grab any globally stored context as needed - const currentFilePath = - context.getGlobalContext('currentFrontendFile') || - 'src/pages/Home/index.tsx'; - const dependencyFilePath = - context.getGlobalContext('frontendDependencyFile') || 'dependencies.json'; - const dependenciesContext = - context.getGlobalContext('frontendDependenciesContext') || ''; - - // 3. Generate the prompt - const frontendCodePrompt = generateFrontEndCodePrompt( - sitemapDoc, - uxDataMapDoc, - backendRequirementDoc.overview, - currentFilePath, - dependencyFilePath, - dependenciesContext, - ); + this.virtualDir = context.virtualDirectory; + const frontendPath = context.getGlobalContext('frontendPath'); - this.logger.debug('Generated frontend code prompt.'); + // Dependency + const { sortedFiles, fileInfos } = await generateFilesDependency( + fileArchDoc, + this.virtualDir, + ); - try { - // 4. Call the model - const modelResponse = await context.model.chatSync( - { - content: frontendCodePrompt, - }, - 'gpt-4o-mini', // or whichever model you need + // Iterate the sortedFiles + for (const file of sortedFiles) { + const currentFullFilePath = normalizePath( + path.resolve(frontendPath, file), + ); + this.logger.log( + `Generating file in dependency order: ${currentFullFilePath}`, ); - // 5. Parse the output - const generatedCode = removeCodeBlockFences( - parseGenerateTag(modelResponse), + // Retrieve the direct dependencies for this file + const directDepsArray = fileInfos[file]?.dependsOn || []; + + //gather the contents of each dependency into a single string. + let dependenciesContext = ''; + for (const dep of directDepsArray) { + try { + // Resolve against frontendPath to get the absolute path + const resolvedDepPath = normalizePath( + path.resolve(frontendPath, dep), + ); + + // Read the file. (may want to guard so only read certain file types.) + const fileContent = await readFile(resolvedDepPath, 'utf-8'); + + //just append a code: + dependenciesContext += `\n\n[Dependency: ${dep}]\n\`\`\`\n${fileContent}\n\`\`\`\n`; + } catch (readError) { + // If the file doesn't exist or can't be read, log a warning. + this.logger.warn( + `Failed to read dependency "${dep}" for file "${file}": ${readError}`, + ); + } + } + + // Format for the prompt + const directDependencies = directDepsArray.join('\n'); + + // Generate the prompt + const frontendCodePrompt = generateFrontEndCodePrompt( + sitemapDoc, + uxDataMapDoc, + backendRequirementDoc.overview, + currentFullFilePath, + directDependencies, + dependenciesContext, ); + this.logger.debug('Generated frontend code prompt.'); + + let generatedCode = ''; + try { + // Call the model + const modelResponse = await context.model.chatSync( + { + content: frontendCodePrompt, + }, + 'gpt-4o-mini', // or whichever model you need + ); - this.logger.debug('Frontend code generated and parsed successfully.'); - - // 6. Return success - return { - success: true, - data: generatedCode, - }; - } catch (error) { - // 7. Return error - this.logger.error('Error during frontend code generation:', error); - return { - success: false, - error: new Error('Failed to generate frontend code.'), - }; + // Parse the output + generatedCode = removeCodeBlockFences(parseGenerateTag(modelResponse)); + + this.logger.debug('Frontend code generated and parsed successfully.'); + } catch (error) { + // Return error + this.logger.error('Error during frontend code generation:', error); + return { + success: false, + error: new Error('Failed to generate frontend code.'), + }; + } + + await createFile(currentFullFilePath, generatedCode); } + + return { + success: true, + error: new Error('Frontend code generated and parsed successfully.'), + }; } } diff --git a/backend/src/build-system/utils/file_generator_util.ts b/backend/src/build-system/utils/file_generator_util.ts index 6413c533..e5cd6d1e 100644 --- a/backend/src/build-system/utils/file_generator_util.ts +++ b/backend/src/build-system/utils/file_generator_util.ts @@ -6,6 +6,16 @@ import { extractJsonFromMarkdown } from 'src/build-system/utils/strings'; import normalizePath from 'normalize-path'; import toposort from 'toposort'; +interface FileDependencyInfo { + filePath: string; + dependsOn: string[]; +} + +interface GenerateFilesDependencyResult { + sortedFiles: string[]; + fileInfos: Record; +} + const logger = new Logger('FileGeneratorUtil'); let virtualDir: VirtualDirectory; @@ -13,27 +23,25 @@ let virtualDir: VirtualDirectory; * Generates files based on JSON extracted from a Markdown document. * Ensures dependency order is maintained during file creation. */ -export async function generateFiles( +export async function generateFilesDependency( markdownContent: string, - projectSrcPath: string, virtualDirectory: VirtualDirectory, -): Promise { +): Promise { virtualDir = virtualDirectory; const jsonData = extractJsonFromMarkdown(markdownContent); - const { graph, nodes } = buildDependencyGraph(jsonData); + const { graph, nodes, fileInfos } = buildDependencyGraph(jsonData); detectCycles(graph); validateAgainstVirtualDirectory(nodes); const sortedFiles = getSortedFiles(graph, nodes); - for (const file of sortedFiles) { - const fullPath = normalizePath(path.resolve(projectSrcPath, file)); - logger.log(`Generating file in dependency order: ${fullPath}`); - await createFile(fullPath); - } + logger.log('All files dependency generated successfully.'); - logger.log('All files generated successfully.'); + return { + sortedFiles, + fileInfos, + }; } /** @@ -42,22 +50,38 @@ export async function generateFiles( */ export function buildDependencyGraph(jsonData: { files: Record; -}): { graph: [string, string][]; nodes: Set } { +}): { + graph: [string, string][]; + nodes: Set; + fileInfos: Record; +} { const graph: [string, string][] = []; const nodes = new Set(); + const fileInfos: Record = + {}; logger.log('Parsing JSON data to build dependency graph'); Object.entries(jsonData.files).forEach(([fileName, details]) => { nodes.add(fileName); + + // store file info + fileInfos[fileName] = { + filePath: fileName, + dependsOn: [], + }; + details.dependsOn.forEach((dep) => { const resolvedDep = resolveDependency(fileName, dep); graph.push([resolvedDep, fileName]); nodes.add(resolvedDep); + + // store dependsOn + fileInfos[fileName].dependsOn.push(resolvedDep); }); }); - return { graph, nodes }; + return { graph, nodes, fileInfos }; } /** @@ -137,12 +161,14 @@ export function validateAgainstVirtualDirectory(nodes: Set): void { * Creates a file at the specified path, ensuring required directories exist first. * The file is created with a simple placeholder comment. */ -export async function createFile(filePath: string): Promise { +export async function createFile( + filePath: string, + generatedCode: string, +): Promise { const dir = path.dirname(filePath); await fs.mkdir(dir, { recursive: true }); - const content = `// Generated file: ${path.basename(filePath)}`; - await fs.writeFile(filePath, content, 'utf8'); + await fs.writeFile(filePath, generatedCode, 'utf8'); logger.log(`File created: ${filePath}`); } From 09aeeeab0c2471cd0432245cc3c4c2ec91e20db3 Mon Sep 17 00:00:00 2001 From: ZHallen122 Date: Sun, 5 Jan 2025 02:10:27 -0500 Subject: [PATCH 05/71] update for code generate --- .../handlers/frontend-code-generate/index.ts | 17 +++++++---- .../handlers/frontend-code-generate/prompt.ts | 12 +++++++- .../build-system/utils/file_generator_util.ts | 12 ++++---- backend/src/build-system/virtual-dir/index.ts | 28 +++++++++++++++---- 4 files changed, 52 insertions(+), 17 deletions(-) diff --git a/backend/src/build-system/handlers/frontend-code-generate/index.ts b/backend/src/build-system/handlers/frontend-code-generate/index.ts index a7ae5619..b44f8f7b 100644 --- a/backend/src/build-system/handlers/frontend-code-generate/index.ts +++ b/backend/src/build-system/handlers/frontend-code-generate/index.ts @@ -58,10 +58,7 @@ export class FrontendCodeHandler implements BuildHandler { // Iterate the sortedFiles for (const file of sortedFiles) { const currentFullFilePath = normalizePath( - path.resolve(frontendPath, file), - ); - this.logger.log( - `Generating file in dependency order: ${currentFullFilePath}`, + path.resolve(frontendPath, 'src', file), ); // Retrieve the direct dependencies for this file @@ -73,7 +70,7 @@ export class FrontendCodeHandler implements BuildHandler { try { // Resolve against frontendPath to get the absolute path const resolvedDepPath = normalizePath( - path.resolve(frontendPath, dep), + path.resolve(frontendPath, 'src', dep), ); // Read the file. (may want to guard so only read certain file types.) @@ -92,6 +89,13 @@ export class FrontendCodeHandler implements BuildHandler { // Format for the prompt const directDependencies = directDepsArray.join('\n'); + this.logger.log( + `Generating file in dependency order: ${currentFullFilePath}`, + ); + this.logger.log( + `2 Generating file in dependency order directDependencies: ${directDependencies}`, + ); + // Generate the prompt const frontendCodePrompt = generateFrontEndCodePrompt( sitemapDoc, @@ -114,7 +118,7 @@ export class FrontendCodeHandler implements BuildHandler { ); // Parse the output - generatedCode = removeCodeBlockFences(parseGenerateTag(modelResponse)); + generatedCode = parseGenerateTag(modelResponse); this.logger.debug('Frontend code generated and parsed successfully.'); } catch (error) { @@ -131,6 +135,7 @@ export class FrontendCodeHandler implements BuildHandler { return { success: true, + data: 'test', error: new Error('Frontend code generated and parsed successfully.'), }; } diff --git a/backend/src/build-system/handlers/frontend-code-generate/prompt.ts b/backend/src/build-system/handlers/frontend-code-generate/prompt.ts index 5b893b19..43d7c29b 100644 --- a/backend/src/build-system/handlers/frontend-code-generate/prompt.ts +++ b/backend/src/build-system/handlers/frontend-code-generate/prompt.ts @@ -7,7 +7,7 @@ export const generateFrontEndCodePrompt = ( dependenciesContext: string, ): string => { return `You are an expert frontend developer. - Your task is to generate complete and production-ready React or Next.js frontend code based on the provided inputs. + Your task is to generate complete and production-ready React frontend code based on the provided inputs using typescript. The code should include all necessary files, folders, and logic to cover UI components, API integration, routing, and state management while ensuring scalability and maintainability. Based on following inputs: @@ -48,5 +48,15 @@ export const generateFrontEndCodePrompt = ( This final result must be 100% complete. Will be directly use in the production + ### Output Format: + + DO NOT include any code fences (no \`\`\`). + + Output your final code wrapped in tags ONLY, like: + + + ...full code... + + `; }; diff --git a/backend/src/build-system/utils/file_generator_util.ts b/backend/src/build-system/utils/file_generator_util.ts index e5cd6d1e..2fc2298e 100644 --- a/backend/src/build-system/utils/file_generator_util.ts +++ b/backend/src/build-system/utils/file_generator_util.ts @@ -17,7 +17,6 @@ interface GenerateFilesDependencyResult { } const logger = new Logger('FileGeneratorUtil'); -let virtualDir: VirtualDirectory; /** * Generates files based on JSON extracted from a Markdown document. @@ -27,12 +26,11 @@ export async function generateFilesDependency( markdownContent: string, virtualDirectory: VirtualDirectory, ): Promise { - virtualDir = virtualDirectory; const jsonData = extractJsonFromMarkdown(markdownContent); const { graph, nodes, fileInfos } = buildDependencyGraph(jsonData); detectCycles(graph); - validateAgainstVirtualDirectory(nodes); + validateAgainstVirtualDirectory(nodes, virtualDirectory); const sortedFiles = getSortedFiles(graph, nodes); @@ -73,7 +71,7 @@ export function buildDependencyGraph(jsonData: { details.dependsOn.forEach((dep) => { const resolvedDep = resolveDependency(fileName, dep); - graph.push([resolvedDep, fileName]); + graph.push([resolvedDep, fileName]); // [dependency, dependent] nodes.add(resolvedDep); // store dependsOn @@ -141,7 +139,10 @@ export function resolveDependency( /** * Validates that all dependencies exist within the virtual directory structure before file generation. */ -export function validateAgainstVirtualDirectory(nodes: Set): void { +export function validateAgainstVirtualDirectory( + nodes: Set, + virtualDir: VirtualDirectory, +): boolean { const invalidFiles: string[] = []; nodes.forEach((filePath) => { @@ -155,6 +156,7 @@ export function validateAgainstVirtualDirectory(nodes: Set): void { `The following files do not exist in the project structure:\n${invalidFiles.join('\n')}`, ); } + return true; } /** diff --git a/backend/src/build-system/virtual-dir/index.ts b/backend/src/build-system/virtual-dir/index.ts index aa33ee02..c742d862 100644 --- a/backend/src/build-system/virtual-dir/index.ts +++ b/backend/src/build-system/virtual-dir/index.ts @@ -59,7 +59,7 @@ export class VirtualDirectory { } } - isValidFile(filePath: string): boolean { + public isValidFile(filePath: string): boolean { const node = this.findNode(filePath); return node?.isFile ?? false; } @@ -69,17 +69,35 @@ export class VirtualDirectory { return node !== null && !node.isFile; } + // private findNode(inputPath: string): VirtualNode | null { + // const normalizedPath = this.normalizePath(inputPath); + // const parts = normalizedPath.split('/').filter(Boolean); + + // if (parts[0] !== 'src') { + // return null; + // } + + // let current = this.root; + // for (let i = 1; i < parts.length; i++) { + // const next = current.children.get(parts[i]); + // if (!next) return null; + // current = next; + // } + // return current; + // } + private findNode(inputPath: string): VirtualNode | null { const normalizedPath = this.normalizePath(inputPath); const parts = normalizedPath.split('/').filter(Boolean); - if (parts[0] !== 'src') { - return null; + // If the path starts with 'src', remove that segment + if (parts[0] === 'src') { + parts.shift(); // Remove the 'src' segment } let current = this.root; - for (let i = 1; i < parts.length; i++) { - const next = current.children.get(parts[i]); + for (const part of parts) { + const next = current.children.get(part); if (!next) return null; current = next; } From c791fcc4ad63c1bd5467a01cffb0cc1e0a65988c Mon Sep 17 00:00:00 2001 From: ZHallen122 Date: Sun, 5 Jan 2025 02:10:42 -0500 Subject: [PATCH 06/71] add code genearet to manager --- backend/src/build-system/hanlder-manager.ts | 2 ++ 1 file changed, 2 insertions(+) diff --git a/backend/src/build-system/hanlder-manager.ts b/backend/src/build-system/hanlder-manager.ts index f41927d6..411975cf 100644 --- a/backend/src/build-system/hanlder-manager.ts +++ b/backend/src/build-system/hanlder-manager.ts @@ -12,6 +12,7 @@ import { DatabaseRequirementHandler } from './handlers/database/requirements-doc import { FileGeneratorHandler } from './handlers/file-manager/file-generate'; import { BackendRequirementHandler } from './handlers/backend/requirements-document'; import { BackendFileReviewHandler } from './handlers/backend/file-review/file-review'; +import { FrontendCodeHandler } from './handlers/frontend-code-generate/index'; /** * Manages the registration and retrieval of build handlers in the system @@ -45,6 +46,7 @@ export class BuildHandlerManager { new FileGeneratorHandler(), new BackendRequirementHandler(), new BackendFileReviewHandler(), + new FrontendCodeHandler(), ]; for (const handler of builtInHandlers) { From 74cfffdbda8370ea5b134894e7a14d33c2f52de9 Mon Sep 17 00:00:00 2001 From: ZHallen122 Date: Sun, 5 Jan 2025 02:11:01 -0500 Subject: [PATCH 07/71] add esModuleInterop to support common js libarary --- backend/tsconfig.json | 1 + 1 file changed, 1 insertion(+) diff --git a/backend/tsconfig.json b/backend/tsconfig.json index c1c56a57..379e1697 100644 --- a/backend/tsconfig.json +++ b/backend/tsconfig.json @@ -1,6 +1,7 @@ { "compilerOptions": { "module": "commonjs", + "esModuleInterop": true, "declaration": true, "removeComments": true, "emitDecoratorMetadata": true, From 98ea9c82b1ba0ab37afe3d7fa7b3d4c9e0b77a88 Mon Sep 17 00:00:00 2001 From: ZHallen122 Date: Sun, 5 Jan 2025 02:11:17 -0500 Subject: [PATCH 08/71] add op:FRONTEND:CODE step --- backend/src/build-system/__tests__/test.fullstack-gen.spec.ts | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/backend/src/build-system/__tests__/test.fullstack-gen.spec.ts b/backend/src/build-system/__tests__/test.fullstack-gen.spec.ts index cddc065a..84dccf43 100644 --- a/backend/src/build-system/__tests__/test.fullstack-gen.spec.ts +++ b/backend/src/build-system/__tests__/test.fullstack-gen.spec.ts @@ -128,6 +128,10 @@ describe('Sequence: PRD -> UXSD -> UXSS -> UXDD -> DATABASE_REQ -> DBSchemas -> 'op:BACKEND:REQ', ], }, + { + id: 'op:FRONTEND:CODE', + name: 'Frontend Code Generator Node', + }, ], }, // TODO: code reviewer From 125576cc0985a5c05bb2bfe30a2271b2db52008d Mon Sep 17 00:00:00 2001 From: ZHallen122 Date: Sun, 5 Jan 2025 02:13:59 -0500 Subject: [PATCH 09/71] check if virtual dir correct at file arch --- .../handlers/file-manager/file-arch/index.ts | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) diff --git a/backend/src/build-system/handlers/file-manager/file-arch/index.ts b/backend/src/build-system/handlers/file-manager/file-arch/index.ts index a3deb09d..58161459 100644 --- a/backend/src/build-system/handlers/file-manager/file-arch/index.ts +++ b/backend/src/build-system/handlers/file-manager/file-arch/index.ts @@ -3,15 +3,23 @@ import { BuilderContext } from 'src/build-system/context'; import { generateFileArchPrompt } from './prompt'; import { Logger } from '@nestjs/common'; import { extractJsonFromMarkdown } from 'src/build-system/utils/strings'; +import { VirtualDirectory } from '../../../virtual-dir'; +import { + buildDependencyGraph, + validateAgainstVirtualDirectory, +} from '../../../utils/file_generator_util'; export class FileArchGenerateHandler implements BuildHandler { readonly id = 'op:FILE:ARCH'; private readonly logger: Logger = new Logger('FileArchGenerateHandler'); + private virtualDir: VirtualDirectory; // TODO: adding page by page analysis async run(context: BuilderContext): Promise> { this.logger.log('Generating File Architecture Document...'); + this.virtualDir = context.virtualDirectory; + const fileStructure = context.getNodeData('op:FILE:STRUCT'); // TODO: here should use datamap struct const datamapDoc = context.getNodeData('op:UX:DATAMAP:DOC'); @@ -72,6 +80,14 @@ export class FileArchGenerateHandler implements BuildHandler { this.logger.error('File architecture JSON validation failed'); continue; } + console.log(jsonData); + // validate with virutual dir + const { graph, nodes, fileInfos } = buildDependencyGraph(jsonData); + if (!validateAgainstVirtualDirectory(nodes, this.virtualDir)) { + retry += 1; + this.logger.error('Validate Against Virtual Directory Fail !!!'); + continue; + } successBuild = true; } catch (error) { From a6d713a2e6c07c6d446c14fb61313e60a3c72004 Mon Sep 17 00:00:00 2001 From: ZHallen122 Date: Sun, 5 Jan 2025 03:16:20 -0500 Subject: [PATCH 10/71] fix order --- backend/src/build-system/utils/file_generator_util.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/backend/src/build-system/utils/file_generator_util.ts b/backend/src/build-system/utils/file_generator_util.ts index 2fc2298e..f5d0c220 100644 --- a/backend/src/build-system/utils/file_generator_util.ts +++ b/backend/src/build-system/utils/file_generator_util.ts @@ -105,7 +105,7 @@ export function getSortedFiles( graph: [string, string][], nodes: Set, ): string[] { - const sortedFiles = toposort(graph).reverse(); + const sortedFiles = toposort(graph); Array.from(nodes).forEach((node) => { if (!sortedFiles.includes(node)) { From f708b9e251cb026080ab1ba90e92064622d9aa0a Mon Sep 17 00:00:00 2001 From: ZHallen122 Date: Sun, 5 Jan 2025 16:14:15 -0500 Subject: [PATCH 11/71] add css generate prompt --- .../handlers/frontend-code-generate/index.ts | 35 ++++++++++++++----- .../handlers/frontend-code-generate/prompt.ts | 30 ++++++++++++++++ 2 files changed, 56 insertions(+), 9 deletions(-) diff --git a/backend/src/build-system/handlers/frontend-code-generate/index.ts b/backend/src/build-system/handlers/frontend-code-generate/index.ts index b44f8f7b..c05a0ae7 100644 --- a/backend/src/build-system/handlers/frontend-code-generate/index.ts +++ b/backend/src/build-system/handlers/frontend-code-generate/index.ts @@ -18,7 +18,7 @@ import { } from 'src/build-system/utils/database-utils'; // The function from step #1 -import { generateFrontEndCodePrompt } from './prompt'; +import { generateFrontEndCodePrompt, generateCSSPrompt } from './prompt'; /** * FrontendCodeHandler is responsible for generating the frontend codebase @@ -61,6 +61,8 @@ export class FrontendCodeHandler implements BuildHandler { path.resolve(frontendPath, 'src', file), ); + const extension = currentFullFilePath.split('.').pop() || ''; + // Retrieve the direct dependencies for this file const directDepsArray = fileInfos[file]?.dependsOn || []; @@ -96,15 +98,30 @@ export class FrontendCodeHandler implements BuildHandler { `2 Generating file in dependency order directDependencies: ${directDependencies}`, ); - // Generate the prompt - const frontendCodePrompt = generateFrontEndCodePrompt( - sitemapDoc, - uxDataMapDoc, - backendRequirementDoc.overview, - currentFullFilePath, - directDependencies, - dependenciesContext, + let frontendCodePrompt = ''; + + if (extension === 'css') { + frontendCodePrompt = generateCSSPrompt( + file, + directDependencies, + dependenciesContext, + ); + } else { + // Generate the prompt + frontendCodePrompt = generateFrontEndCodePrompt( + sitemapDoc, + uxDataMapDoc, + backendRequirementDoc.overview, + file, + directDependencies, + dependenciesContext, + ); + } + this.logger.log( + 'generate code prompt for frontendCodePrompt or css: ' + + frontendCodePrompt, ); + this.logger.debug('Generated frontend code prompt.'); let generatedCode = ''; diff --git a/backend/src/build-system/handlers/frontend-code-generate/prompt.ts b/backend/src/build-system/handlers/frontend-code-generate/prompt.ts index 43d7c29b..b78850a8 100644 --- a/backend/src/build-system/handlers/frontend-code-generate/prompt.ts +++ b/backend/src/build-system/handlers/frontend-code-generate/prompt.ts @@ -60,3 +60,33 @@ export const generateFrontEndCodePrompt = ( `; }; + +export function generateCSSPrompt( + fileName: string, + directDependencies: string, + dependenciesContext: string, +): string { + return ` + You are an expert CSS developer. Generate valid, production-ready CSS for the file "${fileName}". + + ## Context + - Direct Dependencies (if any and may include references to other styles or partials): + ${directDependencies} + + - Direct Dependencies Context (if any): + ${dependenciesContext} + + ## Rules & Guidelines + 1. **Do NOT** include any JavaScript or React code—only plain CSS. + 2. **Do NOT** wrap your output in code fences (\`\`\`). + 3. You may define classes, IDs, or any selectors you need, but **be sure** to keep it purely CSS. + 4. Ensure the output is well-structured, readable, and adheres to best practices (e.g., BEM if you prefer). + 5. Include comments for clarity if needed, but keep them concise. + + ## Output Format + Please produce the complete CSS content in the format described: + + /* Your CSS content here */ + + `; +} From a22836f54960b4800eb55c13d54d9bc0bb4258e6 Mon Sep 17 00:00:00 2001 From: ZHallen122 Date: Mon, 6 Jan 2025 17:20:57 -0500 Subject: [PATCH 12/71] update --- .../build-system/handlers/frontend-code-generate/prompt.ts | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/backend/src/build-system/handlers/frontend-code-generate/prompt.ts b/backend/src/build-system/handlers/frontend-code-generate/prompt.ts index b78850a8..0edf53b8 100644 --- a/backend/src/build-system/handlers/frontend-code-generate/prompt.ts +++ b/backend/src/build-system/handlers/frontend-code-generate/prompt.ts @@ -63,6 +63,8 @@ export const generateFrontEndCodePrompt = ( export function generateCSSPrompt( fileName: string, + sitemapDoc: string, + uxDatamapDoc: string, directDependencies: string, dependenciesContext: string, ): string { @@ -70,6 +72,9 @@ export function generateCSSPrompt( You are an expert CSS developer. Generate valid, production-ready CSS for the file "${fileName}". ## Context + - Sitemap Documentation: ${sitemapDoc} + - UX Datamap Documentation: ${uxDatamapDoc} + - Direct Dependencies (if any and may include references to other styles or partials): ${directDependencies} From e17a5eca5c0fc1b23febcc53a962d5ccccce61be Mon Sep 17 00:00:00 2001 From: ZHallen122 Date: Mon, 6 Jan 2025 17:22:08 -0500 Subject: [PATCH 13/71] update --- .../src/build-system/handlers/frontend-code-generate/index.ts | 2 ++ .../src/build-system/handlers/frontend-code-generate/prompt.ts | 2 +- 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/backend/src/build-system/handlers/frontend-code-generate/index.ts b/backend/src/build-system/handlers/frontend-code-generate/index.ts index c05a0ae7..4f69060d 100644 --- a/backend/src/build-system/handlers/frontend-code-generate/index.ts +++ b/backend/src/build-system/handlers/frontend-code-generate/index.ts @@ -102,6 +102,8 @@ export class FrontendCodeHandler implements BuildHandler { if (extension === 'css') { frontendCodePrompt = generateCSSPrompt( + sitemapDoc, + uxDataMapDoc, file, directDependencies, dependenciesContext, diff --git a/backend/src/build-system/handlers/frontend-code-generate/prompt.ts b/backend/src/build-system/handlers/frontend-code-generate/prompt.ts index 0edf53b8..4d452899 100644 --- a/backend/src/build-system/handlers/frontend-code-generate/prompt.ts +++ b/backend/src/build-system/handlers/frontend-code-generate/prompt.ts @@ -62,9 +62,9 @@ export const generateFrontEndCodePrompt = ( }; export function generateCSSPrompt( - fileName: string, sitemapDoc: string, uxDatamapDoc: string, + fileName: string, directDependencies: string, dependenciesContext: string, ): string { From be118f0020d0a37ecc9bcb80e3907bd8153b0b91 Mon Sep 17 00:00:00 2001 From: ZHallen122 Date: Tue, 7 Jan 2025 12:33:48 -0500 Subject: [PATCH 14/71] update to use sitemap struct --- .../build-system/handlers/frontend-code-generate/index.ts | 6 +++--- .../handlers/frontend-code-generate/prompt.ts | 8 ++++---- 2 files changed, 7 insertions(+), 7 deletions(-) diff --git a/backend/src/build-system/handlers/frontend-code-generate/index.ts b/backend/src/build-system/handlers/frontend-code-generate/index.ts index 4f69060d..4f684e1f 100644 --- a/backend/src/build-system/handlers/frontend-code-generate/index.ts +++ b/backend/src/build-system/handlers/frontend-code-generate/index.ts @@ -40,7 +40,7 @@ export class FrontendCodeHandler implements BuildHandler { this.logger.log('Generating Frontend Code...'); // 1. Retrieve the necessary input from context - const sitemapDoc = context.getNodeData('op:UX:SMD'); + const sitemapStruct = context.getNodeData('op:UX:SMS'); const uxDataMapDoc = context.getNodeData('op:UX:DATAMAP:DOC'); const backendRequirementDoc = context.getNodeData('op:BACKEND:REQ'); const fileArchDoc = context.getNodeData('op:FILE:ARCH'); @@ -102,7 +102,7 @@ export class FrontendCodeHandler implements BuildHandler { if (extension === 'css') { frontendCodePrompt = generateCSSPrompt( - sitemapDoc, + sitemapStruct, uxDataMapDoc, file, directDependencies, @@ -111,7 +111,7 @@ export class FrontendCodeHandler implements BuildHandler { } else { // Generate the prompt frontendCodePrompt = generateFrontEndCodePrompt( - sitemapDoc, + sitemapStruct, uxDataMapDoc, backendRequirementDoc.overview, file, diff --git a/backend/src/build-system/handlers/frontend-code-generate/prompt.ts b/backend/src/build-system/handlers/frontend-code-generate/prompt.ts index 4d452899..b4cb7ba1 100644 --- a/backend/src/build-system/handlers/frontend-code-generate/prompt.ts +++ b/backend/src/build-system/handlers/frontend-code-generate/prompt.ts @@ -1,5 +1,5 @@ export const generateFrontEndCodePrompt = ( - sitemapDoc: string, + sitemapStruct: string, uxDatamapDoc: string, backendRequirementDoc: string, currentFile: string, @@ -12,7 +12,7 @@ export const generateFrontEndCodePrompt = ( Based on following inputs: - - Sitemap Documentation: ${sitemapDoc} + - Sitemap Structure: ${sitemapStruct} - UX Datamap Documentation: ${uxDatamapDoc} - Backend Requirement Documentation: ${backendRequirementDoc} - Current File: ${currentFile} @@ -62,7 +62,7 @@ export const generateFrontEndCodePrompt = ( }; export function generateCSSPrompt( - sitemapDoc: string, + sitemapStruct: string, uxDatamapDoc: string, fileName: string, directDependencies: string, @@ -72,7 +72,7 @@ export function generateCSSPrompt( You are an expert CSS developer. Generate valid, production-ready CSS for the file "${fileName}". ## Context - - Sitemap Documentation: ${sitemapDoc} + - Sitemap Strucutrue: ${sitemapStruct} - UX Datamap Documentation: ${uxDatamapDoc} - Direct Dependencies (if any and may include references to other styles or partials): From 580f27d78fa8ad233ab6d43da933ac749fb50071 Mon Sep 17 00:00:00 2001 From: ZHallen122 Date: Wed, 8 Jan 2025 02:52:16 -0500 Subject: [PATCH 15/71] fix error --- backend/src/build-system/hanlder-manager.ts | 1 + 1 file changed, 1 insertion(+) diff --git a/backend/src/build-system/hanlder-manager.ts b/backend/src/build-system/hanlder-manager.ts index 3fa07377..c5543bee 100644 --- a/backend/src/build-system/hanlder-manager.ts +++ b/backend/src/build-system/hanlder-manager.ts @@ -13,6 +13,7 @@ import { FileGeneratorHandler } from './handlers/file-manager/file-generate'; import { BackendRequirementHandler } from './handlers/backend/requirements-document'; import { BackendFileReviewHandler } from './handlers/backend/file-review/file-review'; import { Level2UXSitemapStructureHandler } from './handlers/ux/sitemap-structure/sms-page'; +import { FrontendCodeHandler } from './handlers/frontend-code-generate'; /** * Manages the registration and retrieval of build handlers in the system From e5cc2ed8dfd45fa2c8f6c7f9a252d547c228a750 Mon Sep 17 00:00:00 2001 From: ZHallen122 Date: Wed, 8 Jan 2025 18:24:45 -0500 Subject: [PATCH 16/71] update ux sitemap --- .../handlers/ux/sitemap-document/prompt.ts | 10 ++---- .../handlers/ux/sitemap-document/uxsmd.ts | 35 ++++++++++++++----- 2 files changed, 30 insertions(+), 15 deletions(-) diff --git a/backend/src/build-system/handlers/ux/sitemap-document/prompt.ts b/backend/src/build-system/handlers/ux/sitemap-document/prompt.ts index ccf8d7f6..9e82fcce 100644 --- a/backend/src/build-system/handlers/ux/sitemap-document/prompt.ts +++ b/backend/src/build-system/handlers/ux/sitemap-document/prompt.ts @@ -1,13 +1,9 @@ // Define and export the system prompts object export const prompts = { - generateUxsmdrompt: ( - projectName: string, - prdDocument: string, - platform: string, - ): string => { - return `You are an expert frontend develper and ux designer. Your job is to analyze and expand upon the details provided, generating a Full UX Sitemap Document based on the following inputs: + generateUxsmdrompt: (projectName: string, platform: string): string => { + return `You are an expert frontend develper and ux designer. Your job is to analyze and expand upon the details provided, generating a Full UX Sitemap Document based on the following inputs provide later: - Project name: ${projectName} - - product requirements document: ${prdDocument} + - product requirements document: {} - Platform: ${platform} Follow these rules as a guide to ensure clarity and completeness in your UX Sitemap Document. diff --git a/backend/src/build-system/handlers/ux/sitemap-document/uxsmd.ts b/backend/src/build-system/handlers/ux/sitemap-document/uxsmd.ts index b2fc062f..a2c0a9e5 100644 --- a/backend/src/build-system/handlers/ux/sitemap-document/uxsmd.ts +++ b/backend/src/build-system/handlers/ux/sitemap-document/uxsmd.ts @@ -4,6 +4,7 @@ import { prompts } from './prompt'; import { ModelProvider } from 'src/common/model-provider'; import { Logger } from '@nestjs/common'; import { removeCodeBlockFences } from 'src/build-system/utils/strings'; +import { MessageInterface } from 'src/common/model-provider/types'; export class UXSMDHandler implements BuildHandler { readonly id = 'op:UX:SMD'; @@ -19,14 +20,10 @@ export class UXSMDHandler implements BuildHandler { const prdContent = context.getNodeData('op:PRD'); // Generate the prompt dynamically - const prompt = prompts.generateUxsmdrompt( - projectName, - prdContent, - platform, - ); + const prompt = prompts.generateUxsmdrompt(projectName, platform); // Send the prompt to the LLM server and process the response - const uxsmdContent = await this.generateUXSMDFromLLM(prompt); + const uxsmdContent = await this.generateUXSMDFromLLM(prompt, prdContent); // Store the generated document in the context context.setGlobalContext('uxsmdDocument', uxsmdContent); @@ -38,13 +35,35 @@ export class UXSMDHandler implements BuildHandler { }; } - private async generateUXSMDFromLLM(prompt: string): Promise { + private async generateUXSMDFromLLM( + prompt: string, + prdContent: string, + ): Promise { + const messages: MessageInterface[] = [ + { + role: 'system', + content: prompt, + }, + { + role: 'user', + content: `This is the product requiremnt ${prdContent}`, + }, + { + role: 'assistant', + content: 'Here is the initial UX Sitemap Document...', + }, + { + role: 'user', + content: 'Add more detail about user flows.', + }, + ]; + const modelProvider = ModelProvider.getInstance(); const model = 'gpt-4o-mini'; const uxsmdContent = await modelProvider.chatSync({ model, - messages: [{ content: prompt, role: 'system' }], + messages, }); this.logger.log('Received full UXSMD content from LLM server.'); From 74d4610320bc48b20497a6b0dbd69d1a40d8dd3d Mon Sep 17 00:00:00 2001 From: ZHallen122 Date: Thu, 9 Jan 2025 22:00:17 -0500 Subject: [PATCH 17/71] improved prompt --- .../handlers/ux/sitemap-document/prompt.ts | 101 ++++++++++++------ 1 file changed, 71 insertions(+), 30 deletions(-) diff --git a/backend/src/build-system/handlers/ux/sitemap-document/prompt.ts b/backend/src/build-system/handlers/ux/sitemap-document/prompt.ts index 9e82fcce..d90d2cbf 100644 --- a/backend/src/build-system/handlers/ux/sitemap-document/prompt.ts +++ b/backend/src/build-system/handlers/ux/sitemap-document/prompt.ts @@ -1,40 +1,81 @@ // Define and export the system prompts object export const prompts = { generateUxsmdrompt: (projectName: string, platform: string): string => { - return `You are an expert frontend develper and ux designer. Your job is to analyze and expand upon the details provided, generating a Full UX Sitemap Document based on the following inputs provide later: + return `You are an expert frontend develper and ux designer. Your job is to analyze and expand upon the details provided, generating a Full UX Sitemap Document based on the following inputs: - Project name: ${projectName} - - product requirements document: {} - Platform: ${platform} + - Product Requirements Document: (Provided by the user next) + - Goal: MVP (Minimum Viable Product) Follow these rules as a guide to ensure clarity and completeness in your UX Sitemap Document. - 1, Write you result in markdown - 2, Your reply should start with : "\`\`\`UXSitemap" and end with "\`\`\`", Use proper markdown syntax for headings, subheadings, and hierarchical lists. - 3. **Comprehensive Analysis**: Thoroughly parse the PRD to identify all core features, functionalities, and user stories. - - Focus on creating a hierarchical sitemap that covers each major section, with relevant sub-sections, pages, and key interactions. - - Ensure all primary and secondary user journeys identified in the PRD are clearly reflected. - - 4. **Page and Navigation Structure**: Break down the sitemap into main sections, secondary sections, and individual screens. - - **Main Sections**: Identify primary sections (e.g., Home, User Account, Product Catalog) based on project requirements. - - **Secondary Sections**: Include sub-sections under each main section (e.g., "Profile" and "Order History" under "User Account"). - - **Screens and Interactions**: List specific screens and interactions that users encounter within each flow. - - 5. **Detailed User Journeys**: - - For every user story described in the PRD, map out the step-by-step navigation path. - - Highlight sequences (e.g., 1. Home > 1.1. Explore > 1.1.1. Product Details). - - 6. **Thorough Coverage**: - - Ensure the sitemap is fully comprehensive. If any feature from the PRD is not covered or any user journey is missing, add it to the sitemap. - - Consider the target audience and validate that all expected navigation flows and screens meet user needs. - -7. Ask Your self: - - Am I cover all the product requirement document? - - Am I Cover all the gloabal UI? - - Am I Cover all unique UI? - - Am I cover all the view that expect by user? - - what is all the details about UI? - - Am I cover all the cases? Is the final result 100% complete? - -Remeber your result will be directly be use in the deveolpment. Make sure is 100% complete. + Output Requirements: + Use plain text (no Markdown). + Begin with and end with . + Within , generate multiple blocks, one for each page. + Each must follow this structure exactly: + + +P#. [Page Name] + + URL Path: /[path] + Description: [Brief description of page purpose] + Parent Page: [Parent page if nested, or "None" if top-level] + Access Level: [e.g., Public/Private/Admin] + +#### Core Components + + C#.1. [Component Name] + Type: [Layout/Interactive/Display/etc.] + Purpose: [What does it do?] + States: [Possible states, e.g., Default/Hovered/Expanded...] + Interactions: [User interactions] + +#### Features & Functionality + + F#.1. [Feature Name] + Description: [Brief feature description] + User Stories: [Related user stories from PRD] + Components Used: [Which components implement this feature?] + +#### Page-Specific User Flows + + Flow #. [Flow Name] + [Step 1] + [Step 2] + + +4. **Number** pages sequentially (P1., P2., etc.). +5. **Number** each component and feature sequentially within that page (C1.1, C1.2, F1.1, F1.2, etc.). +6. Thoroughly parse the PRD to include: + - **All** pages. + - **All** features, functionalities, user stories, and flows. + - **All** major/minor navigation and user journeys. + + +Sitemap Coverage + + Comprehensive Analysis: + Capture all features, functionalities, and user stories. + Represent all primary and secondary user flows. + + Page & Navigation Structure: + Identify all main and nested pages. + Ensure clear parent-child relationships. + + Detailed User Journeys: + Provide step-by-step navigational flows unique to each page. + + Thorough Coverage: + Verify every requirement, global UI element, unique UI, and user expectation from the PRD is addressed. + No user flow or screen should be missing. + +Self-Check Before Submitting + + Have you accounted for all PRD details? + Have you included all major and minor pages/screens? + Have you detailed each page's components, features, and flows completely? + +Deliver a single XML-like document that strictly follows the structure above. Start with and close with , containing one block per page. `; }, }; From 33f22d509586da2b532f1e0a88576b9a375ad7f8 Mon Sep 17 00:00:00 2001 From: ZHallen122 Date: Thu, 9 Jan 2025 22:53:18 -0500 Subject: [PATCH 18/71] update sitemap prompt and messages --- .../handlers/ux/sitemap-document/prompt.ts | 17 ++++++++--------- .../handlers/ux/sitemap-document/uxsmd.ts | 15 +++++++++++---- 2 files changed, 19 insertions(+), 13 deletions(-) diff --git a/backend/src/build-system/handlers/ux/sitemap-document/prompt.ts b/backend/src/build-system/handlers/ux/sitemap-document/prompt.ts index d90d2cbf..834e1bde 100644 --- a/backend/src/build-system/handlers/ux/sitemap-document/prompt.ts +++ b/backend/src/build-system/handlers/ux/sitemap-document/prompt.ts @@ -16,29 +16,28 @@ export const prompts = { P#. [Page Name] - URL Path: /[path] Description: [Brief description of page purpose] Parent Page: [Parent page if nested, or "None" if top-level] Access Level: [e.g., Public/Private/Admin] -#### Core Components - +#### Core Components C#.1. [Component Name] - Type: [Layout/Interactive/Display/etc.] - Purpose: [What does it do?] - States: [Possible states, e.g., Default/Hovered/Expanded...] - Interactions: [User interactions] + - Definition: Core Components are **distinct UI elements** or **functional blocks** on the page that have a clear, identifiable role. Each component must include: + 1. **Type** (Layout, Interactive, Display, Input, etc.) + 2. **Purpose** (What does it do for the user or the interface?) + 3. **States** (Possible UI states: Default, Hover, Clicked, Expanded, Loading, etc.) + 4. **Interactions** (User actions or system responses: clicking, hovering, dragging, scrolling, etc.) #### Features & Functionality - + - Focus on how these features tie back to user stories, and which **Core Components** are used to achieve them F#.1. [Feature Name] Description: [Brief feature description] User Stories: [Related user stories from PRD] Components Used: [Which components implement this feature?] #### Page-Specific User Flows - + Step-by-step sequences describing user interactions and system responses Flow #. [Flow Name] [Step 1] [Step 2] diff --git a/backend/src/build-system/handlers/ux/sitemap-document/uxsmd.ts b/backend/src/build-system/handlers/ux/sitemap-document/uxsmd.ts index a2c0a9e5..0bed5d0b 100644 --- a/backend/src/build-system/handlers/ux/sitemap-document/uxsmd.ts +++ b/backend/src/build-system/handlers/ux/sitemap-document/uxsmd.ts @@ -46,15 +46,22 @@ export class UXSMDHandler implements BuildHandler { }, { role: 'user', - content: `This is the product requiremnt ${prdContent}`, + content: ` + Here is the Product Requirements Document (PRD): + + ${prdContent} + + Please generate the Full UX Sitemap Document now, focusing on MVP features but ensuring each page (especially Home) has enough detail to be functional.`, }, { - role: 'assistant', - content: 'Here is the initial UX Sitemap Document...', + role: 'user', + content: `Check if you meet all PRD details, add more pages, and details if needed. Focus on MVP (Minimum Viable Product).`, }, { role: 'user', - content: 'Add more detail about user flows.', + content: `Please add more detail about the Core Components in each . + Focus on step-by-step actions the user takes, and any alternative paths mentioned in the PRD. + Also, expand on how these components interrelate to the page's primary features.`, }, ]; From 01bfedf819e5eef029858e272525bc5c5ec8133a Mon Sep 17 00:00:00 2001 From: ZHallen122 Date: Thu, 9 Jan 2025 22:54:35 -0500 Subject: [PATCH 19/71] update file name for sitemap --- .../handlers/ux/sitemap-document/{uxsmd.ts => index.ts} | 0 backend/src/build-system/hanlder-manager.ts | 2 +- 2 files changed, 1 insertion(+), 1 deletion(-) rename backend/src/build-system/handlers/ux/sitemap-document/{uxsmd.ts => index.ts} (100%) diff --git a/backend/src/build-system/handlers/ux/sitemap-document/uxsmd.ts b/backend/src/build-system/handlers/ux/sitemap-document/index.ts similarity index 100% rename from backend/src/build-system/handlers/ux/sitemap-document/uxsmd.ts rename to backend/src/build-system/handlers/ux/sitemap-document/index.ts diff --git a/backend/src/build-system/hanlder-manager.ts b/backend/src/build-system/hanlder-manager.ts index c5543bee..d74e2a2a 100644 --- a/backend/src/build-system/hanlder-manager.ts +++ b/backend/src/build-system/hanlder-manager.ts @@ -3,7 +3,7 @@ import { BuildHandler } from './types'; import { PRDHandler } from './handlers/product-manager/product-requirements-document/prd'; import { UXSitemapStructureHandler } from './handlers/ux/sitemap-structure'; import { UXDatamapHandler } from './handlers/ux/datamap'; -import { UXSMDHandler } from './handlers/ux/sitemap-document/uxsmd'; +import { UXSMDHandler } from './handlers/ux/sitemap-document'; import { FileStructureHandler } from './handlers/file-manager/file-structure'; import { FileArchGenerateHandler } from './handlers/file-manager/file-arch'; import { BackendCodeHandler } from './handlers/backend/code-generate'; From faabb88a5154413ec10f1c60c752e59c1f1b10ee Mon Sep 17 00:00:00 2001 From: ZHallen122 Date: Fri, 10 Jan 2025 23:52:07 -0500 Subject: [PATCH 20/71] update sitemap prompt --- .../handlers/ux/sitemap-document/prompt.ts | 106 +++++------- .../handlers/ux/sitemap-structure/prompt.ts | 163 ++++++++++++------ 2 files changed, 159 insertions(+), 110 deletions(-) diff --git a/backend/src/build-system/handlers/ux/sitemap-document/prompt.ts b/backend/src/build-system/handlers/ux/sitemap-document/prompt.ts index 834e1bde..b4ee5a35 100644 --- a/backend/src/build-system/handlers/ux/sitemap-document/prompt.ts +++ b/backend/src/build-system/handlers/ux/sitemap-document/prompt.ts @@ -4,77 +4,61 @@ export const prompts = { return `You are an expert frontend develper and ux designer. Your job is to analyze and expand upon the details provided, generating a Full UX Sitemap Document based on the following inputs: - Project name: ${projectName} - Platform: ${platform} - - Product Requirements Document: (Provided by the user next) - - Goal: MVP (Minimum Viable Product) + - product requirements document: (Provided by the user next) Follow these rules as a guide to ensure clarity and completeness in your UX Sitemap Document. - Output Requirements: - Use plain text (no Markdown). - Begin with and end with . - Within , generate multiple blocks, one for each page. - Each must follow this structure exactly: + 1. Your reply should start with : "" and end with " ", Use plain text (no Markdown). + 2. Use tags for each main page or section within the sitemap. + 3. Use tags for whole User Journeys + 4. **Comprehensive Analysis**: Thoroughly parse the PRD to identify all core features, functionalities, and user stories. + - Focus on creating a hierarchical sitemap that covers each major section, with relevant sub-sections, pages, and key interactions. + - Ensure all primary and secondary user journeys identified in the PRD are clearly reflected. - -P#. [Page Name] - URL Path: /[path] - Description: [Brief description of page purpose] - Parent Page: [Parent page if nested, or "None" if top-level] - Access Level: [e.g., Public/Private/Admin] -#### Core Components - C#.1. [Component Name] - - Definition: Core Components are **distinct UI elements** or **functional blocks** on the page that have a clear, identifiable role. Each component must include: - 1. **Type** (Layout, Interactive, Display, Input, etc.) - 2. **Purpose** (What does it do for the user or the interface?) - 3. **States** (Possible UI states: Default, Hover, Clicked, Expanded, Loading, etc.) - 4. **Interactions** (User actions or system responses: clicking, hovering, dragging, scrolling, etc.) + 5. **Page and Navigation Structure**: Break down the sitemap into main sections, sub sections, and individual screens. + - Identify all main and nested pages. + - **Main Sections**: Identify primary sections (e.g., Home, User Account, Product Catalog) based on project requirements. + - **Sub Sections**: Include sub-sections under each main section (e.g., "Profile" and "Order History" under "User Account"). + - **Screens and Interactions**: List specific screens and interactions that users encounter within each flow. -#### Features & Functionality - - Focus on how these features tie back to user stories, and which **Core Components** are used to achieve them - F#.1. [Feature Name] - Description: [Brief feature description] - User Stories: [Related user stories from PRD] - Components Used: [Which components implement this feature?] + 6. **Detailed User Journeys**: + - For every user story described in the PRD, map out the step-by-step navigation path. + - Highlight sequences (e.g., 1. Home > 1.1. Explore > 1.1.1. Product Details). -#### Page-Specific User Flows - Step-by-step sequences describing user interactions and system responses - Flow #. [Flow Name] - [Step 1] - [Step 2] - + 7. **Thorough Coverage**: + - Ensure the sitemap is fully comprehensive. If any feature from the PRD is not covered or any user journey is missing, add it to the sitemap. + - Consider the target audience and validate that all expected navigation flows and screens meet user needs. -4. **Number** pages sequentially (P1., P2., etc.). -5. **Number** each component and feature sequentially within that page (C1.1, C1.2, F1.1, F1.2, etc.). -6. Thoroughly parse the PRD to include: - - **All** pages. - - **All** features, functionalities, user stories, and flows. - - **All** major/minor navigation and user journeys. + 8. Ask Your self: + - Am I cover all the product requirement document? + - Am I Cover all the gloabal UI? + - Am I Cover all unique UI? + - Am I cover all the view that expect by user? + - what is all the details about UI? + - Am I cover all the cases? Is the final result 100% complete? + 9. Example output: + + + N. [Main Section Title] + N.1. [Sub-section Title] + N.1.1. [Further Detail] + N.1.2. [Further Detail] + N.2. [Another Sub-section Title] + -Sitemap Coverage + + 2. [Another Main Section] + 2.1 [Sub-section Title] + ... + - Comprehensive Analysis: - Capture all features, functionalities, and user stories. - Represent all primary and secondary user flows. + + Highlight sequences for user journey + - Page & Navigation Structure: - Identify all main and nested pages. - Ensure clear parent-child relationships. - - Detailed User Journeys: - Provide step-by-step navigational flows unique to each page. - - Thorough Coverage: - Verify every requirement, global UI element, unique UI, and user expectation from the PRD is addressed. - No user flow or screen should be missing. - -Self-Check Before Submitting - - Have you accounted for all PRD details? - Have you included all major and minor pages/screens? - Have you detailed each page's components, features, and flows completely? - -Deliver a single XML-like document that strictly follows the structure above. Start with and close with , containing one block per page. - `; + + +Remeber your result will be directly be use in the deveolpment. Make sure is 100% complete.`; }, }; diff --git a/backend/src/build-system/handlers/ux/sitemap-structure/prompt.ts b/backend/src/build-system/handlers/ux/sitemap-structure/prompt.ts index 933bb8ae..ade78f92 100644 --- a/backend/src/build-system/handlers/ux/sitemap-structure/prompt.ts +++ b/backend/src/build-system/handlers/ux/sitemap-structure/prompt.ts @@ -1,62 +1,122 @@ export const prompts = { generateUXSiteMapStructrePrompt: ( projectName: string, - sitemapDoc: string, platform: string, ): string => { - return `You are an expert UX Designer. Your task is to analyze the provided sitemap documentation and generate a Detailed UX Structure Map to support the user experience and frontend implementation. The output should address all aspects of user interaction, content layout, based on the following inputs: - - - Project name: ${projectName} - - Sitemap Documentation: ${sitemapDoc} - - Platform: ${platform} - - Follow these guidelines to analyze requirements from a UX perspective: - - ### Instructions and Rules: - - 1, Your job is to analyzing how the ui element should be layed out and distributed on the page based on the Sitemap Documentation. - 2, You need to ensure all features from the sitemap documentation are addressed. - 3, You need to identify and define every page/screen required for the application. - 4, Detailed Breakdown for Each Page/Screen: - Page name: ## {index}. Name page - Page Purpose: Clearly state the user goal for the page. - Core Elements: - List all components (e.g., headers, buttons, sidebars) and explain their role on the page. - Include specific interactions and behaviors for each element. - Content Display: - Identify the information that needs to be visible on the page and why it's essential for the user. - Navigation and Routes: - Specify all frontend routes required to navigate to this page. - Include links or actions that lead to other pages or states. - Restrictions: - Note any restrictions or conditions for accessing the page (e.g., login required, specific user roles). + return `You are an expert frontend develper and ux designer. Your job is to analyze and expand upon the details provided, generating a Full UX Sitemap Document based on the following inputs: + - Project name: ${projectName} + - Platform: ${platform} + - Product Requirements Document: (Provided by the user next) + - Goal: MVP (Minimum Viable Product) - 5, Focus on Detail: - Provide a component-level breakdown for each page, including layouts. - Explain how the design supports user goals and aligns with their journey. + Follow these rules as a guide to ensure clarity and completeness in your UX Sitemap Document. + Output Requirements: + Use plain text (no Markdown). + Begin with and end with . + Within , generate multiple blocks, one for each page. + Each must follow this structure exactly: - 6. For each page/screen in the sitemap: - - How the block should be place on the view? - - What information does the user need to see? - - What elements should be on the page? - - What are all the routes require for the frontend? - - What dynamic content needs to be displayed? - - What are the restriction for the page? - - 7. Consider: - - User goals on each page - - User journy - - Element purposes - - Content that needs to be displayed + +P#. [Page Name] + URL Path: /[path] + Description: [Brief description of page purpose] + Parent Page: [Parent page if nested, or "None" if top-level] + Access Level: [e.g., Public/Private/Admin] - Your reply must start with: "\`\`\`UXStructureMap" and end with "\`\`\`". +#### Core Components + C#.1. [Component Name] + - Definition: Core Components are **distinct UI elements** or **functional blocks** on the page that have a clear, identifiable role. Each component must include: + 1. **Type** (Layout, Interactive, Display, Input, etc.) + 2. **Purpose** (What does it do for the user or the interface?) + 3. **States** (Possible UI states: Default, Hover, Clicked, Expanded, Loading, etc.) + 4. **Interactions** (User actions or system responses: clicking, hovering, dragging, scrolling, etc.) - Focus on describing the UX Structure from a user experience perspective. For each page: - 1. What element appear on each page and why - 2. What information needs to be displayed and why - 3. How the element supports user goals +#### Features & Functionality + - Focus on how these features tie back to user stories, and which **Core Components** are used to achieve them + F#.1. [Feature Name] + Description: [Brief feature description] + User Stories: [Related user stories from PRD] + Components Used: [Which components implement this feature?] + +#### Page-Specific User Flows + Step-by-step sequences describing user interactions and system responses + Flow #. [Flow Name] + [Step 1] + [Step 2] + + +1. **Goal**: Produce a complete UX Structure Map describing how each page/screen is laid out, including which global components are reused across pages. + +2. **Global Components**: + - Mark all reusable or site-wide elements with \`\` tags and end tag . + - Provide a short but clear definition for each global component (e.g., Navigation Bar, Footer, etc.). + - Explain how/why these components appear on multiple pages (if applicable). + +3. **Page Definitions**: + - Use \`\` tags to define each individual page or screen from the Sitemap Documentation. + - For each \`\`, provide: + - **Page name** (P#). + - **URL Path**: The route or path used to access this page. + - **Description**: Explain the purpose of the page, the users goal, and how it supports the user journey. + - **Core Elements**: List and describe the UI elements on this page (headers, buttons, sidebars, etc.). + - Explain their states and interactions. + - Reference **global components** (if used) plus any page-specific components. + - **Content Display**: What information is shown, and why is it essential? + - **Navigation and Routes**: Which routes lead here? Which links or buttons lead out? + - **Restrictions**: Note if login is required, or if only certain user roles can access. + +4. **Focus on Detail**: + - Provide a component-level breakdown for each pages layout and user interactions. + - Address all features from the Sitemap Documentation; confirm no item is missed. + - Make sure each pages structure is thorough enough for front-end implementation. + +5. **Consider**: + - User goals on each page. + - The user journey and how each page supports it. + - The purpose of each element (why it exists, how it helps the user). + - The presence of dynamic or personalized content. + + 6. **Output Format**: + - Your reply must begin with: and end with (plain text, no Markdown headings). + - Inside, you must include: + 1. One or more \`\` blocks (if relevant). + 2. Multiple \`\` blocks (one per page). + - Each \`\` or \`\` should include all relevant fields as stated above. + **Number** pages sequentially (P1., P2., etc.). + **Number** each component and feature sequentially within that page (C1.1, C1.2, F1.1, F1.2, etc.). + Thoroughly parse the PRD to include: + - **All** pages. + - **All** features, functionalities, user stories, and flows. + - **All** major/minor navigation and user journeys. + +Sitemap Coverage + + Comprehensive Analysis: + Capture all features, functionalities, and user stories. + Represent all primary and secondary user flows. + + Page & Navigation Structure: + Identify all main and nested pages. + Ensure clear parent-child relationships. + + Detailed User Journeys: + Provide step-by-step navigational flows unique to each page. + + Thorough Coverage: + Verify every requirement, global UI element, unique UI, and user expectation from the PRD is addressed. + No user flow or screen should be missing. + +Self-Check Before Submitting + + Have you accounted for all sitemap details? + Have you included all major and minor pages/screens? + Have you detailed each page's components, features, and flows completely? + Is every page from the Sitemap Documentation represented in a \`\` block? + Are all global components defined in \`\` blocks? + Are user flows, interactions, and relevant content needs included? + +Deliver a single XML-like document that strictly follows the structure above. Start with and close with , containing one block per page. - Make sure is 100% completed. It will be directly be use in development. `; }, generateLevel2UXSiteMapStructrePrompt: ( @@ -100,6 +160,11 @@ export const prompts = { Restrictions: Note any restrictions or conditions for accessing the page (e.g., login required, specific user roles). + 2. **Global Components**: + - Mark all reusable or site-wide elements with \`\` tags. + - Provide a short but clear definition for each global component (e.g., Navigation Bar, Footer, etc.). + - Explain how/why these components appear on multiple pages (if applicable). + 5, Focus on Detail: Provide a component-level breakdown for each page, including layouts. Explain how the design supports user goals and aligns with their journey. From d4a1d1e03ad19296c187886f7c19b9766911abe9 Mon Sep 17 00:00:00 2001 From: ZHallen122 Date: Fri, 10 Jan 2025 23:57:59 -0500 Subject: [PATCH 21/71] update prompts --- .../src/build-system/handlers/ux/sitemap-document/prompt.ts | 2 ++ .../src/build-system/handlers/ux/sitemap-structure/prompt.ts | 3 ++- 2 files changed, 4 insertions(+), 1 deletion(-) diff --git a/backend/src/build-system/handlers/ux/sitemap-document/prompt.ts b/backend/src/build-system/handlers/ux/sitemap-document/prompt.ts index b4ee5a35..f782faa7 100644 --- a/backend/src/build-system/handlers/ux/sitemap-document/prompt.ts +++ b/backend/src/build-system/handlers/ux/sitemap-document/prompt.ts @@ -41,6 +41,7 @@ export const prompts = { N. [Main Section Title] + Description: (Brief description of page purpose) N.1. [Sub-section Title] N.1.1. [Further Detail] N.1.2. [Further Detail] @@ -49,6 +50,7 @@ export const prompts = { 2. [Another Main Section] + Description: (Brief description of page purpose) 2.1 [Sub-section Title] ... diff --git a/backend/src/build-system/handlers/ux/sitemap-structure/prompt.ts b/backend/src/build-system/handlers/ux/sitemap-structure/prompt.ts index ade78f92..5a331cc2 100644 --- a/backend/src/build-system/handlers/ux/sitemap-structure/prompt.ts +++ b/backend/src/build-system/handlers/ux/sitemap-structure/prompt.ts @@ -13,7 +13,7 @@ export const prompts = { Output Requirements: Use plain text (no Markdown). Begin with and end with . - Within , generate multiple blocks, one for each page. + Within , start with , and generate multiple blocks, one for each page. Each must follow this structure exactly: @@ -82,6 +82,7 @@ P#. [Page Name] 1. One or more \`\` blocks (if relevant). 2. Multiple \`\` blocks (one per page). - Each \`\` or \`\` should include all relevant fields as stated above. + **Number** Goal Component in tag sequentially (G1., G2., etc.). **Number** pages sequentially (P1., P2., etc.). **Number** each component and feature sequentially within that page (C1.1, C1.2, F1.1, F1.2, etc.). Thoroughly parse the PRD to include: From eebffc61419fce70f52b7ac94eee371733ab1179 Mon Sep 17 00:00:00 2001 From: ZHallen122 Date: Sat, 11 Jan 2025 10:42:57 -0500 Subject: [PATCH 22/71] update sitemap structure: add messages --- .../handlers/ux/sitemap-structure/index.ts | 42 ++++++++++++++++++- 1 file changed, 40 insertions(+), 2 deletions(-) diff --git a/backend/src/build-system/handlers/ux/sitemap-structure/index.ts b/backend/src/build-system/handlers/ux/sitemap-structure/index.ts index 4d080990..0a589b0d 100644 --- a/backend/src/build-system/handlers/ux/sitemap-structure/index.ts +++ b/backend/src/build-system/handlers/ux/sitemap-structure/index.ts @@ -4,6 +4,7 @@ import { ModelProvider } from 'src/common/model-provider'; import { prompts } from './prompt'; import { Logger } from '@nestjs/common'; import { removeCodeBlockFences } from 'src/build-system/utils/strings'; +import { MessageInterface } from 'src/common/model-provider/types'; // UXSMS: UX Sitemap Structure export class UXSitemapStructureHandler implements BuildHandler { @@ -27,13 +28,50 @@ export class UXSitemapStructureHandler implements BuildHandler { const prompt = prompts.generateUXSiteMapStructrePrompt( projectName, - sitemapDoc, 'web', // TODO: Change platform dynamically if necessary ); + const messages: MessageInterface[] = [ + { + role: 'system', + content: prompt, + }, + { + role: 'user', + content: ` + Here is the UX Sitemap Documentation (SMD): + + ${sitemapDoc} + + Please generate the Full UX Sitemap Structre now, focusing on MVP features but ensuring each page has enough detail to be functional.`, + }, + { + role: 'user', + content: `Check if you covered all major pages, user flows, and any global components mentioned in the SMD. + If anything is missing, please add it now. Also, expand on how each is used across pages.`, + }, + { + role: 'user', + content: `Please add more detail about the Core Components within each . + Specifically: + - Provide a descriptive name for each Core Component (e.g., “C1.1. SearchBar”). + - List possible states (Default, Hover, etc.) and typical user interactions (click, scroll, etc.). + - Clarify how these components support user goals and why they exist on that page.`, + }, + { + role: 'user', + content: ` + Finally, please ensure each page includes at least one user flow under "Page-Specific User Flows", + illustrating step-by-step how a user accomplishes a key goal on that page. + If the SMD mentions additional flows, add them here. + Confirm any login or access restrictions, too. + `, + }, + ]; + const uxStructureContent = await context.model.chatSync({ model: 'gpt-4o-mini', - messages: [{ content: prompt, role: 'system' }], + messages, }); return { From 7eecfe444077b2418c5d68d6b1d6e6c91562dedc Mon Sep 17 00:00:00 2001 From: ZHallen122 Date: Sun, 12 Jan 2025 16:32:24 -0500 Subject: [PATCH 23/71] page by page update --- .../handlers/ux/sitemap-structure/prompt.ts | 15 ++-- .../handlers/ux/sitemap-structure/sms-page.ts | 78 ++++++++++++------- 2 files changed, 54 insertions(+), 39 deletions(-) diff --git a/backend/src/build-system/handlers/ux/sitemap-structure/prompt.ts b/backend/src/build-system/handlers/ux/sitemap-structure/prompt.ts index 5a331cc2..161fe0f5 100644 --- a/backend/src/build-system/handlers/ux/sitemap-structure/prompt.ts +++ b/backend/src/build-system/handlers/ux/sitemap-structure/prompt.ts @@ -16,7 +16,7 @@ export const prompts = { Within , start with , and generate multiple blocks, one for each page. Each must follow this structure exactly: - + P#. [Page Name] URL Path: /[path] Description: [Brief description of page purpose] @@ -55,6 +55,7 @@ P#. [Page Name] 3. **Page Definitions**: - Use \`\` tags to define each individual page or screen from the Sitemap Documentation. - For each \`\`, provide: + - **Page id** a unique page id. - **Page name** (P#). - **URL Path**: The route or path used to access this page. - **Description**: Explain the purpose of the page, the users goal, and how it supports the user journey. @@ -122,8 +123,6 @@ Deliver a single XML-like document that strictly follows the structure above. St }, generateLevel2UXSiteMapStructrePrompt: ( projectName: string, - UXStructure: string, - sitemapDoc: string, platform: string, ): string => { return `You are an expert UX Designer. @@ -132,10 +131,10 @@ Deliver a single XML-like document that strictly follows the structure above. St The output should address all aspects of user interaction, content layout, based on the following inputs: - Project name: ${projectName} - - Sitemap Documentation: ${sitemapDoc} - - UX Structure document: ${UXStructure} - Platform: ${platform} - + - Sitemap Documentation: (Provided by the user next) + - UX SiteMap Structure: (Provided by the user next) + Follow these guidelines to analyze requirements from a UX perspective: ### Instructions and Rules: @@ -154,7 +153,7 @@ Deliver a single XML-like document that strictly follows the structure above. St List all components (e.g., headers, buttons, sidebars) and explain their role on the page. Include specific interactions and behaviors for each element. Content Display: - Identify the information that needs to be visible on the page and why it’s essential for the user. + Identify the information that needs to be visible on the page and why it's essential for the user. Navigation and Routes: Specify all frontend routes required to navigate to this page. Include links or actions that lead to other pages or states. @@ -184,8 +183,6 @@ Deliver a single XML-like document that strictly follows the structure above. St - Element purposes - Content that needs to be displayed - Your reply must start with: "\`\`\`UXStructureMap" and end with "\`\`\`". - Focus on describing the UX Structure from a user experience perspective. For each page: 1. What element appear on each page and why 2. What information needs to be displayed and why diff --git a/backend/src/build-system/handlers/ux/sitemap-structure/sms-page.ts b/backend/src/build-system/handlers/ux/sitemap-structure/sms-page.ts index 28543cd0..cb3843ef 100644 --- a/backend/src/build-system/handlers/ux/sitemap-structure/sms-page.ts +++ b/backend/src/build-system/handlers/ux/sitemap-structure/sms-page.ts @@ -4,9 +4,12 @@ import { BuildHandler, BuildResult } from 'src/build-system/types'; import { ModelProvider } from 'src/common/model-provider'; import { prompts } from './prompt'; import { removeCodeBlockFences } from 'src/build-system/utils/strings'; +import { MessageInterface } from 'src/common/model-provider/types'; -export class Level2UXSitemapStructureHandler implements BuildHandler { - readonly id = 'op:UX:SMS:LEVEL2'; +export class UXSitemapStructurePagebyPageHandler + implements BuildHandler +{ + readonly id = 'op:UX:SMS:PAGEBYPAGE'; readonly logger = new Logger('Level2UXSitemapStructureHandler'); async run(context: BuilderContext): Promise> { @@ -44,53 +47,68 @@ export class Level2UXSitemapStructureHandler implements BuildHandler { for (const section of sections) { const prompt = prompts.generateLevel2UXSiteMapStructrePrompt( projectName, - section.content, - sitemapDoc, 'web', // TODO: Replace with dynamic platform if necessary ); + const messages: MessageInterface[] = [ + { + role: 'system', + content: prompt, + }, + { + role: 'user', + content: ` + Here is the UX Sitemap Documentation (SMD): + + ${sitemapDoc} + + Next will provide UX SiteMap Structure`, + }, + { + role: 'user', + content: ` + Here is the UX SiteMap Structre Section (SMS): + + ${section} + + Please generate the Full UX Sitemap Structre for this section now.`, + }, + { + role: 'user', + content: `Please add more detail about the Core Components within each . + Specifically: + - Provide a descriptive name for each Core Component (e.g., “C1.1. SearchBar”). + - List possible states (Default, Hover, etc.) and typical user interactions (click, scroll, etc.). + - Clarify how these components support user goals and why they exist on that page.`, + }, + ]; + const refinedContent = await modelProvider.chatSync({ model: 'gpt-4o-mini', - messages: [{ content: prompt, role: 'system' }], + messages, }); - refinedSections.push({ - title: section.title, - content: refinedContent, - }); + refinedSections.push(refinedContent); } - // Combine the refined sections into the final document - const refinedDocument = refinedSections - .map((section) => `## **${section.title}**\n${section.content}`) - .join('\n\n'); + // Convert refinedSections to a stringD + const refinedDocument = `\n${refinedSections.join('\n\n')}\n`; this.logger.log(refinedDocument); return { success: true, - data: removeCodeBlockFences(refinedDocument), + data: refinedDocument, }; } /** - * Extracts all sections from a given text. + * Extracts all sections as raw strings, including the tags. * @param text The UX Structure Document content. - * @returns Array of extracted sections with title and content. + * @returns Array of extracted sections as full strings. */ - private extractAllSections( - text: string, - ): Array<{ title: string; content: string }> { - const regex = /## \*\*(\d+\.\s.*)\*\*([\s\S]*?)(?=\n## \*\*|$)/g; - const sections = []; - let match; - - while ((match = regex.exec(text)) !== null) { - const title = match[1].trim(); - const content = match[2].trim(); - sections.push({ title, content }); - } - - return sections; + private extractAllSections(text: string): string[] { + const pageRegex = /[\s\S]*?<\/gen_page>/g; + return text.match(pageRegex) || []; } } From 6f92d88067cd84ed7a734fd9feec8729324c0cda Mon Sep 17 00:00:00 2001 From: ZHallen122 Date: Sun, 12 Jan 2025 19:38:46 -0500 Subject: [PATCH 24/71] update --- .../handlers/ux/sitemap-document/index.ts | 4 +- .../handlers/ux/sitemap-structure/prompt.ts | 52 +++++++++++++------ .../handlers/ux/sitemap-structure/sms-page.ts | 8 +-- 3 files changed, 41 insertions(+), 23 deletions(-) diff --git a/backend/src/build-system/handlers/ux/sitemap-document/index.ts b/backend/src/build-system/handlers/ux/sitemap-document/index.ts index 0bed5d0b..f5f8250e 100644 --- a/backend/src/build-system/handlers/ux/sitemap-document/index.ts +++ b/backend/src/build-system/handlers/ux/sitemap-document/index.ts @@ -51,7 +51,7 @@ export class UXSMDHandler implements BuildHandler { ${prdContent} - Please generate the Full UX Sitemap Document now, focusing on MVP features but ensuring each page (especially Home) has enough detail to be functional.`, + Please generate the Full UX Sitemap Document now, focusing on MVP features but ensuring each page has enough detail to be functional.`, }, { role: 'user', @@ -59,7 +59,7 @@ export class UXSMDHandler implements BuildHandler { }, { role: 'user', - content: `Please add more detail about the Core Components in each . + content: `Please add more detail about the Sub-section in each . Focus on step-by-step actions the user takes, and any alternative paths mentioned in the PRD. Also, expand on how these components interrelate to the page's primary features.`, }, diff --git a/backend/src/build-system/handlers/ux/sitemap-structure/prompt.ts b/backend/src/build-system/handlers/ux/sitemap-structure/prompt.ts index 161fe0f5..a85dd170 100644 --- a/backend/src/build-system/handlers/ux/sitemap-structure/prompt.ts +++ b/backend/src/build-system/handlers/ux/sitemap-structure/prompt.ts @@ -13,10 +13,10 @@ export const prompts = { Output Requirements: Use plain text (no Markdown). Begin with and end with . - Within , start with , and generate multiple blocks, one for each page. - Each must follow this structure exactly: + Within , start with , and generate multiple blocks, one for each page. + Each must follow this structure exactly: - + P#. [Page Name] URL Path: /[path] Description: [Brief description of page purpose] @@ -43,7 +43,7 @@ P#. [Page Name] Flow #. [Flow Name] [Step 1] [Step 2] - + 1. **Goal**: Produce a complete UX Structure Map describing how each page/screen is laid out, including which global components are reused across pages. @@ -117,7 +117,7 @@ Self-Check Before Submitting Are all global components defined in \`\` blocks? Are user flows, interactions, and relevant content needs included? -Deliver a single XML-like document that strictly follows the structure above. Start with and close with , containing one block per page. +Deliver a single XML-like document that strictly follows the structure above. Start with and close with , containing one block per page. `; }, @@ -133,11 +133,41 @@ Deliver a single XML-like document that strictly follows the structure above. St - Project name: ${projectName} - Platform: ${platform} - Sitemap Documentation: (Provided by the user next) - - UX SiteMap Structure: (Provided by the user next) + - UX SiteMap Structure Section: (Provided by the user next) Follow these guidelines to analyze requirements from a UX perspective: ### Instructions and Rules: + UX SiteMap Structure Section will follow this structure exactly and your output should follow this exactly: + + P#. [Page Name] + URL Path: /[path] + Description: [Brief description of page purpose] + Parent Page: [Parent page if nested, or "None" if top-level] + Access Level: [e.g., Public/Private/Admin] + + #### Core Components + C#.1. [Component Name] + - Definition: Core Components are **distinct UI elements** or **functional blocks** on the page that have a clear, identifiable role. Each component must include: + 1. **Type** (Layout, Interactive, Display, Input, etc.) + 2. **Purpose** (What does it do for the user or the interface?) + 3. **States** (Possible UI states: Default, Hover, Clicked, Expanded, Loading, etc.) + 4. **Interactions** (User actions or system responses: clicking, hovering, dragging, scrolling, etc.) + + #### Features & Functionality + - Focus on how these features tie back to user stories, and which **Core Components** are used to achieve them + F#.1. [Feature Name] + Description: [Brief feature description] + User Stories: [Related user stories from PRD] + Components Used: [Which components implement this feature?] + + #### Page-Specific User Flows + Step-by-step sequences describing user interactions and system responses + Flow #. [Flow Name] + [Step 1] + [Step 2] + + 1, Analyze the Target Section: Focus on the specific part of the page provided in the UX Structure document. @@ -154,17 +184,9 @@ Deliver a single XML-like document that strictly follows the structure above. St Include specific interactions and behaviors for each element. Content Display: Identify the information that needs to be visible on the page and why it's essential for the user. - Navigation and Routes: - Specify all frontend routes required to navigate to this page. - Include links or actions that lead to other pages or states. Restrictions: Note any restrictions or conditions for accessing the page (e.g., login required, specific user roles). - 2. **Global Components**: - - Mark all reusable or site-wide elements with \`\` tags. - - Provide a short but clear definition for each global component (e.g., Navigation Bar, Footer, etc.). - - Explain how/why these components appear on multiple pages (if applicable). - 5, Focus on Detail: Provide a component-level breakdown for each page, including layouts. Explain how the design supports user goals and aligns with their journey. @@ -188,7 +210,7 @@ Deliver a single XML-like document that strictly follows the structure above. St 2. What information needs to be displayed and why 3. How the element supports user goals - Make sure is 100% completed. It will be directly be use in development. + Make sure is 100% completed. It will be directly be use in development, Do not explain what part you changed. `; }, }; diff --git a/backend/src/build-system/handlers/ux/sitemap-structure/sms-page.ts b/backend/src/build-system/handlers/ux/sitemap-structure/sms-page.ts index cb3843ef..448a5114 100644 --- a/backend/src/build-system/handlers/ux/sitemap-structure/sms-page.ts +++ b/backend/src/build-system/handlers/ux/sitemap-structure/sms-page.ts @@ -75,11 +75,7 @@ export class UXSitemapStructurePagebyPageHandler }, { role: 'user', - content: `Please add more detail about the Core Components within each . - Specifically: - - Provide a descriptive name for each Core Component (e.g., “C1.1. SearchBar”). - - List possible states (Default, Hover, etc.) and typical user interactions (click, scroll, etc.). - - Clarify how these components support user goals and why they exist on that page.`, + content: `Please add more detail about the Core Components within each .`, }, ]; @@ -108,7 +104,7 @@ export class UXSitemapStructurePagebyPageHandler * @returns Array of extracted sections as full strings. */ private extractAllSections(text: string): string[] { - const pageRegex = /[\s\S]*?<\/gen_page>/g; + const pageRegex = /[\s\S]*?<\/page_gen>/g; return text.match(pageRegex) || []; } } From 1cb1dda020836340ce6f5fbff01e53d3fbf1f746 Mon Sep 17 00:00:00 2001 From: ZHallen122 Date: Tue, 14 Jan 2025 22:40:42 -0500 Subject: [PATCH 25/71] update UXSMD and S --- .../handlers/ux/sitemap-document/index.ts | 22 +- .../handlers/ux/sitemap-document/prompt.ts | 114 ++++--- .../handlers/ux/sitemap-structure/index.ts | 2 +- .../handlers/ux/sitemap-structure/prompt.ts | 287 +++++++++--------- .../handlers/ux/sitemap-structure/sms-page.ts | 14 +- 5 files changed, 242 insertions(+), 197 deletions(-) diff --git a/backend/src/build-system/handlers/ux/sitemap-document/index.ts b/backend/src/build-system/handlers/ux/sitemap-document/index.ts index f5f8250e..ca8c397d 100644 --- a/backend/src/build-system/handlers/ux/sitemap-document/index.ts +++ b/backend/src/build-system/handlers/ux/sitemap-document/index.ts @@ -20,7 +20,7 @@ export class UXSMDHandler implements BuildHandler { const prdContent = context.getNodeData('op:PRD'); // Generate the prompt dynamically - const prompt = prompts.generateUxsmdrompt(projectName, platform); + const prompt = prompts.generateUxsmdPrompt(projectName, platform); // Send the prompt to the LLM server and process the response const uxsmdContent = await this.generateUXSMDFromLLM(prompt, prdContent); @@ -47,7 +47,7 @@ export class UXSMDHandler implements BuildHandler { { role: 'user', content: ` - Here is the Product Requirements Document (PRD): + Here is the **Product Requirements Document (PRD)**: ${prdContent} @@ -55,18 +55,26 @@ export class UXSMDHandler implements BuildHandler { }, { role: 'user', - content: `Check if you meet all PRD details, add more pages, and details if needed. Focus on MVP (Minimum Viable Product).`, + content: `**Validation Step:** + - **Review your output** to ensure **100% coverage** of the PRD. + - Make sure you covered all global_view_* and page_view_* in UX Sitemap Document, If any of them is missing add them based on the system prompt. + - If any critical pages, features, or flows are **missing**, **add them**. + - Adjust for **navigation completeness**, making sure all interactions and workflows are **correctly linked**.`, }, { role: 'user', - content: `Please add more detail about the Sub-section in each . - Focus on step-by-step actions the user takes, and any alternative paths mentioned in the PRD. - Also, expand on how these components interrelate to the page's primary features.`, + content: `**Final Refinement:** + - **Expand the Unique UI Pages **, adding page_view_* if needed: + - **Expand the page_views **, adding more details on: + - **Step-by-step user actions** within each page. + - **Alternative user paths** (e.g., different ways a user might complete an action). + - **How components within the page interact** with each other and primary features. + - **Ensure clarity** so developers can implement the structure **without assumptions**.`, }, ]; const modelProvider = ModelProvider.getInstance(); - const model = 'gpt-4o-mini'; + const model = 'gpt-4o'; const uxsmdContent = await modelProvider.chatSync({ model, diff --git a/backend/src/build-system/handlers/ux/sitemap-document/prompt.ts b/backend/src/build-system/handlers/ux/sitemap-document/prompt.ts index f782faa7..8ca4cb2b 100644 --- a/backend/src/build-system/handlers/ux/sitemap-document/prompt.ts +++ b/backend/src/build-system/handlers/ux/sitemap-document/prompt.ts @@ -1,66 +1,82 @@ // Define and export the system prompts object export const prompts = { - generateUxsmdrompt: (projectName: string, platform: string): string => { + generateUxsmdPrompt: (projectName: string, platform: string): string => { return `You are an expert frontend develper and ux designer. Your job is to analyze and expand upon the details provided, generating a Full UX Sitemap Document based on the following inputs: - Project name: ${projectName} - Platform: ${platform} - - product requirements document: (Provided by the user next) + - product requirements document - Follow these rules as a guide to ensure clarity and completeness in your UX Sitemap Document. - 1. Your reply should start with : "" and end with " ", Use plain text (no Markdown). - 2. Use tags for each main page or section within the sitemap. - 3. Use tags for whole User Journeys - 4. **Comprehensive Analysis**: Thoroughly parse the PRD to identify all core features, functionalities, and user stories. - - Focus on creating a hierarchical sitemap that covers each major section, with relevant sub-sections, pages, and key interactions. - - Ensure all primary and secondary user journeys identified in the PRD are clearly reflected. + Your primary goal is to create a fully comprehensive, development-ready UX Sitemap Document that will be directly transferred to the development team for implementation. + This document will be used for an application expected to serve thousands of users, and it must cover all use cases, ensuring a complete and detailed roadmap of all UI components and navigation. + Formatting & Output Guidelines: + 1, Use Markdown for structuring the document. + 2, Your reply should start with : "\`\`\`UXSitemap" and end with "\`\`\`", Use proper markdown syntax for headings, subheadings, and hierarchical lists. + 3, Ensure proper markdown syntax for headings, subheadings, and hierarchical lists. + 4, Strict Naming Conventions: + Global Shared UI Views → Prefix with global_view_* . + Unique UI Pages → Prefix with page_view_* . + No "Container" Views → Do not create abstract container views . + global_view_* and page_view_* must be independent → page_view_* does not embed global_view_*, but they share screen space. - 5. **Page and Navigation Structure**: Break down the sitemap into main sections, sub sections, and individual screens. - - Identify all main and nested pages. - - **Main Sections**: Identify primary sections (e.g., Home, User Account, Product Catalog) based on project requirements. - - **Sub Sections**: Include sub-sections under each main section (e.g., "Profile" and "Order History" under "User Account"). - - **Screens and Interactions**: List specific screens and interactions that users encounter within each flow. + UX Sitemap Requirements: + Your UX Sitemap Document should include detailed breakdowns of: - 6. **Detailed User Journeys**: - - For every user story described in the PRD, map out the step-by-step navigation path. - - Highlight sequences (e.g., 1. Home > 1.1. Explore > 1.1.1. Product Details). + 1, Global Shared UI Views (global_view_*) + Definition: Shared UI components (e.g., navigation, footers, side menus) used across multiple pages. + Structure: + Each must have a unique ID (global_view_*). + Clearly describe authentication conditions: + Logged-in users (full access, personalized elements). + Logged-out users (restricted access, call-to-actions). + Document all shared elements and their variations: + Example: global_view_top_nav (changes based on authentication state). - 7. **Thorough Coverage**: - - Ensure the sitemap is fully comprehensive. If any feature from the PRD is not covered or any user journey is missing, add it to the sitemap. - - Consider the target audience and validate that all expected navigation flows and screens meet user needs. + 2, Unique UI Pages (page_view_*) + Definition: Individual, standalone pages (e.g., page_view_home, page_view_settings). + Structure: + Path (URL Route): Clearly define the URL structure of the page. + Example: /home + Covers all unique screens (e.g., page_view_home, page_view_onboarding, page_view_settings). + Describe authentication conditions, permissions, and state dependencies: + What features are available to guest vs. logged-in users? + Are any actions restricted based on user type (e.g., admin, regular user)? + Ensure no duplicate inclusion of global_view_* views (they only share screen space). + Components: + List all UI components that appear on this page. + Describe their functionality and interaction behavior. + Provide detailed descriptions of features, interactions, and user flows. - 8. Ask Your self: - - Am I cover all the product requirement document? - - Am I Cover all the gloabal UI? - - Am I Cover all unique UI? - - Am I cover all the view that expect by user? - - what is all the details about UI? - - Am I cover all the cases? Is the final result 100% complete? + 3, Functional & Feature Analysis + Break down each UI page before detailing its components. + Clearly map features to UI views. + Ensure that: + Every feature described in the PRD has a corresponding page (page_view_*). + Features are not missing any expected UI elements. - 9. Example output: - - - N. [Main Section Title] - Description: (Brief description of page purpose) - N.1. [Sub-section Title] - N.1.1. [Further Detail] - N.1.2. [Further Detail] - N.2. [Another Sub-section Title] - + 4, Navigation & User Journey Mapping + Map each user journey from the PRD into a step-by-step navigation path. + Example format: - - 2. [Another Main Section] - Description: (Brief description of page purpose) - 2.1 [Sub-section Title] - ... - + 1. page_view_home → page_view_explore → page_view_product_details → .... - - Highlight sequences for user journey - + Cover both static and dynamic navigation flows. - - -Remeber your result will be directly be use in the deveolpment. Make sure is 100% complete.`; + Final Instructions: + Self Check Before finalizing, ask yourself: + Did I cover all global shared UI views (global_view_*) separately? + Did I assign unique and expressive IDs (global_view_* for shared views, page_view_* for unique pages)? + Did I avoid embedding global_view_* inside page_view_*? + Did I ensure authentication-based conditions (logged-in vs. guest)? + Did I extensively describe every UI element, interaction, and user flow? + Did I include URL paths for all pages? + Did I include 100% of views required by all features? + Did I avoid unnecessary secondary/tertiary features? + Did I describe inter-app linking and navigation comprehensively? + Strictly follow the naming and formatting conventions. + No extra comments or surrounding text—your reply will be directly used as the final UX Sitemap Analysis Document. + Your response should only contain the markdown-formatted UX Sitemap Document. + Your final document must be exhaustive and 100% complete for development use. + `; }, }; diff --git a/backend/src/build-system/handlers/ux/sitemap-structure/index.ts b/backend/src/build-system/handlers/ux/sitemap-structure/index.ts index 0a589b0d..5ee320cd 100644 --- a/backend/src/build-system/handlers/ux/sitemap-structure/index.ts +++ b/backend/src/build-system/handlers/ux/sitemap-structure/index.ts @@ -70,7 +70,7 @@ export class UXSitemapStructureHandler implements BuildHandler { ]; const uxStructureContent = await context.model.chatSync({ - model: 'gpt-4o-mini', + model: 'gpt-4o', messages, }); diff --git a/backend/src/build-system/handlers/ux/sitemap-structure/prompt.ts b/backend/src/build-system/handlers/ux/sitemap-structure/prompt.ts index a85dd170..a9f661a3 100644 --- a/backend/src/build-system/handlers/ux/sitemap-structure/prompt.ts +++ b/backend/src/build-system/handlers/ux/sitemap-structure/prompt.ts @@ -3,58 +3,72 @@ export const prompts = { projectName: string, platform: string, ): string => { - return `You are an expert frontend develper and ux designer. Your job is to analyze and expand upon the details provided, generating a Full UX Sitemap Document based on the following inputs: + return `You are an expert frontend develper and ux designer. Your job is to analyze and expand upon the details provided, generating a Full UX Sitemap Structure Document based on the following inputs: - Project name: ${projectName} - Platform: ${platform} - - Product Requirements Document: (Provided by the user next) - - Goal: MVP (Minimum Viable Product) - - Follow these rules as a guide to ensure clarity and completeness in your UX Sitemap Document. - Output Requirements: - Use plain text (no Markdown). - Begin with and end with . - Within , start with , and generate multiple blocks, one for each page. - Each must follow this structure exactly: - - -P#. [Page Name] - URL Path: /[path] - Description: [Brief description of page purpose] - Parent Page: [Parent page if nested, or "None" if top-level] - Access Level: [e.g., Public/Private/Admin] - -#### Core Components - C#.1. [Component Name] - - Definition: Core Components are **distinct UI elements** or **functional blocks** on the page that have a clear, identifiable role. Each component must include: - 1. **Type** (Layout, Interactive, Display, Input, etc.) - 2. **Purpose** (What does it do for the user or the interface?) - 3. **States** (Possible UI states: Default, Hover, Clicked, Expanded, Loading, etc.) - 4. **Interactions** (User actions or system responses: clicking, hovering, dragging, scrolling, etc.) - -#### Features & Functionality - - Focus on how these features tie back to user stories, and which **Core Components** are used to achieve them - F#.1. [Feature Name] - Description: [Brief feature description] - User Stories: [Related user stories from PRD] - Components Used: [Which components implement this feature?] - -#### Page-Specific User Flows - Step-by-step sequences describing user interactions and system responses - Flow #. [Flow Name] - [Step 1] - [Step 2] - + - UX Sitemap Documentation: (Provided by the user next) + + Formatting & Output Guidelines: + Output Requirements: + Use plain text (no Markdown). + Begin with and end with . + Within , start with , and generate multiple blocks, one for each page. + + UX Sitemap Structure: + The sitemap should be structured as follows: + + + + + G#. [Component Name] + Authentication Conditions: [Rules for visibility based on user authentication] + Elements: + - [List all UI elements in this component] + 1. **Type** (Layout, Interactive, Display, Input, etc.) + 2. **Purpose** (What does it do for the user or the interface?) + 3. **States** (Possible UI states: Default, Hover, Clicked, Expanded, Loading, etc.) + 4. **Interactions** (User actions or system responses: clicking, hovering, dragging, scrolling, etc.) + + + + + + P#. [Page Name] + URL Path: /[path] + Parent Page: [Parent page if nested, or "None" if top-level] + Description: [Brief description of page purpose] + Authentication Conditions: [Public/Private/Login Required] + Core Components: + - C#.1. [Component Name] + - Definition: Core Components are **distinct UI elements** or **functional blocks** on the page that have a clear, identifiable role. Each component must include: + 1. **Type** (Layout, Interactive, Display, Input, etc.) + 2. **Purpose** (What does it do for the user or the interface?) + 3. **States** (Possible UI states: Default, Hover, Clicked, Expanded, Loading, etc.) + 4. **Interactions** (User actions or system responses: clicking, hovering, dragging, scrolling, etc.) + Features & Functionality: + - Focus on how these features tie back to user stories, and which **Core Components** are used to achieve them + - F#.1. [Feature Name] + - Description: [Functionality Overview] + - User Stories: [Relevant user stories from PRD] + - Components Used: [Which UI elements power this feature?] + #### Page-Specific User Flows: + Step-by-step sequences describing user interactions and system responses + Flow #. [Flow Name] + [Step 1] + [Step 2] + + 1. **Goal**: Produce a complete UX Structure Map describing how each page/screen is laid out, including which global components are reused across pages. 2. **Global Components**: - - Mark all reusable or site-wide elements with \`\` tags and end tag . + - Mark all reusable or site-wide elements with \`\` tags and end tag . - Provide a short but clear definition for each global component (e.g., Navigation Bar, Footer, etc.). - Explain how/why these components appear on multiple pages (if applicable). 3. **Page Definitions**: - - Use \`\` tags to define each individual page or screen from the Sitemap Documentation. - - For each \`\`, provide: + - Use \`\` tags to define each individual page or screen from the Sitemap Documentation. + - For each \`\`, provide: - **Page id** a unique page id. - **Page name** (P#). - **URL Path**: The route or path used to access this page. @@ -80,10 +94,10 @@ P#. [Page Name] 6. **Output Format**: - Your reply must begin with: and end with (plain text, no Markdown headings). - Inside, you must include: - 1. One or more \`\` blocks (if relevant). - 2. Multiple \`\` blocks (one per page). - - Each \`\` or \`\` should include all relevant fields as stated above. - **Number** Goal Component in tag sequentially (G1., G2., etc.). + 1. One or more \`\` blocks (if relevant). + 2. Multiple \`\` blocks (one per page). + - Each \`\` or \`\` should include all relevant fields as stated above. + **Number** Goal Component in tag sequentially (G1., G2., etc.). **Number** pages sequentially (P1., P2., etc.). **Number** each component and feature sequentially within that page (C1.1, C1.2, F1.1, F1.2, etc.). Thoroughly parse the PRD to include: @@ -111,13 +125,14 @@ Sitemap Coverage Self-Check Before Submitting Have you accounted for all sitemap details? - Have you included all major and minor pages/screens? + Are all global UI elements correctly categorized? + Have you included all relevant user flows and navigation structures? Have you detailed each page's components, features, and flows completely? - Is every page from the Sitemap Documentation represented in a \`\` block? - Are all global components defined in \`\` blocks? + Is every page from the Sitemap Documentation represented in a \`\` block? + Are all global components defined in \`\` blocks? Are user flows, interactions, and relevant content needs included? -Deliver a single XML-like document that strictly follows the structure above. Start with and close with , containing one block per page. +Deliver a single XML-like document that strictly follows the structure above. Start with and close with , containing one block per page. `; }, @@ -125,92 +140,92 @@ Deliver a single XML-like document that strictly follows the structure above. St projectName: string, platform: string, ): string => { - return `You are an expert UX Designer. - Your task is to analyze and improve a specific part of a page in the provided UX Structure Document. - The goal is to refine the design, layout, and interaction to ensure a seamless user experience and facilitate frontend implementation. - The output should address all aspects of user interaction, content layout, based on the following inputs: - - - Project name: ${projectName} - - Platform: ${platform} - - Sitemap Documentation: (Provided by the user next) - - UX SiteMap Structure Section: (Provided by the user next) - - Follow these guidelines to analyze requirements from a UX perspective: - - ### Instructions and Rules: - UX SiteMap Structure Section will follow this structure exactly and your output should follow this exactly: - - P#. [Page Name] - URL Path: /[path] - Description: [Brief description of page purpose] - Parent Page: [Parent page if nested, or "None" if top-level] - Access Level: [e.g., Public/Private/Admin] - - #### Core Components - C#.1. [Component Name] - - Definition: Core Components are **distinct UI elements** or **functional blocks** on the page that have a clear, identifiable role. Each component must include: - 1. **Type** (Layout, Interactive, Display, Input, etc.) - 2. **Purpose** (What does it do for the user or the interface?) - 3. **States** (Possible UI states: Default, Hover, Clicked, Expanded, Loading, etc.) - 4. **Interactions** (User actions or system responses: clicking, hovering, dragging, scrolling, etc.) - - #### Features & Functionality - - Focus on how these features tie back to user stories, and which **Core Components** are used to achieve them - F#.1. [Feature Name] - Description: [Brief feature description] - User Stories: [Related user stories from PRD] - Components Used: [Which components implement this feature?] - - #### Page-Specific User Flows - Step-by-step sequences describing user interactions and system responses - Flow #. [Flow Name] - [Step 1] - [Step 2] - - - - 1, Analyze the Target Section: - Focus on the specific part of the page provided in the UX Structure document. - Identify ways to enhance its layout, interactions, and functionality. - 2, Improve UX Details: - Add clarity to component placement and hierarchy. - Specify interactions, behaviors, and dynamic content updates. - Ensure the section aligns with user goals and their journey. - 3, You need to identify and define every page/screen required for the application. - 4, Detailed Breakdown for Each Page/Screen: - Page Purpose: Clearly state the user goal for the page. - Core Elements: - List all components (e.g., headers, buttons, sidebars) and explain their role on the page. - Include specific interactions and behaviors for each element. - Content Display: - Identify the information that needs to be visible on the page and why it's essential for the user. - Restrictions: - Note any restrictions or conditions for accessing the page (e.g., login required, specific user roles). - - 5, Focus on Detail: - Provide a component-level breakdown for each page, including layouts. - Explain how the design supports user goals and aligns with their journey. - - 6. For each page/screen in the sitemap: - - How the block should be place on the view? - - What information does the user need to see? - - What elements should be on the page? - - What are all the routes require for the frontend? - - What dynamic content needs to be displayed? - - What are the restriction for the page? - - 7. Consider: - - User goals on each page - - User journy - - Element purposes - - Content that needs to be displayed - - Focus on describing the UX Structure from a user experience perspective. For each page: - 1. What element appear on each page and why - 2. What information needs to be displayed and why - 3. How the element supports user goals - - Make sure is 100% completed. It will be directly be use in development, Do not explain what part you changed. + return ` + You are an expert front-end developer and UX designer. We have two important inputs: +1. A “UX Sitemap Document” that outlines high-level pages, sections, and user flows. +2. A “UX Sitemap Structure” containing blocks for each main page/screen. + +Your task is to produce a **page-by-page analysis** that enriches each block with additional detail about layout, components, styling, and interactions, based on these two inputs. + +### Instructions +1. **Output Structure** + +Each page **must** follow this format exactly, wrapped in \`\` tags: + + + P#. [Page Name] + URL Path: /[path] + Description: [Brief description of page purpose] + Parent Page: [Parent page if nested, or "None" if top-level] + Access Level: [e.g., Public/Private/Admin] + + #### Core Components + C#.1. [Component Name] + - Definition: Core Components are **distinct UI elements** or **functional blocks** on the page that have a clear, identifiable role. Each component must include: + 1. **Type** (Layout, Interactive, Display, Input, etc.) + 2. **Purpose** (What does it do for the user or the interface?) + 3. **States** (Possible UI states: Default, Hover, Clicked, Expanded, Loading, etc.) + 4. **Interactions** (User actions or system responses: clicking, hovering, dragging, scrolling, etc.) + 5. **Location** (Where on the page this component is placed) + 6. **Component Style**: + - Colors & Theming: + - Fonts & Typography: + - Dimensions & Spacing: + - Iconography: + - Transitions/Animations: + + #### Features & Functionality + - Focus on how these features tie back to user stories, and which **Core Components** are used to achieve them + F#.1. [Feature Name] + Description: [Brief feature description] + User Stories: [Related user stories from PRD] + Components Used: [Which components implement this feature?] + + #### Page-Specific User Flows + Step-by-step sequences describing user interactions and system responses + Flow #. [Flow Name] + [Step 1] + [Step 2] + + +- For **Core Components**, use sequential numbering (C1.1, C1.2, etc.). +- For **Features**, use sequential numbering (F1.1, F1.2, etc.). +- Keep each \`\` labeled with a **unique** page ID and page number (P1, P2, etc.). + +2. **Enhance** each page description to include more granular information such as: + - **Layout**: Where each component (e.g. header, cards, sidebars) is placed on the page. + - **Component Details**: + - **Name** (e.g., “Search Bar,” “Recommended Playlists”) + - **Type** (Layout, Interactive, Display, Input, etc.) + - **Purpose** (What does it do for the user or the interface?) + - **States** (Default, Hover, Clicked, Expanded, Loading, etc.) + - **Interactions** (Click, Hover, Drag, etc.) + - **Location** (e.g. “Header bar,” “Left sidebar,” “Main content section”) + - **Component Style**: + - **Color & Theming**: Primary color, background/foreground contrasts, brand highlights, etc. + - **Fonts & Typography**: Font family, size, weight, line-height if relevant. + - **Dimensions & Spacing**: Approximate width/height (e.g., “a 300px-wide sidebar”), margins/paddings. + - **Iconography**: If icons are used, note icon style or library (e.g., Material Icons, FontAwesome). + - **Transitions/Animations**: If any hover or click animations are relevant. + - **Features & Functionality**: Link features to the components implementing them. + - **Page-Specific User Flows**: Step-by-step sequences describing user interactions and system responses. + +3. **Process** + - For each \`\` in the provided UX Sitemap Structure, also consult the “UX Sitemap Document” for higher-level context. + - **Merge** or **add** any missing details, sub-pages, or user journeys not yet reflected in \`\`. + - Provide enough detail that front-end developers have a clear blueprint of layout, styling, and user flows. + +4. **Self-Check** + - Does each \`\` block list **all** relevant components with location, style, and interactions? + - Have you included all user flows from the UX Sitemap Document within the appropriate page? + - Are roles, states, or restrictions noted (if any)? + - Is the final detail sufficient for developers to build each page without ambiguity? + +5. **Final Instructions** +- **Plain text only** (no Markdown). +- Begin the final document with \`\` and end with \`\`. +- Include one \`\` block per page. If you have global components, add them in \`\` blocks as per your chosen format. +- Do **not** omit any page or feature. The final result must be **100% complete** and consistent with `; }, }; diff --git a/backend/src/build-system/handlers/ux/sitemap-structure/sms-page.ts b/backend/src/build-system/handlers/ux/sitemap-structure/sms-page.ts index 448a5114..53611d63 100644 --- a/backend/src/build-system/handlers/ux/sitemap-structure/sms-page.ts +++ b/backend/src/build-system/handlers/ux/sitemap-structure/sms-page.ts @@ -62,7 +62,7 @@ export class UXSitemapStructurePagebyPageHandler ${sitemapDoc} - Next will provide UX SiteMap Structure`, + Next, we will provide the specific UX Sitemap Structure section to be refine.`, }, { role: 'user', @@ -71,16 +71,22 @@ export class UXSitemapStructurePagebyPageHandler ${section} - Please generate the Full UX Sitemap Structre for this section now.`, + Please generate the Full UX Sitemap Structre for this section now. Only provide the information in `, }, { role: 'user', - content: `Please add more detail about the Core Components within each .`, + content: `Please add more detail about the Core Components within each . + Specifically: + - Provide a descriptive name for each Core Component (C#.X. [Component Name]) and why it exists on this page. + - List possible states (Default, Hover, Clicked, etc.) and typical user interactions (click, drag, input). + - Note any restrictions (login required, admin-only, etc.). + - Identify the essential content displayed (what users need to see and why). + - If any important elements or features appear to be missing, add them now to ensure a complete UX structure.`, }, ]; const refinedContent = await modelProvider.chatSync({ - model: 'gpt-4o-mini', + model: 'gpt-4o', messages, }); From 5cda996209af40de9cf1f7d2a1f15c50227076c9 Mon Sep 17 00:00:00 2001 From: ZHallen122 Date: Thu, 16 Jan 2025 18:07:18 -0500 Subject: [PATCH 26/71] update SMS --- .../handlers/ux/sitemap-structure/index.ts | 2 +- .../handlers/ux/sitemap-structure/prompt.ts | 213 +++++++++++++++--- .../handlers/ux/sitemap-structure/sms-page.ts | 105 +++++++-- 3 files changed, 267 insertions(+), 53 deletions(-) diff --git a/backend/src/build-system/handlers/ux/sitemap-structure/index.ts b/backend/src/build-system/handlers/ux/sitemap-structure/index.ts index 5ee320cd..54543ff7 100644 --- a/backend/src/build-system/handlers/ux/sitemap-structure/index.ts +++ b/backend/src/build-system/handlers/ux/sitemap-structure/index.ts @@ -26,7 +26,7 @@ export class UXSitemapStructureHandler implements BuildHandler { }; } - const prompt = prompts.generateUXSiteMapStructrePrompt( + const prompt = prompts.generateUXSiteMapStructurePrompt( projectName, 'web', // TODO: Change platform dynamically if necessary ); diff --git a/backend/src/build-system/handlers/ux/sitemap-structure/prompt.ts b/backend/src/build-system/handlers/ux/sitemap-structure/prompt.ts index a9f661a3..9d6488a9 100644 --- a/backend/src/build-system/handlers/ux/sitemap-structure/prompt.ts +++ b/backend/src/build-system/handlers/ux/sitemap-structure/prompt.ts @@ -1,5 +1,5 @@ export const prompts = { - generateUXSiteMapStructrePrompt: ( + generateUXSiteMapStructurePrompt: ( projectName: string, platform: string, ): string => { @@ -38,14 +38,14 @@ export const prompts = { Parent Page: [Parent page if nested, or "None" if top-level] Description: [Brief description of page purpose] Authentication Conditions: [Public/Private/Login Required] - Core Components: + #### Core Components: - C#.1. [Component Name] - Definition: Core Components are **distinct UI elements** or **functional blocks** on the page that have a clear, identifiable role. Each component must include: 1. **Type** (Layout, Interactive, Display, Input, etc.) 2. **Purpose** (What does it do for the user or the interface?) 3. **States** (Possible UI states: Default, Hover, Clicked, Expanded, Loading, etc.) 4. **Interactions** (User actions or system responses: clicking, hovering, dragging, scrolling, etc.) - Features & Functionality: + #### Features & Functionality: - Focus on how these features tie back to user stories, and which **Core Components** are used to achieve them - F#.1. [Feature Name] - Description: [Functionality Overview] @@ -136,23 +136,22 @@ Deliver a single XML-like document that strictly follows the structure above. St `; }, - generateLevel2UXSiteMapStructrePrompt: ( - projectName: string, - platform: string, - ): string => { + generatePagebyPageSiteMapStructrePrompt: (): string => { + const guidelines = prompts.HTML_Guidelines_global_component_prompt(); + return ` You are an expert front-end developer and UX designer. We have two important inputs: -1. A “UX Sitemap Document” that outlines high-level pages, sections, and user flows. -2. A “UX Sitemap Structure” containing blocks for each main page/screen. + 1, Global_component Sections Contain blocks. + 1. A “UX Sitemap Structure” containing blocks for each main page/screen. -Your task is to produce a **page-by-page analysis** that enriches each block with additional detail about layout, components, styling, and interactions, based on these two inputs. +Your task is to produce a **page-by-page analysis** that enriches each block with additional detail about layout, components, styling, and interactions, based on these two inputs. ### Instructions 1. **Output Structure** -Each page **must** follow this format exactly, wrapped in \`\` tags: +Each page **must** follow this format exactly, wrapped in \`\` tags: - + P#. [Page Name] URL Path: /[path] Description: [Brief description of page purpose] @@ -174,25 +173,34 @@ Each page **must** follow this format exactly, wrapped in \`\` tags: - Iconography: - Transitions/Animations: - #### Features & Functionality - - Focus on how these features tie back to user stories, and which **Core Components** are used to achieve them - F#.1. [Feature Name] - Description: [Brief feature description] - User Stories: [Related user stories from PRD] - Components Used: [Which components implement this feature?] + #### Features & Functionality: + - Focus on how these features tie back to user stories, and which **Core Components** are used to achieve them + - F#.1. [Feature Name] + - Description: [Functionality Overview] + - User Stories: [Relevant user stories from PRD] + - Components Used: [Which UI elements power this feature?] #### Page-Specific User Flows Step-by-step sequences describing user interactions and system responses Flow #. [Flow Name] [Step 1] [Step 2] - + + #### Draft HTML Layout (Focused on Page View) + + [Generated HTML Structure Here] + + - For **Core Components**, use sequential numbering (C1.1, C1.2, etc.). - For **Features**, use sequential numbering (F1.1, F1.2, etc.). -- Keep each \`\` labeled with a **unique** page ID and page number (P1, P2, etc.). +- Keep each \`\` labeled with a **unique** page ID and page number (P1, P2, etc.). + +2. Guidelines for Draft HTML Layout: -2. **Enhance** each page description to include more granular information such as: + ${guidelines} + +3. **Enhance** each page description to include more granular information such as: - **Layout**: Where each component (e.g. header, cards, sidebars) is placed on the page. - **Component Details**: - **Name** (e.g., “Search Bar,” “Recommended Playlists”) @@ -210,22 +218,169 @@ Each page **must** follow this format exactly, wrapped in \`\` tags: - **Features & Functionality**: Link features to the components implementing them. - **Page-Specific User Flows**: Step-by-step sequences describing user interactions and system responses. -3. **Process** - - For each \`\` in the provided UX Sitemap Structure, also consult the “UX Sitemap Document” for higher-level context. - - **Merge** or **add** any missing details, sub-pages, or user journeys not yet reflected in \`\`. +4. **Process** + - For each \`\` in the provided UX Sitemap Structure, also consult the “UX Sitemap Document” for higher-level context. + - **Merge** or **add** any missing details, sub-pages, or user journeys not yet reflected in \`\`. - Provide enough detail that front-end developers have a clear blueprint of layout, styling, and user flows. -4. **Self-Check** - - Does each \`\` block list **all** relevant components with location, style, and interactions? +5. **Self-Check** + - Does each \`\` block list **all** relevant components with location, style, and interactions? - Have you included all user flows from the UX Sitemap Document within the appropriate page? - Are roles, states, or restrictions noted (if any)? - Is the final detail sufficient for developers to build each page without ambiguity? -5. **Final Instructions** +6. **Final Instructions** - **Plain text only** (no Markdown). -- Begin the final document with \`\` and end with \`\`. -- Include one \`\` block per page. If you have global components, add them in \`\` blocks as per your chosen format. +- Include only one \`\` block per page. - Do **not** omit any page or feature. The final result must be **100% complete** and consistent with `; }, + + generateGlobalComponentPagebyPageSiteMapStructrePrompt: (): string => { + return ` + You are an expert front-end developer and UX designer. We have one important inputs: + + A "UX Sitemap Structure" containing blocks for each main component. + +Your task is to produce a component-by-component analysis that enriches each block with additional detail about layout, components, styling, and interactions, based on these inputs. +Instructions + + Output Structure: + +Each must follow this format exactly, wrapped in tags: + + + G#. [Component Name] + Authentication Conditions: + - [Condition 1]: [Description of behavior for logged-in/logged-out users] + Elements: + - [Element Name]: + 1. **Type** (e.g., Layout, Interactive, Display, Input, etc.) + 2. **Purpose** (What does it do for the user or the interface?) + 3. **States** (Possible UI states: Default, Hover, Clicked, Expanded, Loading, etc.) + 4. **Interactions** (User actions or system responses: clicking, hovering, dragging, scrolling, etc.) + 5. **Location** (e.g., Header bar, Left sidebar, Main content section) + 6. **Component Style**: + - **Color & Theming**: Primary color, background/foreground contrasts, brand highlights, etc. + - **Fonts & Typography**: Font family, size, weight, line-height if relevant. + - **Dimensions & Spacing**: Approximate width/height (e.g., “a 300px-wide sidebar”), margins/paddings. + - **Iconography**: If icons are used, note icon style or library (e.g., Material Icons, FontAwesome). + - **Transitions/Animations**: Relevant hover or click animations. + + #### Draft HTML Layout (Focused on Component View) + + [Generated HTML Structure Here] + + + + For Elements, use sequential numbering (E1.1, E1.2, etc.). + For Features, use sequential numbering (F1.1, F1.2, etc.). + Each block must be labeled with a unique ID and component number (G1, G2, etc.). + + Enhance Each Component Description + + Include granular details: + Layout: Placement on the page (header, sidebar, main content, footer, etc.). + Component Details: + Name + Type + Purpose + States + Interactions + Location + Component Style (Color, Fonts, Dimensions, Iconography, Transitions/Animations) + + Guidelines for Draft HTML Layout: + ${prompts.HTML_Guidelines_global_component_prompt} + + Self-Check + Does each block include all relevant components with their details? + Are features tied back to the user stories and corresponding components? + Are all roles, states, or restrictions clearly noted? + Is the final output detailed enough for developers to implement the design without ambiguity? + + Final Output + Plain text only. + Include only one block. + Ensure that no html, xml, or other declarations appear in the output. + Do not omit any component or feature. Ensure the final result is 100% complete and consistent. + + `; + }, + + HTML_Guidelines_Page_view_Prompt: (): string => { + return ` + + Structure and Hierarchy + Use semantic HTML5 tags to represent the structure: +
for the top navigation or page intro. +
for the main content. +
for distinct content groups. +