From 76913bb27756d3d6c66dbe5294fb5cc07b33f871 Mon Sep 17 00:00:00 2001 From: Vladimir Kubantsev Date: Tue, 21 Jul 2026 10:31:18 +0300 Subject: [PATCH 01/13] feat(examples/ingress): initial commit --- examples/ingress/.gitignore | 5 + examples/ingress/.prettierrc.js | 1 + examples/ingress/.stylelintrc.json | 7 + examples/ingress/README.md | 3 + examples/ingress/app-builder.config.ts | 16 + examples/ingress/eslint.config.mjs | 36 + examples/ingress/package.json | 36 + examples/ingress/src/server/index.ts | 27 + examples/ingress/src/server/tsconfig.json | 9 + .../ingress/src/ui/components/App/App.tsx | 9 + examples/ingress/src/ui/components/index.ts | 1 + .../ingress/src/ui/entries/ingress-app.tsx | 8 + examples/ingress/src/ui/tsconfig.json | 10 + examples/ingress/src/ui/types/assets.d.ts | 2 + examples/ingress/tsconfig.json | 11 + package.json | 11 +- pnpm-lock.yaml | 2301 ++++++++++++++++- 17 files changed, 2456 insertions(+), 37 deletions(-) create mode 100644 examples/ingress/.gitignore create mode 100644 examples/ingress/.prettierrc.js create mode 100644 examples/ingress/.stylelintrc.json create mode 100644 examples/ingress/README.md create mode 100644 examples/ingress/app-builder.config.ts create mode 100644 examples/ingress/eslint.config.mjs create mode 100644 examples/ingress/package.json create mode 100644 examples/ingress/src/server/index.ts create mode 100644 examples/ingress/src/server/tsconfig.json create mode 100644 examples/ingress/src/ui/components/App/App.tsx create mode 100644 examples/ingress/src/ui/components/index.ts create mode 100644 examples/ingress/src/ui/entries/ingress-app.tsx create mode 100644 examples/ingress/src/ui/tsconfig.json create mode 100644 examples/ingress/src/ui/types/assets.d.ts create mode 100644 examples/ingress/tsconfig.json diff --git a/examples/ingress/.gitignore b/examples/ingress/.gitignore new file mode 100644 index 0000000..71d4a34 --- /dev/null +++ b/examples/ingress/.gitignore @@ -0,0 +1,5 @@ +node_modules +dist +build +.env +.DS_Store diff --git a/examples/ingress/.prettierrc.js b/examples/ingress/.prettierrc.js new file mode 100644 index 0000000..5da9c2e --- /dev/null +++ b/examples/ingress/.prettierrc.js @@ -0,0 +1 @@ +module.exports = require('@gravity-ui/prettier-config'); diff --git a/examples/ingress/.stylelintrc.json b/examples/ingress/.stylelintrc.json new file mode 100644 index 0000000..1e62d01 --- /dev/null +++ b/examples/ingress/.stylelintrc.json @@ -0,0 +1,7 @@ +{ + "extends": [ + "@gravity-ui/stylelint-config", + "@gravity-ui/stylelint-config/order", + "@gravity-ui/stylelint-config/prettier" + ] +} diff --git a/examples/ingress/README.md b/examples/ingress/README.md new file mode 100644 index 0000000..70bacba --- /dev/null +++ b/examples/ingress/README.md @@ -0,0 +1,3 @@ +# ingress + +Bootstrapped with @gravity-ui/create. diff --git a/examples/ingress/app-builder.config.ts b/examples/ingress/app-builder.config.ts new file mode 100644 index 0000000..26ad769 --- /dev/null +++ b/examples/ingress/app-builder.config.ts @@ -0,0 +1,16 @@ +import type {ServiceConfig} from '@gravity-ui/app-builder'; +const port = process.env.APP_PORT ? Number(process.env.APP_PORT) : 3030; + +export default (): ServiceConfig => { + return { + client: { + newJsxTransform: true, + devServer: { + port: port + 1, + }, + }, + server: { + port, + }, + }; +}; diff --git a/examples/ingress/eslint.config.mjs b/examples/ingress/eslint.config.mjs new file mode 100644 index 0000000..b1646d2 --- /dev/null +++ b/examples/ingress/eslint.config.mjs @@ -0,0 +1,36 @@ +import baseConfig from '@gravity-ui/eslint-config/base'; +import clientConfig from '@gravity-ui/eslint-config/client'; +import importOrderConfig from '@gravity-ui/eslint-config/import-order'; +import serverConfig from '@gravity-ui/eslint-config/server'; +import typescriptConfig from '@gravity-ui/eslint-config/typescript'; +import {defineConfig} from 'eslint/config'; +import globals from 'globals'; + +export default defineConfig( + baseConfig, + importOrderConfig, + { + files: [ + '.prettierrc.js', + 'app-builder.config.ts', + ], + languageOptions: { + globals: { + ...globals.node, + } + } + }, + typescriptConfig, + { + files: ['./src/server/**/*'], + extends: [serverConfig], + }, + { + files: ['./src/ui/**/*'], + extends: [clientConfig], + rules: { + 'react/jsx-uses-react': 'off', + 'react/react-in-jsx-scope': 'off', + }, + }, +); \ No newline at end of file diff --git a/examples/ingress/package.json b/examples/ingress/package.json new file mode 100644 index 0000000..b95273d --- /dev/null +++ b/examples/ingress/package.json @@ -0,0 +1,36 @@ +{ + "name": "ingress", + "version": "0.0.0", + "private": true, + "scripts": { + "typecheck": "tsc -b", + "lint:styles": "stylelint \"**/*.scss\"", + "start": "node dist/server/index.js", + "dev": "app-builder dev", + "build": "NODE_ENV=production app-builder build", + "lint": "eslint", + "prettier": "prettier --list-different ." + }, + "dependencies": { + "@gravity-ui/app-layout": "^2.0.0", + "@gravity-ui/expresskit": "^3.0.0", + "@gravity-ui/nodekit": "^2.0.0", + "@gravity-ui/uikit": "^7.0.0", + "react": "^18.0.0", + "react-dom": "^18.0.0" + }, + "devDependencies": { + "@gravity-ui/app-builder": "workspace:*", + "@gravity-ui/eslint-config": "^4.0.0", + "@gravity-ui/prettier-config": "^1.0.0", + "@gravity-ui/stylelint-config": "^5.0.0", + "@gravity-ui/tsconfig": "^1.0.0", + "@types/react": "^18.0.0", + "@types/react-dom": "^18.0.0", + "eslint": "^9.0.0", + "globals": "^17.0.0", + "prettier": "^3.0.0", + "stylelint": "^16.0.0", + "typescript": "^5.3.0" + } +} diff --git a/examples/ingress/src/server/index.ts b/examples/ingress/src/server/index.ts new file mode 100644 index 0000000..7487a98 --- /dev/null +++ b/examples/ingress/src/server/index.ts @@ -0,0 +1,27 @@ +import {createLayoutPlugin, createRenderFunction} from '@gravity-ui/app-layout'; +import {ExpressKit} from '@gravity-ui/expresskit'; +import {NodeKit} from '@gravity-ui/nodekit'; + +const nodekit = new NodeKit({}); + +const port = process.env.APP_PORT ? Number(process.env.APP_PORT) : 3030; + +const renderLayout = createRenderFunction([ + createLayoutPlugin({ + manifest: 'dist/public/build/assets-manifest.json', + publicPath: `http://localhost:${port + 1}/build/`, + }), +]); + +const app = new ExpressKit(nodekit, { + 'GET /': (_, res) => { + res.send( + renderLayout({ + title: 'ingress', + pluginsOptions: {layout: {name: 'ingress-app'}}, + }), + ); + }, +}); + +app.run(); diff --git a/examples/ingress/src/server/tsconfig.json b/examples/ingress/src/server/tsconfig.json new file mode 100644 index 0000000..a5d0ace --- /dev/null +++ b/examples/ingress/src/server/tsconfig.json @@ -0,0 +1,9 @@ +{ + "extends": "@gravity-ui/tsconfig", + "compilerOptions": { + "composite": true, + "outDir": "../../dist/server", + "rootDir": "." + }, + "include": ["**/*"] +} diff --git a/examples/ingress/src/ui/components/App/App.tsx b/examples/ingress/src/ui/components/App/App.tsx new file mode 100644 index 0000000..1dfaf07 --- /dev/null +++ b/examples/ingress/src/ui/components/App/App.tsx @@ -0,0 +1,9 @@ +import {ThemeProvider} from '@gravity-ui/uikit'; + +export function App() { + return ( + +

Hello, Gravity UI!

+
+ ); +} diff --git a/examples/ingress/src/ui/components/index.ts b/examples/ingress/src/ui/components/index.ts new file mode 100644 index 0000000..bd26883 --- /dev/null +++ b/examples/ingress/src/ui/components/index.ts @@ -0,0 +1 @@ +export {App} from './App/App'; diff --git a/examples/ingress/src/ui/entries/ingress-app.tsx b/examples/ingress/src/ui/entries/ingress-app.tsx new file mode 100644 index 0000000..05450e4 --- /dev/null +++ b/examples/ingress/src/ui/entries/ingress-app.tsx @@ -0,0 +1,8 @@ +import {createRoot} from 'react-dom/client'; + +import {App} from '../components'; + +import '@gravity-ui/uikit/styles/fonts.css'; +import '@gravity-ui/uikit/styles/styles.css'; + +createRoot(document.getElementById('root')!).render(); diff --git a/examples/ingress/src/ui/tsconfig.json b/examples/ingress/src/ui/tsconfig.json new file mode 100644 index 0000000..5773c34 --- /dev/null +++ b/examples/ingress/src/ui/tsconfig.json @@ -0,0 +1,10 @@ +{ + "extends": "@gravity-ui/tsconfig", + "compilerOptions": { + "composite": true, + "outDir": "../../dist/ui", + "rootDir": ".", + "jsx": "react-jsx" + }, + "include": ["**/*"] +} diff --git a/examples/ingress/src/ui/types/assets.d.ts b/examples/ingress/src/ui/types/assets.d.ts new file mode 100644 index 0000000..875203d --- /dev/null +++ b/examples/ingress/src/ui/types/assets.d.ts @@ -0,0 +1,2 @@ +declare module '*.css'; +declare module '*.scss'; diff --git a/examples/ingress/tsconfig.json b/examples/ingress/tsconfig.json new file mode 100644 index 0000000..74c0981 --- /dev/null +++ b/examples/ingress/tsconfig.json @@ -0,0 +1,11 @@ +{ + "files": [], + "references": [ + { + "path": "./src/ui" + }, + { + "path": "./src/server" + } + ] +} diff --git a/package.json b/package.json index 7e2e556..7b6e7a0 100644 --- a/package.json +++ b/package.json @@ -235,7 +235,16 @@ "postcss-preset-env": "~9.1.3", "webpack": "~5.95.0", "@types/minimatch": "~5.1.2" - } + }, + "ignoredBuiltDependencies": [ + "@parcel/watcher", + "@sentry/cli", + "@swc/core", + "core-js", + "core-js-pure", + "protobufjs", + "unrs-resolver" + ] }, "nano-staged": { "*.{js,ts}": [ diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 28591a9..5a76a73 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -394,7 +394,7 @@ importers: version: 4.1.5 postcss-load-config: specifier: ^6.0.1 - version: 6.0.1(jiti@2.6.1)(postcss@8.5.8) + version: 6.0.1(jiti@2.6.1)(postcss@8.5.8)(yaml@2.9.0) prettier: specifier: 3.3.3 version: 3.3.3 @@ -408,6 +408,64 @@ importers: specifier: ^29.1.2 version: 29.4.6(@babel/core@7.29.0)(@jest/transform@29.7.0)(@jest/types@30.3.0)(babel-jest@29.7.0(@babel/core@7.29.0))(jest-util@30.3.0)(jest@29.7.0(@types/node@18.19.130)(ts-node@10.9.2(@swc/core@1.15.5)(@types/node@18.19.130)(typescript@5.6.3)))(typescript@5.6.3) + examples/ingress: + dependencies: + '@gravity-ui/app-layout': + specifier: ^2.0.0 + version: 2.5.1 + '@gravity-ui/expresskit': + specifier: ^3.0.0 + version: 3.1.3(@gravity-ui/nodekit@2.16.0(axios@1.14.0)) + '@gravity-ui/nodekit': + specifier: ^2.0.0 + version: 2.16.0(axios@1.14.0) + '@gravity-ui/uikit': + specifier: ^7.0.0 + version: 7.46.0(@babel/runtime@7.29.2)(@types/react@18.3.28)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + react: + specifier: ^18.0.0 + version: 18.3.1 + react-dom: + specifier: ^18.0.0 + version: 18.3.1(react@18.3.1) + devDependencies: + '@gravity-ui/app-builder': + specifier: workspace:* + version: link:../.. + '@gravity-ui/eslint-config': + specifier: ^4.0.0 + version: 4.3.2(eslint@9.39.5(jiti@2.6.1))(prettier@3.3.3)(typescript@5.6.3) + '@gravity-ui/prettier-config': + specifier: ^1.0.0 + version: 1.1.0(prettier@3.3.3) + '@gravity-ui/stylelint-config': + specifier: ^5.0.0 + version: 5.0.0(postcss@8.5.8)(prettier@3.3.3)(stylelint@16.26.1(typescript@5.6.3)) + '@gravity-ui/tsconfig': + specifier: ^1.0.0 + version: 1.0.0 + '@types/react': + specifier: ^18.0.0 + version: 18.3.28 + '@types/react-dom': + specifier: ^18.0.0 + version: 18.3.7(@types/react@18.3.28) + eslint: + specifier: ^9.0.0 + version: 9.39.5(jiti@2.6.1) + globals: + specifier: ^17.0.0 + version: 17.7.0 + prettier: + specifier: ^3.0.0 + version: 3.3.3 + stylelint: + specifier: ^16.0.0 + version: 16.26.1(typescript@5.6.3) + typescript: + specifier: ^5.3.0 + version: 5.6.3 + examples/ssr: dependencies: '@babel/runtime': @@ -439,7 +497,7 @@ importers: version: 7.13.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1) zustand: specifier: ^5.0.2 - version: 5.0.12(@types/react@18.3.28)(react@18.3.1) + version: 5.0.12(@types/react@18.3.28)(react@18.3.1)(use-sync-external-store@1.6.0(react@18.3.1)) devDependencies: '@gravity-ui/app-builder': specifier: workspace:* @@ -1299,6 +1357,12 @@ packages: '@borewit/text-codec@0.2.2': resolution: {integrity: sha512-DDaRehssg1aNrH4+2hnj1B7vnUGEjU6OIlyRdkMd0aUdIUvKXrJfXsy8LVtXAy7DRvYVluWbMspsRhz2lcW0mQ==} + '@cacheable/memory@2.2.0': + resolution: {integrity: sha512-CTLKqLItRCEixEAewD3/j9DB3/o96gpTPD4eJ1v+DGOlxZRZncRQkGYqqnAGCscYd6RNeXfGeiuCphsPtqyIfQ==} + + '@cacheable/utils@2.5.0': + resolution: {integrity: sha512-buipgOVDkkPXNR5+xBpDw7Zk2n1EvU7qBJCNUcL7rhQ//kfpOXPAvQ511Os0vpLYJ1pZnvudNytkQt2hst3wqA==} + '@colordx/core@5.0.0': resolution: {integrity: sha512-twwxohWH8hWWh5ZJ5z6ZNn/JyMrq08K+NzxXKVGTpH+XmMPDAYYzqvszc3OPhYhqqxmfnbCSa/YHcS7pCnChmw==} @@ -1406,10 +1470,28 @@ packages: peerDependencies: '@csstools/css-tokenizer': ^2.4.1 + '@csstools/css-parser-algorithms@3.0.5': + resolution: {integrity: sha512-DaDeUkXZKjdGhgYaHNJTV9pV7Y9B3b644jCLs9Upc3VeNGg6LWARAT6O+Q+/COo+2gg/bM5rhpMAtf70WqfBdQ==} + engines: {node: '>=18'} + peerDependencies: + '@csstools/css-tokenizer': ^3.0.4 + + '@csstools/css-syntax-patches-for-csstree@1.1.6': + resolution: {integrity: sha512-TcJCWFbXLPpJYq6z7bfOyjWYJDiDg2/I4gyUC9pqPNqHFRIey0EB0q0L5cSnQDfWJg8Jd6VadakxdIez/3zkqQ==} + peerDependencies: + css-tree: ^3.2.1 + peerDependenciesMeta: + css-tree: + optional: true + '@csstools/css-tokenizer@2.4.1': resolution: {integrity: sha512-eQ9DIktFJBhGjioABJRtUucoWR2mwllurfnM8LuNGAqX3ViZXaUchqk+1s7jjtkFiT9ySdACsFEA3etErkALUg==} engines: {node: ^14 || ^16 || >=18} + '@csstools/css-tokenizer@3.0.4': + resolution: {integrity: sha512-Vd/9EVDiu6PPJt9yAh6roZP6El1xHrdvIVGjyBsHR0RYwNHgL7FJPyIIW4fANJNG6FtyZfvlRPpFI4ZM/lubvw==} + engines: {node: '>=18'} + '@csstools/media-query-list-parser@2.1.13': resolution: {integrity: sha512-XaHr+16KRU9Gf8XLi3q8kDlI18d5vzKSKCY510Vrtc9iNR0NJzbY9hhTmwhzYZj/ZwGL4VmB3TA9hJW0Um2qFA==} engines: {node: ^14 || ^16 || >=18} @@ -1417,6 +1499,13 @@ packages: '@csstools/css-parser-algorithms': ^2.7.1 '@csstools/css-tokenizer': ^2.4.1 + '@csstools/media-query-list-parser@4.0.3': + resolution: {integrity: sha512-HAYH7d3TLRHDOUQK4mZKf9k9Ph/m8Akstg66ywKR4SFAigjs3yBiUeZtFxywiTm5moZMAp/5W/ZuFnNXXYLuuQ==} + engines: {node: '>=18'} + peerDependencies: + '@csstools/css-parser-algorithms': ^3.0.5 + '@csstools/css-tokenizer': ^3.0.4 + '@csstools/postcss-cascade-layers@4.0.6': resolution: {integrity: sha512-Xt00qGAQyqAODFiFEJNkTpSUz5VfYqnDLECdlA/Vv17nl/OIV5QfTRHGAXrBGG5YcJyHpJ+GF9gF/RZvOQz4oA==} engines: {node: ^14 || ^16 || >=18} @@ -1579,6 +1668,12 @@ packages: peerDependencies: postcss-selector-parser: ^6.0.13 + '@csstools/selector-specificity@5.0.0': + resolution: {integrity: sha512-PCqQV3c4CoVm3kdPhyeZ07VmBRdH2EpMFA/pd9OASpOEC3aXNGoqPDAZ80D0cLpMBxnmk0+yNhGsEx31hq7Gtw==} + engines: {node: '>=18'} + peerDependencies: + postcss-selector-parser: ^7.0.0 + '@csstools/utilities@1.0.0': resolution: {integrity: sha512-tAgvZQe/t2mlvpNosA4+CkMiZ2azISW5WPAcdSalZlEjQvUfghHxfQcrCiK/7/CrfAWVxyM88kGFYO82heIGDg==} engines: {node: ^14 || ^16 || >=18} @@ -1593,6 +1688,9 @@ packages: resolution: {integrity: sha512-yuctPJs5lRXoI8LkpVZGAV6n+DKOuEsfpfcIDQ8ZjWHwazqk1QjBc4jMlof0UlZHyUqv4dwsOTooMiAmtzvwXA==} engines: {node: ^10 || ^12.20.0 || ^14.13.0 || >=15.0.0} + '@dual-bundle/import-meta-resolve@4.2.1': + resolution: {integrity: sha512-id+7YRUgoUX6CgV0DtuhirQWodeeA7Lf4i2x71JS/vtA5pRb/hIGWlw+G6MeXvsM+MXrz0VAydTGElX1rAfgPg==} + '@emnapi/core@1.9.1': resolution: {integrity: sha512-mukuNALVsoix/w1BJwFzwXBN/dHeejQtuVzcDsfOEsdpCumXb/E9j8w11h5S54tT1xhifGfbbSm/ICrObRb3KA==} @@ -1602,6 +1700,10 @@ packages: '@emnapi/wasi-threads@1.2.0': resolution: {integrity: sha512-N10dEJNSsUx41Z6pZsXU8FjPjpBEplgH24sfkmITrBED1/U2Esum9F3lfLrMjKHHjmi557zQn7kR9R+XWXu5Rg==} + '@es-joy/jsdoccomment@0.50.2': + resolution: {integrity: sha512-YAdE/IJSpwbOTiaURNCKECdAwqrJuFiZhylmesBcIRawtYKnBR2wxPhoIewMg+Yu+QuYvHfJNReWpoxGBKOChA==} + engines: {node: '>=18'} + '@eslint-community/eslint-utils@4.9.1': resolution: {integrity: sha512-phrYmNiYppR7znFEdqgfWHXR6NCkZEK7hwWDHZUjit/2/U0r6XvkDl0SYnoM51Hq7FhCGdLDT6zxCCOY1hexsQ==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} @@ -1612,17 +1714,69 @@ packages: resolution: {integrity: sha512-EriSTlt5OC9/7SXkRSCAhfSxxoSUgBm33OH+IkwbdpgoqsSsUg7y3uh+IICI/Qg4BBWr3U2i39RpmycbxMq4ew==} engines: {node: ^12.0.0 || ^14.0.0 || >=16.0.0} + '@eslint/config-array@0.21.2': + resolution: {integrity: sha512-nJl2KGTlrf9GjLimgIru+V/mzgSK0ABCDQRvxw5BjURL7WfH5uoWmizbH7QB6MmnMBd8cIC9uceWnezL1VZWWw==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + + '@eslint/config-helpers@0.4.2': + resolution: {integrity: sha512-gBrxN88gOIf3R7ja5K9slwNayVcZgK6SOUORm2uBzTeIEfeVaIhOpCtTox3P6R7o2jLFwLFTLnC7kU/RGcYEgw==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + + '@eslint/core@0.17.0': + resolution: {integrity: sha512-yL/sLrpmtDaFEiUj1osRP4TI2MDz1AddJL+jZ7KSqvBuliN4xqYY54IfdN8qD8Toa6g1iloph1fxQNkjOxrrpQ==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + '@eslint/eslintrc@2.1.4': resolution: {integrity: sha512-269Z39MS6wVJtsoUl10L60WdkhJVdPG24Q4eZTH3nnF6lpvSShEK3wQjDX9JRWAUPvPh7COouPpU9IrqaZFvtQ==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + '@eslint/eslintrc@3.3.6': + resolution: {integrity: sha512-l2Ul9PrHsPCKcEY/ac7VgFj9D80C7S68sOKc618SyHDPK36s1XcFebXY0iTzUVn4Yq+YbwvSnDmCz9yxjX+QrA==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + '@eslint/js@8.57.1': resolution: {integrity: sha512-d9zaMRSTIKDLhctzH12MtXvJKSSUhaHcjV+2Z+GK+EEY7XKpP5yR4x+N3TAcHTcu963nIr+TMcCb4DBCYX1z6Q==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + '@eslint/js@9.39.5': + resolution: {integrity: sha512-QywQuszQh77pIXCsq998c8hbhSTI/azTty1Z6N53dmAudKHhy573j3yvRLsX2BSp8YpLtoCEG8E9DJe+8zUh4A==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + + '@eslint/object-schema@2.1.7': + resolution: {integrity: sha512-VtAOaymWVfZcmZbp6E2mympDIHvyjXs/12LqWYjVw6qjrfF+VK+fyG33kChz3nnK+SU5/NeHOqrTEHS8sXO3OA==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + + '@eslint/plugin-kit@0.4.1': + resolution: {integrity: sha512-43/qtrDUokr7LJqoF2c3+RInu/t4zfrpYdoSDfYyhg52rwLV6TnOvdG4fXm7IkSB3wErkcmJS9iEhjVtOSEjjA==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + '@fastify/deepmerge@1.3.0': resolution: {integrity: sha512-J8TOSBq3SoZbDhM9+R/u77hP93gz/rajSA+K2kGyijPpORPWUXHUpTaleoj+92As0S9uPRP7Oi8IqMf0u+ro6A==} + '@floating-ui/core@1.8.0': + resolution: {integrity: sha512-0CIZ5itps/8x7BG8dEIhs53BvCUH2PCoogtakwRTut+Arm58sJooJ0AuZhLw2HJYIR5cMLNPBSS728sPho2khQ==} + + '@floating-ui/dom@1.8.0': + resolution: {integrity: sha512-yXSrzeHZBTZadLOlfyhCkJHNeLJnHRnRInwdZ40L7ZiaAtrBwoYlsDrX3v5zB1Utk7CLfzcOVnVVWoXEky7Ceg==} + + '@floating-ui/react-dom@2.1.9': + resolution: {integrity: sha512-JDjEFGCpImxDCA7JJKviA0M9+RtmJdj0m/NVU5IMgBK+AmZouAQQ7/+2GLH0GXXY0YMw9oXPB8hKdbPYg5QLYg==} + peerDependencies: + react: '>=16.8.0' + react-dom: '>=16.8.0' + + '@floating-ui/react@0.27.20': + resolution: {integrity: sha512-CMqMy7OaXl9W0eq1Uy7L7i2Y/anPvHmFmESd2CEw0t5YvZhcVCeo4MBevAmswRllX7Y2dEidA4ozGPunLSTQpw==} + peerDependencies: + react: '>=17.0.0' + react-dom: '>=17.0.0' + + '@floating-ui/utils@0.2.12': + resolution: {integrity: sha512-HpCo8tmWzLVad5s2d19EhAz5zqrrQ6s69qd6moPMQvkOuSwDT1YgRfWSVuc4ennqrgv3OHppiOGMQ7oC13yIww==} + + '@gravity-ui/app-layout@2.5.1': + resolution: {integrity: sha512-AOj0h2mmXAg5qLbBCpwl0TWFEd9BpXLFfiY4VB015Iiv5sqXwn2gTb5Zgql43nf4zau8x20q8XJrn7f/xt1OcA==} + '@gravity-ui/eslint-config@3.3.0': resolution: {integrity: sha512-T9Ou43FiZFJn1qHX0lFBonxXGdRlil4wLdxMovtWlQXkqw8uNStI6SVhxY8ZnIwK8assUpXD7ER/4s7382TwjA==} peerDependencies: @@ -1632,6 +1786,23 @@ packages: prettier: optional: true + '@gravity-ui/eslint-config@4.3.2': + resolution: {integrity: sha512-jdZlIW+EQ/cMOMGktpjakLd4okEqBy0Es3Zm39mNRf/yHBSlQ70xDmdJaw53MnV65bDN+UXy3GCyslFKF364jg==} + peerDependencies: + prettier: ^3.0.0 + typescript: '>=4.8.4 <6.1.0' + peerDependenciesMeta: + prettier: + optional: true + typescript: + optional: true + + '@gravity-ui/expresskit@3.1.3': + resolution: {integrity: sha512-t1aE91RMk08KK+MgwweOWTM6/XvNc1VDOLr7BrQsyRBojCaYX7DXfGrlfO6l3BEKao/r+/jdYVRJSKYjvV5+LA==} + engines: {node: '>=20'} + peerDependencies: + '@gravity-ui/nodekit': ^1.6.0 || ^2.0.0 + '@gravity-ui/i18n@1.8.0': resolution: {integrity: sha512-bVt/UGjL96Naw0h03QW+3z2tf6t4zvLh1j+eFzpdLlAIMeNu0dRjxn4X6EGtwhwKrfMyIfrlOqmLSroXtCNQAw==} @@ -1643,6 +1814,12 @@ packages: react: optional: true + '@gravity-ui/nodekit@2.16.0': + resolution: {integrity: sha512-s7em3YEnfLW67s6J0fSMnG7Am+v6pY6GLwdXkLmkG5DwK9iNBjDiVLIR5hLFs3G98bi+hCzEYlGsdpmJ8Nvv5w==} + engines: {node: '>=20'} + peerDependencies: + axios: ^1.7.7 + '@gravity-ui/prettier-config@1.1.0': resolution: {integrity: sha512-Q97lMSOqdAf337qblkq06mLgK9OEEGglPAj8ncs3WnaZ2rBtOxtNsCIubv5U64TZkxaNPzxd7rDL24VIv1sxJg==} peerDependencies: @@ -1658,6 +1835,17 @@ packages: prettier: optional: true + '@gravity-ui/stylelint-config@5.0.0': + resolution: {integrity: sha512-Vri4SZnnId2Gf5NtNVwRXFaHq1ZOqhQYRXUsct8uHwdp2yjJjiyvXfKfuR6k/8FpsqMcK9wK+20PB73CBfN3FA==} + engines: {node: '>=20.0.0'} + peerDependencies: + postcss: ^8.0.0 + prettier: ^3.0.0 + stylelint: ^16.18.0 + peerDependenciesMeta: + prettier: + optional: true + '@gravity-ui/tsconfig@1.0.0': resolution: {integrity: sha512-C7uWrCTD6g+rvSFYTPaOMMf4YUWyA5eRSXsJ1AsigGc7yQC/lhugGNqeUo5efz+zpmZ80oG/BIJPCx0nIZizDg==} @@ -1667,6 +1855,39 @@ packages: react: ^16.14.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 react-dom: ^16.14.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 + '@gravity-ui/uikit@7.46.0': + resolution: {integrity: sha512-61wyeaQHPkFKmMTCgZNUySz7FK9hwkx8VjgThhzRBPT5IiLxAtkeZxt9by9U5wDIfs4wgElEHUX340zyntsSdA==} + peerDependencies: + react: ^16.14.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 + react-dom: ^16.14.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 + + '@grpc/grpc-js@1.14.4': + resolution: {integrity: sha512-k9Dj3DV/itK9D06Y8f190Qgop7/Ui+D0njFV3LHMPwPT75DpXLQohE9Wmz0QElrJnzsjB7KPWiKJbOl7IPDArQ==} + engines: {node: '>=12.10.0'} + + '@grpc/proto-loader@0.8.1': + resolution: {integrity: sha512-wtF6h+DY6M3YaDBPAmvuuA6jV8Sif9MjtOI5euKFWRgCDl5PeDpPsHR9u2l6St5ceY8AZgoNDww5+HvEsXFsGg==} + engines: {node: '>=6'} + hasBin: true + + '@hello-pangea/dnd@18.0.1': + resolution: {integrity: sha512-xojVWG8s/TGrKT1fC8K2tIWeejJYTAeJuj36zM//yEm/ZrnZUSFGS15BpO+jGZT1ybWvyXmeDJwPYb4dhWlbZQ==} + peerDependencies: + react: ^18.0.0 || ^19.0.0 + react-dom: ^18.0.0 || ^19.0.0 + + '@humanfs/core@0.19.2': + resolution: {integrity: sha512-UhXNm+CFMWcbChXywFwkmhqjs3PRCmcSa/hfBgLIb7oQ5HNb1wS0icWsGtSAUNgefHeI+eBrA8I1fxmbHsGdvA==} + engines: {node: '>=18.18.0'} + + '@humanfs/node@0.16.8': + resolution: {integrity: sha512-gE1eQNZ3R++kTzFUpdGlpmy8kDZD/MLyHqDwqjkVQI0JMdI1D51sy1H958PNXYkM2rAac7e5/CnIKZrHtPh3BQ==} + engines: {node: '>=18.18.0'} + + '@humanfs/types@0.15.0': + resolution: {integrity: sha512-ZZ1w0aoQkwuUuC7Yf+7sdeaNfqQiiLcSRbfI08oAxqLtpXQr9AIVX7Ay7HLDuiLYAaFPu8oBYNq/QIi9URHJ3Q==} + engines: {node: '>=18.18.0'} + '@humanwhocodes/config-array@0.13.0': resolution: {integrity: sha512-DZLEEqFWQFiyK6h5YIeynKx7JlvCYWL0cImfSRXZ9l4Sg2efkFGTuFf6vzXjK1cq6IYkU+Eg/JizXw+TD2vRNw==} engines: {node: '>=10.10.0'} @@ -1680,6 +1901,10 @@ packages: resolution: {integrity: sha512-93zYdMES/c1D69yZiKDBj0V24vqNzB/koF26KPaagAfd3P/4gUlh3Dys5ogAK+Exi9QyzlD8x/08Zt7wIKcDcA==} deprecated: Use @eslint/object-schema instead + '@humanwhocodes/retry@0.4.3': + resolution: {integrity: sha512-bV0Tgo9K4hfPCek+aMAn81RppFKv2ySDQeMoSZuvTASywNTnVJCArCZE2FWqpvIatKu7VMRLWlR1EazvVhDyhQ==} + engines: {node: '>=18.18'} + '@isaacs/cliui@8.0.2': resolution: {integrity: sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==} engines: {node: '>=12'} @@ -1792,6 +2017,9 @@ packages: '@jridgewell/trace-mapping@0.3.9': resolution: {integrity: sha512-3Belt6tdc8bPgAtbcmdtNJlirVoTmEb5e2gC94PnkwEW9jI6CAHUeoG85tjWP5WquqfavoMtMwiG4P926ZKKuQ==} + '@js-sdsl/ordered-map@4.4.2': + resolution: {integrity: sha512-iUKgm52T8HOE/makSxjqoWhe95ZJA1/G1sYsGev2JDKUSS14KAgg1LHb+Ba+IPow0xflbnSkOsZcO08C7w1gYw==} + '@jsonjoy.com/base64@1.1.2': resolution: {integrity: sha512-q6XAnWQDIMA3+FTiOYajoYqySkO+JSat0ytXGSuRdq9uXE7o92gzuQwQM14xaCRlBLGq3v5miDGC4vkVTn54xA==} engines: {node: '>=10.0'} @@ -1912,6 +2140,15 @@ packages: peerDependencies: tslib: '2' + '@keyv/bigmap@1.3.1': + resolution: {integrity: sha512-WbzE9sdmQtKy8vrNPa9BRnwZh5UF4s1KTmSK0KUVLo3eff5BlQNNWDnFOouNpKfPKDnms9xynJjsMYjMaT/aFQ==} + engines: {node: '>= 18'} + peerDependencies: + keyv: ^5.6.0 + + '@keyv/serialize@1.1.1': + resolution: {integrity: sha512-dXn3FZhPv0US+7dtJsIi2R+c7qWYiReoEh5zUntWCf4oSpMNib8FDhSoed6m3QyZdx5hK7iLFkYk3rNxwt8vTA==} + '@leichtgewicht/ip-codec@2.0.5': resolution: {integrity: sha512-Vo+PSpZG2/fmgmiNzYK9qWRh8h/CHrwD0mo1h1DzL4yzHNSfWYujGTYsWGreD000gcgmZ7K4Ys6Tx9TxtsKdDw==} @@ -2159,6 +2396,190 @@ packages: '@okikio/sharedworker@1.1.0': resolution: {integrity: sha512-Xj9TUWll9mhARsKu5DtlQCjRekfJfQ2E291ow6gmXIz+WuF6uJMH8ZmGhdRTx/ndOippHnm1j/vxXNjmR6JuXw==} + '@opentelemetry/api-logs@0.218.0': + resolution: {integrity: sha512-fmEWp5kXlGEc3i/lR698Hz41DfGyN4Tbe4g7L1AxSc7fF8Xeh/FQ9Quqpa9dVA413Q1Ad43QOLzU4JoXgbFPWw==} + engines: {node: '>=8.0.0'} + + '@opentelemetry/api-logs@0.219.0': + resolution: {integrity: sha512-FFx7YnaYJlIjqWW/AG/yAZ0L/NEY724PipXXXQLdtZPbLwBGbUMTGL1i/esI56TWfTUXxhLfpgrnWJCG8aUJyg==} + engines: {node: '>=8.0.0'} + + '@opentelemetry/api@1.9.1': + resolution: {integrity: sha512-gLyJlPHPZYdAk1JENA9LeHejZe1Ti77/pTeFm/nMXmQH/HFZlcS/O2XJB+L8fkbrNSqhdtlvjBVjxwUYanNH5Q==} + engines: {node: '>=8.0.0'} + + '@opentelemetry/configuration@0.219.0': + resolution: {integrity: sha512-wXZUYv4ngu43nA4WEhuXNacm46LW+17LRM8nKyIhBzroRA24PBYjMnakwzR/w777nFUB5xlgsYTTeuXxumZM1Q==} + engines: {node: ^18.19.0 || >=20.6.0} + peerDependencies: + '@opentelemetry/api': ^1.9.0 + + '@opentelemetry/context-async-hooks@2.8.0': + resolution: {integrity: sha512-/3FIraneMcng67SUJCxvyInk/oxzwsxyadufk0wwfOBLf5wqtAGX4MoQASwSbndBPeARzBryUM9Azr5kHIdWLw==} + engines: {node: ^18.19.0 || >=20.6.0} + peerDependencies: + '@opentelemetry/api': '>=1.0.0 <1.10.0' + + '@opentelemetry/core@2.8.0': + resolution: {integrity: sha512-hd1Lfh8p545nNz+jq1Ejfz+Mn1hyLuxYn1YzTfFNrxr8urEWMNQLPf1Th8kjOH+HxwawCrtgBp8JpBUR4ZSgww==} + engines: {node: ^18.19.0 || >=20.6.0} + peerDependencies: + '@opentelemetry/api': '>=1.0.0 <1.10.0' + + '@opentelemetry/core@2.9.0': + resolution: {integrity: sha512-m2nckMT80NnmjTYSPjJQObBJ+8dgkoajEOUbznL8AHZ3T3yHRk2P7gI1PhEBc1+lOnrYE9UWrWHqJDsmqjmNbw==} + engines: {node: ^18.19.0 || >=20.6.0} + peerDependencies: + '@opentelemetry/api': '>=1.0.0 <1.10.0' + + '@opentelemetry/exporter-logs-otlp-grpc@0.219.0': + resolution: {integrity: sha512-7SvzDCIclHWAcCwZ1MTOLcwn4BVNPGI3QxS/DJraPNe1TTL+4TvUBq5zeQV8tsnYvtDN7wKW2qocVmaCP2l7sQ==} + engines: {node: ^18.19.0 || >=20.6.0} + peerDependencies: + '@opentelemetry/api': ^1.3.0 + + '@opentelemetry/exporter-logs-otlp-http@0.219.0': + resolution: {integrity: sha512-mhl2HL6GmZI8b8PwPfqMws/5ovJfbRTxwc9Y5agVVHiQ+e5SL1btsFr/kJDgt7YCexDtsUn5HAreHQO9szFS0A==} + engines: {node: ^18.19.0 || >=20.6.0} + peerDependencies: + '@opentelemetry/api': ^1.3.0 + + '@opentelemetry/exporter-logs-otlp-proto@0.219.0': + resolution: {integrity: sha512-Ayw4Gf71PS9jhBVaYywa4WsajnqfDehMkTdVH3TSAVHqPcsAv/AhH/wTNRYNt99szeYr6Gbd/D6RjZD77wAxHg==} + engines: {node: ^18.19.0 || >=20.6.0} + peerDependencies: + '@opentelemetry/api': ^1.3.0 + + '@opentelemetry/exporter-metrics-otlp-grpc@0.219.0': + resolution: {integrity: sha512-6LaaSrPxK5L55bXevWajvOMxGOpNm0n12tG53TeZaUeNzXwLPg6d2KCC1zAlGsojan+xRG71mA4Qqs9K2VVrKQ==} + engines: {node: ^18.19.0 || >=20.6.0} + peerDependencies: + '@opentelemetry/api': ^1.3.0 + + '@opentelemetry/exporter-metrics-otlp-http@0.219.0': + resolution: {integrity: sha512-6CaDRbMVHZSDWzNXwrR8y/H4B/Z1eMNnkHiPQlTx3Ojz2OHY4X/aff/UC4P/3pHUQSuTfi3oh2UsPPZppw+Vrg==} + engines: {node: ^18.19.0 || >=20.6.0} + peerDependencies: + '@opentelemetry/api': ^1.3.0 + + '@opentelemetry/exporter-metrics-otlp-proto@0.219.0': + resolution: {integrity: sha512-DUS7XyIiEnoeccQUvuKy0G2/YqeKhpN8FVIrGbrLNIVMj10yeIFLRzRv0tibCI2kXXvlTTABVexGAk78wHk2ug==} + engines: {node: ^18.19.0 || >=20.6.0} + peerDependencies: + '@opentelemetry/api': ^1.3.0 + + '@opentelemetry/exporter-prometheus@0.219.0': + resolution: {integrity: sha512-TxOnJ85eWJY5JyOJsNMXiRTYlkDcOv0u3KbXEzWCc+tUS9sjL/BC6BcdxZ0B9r2OFVqsrZFXUzSD2sZUy42Ucw==} + engines: {node: ^18.19.0 || >=20.6.0} + peerDependencies: + '@opentelemetry/api': ^1.3.0 + + '@opentelemetry/exporter-trace-otlp-grpc@0.219.0': + resolution: {integrity: sha512-BkDNv1UD6BscW19MxbAxVmSYSSFuyeqR6buV2/HTYqA7GrR0EbTFzqG6h86T3PtXmpdbsWjMGLDdjG2rikG27Q==} + engines: {node: ^18.19.0 || >=20.6.0} + peerDependencies: + '@opentelemetry/api': ^1.3.0 + + '@opentelemetry/exporter-trace-otlp-http@0.219.0': + resolution: {integrity: sha512-9t6SvBXXBEjOBcIzgozvBbd3jWrv3Gt3ngGhl1fhdZ/zRc7oZDVOFEqbi2zlBpW9BXhgDMKv422J0DL/3iQWfw==} + engines: {node: ^18.19.0 || >=20.6.0} + peerDependencies: + '@opentelemetry/api': ^1.3.0 + + '@opentelemetry/exporter-trace-otlp-proto@0.219.0': + resolution: {integrity: sha512-lF/LUBfhOFmxJa+SQsLN7ziV4MHa2pyKgOM6JNehSOfU+npjM4gwm9oIKEJrzrWcexMcqydiyoFy0XCb1Ql3wQ==} + engines: {node: ^18.19.0 || >=20.6.0} + peerDependencies: + '@opentelemetry/api': ^1.3.0 + + '@opentelemetry/exporter-zipkin@2.8.0': + resolution: {integrity: sha512-Mj84UkEa17BK2o903VTXW3wM8CrSZexGs4tRGVZVIMM9ni1T6TuGx5IrRfoWKAbshx42D5/kc7YV+axypLPYyA==} + engines: {node: ^18.19.0 || >=20.6.0} + peerDependencies: + '@opentelemetry/api': ^1.0.0 + + '@opentelemetry/instrumentation@0.219.0': + resolution: {integrity: sha512-X5t7I8GyIO9rmGHwoedZLREpQqrF1WW2nxzNNym6HOKpFiE+rvqV3ngC0xcZVO2YwIGf3KKmRdWrYwdwz3H9RQ==} + engines: {node: ^18.19.0 || >=20.6.0} + peerDependencies: + '@opentelemetry/api': ^1.3.0 + + '@opentelemetry/otlp-exporter-base@0.219.0': + resolution: {integrity: sha512-zvIxQX/AZUVKDU+hCuYx+7UkiP7GRdnk1ZbFQRYzHvYp47cAWR4j3IhoPhV9KaeXEv2xdGq3IA6PnpzDmLcmSA==} + engines: {node: ^18.19.0 || >=20.6.0} + peerDependencies: + '@opentelemetry/api': ^1.3.0 + + '@opentelemetry/otlp-grpc-exporter-base@0.219.0': + resolution: {integrity: sha512-iIk/s8QQu39zpTrRRmsW/Eg3SE2+Hg8tLWepr2FLRgmwUpNd0IpCTLJEHJ77hpt4hgIS8MAh44UYI4xQPZwWlw==} + engines: {node: ^18.19.0 || >=20.6.0} + peerDependencies: + '@opentelemetry/api': ^1.3.0 + + '@opentelemetry/otlp-transformer@0.219.0': + resolution: {integrity: sha512-aaYKAyXhw9VchKZVGOopD3Gw/kPsyrX2c6IQ0AW32mTjqmZOh5Y6Gf5OYqTNqVktAeBjmFinhyFaCwW6GYK9YQ==} + engines: {node: ^18.19.0 || >=20.6.0} + peerDependencies: + '@opentelemetry/api': ^1.3.0 + + '@opentelemetry/propagator-b3@2.8.0': + resolution: {integrity: sha512-SazlvuSKi5533rPHTW2TwBwdMakhjZST4SYs0YauuvfGDkT13KbG1gJS75hV0uWVeevhtVP9sAIlaZLTHdSbMg==} + engines: {node: ^18.19.0 || >=20.6.0} + peerDependencies: + '@opentelemetry/api': '>=1.0.0 <1.10.0' + + '@opentelemetry/propagator-jaeger@2.8.0': + resolution: {integrity: sha512-Xnz9zZvvQzUw+9DrOn0MomR7BxFCkA2pcfXBQuHC28ndJpSbjLs7knzYb05kw5SyCjSsEWombkZMgGcJSk8JVg==} + engines: {node: ^18.19.0 || >=20.6.0} + peerDependencies: + '@opentelemetry/api': '>=1.0.0 <1.10.0' + + '@opentelemetry/propagator-jaeger@2.9.0': + resolution: {integrity: sha512-4mYGty27rYvSM0jtp1ZUOqd3LfVRCYg9H5G9OFzSx5HViYToU21MFhWfco7x1HwXr7ER8yGOiCIHZUwjPksc0Q==} + engines: {node: ^18.19.0 || >=20.6.0} + peerDependencies: + '@opentelemetry/api': '>=1.0.0 <1.10.0' + + '@opentelemetry/resources@2.8.0': + resolution: {integrity: sha512-qmXQ27ilDbUK/vGMqwL8D4/rhn76C+sherM4wTbjlfknR8Nvfc/hCxjRJPhkzZzUsPiNg16SA31NxMabwttRjg==} + engines: {node: ^18.19.0 || >=20.6.0} + peerDependencies: + '@opentelemetry/api': '>=1.3.0 <1.10.0' + + '@opentelemetry/sdk-logs@0.219.0': + resolution: {integrity: sha512-s6lTKRakaPClvKoWHRChxnXjDMkM/TQ30ff78jN6EBGf7MI7VzANE5PU3f4z9qDUudWjvZjOLHG0rBnBKYvoXA==} + engines: {node: ^18.19.0 || >=20.6.0} + peerDependencies: + '@opentelemetry/api': '>=1.4.0 <1.10.0' + + '@opentelemetry/sdk-metrics@2.8.0': + resolution: {integrity: sha512-UDBGaj6W0Rgy5rTTaoxs8gVGF/aGkAKyjurJv7se6wjRxJu7FoquTLT/vt54DZfo4crbprYfhX/SOK9+BPw1qg==} + engines: {node: ^18.19.0 || >=20.6.0} + peerDependencies: + '@opentelemetry/api': '>=1.9.0 <1.10.0' + + '@opentelemetry/sdk-node@0.219.0': + resolution: {integrity: sha512-NWLpWLEb8gV3+JBHYoIrktbM385wyHpRJoh3J/4Q52d4PR+AlPMNGJT3DzBUrDSUEVbKAXoHR+EDAPxtiNcj8g==} + engines: {node: ^18.19.0 || >=20.6.0} + peerDependencies: + '@opentelemetry/api': '>=1.3.0 <1.10.0' + + '@opentelemetry/sdk-trace-base@2.8.0': + resolution: {integrity: sha512-mhU4jp+vW0mGbFRd+GeXHvmfA4aDqWjBjLC3pE5XMpLs0IE2ryYb019Ts2AQrOq67gaTF25D91+fgvEHDZEnuQ==} + engines: {node: ^18.19.0 || >=20.6.0} + peerDependencies: + '@opentelemetry/api': '>=1.3.0 <1.10.0' + + '@opentelemetry/sdk-trace-node@2.8.0': + resolution: {integrity: sha512-nZt9OGufioAc3AfoLTqA9bsAeaMJAictYDdI2VcNQ+PmT+3rfKjAZDZvgPfd8VPX0O5Bw1hdQF6kDK8VSpZiWg==} + engines: {node: ^18.19.0 || >=20.6.0} + peerDependencies: + '@opentelemetry/api': '>=1.0.0 <1.10.0' + + '@opentelemetry/semantic-conventions@1.43.0': + resolution: {integrity: sha512-eSYWTm620tTk45EKSedaUL8MFYI8hW164hIXsgIHyxu3VobUB3fFCu5t0hQby6OoWRPsG1KkKUG2M5UadiLiVg==} + engines: {node: '>=14'} + '@parcel/watcher-android-arm64@2.5.6': resolution: {integrity: sha512-YQxSS34tPF/6ZG7r/Ih9xy+kP/WwediEUsqmtf0cuCV5TPPKw/PQHRhueUo6JdeFJaqV3pyjm0GdYjZotbRt/A==} engines: {node: '>= 10.0.0'} @@ -2275,6 +2696,9 @@ packages: resolution: {integrity: sha512-C2Xj8FZ0uHWeCXXqX5B4/gVFQmtSkiuOolzAgutjTfseNOHT3pUjljDZsTSxXFGgio54bCzVFqmEOUrIVk8RDA==} engines: {node: '>=20.0.0'} + '@pinojs/redact@0.4.0': + resolution: {integrity: sha512-k2ENnmBugE/rzQfEcdWHcCY+/FM3VLzH9cYEsbdsoqrvzAKRhUZeRNhAZvB8OitQJ1TBed3yqWtdjzS6wJKBwg==} + '@pkgjs/parseargs@0.11.0': resolution: {integrity: sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==} engines: {node: '>=14'} @@ -2315,6 +2739,33 @@ packages: '@popperjs/core@2.11.8': resolution: {integrity: sha512-P1st0aksCrn9sGZhp8GMYwBnQsbvAWsZAX44oXNNvLHGqAOcoVxmjZiohstwQ7SqKnbR47akdNi+uleWD8+g6A==} + '@protobufjs/aspromise@1.1.2': + resolution: {integrity: sha512-j+gKExEuLmKwvz3OgROXtrJ2UG2x8Ch2YZUxahh+s1F2HZ+wAceUNLkvy6zKCPVRkU++ZWQrdxsUeQXmcg4uoQ==} + + '@protobufjs/base64@1.1.2': + resolution: {integrity: sha512-AZkcAA5vnN/v4PDqKyMR5lx7hZttPDgClv83E//FMNhR2TMcLUhfRUBHCmSl0oi9zMgDDqRUJkSxO3wm85+XLg==} + + '@protobufjs/codegen@2.0.5': + resolution: {integrity: sha512-zgXFLzW3Ap33e6d0Wlj4MGIm6Ce8O89n/apUaGNB/jx+hw+ruWEp7EwGUshdLKVRCxZW12fp9r40E1mQrf/34g==} + + '@protobufjs/eventemitter@1.1.1': + resolution: {integrity: sha512-vW1GmwMZNnL+gMRaovlh9yZX74kc+TTU3FObkkurpMaRtBfLP3ldjS9KQWlwZgraRE0+dheEEoAxdzcJQ8eXZg==} + + '@protobufjs/fetch@1.1.1': + resolution: {integrity: sha512-GpptLrs57adMSuHi3VNj0mAF8dwh36LMaYF6XyJ6JMWlVsc+t42tm1HSEDmOs3A8fC9yyeisgLhsTVQokOZ0zw==} + + '@protobufjs/float@1.0.2': + resolution: {integrity: sha512-Ddb+kVXlXst9d+R9PfTIxh1EdNkgoRe5tOX6t01f1lYWOvJnSPDBlG241QLzcyPdoNTsblLUdujGSE4RzrTZGQ==} + + '@protobufjs/path@1.1.2': + resolution: {integrity: sha512-6JOcJ5Tm08dOHAbdR3GrvP+yUUfkjG5ePsHYczMFLq3ZmMkAD98cDgcT2iA1lJ9NVwFd4tH/iSSoe44YWkltEA==} + + '@protobufjs/pool@1.1.0': + resolution: {integrity: sha512-0kELaGSIDBKvcgS4zkjz1PeddatrjYcmMWOlAuAPwAeccUrPHdUqo/J6LiymHHEiJT5NrF1UVwxY14f+fy4WQw==} + + '@protobufjs/utf8@1.1.2': + resolution: {integrity: sha512-b1UQwcEZ4yCnMCD8DAL1VlbvBJE9/IX4FTIp7BG1xYpf29SLazLSrqUkj4w7Y5y7cCVP6E5tcqqcI0xemPkHug==} + '@rsbuild/plugin-check-syntax@1.6.1': resolution: {integrity: sha512-26xtEYN0QjZYoyt0lWnvIztBWjEZJvcfw7MN4f5B4SpNggmnF7F7aNPrgkY3EccXVFx1VGQBhnCkBV//OoS07Q==} peerDependencies: @@ -2840,6 +3291,12 @@ packages: '@statoscope/webpack-ui@5.29.0': resolution: {integrity: sha512-1GqNkph/8XfCIqcGyBsfr+67ZueClu9yeOSP4SCbbNhFBQ91WE4fewgVxY3DNcPh4Ma1gksvSi/tFFpdt8fhNg==} + '@stylistic/eslint-plugin@4.4.1': + resolution: {integrity: sha512-CEigAk7eOLyHvdgmpZsKFwtiqS2wFwI1fn4j09IU9GmD4euFM4jEBAViWeCqaNLlbX2k2+A/Fq9cje4HQBXuJQ==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + peerDependencies: + eslint: '>=9.0.0' + '@svgr/babel-plugin-add-jsx-attribute@8.0.0': resolution: {integrity: sha512-b9MIk7yhdS1pMCZM8VeNfUlSKVRhsHZNMl5O9SfaX0l0t5wjdgu4IDzGB8bpnGBBOjGST3rRFVsaaEtI4W6f7g==} engines: {node: '>=14'} @@ -3011,6 +3468,15 @@ packages: resolution: {integrity: sha512-+PmQX0PiAYPMeVYe237LJAYvOMYW1j2rH5YROyS3b4CTVJum34HfRvKvAzozHAQG0TnHNdUfY9nCeUyRAs//cw==} engines: {node: '>=14.16'} + '@tanstack/react-virtual@3.14.7': + resolution: {integrity: sha512-11uSrj77IDijNBqizD4lY4y1laMyRrqMLSxjnWy5CvWkCjyRDW+gGmxYq0lwQKVas/sq7zyzYWXbL/BvBzR32g==} + peerDependencies: + react: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 + react-dom: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 + + '@tanstack/virtual-core@3.17.5': + resolution: {integrity: sha512-AXfBC3sq6PuYSwyxYORqqgHCNjPGAvKJvZuBBJ1klhztWBB5cgqgwsq8+fNfaQJG7/K4xYBja9S90QFn2zmQAg==} + '@tokenizer/inflate@0.2.7': resolution: {integrity: sha512-MADQgmZT1eKjp06jpI2yozxaU9uVs4GzzgSL+uEq7bVcJ9V1ZXQkeGNql1fsSI0gMy1vhvNTNbUqrx+pZfJVmg==} engines: {node: '>=18'} @@ -3237,6 +3703,9 @@ packages: '@types/uglify-js@3.17.5': resolution: {integrity: sha512-TU+fZFBTBcXj/GpDpDaBmgWk/gn96kMZ+uocaFUlV2f8a6WdMzzI44QBCmGcCiYR0Y6ZlNRiyUyKKt5nl/lbzQ==} + '@types/use-sync-external-store@0.0.6': + resolution: {integrity: sha512-zFDAD+tlpf2r4asuHEj0XH6pY6i0g5NeAHPn+15wk3BV6JA69eERFXC1gyGThDkVa1zCyKr5jox1+2LbV/AMLg==} + '@types/webpack-assets-manifest@5.1.4': resolution: {integrity: sha512-v+OXN5idAs3V6w/szEalQn7PyOV7XQBpngizl9ztmJaSvLjXhp5WyHC5WqvtPDe0lKYskEiZkm1rXH67F49boA==} @@ -3329,6 +3798,156 @@ packages: resolution: {integrity: sha512-XJ9UD9+bbDo4a4epraTwG3TsNPeiB9aShrUneAVXy8q4LuwowN+qu89/6ByLMINqvIMeI9H9hOHQtg/ijrYXzQ==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + '@uiw/color-convert@2.10.3': + resolution: {integrity: sha512-5tIjb4CZzGR7K3Sshswsuuc6FOAFNFwjtF0hkhKH3f+CMauC4Akv7LPq6o9v68S7dIAeKvfj8qWg5Tc2I1TVSA==} + peerDependencies: + '@babel/runtime': '>=7.19.0' + + '@uiw/react-color-alpha@2.10.3': + resolution: {integrity: sha512-82wtNRmEW5uZV2hmw5SYZKPIZjN6aqm8/CZOg8KXfx8eoIqpbjrRBwABggPO/O5Dj2JNAPC4eYyHslE24Pxy8w==} + peerDependencies: + '@babel/runtime': '>=7.19.0' + react: '>=16.9.0' + react-dom: '>=16.9.0' + + '@uiw/react-color-block@2.10.3': + resolution: {integrity: sha512-TVwU/bfpt51kWqL+CcQmocQrRQHAprJL/1IxjH48ZWfLqIQ1TTZVueopGBadc2CYzDygkyTWsmYpkZJZxM9YjQ==} + peerDependencies: + '@babel/runtime': '>=7.19.0' + react: '>=16.9.0' + react-dom: '>=16.9.0' + + '@uiw/react-color-chrome@2.10.3': + resolution: {integrity: sha512-28qmnD19YR1wjzWe62OnwvDRhXrGy/Oq2sg/p+PBUPp8nemvq4sBX9mIToAxHtb2TiSWKCr0JapWwHZveu0tjA==} + peerDependencies: + '@babel/runtime': '>=7.19.0' + react: '>=16.9.0' + react-dom: '>=16.9.0' + + '@uiw/react-color-circle@2.10.3': + resolution: {integrity: sha512-aHO0Xf5AziEQ8PnckxIcGskPPx8Ql7BIaC7+Ngya34TDwDa/kUbEhwohn89TxNZ8ZZhG/uldTDIswMXK8Fe4zA==} + peerDependencies: + '@babel/runtime': '>=7.19.0' + react: '>=16.9.0' + react-dom: '>=16.9.0' + + '@uiw/react-color-colorful@2.10.3': + resolution: {integrity: sha512-hnWr03wKNbJjNEZ4SFnwoeKNMtS2DR7rXsCv0bt17DVdBgYPZmuMTIwAR6nKFExdOwgOwXloP5KGESJYwyp2YQ==} + peerDependencies: + '@babel/runtime': '>=7.19.0' + react: '>=16.9.0' + react-dom: '>=16.9.0' + + '@uiw/react-color-compact@2.10.3': + resolution: {integrity: sha512-iXIG7idhaZ3XNFanKbVfFsL4w2GU5yWRUR+J5L1SzkXar1LTCjx7IDScweEBKnMdpPzDGiS2kTIn5anAif4ZDg==} + peerDependencies: + '@babel/runtime': '>=7.19.0' + react: '>=16.9.0' + react-dom: '>=16.9.0' + + '@uiw/react-color-editable-input-hsla@2.10.3': + resolution: {integrity: sha512-WoWsk52MN6rvxFD1HvNTrrGRmSKwrnp0S7htd4QnKuczlLtn4qfMXVwMARdvnR7ZqC1vn7FXZpVYd+Zh3upd2g==} + peerDependencies: + '@babel/runtime': '>=7.19.0' + react: '>=16.9.0' + react-dom: '>=16.9.0' + + '@uiw/react-color-editable-input-rgba@2.10.3': + resolution: {integrity: sha512-n0kyNTNicRKASJNWYJexfwwfbbwvOJEYGQO8tX4PivmZYQVuYZq/vqsgYG5y+VGrBYZsHFfY+0LtPS4AXlz+Aw==} + peerDependencies: + '@babel/runtime': '>=7.19.0' + react: '>=16.9.0' + react-dom: '>=16.9.0' + + '@uiw/react-color-editable-input@2.10.3': + resolution: {integrity: sha512-QnYNpFI0p8pssYbWxIJwfmUdPwzzX0IXOAl4mU8q1HQNYoXFBGFJ4rXkJSOdauumAfOr4C8RKZlTB4/83EBBPQ==} + peerDependencies: + '@babel/runtime': '>=7.19.0' + react: '>=16.9.0' + react-dom: '>=16.9.0' + + '@uiw/react-color-github@2.10.3': + resolution: {integrity: sha512-BLiI12utcJQMT2Ym4OeYplraHLwUtW7SJQ2IbHQA7YPEU9FYqchHv1P/6DJBZi98gFqWFll+7xotEzHCCXZP5g==} + peerDependencies: + '@babel/runtime': '>=7.19.0' + react: '>=16.9.0' + react-dom: '>=16.9.0' + + '@uiw/react-color-hue@2.10.3': + resolution: {integrity: sha512-dlaLaQEPXvaywc8xS8DgiYIbq4qUuI8fyERR7/bRsRXCTA9x4tFAD+lWenXcZBEhQh8HfZd1MhbvjcLzs7xpFg==} + peerDependencies: + '@babel/runtime': '>=7.19.0' + react: '>=16.9.0' + react-dom: '>=16.9.0' + + '@uiw/react-color-material@2.10.3': + resolution: {integrity: sha512-zis1x0VPBCjFmlju0Syubo6ElNIwf91CM9xilL/A3K/LGRRVuvq/PK1mGRAjFonjfTHiTlOg1Lq3NsYCaVg8LA==} + peerDependencies: + '@babel/runtime': '>=7.19.0' + react: '>=16.9.0' + react-dom: '>=16.9.0' + + '@uiw/react-color-name@2.10.3': + resolution: {integrity: sha512-BnqZebCC2lmJezs190vUtzBybjMJypFkTEav/HP3FUzHD0XSsKHOZiHENzXp+TYr0Fb7WJQXxE/dl11zkcOwVg==} + peerDependencies: + '@babel/runtime': '>=7.19.0' + + '@uiw/react-color-saturation@2.10.3': + resolution: {integrity: sha512-iRIwNx3UTZrpV5hoQ5mcsZ8ahTXcMaGNvg8iS9JUByg+1PljwWcnqq5RNrRZJXPx+vryavefMkJLKHcPb9BLvQ==} + peerDependencies: + '@babel/runtime': '>=7.19.0' + react: '>=16.9.0' + react-dom: '>=16.9.0' + + '@uiw/react-color-shade-slider@2.10.3': + resolution: {integrity: sha512-WgK/JgS3oDyIzah9Jcd8uPSild6WOlYq9+jroBQ3q4ZLk+DADZ6ELaIi+tXsloxx65AaLJvXlqE0By6HAyohaQ==} + peerDependencies: + '@babel/runtime': '>=7.19.0' + react: '>=16.9.0' + react-dom: '>=16.9.0' + + '@uiw/react-color-sketch@2.10.3': + resolution: {integrity: sha512-4Vua0Ti1K/uOx0E3RV0xdOfLbpc4K8zXfWZtqyjJZ7jIZpB5KNgcai+b4R47VoUpyCYf2B30iCvBuFpN3cfqYA==} + peerDependencies: + '@babel/runtime': '>=7.19.0' + react: '>=16.9.0' + react-dom: '>=16.9.0' + + '@uiw/react-color-slider@2.10.3': + resolution: {integrity: sha512-aLJQPGV1/SpAWy6+U7RVqcJmhdtrdCYwvDL0/i5u/HC4VeWXB+w2LSSC63qWHwo+RkwfaJFLXKMO1JUWlQvxXg==} + peerDependencies: + '@babel/runtime': '>=7.19.0' + react: '>=16.9.0' + react-dom: '>=16.9.0' + + '@uiw/react-color-swatch@2.10.3': + resolution: {integrity: sha512-7Q/h9RTeloFnrIo/k6U5g+D/abSIT62FiAQZLaEC34O2eOtu1LQReTXAgx39b1HSQ8piCgBYaQc7oM9WhRTPow==} + peerDependencies: + '@babel/runtime': '>=7.19.0' + react: '>=16.9.0' + react-dom: '>=16.9.0' + + '@uiw/react-color-wheel@2.10.3': + resolution: {integrity: sha512-eNFWioQt8Fr3UgHpuCxN4/gniZReOit3FzYxVFVXzQD5Hd6ch6jJDDZFFTl2NGVuTfsXLIepLYe9B5FHajC7AA==} + peerDependencies: + '@babel/runtime': '>=7.19.0' + react: '>=16.9.0' + react-dom: '>=16.9.0' + + '@uiw/react-color@2.10.3': + resolution: {integrity: sha512-OezqWY4Fo8yJf8yn2sfdDS3xmAir6FBDSiDJ0tR/CoXwQ2RaQl0mZlarfb/I0aaGiJ/jAORAGStTX/G5XoB2jw==} + peerDependencies: + '@babel/runtime': '>=7.19.0' + react: '>=16.9.0' + react-dom: '>=16.9.0' + + '@uiw/react-drag-event-interactive@2.10.3': + resolution: {integrity: sha512-veLm9HF1cairiYbGxcALYVu51T4XAzDz8fmtQ0SiLVFHBX74+iUGo2jArS/XALFBnapsLYTAWTnHXxe38mC/Vw==} + peerDependencies: + '@babel/runtime': '>=7.19.0' + react: '>=16.9.0' + react-dom: '>=16.9.0' + '@ungap/structured-clone@1.3.0': resolution: {integrity: sha512-WmoN8qaIAo7WTYWbAZuG8PYEhn5fkz7dZrqTBZ7dtt//lL2Gwms1IcnQ5yHqjDfX8Ft5j4YzDM23f87zBfDe9g==} deprecated: Potential CWE-502 - Update to 1.3.1 or higher @@ -3527,6 +4146,9 @@ packages: resolution: {integrity: sha512-h8lQ8tacZYnR3vNQTgibj+tODHI5/+l06Au2Pcriv/Gmet0eaj4TwWH41sO9wnHDiQsEj19q0drzdWdeAHtweg==} engines: {node: '>=6.5'} + accept-language-parser@1.5.0: + resolution: {integrity: sha512-QhyTbMLYo0BBGg1aWbeMG4ekWtds/31BrEU+DONOg/7ax23vxpL03Pb7/zBmha2v7vdD3AyzZVWBVGEZxKOXWw==} + accepts@1.3.8: resolution: {integrity: sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw==} engines: {node: '>= 0.6'} @@ -3642,6 +4264,10 @@ packages: archy@1.0.0: resolution: {integrity: sha512-Xg+9RwCg/0p32teKdGMPTPnVXKD0w3DfHnFTficozsAgsvq2XenPJq/MYpzzQ/v8zrOyJn6Ds39VA4JIDwFfqw==} + are-docs-informative@0.0.2: + resolution: {integrity: sha512-ixiS0nLNNG5jNQzgZJNoUpBKdo9yTYZMGJ+QgT2jmjR7G7+QHRCc4v6LQ3NgE7EBJq+o0ams3waJwkrlBom8Ig==} + engines: {node: '>=14'} + arg@4.1.3: resolution: {integrity: sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA==} @@ -4016,6 +4642,9 @@ packages: resolution: {integrity: sha512-zkDT5WAF4hSSoUgyfg5tFIxz8XQK+25W/TLVojJTMKBaxevLBBtLxgqguAuVQB8PVW79FVjHcU+GJ9tVbDZ9mQ==} engines: {node: '>=14.16'} + cacheable@2.5.0: + resolution: {integrity: sha512-60cyAOytib/OzBw1JNSoSV/boK1AtHryDIjvVBk7XbN4ugfkM3+Sry7fEjNgPMGgOjuaZPAp8ruZ0Cxafwyq9g==} + call-bind-apply-helpers@1.0.2: resolution: {integrity: sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ==} engines: {node: '>= 0.4'} @@ -4102,6 +4731,9 @@ packages: cjs-module-lexer@1.4.3: resolution: {integrity: sha512-9z8TZaGM1pfswYeXrUpzPrkx8UnWYdhJclsiYMm6x/w5+nN+8Tf/LnAgfLGQCm59qAOxU8WwHEq2vNwF6i4j+Q==} + cjs-module-lexer@2.2.0: + resolution: {integrity: sha512-4bHTS2YuzUvtoLjdy+98ykbNB5jS0+07EvFNXerqZQJ89F7DI6ET7OQo/HJuW6K0aVsKA9hj9/RVb2kQVOrPDQ==} + classnames@2.5.1: resolution: {integrity: sha512-saHYOzhIQs6wy2sVxTM6bUDsQO4F50V9RQ22qBpEdCW+I+/Wmke2HOl6lS6dTpdxVhb88/I6+Hs+438c3lfUow==} @@ -4141,6 +4773,14 @@ packages: colorette@2.0.20: resolution: {integrity: sha512-IfEDxwoWIjkeXL1eXcDiow4UbKjhLdq6/EuSVR9GMN7KVH3r9gQ83e73hsz1Nd1T3ijd5xv1wcWRYO+D6kCI2w==} + colors-named-hex@1.0.4: + resolution: {integrity: sha512-X+Enw/2fFAgDRhUac69cRO/RJvHnWDBBrP8J1sJuEU16Buiiu8PPpJP4abSo0V+fJbkfwmQITE6zKx/SBJERGw==} + engines: {node: '>=14.16'} + + colors-named@1.0.5: + resolution: {integrity: sha512-xaspf9oddAOqP2LYNOgp8E3BwAzugrdO9J1kDNS5ySrzTgV9hrXGBt5w87ioLEr2pM4Ukt+GKedvzaLRxpv8pA==} + engines: {node: '>=14.16'} + combined-stream@1.0.8: resolution: {integrity: sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==} engines: {node: '>= 0.8'} @@ -4164,6 +4804,10 @@ packages: resolution: {integrity: sha512-OkTL9umf+He2DZkUq8f8J9of7yL6RJKI24dVITBmNfZBmri9zYZQrKkuXiKhyfPSu8tUhnVBB1iKXevvnlR4Ww==} engines: {node: '>= 12'} + comment-parser@1.4.1: + resolution: {integrity: sha512-buhp5kePrmda3vhc5B9t7pUQXAb2Tnd0qgpkIhPhkHXxJpiPJ11H0ZEU0oBpJ2QztSbzG/ZxMj/CHsYJqRHmyg==} + engines: {node: '>= 12.0.0'} + common-path-prefix@3.0.0: resolution: {integrity: sha512-QE33hToZseCH3jS0qN96O/bSh3kaw/h+Tq7ngyY9eWDUnTlTNUyqfqvCXioLe5Na5jFsL78ra/wuBU4iuEgd4w==} @@ -4325,6 +4969,10 @@ packages: crypt@0.0.2: resolution: {integrity: sha512-mCxBlsHFYh9C+HVpiEacem8FEBnMXgU9gy4zmNC+SXAZNB/1idgp/aulFJ4FgCi7GPEVbfyng092GqL2k2rmow==} + csp-header@5.2.1: + resolution: {integrity: sha512-qOJNu39JZkPrbrAM40a1tQCePEPYVIoI6nMDhX4RA07QjU8efS+zyd/zE83XJu85KKazH9NjKlvvlswFMteMgg==} + engines: {node: '>=10'} + css-blank-pseudo@6.0.2: resolution: {integrity: sha512-J/6m+lsqpKPqWHOifAFtKFeGLOzw3jR92rxQcwRUfA/eTuZzKfKlxOmYDx2+tqOPQAueNvBiY8WhAeHu5qNmTg==} engines: {node: ^14 || ^16 || >=18} @@ -4684,6 +5332,10 @@ packages: resolution: {integrity: sha512-uBq4egWHTcTt33a72vpSG0z3HnPuIl6NqYcTrKEg2azoEyl2hpW0zqlxysq2pK9HlDIHyHyakeYaYnSAwd8bow==} engines: {node: '>=12'} + dotenv@17.4.2: + resolution: {integrity: sha512-nI4U3TottKAcAD9LLud4Cb7b2QztQMUEfHbvhTH09bqXTxnSie8WnjPALV/WMCrJZ6UV/qHJ6L03OqO3LcdYZw==} + engines: {node: '>=12'} + dunder-proto@1.0.1: resolution: {integrity: sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==} engines: {node: '>= 0.4'} @@ -4778,6 +5430,9 @@ packages: es-module-lexer@1.7.0: resolution: {integrity: sha512-jEQoCwk8hyb2AZziIOLhDqpm5+2ww5uIE6lkO/6jcOCusfk6LhMHpXXfBLXTZ7Ydyt0j4VoUQv6uGNYbdW+kBA==} + es-module-lexer@2.3.1: + resolution: {integrity: sha512-shc1dbU90Yl/xq1QrC7QRtfcwURZuVRfPhZbDoldJ1cn1gzDvBaBWlv0eFolj5+0znnPJz5TXLxsN77X/12KTA==} + es-object-atoms@1.1.1: resolution: {integrity: sha512-FGgH2h8zKNim9ljj7dankFPcICIK9Cp5bm+c2gQSYePhpaG5+esrLODihIorn+Pe6FGJzWhXQotPv73jTaldXA==} engines: {node: '>= 0.4'} @@ -4816,12 +5471,27 @@ packages: resolution: {integrity: sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==} engines: {node: '>=10'} + eslint-config-prettier@10.1.8: + resolution: {integrity: sha512-82GZUjRS0p/jganf6q1rEO25VSoHH0hKPCTrgillPjdI/3bgBhAE1QzHrHTizjpRvy6pGAvKjDJtk2pF9NDq8w==} + hasBin: true + peerDependencies: + eslint: '>=7.0.0' + eslint-config-prettier@9.1.2: resolution: {integrity: sha512-iI1f+D2ViGn+uvv5HuHVUamg8ll4tN+JRHGc6IJi4TP9Kl976C57fzPXgseXNs8v0iA8aSJpHsTWjDb9QJamGQ==} hasBin: true peerDependencies: eslint: '>=7.0.0' + eslint-import-context@0.1.9: + resolution: {integrity: sha512-K9Hb+yRaGAGUbwjhFNHvSmmkZs9+zbuoe3kFQ4V1wYjrepUFYM2dZAfNtjbbj3qsPfUfsA68Bx/ICWQMi+C8Eg==} + engines: {node: ^12.20.0 || ^14.18.0 || >=16.0.0} + peerDependencies: + unrs-resolver: ^1.0.0 + peerDependenciesMeta: + unrs-resolver: + optional: true + eslint-import-resolver-node@0.3.9: resolution: {integrity: sha512-WFj2isz22JahUv+B788TlO3N6zL3nNJGU8CcZbPZvVEkBPaJdCV4vy5wyghty5ROFbCRnm132v8BScu5/1BQ8g==} @@ -4838,6 +5508,19 @@ packages: eslint-plugin-import-x: optional: true + eslint-import-resolver-typescript@4.4.5: + resolution: {integrity: sha512-nbE5XLph6TLtGYcu/U6e6ZVXyKBhbDWK5cLGk76eJ7NdZpwf1P9EFkpt1Z01mNZNrrilsAYWKH6zUkL4reoXbw==} + engines: {node: ^16.17.0 || >=18.6.0} + peerDependencies: + eslint: '*' + eslint-plugin-import: '*' + eslint-plugin-import-x: '*' + peerDependenciesMeta: + eslint-plugin-import: + optional: true + eslint-plugin-import-x: + optional: true + eslint-module-utils@2.12.1: resolution: {integrity: sha512-L8jSWTze7K2mTg0vos/RuLRS5soomksDPoJLXIslC7c8Wmut3bx7CPpJijDcBZtxQ5lrbUdM+s0OlNbz0DCDNw==} engines: {node: '>=4'} @@ -4869,6 +5552,12 @@ packages: '@typescript-eslint/parser': optional: true + eslint-plugin-jsdoc@50.8.0: + resolution: {integrity: sha512-UyGb5755LMFWPrZTEqqvTJ3urLz1iqj+bYOHFNag+sw3NvaMWP9K2z+uIn37XfNALmQLQyrBlJ5mkiVPL7ADEg==} + engines: {node: '>=18'} + peerDependencies: + eslint: ^7.0.0 || ^8.0.0 || ^9.0.0 + eslint-plugin-jsx-a11y@6.10.2: resolution: {integrity: sha512-scB3nz4WmG75pV8+3eRUQOHZlNSUhFNq37xnpgRkCCELU3XMvXAxLk1eqWWyE22Ki4Q01Fnsw9BA3cJHDPgn2Q==} engines: {node: '>=4.0'} @@ -4901,6 +5590,10 @@ packages: peerDependencies: eslint: ^3 || ^4 || ^5 || ^6 || ^7 || ^8 || ^9.7 + eslint-plugin-security-node@1.1.4: + resolution: {integrity: sha512-8+agTMb2glNbP1zFhqo/Ixwtz16Hn0TvJW5KgpoHkAzGjDUhQf9iT+D6OgbhvZCMWRKMjc+5FbJ2Lh0UEUz7fQ==} + engines: {node: '>=0.10.0'} + eslint-plugin-security@3.0.1: resolution: {integrity: sha512-XjVGBhtDZJfyuhIxnQ/WMm385RbX3DBu7H1J7HNNhmB2tnGxMeqVSnYv79oAj992ayvIBZghsymwkYFS6cGH4Q==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} @@ -4913,6 +5606,10 @@ packages: resolution: {integrity: sha512-dOt21O7lTMhDM+X9mB4GX+DZrZtCUJPL/wlcTqxyrx5IvO0IYtILdtrQGQp+8n5S0gwSVmOf9NQrjMOgfQZlIg==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + eslint-scope@8.4.0: + resolution: {integrity: sha512-sNXOfKCn74rt8RICKMvJS7XKV/Xk9kA7DyJr8mJik3S7Cwgy3qlkkmyS2uQB3jiJg6VNdZd/pDBJu0nvG2NlTg==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + eslint-visitor-keys@2.1.0: resolution: {integrity: sha512-0rSmRBzXgDzIsD6mGdJgevzgezI534Cer5L/vyMX0kHzT/jiB43jRhd9YUlMGYLQy2zprNmoT8qasCGtY+QaKw==} engines: {node: '>=10'} @@ -4921,6 +5618,10 @@ packages: resolution: {integrity: sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + eslint-visitor-keys@4.2.1: + resolution: {integrity: sha512-Uhdk5sfqcee/9H/rCOJikYz67o0a2Tw2hGRPOG2Y1R2dg7brRe1uG0yaNQDHu+TO/uQPF/5eCapvYSmHUjt7JQ==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + eslint-visitor-keys@5.0.1: resolution: {integrity: sha512-tD40eHxA35h0PEIZNeIjkHoDR4YjjJp34biM0mDvplBe//mB+IHCqHDGV7pxF+7MklTvighcCPPZC7ynWyjdTA==} engines: {node: ^20.19.0 || ^22.13.0 || >=24} @@ -4931,6 +5632,20 @@ packages: deprecated: This version is no longer supported. Please see https://eslint.org/version-support for other options. hasBin: true + eslint@9.39.5: + resolution: {integrity: sha512-DgZS62aPLXKlnxILS/AYCoRvHaZeXceIzlXPkkGGzJWSow1aEk0lbTlxUSlyjC8jcaKxAdOnTDz+o1JFSBsyjw==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + hasBin: true + peerDependencies: + jiti: '*' + peerDependenciesMeta: + jiti: + optional: true + + espree@10.4.0: + resolution: {integrity: sha512-j6PAQ2uUr79PZhBjP5C5fhl8e39FmRnOjsD5lGnWrFU8i2G776tBK7+nP8KuQUTTyAZUwfQqXAgrVH5MbH9CYQ==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + espree@9.6.1: resolution: {integrity: sha512-oruZaFkjorTpF32kDSI5/75ViwGeZginGGy2NoOSg3Q9bnwlnmDm4HLnkl0RE3n+njDXR037aY1+x58Z/zFdwQ==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} @@ -5001,6 +5716,10 @@ packages: resolution: {integrity: sha512-2Zks0hf1VLFYI1kbh0I5jP3KHHyCHpkfyHBzsSXRFgl/Bg9mWYfMW8oD+PdMPlEwy5HNsR9JutYy6pMeOh61nw==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + express-csp-header@5.2.1: + resolution: {integrity: sha512-HvVCUa3GwqH9m4rG0y+s6bHENNxtPzLccM1bSmZNiMIWwMc38Q2Gkz6byiDkrqmnqaCJ9+9cc/p2Pd4QqOmx9Q==} + engines: {node: '>=10'} + express@4.22.1: resolution: {integrity: sha512-F2X8g9P1X7uCPZMA3MVf9wcTqlyNp7IhH5qPCI0izhaOIYXaW9L535tGA3qmjRzpH+bZczqq7hVKxTR4NWnu+g==} engines: {node: '>= 0.10.0'} @@ -5020,6 +5739,9 @@ packages: fast-copy@3.0.2: resolution: {integrity: sha512-dl0O9Vhju8IrcLndv2eU4ldt1ftXMqqfgN4H1cpmGV7P6jeB9FwpN9a2c8DPGE1Ys88rNUJVYDHq73CGAGOPfQ==} + fast-copy@4.0.4: + resolution: {integrity: sha512-eVAiWVNPSEGIzDl5yPuLrx8fNMogScXvD9xp1Kzd41FjRIz2I3sSIcxsFeM5EzFfHAfobdvs8ZySffUopljvIA==} + fast-deep-equal@3.1.3: resolution: {integrity: sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==} @@ -5078,6 +5800,9 @@ packages: fflate@0.8.2: resolution: {integrity: sha512-cPJU47OaAoCbg0pBvzsgpTPhmhqI5eJjh/JIu8tPj5q+T7iLvW/JAYUqmE7KOB4R1ZyEhzBaIQpQpardBF5z8A==} + file-entry-cache@11.1.5: + resolution: {integrity: sha512-+PFTHITI08JIGhnNpGNI8T8inUpgZfk3GNEqfT9R2zZV2iFXg3CvqzSl/uEhs7TSGujYRELEANyDvS8Fj7+S7Q==} + file-entry-cache@6.0.1: resolution: {integrity: sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==} engines: {node: ^10.12.0 || >=12.0.0} @@ -5086,6 +5811,10 @@ packages: resolution: {integrity: sha512-TfW7/1iI4Cy7Y8L6iqNdZQVvdXn0f8B4QcIXmkIbtTIe/Okm/nSlHb4IwGzRVOd3WfSieCgvf5cMzEfySAIl0g==} engines: {node: '>=12.0.0'} + file-entry-cache@8.0.0: + resolution: {integrity: sha512-XXTUwCvisa5oacNGRP9SfNtYBNAMi+RPwBFmblZEF7N7swHYQS6/Zfk7SRwx4D5j3CH211YNRco1DEMNVfZCnQ==} + engines: {node: '>=16.0.0'} + file-type@19.6.0: resolution: {integrity: sha512-VZR5I7k5wkD0HgFnMsq5hOsSc710MJMu5Nc5QYsbe38NN5iPV/XTObYLc/cpttRTf6lX538+5uO1ZQRhYibiZQ==} engines: {node: '>=18'} @@ -5170,6 +5899,13 @@ packages: resolution: {integrity: sha512-CYcENa+FtcUKLmhhqyctpclsq7QF38pKjZHsGNiSQF5r4FtoKDWabFDl3hzaEQMvT1LHEysw5twgLvpYYb4vbw==} engines: {node: ^10.12.0 || >=12.0.0} + flat-cache@4.0.1: + resolution: {integrity: sha512-f7ccFPK3SXFHpx15UIGyRJ/FJQctuKZ0zVuN3frBo4HnK3cay9VEW0R6yPYFHC0AgqhukPzKjq22t5DmAyqGyw==} + engines: {node: '>=16'} + + flat-cache@6.1.23: + resolution: {integrity: sha512-f++BY9pTk+983xK1FLzlLpmM0i0z+jHmx3QESGkURMXujQZz1k5wzwX6hjnQ8goaD0B+sYnDK1yZ6MTyZfUaqA==} + flatted@3.4.2: resolution: {integrity: sha512-PjDse7RzhcPkIJwy5t7KPWQSZ9cAbzQXcafsetQoD7sOJRQlGikNbx7yZp2OotDnJyrDcbyRq3Ttb18iYOqkxA==} @@ -5372,6 +6108,18 @@ packages: resolution: {integrity: sha512-AhO5QUcj8llrbG09iWhPU2B204J1xnPeL8kQmVorSsy+Sjj1sk8gIyh6cUocGmH4L0UuhAJy+hJMRA4mgA4mFQ==} engines: {node: '>=8'} + globals@14.0.0: + resolution: {integrity: sha512-oahGvuMGQlPw/ivIYBjVSrWAfWLBeku5tpPE2fOPLi+WHffIWbuh2tCjhyQhTBPMf5E9jDEH4FOmTYgYwbKwtQ==} + engines: {node: '>=18'} + + globals@16.5.0: + resolution: {integrity: sha512-c/c15i26VrJ4IRt5Z89DnIzCGDn9EcebibhAOjw5ibqEHsE1wLUgkPn9RDmNcUKyU87GeaL633nyJ+pplFR2ZQ==} + engines: {node: '>=18'} + + globals@17.7.0: + resolution: {integrity: sha512-Czmyns5dUsq4seFBR/Kdydhmo8y9kC79hiSkPn0YcGtNnYWnrgt0vjrSjx9tspoDGWm2CMarffRuLjM4xUz8xg==} + engines: {node: '>=18'} + globalthis@1.0.4: resolution: {integrity: sha512-DpLKbNU4WylpxJykQujfCcwYWiV/Jhm50Goo0wrVILAv5jOr9d+H+UR3PhSCD2rCCEIg0uc+G+muBTwD54JhDQ==} engines: {node: '>= 0.4'} @@ -5444,6 +6192,10 @@ packages: resolution: {integrity: sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==} engines: {node: '>= 0.4'} + hashery@1.5.1: + resolution: {integrity: sha512-iZyKG96/JwPz1N55vj2Ie2vXbhu440zfUfJvSwEqEbeLluk7NnapfGqa7LH0mOsnDxTF85Mx8/dyR6HfqcbmbQ==} + engines: {node: '>=20'} + hasown@2.0.2: resolution: {integrity: sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==} engines: {node: '>= 0.4'} @@ -5458,6 +6210,12 @@ packages: resolution: {integrity: sha512-eSmmWE5bZTK2Nou4g0AI3zZ9rswp7GRKoKXS1BLUkvPviOqs4YTN1djQIqrXy9k5gEtdLPy86JjRwsNM9tnDcA==} engines: {node: '>=0.10.0'} + hookified@1.15.1: + resolution: {integrity: sha512-MvG/clsADq1GPM2KGo2nyfaWVyn9naPiXrqIe4jYjXNZQt238kWyOGrsyc/DmRAQ+Re6yeo6yX/yoNCG5KAEVg==} + + hookified@2.2.0: + resolution: {integrity: sha512-p/LgFzRN5FeoD3DLS6bkUapeye6E4SI6yJs6KetENd18S+FBthqYq2amJUWpt5z0EQwwHemidjY5OqJGEKm5uA==} + hosted-git-info@2.8.9: resolution: {integrity: sha512-mxIDAb9Lsm6DoOJ7xH+5+X4y1LU/4Hi50L9C5sIswK3JzULS4bwk1FvjdBgvYR4bzT4tuUQiC15FE2f5HbLvYw==} @@ -5478,6 +6236,10 @@ packages: resolution: {integrity: sha512-ztqyC3kLto0e9WbNp0aeP+M3kTt+nbaIveGmUxAtZa+8iFgKLUOD4YKM5j+f3QD89bra7UeumolZHKuOXnTmeQ==} engines: {node: '>=8'} + htmlescape@1.1.1: + resolution: {integrity: sha512-eVcrzgbR4tim7c7soKQKtxa/kQM4TzjnlU83rcZ9bHU6t31ehfV7SktN6McWgwPWg+JYMA/O3qpGxBvFq1z2Jg==} + engines: {node: '>=0.10'} + htmlparser2@10.0.0: resolution: {integrity: sha512-TwAZM+zE5Tq3lrEHvOlvwgj1XLWQCtaaibSN11Q+gGBAS7Y1uZSWwXXRe4iF6OXnaq1riyQAPFOBtYc77Mxq0g==} @@ -5579,6 +6341,10 @@ packages: resolution: {integrity: sha512-TR3KfrTZTYLPB6jUjfx6MF9WcWrHL9su5TObK4ZkYgBdWKPOFoSoQIdEuTuR82pmtxH2spWG9h6etwfr1pLBqQ==} engines: {node: '>=6'} + import-in-the-middle@3.3.2: + resolution: {integrity: sha512-jTd2FfOgOWOdgjkHuk/1Ms8VKFXkPs15ymYBETw1sAOrO/dY3XeGVRWir9qBbw7pXr0T2eTFwfCZ+N02HmiNGA==} + engines: {node: '>=18'} + import-lazy@4.0.0: resolution: {integrity: sha512-rKtvo6a868b5Hu3heneU+L4yEQ4jYKLtjpnPeUdK7h0yzXGmyBTypknlkCvHFBqfX9YlorEiMM6Dnq/5atfHkw==} engines: {node: '>=8'} @@ -6052,6 +6818,14 @@ packages: resolution: {integrity: sha512-qQKT4zQxXl8lLwBtHMWwaTcGfFOZviOJet3Oy/xmGk2gZH677CJM9EvtfdSkgWcATZhj/55JZ0rmy3myCT5lsA==} hasBin: true + js-yaml@4.3.0: + resolution: {integrity: sha512-1td788aAnnZ5qs7V2QIRl1owjtYpbKt749Y3xauqQgwIIGF/xXWz1wMTEBx5O3LK3lXLVuqXPdPxj2BoFHaW9Q==} + hasBin: true + + jsdoc-type-pratt-parser@4.1.0: + resolution: {integrity: sha512-Hicd6JK5Njt2QB6XYFS7ok9e37O8AYk3jTcppG4YVQnYjOemymvTcmc7OWsmq/Qqj5TdRFO5/x/tIPmBeRtGHg==} + engines: {node: '>=12.0.0'} + jsesc@3.1.0: resolution: {integrity: sha512-/sM3dO2FOzXjKQhJuo0Q173wf2KOo8t4I8vHy6lF9poUp7bKT0/NHE8fPX23PwfhnykfqnC2xRxOnVw5XuGIaA==} engines: {node: '>=6'} @@ -6108,6 +6882,9 @@ packages: keyv@4.5.4: resolution: {integrity: sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==} + keyv@5.6.0: + resolution: {integrity: sha512-CYDD3SOtsHtyXeEORYRx2qBtpDJFjRTGXUtmNEMGyzYOKj1TE3tycdlho7kA1Ufx9OYWZzg52QFBGALTirzDSw==} + kind-of@6.0.3: resolution: {integrity: sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==} engines: {node: '>=0.10.0'} @@ -6119,6 +6896,9 @@ packages: known-css-properties@0.29.0: resolution: {integrity: sha512-Ne7wqW7/9Cz54PDt4I3tcV+hAyat8ypyOGzYRJQfdxnnjeWsTxt1cy8pjvvKeI5kfXuyvULyeeAvwvvtAX3ayQ==} + known-css-properties@0.37.0: + resolution: {integrity: sha512-JCDrsP4Z1Sb9JwG0aJ8Eo2r7k4Ou5MwmThS/6lcIe1ICyb7UBJKGRIUUdqc2ASdE/42lgz6zFUnzAIhtXnBVrQ==} + koa-compose@4.1.0: resolution: {integrity: sha512-8ODW8TrDuMYvXRwra/Kh7/rJo9BtOfPc6qO8eAfC80CnCvSjSl0bkRM24X6/XBBEyj0v1nRUQ1LyOy3dbqOWXw==} @@ -6312,6 +7092,9 @@ packages: long-timeout@0.1.1: resolution: {integrity: sha512-BFRuQUqc7x2NWxfJBCyUrN8iYUYznzL9JROmRz1gZ6KlOIgmoD+njPVbb+VNn2nGMKggMsK79iUNErillsrx7w==} + long@5.3.2: + resolution: {integrity: sha512-mNAgZ1GmyNhD7AuqnTG3/VQ26o760+ZYBPKjPvugO8+nLbYfX6TVpJPseBvopbdY+qpZ/lKUnmEc1LeZYS3QAA==} + loose-envify@1.4.0: resolution: {integrity: sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==} hasBin: true @@ -6417,6 +7200,10 @@ packages: resolution: {integrity: sha512-BhXM0Au22RwUneMPwSCnyhTOizdWoIEPU9sp0Aqa1PnDMR5Wv2FGXYDjuzJEIX+Eo2Rb8xuYe5jrnm5QowQFkw==} engines: {node: '>=16.10'} + meow@13.2.0: + resolution: {integrity: sha512-pxQJQzB6djGPXh08dacEloMFopsOqGVRKFPYvPOt9XDZ1HasbgDZA74CJGreSU4G3Ak7EFJGoiH2auq+yXISgA==} + engines: {node: '>=18'} + merge-descriptors@1.0.3: resolution: {integrity: sha512-gaNvAS7TZ897/rVaZ0nMtAyxNyi/pdbjbAwUpFQpN70GqnVfOiXpeUUMKRBmzXaSQ8DdTX4/0ms62r2K+hE6mQ==} @@ -6519,6 +7306,9 @@ packages: resolution: {integrity: sha512-tEBHqDnIoM/1rXME1zgka9g6Q2lcoCkxHLuc7ODJ5BxbP5d4c2Z5cGgtXAku59200Cx7diuHTOYfSBD8n6mm8A==} engines: {node: '>=16 || 14 >=14.17'} + module-details-from-path@1.0.4: + resolution: {integrity: sha512-EGWKgxALGMgzvxYF1UyGTy0HXX/2vHLkw6+NvDKW2jypWbHpjQuj4UMcqQWXHERJhVGKikolT06G3bcKe4fi7w==} + moment-timezone-data-webpack-plugin@1.5.1: resolution: {integrity: sha512-1le6a35GgYdWMVYFzrfpE/F6Pk4bj0M3QKD6Iv6ba9LqWGoVqHQRHyCTLvLis5E1J98Sz40ET6yhZzMVakwpjg==} peerDependencies: @@ -6806,6 +7596,9 @@ packages: resolution: {integrity: sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==} engines: {node: '>=6'} + parse-imports-exports@0.2.4: + resolution: {integrity: sha512-4s6vd6dx1AotCx/RCI2m7t7GCh5bDRUtGNvRfHSP2wbBQdMi67pPe7mtzmgwcaQ8VKK/6IB7Glfyu3qdZJPybQ==} + parse-json@4.0.0: resolution: {integrity: sha512-aOIos8bujGN93/8Ox/jPLh7RwVnPEysynVFE+fQZyg6jKELEHwzgKdLRFHUgXJL6kylijVSBC4BvN9OmsB48Rw==} engines: {node: '>=4'} @@ -6818,6 +7611,9 @@ packages: resolution: {integrity: sha512-1Y1A//QUXEZK7YKz+rD9WydcE1+EuPr6ZBgKecAB8tmoW6UFv0NREVJe1p+jRxtThkcbbKkfwIbWJe/IeE6m2Q==} engines: {node: '>=0.10.0'} + parse-statements@1.0.11: + resolution: {integrity: sha512-HlsyYdMBnbPQ9Jr/VgJ1YF4scnldvJpJxCVx6KgqPL4dxppsWrJHCIIxQXMJrqGnsRkNPATbeMJ8Yxu7JMsYcA==} + parseurl@1.3.3: resolution: {integrity: sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==} engines: {node: '>= 0.8'} @@ -6927,10 +7723,24 @@ packages: pino-abstract-transport@2.0.0: resolution: {integrity: sha512-F63x5tizV6WCh4R6RHyi2Ml+M70DNRXt/+HANowMflpgGFMAym/VKm6G7ZOQRjqN7XbGxK1Lg9t6ZrtzOaivMw==} + pino-abstract-transport@3.0.0: + resolution: {integrity: sha512-wlfUczU+n7Hy/Ha5j9a/gZNy7We5+cXp8YL+X+PG8S0KXxw7n/JXA3c46Y0zQznIJ83URJiwy7Lh56WLokNuxg==} + pino-pretty@11.3.0: resolution: {integrity: sha512-oXwn7ICywaZPHmu3epHGU2oJX4nPmKvHvB/bwrJHlGcbEWaVcotkpyVHMKLKmiVryWYByNp0jpgAcXpFJDXJzA==} hasBin: true + pino-pretty@13.1.3: + resolution: {integrity: sha512-ttXRkkOz6WWC95KeY9+xxWL6AtImwbyMHrL1mSwqwW9u+vLp/WIElvHvCSDg0xO/Dzrggz1zv3rN5ovTRVowKg==} + hasBin: true + + pino-std-serializers@7.1.0: + resolution: {integrity: sha512-BndPH67/JxGExRgiX1dX0w1FvZck5Wa4aal9198SrRhZjH3GxKQUKIBnYJTdj2HDN3UQAS06HlfcSbQj2OHmaw==} + + pino@10.3.1: + resolution: {integrity: sha512-r34yH/GlQpKZbU1BvFFqOjhISRo1MNx1tWYsYvmj6KIRHSPMT2+yHOEb1SG6NMvRoHRF0a07kCOox/9yakl1vg==} + hasBin: true + pirates@4.0.7: resolution: {integrity: sha512-TfySrs/5nm8fQJDcBDuUng3VOUKsd7S+zqvbOTiGXHfxX4wK31ard+hoNuvkicM/2YFzlpDgABOevKSsB4G/FA==} engines: {node: '>= 6'} @@ -7327,6 +8137,12 @@ packages: peerDependencies: postcss: ^8.3.3 + postcss-safe-parser@7.0.1: + resolution: {integrity: sha512-0AioNCJZ2DPYz5ABT6bddIqlhgwhpHZ/l65YAYo0BCIn0xiDpsnTHz0gnoTGk0OXZW0JRs+cDwL8u/teRdz+8A==} + engines: {node: '>=18.0'} + peerDependencies: + postcss: ^8.4.31 + postcss-scss@4.0.9: resolution: {integrity: sha512-AjKOeiwAitL/MXxQW2DliT28EKukvvbEWx3LBmJIRN8KfBGZbRTxNYW0kSqi1COiTZ57nZ9NW06S6ux//N1c9A==} engines: {node: '>=12.0'} @@ -7352,6 +8168,11 @@ packages: peerDependencies: postcss: ^8.4.20 + postcss-sorting@9.1.0: + resolution: {integrity: sha512-Mn8KJ45HNNG6JBpBizXcyf6LqY/qyqetGcou/nprDnFwBFBLGj0j/sNKV2lj2KMOVOwdXu14aEzqJv8CIV6e8g==} + peerDependencies: + postcss: ^8.4.20 + postcss-svgo@7.1.1: resolution: {integrity: sha512-zU9H9oEDrUFKa0JB7w+IYL7Qs9ey1mZyjhbf0KLxwJDdDRtoPvCmaEfknzqfHj44QS9VD6c5sJnBAVYTLRg/Sg==} engines: {node: ^18.12.0 || ^20.9.0 || >= 18} @@ -7396,6 +8217,9 @@ packages: process-nextick-args@2.0.1: resolution: {integrity: sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==} + process-warning@5.0.0: + resolution: {integrity: sha512-a39t9ApHNx2L4+HBnQKqxxHNs1r7KF+Intd8Q/g1bUh6q0WIp9voPXJ/x0j+ZL45KF1pJd9+q2jLIRMfvEshkA==} + process@0.11.10: resolution: {integrity: sha512-cdGef/drWFoydD1JsMzuFf8100nZl+GT+yacc2bEced5f9Rjk4z+WtFUTBu9PhOi9j/jfmBPu0mMEY4wIdAF8A==} engines: {node: '>= 0.6.0'} @@ -7411,6 +8235,10 @@ packages: prop-types@15.8.1: resolution: {integrity: sha512-oj87CgZICdulUohogVAR7AjlC0327U4el4L6eAvOqCeudMDVU0NThNaV+b9Df4dXgSP1gXMTnPdhfe/2qDH5cg==} + protobufjs@7.6.5: + resolution: {integrity: sha512-/FPD0nUc9jH6rfFjji9IBqOz4pcSE3CsT1m7Ep6Mdb0LxSUMj8hgl6GomOvZzpNpAqqGaXA0P3VSrZLFzIhQrw==} + engines: {node: '>=12.0.0'} + proxy-addr@2.0.7: resolution: {integrity: sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==} engines: {node: '>= 0.10'} @@ -7422,6 +8250,9 @@ packages: resolution: {integrity: sha512-cJ+oHTW1VAEa8cJslgmUZrc+sjRKgAKl3Zyse6+PV38hZe/V6Z14TbCuXcan9F9ghlz4QrFr2c92TNF82UkYHA==} engines: {node: '>=10'} + psl@1.8.0: + resolution: {integrity: sha512-RIdOzyoavK+hA18OGGWDqUTsCLhtA7IcZ/6NCs4fFJaHBDab+pDDmDIByWFRQJq2Cd7r1OoQxBGKOaztq+hjIQ==} + pstree.remy@1.1.8: resolution: {integrity: sha512-77DZwxQmxKnu3aR542U+X8FypNzbfJ+C5XQDk3uWjWxn6151aIMGthWYRXTqT1E5oJvg+ljaa2OJi+VfvCOQ8w==} @@ -7442,6 +8273,10 @@ packages: resolution: {integrity: sha512-KTqnxsgGiQ6ZAzZCVlJH5eOjSnvlyEgx1m8bkRJfOhmGRqfo5KLvmAlACQkrjEtOQ4B7wF9TdSLIs9O90MX9xA==} engines: {node: '>=16.0.0'} + qified@0.10.1: + resolution: {integrity: sha512-+Owyggi9IxT1ePKGafcI87ubSmxol6smwJ+RAHDQlx9+9cPwFWDiKFFCPuWhr9ignlGpZ9vDQLw67N4dcTVFEA==} + engines: {node: '>=20'} + qs@6.14.2: resolution: {integrity: sha512-V/yCWTTF7VJ9hIh18Ugr2zhJMP01MY7c5kh4J870L7imm6/DIzBsNLTXzMwUA3yZ5b/KBqLx8Kp3uRvd7xSe3Q==} engines: {node: '>=0.6'} @@ -7453,6 +8288,9 @@ packages: queue-microtask@1.2.3: resolution: {integrity: sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==} + quick-format-unescaped@4.0.4: + resolution: {integrity: sha512-tYC1Q1hgyRuHgloV/YXs2w15unPVh8qfu/qCTfhTYamaw7fyhumKa2yGpdSo87vY32rIclj+4fWYQXUMs9EHvg==} + quick-lru@5.1.1: resolution: {integrity: sha512-WuyALRjWPDGtt/wzJiadO5AXY+8hZ80hVpe6MyivgraREW751X3SbhRvG3eLKOYN+8VEvqLcf3wdnt44Z4S4SA==} engines: {node: '>=10'} @@ -7485,6 +8323,13 @@ packages: react: '>=16.9.0' react-dom: '>=16.9.0' + rc-slider@11.1.9: + resolution: {integrity: sha512-h8IknhzSh3FEM9u8ivkskh+Ef4Yo4JRIY2nj7MrH6GQmrwV6mcpJf5/4KgH5JaVI1H3E52yCdpOlVyGZIeph5A==} + engines: {node: '>=8.x'} + peerDependencies: + react: '>=16.9.0' + react-dom: '>=16.9.0' + rc-util@5.44.4: resolution: {integrity: sha512-resueRJzmHG9Q6rI/DfK6Kdv9/Lfls05vzMs1Sk3M2P+3cJa+MakaZyWY8IPfehVuhPJFKrIY1IK4GqbiaiY5w==} peerDependencies: @@ -7544,6 +8389,18 @@ packages: react-native: optional: true + react-redux@9.3.0: + resolution: {integrity: sha512-KQopgqFo/p/fgmAs5qz6p5RWaNAzq40WAu7fJIXnQpYxFPbJYtsJPWvGeF2rOBaY/kEuV77AVsX8TsQzKm+A/g==} + peerDependencies: + '@types/react': ^18.2.25 || ^19 + react: ^18.0 || ^19 + redux: ^5.0.0 + peerDependenciesMeta: + '@types/react': + optional: true + redux: + optional: true + react-refresh@0.14.2: resolution: {integrity: sha512-jCvmsr+1IUSMUyzOkRcvnVbX3ZYC6g9TDrDbFuFmRDq7PD4yaGbLKNQL6k2jnArV8hjYxh7hVhAZB6s9HDGpZA==} engines: {node: '>=0.10.0'} @@ -7612,6 +8469,13 @@ packages: resolution: {integrity: sha512-GDhwkLfywWL2s6vEjyhri+eXmfH6j1L7JE27WhqLeYzoh/A3DBaYGEj2H/HFZCn/kMfim73FXxEJTw06WtxQwg==} engines: {node: '>= 14.18.0'} + real-require@0.2.0: + resolution: {integrity: sha512-57frrGM/OCTLqLOAh0mhVA9VBMHd+9U7Zb2THMGdBUoZVOtGbJzjxsYGDJ3A9AYYCP4hn6y1TVbaOfzWtm5GFg==} + engines: {node: '>= 12.13.0'} + + real-require@1.0.0: + resolution: {integrity: sha512-P4nbQYQfePJxRSmY+v/KINxVucm4NF3p3s7pJveMTtom52FR4YGltUQLB8idDXwDDWW+eYrWDFbuzUnjoWHF7g==} + redent@4.0.0: resolution: {integrity: sha512-tYkDkVVtYkSVhuQ4zBgfvciymHaeuel+zFKXShfDnFP5SyVEP7qo70Rf1jTOTCx3vGNAbnEi/xFkcfQVMIBWag==} engines: {node: '>=12'} @@ -7619,6 +8483,9 @@ packages: redux@4.2.1: resolution: {integrity: sha512-LAUYz4lc+Do8/g7aeRa8JkyDErK6ekstQaqWQrNRW//MY1TvCEpMtpTWvlQ+FPbWCx+Xixu/6SHt5N0HR+SB4w==} + redux@5.0.1: + resolution: {integrity: sha512-M9/ELqF6fy8FwmkpnF0S3YKOqMyoWJ4+CS5Efg2ct3oY9daQvd/Pc71FpGZsVsbl3Cpb+IIcjBDUnnyBdQbq4w==} + reflect-metadata@0.2.2: resolution: {integrity: sha512-urBwgfrvVP/eAyXx4hluJivBKzuEbSQs9rKWCrCkbSxNv8mxPcUZKeuoF3Uy4mJl3Lwprp6yy5/39VWigZ4K6Q==} @@ -7663,6 +8530,10 @@ packages: resolution: {integrity: sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==} engines: {node: '>=0.10.0'} + require-in-the-middle@8.0.1: + resolution: {integrity: sha512-QT7FVMXfWOYFbeRBF6nu+I6tr2Tf3u0q8RIEjNob/heKY/nh7drD/k7eeMFmSQgnTtCzLDcCu/XEnpW2wk4xCQ==} + engines: {node: '>=9.3.0 || >=8.10.0 <9.0.0'} + requires-port@1.0.0: resolution: {integrity: sha512-KigOCHcocU3XODJxsu8i/j8T9tzT4adHiecwORRQ0ZZFcp7ahwXuRU1m+yuO90C5ZUyGeGfocHDI14M3L3yDAQ==} @@ -7786,6 +8657,10 @@ packages: safe-regex@2.1.1: resolution: {integrity: sha512-rx+x8AMzKb5Q5lQ95Zoi6ZbJqwCLkqi3XuJXp5P3rT8OEc6sZCJG5AE5dU3lsgRr/F4Bs31jSlVN+j5KrsGu9A==} + safe-stable-stringify@2.5.0: + resolution: {integrity: sha512-b3rppTKm9T+PsVCBEOUR46GWI7fdOs00VKZ1+9c1EWDaDMvjQc6tUwuFyIprgGgTcWoVHSKrU8H31ZHA2e0RHA==} + engines: {node: '>=10'} + safer-buffer@2.1.2: resolution: {integrity: sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==} @@ -7833,6 +8708,9 @@ packages: secure-json-parse@2.7.0: resolution: {integrity: sha512-6aU+Rwsezw7VR8/nyvKTx8QpWH9FrcYiXXlqC4z5d5XQBDRqtbfsRjnwGyqbi3gddNtWHuEk9OANUotL26qKUw==} + secure-json-parse@4.1.0: + resolution: {integrity: sha512-l4KnYfEyqYJxDwlNVyRfO2E4NTHfMKAWdUuA8J0yve2Dz/E/PdBepY03RvyJpssIpRFwJoCD55wA+mEDs6ByWA==} + seek-bzip@2.0.0: resolution: {integrity: sha512-SMguiTnYrhpLdk3PwfzHeotrcwi8bNV4iemL9tx9poR/yeaMYwB9VzR1w7b57DuWpuqR8n6oZboi0hj3AxZxQg==} hasBin: true @@ -8044,6 +8922,9 @@ packages: spdx-expression-parse@3.0.1: resolution: {integrity: sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q==} + spdx-expression-parse@4.0.0: + resolution: {integrity: sha512-Clya5JIij/7C6bRR22+tnGXbc4VKlibKSVj2iHvVeX5iMW7s1SIQlqu699JkODJJIhh/pUu8L0/VLh8xflD+LQ==} + spdx-license-ids@3.0.23: resolution: {integrity: sha512-CWLcCCH7VLu13TgOH+r8p1O/Znwhqv/dbb6lqWy67G+pT1kHmeD/+V36AVb/vq8QMIQwVShJ6Ssl5FPh0fuSdw==} @@ -8061,6 +8942,10 @@ packages: sprintf-js@1.0.3: resolution: {integrity: sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==} + stable-hash-x@0.2.0: + resolution: {integrity: sha512-o3yWv49B/o4QZk5ZcsALc6t0+eCelPc44zZsLtCQnZPDwFpDYSWcDnrv2TtMmMbQ7uKo3J0HTURCqckw23czNQ==} + engines: {node: '>=12.0.0'} + stable-hash@0.0.5: resolution: {integrity: sha512-+L3ccpzibovGXFK+Ap/f8LOS0ahMrHTf3xu7mMLSpEGU0EO9ucaysSylKo9eRDFNhWve/y275iPmIZ4z39a9iA==} @@ -8178,6 +9063,10 @@ packages: resolution: {integrity: sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==} engines: {node: '>=8'} + strip-json-comments@5.0.3: + resolution: {integrity: sha512-1tB5mhVo7U+ETBKNf92xT4hrQa3pm0MZ0PQvuDnWgAAGHDsfp4lPSpiS6psrSiet87wyGPh9ft6wmhOMQ0hDiw==} + engines: {node: '>=14.16'} + strnum@2.2.2: resolution: {integrity: sha512-DnR90I+jtXNSTXWdwrEy9FakW7UX+qUZg28gj5fk2vxxl7uS/3bpI4fjFYVmdK9etptYBPNkpahuQnEwhwECqA==} @@ -8209,6 +9098,12 @@ packages: peerDependencies: stylelint: ^14.0.0 || ^15.0.0 || ^16.0.1 + stylelint-order@7.0.1: + resolution: {integrity: sha512-GWPei1zBVDDjxM+/BmcSCiOcHNd8rSqW6FUZtqQGlTRpD0Z5nSzspzWD8rtKif5KPdzUG68DApKEV/y/I9VbTw==} + engines: {node: '>=20.19.0'} + peerDependencies: + stylelint: ^16.18.0 || ^17.0.0 + stylelint-prettier@4.1.0: resolution: {integrity: sha512-dd653q/d1IfvsSQshz1uAMe+XDm6hfM/7XiFH0htYY8Lse/s5ERTg7SURQehZPwVvm/rs7AsFhda9EQ2E9TS0g==} engines: {node: ^14.17.0 || >=16.0.0} @@ -8216,16 +9111,34 @@ packages: prettier: '>=3.0.0' stylelint: '>=15.8.0' + stylelint-prettier@5.0.3: + resolution: {integrity: sha512-B6V0oa35ekRrKZlf+6+jA+i50C4GXJ7X1PPmoCqSUoXN6BrNF6NhqqhanvkLjqw2qgvrS0wjdpeC+Tn06KN3jw==} + engines: {node: '>=18.12.0'} + peerDependencies: + prettier: '>=3.0.0' + stylelint: '>=16.0.0' + stylelint-scss@5.3.2: resolution: {integrity: sha512-4LzLaayFhFyneJwLo0IUa8knuIvj+zF0vBFueQs4e3tEaAMIQX8q5th8ziKkgOavr6y/y9yoBe+RXN/edwLzsQ==} peerDependencies: stylelint: ^14.5.1 || ^15.0.0 + stylelint-scss@6.14.0: + resolution: {integrity: sha512-ZKmHMZolxeuYsnB+PCYrTpFce0/QWX9i9gh0hPXzp73WjuIMqUpzdQaBCrKoLWh6XtCFSaNDErkMPqdjy1/8aA==} + engines: {node: '>=18.12.0'} + peerDependencies: + stylelint: ^16.8.2 + stylelint@15.11.0: resolution: {integrity: sha512-78O4c6IswZ9TzpcIiQJIN49K3qNoXTM8zEJzhaTE/xRTCZswaovSEVIa/uwbOltZrk16X4jAxjaOhzz/hTm1Kw==} engines: {node: ^14.13.1 || >=16.0.0} hasBin: true + stylelint@16.26.1: + resolution: {integrity: sha512-v20V59/crfc8sVTAtge0mdafI3AdnzQ2KsWe6v523L4OA1bJO02S7MO2oyXDCS6iWb9ckIPnqAFVItqSBQr7jw==} + engines: {node: '>=18.12.0'} + hasBin: true + supports-color@5.5.0: resolution: {integrity: sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==} engines: {node: '>=4'} @@ -8339,6 +9252,10 @@ packages: peerDependencies: tslib: ^2 + thread-stream@4.2.0: + resolution: {integrity: sha512-e2zZ96wSChazBsbENf/Pcm/4swHt2cEKQ92rhUjkL9GCKiTDJIaTBenjE/m9DXi0QBmTMDkFDdOomUy20A1tDQ==} + engines: {node: '>=20'} + through@2.3.8: resolution: {integrity: sha512-w89qg7PI8wAdvX60bMDP+bFoD5Dvhm9oLheFp5O4a2QF0cSBGsBX4qZmadPMvVqlLJBBci+WqGGOAPvcDeNSVg==} @@ -8610,6 +9527,11 @@ packages: peerDependencies: react: ^16.8.0 || ^17.0.0 || ^18.0.0 + use-sync-external-store@1.6.0: + resolution: {integrity: sha512-Pp6GSwGP/NrPIrxVFAIkOQeyw8lFenOHijQWkUTrDvrF4ALqylP2C/KCkeS9dpUM3KvYRQhna5vt7IL95+ZQ9w==} + peerDependencies: + react: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 + util-deprecate@1.0.2: resolution: {integrity: sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==} @@ -8859,6 +9781,11 @@ packages: yallist@4.0.0: resolution: {integrity: sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==} + yaml@2.9.0: + resolution: {integrity: sha512-2AvhNX3mb8zd6Zy7INTtSpl1F15HW6Wnqj0srWlkKLcpYl/gMIMJiyuGq2KeI2YFxUPjdlB+3Lc10seMLtL4cA==} + engines: {node: '>= 14.6'} + hasBin: true + yargs-parser@20.2.9: resolution: {integrity: sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w==} engines: {node: '>=10'} @@ -8887,6 +9814,9 @@ packages: resolution: {integrity: sha512-4LCcse/U2MHZ63HAJVE+v71o7yOdIe4cZ70Wpf8D/IyjDKYQLV5GD46B+hSTjJsvV5PztjvHoU580EftxjDZFQ==} engines: {node: '>=12.20'} + zod@4.4.3: + resolution: {integrity: sha512-ytENFjIJFl2UwYglde2jchW2Hwm4GJFLDiSXWdTrJQBIN9Fcyp7n4DhxJEiWNAJMV1/BqWfW/kkg71UDcHJyTQ==} + zustand@5.0.12: resolution: {integrity: sha512-i77ae3aZq4dhMlRhJVCYgMLKuSiZAaUPAct2AksxQ+gOtimhGMdXljRT21P5BNpeT4kXlLIckvkPM029OljD7g==} engines: {node: '>=12.20.0'} @@ -9393,6 +10323,14 @@ snapshots: eslint-visitor-keys: 2.1.0 semver: 6.3.1 + '@babel/eslint-parser@7.28.6(@babel/core@7.29.0)(eslint@9.39.5(jiti@2.6.1))': + dependencies: + '@babel/core': 7.29.0 + '@nicolo-ribaudo/eslint-scope-5-internals': 5.1.1-v1 + eslint: 9.39.5(jiti@2.6.1) + eslint-visitor-keys: 2.1.0 + semver: 6.3.1 + '@babel/generator@7.29.1': dependencies: '@babel/parser': 7.29.2 @@ -10185,6 +11123,18 @@ snapshots: '@borewit/text-codec@0.2.2': {} + '@cacheable/memory@2.2.0': + dependencies: + '@cacheable/utils': 2.5.0 + '@keyv/bigmap': 1.3.1(keyv@5.6.0) + hookified: 1.15.1 + keyv: 5.6.0 + + '@cacheable/utils@2.5.0': + dependencies: + hashery: 1.5.1 + keyv: 5.6.0 + '@colordx/core@5.0.0': {} '@commitlint/cli@19.8.1(@types/node@18.19.130)(typescript@5.6.3)': @@ -10325,13 +11275,28 @@ snapshots: dependencies: '@csstools/css-tokenizer': 2.4.1 + '@csstools/css-parser-algorithms@3.0.5(@csstools/css-tokenizer@3.0.4)': + dependencies: + '@csstools/css-tokenizer': 3.0.4 + + '@csstools/css-syntax-patches-for-csstree@1.1.6(css-tree@3.2.1)': + optionalDependencies: + css-tree: 3.2.1 + '@csstools/css-tokenizer@2.4.1': {} + '@csstools/css-tokenizer@3.0.4': {} + '@csstools/media-query-list-parser@2.1.13(@csstools/css-parser-algorithms@2.7.1(@csstools/css-tokenizer@2.4.1))(@csstools/css-tokenizer@2.4.1)': dependencies: '@csstools/css-parser-algorithms': 2.7.1(@csstools/css-tokenizer@2.4.1) '@csstools/css-tokenizer': 2.4.1 + '@csstools/media-query-list-parser@4.0.3(@csstools/css-parser-algorithms@3.0.5(@csstools/css-tokenizer@3.0.4))(@csstools/css-tokenizer@3.0.4)': + dependencies: + '@csstools/css-parser-algorithms': 3.0.5(@csstools/css-tokenizer@3.0.4) + '@csstools/css-tokenizer': 3.0.4 + '@csstools/postcss-cascade-layers@4.0.6(postcss@8.5.8)': dependencies: '@csstools/selector-specificity': 3.1.1(postcss-selector-parser@6.1.2) @@ -10505,6 +11470,10 @@ snapshots: dependencies: postcss-selector-parser: 6.1.2 + '@csstools/selector-specificity@5.0.0(postcss-selector-parser@7.1.1)': + dependencies: + postcss-selector-parser: 7.1.1 + '@csstools/utilities@1.0.0(postcss@8.5.8)': dependencies: postcss: 8.5.8 @@ -10513,6 +11482,8 @@ snapshots: '@discoveryjs/natural-compare@1.1.0': {} + '@dual-bundle/import-meta-resolve@4.2.1': {} + '@emnapi/core@1.9.1': dependencies: '@emnapi/wasi-threads': 1.2.0 @@ -10529,13 +11500,42 @@ snapshots: tslib: 2.8.1 optional: true + '@es-joy/jsdoccomment@0.50.2': + dependencies: + '@types/estree': 1.0.8 + '@typescript-eslint/types': 8.58.0 + comment-parser: 1.4.1 + esquery: 1.7.0 + jsdoc-type-pratt-parser: 4.1.0 + '@eslint-community/eslint-utils@4.9.1(eslint@8.57.1)': dependencies: eslint: 8.57.1 eslint-visitor-keys: 3.4.3 + '@eslint-community/eslint-utils@4.9.1(eslint@9.39.5(jiti@2.6.1))': + dependencies: + eslint: 9.39.5(jiti@2.6.1) + eslint-visitor-keys: 3.4.3 + '@eslint-community/regexpp@4.12.2': {} + '@eslint/config-array@0.21.2': + dependencies: + '@eslint/object-schema': 2.1.7 + debug: 4.4.3(supports-color@5.5.0) + minimatch: 3.1.5 + transitivePeerDependencies: + - supports-color + + '@eslint/config-helpers@0.4.2': + dependencies: + '@eslint/core': 0.17.0 + + '@eslint/core@0.17.0': + dependencies: + '@types/json-schema': 7.0.15 + '@eslint/eslintrc@2.1.4': dependencies: ajv: 6.14.0 @@ -10550,10 +11550,63 @@ snapshots: transitivePeerDependencies: - supports-color + '@eslint/eslintrc@3.3.6': + dependencies: + ajv: 6.14.0 + debug: 4.4.3(supports-color@5.5.0) + espree: 10.4.0 + globals: 14.0.0 + ignore: 5.3.2 + import-fresh: 3.3.1 + js-yaml: 4.3.0 + minimatch: 3.1.5 + strip-json-comments: 3.1.1 + transitivePeerDependencies: + - supports-color + '@eslint/js@8.57.1': {} + '@eslint/js@9.39.5': {} + + '@eslint/object-schema@2.1.7': {} + + '@eslint/plugin-kit@0.4.1': + dependencies: + '@eslint/core': 0.17.0 + levn: 0.4.1 + '@fastify/deepmerge@1.3.0': {} + '@floating-ui/core@1.8.0': + dependencies: + '@floating-ui/utils': 0.2.12 + + '@floating-ui/dom@1.8.0': + dependencies: + '@floating-ui/core': 1.8.0 + '@floating-ui/utils': 0.2.12 + + '@floating-ui/react-dom@2.1.9(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': + dependencies: + '@floating-ui/dom': 1.8.0 + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + + '@floating-ui/react@0.27.20(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': + dependencies: + '@floating-ui/react-dom': 2.1.9(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@floating-ui/utils': 0.2.12 + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + tabbable: 6.4.0 + + '@floating-ui/utils@0.2.12': {} + + '@gravity-ui/app-layout@2.5.1': + dependencies: + escape-html: 1.0.3 + htmlescape: 1.1.1 + '@gravity-ui/eslint-config@3.3.0(eslint@8.57.1)(prettier@3.3.3)(typescript@5.6.3)': dependencies: '@babel/core': 7.29.0 @@ -10563,7 +11616,7 @@ snapshots: '@typescript-eslint/parser': 8.58.0(eslint@8.57.1)(typescript@5.6.3) eslint: 8.57.1 eslint-config-prettier: 9.1.2(eslint@8.57.1) - eslint-import-resolver-typescript: 3.10.1(eslint-plugin-import@2.32.0)(eslint@8.57.1) + eslint-import-resolver-typescript: 3.10.1(eslint-plugin-import@2.32.0(@typescript-eslint/parser@8.58.0(eslint@8.57.1)(typescript@5.6.3))(eslint@8.57.1))(eslint@8.57.1) eslint-plugin-import: 2.32.0(@typescript-eslint/parser@8.58.0(eslint@8.57.1)(typescript@5.6.3))(eslint-import-resolver-typescript@3.10.1)(eslint@8.57.1) eslint-plugin-jsx-a11y: 6.10.2(eslint@8.57.1) eslint-plugin-prettier: 5.5.5(eslint-config-prettier@9.1.2(eslint@8.57.1))(eslint@8.57.1)(prettier@3.3.3) @@ -10579,6 +11632,49 @@ snapshots: - supports-color - typescript + '@gravity-ui/eslint-config@4.3.2(eslint@9.39.5(jiti@2.6.1))(prettier@3.3.3)(typescript@5.6.3)': + dependencies: + '@babel/core': 7.29.0 + '@babel/eslint-parser': 7.28.6(@babel/core@7.29.0)(eslint@9.39.5(jiti@2.6.1)) + '@babel/preset-react': 7.28.5(@babel/core@7.29.0) + '@eslint/js': 9.39.5 + '@stylistic/eslint-plugin': 4.4.1(eslint@9.39.5(jiti@2.6.1))(typescript@5.6.3) + '@typescript-eslint/eslint-plugin': 8.58.0(@typescript-eslint/parser@8.58.0(eslint@9.39.5(jiti@2.6.1))(typescript@5.6.3))(eslint@9.39.5(jiti@2.6.1))(typescript@5.6.3) + '@typescript-eslint/parser': 8.58.0(eslint@9.39.5(jiti@2.6.1))(typescript@5.6.3) + eslint-config-prettier: 10.1.8(eslint@9.39.5(jiti@2.6.1)) + eslint-import-resolver-typescript: 4.4.5(eslint-plugin-import@2.32.0)(eslint@9.39.5(jiti@2.6.1)) + eslint-plugin-import: 2.32.0(@typescript-eslint/parser@8.58.0(eslint@9.39.5(jiti@2.6.1))(typescript@5.6.3))(eslint-import-resolver-typescript@4.4.5)(eslint@9.39.5(jiti@2.6.1)) + eslint-plugin-jsdoc: 50.8.0(eslint@9.39.5(jiti@2.6.1)) + eslint-plugin-jsx-a11y: 6.10.2(eslint@9.39.5(jiti@2.6.1)) + eslint-plugin-prettier: 5.5.5(eslint-config-prettier@10.1.8(eslint@9.39.5(jiti@2.6.1)))(eslint@9.39.5(jiti@2.6.1))(prettier@3.3.3) + eslint-plugin-react: 7.37.5(eslint@9.39.5(jiti@2.6.1)) + eslint-plugin-react-hooks: 5.2.0(eslint@9.39.5(jiti@2.6.1)) + eslint-plugin-security: 3.0.1 + eslint-plugin-security-node: 1.1.4 + globals: 16.5.0 + optionalDependencies: + prettier: 3.3.3 + typescript: 5.6.3 + transitivePeerDependencies: + - '@types/eslint' + - eslint + - eslint-import-resolver-webpack + - eslint-plugin-import-x + - supports-color + + '@gravity-ui/expresskit@3.1.3(@gravity-ui/nodekit@2.16.0(axios@1.14.0))': + dependencies: + '@gravity-ui/nodekit': 2.16.0(axios@1.14.0) + accept-language-parser: 1.5.0 + body-parser: 1.20.4 + cookie-parser: 1.4.7 + csp-header: 5.2.1 + express: 4.22.1 + express-csp-header: 5.2.1 + zod: 4.4.3 + transitivePeerDependencies: + - supports-color + '@gravity-ui/i18n@1.8.0': {} '@gravity-ui/icons@2.18.0(react@18.3.1)': @@ -10587,6 +11683,25 @@ snapshots: optionalDependencies: react: 18.3.1 + '@gravity-ui/nodekit@2.16.0(axios@1.14.0)': + dependencies: + '@grpc/grpc-js': 1.14.4 + '@opentelemetry/api': 1.9.1 + '@opentelemetry/api-logs': 0.218.0 + '@opentelemetry/exporter-trace-otlp-grpc': 0.219.0(@opentelemetry/api@1.9.1) + '@opentelemetry/exporter-trace-otlp-http': 0.219.0(@opentelemetry/api@1.9.1) + '@opentelemetry/exporter-trace-otlp-proto': 0.219.0(@opentelemetry/api@1.9.1) + '@opentelemetry/propagator-jaeger': 2.9.0(@opentelemetry/api@1.9.1) + '@opentelemetry/sdk-logs': 0.219.0(@opentelemetry/api@1.9.1) + '@opentelemetry/sdk-node': 0.219.0(@opentelemetry/api@1.9.1) + '@opentelemetry/semantic-conventions': 1.43.0 + axios: 1.14.0 + dotenv: 17.4.2 + pino: 10.3.1 + pino-pretty: 13.1.3 + transitivePeerDependencies: + - supports-color + '@gravity-ui/prettier-config@1.1.0(prettier@3.3.3)': dependencies: prettier: 3.3.3 @@ -10602,6 +11717,17 @@ snapshots: optionalDependencies: prettier: 3.3.3 + '@gravity-ui/stylelint-config@5.0.0(postcss@8.5.8)(prettier@3.3.3)(stylelint@16.26.1(typescript@5.6.3))': + dependencies: + postcss: 8.5.8 + postcss-scss: 4.0.9(postcss@8.5.8) + stylelint: 16.26.1(typescript@5.6.3) + stylelint-order: 7.0.1(stylelint@16.26.1(typescript@5.6.3)) + stylelint-prettier: 5.0.3(prettier@3.3.3)(stylelint@16.26.1(typescript@5.6.3)) + stylelint-scss: 6.14.0(stylelint@16.26.1(typescript@5.6.3)) + optionalDependencies: + prettier: 3.3.3 + '@gravity-ui/tsconfig@1.0.0': {} '@gravity-ui/uikit@6.43.4(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': @@ -10627,6 +11753,66 @@ snapshots: transitivePeerDependencies: - react-native + '@gravity-ui/uikit@7.46.0(@babel/runtime@7.29.2)(@types/react@18.3.28)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': + dependencies: + '@bem-react/classname': 1.8.0 + '@floating-ui/react': 0.27.20(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@gravity-ui/i18n': 1.8.0 + '@gravity-ui/icons': 2.18.0(react@18.3.1) + '@hello-pangea/dnd': 18.0.1(@types/react@18.3.28)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@tanstack/react-virtual': 3.14.7(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@uiw/react-color': 2.10.3(@babel/runtime@7.29.2)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + blueimp-md5: 2.19.0 + lodash: 4.17.21 + rc-slider: 11.1.9(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + react-transition-group: 4.4.5(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + react-virtualized-auto-sizer: 1.0.26(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + react-window: 1.8.11(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + tabbable: 6.4.0 + tslib: 2.8.1 + use-sync-external-store: 1.6.0(react@18.3.1) + transitivePeerDependencies: + - '@babel/runtime' + - '@types/react' + + '@grpc/grpc-js@1.14.4': + dependencies: + '@grpc/proto-loader': 0.8.1 + '@js-sdsl/ordered-map': 4.4.2 + + '@grpc/proto-loader@0.8.1': + dependencies: + lodash.camelcase: 4.3.0 + long: 5.3.2 + protobufjs: 7.6.5 + yargs: 17.7.2 + + '@hello-pangea/dnd@18.0.1(@types/react@18.3.28)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': + dependencies: + '@babel/runtime': 7.29.2 + css-box-model: 1.2.1 + raf-schd: 4.0.3 + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + react-redux: 9.3.0(@types/react@18.3.28)(react@18.3.1)(redux@5.0.1) + redux: 5.0.1 + transitivePeerDependencies: + - '@types/react' + + '@humanfs/core@0.19.2': + dependencies: + '@humanfs/types': 0.15.0 + + '@humanfs/node@0.16.8': + dependencies: + '@humanfs/core': 0.19.2 + '@humanfs/types': 0.15.0 + '@humanwhocodes/retry': 0.4.3 + + '@humanfs/types@0.15.0': {} + '@humanwhocodes/config-array@0.13.0': dependencies: '@humanwhocodes/object-schema': 2.0.3 @@ -10639,6 +11825,8 @@ snapshots: '@humanwhocodes/object-schema@2.0.3': {} + '@humanwhocodes/retry@0.4.3': {} + '@isaacs/cliui@8.0.2': dependencies: string-width: 5.1.2 @@ -10869,6 +12057,8 @@ snapshots: '@jridgewell/sourcemap-codec': 1.5.5 optional: true + '@js-sdsl/ordered-map@4.4.2': {} + '@jsonjoy.com/base64@1.1.2(tslib@2.8.1)': dependencies: tslib: 2.8.1 @@ -10996,6 +12186,14 @@ snapshots: '@jsonjoy.com/codegen': 17.67.0(tslib@2.8.1) tslib: 2.8.1 + '@keyv/bigmap@1.3.1(keyv@5.6.0)': + dependencies: + hashery: 1.5.1 + hookified: 1.15.1 + keyv: 5.6.0 + + '@keyv/serialize@1.1.1': {} + '@leichtgewicht/ip-codec@2.0.5': {} '@module-federation/bridge-react-webpack-plugin@0.22.1': @@ -11259,41 +12457,293 @@ snapshots: '@tybys/wasm-util': 0.10.1 optional: true - '@napi-rs/wasm-runtime@1.0.7': + '@napi-rs/wasm-runtime@1.0.7': + dependencies: + '@emnapi/core': 1.9.1 + '@emnapi/runtime': 1.9.1 + '@tybys/wasm-util': 0.10.1 + optional: true + + '@napi-rs/wasm-runtime@1.1.4(@emnapi/core@1.9.1)(@emnapi/runtime@1.9.1)': + dependencies: + '@emnapi/core': 1.9.1 + '@emnapi/runtime': 1.9.1 + '@tybys/wasm-util': 0.10.1 + optional: true + + '@nicolo-ribaudo/eslint-scope-5-internals@5.1.1-v1': + dependencies: + eslint-scope: 5.1.1 + + '@noble/hashes@1.4.0': {} + + '@nodelib/fs.scandir@2.1.5': + dependencies: + '@nodelib/fs.stat': 2.0.5 + run-parallel: 1.2.0 + + '@nodelib/fs.stat@2.0.5': {} + + '@nodelib/fs.walk@1.2.8': + dependencies: + '@nodelib/fs.scandir': 2.1.5 + fastq: 1.20.1 + + '@nolyfill/is-core-module@1.0.39': {} + + '@okikio/sharedworker@1.1.0': {} + + '@opentelemetry/api-logs@0.218.0': + dependencies: + '@opentelemetry/api': 1.9.1 + + '@opentelemetry/api-logs@0.219.0': + dependencies: + '@opentelemetry/api': 1.9.1 + + '@opentelemetry/api@1.9.1': {} + + '@opentelemetry/configuration@0.219.0(@opentelemetry/api@1.9.1)': + dependencies: + '@opentelemetry/api': 1.9.1 + '@opentelemetry/core': 2.8.0(@opentelemetry/api@1.9.1) + yaml: 2.9.0 + + '@opentelemetry/context-async-hooks@2.8.0(@opentelemetry/api@1.9.1)': + dependencies: + '@opentelemetry/api': 1.9.1 + + '@opentelemetry/core@2.8.0(@opentelemetry/api@1.9.1)': + dependencies: + '@opentelemetry/api': 1.9.1 + '@opentelemetry/semantic-conventions': 1.43.0 + + '@opentelemetry/core@2.9.0(@opentelemetry/api@1.9.1)': + dependencies: + '@opentelemetry/api': 1.9.1 + '@opentelemetry/semantic-conventions': 1.43.0 + + '@opentelemetry/exporter-logs-otlp-grpc@0.219.0(@opentelemetry/api@1.9.1)': + dependencies: + '@grpc/grpc-js': 1.14.4 + '@opentelemetry/api': 1.9.1 + '@opentelemetry/core': 2.8.0(@opentelemetry/api@1.9.1) + '@opentelemetry/otlp-exporter-base': 0.219.0(@opentelemetry/api@1.9.1) + '@opentelemetry/otlp-grpc-exporter-base': 0.219.0(@opentelemetry/api@1.9.1) + '@opentelemetry/otlp-transformer': 0.219.0(@opentelemetry/api@1.9.1) + '@opentelemetry/sdk-logs': 0.219.0(@opentelemetry/api@1.9.1) + + '@opentelemetry/exporter-logs-otlp-http@0.219.0(@opentelemetry/api@1.9.1)': + dependencies: + '@opentelemetry/api': 1.9.1 + '@opentelemetry/api-logs': 0.219.0 + '@opentelemetry/core': 2.8.0(@opentelemetry/api@1.9.1) + '@opentelemetry/otlp-exporter-base': 0.219.0(@opentelemetry/api@1.9.1) + '@opentelemetry/otlp-transformer': 0.219.0(@opentelemetry/api@1.9.1) + '@opentelemetry/sdk-logs': 0.219.0(@opentelemetry/api@1.9.1) + + '@opentelemetry/exporter-logs-otlp-proto@0.219.0(@opentelemetry/api@1.9.1)': + dependencies: + '@opentelemetry/api': 1.9.1 + '@opentelemetry/api-logs': 0.219.0 + '@opentelemetry/core': 2.8.0(@opentelemetry/api@1.9.1) + '@opentelemetry/otlp-exporter-base': 0.219.0(@opentelemetry/api@1.9.1) + '@opentelemetry/otlp-transformer': 0.219.0(@opentelemetry/api@1.9.1) + '@opentelemetry/resources': 2.8.0(@opentelemetry/api@1.9.1) + '@opentelemetry/sdk-logs': 0.219.0(@opentelemetry/api@1.9.1) + '@opentelemetry/sdk-trace-base': 2.8.0(@opentelemetry/api@1.9.1) + + '@opentelemetry/exporter-metrics-otlp-grpc@0.219.0(@opentelemetry/api@1.9.1)': dependencies: - '@emnapi/core': 1.9.1 - '@emnapi/runtime': 1.9.1 - '@tybys/wasm-util': 0.10.1 - optional: true + '@grpc/grpc-js': 1.14.4 + '@opentelemetry/api': 1.9.1 + '@opentelemetry/core': 2.8.0(@opentelemetry/api@1.9.1) + '@opentelemetry/exporter-metrics-otlp-http': 0.219.0(@opentelemetry/api@1.9.1) + '@opentelemetry/otlp-exporter-base': 0.219.0(@opentelemetry/api@1.9.1) + '@opentelemetry/otlp-grpc-exporter-base': 0.219.0(@opentelemetry/api@1.9.1) + '@opentelemetry/otlp-transformer': 0.219.0(@opentelemetry/api@1.9.1) + '@opentelemetry/resources': 2.8.0(@opentelemetry/api@1.9.1) + '@opentelemetry/sdk-metrics': 2.8.0(@opentelemetry/api@1.9.1) - '@napi-rs/wasm-runtime@1.1.4(@emnapi/core@1.9.1)(@emnapi/runtime@1.9.1)': + '@opentelemetry/exporter-metrics-otlp-http@0.219.0(@opentelemetry/api@1.9.1)': dependencies: - '@emnapi/core': 1.9.1 - '@emnapi/runtime': 1.9.1 - '@tybys/wasm-util': 0.10.1 - optional: true + '@opentelemetry/api': 1.9.1 + '@opentelemetry/core': 2.8.0(@opentelemetry/api@1.9.1) + '@opentelemetry/otlp-exporter-base': 0.219.0(@opentelemetry/api@1.9.1) + '@opentelemetry/otlp-transformer': 0.219.0(@opentelemetry/api@1.9.1) + '@opentelemetry/resources': 2.8.0(@opentelemetry/api@1.9.1) + '@opentelemetry/sdk-metrics': 2.8.0(@opentelemetry/api@1.9.1) - '@nicolo-ribaudo/eslint-scope-5-internals@5.1.1-v1': + '@opentelemetry/exporter-metrics-otlp-proto@0.219.0(@opentelemetry/api@1.9.1)': dependencies: - eslint-scope: 5.1.1 + '@opentelemetry/api': 1.9.1 + '@opentelemetry/core': 2.8.0(@opentelemetry/api@1.9.1) + '@opentelemetry/exporter-metrics-otlp-http': 0.219.0(@opentelemetry/api@1.9.1) + '@opentelemetry/otlp-exporter-base': 0.219.0(@opentelemetry/api@1.9.1) + '@opentelemetry/otlp-transformer': 0.219.0(@opentelemetry/api@1.9.1) + '@opentelemetry/resources': 2.8.0(@opentelemetry/api@1.9.1) + '@opentelemetry/sdk-metrics': 2.8.0(@opentelemetry/api@1.9.1) - '@noble/hashes@1.4.0': {} + '@opentelemetry/exporter-prometheus@0.219.0(@opentelemetry/api@1.9.1)': + dependencies: + '@opentelemetry/api': 1.9.1 + '@opentelemetry/core': 2.8.0(@opentelemetry/api@1.9.1) + '@opentelemetry/resources': 2.8.0(@opentelemetry/api@1.9.1) + '@opentelemetry/sdk-metrics': 2.8.0(@opentelemetry/api@1.9.1) + '@opentelemetry/semantic-conventions': 1.43.0 - '@nodelib/fs.scandir@2.1.5': + '@opentelemetry/exporter-trace-otlp-grpc@0.219.0(@opentelemetry/api@1.9.1)': dependencies: - '@nodelib/fs.stat': 2.0.5 - run-parallel: 1.2.0 + '@grpc/grpc-js': 1.14.4 + '@opentelemetry/api': 1.9.1 + '@opentelemetry/core': 2.8.0(@opentelemetry/api@1.9.1) + '@opentelemetry/otlp-exporter-base': 0.219.0(@opentelemetry/api@1.9.1) + '@opentelemetry/otlp-grpc-exporter-base': 0.219.0(@opentelemetry/api@1.9.1) + '@opentelemetry/otlp-transformer': 0.219.0(@opentelemetry/api@1.9.1) + '@opentelemetry/resources': 2.8.0(@opentelemetry/api@1.9.1) + '@opentelemetry/sdk-trace-base': 2.8.0(@opentelemetry/api@1.9.1) + + '@opentelemetry/exporter-trace-otlp-http@0.219.0(@opentelemetry/api@1.9.1)': + dependencies: + '@opentelemetry/api': 1.9.1 + '@opentelemetry/core': 2.8.0(@opentelemetry/api@1.9.1) + '@opentelemetry/otlp-exporter-base': 0.219.0(@opentelemetry/api@1.9.1) + '@opentelemetry/otlp-transformer': 0.219.0(@opentelemetry/api@1.9.1) + '@opentelemetry/resources': 2.8.0(@opentelemetry/api@1.9.1) + '@opentelemetry/sdk-trace-base': 2.8.0(@opentelemetry/api@1.9.1) + + '@opentelemetry/exporter-trace-otlp-proto@0.219.0(@opentelemetry/api@1.9.1)': + dependencies: + '@opentelemetry/api': 1.9.1 + '@opentelemetry/core': 2.8.0(@opentelemetry/api@1.9.1) + '@opentelemetry/otlp-exporter-base': 0.219.0(@opentelemetry/api@1.9.1) + '@opentelemetry/otlp-transformer': 0.219.0(@opentelemetry/api@1.9.1) + '@opentelemetry/resources': 2.8.0(@opentelemetry/api@1.9.1) + '@opentelemetry/sdk-trace-base': 2.8.0(@opentelemetry/api@1.9.1) + + '@opentelemetry/exporter-zipkin@2.8.0(@opentelemetry/api@1.9.1)': + dependencies: + '@opentelemetry/api': 1.9.1 + '@opentelemetry/core': 2.8.0(@opentelemetry/api@1.9.1) + '@opentelemetry/resources': 2.8.0(@opentelemetry/api@1.9.1) + '@opentelemetry/sdk-trace-base': 2.8.0(@opentelemetry/api@1.9.1) + '@opentelemetry/semantic-conventions': 1.43.0 + + '@opentelemetry/instrumentation@0.219.0(@opentelemetry/api@1.9.1)': + dependencies: + '@opentelemetry/api': 1.9.1 + '@opentelemetry/api-logs': 0.219.0 + import-in-the-middle: 3.3.2 + require-in-the-middle: 8.0.1 + transitivePeerDependencies: + - supports-color - '@nodelib/fs.stat@2.0.5': {} + '@opentelemetry/otlp-exporter-base@0.219.0(@opentelemetry/api@1.9.1)': + dependencies: + '@opentelemetry/api': 1.9.1 + '@opentelemetry/core': 2.8.0(@opentelemetry/api@1.9.1) + '@opentelemetry/otlp-transformer': 0.219.0(@opentelemetry/api@1.9.1) + + '@opentelemetry/otlp-grpc-exporter-base@0.219.0(@opentelemetry/api@1.9.1)': + dependencies: + '@grpc/grpc-js': 1.14.4 + '@opentelemetry/api': 1.9.1 + '@opentelemetry/core': 2.8.0(@opentelemetry/api@1.9.1) + '@opentelemetry/otlp-exporter-base': 0.219.0(@opentelemetry/api@1.9.1) + '@opentelemetry/otlp-transformer': 0.219.0(@opentelemetry/api@1.9.1) + + '@opentelemetry/otlp-transformer@0.219.0(@opentelemetry/api@1.9.1)': + dependencies: + '@opentelemetry/api': 1.9.1 + '@opentelemetry/api-logs': 0.219.0 + '@opentelemetry/core': 2.8.0(@opentelemetry/api@1.9.1) + '@opentelemetry/resources': 2.8.0(@opentelemetry/api@1.9.1) + '@opentelemetry/sdk-logs': 0.219.0(@opentelemetry/api@1.9.1) + '@opentelemetry/sdk-metrics': 2.8.0(@opentelemetry/api@1.9.1) + '@opentelemetry/sdk-trace-base': 2.8.0(@opentelemetry/api@1.9.1) + + '@opentelemetry/propagator-b3@2.8.0(@opentelemetry/api@1.9.1)': + dependencies: + '@opentelemetry/api': 1.9.1 + '@opentelemetry/core': 2.8.0(@opentelemetry/api@1.9.1) + + '@opentelemetry/propagator-jaeger@2.8.0(@opentelemetry/api@1.9.1)': + dependencies: + '@opentelemetry/api': 1.9.1 + '@opentelemetry/core': 2.8.0(@opentelemetry/api@1.9.1) + + '@opentelemetry/propagator-jaeger@2.9.0(@opentelemetry/api@1.9.1)': + dependencies: + '@opentelemetry/api': 1.9.1 + '@opentelemetry/core': 2.9.0(@opentelemetry/api@1.9.1) + + '@opentelemetry/resources@2.8.0(@opentelemetry/api@1.9.1)': + dependencies: + '@opentelemetry/api': 1.9.1 + '@opentelemetry/core': 2.8.0(@opentelemetry/api@1.9.1) + '@opentelemetry/semantic-conventions': 1.43.0 + + '@opentelemetry/sdk-logs@0.219.0(@opentelemetry/api@1.9.1)': + dependencies: + '@opentelemetry/api': 1.9.1 + '@opentelemetry/api-logs': 0.219.0 + '@opentelemetry/core': 2.8.0(@opentelemetry/api@1.9.1) + '@opentelemetry/resources': 2.8.0(@opentelemetry/api@1.9.1) + '@opentelemetry/semantic-conventions': 1.43.0 + + '@opentelemetry/sdk-metrics@2.8.0(@opentelemetry/api@1.9.1)': + dependencies: + '@opentelemetry/api': 1.9.1 + '@opentelemetry/core': 2.8.0(@opentelemetry/api@1.9.1) + '@opentelemetry/resources': 2.8.0(@opentelemetry/api@1.9.1) + + '@opentelemetry/sdk-node@0.219.0(@opentelemetry/api@1.9.1)': + dependencies: + '@opentelemetry/api': 1.9.1 + '@opentelemetry/api-logs': 0.219.0 + '@opentelemetry/configuration': 0.219.0(@opentelemetry/api@1.9.1) + '@opentelemetry/context-async-hooks': 2.8.0(@opentelemetry/api@1.9.1) + '@opentelemetry/core': 2.8.0(@opentelemetry/api@1.9.1) + '@opentelemetry/exporter-logs-otlp-grpc': 0.219.0(@opentelemetry/api@1.9.1) + '@opentelemetry/exporter-logs-otlp-http': 0.219.0(@opentelemetry/api@1.9.1) + '@opentelemetry/exporter-logs-otlp-proto': 0.219.0(@opentelemetry/api@1.9.1) + '@opentelemetry/exporter-metrics-otlp-grpc': 0.219.0(@opentelemetry/api@1.9.1) + '@opentelemetry/exporter-metrics-otlp-http': 0.219.0(@opentelemetry/api@1.9.1) + '@opentelemetry/exporter-metrics-otlp-proto': 0.219.0(@opentelemetry/api@1.9.1) + '@opentelemetry/exporter-prometheus': 0.219.0(@opentelemetry/api@1.9.1) + '@opentelemetry/exporter-trace-otlp-grpc': 0.219.0(@opentelemetry/api@1.9.1) + '@opentelemetry/exporter-trace-otlp-http': 0.219.0(@opentelemetry/api@1.9.1) + '@opentelemetry/exporter-trace-otlp-proto': 0.219.0(@opentelemetry/api@1.9.1) + '@opentelemetry/exporter-zipkin': 2.8.0(@opentelemetry/api@1.9.1) + '@opentelemetry/instrumentation': 0.219.0(@opentelemetry/api@1.9.1) + '@opentelemetry/otlp-exporter-base': 0.219.0(@opentelemetry/api@1.9.1) + '@opentelemetry/otlp-grpc-exporter-base': 0.219.0(@opentelemetry/api@1.9.1) + '@opentelemetry/propagator-b3': 2.8.0(@opentelemetry/api@1.9.1) + '@opentelemetry/propagator-jaeger': 2.8.0(@opentelemetry/api@1.9.1) + '@opentelemetry/resources': 2.8.0(@opentelemetry/api@1.9.1) + '@opentelemetry/sdk-logs': 0.219.0(@opentelemetry/api@1.9.1) + '@opentelemetry/sdk-metrics': 2.8.0(@opentelemetry/api@1.9.1) + '@opentelemetry/sdk-trace-base': 2.8.0(@opentelemetry/api@1.9.1) + '@opentelemetry/sdk-trace-node': 2.8.0(@opentelemetry/api@1.9.1) + '@opentelemetry/semantic-conventions': 1.43.0 + transitivePeerDependencies: + - supports-color - '@nodelib/fs.walk@1.2.8': + '@opentelemetry/sdk-trace-base@2.8.0(@opentelemetry/api@1.9.1)': dependencies: - '@nodelib/fs.scandir': 2.1.5 - fastq: 1.20.1 + '@opentelemetry/api': 1.9.1 + '@opentelemetry/core': 2.8.0(@opentelemetry/api@1.9.1) + '@opentelemetry/resources': 2.8.0(@opentelemetry/api@1.9.1) + '@opentelemetry/semantic-conventions': 1.43.0 - '@nolyfill/is-core-module@1.0.39': {} + '@opentelemetry/sdk-trace-node@2.8.0(@opentelemetry/api@1.9.1)': + dependencies: + '@opentelemetry/api': 1.9.1 + '@opentelemetry/context-async-hooks': 2.8.0(@opentelemetry/api@1.9.1) + '@opentelemetry/core': 2.8.0(@opentelemetry/api@1.9.1) + '@opentelemetry/sdk-trace-base': 2.8.0(@opentelemetry/api@1.9.1) - '@okikio/sharedworker@1.1.0': {} + '@opentelemetry/semantic-conventions@1.43.0': {} '@parcel/watcher-android-arm64@2.5.6': optional: true @@ -11446,6 +12896,8 @@ snapshots: tslib: 2.8.1 tsyringe: 4.10.0 + '@pinojs/redact@0.4.0': {} + '@pkgjs/parseargs@0.11.0': optional: true @@ -11471,6 +12923,26 @@ snapshots: '@popperjs/core@2.11.8': {} + '@protobufjs/aspromise@1.1.2': {} + + '@protobufjs/base64@1.1.2': {} + + '@protobufjs/codegen@2.0.5': {} + + '@protobufjs/eventemitter@1.1.1': {} + + '@protobufjs/fetch@1.1.1': + dependencies: + '@protobufjs/aspromise': 1.1.2 + + '@protobufjs/float@1.0.2': {} + + '@protobufjs/path@1.1.2': {} + + '@protobufjs/pool@1.1.0': {} + + '@protobufjs/utf8@1.1.2': {} + '@rsbuild/plugin-check-syntax@1.6.1': dependencies: acorn: 8.16.0 @@ -12290,6 +13762,18 @@ snapshots: '@statoscope/types': 5.28.1 '@types/md5': 2.3.6 + '@stylistic/eslint-plugin@4.4.1(eslint@9.39.5(jiti@2.6.1))(typescript@5.6.3)': + dependencies: + '@typescript-eslint/utils': 8.58.0(eslint@9.39.5(jiti@2.6.1))(typescript@5.6.3) + eslint: 9.39.5(jiti@2.6.1) + eslint-visitor-keys: 4.2.1 + espree: 10.4.0 + estraverse: 5.3.0 + picomatch: 4.0.4 + transitivePeerDependencies: + - supports-color + - typescript + '@svgr/babel-plugin-add-jsx-attribute@8.0.0(@babel/core@7.29.0)': dependencies: '@babel/core': 7.29.0 @@ -12463,6 +13947,14 @@ snapshots: dependencies: defer-to-connect: 2.0.1 + '@tanstack/react-virtual@3.14.7(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': + dependencies: + '@tanstack/virtual-core': 3.17.5 + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + + '@tanstack/virtual-core@3.17.5': {} + '@tokenizer/inflate@0.2.7': dependencies: debug: 4.4.3(supports-color@5.5.0) @@ -12740,6 +14232,8 @@ snapshots: dependencies: source-map: 0.6.1 + '@types/use-sync-external-store@0.0.6': {} + '@types/webpack-assets-manifest@5.1.4(@swc/core@1.15.5)': dependencies: '@types/node': 18.19.130 @@ -12833,6 +14327,22 @@ snapshots: transitivePeerDependencies: - supports-color + '@typescript-eslint/eslint-plugin@8.58.0(@typescript-eslint/parser@8.58.0(eslint@9.39.5(jiti@2.6.1))(typescript@5.6.3))(eslint@9.39.5(jiti@2.6.1))(typescript@5.6.3)': + dependencies: + '@eslint-community/regexpp': 4.12.2 + '@typescript-eslint/parser': 8.58.0(eslint@9.39.5(jiti@2.6.1))(typescript@5.6.3) + '@typescript-eslint/scope-manager': 8.58.0 + '@typescript-eslint/type-utils': 8.58.0(eslint@9.39.5(jiti@2.6.1))(typescript@5.6.3) + '@typescript-eslint/utils': 8.58.0(eslint@9.39.5(jiti@2.6.1))(typescript@5.6.3) + '@typescript-eslint/visitor-keys': 8.58.0 + eslint: 9.39.5(jiti@2.6.1) + ignore: 7.0.5 + natural-compare: 1.4.0 + ts-api-utils: 2.5.0(typescript@5.6.3) + typescript: 5.6.3 + transitivePeerDependencies: + - supports-color + '@typescript-eslint/parser@8.58.0(eslint@8.57.1)(typescript@5.6.3)': dependencies: '@typescript-eslint/scope-manager': 8.58.0 @@ -12845,6 +14355,18 @@ snapshots: transitivePeerDependencies: - supports-color + '@typescript-eslint/parser@8.58.0(eslint@9.39.5(jiti@2.6.1))(typescript@5.6.3)': + dependencies: + '@typescript-eslint/scope-manager': 8.58.0 + '@typescript-eslint/types': 8.58.0 + '@typescript-eslint/typescript-estree': 8.58.0(typescript@5.6.3) + '@typescript-eslint/visitor-keys': 8.58.0 + debug: 4.4.3(supports-color@5.5.0) + eslint: 9.39.5(jiti@2.6.1) + typescript: 5.6.3 + transitivePeerDependencies: + - supports-color + '@typescript-eslint/project-service@8.58.0(typescript@5.6.3)': dependencies: '@typescript-eslint/tsconfig-utils': 8.58.0(typescript@5.6.3) @@ -12875,6 +14397,18 @@ snapshots: transitivePeerDependencies: - supports-color + '@typescript-eslint/type-utils@8.58.0(eslint@9.39.5(jiti@2.6.1))(typescript@5.6.3)': + dependencies: + '@typescript-eslint/types': 8.58.0 + '@typescript-eslint/typescript-estree': 8.58.0(typescript@5.6.3) + '@typescript-eslint/utils': 8.58.0(eslint@9.39.5(jiti@2.6.1))(typescript@5.6.3) + debug: 4.4.3(supports-color@5.5.0) + eslint: 9.39.5(jiti@2.6.1) + ts-api-utils: 2.5.0(typescript@5.6.3) + typescript: 5.6.3 + transitivePeerDependencies: + - supports-color + '@typescript-eslint/types@8.58.0': {} '@typescript-eslint/typescript-estree@8.58.0(typescript@5.6.3)': @@ -12903,11 +14437,222 @@ snapshots: transitivePeerDependencies: - supports-color + '@typescript-eslint/utils@8.58.0(eslint@9.39.5(jiti@2.6.1))(typescript@5.6.3)': + dependencies: + '@eslint-community/eslint-utils': 4.9.1(eslint@9.39.5(jiti@2.6.1)) + '@typescript-eslint/scope-manager': 8.58.0 + '@typescript-eslint/types': 8.58.0 + '@typescript-eslint/typescript-estree': 8.58.0(typescript@5.6.3) + eslint: 9.39.5(jiti@2.6.1) + typescript: 5.6.3 + transitivePeerDependencies: + - supports-color + '@typescript-eslint/visitor-keys@8.58.0': dependencies: '@typescript-eslint/types': 8.58.0 eslint-visitor-keys: 5.0.1 + '@uiw/color-convert@2.10.3(@babel/runtime@7.29.2)': + dependencies: + '@babel/runtime': 7.29.2 + + '@uiw/react-color-alpha@2.10.3(@babel/runtime@7.29.2)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': + dependencies: + '@babel/runtime': 7.29.2 + '@uiw/color-convert': 2.10.3(@babel/runtime@7.29.2) + '@uiw/react-drag-event-interactive': 2.10.3(@babel/runtime@7.29.2)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + + '@uiw/react-color-block@2.10.3(@babel/runtime@7.29.2)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': + dependencies: + '@babel/runtime': 7.29.2 + '@uiw/color-convert': 2.10.3(@babel/runtime@7.29.2) + '@uiw/react-color-editable-input': 2.10.3(@babel/runtime@7.29.2)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@uiw/react-color-swatch': 2.10.3(@babel/runtime@7.29.2)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + + '@uiw/react-color-chrome@2.10.3(@babel/runtime@7.29.2)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': + dependencies: + '@babel/runtime': 7.29.2 + '@uiw/color-convert': 2.10.3(@babel/runtime@7.29.2) + '@uiw/react-color-alpha': 2.10.3(@babel/runtime@7.29.2)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@uiw/react-color-editable-input': 2.10.3(@babel/runtime@7.29.2)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@uiw/react-color-editable-input-hsla': 2.10.3(@babel/runtime@7.29.2)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@uiw/react-color-editable-input-rgba': 2.10.3(@babel/runtime@7.29.2)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@uiw/react-color-github': 2.10.3(@babel/runtime@7.29.2)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@uiw/react-color-hue': 2.10.3(@babel/runtime@7.29.2)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@uiw/react-color-saturation': 2.10.3(@babel/runtime@7.29.2)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + + '@uiw/react-color-circle@2.10.3(@babel/runtime@7.29.2)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': + dependencies: + '@babel/runtime': 7.29.2 + '@uiw/color-convert': 2.10.3(@babel/runtime@7.29.2) + '@uiw/react-color-swatch': 2.10.3(@babel/runtime@7.29.2)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + + '@uiw/react-color-colorful@2.10.3(@babel/runtime@7.29.2)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': + dependencies: + '@babel/runtime': 7.29.2 + '@uiw/color-convert': 2.10.3(@babel/runtime@7.29.2) + '@uiw/react-color-alpha': 2.10.3(@babel/runtime@7.29.2)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@uiw/react-color-hue': 2.10.3(@babel/runtime@7.29.2)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@uiw/react-color-saturation': 2.10.3(@babel/runtime@7.29.2)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + + '@uiw/react-color-compact@2.10.3(@babel/runtime@7.29.2)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': + dependencies: + '@babel/runtime': 7.29.2 + '@uiw/color-convert': 2.10.3(@babel/runtime@7.29.2) + '@uiw/react-color-editable-input': 2.10.3(@babel/runtime@7.29.2)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@uiw/react-color-editable-input-rgba': 2.10.3(@babel/runtime@7.29.2)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@uiw/react-color-swatch': 2.10.3(@babel/runtime@7.29.2)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + + '@uiw/react-color-editable-input-hsla@2.10.3(@babel/runtime@7.29.2)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': + dependencies: + '@babel/runtime': 7.29.2 + '@uiw/color-convert': 2.10.3(@babel/runtime@7.29.2) + '@uiw/react-color-editable-input-rgba': 2.10.3(@babel/runtime@7.29.2)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + + '@uiw/react-color-editable-input-rgba@2.10.3(@babel/runtime@7.29.2)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': + dependencies: + '@babel/runtime': 7.29.2 + '@uiw/color-convert': 2.10.3(@babel/runtime@7.29.2) + '@uiw/react-color-editable-input': 2.10.3(@babel/runtime@7.29.2)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + + '@uiw/react-color-editable-input@2.10.3(@babel/runtime@7.29.2)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': + dependencies: + '@babel/runtime': 7.29.2 + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + + '@uiw/react-color-github@2.10.3(@babel/runtime@7.29.2)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': + dependencies: + '@babel/runtime': 7.29.2 + '@uiw/color-convert': 2.10.3(@babel/runtime@7.29.2) + '@uiw/react-color-swatch': 2.10.3(@babel/runtime@7.29.2)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + + '@uiw/react-color-hue@2.10.3(@babel/runtime@7.29.2)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': + dependencies: + '@babel/runtime': 7.29.2 + '@uiw/color-convert': 2.10.3(@babel/runtime@7.29.2) + '@uiw/react-color-alpha': 2.10.3(@babel/runtime@7.29.2)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + + '@uiw/react-color-material@2.10.3(@babel/runtime@7.29.2)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': + dependencies: + '@babel/runtime': 7.29.2 + '@uiw/color-convert': 2.10.3(@babel/runtime@7.29.2) + '@uiw/react-color-editable-input': 2.10.3(@babel/runtime@7.29.2)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@uiw/react-color-editable-input-rgba': 2.10.3(@babel/runtime@7.29.2)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + + '@uiw/react-color-name@2.10.3(@babel/runtime@7.29.2)': + dependencies: + '@babel/runtime': 7.29.2 + colors-named: 1.0.5 + colors-named-hex: 1.0.4 + + '@uiw/react-color-saturation@2.10.3(@babel/runtime@7.29.2)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': + dependencies: + '@babel/runtime': 7.29.2 + '@uiw/color-convert': 2.10.3(@babel/runtime@7.29.2) + '@uiw/react-drag-event-interactive': 2.10.3(@babel/runtime@7.29.2)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + + '@uiw/react-color-shade-slider@2.10.3(@babel/runtime@7.29.2)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': + dependencies: + '@babel/runtime': 7.29.2 + '@uiw/color-convert': 2.10.3(@babel/runtime@7.29.2) + '@uiw/react-color-alpha': 2.10.3(@babel/runtime@7.29.2)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + + '@uiw/react-color-sketch@2.10.3(@babel/runtime@7.29.2)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': + dependencies: + '@babel/runtime': 7.29.2 + '@uiw/color-convert': 2.10.3(@babel/runtime@7.29.2) + '@uiw/react-color-alpha': 2.10.3(@babel/runtime@7.29.2)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@uiw/react-color-editable-input': 2.10.3(@babel/runtime@7.29.2)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@uiw/react-color-editable-input-rgba': 2.10.3(@babel/runtime@7.29.2)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@uiw/react-color-hue': 2.10.3(@babel/runtime@7.29.2)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@uiw/react-color-saturation': 2.10.3(@babel/runtime@7.29.2)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@uiw/react-color-swatch': 2.10.3(@babel/runtime@7.29.2)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + + '@uiw/react-color-slider@2.10.3(@babel/runtime@7.29.2)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': + dependencies: + '@babel/runtime': 7.29.2 + '@uiw/color-convert': 2.10.3(@babel/runtime@7.29.2) + '@uiw/react-color-alpha': 2.10.3(@babel/runtime@7.29.2)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + + '@uiw/react-color-swatch@2.10.3(@babel/runtime@7.29.2)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': + dependencies: + '@babel/runtime': 7.29.2 + '@uiw/color-convert': 2.10.3(@babel/runtime@7.29.2) + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + + '@uiw/react-color-wheel@2.10.3(@babel/runtime@7.29.2)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': + dependencies: + '@babel/runtime': 7.29.2 + '@uiw/color-convert': 2.10.3(@babel/runtime@7.29.2) + '@uiw/react-drag-event-interactive': 2.10.3(@babel/runtime@7.29.2)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + + '@uiw/react-color@2.10.3(@babel/runtime@7.29.2)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': + dependencies: + '@babel/runtime': 7.29.2 + '@uiw/color-convert': 2.10.3(@babel/runtime@7.29.2) + '@uiw/react-color-alpha': 2.10.3(@babel/runtime@7.29.2)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@uiw/react-color-block': 2.10.3(@babel/runtime@7.29.2)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@uiw/react-color-chrome': 2.10.3(@babel/runtime@7.29.2)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@uiw/react-color-circle': 2.10.3(@babel/runtime@7.29.2)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@uiw/react-color-colorful': 2.10.3(@babel/runtime@7.29.2)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@uiw/react-color-compact': 2.10.3(@babel/runtime@7.29.2)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@uiw/react-color-editable-input': 2.10.3(@babel/runtime@7.29.2)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@uiw/react-color-editable-input-hsla': 2.10.3(@babel/runtime@7.29.2)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@uiw/react-color-editable-input-rgba': 2.10.3(@babel/runtime@7.29.2)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@uiw/react-color-github': 2.10.3(@babel/runtime@7.29.2)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@uiw/react-color-hue': 2.10.3(@babel/runtime@7.29.2)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@uiw/react-color-material': 2.10.3(@babel/runtime@7.29.2)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@uiw/react-color-name': 2.10.3(@babel/runtime@7.29.2) + '@uiw/react-color-saturation': 2.10.3(@babel/runtime@7.29.2)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@uiw/react-color-shade-slider': 2.10.3(@babel/runtime@7.29.2)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@uiw/react-color-sketch': 2.10.3(@babel/runtime@7.29.2)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@uiw/react-color-slider': 2.10.3(@babel/runtime@7.29.2)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@uiw/react-color-swatch': 2.10.3(@babel/runtime@7.29.2)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@uiw/react-color-wheel': 2.10.3(@babel/runtime@7.29.2)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + + '@uiw/react-drag-event-interactive@2.10.3(@babel/runtime@7.29.2)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': + dependencies: + '@babel/runtime': 7.29.2 + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + '@ungap/structured-clone@1.3.0': {} '@unrs/resolver-binding-android-arm-eabi@1.11.1': @@ -13159,6 +14904,8 @@ snapshots: dependencies: event-target-shim: 5.0.1 + accept-language-parser@1.5.0: {} + accepts@1.3.8: dependencies: mime-types: 2.1.35 @@ -13258,6 +15005,8 @@ snapshots: archy@1.0.0: {} + are-docs-informative@0.0.2: {} + arg@4.1.3: optional: true @@ -13712,6 +15461,14 @@ snapshots: normalize-url: 8.1.1 responselike: 3.0.0 + cacheable@2.5.0: + dependencies: + '@cacheable/memory': 2.2.0 + '@cacheable/utils': 2.5.0 + hookified: 1.15.1 + keyv: 5.6.0 + qified: 0.10.1 + call-bind-apply-helpers@1.0.2: dependencies: es-errors: 1.3.0 @@ -13801,6 +15558,8 @@ snapshots: cjs-module-lexer@1.4.3: {} + cjs-module-lexer@2.2.0: {} + classnames@2.5.1: {} clean-webpack-plugin@4.0.0(webpack@5.95.0(@swc/core@1.15.5)): @@ -13834,6 +15593,10 @@ snapshots: colorette@2.0.20: {} + colors-named-hex@1.0.4: {} + + colors-named@1.0.5: {} + combined-stream@1.0.8: dependencies: delayed-stream: 1.0.0 @@ -13848,6 +15611,8 @@ snapshots: commander@8.3.0: {} + comment-parser@1.4.1: {} + common-path-prefix@3.0.0: {} common-tags@1.8.2: {} @@ -14015,6 +15780,8 @@ snapshots: crypt@0.0.2: {} + csp-header@5.2.1: {} + css-blank-pseudo@6.0.2(postcss@8.5.8): dependencies: postcss: 8.5.8 @@ -14358,6 +16125,8 @@ snapshots: dotenv@16.6.1: {} + dotenv@17.4.2: {} + dunder-proto@1.0.1: dependencies: call-bind-apply-helpers: 1.0.2 @@ -14511,6 +16280,8 @@ snapshots: es-module-lexer@1.7.0: {} + es-module-lexer@2.3.1: {} + es-object-atoms@1.1.1: dependencies: es-errors: 1.3.0 @@ -14544,10 +16315,21 @@ snapshots: escape-string-regexp@4.0.0: {} + eslint-config-prettier@10.1.8(eslint@9.39.5(jiti@2.6.1)): + dependencies: + eslint: 9.39.5(jiti@2.6.1) + eslint-config-prettier@9.1.2(eslint@8.57.1): dependencies: eslint: 8.57.1 + eslint-import-context@0.1.9(unrs-resolver@1.11.1): + dependencies: + get-tsconfig: 4.13.7 + stable-hash-x: 0.2.0 + optionalDependencies: + unrs-resolver: 1.11.1 + eslint-import-resolver-node@0.3.9: dependencies: debug: 3.2.7 @@ -14556,7 +16338,7 @@ snapshots: transitivePeerDependencies: - supports-color - eslint-import-resolver-typescript@3.10.1(eslint-plugin-import@2.32.0)(eslint@8.57.1): + eslint-import-resolver-typescript@3.10.1(eslint-plugin-import@2.32.0(@typescript-eslint/parser@8.58.0(eslint@8.57.1)(typescript@5.6.3))(eslint@8.57.1))(eslint@8.57.1): dependencies: '@nolyfill/is-core-module': 1.0.39 debug: 4.4.3(supports-color@5.5.0) @@ -14571,18 +16353,73 @@ snapshots: transitivePeerDependencies: - supports-color - eslint-module-utils@2.12.1(@typescript-eslint/parser@8.58.0(eslint@8.57.1)(typescript@5.6.3))(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.10.1)(eslint@8.57.1): + eslint-import-resolver-typescript@4.4.5(eslint-plugin-import@2.32.0)(eslint@9.39.5(jiti@2.6.1)): + dependencies: + debug: 4.4.3(supports-color@5.5.0) + eslint: 9.39.5(jiti@2.6.1) + eslint-import-context: 0.1.9(unrs-resolver@1.11.1) + get-tsconfig: 4.13.7 + is-bun-module: 2.0.0 + stable-hash-x: 0.2.0 + tinyglobby: 0.2.15 + unrs-resolver: 1.11.1 + optionalDependencies: + eslint-plugin-import: 2.32.0(@typescript-eslint/parser@8.58.0(eslint@9.39.5(jiti@2.6.1))(typescript@5.6.3))(eslint-import-resolver-typescript@4.4.5)(eslint@9.39.5(jiti@2.6.1)) + transitivePeerDependencies: + - supports-color + + eslint-module-utils@2.12.1(@typescript-eslint/parser@8.58.0(eslint@8.57.1)(typescript@5.6.3))(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.10.1(eslint-plugin-import@2.32.0(@typescript-eslint/parser@8.58.0(eslint@8.57.1)(typescript@5.6.3))(eslint@8.57.1))(eslint@8.57.1))(eslint@8.57.1): + dependencies: + debug: 3.2.7 + optionalDependencies: + '@typescript-eslint/parser': 8.58.0(eslint@8.57.1)(typescript@5.6.3) + eslint: 8.57.1 + eslint-import-resolver-node: 0.3.9 + eslint-import-resolver-typescript: 3.10.1(eslint-plugin-import@2.32.0(@typescript-eslint/parser@8.58.0(eslint@8.57.1)(typescript@5.6.3))(eslint@8.57.1))(eslint@8.57.1) + transitivePeerDependencies: + - supports-color + + eslint-module-utils@2.12.1(@typescript-eslint/parser@8.58.0(eslint@9.39.5(jiti@2.6.1))(typescript@5.6.3))(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@4.4.5)(eslint@9.39.5(jiti@2.6.1)): + dependencies: + debug: 3.2.7 + optionalDependencies: + '@typescript-eslint/parser': 8.58.0(eslint@9.39.5(jiti@2.6.1))(typescript@5.6.3) + eslint: 9.39.5(jiti@2.6.1) + eslint-import-resolver-node: 0.3.9 + eslint-import-resolver-typescript: 4.4.5(eslint-plugin-import@2.32.0)(eslint@9.39.5(jiti@2.6.1)) + transitivePeerDependencies: + - supports-color + + eslint-plugin-import@2.32.0(@typescript-eslint/parser@8.58.0(eslint@8.57.1)(typescript@5.6.3))(eslint-import-resolver-typescript@3.10.1)(eslint@8.57.1): dependencies: + '@rtsao/scc': 1.1.0 + array-includes: 3.1.9 + array.prototype.findlastindex: 1.2.6 + array.prototype.flat: 1.3.3 + array.prototype.flatmap: 1.3.3 debug: 3.2.7 + doctrine: 2.1.0 + eslint: 8.57.1 + eslint-import-resolver-node: 0.3.9 + eslint-module-utils: 2.12.1(@typescript-eslint/parser@8.58.0(eslint@8.57.1)(typescript@5.6.3))(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.10.1(eslint-plugin-import@2.32.0(@typescript-eslint/parser@8.58.0(eslint@8.57.1)(typescript@5.6.3))(eslint@8.57.1))(eslint@8.57.1))(eslint@8.57.1) + hasown: 2.0.2 + is-core-module: 2.16.1 + is-glob: 4.0.3 + minimatch: 3.1.5 + object.fromentries: 2.0.8 + object.groupby: 1.0.3 + object.values: 1.2.1 + semver: 6.3.1 + string.prototype.trimend: 1.0.9 + tsconfig-paths: 3.15.0 optionalDependencies: '@typescript-eslint/parser': 8.58.0(eslint@8.57.1)(typescript@5.6.3) - eslint: 8.57.1 - eslint-import-resolver-node: 0.3.9 - eslint-import-resolver-typescript: 3.10.1(eslint-plugin-import@2.32.0)(eslint@8.57.1) transitivePeerDependencies: + - eslint-import-resolver-typescript + - eslint-import-resolver-webpack - supports-color - eslint-plugin-import@2.32.0(@typescript-eslint/parser@8.58.0(eslint@8.57.1)(typescript@5.6.3))(eslint-import-resolver-typescript@3.10.1)(eslint@8.57.1): + eslint-plugin-import@2.32.0(@typescript-eslint/parser@8.58.0(eslint@9.39.5(jiti@2.6.1))(typescript@5.6.3))(eslint-import-resolver-typescript@4.4.5)(eslint@9.39.5(jiti@2.6.1)): dependencies: '@rtsao/scc': 1.1.0 array-includes: 3.1.9 @@ -14591,9 +16428,9 @@ snapshots: array.prototype.flatmap: 1.3.3 debug: 3.2.7 doctrine: 2.1.0 - eslint: 8.57.1 + eslint: 9.39.5(jiti@2.6.1) eslint-import-resolver-node: 0.3.9 - eslint-module-utils: 2.12.1(@typescript-eslint/parser@8.58.0(eslint@8.57.1)(typescript@5.6.3))(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.10.1)(eslint@8.57.1) + eslint-module-utils: 2.12.1(@typescript-eslint/parser@8.58.0(eslint@9.39.5(jiti@2.6.1))(typescript@5.6.3))(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@4.4.5)(eslint@9.39.5(jiti@2.6.1)) hasown: 2.0.2 is-core-module: 2.16.1 is-glob: 4.0.3 @@ -14605,12 +16442,28 @@ snapshots: string.prototype.trimend: 1.0.9 tsconfig-paths: 3.15.0 optionalDependencies: - '@typescript-eslint/parser': 8.58.0(eslint@8.57.1)(typescript@5.6.3) + '@typescript-eslint/parser': 8.58.0(eslint@9.39.5(jiti@2.6.1))(typescript@5.6.3) transitivePeerDependencies: - eslint-import-resolver-typescript - eslint-import-resolver-webpack - supports-color + eslint-plugin-jsdoc@50.8.0(eslint@9.39.5(jiti@2.6.1)): + dependencies: + '@es-joy/jsdoccomment': 0.50.2 + are-docs-informative: 0.0.2 + comment-parser: 1.4.1 + debug: 4.4.3(supports-color@5.5.0) + escape-string-regexp: 4.0.0 + eslint: 9.39.5(jiti@2.6.1) + espree: 10.4.0 + esquery: 1.7.0 + parse-imports-exports: 0.2.4 + semver: 7.7.4 + spdx-expression-parse: 4.0.0 + transitivePeerDependencies: + - supports-color + eslint-plugin-jsx-a11y@6.10.2(eslint@8.57.1): dependencies: aria-query: 5.3.2 @@ -14630,6 +16483,34 @@ snapshots: safe-regex-test: 1.1.0 string.prototype.includes: 2.0.1 + eslint-plugin-jsx-a11y@6.10.2(eslint@9.39.5(jiti@2.6.1)): + dependencies: + aria-query: 5.3.2 + array-includes: 3.1.9 + array.prototype.flatmap: 1.3.3 + ast-types-flow: 0.0.8 + axe-core: 4.11.2 + axobject-query: 4.1.0 + damerau-levenshtein: 1.0.8 + emoji-regex: 9.2.2 + eslint: 9.39.5(jiti@2.6.1) + hasown: 2.0.2 + jsx-ast-utils: 3.3.5 + language-tags: 1.0.9 + minimatch: 3.1.5 + object.fromentries: 2.0.8 + safe-regex-test: 1.1.0 + string.prototype.includes: 2.0.1 + + eslint-plugin-prettier@5.5.5(eslint-config-prettier@10.1.8(eslint@9.39.5(jiti@2.6.1)))(eslint@9.39.5(jiti@2.6.1))(prettier@3.3.3): + dependencies: + eslint: 9.39.5(jiti@2.6.1) + prettier: 3.3.3 + prettier-linter-helpers: 1.0.1 + synckit: 0.11.12 + optionalDependencies: + eslint-config-prettier: 10.1.8(eslint@9.39.5(jiti@2.6.1)) + eslint-plugin-prettier@5.5.5(eslint-config-prettier@9.1.2(eslint@8.57.1))(eslint@8.57.1)(prettier@3.3.3): dependencies: eslint: 8.57.1 @@ -14643,6 +16524,10 @@ snapshots: dependencies: eslint: 8.57.1 + eslint-plugin-react-hooks@5.2.0(eslint@9.39.5(jiti@2.6.1)): + dependencies: + eslint: 9.39.5(jiti@2.6.1) + eslint-plugin-react@7.37.5(eslint@8.57.1): dependencies: array-includes: 3.1.9 @@ -14665,6 +16550,30 @@ snapshots: string.prototype.matchall: 4.0.12 string.prototype.repeat: 1.0.0 + eslint-plugin-react@7.37.5(eslint@9.39.5(jiti@2.6.1)): + dependencies: + array-includes: 3.1.9 + array.prototype.findlast: 1.2.5 + array.prototype.flatmap: 1.3.3 + array.prototype.tosorted: 1.1.4 + doctrine: 2.1.0 + es-iterator-helpers: 1.3.1 + eslint: 9.39.5(jiti@2.6.1) + estraverse: 5.3.0 + hasown: 2.0.2 + jsx-ast-utils: 3.3.5 + minimatch: 3.1.5 + object.entries: 1.1.9 + object.fromentries: 2.0.8 + object.values: 1.2.1 + prop-types: 15.8.1 + resolve: 2.0.0-next.6 + semver: 6.3.1 + string.prototype.matchall: 4.0.12 + string.prototype.repeat: 1.0.0 + + eslint-plugin-security-node@1.1.4: {} + eslint-plugin-security@3.0.1: dependencies: safe-regex: 2.1.1 @@ -14679,10 +16588,17 @@ snapshots: esrecurse: 4.3.0 estraverse: 5.3.0 + eslint-scope@8.4.0: + dependencies: + esrecurse: 4.3.0 + estraverse: 5.3.0 + eslint-visitor-keys@2.1.0: {} eslint-visitor-keys@3.4.3: {} + eslint-visitor-keys@4.2.1: {} + eslint-visitor-keys@5.0.1: {} eslint@8.57.1: @@ -14728,6 +16644,53 @@ snapshots: transitivePeerDependencies: - supports-color + eslint@9.39.5(jiti@2.6.1): + dependencies: + '@eslint-community/eslint-utils': 4.9.1(eslint@9.39.5(jiti@2.6.1)) + '@eslint-community/regexpp': 4.12.2 + '@eslint/config-array': 0.21.2 + '@eslint/config-helpers': 0.4.2 + '@eslint/core': 0.17.0 + '@eslint/eslintrc': 3.3.6 + '@eslint/js': 9.39.5 + '@eslint/plugin-kit': 0.4.1 + '@humanfs/node': 0.16.8 + '@humanwhocodes/module-importer': 1.0.1 + '@humanwhocodes/retry': 0.4.3 + '@types/estree': 1.0.8 + ajv: 6.14.0 + chalk: 4.1.2 + cross-spawn: 7.0.6 + debug: 4.4.3(supports-color@5.5.0) + escape-string-regexp: 4.0.0 + eslint-scope: 8.4.0 + eslint-visitor-keys: 4.2.1 + espree: 10.4.0 + esquery: 1.7.0 + esutils: 2.0.3 + fast-deep-equal: 3.1.3 + file-entry-cache: 8.0.0 + find-up: 5.0.0 + glob-parent: 6.0.2 + ignore: 5.3.2 + imurmurhash: 0.1.4 + is-glob: 4.0.3 + json-stable-stringify-without-jsonify: 1.0.1 + lodash.merge: 4.6.2 + minimatch: 3.1.5 + natural-compare: 1.4.0 + optionator: 0.9.4 + optionalDependencies: + jiti: 2.6.1 + transitivePeerDependencies: + - supports-color + + espree@10.4.0: + dependencies: + acorn: 8.16.0 + acorn-jsx: 5.3.2(acorn@8.16.0) + eslint-visitor-keys: 4.2.1 + espree@9.6.1: dependencies: acorn: 8.16.0 @@ -14804,6 +16767,11 @@ snapshots: jest-message-util: 29.7.0 jest-util: 29.7.0 + express-csp-header@5.2.1: + dependencies: + csp-header: 5.2.1 + psl: 1.8.0 + express@4.22.1: dependencies: accepts: 1.3.8 @@ -14884,6 +16852,8 @@ snapshots: fast-copy@3.0.2: {} + fast-copy@4.0.4: {} + fast-deep-equal@3.1.3: {} fast-diff@1.3.0: {} @@ -14936,6 +16906,10 @@ snapshots: fflate@0.8.2: {} + file-entry-cache@11.1.5: + dependencies: + flat-cache: 6.1.23 + file-entry-cache@6.0.1: dependencies: flat-cache: 3.2.0 @@ -14944,6 +16918,10 @@ snapshots: dependencies: flat-cache: 3.2.0 + file-entry-cache@8.0.0: + dependencies: + flat-cache: 4.0.1 + file-type@19.6.0: dependencies: get-stream: 9.0.1 @@ -15059,6 +17037,17 @@ snapshots: keyv: 4.5.4 rimraf: 3.0.2 + flat-cache@4.0.1: + dependencies: + flatted: 3.4.2 + keyv: 4.5.4 + + flat-cache@6.1.23: + dependencies: + cacheable: 2.5.0 + flatted: 3.4.2 + hookified: 1.15.1 + flatted@3.4.2: {} focus-trap@7.8.0: @@ -15282,6 +17271,12 @@ snapshots: dependencies: type-fest: 0.20.2 + globals@14.0.0: {} + + globals@16.5.0: {} + + globals@17.7.0: {} + globalthis@1.0.4: dependencies: define-properties: 1.2.1 @@ -15363,6 +17358,10 @@ snapshots: dependencies: has-symbols: 1.1.0 + hashery@1.5.1: + dependencies: + hookified: 1.15.1 + hasown@2.0.2: dependencies: function-bind: 1.1.2 @@ -15377,6 +17376,10 @@ snapshots: dependencies: parse-passwd: 1.0.0 + hookified@1.15.1: {} + + hookified@2.2.0: {} + hosted-git-info@2.8.9: {} hosted-git-info@4.1.0: @@ -15396,6 +17399,8 @@ snapshots: html-tags@3.3.1: {} + htmlescape@1.1.1: {} + htmlparser2@10.0.0: dependencies: domelementtype: 2.3.0 @@ -15501,6 +17506,12 @@ snapshots: parent-module: 1.0.1 resolve-from: 4.0.0 + import-in-the-middle@3.3.2: + dependencies: + cjs-module-lexer: 2.2.0 + es-module-lexer: 2.3.1 + module-details-from-path: 1.0.4 + import-lazy@4.0.0: {} import-local@3.2.0: @@ -16138,6 +18149,12 @@ snapshots: dependencies: argparse: 2.0.1 + js-yaml@4.3.0: + dependencies: + argparse: 2.0.1 + + jsdoc-type-pratt-parser@4.1.0: {} + jsesc@3.1.0: {} json-buffer@3.0.1: {} @@ -16187,12 +18204,18 @@ snapshots: dependencies: json-buffer: 3.0.1 + keyv@5.6.0: + dependencies: + '@keyv/serialize': 1.1.1 + kind-of@6.0.3: {} kleur@3.0.3: {} known-css-properties@0.29.0: {} + known-css-properties@0.37.0: {} + koa-compose@4.1.0: {} koa@3.0.3: @@ -16369,6 +18392,8 @@ snapshots: long-timeout@0.1.1: {} + long@5.3.2: {} + loose-envify@1.4.0: dependencies: js-tokens: 4.0.0 @@ -16477,6 +18502,8 @@ snapshots: meow@12.1.1: {} + meow@13.2.0: {} + merge-descriptors@1.0.3: {} merge-descriptors@2.0.0: {} @@ -16552,6 +18579,8 @@ snapshots: minipass@7.1.3: {} + module-details-from-path@1.0.4: {} + moment-timezone-data-webpack-plugin@1.5.1(moment-timezone@0.6.1)(webpack@5.95.0(@swc/core@1.15.5)): dependencies: find-cache-dir: 3.3.2 @@ -16843,6 +18872,10 @@ snapshots: dependencies: callsites: 3.1.0 + parse-imports-exports@0.2.4: + dependencies: + parse-statements: 1.0.11 + parse-json@4.0.0: dependencies: error-ex: 1.3.4 @@ -16857,6 +18890,8 @@ snapshots: parse-passwd@1.0.0: {} + parse-statements@1.0.11: {} + parseurl@1.3.3: {} path-browserify@1.0.1: {} @@ -16924,6 +18959,10 @@ snapshots: dependencies: split2: 4.2.0 + pino-abstract-transport@3.0.0: + dependencies: + split2: 4.2.0 + pino-pretty@11.3.0: dependencies: colorette: 2.0.20 @@ -16941,6 +18980,38 @@ snapshots: sonic-boom: 4.2.1 strip-json-comments: 3.1.1 + pino-pretty@13.1.3: + dependencies: + colorette: 2.0.20 + dateformat: 4.6.3 + fast-copy: 4.0.4 + fast-safe-stringify: 2.1.1 + help-me: 5.0.0 + joycon: 3.1.1 + minimist: 1.2.8 + on-exit-leak-free: 2.1.2 + pino-abstract-transport: 3.0.0 + pump: 3.0.4 + secure-json-parse: 4.1.0 + sonic-boom: 4.2.1 + strip-json-comments: 5.0.3 + + pino-std-serializers@7.1.0: {} + + pino@10.3.1: + dependencies: + '@pinojs/redact': 0.4.0 + atomic-sleep: 1.0.0 + on-exit-leak-free: 2.1.2 + pino-abstract-transport: 3.0.0 + pino-std-serializers: 7.1.0 + process-warning: 5.0.0 + quick-format-unescaped: 4.0.4 + real-require: 0.2.0 + safe-stable-stringify: 2.5.0 + sonic-boom: 4.2.1 + thread-stream: 4.2.0 + pirates@4.0.7: {} piscina@4.9.2: @@ -17108,12 +19179,13 @@ snapshots: '@csstools/utilities': 1.0.0(postcss@8.5.8) postcss: 8.5.8 - postcss-load-config@6.0.1(jiti@2.6.1)(postcss@8.5.8): + postcss-load-config@6.0.1(jiti@2.6.1)(postcss@8.5.8)(yaml@2.9.0): dependencies: lilconfig: 3.1.3 optionalDependencies: jiti: 2.6.1 postcss: 8.5.8 + yaml: 2.9.0 postcss-loader@8.2.1(@rspack/core@1.7.11)(postcss@8.5.8)(typescript@5.6.3)(webpack@5.95.0(@swc/core@1.15.5)): dependencies: @@ -17361,6 +19433,10 @@ snapshots: dependencies: postcss: 8.5.8 + postcss-safe-parser@7.0.1(postcss@8.5.8): + dependencies: + postcss: 8.5.8 + postcss-scss@4.0.9(postcss@8.5.8): dependencies: postcss: 8.5.8 @@ -17384,6 +19460,10 @@ snapshots: dependencies: postcss: 8.5.8 + postcss-sorting@9.1.0(postcss@8.5.8): + dependencies: + postcss: 8.5.8 + postcss-svgo@7.1.1(postcss@8.5.8): dependencies: postcss: 8.5.8 @@ -17421,6 +19501,8 @@ snapshots: process-nextick-args@2.0.1: {} + process-warning@5.0.0: {} + process@0.11.10: {} progress@2.0.3: {} @@ -17436,6 +19518,20 @@ snapshots: object-assign: 4.1.1 react-is: 16.13.1 + protobufjs@7.6.5: + dependencies: + '@protobufjs/aspromise': 1.1.2 + '@protobufjs/base64': 1.1.2 + '@protobufjs/codegen': 2.0.5 + '@protobufjs/eventemitter': 1.1.1 + '@protobufjs/fetch': 1.1.1 + '@protobufjs/float': 1.0.2 + '@protobufjs/path': 1.1.2 + '@protobufjs/pool': 1.1.0 + '@protobufjs/utf8': 1.1.2 + '@types/node': 22.19.15 + long: 5.3.2 + proxy-addr@2.0.7: dependencies: forwarded: 0.2.0 @@ -17445,6 +19541,8 @@ snapshots: proxy-from-env@2.1.0: {} + psl@1.8.0: {} + pstree.remy@1.1.8: {} pump@3.0.4: @@ -17462,6 +19560,10 @@ snapshots: pvutils@1.1.5: {} + qified@0.10.1: + dependencies: + hookified: 2.2.0 + qs@6.14.2: dependencies: side-channel: 1.1.0 @@ -17472,6 +19574,8 @@ snapshots: queue-microtask@1.2.3: {} + quick-format-unescaped@4.0.4: {} + quick-lru@5.1.1: {} raf-schd@4.0.3: {} @@ -17506,6 +19610,14 @@ snapshots: react: 18.3.1 react-dom: 18.3.1(react@18.3.1) + rc-slider@11.1.9(react-dom@18.3.1(react@18.3.1))(react@18.3.1): + dependencies: + '@babel/runtime': 7.29.2 + classnames: 2.5.1 + rc-util: 5.44.4(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + rc-util@5.44.4(react-dom@18.3.1(react@18.3.1))(react@18.3.1): dependencies: '@babel/runtime': 7.29.2 @@ -17571,6 +19683,15 @@ snapshots: optionalDependencies: react-dom: 18.3.1(react@18.3.1) + react-redux@9.3.0(@types/react@18.3.28)(react@18.3.1)(redux@5.0.1): + dependencies: + '@types/use-sync-external-store': 0.0.6 + react: 18.3.1 + use-sync-external-store: 1.6.0(react@18.3.1) + optionalDependencies: + '@types/react': 18.3.28 + redux: 5.0.1 + react-refresh@0.14.2: {} react-router@7.13.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1): @@ -17655,6 +19776,10 @@ snapshots: readdirp@4.1.2: {} + real-require@0.2.0: {} + + real-require@1.0.0: {} + redent@4.0.0: dependencies: indent-string: 5.0.0 @@ -17664,6 +19789,8 @@ snapshots: dependencies: '@babel/runtime': 7.29.2 + redux@5.0.1: {} + reflect-metadata@0.2.2: {} reflect.getprototypeof@1.0.10: @@ -17715,6 +19842,13 @@ snapshots: require-from-string@2.0.2: {} + require-in-the-middle@8.0.1: + dependencies: + debug: 4.4.3(supports-color@5.5.0) + module-details-from-path: 1.0.4 + transitivePeerDependencies: + - supports-color + requires-port@1.0.0: {} reselect@4.1.8: {} @@ -17840,6 +19974,8 @@ snapshots: dependencies: regexp-tree: 0.1.27 + safe-stable-stringify@2.5.0: {} + safer-buffer@2.1.2: {} sass-loader@16.0.7(@rspack/core@1.7.11)(sass@1.99.0)(webpack@5.95.0(@swc/core@1.15.5)): @@ -17879,6 +20015,8 @@ snapshots: secure-json-parse@2.7.0: {} + secure-json-parse@4.1.0: {} + seek-bzip@2.0.0: dependencies: commander: 6.2.1 @@ -18160,6 +20298,11 @@ snapshots: spdx-exceptions: 2.5.0 spdx-license-ids: 3.0.23 + spdx-expression-parse@4.0.0: + dependencies: + spdx-exceptions: 2.5.0 + spdx-license-ids: 3.0.23 + spdx-license-ids@3.0.23: {} spdy-transport@3.0.0: @@ -18187,6 +20330,8 @@ snapshots: sprintf-js@1.0.3: {} + stable-hash-x@0.2.0: {} + stable-hash@0.0.5: {} stable@0.1.8: {} @@ -18334,6 +20479,8 @@ snapshots: strip-json-comments@3.1.1: {} + strip-json-comments@5.0.3: {} + strnum@2.2.2: {} strtok3@10.3.5: @@ -18363,12 +20510,24 @@ snapshots: postcss-sorting: 8.0.2(postcss@8.5.8) stylelint: 15.11.0(typescript@5.6.3) + stylelint-order@7.0.1(stylelint@16.26.1(typescript@5.6.3)): + dependencies: + postcss: 8.5.8 + postcss-sorting: 9.1.0(postcss@8.5.8) + stylelint: 16.26.1(typescript@5.6.3) + stylelint-prettier@4.1.0(prettier@3.3.3)(stylelint@15.11.0(typescript@5.6.3)): dependencies: prettier: 3.3.3 prettier-linter-helpers: 1.0.1 stylelint: 15.11.0(typescript@5.6.3) + stylelint-prettier@5.0.3(prettier@3.3.3)(stylelint@16.26.1(typescript@5.6.3)): + dependencies: + prettier: 3.3.3 + prettier-linter-helpers: 1.0.1 + stylelint: 16.26.1(typescript@5.6.3) + stylelint-scss@5.3.2(stylelint@15.11.0(typescript@5.6.3)): dependencies: known-css-properties: 0.29.0 @@ -18378,6 +20537,18 @@ snapshots: postcss-value-parser: 4.2.0 stylelint: 15.11.0(typescript@5.6.3) + stylelint-scss@6.14.0(stylelint@16.26.1(typescript@5.6.3)): + dependencies: + css-tree: 3.2.1 + is-plain-object: 5.0.0 + known-css-properties: 0.37.0 + mdn-data: 2.27.1 + postcss-media-query-parser: 0.2.3 + postcss-resolve-nested-selector: 0.1.6 + postcss-selector-parser: 7.1.1 + postcss-value-parser: 4.2.0 + stylelint: 16.26.1(typescript@5.6.3) + stylelint@15.11.0(typescript@5.6.3): dependencies: '@csstools/css-parser-algorithms': 2.7.1(@csstools/css-tokenizer@2.4.1) @@ -18424,6 +20595,51 @@ snapshots: - supports-color - typescript + stylelint@16.26.1(typescript@5.6.3): + dependencies: + '@csstools/css-parser-algorithms': 3.0.5(@csstools/css-tokenizer@3.0.4) + '@csstools/css-syntax-patches-for-csstree': 1.1.6(css-tree@3.2.1) + '@csstools/css-tokenizer': 3.0.4 + '@csstools/media-query-list-parser': 4.0.3(@csstools/css-parser-algorithms@3.0.5(@csstools/css-tokenizer@3.0.4))(@csstools/css-tokenizer@3.0.4) + '@csstools/selector-specificity': 5.0.0(postcss-selector-parser@7.1.1) + '@dual-bundle/import-meta-resolve': 4.2.1 + balanced-match: 2.0.0 + colord: 2.9.3 + cosmiconfig: 9.0.1(typescript@5.6.3) + css-functions-list: 3.3.3 + css-tree: 3.2.1 + debug: 4.4.3(supports-color@5.5.0) + fast-glob: 3.3.3 + fastest-levenshtein: 1.0.16 + file-entry-cache: 11.1.5 + global-modules: 2.0.0 + globby: 11.1.0 + globjoin: 0.1.4 + html-tags: 3.3.1 + ignore: 7.0.5 + imurmurhash: 0.1.4 + is-plain-object: 5.0.0 + known-css-properties: 0.37.0 + mathml-tag-names: 2.1.3 + meow: 13.2.0 + micromatch: 4.0.8 + normalize-path: 3.0.0 + picocolors: 1.1.1 + postcss: 8.5.8 + postcss-resolve-nested-selector: 0.1.6 + postcss-safe-parser: 7.0.1(postcss@8.5.8) + postcss-selector-parser: 7.1.1 + postcss-value-parser: 4.2.0 + resolve-from: 5.0.0 + string-width: 4.2.3 + supports-hyperlinks: 3.2.0 + svg-tags: 1.0.0 + table: 6.9.0 + write-file-atomic: 5.0.1 + transitivePeerDependencies: + - supports-color + - typescript + supports-color@5.5.0: dependencies: has-flag: 3.0.0 @@ -18557,6 +20773,10 @@ snapshots: dependencies: tslib: 2.8.1 + thread-stream@4.2.0: + dependencies: + real-require: 1.0.0 + through@2.3.8: {} thunky@1.1.0: {} @@ -18828,6 +21048,10 @@ snapshots: dependencies: react: 18.3.1 + use-sync-external-store@1.6.0(react@18.3.1): + dependencies: + react: 18.3.1 + util-deprecate@1.0.2: {} utils-merge@1.0.1: {} @@ -19119,6 +21343,8 @@ snapshots: yallist@4.0.0: {} + yaml@2.9.0: {} + yargs-parser@20.2.9: {} yargs-parser@21.1.1: {} @@ -19145,7 +21371,10 @@ snapshots: yocto-queue@1.2.2: {} - zustand@5.0.12(@types/react@18.3.28)(react@18.3.1): + zod@4.4.3: {} + + zustand@5.0.12(@types/react@18.3.28)(react@18.3.1)(use-sync-external-store@1.6.0(react@18.3.1)): optionalDependencies: '@types/react': 18.3.28 react: 18.3.1 + use-sync-external-store: 1.6.0(react@18.3.1) From 02e4971e756245939185b266ed9c7f396f3944f7 Mon Sep 17 00:00:00 2001 From: Vladimir Kubantsev Date: Tue, 21 Jul 2026 11:31:12 +0300 Subject: [PATCH 02/13] feat(examples/ingress/nginx): initial commit --- examples/ingress/lib/nginx/.gitignore | 5 +++ examples/ingress/lib/nginx/.prettierrc.cjs | 1 + examples/ingress/lib/nginx/README.md | 3 ++ .../ingress/lib/nginx/app-builder.config.ts | 7 ++++ examples/ingress/lib/nginx/eslint.config.js | 19 ++++++++++ examples/ingress/lib/nginx/package.json | 25 +++++++++++++ examples/ingress/lib/nginx/src/index.ts | 1 + .../ingress/lib/nginx/tsconfig.build.json | 6 +++ examples/ingress/lib/nginx/tsconfig.json | 11 ++++++ pnpm-lock.yaml | 37 ++++++++++++++++--- pnpm-workspace.yaml | 1 + 11 files changed, 111 insertions(+), 5 deletions(-) create mode 100644 examples/ingress/lib/nginx/.gitignore create mode 100644 examples/ingress/lib/nginx/.prettierrc.cjs create mode 100644 examples/ingress/lib/nginx/README.md create mode 100644 examples/ingress/lib/nginx/app-builder.config.ts create mode 100644 examples/ingress/lib/nginx/eslint.config.js create mode 100644 examples/ingress/lib/nginx/package.json create mode 100644 examples/ingress/lib/nginx/src/index.ts create mode 100644 examples/ingress/lib/nginx/tsconfig.build.json create mode 100644 examples/ingress/lib/nginx/tsconfig.json diff --git a/examples/ingress/lib/nginx/.gitignore b/examples/ingress/lib/nginx/.gitignore new file mode 100644 index 0000000..71d4a34 --- /dev/null +++ b/examples/ingress/lib/nginx/.gitignore @@ -0,0 +1,5 @@ +node_modules +dist +build +.env +.DS_Store diff --git a/examples/ingress/lib/nginx/.prettierrc.cjs b/examples/ingress/lib/nginx/.prettierrc.cjs new file mode 100644 index 0000000..5da9c2e --- /dev/null +++ b/examples/ingress/lib/nginx/.prettierrc.cjs @@ -0,0 +1 @@ +module.exports = require('@gravity-ui/prettier-config'); diff --git a/examples/ingress/lib/nginx/README.md b/examples/ingress/lib/nginx/README.md new file mode 100644 index 0000000..d567297 --- /dev/null +++ b/examples/ingress/lib/nginx/README.md @@ -0,0 +1,3 @@ +# nginx + +Bootstrapped with @gravity-ui/create. diff --git a/examples/ingress/lib/nginx/app-builder.config.ts b/examples/ingress/lib/nginx/app-builder.config.ts new file mode 100644 index 0000000..045421d --- /dev/null +++ b/examples/ingress/lib/nginx/app-builder.config.ts @@ -0,0 +1,7 @@ +import {LibraryConfig} from '@gravity-ui/app-builder'; + +export default (): LibraryConfig => { + return { + lib: {}, + }; +}; diff --git a/examples/ingress/lib/nginx/eslint.config.js b/examples/ingress/lib/nginx/eslint.config.js new file mode 100644 index 0000000..ea71ad6 --- /dev/null +++ b/examples/ingress/lib/nginx/eslint.config.js @@ -0,0 +1,19 @@ +import baseConfig from '@gravity-ui/eslint-config/base'; +import importOrderConfig from '@gravity-ui/eslint-config/import-order'; +import typescriptConfig from '@gravity-ui/eslint-config/typescript'; +import {defineConfig} from 'eslint/config'; +import globals from 'globals'; + +export default defineConfig( + baseConfig, + importOrderConfig, + { + files: ['.prettierrc.cjs'], + languageOptions: { + globals: { + ...globals.node, + }, + }, + }, + typescriptConfig, +); diff --git a/examples/ingress/lib/nginx/package.json b/examples/ingress/lib/nginx/package.json new file mode 100644 index 0000000..e710009 --- /dev/null +++ b/examples/ingress/lib/nginx/package.json @@ -0,0 +1,25 @@ +{ + "name": "@examples/ingress-nginx", + "version": "0.0.0", + "private": true, + "type": "module", + "scripts": { + "typecheck": "tsc --noEmit", + "lint": "eslint", + "prettier": "prettier --list-different .", + "start": "node dist/index.js", + "dev": "tsc --watch", + "build": "tsc -p tsconfig.build.json" + }, + "dependencies": {}, + "devDependencies": { + "@gravity-ui/app-builder": "workspace:*", + "@gravity-ui/eslint-config": "^4.0.0", + "@gravity-ui/prettier-config": "^1.0.0", + "@gravity-ui/tsconfig": "^1.0.0", + "eslint": "^9.0.0", + "globals": "^17.0.0", + "prettier": "^3.0.0", + "typescript": "^5.3.0" + } +} diff --git a/examples/ingress/lib/nginx/src/index.ts b/examples/ingress/lib/nginx/src/index.ts new file mode 100644 index 0000000..fdffd2d --- /dev/null +++ b/examples/ingress/lib/nginx/src/index.ts @@ -0,0 +1 @@ +console.info('Hello, world!'); diff --git a/examples/ingress/lib/nginx/tsconfig.build.json b/examples/ingress/lib/nginx/tsconfig.build.json new file mode 100644 index 0000000..64fb305 --- /dev/null +++ b/examples/ingress/lib/nginx/tsconfig.build.json @@ -0,0 +1,6 @@ +{ + "extends": "./tsconfig.json", + "compilerOptions": { + "declaration": true + } +} diff --git a/examples/ingress/lib/nginx/tsconfig.json b/examples/ingress/lib/nginx/tsconfig.json new file mode 100644 index 0000000..e896b21 --- /dev/null +++ b/examples/ingress/lib/nginx/tsconfig.json @@ -0,0 +1,11 @@ +{ + "extends": "@gravity-ui/tsconfig/tsconfig.json", + "compilerOptions": { + "target": "ES2022", + "module": "NodeNext", + "moduleResolution": "NodeNext", + "outDir": "./dist", + "rootDir": "./src" + }, + "include": ["src/**/*"] +} diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 5a76a73..07345a6 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -466,6 +466,33 @@ importers: specifier: ^5.3.0 version: 5.6.3 + examples/ingress/lib/nginx: + devDependencies: + '@gravity-ui/app-builder': + specifier: workspace:* + version: link:../../../.. + '@gravity-ui/eslint-config': + specifier: ^4.0.0 + version: 4.3.2(eslint@9.39.5(jiti@2.6.1))(prettier@3.3.3)(typescript@5.6.3) + '@gravity-ui/prettier-config': + specifier: ^1.0.0 + version: 1.1.0(prettier@3.3.3) + '@gravity-ui/tsconfig': + specifier: ^1.0.0 + version: 1.0.0 + eslint: + specifier: ^9.0.0 + version: 9.39.5(jiti@2.6.1) + globals: + specifier: ^17.0.0 + version: 17.7.0 + prettier: + specifier: ^3.0.0 + version: 3.3.3 + typescript: + specifier: ^5.3.0 + version: 5.6.3 + examples/ssr: dependencies: '@babel/runtime': @@ -11616,7 +11643,7 @@ snapshots: '@typescript-eslint/parser': 8.58.0(eslint@8.57.1)(typescript@5.6.3) eslint: 8.57.1 eslint-config-prettier: 9.1.2(eslint@8.57.1) - eslint-import-resolver-typescript: 3.10.1(eslint-plugin-import@2.32.0(@typescript-eslint/parser@8.58.0(eslint@8.57.1)(typescript@5.6.3))(eslint@8.57.1))(eslint@8.57.1) + eslint-import-resolver-typescript: 3.10.1(eslint-plugin-import@2.32.0)(eslint@8.57.1) eslint-plugin-import: 2.32.0(@typescript-eslint/parser@8.58.0(eslint@8.57.1)(typescript@5.6.3))(eslint-import-resolver-typescript@3.10.1)(eslint@8.57.1) eslint-plugin-jsx-a11y: 6.10.2(eslint@8.57.1) eslint-plugin-prettier: 5.5.5(eslint-config-prettier@9.1.2(eslint@8.57.1))(eslint@8.57.1)(prettier@3.3.3) @@ -16338,7 +16365,7 @@ snapshots: transitivePeerDependencies: - supports-color - eslint-import-resolver-typescript@3.10.1(eslint-plugin-import@2.32.0(@typescript-eslint/parser@8.58.0(eslint@8.57.1)(typescript@5.6.3))(eslint@8.57.1))(eslint@8.57.1): + eslint-import-resolver-typescript@3.10.1(eslint-plugin-import@2.32.0)(eslint@8.57.1): dependencies: '@nolyfill/is-core-module': 1.0.39 debug: 4.4.3(supports-color@5.5.0) @@ -16368,14 +16395,14 @@ snapshots: transitivePeerDependencies: - supports-color - eslint-module-utils@2.12.1(@typescript-eslint/parser@8.58.0(eslint@8.57.1)(typescript@5.6.3))(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.10.1(eslint-plugin-import@2.32.0(@typescript-eslint/parser@8.58.0(eslint@8.57.1)(typescript@5.6.3))(eslint@8.57.1))(eslint@8.57.1))(eslint@8.57.1): + eslint-module-utils@2.12.1(@typescript-eslint/parser@8.58.0(eslint@8.57.1)(typescript@5.6.3))(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.10.1)(eslint@8.57.1): dependencies: debug: 3.2.7 optionalDependencies: '@typescript-eslint/parser': 8.58.0(eslint@8.57.1)(typescript@5.6.3) eslint: 8.57.1 eslint-import-resolver-node: 0.3.9 - eslint-import-resolver-typescript: 3.10.1(eslint-plugin-import@2.32.0(@typescript-eslint/parser@8.58.0(eslint@8.57.1)(typescript@5.6.3))(eslint@8.57.1))(eslint@8.57.1) + eslint-import-resolver-typescript: 3.10.1(eslint-plugin-import@2.32.0)(eslint@8.57.1) transitivePeerDependencies: - supports-color @@ -16401,7 +16428,7 @@ snapshots: doctrine: 2.1.0 eslint: 8.57.1 eslint-import-resolver-node: 0.3.9 - eslint-module-utils: 2.12.1(@typescript-eslint/parser@8.58.0(eslint@8.57.1)(typescript@5.6.3))(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.10.1(eslint-plugin-import@2.32.0(@typescript-eslint/parser@8.58.0(eslint@8.57.1)(typescript@5.6.3))(eslint@8.57.1))(eslint@8.57.1))(eslint@8.57.1) + eslint-module-utils: 2.12.1(@typescript-eslint/parser@8.58.0(eslint@8.57.1)(typescript@5.6.3))(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.10.1)(eslint@8.57.1) hasown: 2.0.2 is-core-module: 2.16.1 is-glob: 4.0.3 diff --git a/pnpm-workspace.yaml b/pnpm-workspace.yaml index bc0f3f0..ef0590c 100644 --- a/pnpm-workspace.yaml +++ b/pnpm-workspace.yaml @@ -1,5 +1,6 @@ packages: - examples/* + - examples/*/lib/* ignoredBuiltDependencies: - '@parcel/watcher' - '@sentry/cli' From cce05173013bc8fb3eededc97f79e11b499f8812 Mon Sep 17 00:00:00 2001 From: Vladimir Kubantsev Date: Tue, 21 Jul 2026 11:43:14 +0300 Subject: [PATCH 03/13] feat(examples/ingress): nginx ws dev deps --- examples/ingress/lib/nginx/package.json | 6 ++++++ .../ingress/lib/nginx/templates/nginx.conf.template | 0 examples/ingress/package.json | 1 + pnpm-lock.yaml | 13 ++++++++----- 4 files changed, 15 insertions(+), 5 deletions(-) create mode 100644 examples/ingress/lib/nginx/templates/nginx.conf.template diff --git a/examples/ingress/lib/nginx/package.json b/examples/ingress/lib/nginx/package.json index e710009..3eda289 100644 --- a/examples/ingress/lib/nginx/package.json +++ b/examples/ingress/lib/nginx/package.json @@ -3,6 +3,12 @@ "version": "0.0.0", "private": true, "type": "module", + "main": "dist/index.js", + "types": "dist/index.d.ts", + "files": [ + "dist", + "templates" + ], "scripts": { "typecheck": "tsc --noEmit", "lint": "eslint", diff --git a/examples/ingress/lib/nginx/templates/nginx.conf.template b/examples/ingress/lib/nginx/templates/nginx.conf.template new file mode 100644 index 0000000..e69de29 diff --git a/examples/ingress/package.json b/examples/ingress/package.json index b95273d..6c0a54d 100644 --- a/examples/ingress/package.json +++ b/examples/ingress/package.json @@ -20,6 +20,7 @@ "react-dom": "^18.0.0" }, "devDependencies": { + "@examples/ingress-nginx": "workspace:*", "@gravity-ui/app-builder": "workspace:*", "@gravity-ui/eslint-config": "^4.0.0", "@gravity-ui/prettier-config": "^1.0.0", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 07345a6..a276d75 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -429,6 +429,9 @@ importers: specifier: ^18.0.0 version: 18.3.1(react@18.3.1) devDependencies: + '@examples/ingress-nginx': + specifier: workspace:* + version: link:lib/nginx '@gravity-ui/app-builder': specifier: workspace:* version: link:../.. @@ -11643,7 +11646,7 @@ snapshots: '@typescript-eslint/parser': 8.58.0(eslint@8.57.1)(typescript@5.6.3) eslint: 8.57.1 eslint-config-prettier: 9.1.2(eslint@8.57.1) - eslint-import-resolver-typescript: 3.10.1(eslint-plugin-import@2.32.0)(eslint@8.57.1) + eslint-import-resolver-typescript: 3.10.1(eslint-plugin-import@2.32.0(@typescript-eslint/parser@8.58.0(eslint@8.57.1)(typescript@5.6.3))(eslint@8.57.1))(eslint@8.57.1) eslint-plugin-import: 2.32.0(@typescript-eslint/parser@8.58.0(eslint@8.57.1)(typescript@5.6.3))(eslint-import-resolver-typescript@3.10.1)(eslint@8.57.1) eslint-plugin-jsx-a11y: 6.10.2(eslint@8.57.1) eslint-plugin-prettier: 5.5.5(eslint-config-prettier@9.1.2(eslint@8.57.1))(eslint@8.57.1)(prettier@3.3.3) @@ -16365,7 +16368,7 @@ snapshots: transitivePeerDependencies: - supports-color - eslint-import-resolver-typescript@3.10.1(eslint-plugin-import@2.32.0)(eslint@8.57.1): + eslint-import-resolver-typescript@3.10.1(eslint-plugin-import@2.32.0(@typescript-eslint/parser@8.58.0(eslint@8.57.1)(typescript@5.6.3))(eslint@8.57.1))(eslint@8.57.1): dependencies: '@nolyfill/is-core-module': 1.0.39 debug: 4.4.3(supports-color@5.5.0) @@ -16395,14 +16398,14 @@ snapshots: transitivePeerDependencies: - supports-color - eslint-module-utils@2.12.1(@typescript-eslint/parser@8.58.0(eslint@8.57.1)(typescript@5.6.3))(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.10.1)(eslint@8.57.1): + eslint-module-utils@2.12.1(@typescript-eslint/parser@8.58.0(eslint@8.57.1)(typescript@5.6.3))(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.10.1(eslint-plugin-import@2.32.0(@typescript-eslint/parser@8.58.0(eslint@8.57.1)(typescript@5.6.3))(eslint@8.57.1))(eslint@8.57.1))(eslint@8.57.1): dependencies: debug: 3.2.7 optionalDependencies: '@typescript-eslint/parser': 8.58.0(eslint@8.57.1)(typescript@5.6.3) eslint: 8.57.1 eslint-import-resolver-node: 0.3.9 - eslint-import-resolver-typescript: 3.10.1(eslint-plugin-import@2.32.0)(eslint@8.57.1) + eslint-import-resolver-typescript: 3.10.1(eslint-plugin-import@2.32.0(@typescript-eslint/parser@8.58.0(eslint@8.57.1)(typescript@5.6.3))(eslint@8.57.1))(eslint@8.57.1) transitivePeerDependencies: - supports-color @@ -16428,7 +16431,7 @@ snapshots: doctrine: 2.1.0 eslint: 8.57.1 eslint-import-resolver-node: 0.3.9 - eslint-module-utils: 2.12.1(@typescript-eslint/parser@8.58.0(eslint@8.57.1)(typescript@5.6.3))(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.10.1)(eslint@8.57.1) + eslint-module-utils: 2.12.1(@typescript-eslint/parser@8.58.0(eslint@8.57.1)(typescript@5.6.3))(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.10.1(eslint-plugin-import@2.32.0(@typescript-eslint/parser@8.58.0(eslint@8.57.1)(typescript@5.6.3))(eslint@8.57.1))(eslint@8.57.1))(eslint@8.57.1) hasown: 2.0.2 is-core-module: 2.16.1 is-glob: 4.0.3 From f7748ff092ecc7106d879df4c54b4f06bb44c83a Mon Sep 17 00:00:00 2001 From: Vladimir Kubantsev Date: Tue, 21 Jul 2026 11:57:14 +0300 Subject: [PATCH 04/13] feat(examples/ingress): app-builder build nginx --- examples/ingress/lib/nginx/package.json | 9 +++++---- examples/ingress/lib/nginx/tsconfig.publish.json | 6 ++++++ 2 files changed, 11 insertions(+), 4 deletions(-) create mode 100644 examples/ingress/lib/nginx/tsconfig.publish.json diff --git a/examples/ingress/lib/nginx/package.json b/examples/ingress/lib/nginx/package.json index 3eda289..63cf65e 100644 --- a/examples/ingress/lib/nginx/package.json +++ b/examples/ingress/lib/nginx/package.json @@ -3,10 +3,11 @@ "version": "0.0.0", "private": true, "type": "module", - "main": "dist/index.js", - "types": "dist/index.d.ts", + "main": "build/cjs/index.js", + "module": "build/esm/index.js", + "types": "build/esm/index.d.ts", "files": [ - "dist", + "build", "templates" ], "scripts": { @@ -15,7 +16,7 @@ "prettier": "prettier --list-different .", "start": "node dist/index.js", "dev": "tsc --watch", - "build": "tsc -p tsconfig.build.json" + "build": "NODE_ENV=production app-builder build" }, "dependencies": {}, "devDependencies": { diff --git a/examples/ingress/lib/nginx/tsconfig.publish.json b/examples/ingress/lib/nginx/tsconfig.publish.json new file mode 100644 index 0000000..64fb305 --- /dev/null +++ b/examples/ingress/lib/nginx/tsconfig.publish.json @@ -0,0 +1,6 @@ +{ + "extends": "./tsconfig.json", + "compilerOptions": { + "declaration": true + } +} From 9f3de9fe55608d8db8a89135398f47f1d49c38f3 Mon Sep 17 00:00:00 2001 From: Vladimir Kubantsev Date: Tue, 21 Jul 2026 12:17:41 +0300 Subject: [PATCH 05/13] feat(examples/ingress/nginx): cleanup migration from tsc to app-builder --- examples/ingress/lib/nginx/app-builder.config.ts | 2 +- examples/ingress/lib/nginx/package.json | 2 -- examples/ingress/lib/nginx/tsconfig.build.json | 6 ------ examples/ingress/lib/nginx/tsconfig.json | 1 - 4 files changed, 1 insertion(+), 10 deletions(-) delete mode 100644 examples/ingress/lib/nginx/tsconfig.build.json diff --git a/examples/ingress/lib/nginx/app-builder.config.ts b/examples/ingress/lib/nginx/app-builder.config.ts index 045421d..eb807cb 100644 --- a/examples/ingress/lib/nginx/app-builder.config.ts +++ b/examples/ingress/lib/nginx/app-builder.config.ts @@ -1,4 +1,4 @@ -import {LibraryConfig} from '@gravity-ui/app-builder'; +import type {LibraryConfig} from '@gravity-ui/app-builder'; export default (): LibraryConfig => { return { diff --git a/examples/ingress/lib/nginx/package.json b/examples/ingress/lib/nginx/package.json index 63cf65e..1bd40c6 100644 --- a/examples/ingress/lib/nginx/package.json +++ b/examples/ingress/lib/nginx/package.json @@ -14,8 +14,6 @@ "typecheck": "tsc --noEmit", "lint": "eslint", "prettier": "prettier --list-different .", - "start": "node dist/index.js", - "dev": "tsc --watch", "build": "NODE_ENV=production app-builder build" }, "dependencies": {}, diff --git a/examples/ingress/lib/nginx/tsconfig.build.json b/examples/ingress/lib/nginx/tsconfig.build.json deleted file mode 100644 index 64fb305..0000000 --- a/examples/ingress/lib/nginx/tsconfig.build.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "extends": "./tsconfig.json", - "compilerOptions": { - "declaration": true - } -} diff --git a/examples/ingress/lib/nginx/tsconfig.json b/examples/ingress/lib/nginx/tsconfig.json index e896b21..6220664 100644 --- a/examples/ingress/lib/nginx/tsconfig.json +++ b/examples/ingress/lib/nginx/tsconfig.json @@ -4,7 +4,6 @@ "target": "ES2022", "module": "NodeNext", "moduleResolution": "NodeNext", - "outDir": "./dist", "rootDir": "./src" }, "include": ["src/**/*"] From a6711ccc274eef1b383a2005792a4437c9e7d7b7 Mon Sep 17 00:00:00 2001 From: Vladimir Kubantsev Date: Tue, 21 Jul 2026 13:02:58 +0300 Subject: [PATCH 06/13] refactor(examples/ingress): prettier --- examples/ingress/app-builder.config.ts | 1 + .../lib/nginx/templates/nginx.conf.template | 31 +++++++++++++++++++ 2 files changed, 32 insertions(+) diff --git a/examples/ingress/app-builder.config.ts b/examples/ingress/app-builder.config.ts index 26ad769..be5237a 100644 --- a/examples/ingress/app-builder.config.ts +++ b/examples/ingress/app-builder.config.ts @@ -1,4 +1,5 @@ import type {ServiceConfig} from '@gravity-ui/app-builder'; + const port = process.env.APP_PORT ? Number(process.env.APP_PORT) : 3030; export default (): ServiceConfig => { diff --git a/examples/ingress/lib/nginx/templates/nginx.conf.template b/examples/ingress/lib/nginx/templates/nginx.conf.template index e69de29..c997539 100644 --- a/examples/ingress/lib/nginx/templates/nginx.conf.template +++ b/examples/ingress/lib/nginx/templates/nginx.conf.template @@ -0,0 +1,31 @@ +# Rendered by @gravity-ui app-builder nginx ingress lib. +# Do not edit the generated nginx.conf by hand — edit the template instead. +server { + listen 80; + listen [::]:80; + + server_name ; + + client_max_body_size 20m; + + # Prevent header buffer overflow for large auth/cookie headers. + proxy_buffer_size 16k; + proxy_buffers 8 16k; + + location / { + # The upstream is the reverse-tunnel bind on this VM, which `ssh -R` forwards to the + # local app-builder dev server (its ipc socket or http port). The dev server serves + # dist/public statics and proxies dynamic requests to the node server (client-as-front). + proxy_pass http://; + proxy_http_version 1.1; + proxy_set_header Host $host; + proxy_set_header X-Real-IP $remote_addr; + proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; + proxy_set_header X-Forwarded-Proto $scheme; + # Support HMR websockets from the dev server. + proxy_set_header Upgrade $http_upgrade; + proxy_set_header Connection "upgrade"; + proxy_redirect off; + proxy_read_timeout 300s; + } +} From 219c87e098e8eb5c00dc57c7df04ab542fd17d6f Mon Sep 17 00:00:00 2001 From: Vladimir Kubantsev Date: Tue, 21 Jul 2026 13:13:32 +0300 Subject: [PATCH 07/13] refactor(examples/ingress/nginx): tempalte using env substitution --- examples/ingress/lib/nginx/templates/nginx.conf.template | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/examples/ingress/lib/nginx/templates/nginx.conf.template b/examples/ingress/lib/nginx/templates/nginx.conf.template index c997539..b50303e 100644 --- a/examples/ingress/lib/nginx/templates/nginx.conf.template +++ b/examples/ingress/lib/nginx/templates/nginx.conf.template @@ -1,10 +1,13 @@ -# Rendered by @gravity-ui app-builder nginx ingress lib. +# Rendered by @gravity-ui app-builder nginx ingress lib via envsubst. # Do not edit the generated nginx.conf by hand — edit the template instead. +# +# Substitute ONLY the ingress variables, so nginx's own $-variables ($host, $scheme, ...) survive: +# envsubst '${APP_SERVER_NAME} ${APP_UPSTREAM_SERVER}' < nginx.conf.template > nginx.conf server { listen 80; listen [::]:80; - server_name ; + server_name ${APP_SERVER_NAME}; client_max_body_size 20m; @@ -16,7 +19,7 @@ server { # The upstream is the reverse-tunnel bind on this VM, which `ssh -R` forwards to the # local app-builder dev server (its ipc socket or http port). The dev server serves # dist/public statics and proxies dynamic requests to the node server (client-as-front). - proxy_pass http://; + proxy_pass http://${APP_UPSTREAM_SERVER}; proxy_http_version 1.1; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; From 906a702a95bbb5e7d05a04e2c8bc6076fd0b417d Mon Sep 17 00:00:00 2001 From: Vladimir Kubantsev Date: Tue, 21 Jul 2026 14:13:04 +0300 Subject: [PATCH 08/13] feat(examples/ingress): implement business logic --- examples/ingress/src/server/index.ts | 3 +++ examples/ingress/src/ui/components/App/App.tsx | 9 ++++++++- 2 files changed, 11 insertions(+), 1 deletion(-) diff --git a/examples/ingress/src/server/index.ts b/examples/ingress/src/server/index.ts index 7487a98..99d7ae2 100644 --- a/examples/ingress/src/server/index.ts +++ b/examples/ingress/src/server/index.ts @@ -22,6 +22,9 @@ const app = new ExpressKit(nodekit, { }), ); }, + 'POST /hello': (req, res) => { + res.send(`Hello, ${req.body.name ?? 'World'}!`); + }, }); app.run(); diff --git a/examples/ingress/src/ui/components/App/App.tsx b/examples/ingress/src/ui/components/App/App.tsx index 1dfaf07..d0ec96d 100644 --- a/examples/ingress/src/ui/components/App/App.tsx +++ b/examples/ingress/src/ui/components/App/App.tsx @@ -1,9 +1,16 @@ import {ThemeProvider} from '@gravity-ui/uikit'; export function App() { + let name = 'World'; + try { + const url = new URL(location.toString()); + name = url.searchParams.get('name') ?? 'World' + } catch { + // noop + } return ( -

Hello, Gravity UI!

+

Hello, {name}!

); } From 8f087e069026e2e82630722c7c046f27c3cfc629 Mon Sep 17 00:00:00 2001 From: Vladimir Kubantsev Date: Tue, 21 Jul 2026 14:57:42 +0300 Subject: [PATCH 09/13] feat(examples/ingress): finish ipc or http config --- examples/ingress/app-builder.config.ts | 6 ++--- examples/ingress/eslint.config.mjs | 11 +++----- .../lib/nginx/templates/nginx.conf.template | 26 +++++++++++++------ .../ingress/src/server/config/app-builder.ts | 7 +++++ examples/ingress/src/server/index.ts | 11 +++++--- .../ingress/src/ui/components/App/App.tsx | 24 ++++++++--------- 6 files changed, 52 insertions(+), 33 deletions(-) create mode 100644 examples/ingress/src/server/config/app-builder.ts diff --git a/examples/ingress/app-builder.config.ts b/examples/ingress/app-builder.config.ts index be5237a..9d818fa 100644 --- a/examples/ingress/app-builder.config.ts +++ b/examples/ingress/app-builder.config.ts @@ -1,17 +1,17 @@ import type {ServiceConfig} from '@gravity-ui/app-builder'; -const port = process.env.APP_PORT ? Number(process.env.APP_PORT) : 3030; +import {APP_PORT} from './src/server/config/app-builder'; export default (): ServiceConfig => { return { client: { newJsxTransform: true, devServer: { - port: port + 1, + port: APP_PORT ? APP_PORT + 1 : undefined, }, }, server: { - port, + port: APP_PORT, }, }; }; diff --git a/examples/ingress/eslint.config.mjs b/examples/ingress/eslint.config.mjs index b1646d2..2a021ce 100644 --- a/examples/ingress/eslint.config.mjs +++ b/examples/ingress/eslint.config.mjs @@ -10,15 +10,12 @@ export default defineConfig( baseConfig, importOrderConfig, { - files: [ - '.prettierrc.js', - 'app-builder.config.ts', - ], + files: ['.prettierrc.js', 'app-builder.config.ts'], languageOptions: { globals: { ...globals.node, - } - } + }, + }, }, typescriptConfig, { @@ -33,4 +30,4 @@ export default defineConfig( 'react/react-in-jsx-scope': 'off', }, }, -); \ No newline at end of file +); diff --git a/examples/ingress/lib/nginx/templates/nginx.conf.template b/examples/ingress/lib/nginx/templates/nginx.conf.template index b50303e..9240e11 100644 --- a/examples/ingress/lib/nginx/templates/nginx.conf.template +++ b/examples/ingress/lib/nginx/templates/nginx.conf.template @@ -2,7 +2,11 @@ # Do not edit the generated nginx.conf by hand — edit the template instead. # # Substitute ONLY the ingress variables, so nginx's own $-variables ($host, $scheme, ...) survive: -# envsubst '${APP_SERVER_NAME} ${APP_UPSTREAM_SERVER}' < nginx.conf.template > nginx.conf +# envsubst '${APP_SERVER_NAME} ${APP_CLIENT_UPSTREAM} ${APP_SERVER_UPSTREAM}' \ +# < nginx.conf.template > nginx.conf +# +# Each *_UPSTREAM is either an ipc socket e.g. unix:/…/dist/run/client.sock +# or an http host:port e.g. 127.0.0.1:3031 server { listen 80; listen [::]:80; @@ -15,19 +19,25 @@ server { proxy_buffer_size 16k; proxy_buffers 8 16k; + # Build assets + HMR websocket → client dev server. + location /build/ { + proxy_pass http://${APP_CLIENT_UPSTREAM}; + proxy_http_version 1.1; + proxy_set_header Host $host; + proxy_set_header Upgrade $http_upgrade; + proxy_set_header Connection "upgrade"; + proxy_redirect off; + } + + # Everything else → node server. location / { - # The upstream is the reverse-tunnel bind on this VM, which `ssh -R` forwards to the - # local app-builder dev server (its ipc socket or http port). The dev server serves - # dist/public statics and proxies dynamic requests to the node server (client-as-front). - proxy_pass http://${APP_UPSTREAM_SERVER}; + proxy_pass http://${APP_SERVER_UPSTREAM}; proxy_http_version 1.1; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header X-Forwarded-Proto $scheme; - # Support HMR websockets from the dev server. - proxy_set_header Upgrade $http_upgrade; - proxy_set_header Connection "upgrade"; + proxy_set_header X-Request-ID $request_id; proxy_redirect off; proxy_read_timeout 300s; } diff --git a/examples/ingress/src/server/config/app-builder.ts b/examples/ingress/src/server/config/app-builder.ts new file mode 100644 index 0000000..3f2d50d --- /dev/null +++ b/examples/ingress/src/server/config/app-builder.ts @@ -0,0 +1,7 @@ +// APP_PORT and APP_SOCKET are interchangeable +// one of APP_PORT or APP_SOCKET should be present +// APP_PORT wins over APP_SOCKET +export const APP_PORT: number | undefined = undefined; +export const APP_SOCKET: string | undefined = 'dist/run/server.sock'; + +export const APP_PUBLIC_PATH: string | undefined = '/build/'; diff --git a/examples/ingress/src/server/index.ts b/examples/ingress/src/server/index.ts index 99d7ae2..8503085 100644 --- a/examples/ingress/src/server/index.ts +++ b/examples/ingress/src/server/index.ts @@ -2,14 +2,19 @@ import {createLayoutPlugin, createRenderFunction} from '@gravity-ui/app-layout'; import {ExpressKit} from '@gravity-ui/expresskit'; import {NodeKit} from '@gravity-ui/nodekit'; -const nodekit = new NodeKit({}); +import {APP_PORT, APP_PUBLIC_PATH, APP_SOCKET} from './config/app-builder'; -const port = process.env.APP_PORT ? Number(process.env.APP_PORT) : 3030; +const nodekit = new NodeKit({ + config: { + appPort: APP_PORT, + appSocket: APP_SOCKET, + }, +}); const renderLayout = createRenderFunction([ createLayoutPlugin({ manifest: 'dist/public/build/assets-manifest.json', - publicPath: `http://localhost:${port + 1}/build/`, + publicPath: APP_PUBLIC_PATH, }), ]); diff --git a/examples/ingress/src/ui/components/App/App.tsx b/examples/ingress/src/ui/components/App/App.tsx index d0ec96d..87ae9d9 100644 --- a/examples/ingress/src/ui/components/App/App.tsx +++ b/examples/ingress/src/ui/components/App/App.tsx @@ -1,16 +1,16 @@ import {ThemeProvider} from '@gravity-ui/uikit'; export function App() { - let name = 'World'; - try { - const url = new URL(location.toString()); - name = url.searchParams.get('name') ?? 'World' - } catch { - // noop - } - return ( - -

Hello, {name}!

-
- ); + let name = 'World'; + try { + const url = new URL(location.toString()); + name = url.searchParams.get('name') ?? 'World'; + } catch { + // noop + } + return ( + +

Hello, {name}!

+
+ ); } From 34b6064546dbd046592047301dd633c3b22e117b Mon Sep 17 00:00:00 2001 From: Vladimir Kubantsev Date: Tue, 21 Jul 2026 15:05:21 +0300 Subject: [PATCH 10/13] feat(examples/ingress/nginx): template nginx app public path --- examples/ingress/lib/nginx/templates/nginx.conf.template | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/examples/ingress/lib/nginx/templates/nginx.conf.template b/examples/ingress/lib/nginx/templates/nginx.conf.template index 9240e11..0ba6144 100644 --- a/examples/ingress/lib/nginx/templates/nginx.conf.template +++ b/examples/ingress/lib/nginx/templates/nginx.conf.template @@ -2,9 +2,11 @@ # Do not edit the generated nginx.conf by hand — edit the template instead. # # Substitute ONLY the ingress variables, so nginx's own $-variables ($host, $scheme, ...) survive: -# envsubst '${APP_SERVER_NAME} ${APP_CLIENT_UPSTREAM} ${APP_SERVER_UPSTREAM}' \ +# envsubst '${APP_SERVER_NAME} ${APP_PUBLIC_PATH} ${APP_CLIENT_UPSTREAM} ${APP_SERVER_UPSTREAM}' \ # < nginx.conf.template > nginx.conf # +# APP_PUBLIC_PATH must equal the client dev server's publicPath (default /build/); it is the single +# source of truth shared by the server layout, the dev server, and this location prefix. # Each *_UPSTREAM is either an ipc socket e.g. unix:/…/dist/run/client.sock # or an http host:port e.g. 127.0.0.1:3031 server { @@ -20,7 +22,7 @@ server { proxy_buffers 8 16k; # Build assets + HMR websocket → client dev server. - location /build/ { + location ${APP_PUBLIC_PATH} { proxy_pass http://${APP_CLIENT_UPSTREAM}; proxy_http_version 1.1; proxy_set_header Host $host; From 3568f622d1168e5534250bb93c8fd38a3d90c2c7 Mon Sep 17 00:00:00 2001 From: Vladimir Kubantsev Date: Tue, 21 Jul 2026 15:30:12 +0300 Subject: [PATCH 11/13] feat(examples/ingress): app-builder wired with app-layout server config --- examples/ingress/app-builder.config.ts | 12 ++++++++++-- examples/ingress/src/server/config/app-builder.ts | 6 ++++++ examples/ingress/src/server/index.ts | 4 ++-- 3 files changed, 18 insertions(+), 4 deletions(-) diff --git a/examples/ingress/app-builder.config.ts b/examples/ingress/app-builder.config.ts index 9d818fa..e8225d9 100644 --- a/examples/ingress/app-builder.config.ts +++ b/examples/ingress/app-builder.config.ts @@ -1,14 +1,22 @@ import type {ServiceConfig} from '@gravity-ui/app-builder'; -import {APP_PORT} from './src/server/config/app-builder'; +import { + APP_ASSETS_MANIFEST_FILE, + APP_OUTPUT_PATH, + APP_PORT, + APP_PUBLIC_PATH, +} from './src/server/config/app-builder'; export default (): ServiceConfig => { return { client: { - newJsxTransform: true, + assetsManifestFile: APP_ASSETS_MANIFEST_FILE, devServer: { port: APP_PORT ? APP_PORT + 1 : undefined, }, + newJsxTransform: true, + outputPath: APP_OUTPUT_PATH, + publicPath: APP_PUBLIC_PATH, }, server: { port: APP_PORT, diff --git a/examples/ingress/src/server/config/app-builder.ts b/examples/ingress/src/server/config/app-builder.ts index 3f2d50d..b366e85 100644 --- a/examples/ingress/src/server/config/app-builder.ts +++ b/examples/ingress/src/server/config/app-builder.ts @@ -1,3 +1,9 @@ +import path from 'path'; + +export const APP_ASSETS_MANIFEST_FILE: string | undefined = 'assets-manifest.json'; +export const APP_OUTPUT_PATH: string | undefined = 'dist/public/build'; +export const APP_MANIFEST = path.join(APP_OUTPUT_PATH, APP_ASSETS_MANIFEST_FILE); + // APP_PORT and APP_SOCKET are interchangeable // one of APP_PORT or APP_SOCKET should be present // APP_PORT wins over APP_SOCKET diff --git a/examples/ingress/src/server/index.ts b/examples/ingress/src/server/index.ts index 8503085..b25876f 100644 --- a/examples/ingress/src/server/index.ts +++ b/examples/ingress/src/server/index.ts @@ -2,7 +2,7 @@ import {createLayoutPlugin, createRenderFunction} from '@gravity-ui/app-layout'; import {ExpressKit} from '@gravity-ui/expresskit'; import {NodeKit} from '@gravity-ui/nodekit'; -import {APP_PORT, APP_PUBLIC_PATH, APP_SOCKET} from './config/app-builder'; +import {APP_MANIFEST, APP_PORT, APP_PUBLIC_PATH, APP_SOCKET} from './config/app-builder'; const nodekit = new NodeKit({ config: { @@ -13,7 +13,7 @@ const nodekit = new NodeKit({ const renderLayout = createRenderFunction([ createLayoutPlugin({ - manifest: 'dist/public/build/assets-manifest.json', + manifest: APP_MANIFEST, publicPath: APP_PUBLIC_PATH, }), ]); From 79832d818f4afb91290d6c2505ae85ed6eca6817 Mon Sep 17 00:00:00 2001 From: Vladimir Kubantsev Date: Tue, 21 Jul 2026 17:06:25 +0300 Subject: [PATCH 12/13] fix(examples/ingress): resolve app-builder output path --- examples/ingress/app-builder.config.ts | 4 +++- examples/ingress/src/server/config/app-builder.ts | 6 ++---- examples/ingress/src/server/index.ts | 12 ++++++++++-- 3 files changed, 15 insertions(+), 7 deletions(-) diff --git a/examples/ingress/app-builder.config.ts b/examples/ingress/app-builder.config.ts index e8225d9..5601a50 100644 --- a/examples/ingress/app-builder.config.ts +++ b/examples/ingress/app-builder.config.ts @@ -1,3 +1,5 @@ +import * as path from 'node:path'; + import type {ServiceConfig} from '@gravity-ui/app-builder'; import { @@ -15,7 +17,7 @@ export default (): ServiceConfig => { port: APP_PORT ? APP_PORT + 1 : undefined, }, newJsxTransform: true, - outputPath: APP_OUTPUT_PATH, + outputPath: APP_OUTPUT_PATH ? path.resolve(APP_OUTPUT_PATH) : undefined, publicPath: APP_PUBLIC_PATH, }, server: { diff --git a/examples/ingress/src/server/config/app-builder.ts b/examples/ingress/src/server/config/app-builder.ts index b366e85..8bbd305 100644 --- a/examples/ingress/src/server/config/app-builder.ts +++ b/examples/ingress/src/server/config/app-builder.ts @@ -1,8 +1,6 @@ -import path from 'path'; +export const APP_ASSETS_MANIFEST_FILE = 'assets-manifest.json'; -export const APP_ASSETS_MANIFEST_FILE: string | undefined = 'assets-manifest.json'; -export const APP_OUTPUT_PATH: string | undefined = 'dist/public/build'; -export const APP_MANIFEST = path.join(APP_OUTPUT_PATH, APP_ASSETS_MANIFEST_FILE); +export const APP_OUTPUT_PATH = 'dist/public/build'; // APP_PORT and APP_SOCKET are interchangeable // one of APP_PORT or APP_SOCKET should be present diff --git a/examples/ingress/src/server/index.ts b/examples/ingress/src/server/index.ts index b25876f..32dedb9 100644 --- a/examples/ingress/src/server/index.ts +++ b/examples/ingress/src/server/index.ts @@ -1,8 +1,16 @@ +import * as path from 'node:path'; + import {createLayoutPlugin, createRenderFunction} from '@gravity-ui/app-layout'; import {ExpressKit} from '@gravity-ui/expresskit'; import {NodeKit} from '@gravity-ui/nodekit'; -import {APP_MANIFEST, APP_PORT, APP_PUBLIC_PATH, APP_SOCKET} from './config/app-builder'; +import { + APP_ASSETS_MANIFEST_FILE, + APP_OUTPUT_PATH, + APP_PORT, + APP_PUBLIC_PATH, + APP_SOCKET, +} from './config/app-builder'; const nodekit = new NodeKit({ config: { @@ -13,7 +21,7 @@ const nodekit = new NodeKit({ const renderLayout = createRenderFunction([ createLayoutPlugin({ - manifest: APP_MANIFEST, + manifest: path.join(APP_OUTPUT_PATH, APP_ASSETS_MANIFEST_FILE), publicPath: APP_PUBLIC_PATH, }), ]); From 09fe964582f19b1505cde6de2b81b9992747143f Mon Sep 17 00:00:00 2001 From: Vladimir Kubantsev Date: Tue, 21 Jul 2026 17:40:16 +0300 Subject: [PATCH 13/13] feat(examples/ingress): syncs nginx --- examples/ingress/app-builder.config.ts | 22 +++ examples/ingress/lib/nginx/README.md | 61 +++++++- examples/ingress/lib/nginx/eslint.config.js | 3 +- examples/ingress/lib/nginx/package.json | 3 +- examples/ingress/lib/nginx/src/index.ts | 142 +++++++++++++++++- examples/ingress/lib/nginx/src/nginx.ts | 16 ++ examples/ingress/lib/nginx/src/sync.ts | 110 ++++++++++++++ .../lib/nginx/templates/nginx.conf.template | 46 ------ examples/ingress/lib/nginx/tsconfig.json | 1 + .../ingress/templates/nginx.conf.template | 39 +++++ 10 files changed, 391 insertions(+), 52 deletions(-) create mode 100644 examples/ingress/lib/nginx/src/nginx.ts create mode 100644 examples/ingress/lib/nginx/src/sync.ts delete mode 100644 examples/ingress/lib/nginx/templates/nginx.conf.template create mode 100644 examples/ingress/templates/nginx.conf.template diff --git a/examples/ingress/app-builder.config.ts b/examples/ingress/app-builder.config.ts index 5601a50..ccba2d9 100644 --- a/examples/ingress/app-builder.config.ts +++ b/examples/ingress/app-builder.config.ts @@ -1,5 +1,6 @@ import * as path from 'node:path'; +import {newNginxIngressListeningHandler} from '@examples/ingress-nginx'; import type {ServiceConfig} from '@gravity-ui/app-builder'; import { @@ -7,6 +8,7 @@ import { APP_OUTPUT_PATH, APP_PORT, APP_PUBLIC_PATH, + APP_SOCKET, } from './src/server/config/app-builder'; export default (): ServiceConfig => { @@ -15,6 +17,26 @@ export default (): ServiceConfig => { assetsManifestFile: APP_ASSETS_MANIFEST_FILE, devServer: { port: APP_PORT ? APP_PORT + 1 : undefined, + // Fires once the client dev server is listening — the moment its socket/port + // (the /build/ upstream) becomes reachable for the reverse tunnel. + onListening: (devServer) => { + const nginxIngress = newNginxIngressListeningHandler({ + template: path.resolve('templates', 'nginx.conf.template'), + serverName: process.env.INGRESS_SERVER_NAME ?? 'ingress.example', + remote: { + host: process.env.INGRESS_HOST ?? 'me@dev-vm', + // /build/ upstream → the client dev server (local end read from onListening). + client: {reversePort: 3031}, + // everything else → the node server on its ipc socket. + server: {reversePort: 3030, socket: APP_SOCKET, localPort: APP_PORT}, + }, + }); + + nginxIngress.handle(devServer); + + process.once('SIGINT', nginxIngress.stop); + process.once('SIGTERM', nginxIngress.stop); + }, }, newJsxTransform: true, outputPath: APP_OUTPUT_PATH ? path.resolve(APP_OUTPUT_PATH) : undefined, diff --git a/examples/ingress/lib/nginx/README.md b/examples/ingress/lib/nginx/README.md index d567297..30751ef 100644 --- a/examples/ingress/lib/nginx/README.md +++ b/examples/ingress/lib/nginx/README.md @@ -1,3 +1,60 @@ -# nginx +# @examples/ingress-nginx -Bootstrapped with @gravity-ui/create. +A tiny app-builder library that fronts a local `app-builder dev` server with a real nginx on a +remote VM, reached over `ssh -R` reverse tunnels. Generic and topology-agnostic: it **renders** an +nginx config from an explicit param map and **syncs** it over ssh. The actual nginx layout +(server_name, upstreams, SSL) lives with the consumer — see `examples/ingress/templates/nginx.conf.template`. + +## Modules + +- `src/nginx.ts` — `render(template, params)` (pure `${NAME}` substitution, whitelist = keys of + `params`; nginx's own `$vars` are left intact) + `DEFAULT_RELOAD_COMMAND`. +- `src/sync.ts` — `sync(config, target)` — pushes the config over ssh (`sudo tee` + reload) and + opens the reverse forwards (one `ssh` process, one `-R` per tunnel); returns `{stop}`. +- `src/index.ts` — `newNginxIngressListeningHandler(options)` returns `{handle, stop}`: `handle` is + the `onListening` callback (reads the client dev server's live address; node endpoint from + `options`), `stop` tears the tunnels down. + +## Usage + +Build the handler once from options, assign `handle` to `onListening`, and wire `stop` to signals: + +```ts +// app-builder.config.ts +import {newNginxIngressListeningHandler} from '@examples/ingress-nginx'; + +const ingress = newNginxIngressListeningHandler({ + template: 'templates/nginx.conf.template', // your layout, resolved from cwd + serverName: 'ingress.me.ui.yandex.cloud', + remote: { + host: 'me.ui.cloud.yandex.net', // ssh target that runs nginx + client: {reversePort: 3031}, // VM port (ssh -R bind) → client dev server (/build/) + server: {reversePort: 3030, socket: 'dist/run/server.sock'}, // VM port → node server + }, +}); + +process.once('SIGINT', ingress.stop); +process.once('SIGTERM', ingress.stop); + +export default { + client: {devServer: {onListening: ingress.handle}}, + server: { + /* ... */ + }, +}; +``` + +The template gets `APP_SERVER_NAME`, `APP_CLIENT_UPSTREAM` (`127.0.0.1:`) and +`APP_SERVER_UPSTREAM` (`127.0.0.1:`); pass anything else via `options.params`. + +## Requirements on the VM + +- nginx with the `common/ssl` / `common/gzip` includes and a cert for `serverName`. +- The remote user can write `configPath` (default `/etc/nginx/sites-enabled/.conf`) and + run `reloadCommand` (default `sudo nginx -s reload`) — e.g. passwordless sudo. +- ssh access. Auth is interactive when the tunnel starts (use an agent / `ControlMaster` to avoid + repeat prompts). + +## Build + +`npm run build` (`app-builder build`) → `build/esm` + `build/cjs` + `.d.ts`. diff --git a/examples/ingress/lib/nginx/eslint.config.js b/examples/ingress/lib/nginx/eslint.config.js index ea71ad6..4676bae 100644 --- a/examples/ingress/lib/nginx/eslint.config.js +++ b/examples/ingress/lib/nginx/eslint.config.js @@ -5,10 +5,11 @@ import {defineConfig} from 'eslint/config'; import globals from 'globals'; export default defineConfig( + {ignores: ['build/**']}, baseConfig, importOrderConfig, { - files: ['.prettierrc.cjs'], + files: ['.prettierrc.cjs', 'src/**/*.ts'], languageOptions: { globals: { ...globals.node, diff --git a/examples/ingress/lib/nginx/package.json b/examples/ingress/lib/nginx/package.json index 1bd40c6..7b1734e 100644 --- a/examples/ingress/lib/nginx/package.json +++ b/examples/ingress/lib/nginx/package.json @@ -7,8 +7,7 @@ "module": "build/esm/index.js", "types": "build/esm/index.d.ts", "files": [ - "build", - "templates" + "build" ], "scripts": { "typecheck": "tsc --noEmit", diff --git a/examples/ingress/lib/nginx/src/index.ts b/examples/ingress/lib/nginx/src/index.ts index fdffd2d..4bb924b 100644 --- a/examples/ingress/lib/nginx/src/index.ts +++ b/examples/ingress/lib/nginx/src/index.ts @@ -1 +1,141 @@ -console.info('Hello, world!'); +/** + * nginx dev ingress — entrypoint. + * + * `newNginxIngressListeningHandler(options)` returns `{handle, stop}`: + * - `handle(devServer)` is meant to be assigned to `client.devServer.onListening`. When the dev + * server socket/port goes live it renders the nginx config (`nginx` module) and ships it to the + * remote host, holding the reverse tunnels open (`sync` module). + * - `stop()` tears the tunnels down; wire it to your process signals. + */ + +import {readFileSync} from 'node:fs'; +import path from 'node:path'; + +import {DEFAULT_RELOAD_COMMAND, render} from './nginx.js'; +import {sync} from './sync.js'; +import type {SyncHandle} from './sync.js'; + +/** Minimal structural shape of the webpack/rspack dev-server instance passed to `onListening`. */ +export interface DevServerLike { + server?: { + address(): string | {port: number; address?: string} | null; + } | null; +} + +export interface IngressOptions { + /** Path to the nginx template, resolved from the project cwd. */ + template: string; + /** nginx server_name(s); the first also names the default remote config file. */ + serverName: string | string[]; + remote: { + /** ssh target that runs nginx, e.g. `me@dev-vm`. */ + host: string; + /** + * `/build/` upstream. The remote nginx proxies to `127.0.0.1:`, which + * `ssh -R` forwards to the client dev server (its local address is read from `onListening`). + */ + client: {reversePort: number}; + /** + * Everything-else upstream (the node server). nginx proxies to `127.0.0.1:`, + * forwarded to the node's local endpoint — a `socket` path (resolved from cwd) or a + * `localPort` — since `onListening` does not expose the node. + */ + server: {reversePort: number; socket?: string; localPort?: number}; + /** Absolute path on the VM to write the config to. Default: `sites-enabled/.conf`. */ + configPath?: string; + /** Command to reload nginx over ssh. Default: `sudo nginx -s reload`. */ + reloadCommand?: string; + /** Extra arguments for the ssh tunnel process. */ + extraSshArgs?: string[]; + }; + /** Extra template params. Built-ins (`APP_SERVER_NAME`, `APP_*_UPSTREAM`) always win. */ + params?: Record; +} + +export interface NginxIngressListeningHandler { + /** Assign to `client.devServer.onListening`. Runs the ingress setup once, on first listen. */ + handle: (server: DevServerLike) => void; + /** Tear the reverse tunnels down. Wire to SIGINT/SIGTERM. */ + stop: () => Promise; +} + +/** ipc socket path (string) or `localhost:` from a dev server's `address()`. */ +function addressToLocalTarget(address: string | {port: number} | null | undefined): string { + if (!address) { + throw new Error('nginx ingress: dev server is not listening yet (no address)'); + } + return typeof address === 'string' ? address : `localhost:${address.port}`; +} + +async function setupIngress(server: DevServerLike, options: IngressOptions): Promise { + const {remote} = options; + const serverNames = Array.isArray(options.serverName) + ? options.serverName + : [options.serverName]; + + // Client dev server: local address is discovered dynamically from the listening server. + const clientLocal = addressToLocalTarget(server.server?.address()); + // Node server: not exposed by onListening, so its local endpoint comes from the config. + const serverLocal = remote.server.socket + ? path.resolve(process.cwd(), remote.server.socket) + : `localhost:${remote.server.localPort}`; + + const template = readFileSync(path.resolve(process.cwd(), options.template), 'utf8'); + const conf = render(template, { + ...options.params, + APP_SERVER_NAME: serverNames.join(' '), + APP_CLIENT_UPSTREAM: `127.0.0.1:${remote.client.reversePort}`, + APP_SERVER_UPSTREAM: `127.0.0.1:${remote.server.reversePort}`, + }); + + return sync(conf, { + host: remote.host, + configPath: remote.configPath ?? `/etc/nginx/sites-enabled/${serverNames[0]}.conf`, + reloadCommand: remote.reloadCommand ?? DEFAULT_RELOAD_COMMAND, + tunnels: [ + {port: remote.client.reversePort, localTarget: clientLocal}, + {port: remote.server.reversePort, localTarget: serverLocal}, + ], + extraSshArgs: remote.extraSshArgs, + }); +} + +export function newNginxIngressListeningHandler( + options: IngressOptions, +): NginxIngressListeningHandler { + let syncHandle: SyncHandle | undefined; + let started = false; + let stopped = false; + + const handle = (server: DevServerLike) => { + // onListening can fire again after a dev-server restart; only set up once. + if (started) { + return; + } + started = true; + + setupIngress(server, options) + .then((h) => { + // If stop() was already called while we were setting up, tear down immediately. + if (stopped) { + h.stop().catch(() => {}); + } else { + syncHandle = h; + } + }) + .catch((error: unknown) => { + console.error('[nginx-ingress] setup failed:', error); + }); + }; + + const stop = async () => { + stopped = true; + if (syncHandle) { + const h = syncHandle; + syncHandle = undefined; + await h.stop(); + } + }; + + return {handle, stop}; +} diff --git a/examples/ingress/lib/nginx/src/nginx.ts b/examples/ingress/lib/nginx/src/nginx.ts new file mode 100644 index 0000000..f6ca3f6 --- /dev/null +++ b/examples/ingress/lib/nginx/src/nginx.ts @@ -0,0 +1,16 @@ +/** + * nginx config templating — pure, no I/O. + * + * Substitutes `${NAME}` placeholders from an explicit params map, mimicking `envsubst` with a + * whitelist: only keys present in `params` are replaced; every other `${...}` and all unbraced + * nginx variables (`$host`, `$scheme`, ...) are left untouched. + */ + +/** Command that tells a running nginx to pick up the new config. */ +export const DEFAULT_RELOAD_COMMAND = 'sudo nginx -s reload'; + +export function render(template: string, params: Record): string { + return template.replace(/\$\{([A-Za-z_][A-Za-z0-9_]*)\}/g, (match, name: string) => + name in params ? params[name] : match, + ); +} diff --git a/examples/ingress/lib/nginx/src/sync.ts b/examples/ingress/lib/nginx/src/sync.ts new file mode 100644 index 0000000..c155e6e --- /dev/null +++ b/examples/ingress/lib/nginx/src/sync.ts @@ -0,0 +1,110 @@ +/** + * Ships a rendered nginx config to a remote host over ssh and holds a reverse tunnel open, so the + * remote nginx upstream reaches the local dev server. Generic transport — no nginx knowledge. + * + * Auth is left entirely to ssh: the ssh invocations below run with inherited stdio, so any host + * key / 2FA / sudo prompt is answered in your terminal. Use an ssh agent or a `ControlMaster` entry + * in ~/.ssh/config to avoid repeated prompts. The remote user must be able to write `configPath` + * and run `reloadCommand` (e.g. passwordless sudo, or a user-writable include dir). + */ + +import {execFileSync, spawn} from 'node:child_process'; +import type {ChildProcess} from 'node:child_process'; + +export interface SyncTarget { + host: string; + configPath: string; + reloadCommand: string; + /** Reverse forwards: each maps remote `127.0.0.1:` → a local socket path or `host:port`. */ + tunnels: Array<{port: number; localTarget: string}>; + extraSshArgs?: string[]; +} + +export interface SyncHandle { + stop: () => Promise; +} + +/** POSIX single-quote a value for safe embedding in a remote shell command. */ +function shellSingleQuote(value: string): string { + return `'${value.replace(/'/g, `'\\''`)}'`; +} + +function sshRun(host: string, remoteScript: string): Promise { + return new Promise((resolve, reject) => { + const proc = spawn('ssh', [host, remoteScript], {stdio: 'inherit'}); + proc.on('error', reject); + proc.on('exit', (code) => + code === 0 ? resolve() : reject(new Error(`ssh exited with code ${code}`)), + ); + }); +} + +export async function sync(config: string, target: SyncTarget): Promise { + const {host, configPath, reloadCommand, tunnels, extraSshArgs} = target; + + // 1. Push the rendered config + reload nginx, and wait for it (fail fast on a bad config). + // The config travels base64-encoded inside the command (not over stdin), so ssh's stdin/tty + // stays free for auth and sudo prompts. + const encoded = Buffer.from(config, 'utf8').toString('base64'); + const pushScript = + `printf %s ${shellSingleQuote(encoded)} | base64 -d | ` + + `sudo tee ${shellSingleQuote(configPath)} > /dev/null && ${reloadCommand}`; + await sshRun(host, pushScript); + + // 2. Open the reverse forwards on a single ssh connection (one `-R` per tunnel): each remote + // 127.0.0.1: -> a local dev server endpoint. This is the interactive step — the user + // completes ssh auth when it starts. + const forwardArgs = tunnels.flatMap((t) => ['-R', `${t.port}:${t.localTarget}`]); + const tunnelProc: ChildProcess = spawn( + 'ssh', + [ + '-N', + '-o', + 'ExitOnForwardFailure=yes', + '-o', + 'ServerAliveInterval=30', + '-o', + 'ServerAliveCountMax=3', + ...(extraSshArgs ?? []), + ...forwardArgs, + host, + ], + {stdio: 'inherit'}, + ); + tunnelProc.on('exit', (code, signal) => { + if (signal !== 'SIGTERM' && code) { + console.error(`[nginx-ingress] reverse tunnel exited (code=${code})`); + } + }); + + // Removing the config on shutdown must be an explicit step: a remote `trap` on the tunnel + // cannot do it, because without a PTY ssh delivers no signal (and no stdin EOF) to the remote + // command when the client disconnects — it would just orphan and never fire. + const cleanupScript = `sudo rm -f ${shellSingleQuote(configPath)} && ${reloadCommand}`; + let stopped = false; + + return { + stop: async () => { + if (stopped) { + return; + } + stopped = true; + + // Remove the config on the VM and reload — SYNCHRONOUSLY, so it finishes before any + // later signal handler (e.g. app-builder's SIGINT handler, which calls process.exit) + // can end the process out from under an async cleanup. + try { + execFileSync('ssh', [host, cleanupScript], {stdio: 'inherit', timeout: 15_000}); + } catch (error) { + console.error( + '[nginx-ingress] remote cleanup failed:', + error instanceof Error ? error.message : error, + ); + } + + if (tunnelProc.exitCode === null && tunnelProc.signalCode === null) { + tunnelProc.kill('SIGTERM'); + } + }, + }; +} diff --git a/examples/ingress/lib/nginx/templates/nginx.conf.template b/examples/ingress/lib/nginx/templates/nginx.conf.template deleted file mode 100644 index 0ba6144..0000000 --- a/examples/ingress/lib/nginx/templates/nginx.conf.template +++ /dev/null @@ -1,46 +0,0 @@ -# Rendered by @gravity-ui app-builder nginx ingress lib via envsubst. -# Do not edit the generated nginx.conf by hand — edit the template instead. -# -# Substitute ONLY the ingress variables, so nginx's own $-variables ($host, $scheme, ...) survive: -# envsubst '${APP_SERVER_NAME} ${APP_PUBLIC_PATH} ${APP_CLIENT_UPSTREAM} ${APP_SERVER_UPSTREAM}' \ -# < nginx.conf.template > nginx.conf -# -# APP_PUBLIC_PATH must equal the client dev server's publicPath (default /build/); it is the single -# source of truth shared by the server layout, the dev server, and this location prefix. -# Each *_UPSTREAM is either an ipc socket e.g. unix:/…/dist/run/client.sock -# or an http host:port e.g. 127.0.0.1:3031 -server { - listen 80; - listen [::]:80; - - server_name ${APP_SERVER_NAME}; - - client_max_body_size 20m; - - # Prevent header buffer overflow for large auth/cookie headers. - proxy_buffer_size 16k; - proxy_buffers 8 16k; - - # Build assets + HMR websocket → client dev server. - location ${APP_PUBLIC_PATH} { - proxy_pass http://${APP_CLIENT_UPSTREAM}; - proxy_http_version 1.1; - proxy_set_header Host $host; - proxy_set_header Upgrade $http_upgrade; - proxy_set_header Connection "upgrade"; - proxy_redirect off; - } - - # Everything else → node server. - location / { - proxy_pass http://${APP_SERVER_UPSTREAM}; - proxy_http_version 1.1; - proxy_set_header Host $host; - proxy_set_header X-Real-IP $remote_addr; - proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; - proxy_set_header X-Forwarded-Proto $scheme; - proxy_set_header X-Request-ID $request_id; - proxy_redirect off; - proxy_read_timeout 300s; - } -} diff --git a/examples/ingress/lib/nginx/tsconfig.json b/examples/ingress/lib/nginx/tsconfig.json index 6220664..7afd086 100644 --- a/examples/ingress/lib/nginx/tsconfig.json +++ b/examples/ingress/lib/nginx/tsconfig.json @@ -4,6 +4,7 @@ "target": "ES2022", "module": "NodeNext", "moduleResolution": "NodeNext", + "baseUrl": ".", "rootDir": "./src" }, "include": ["src/**/*"] diff --git a/examples/ingress/templates/nginx.conf.template b/examples/ingress/templates/nginx.conf.template new file mode 100644 index 0000000..b2638e6 --- /dev/null +++ b/examples/ingress/templates/nginx.conf.template @@ -0,0 +1,39 @@ +# Ingress layout for the ingress example. Rendered by the @examples/ingress-nginx lib. +# ${APP_SERVER_NAME}, ${APP_CLIENT_UPSTREAM} and ${APP_SERVER_UPSTREAM} are substituted with +# explicit values; nginx's own $-variables ($host, $scheme, ...) are left untouched. +server { + include common/ssl; + include common/gzip; + + server_name ${APP_SERVER_NAME}; + + client_max_body_size 20m; + + # Prevent header buffer overflow for large auth/cookie headers. + proxy_buffer_size 16k; + proxy_buffers 8 16k; + + # Build assets + HMR websocket → client dev server (reached over an ssh -R forward). + location /build/ { + proxy_pass http://${APP_CLIENT_UPSTREAM}; + proxy_http_version 1.1; + proxy_set_header Host $host; + proxy_set_header Upgrade $http_upgrade; + proxy_set_header Connection "upgrade"; + proxy_redirect off; + } + + # Everything else → node server (renders the app-layout UI; reached over a second ssh -R forward). + # Host is preserved so the node's known-hosts restriction accepts the request. + location / { + proxy_pass http://${APP_SERVER_UPSTREAM}; + proxy_http_version 1.1; + proxy_set_header Host $host; + proxy_set_header X-Real-IP $remote_addr; + proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; + proxy_set_header X-Forwarded-Proto $scheme; + proxy_set_header X-Request-ID $request_id; + proxy_redirect off; + proxy_read_timeout 300s; + } +}