diff --git a/web/package-lock.json b/web/package-lock.json index 9d9c3a7..6c341f1 100644 --- a/web/package-lock.json +++ b/web/package-lock.json @@ -26,6 +26,7 @@ "postcss": "^8.4.28", "prettier": "^3.0.2", "process": "^0.11.10", + "steiger": "^0.4.0", "tailwind-scrollbar": "^3.1.0", "tailwindcss": "^3.3.3", "typescript": "^5.1.6" @@ -233,6 +234,18 @@ "node": ">=4" } }, + "node_modules/@babel/parser": { + "version": "7.24.8", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.24.8.tgz", + "integrity": "sha512-WzfbgXOkGzZiXXCqk43kKwZjzwx4oulxZi3nq2TYL9mOjQv6kYwul9mz6ID36njuL7Xkp6nJEfok848Zj10j/w==", + "dev": true, + "bin": { + "parser": "bin/babel-parser.js" + }, + "engines": { + "node": ">=6.0.0" + } + }, "node_modules/@babel/runtime": { "version": "7.22.10", "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.22.10.tgz", @@ -244,6 +257,19 @@ "node": ">=6.9.0" } }, + "node_modules/@dependents/detective-less": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/@dependents/detective-less/-/detective-less-5.0.0.tgz", + "integrity": "sha512-D/9dozteKcutI5OdxJd8rU+fL6XgaaRg60sPPJWkT33OCiRfkCu5wO5B/yXTaaL2e6EB0lcCBGe5E0XscZCvvQ==", + "dev": true, + "dependencies": { + "gonzales-pe": "^4.3.0", + "node-source-walk": "^7.0.0" + }, + "engines": { + "node": ">=18" + } + }, "node_modules/@eslint-community/eslint-utils": { "version": "4.4.0", "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.4.0.tgz", @@ -300,6 +326,28 @@ "node": "^12.22.0 || ^14.17.0 || >=16.0.0" } }, + "node_modules/@feature-sliced/filesystem": { + "version": "2.2.5", + "resolved": "https://registry.npmjs.org/@feature-sliced/filesystem/-/filesystem-2.2.5.tgz", + "integrity": "sha512-2z6qQQsbJ/jniNsYTxWgyVyUk28bBSq0uYdWrTFLJzTJgDrtU7Hx+5fji27VVoYzzyjdAr4wEEygJ7dYX59gkg==", + "dev": true, + "dependencies": { + "typescript": "^5.4.5" + } + }, + "node_modules/@feature-sliced/steiger-plugin": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/@feature-sliced/steiger-plugin/-/steiger-plugin-0.4.0.tgz", + "integrity": "sha512-DW1+7BRZZrCViIFZgzHw34lUxz7R47se1pdHNiXEQ3B2hvWslPK/LzIQV9aabosii7ZreINc3LBMtWF0tFg8lw==", + "dev": true, + "dependencies": { + "@feature-sliced/filesystem": "^2.2.5", + "lodash-es": "^4.17.21", + "pluralize": "^8.0.0", + "precinct": "^12.1.1", + "tsconfck": "^3.0.3" + } + }, "node_modules/@humanwhocodes/config-array": { "version": "0.11.10", "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.11.10.tgz", @@ -2072,6 +2120,18 @@ "url": "https://opencollective.com/unts" } }, + "node_modules/@sindresorhus/merge-streams": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/@sindresorhus/merge-streams/-/merge-streams-2.3.0.tgz", + "integrity": "sha512-LtoMMhxAlorcGhmFYI+LhPgbPZCkgP6ra1YL604EeF6U98pLlQ3iWIGMdWSC+vWmPBWBNgmDBAhnAobLROJmwg==", + "dev": true, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/@swc/core": { "version": "1.3.78", "resolved": "https://registry.npmjs.org/@swc/core/-/core-1.3.78.tgz", @@ -2496,6 +2556,74 @@ "url": "https://opencollective.com/typescript-eslint" } }, + "node_modules/@vue/compiler-core": { + "version": "3.4.34", + "resolved": "https://registry.npmjs.org/@vue/compiler-core/-/compiler-core-3.4.34.tgz", + "integrity": "sha512-Z0izUf32+wAnQewjHu+pQf1yw00EGOmevl1kE+ljjjMe7oEfpQ+BI3/JNK7yMB4IrUsqLDmPecUrpj3mCP+yJQ==", + "dev": true, + "dependencies": { + "@babel/parser": "^7.24.7", + "@vue/shared": "3.4.34", + "entities": "^4.5.0", + "estree-walker": "^2.0.2", + "source-map-js": "^1.2.0" + } + }, + "node_modules/@vue/compiler-core/node_modules/entities": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/entities/-/entities-4.5.0.tgz", + "integrity": "sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==", + "dev": true, + "engines": { + "node": ">=0.12" + }, + "funding": { + "url": "https://github.com/fb55/entities?sponsor=1" + } + }, + "node_modules/@vue/compiler-dom": { + "version": "3.4.34", + "resolved": "https://registry.npmjs.org/@vue/compiler-dom/-/compiler-dom-3.4.34.tgz", + "integrity": "sha512-3PUOTS1h5cskdOJMExCu2TInXuM0j60DRPpSCJDqOCupCfUZCJoyQmKtRmA8EgDNZ5kcEE7vketamRZfrEuVDw==", + "dev": true, + "dependencies": { + "@vue/compiler-core": "3.4.34", + "@vue/shared": "3.4.34" + } + }, + "node_modules/@vue/compiler-sfc": { + "version": "3.4.34", + "resolved": "https://registry.npmjs.org/@vue/compiler-sfc/-/compiler-sfc-3.4.34.tgz", + "integrity": "sha512-x6lm0UrM03jjDXTPZgD9Ad8bIVD1ifWNit2EaWQIZB5CULr46+FbLQ5RpK7AXtDHGjx9rmvC7QRCTjsiGkAwRw==", + "dev": true, + "dependencies": { + "@babel/parser": "^7.24.7", + "@vue/compiler-core": "3.4.34", + "@vue/compiler-dom": "3.4.34", + "@vue/compiler-ssr": "3.4.34", + "@vue/shared": "3.4.34", + "estree-walker": "^2.0.2", + "magic-string": "^0.30.10", + "postcss": "^8.4.39", + "source-map-js": "^1.2.0" + } + }, + "node_modules/@vue/compiler-ssr": { + "version": "3.4.34", + "resolved": "https://registry.npmjs.org/@vue/compiler-ssr/-/compiler-ssr-3.4.34.tgz", + "integrity": "sha512-8TDBcLaTrFm5rnF+Qm4BlliaopJgqJ28Nsrc80qazynm5aJO+Emu7y0RWw34L8dNnTRdcVBpWzJxhGYzsoVu4g==", + "dev": true, + "dependencies": { + "@vue/compiler-dom": "3.4.34", + "@vue/shared": "3.4.34" + } + }, + "node_modules/@vue/shared": { + "version": "3.4.34", + "resolved": "https://registry.npmjs.org/@vue/shared/-/shared-3.4.34.tgz", + "integrity": "sha512-x5LmiRLpRsd9KTjAB8MPKf0CDPMcuItjP0gbNqFCIgL1I8iYp4zglhj9w9FPCdIbHG2M91RVeIbArFfFTz9I3A==", + "dev": true + }, "node_modules/abortcontroller-polyfill": { "version": "1.7.5", "resolved": "https://registry.npmjs.org/abortcontroller-polyfill/-/abortcontroller-polyfill-1.7.5.tgz", @@ -2603,6 +2731,15 @@ "node": ">=8" } }, + "node_modules/ast-module-types": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/ast-module-types/-/ast-module-types-6.0.0.tgz", + "integrity": "sha512-LFRg7178Fw5R4FAEwZxVqiRI8IxSM+Ay2UBrHoCerXNme+kMMMfz7T3xDGV/c2fer87hcrtgJGsnSOfUrPK6ng==", + "dev": true, + "engines": { + "node": ">=18" + } + }, "node_modules/atomic-router": { "version": "0.8.0", "resolved": "https://registry.npmjs.org/atomic-router/-/atomic-router-0.8.0.tgz", @@ -2806,16 +2943,10 @@ } }, "node_modules/chokidar": { - "version": "3.5.3", - "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.3.tgz", - "integrity": "sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==", + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.6.0.tgz", + "integrity": "sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw==", "dev": true, - "funding": [ - { - "type": "individual", - "url": "https://paulmillr.com/funding/" - } - ], "dependencies": { "anymatch": "~3.1.2", "braces": "~3.0.2", @@ -2828,6 +2959,9 @@ "engines": { "node": ">= 8.10.0" }, + "funding": { + "url": "https://paulmillr.com/funding/" + }, "optionalDependencies": { "fsevents": "~2.3.2" } @@ -2853,6 +2987,20 @@ "node": ">=6.0" } }, + "node_modules/cliui": { + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-8.0.1.tgz", + "integrity": "sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==", + "dev": true, + "dependencies": { + "string-width": "^4.2.0", + "strip-ansi": "^6.0.1", + "wrap-ansi": "^7.0.0" + }, + "engines": { + "node": ">=12" + } + }, "node_modules/clone": { "version": "2.1.2", "resolved": "https://registry.npmjs.org/clone/-/clone-2.1.2.tgz", @@ -3167,6 +3315,219 @@ "node": ">=0.10" } }, + "node_modules/detective-amd": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/detective-amd/-/detective-amd-6.0.0.tgz", + "integrity": "sha512-NTqfYfwNsW7AQltKSEaWR66hGkTeD52Kz3eRQ+nfkA9ZFZt3iifRCWh+yZ/m6t3H42JFwVFTrml/D64R2PAIOA==", + "dev": true, + "dependencies": { + "ast-module-types": "^6.0.0", + "escodegen": "^2.1.0", + "get-amd-module-type": "^6.0.0", + "node-source-walk": "^7.0.0" + }, + "bin": { + "detective-amd": "bin/cli.js" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/detective-cjs": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/detective-cjs/-/detective-cjs-6.0.0.tgz", + "integrity": "sha512-R55jTS6Kkmy6ukdrbzY4x+I7KkXiuDPpFzUViFV/tm2PBGtTCjkh9ZmTuJc1SaziMHJOe636dtiZLEuzBL9drg==", + "dev": true, + "dependencies": { + "ast-module-types": "^6.0.0", + "node-source-walk": "^7.0.0" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/detective-es6": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/detective-es6/-/detective-es6-5.0.0.tgz", + "integrity": "sha512-NGTnzjvgeMW1khUSEXCzPDoraLenWbUjCFjwxReH+Ir+P6LGjYtaBbAvITWn2H0VSC+eM7/9LFOTAkrta6hNYg==", + "dev": true, + "dependencies": { + "node-source-walk": "^7.0.0" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/detective-postcss": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/detective-postcss/-/detective-postcss-7.0.0.tgz", + "integrity": "sha512-pSXA6dyqmBPBuERpoOKKTUUjQCZwZPLRbd1VdsTbt6W+m/+6ROl4BbE87yQBUtLoK7yX8pvXHdKyM/xNIW9F7A==", + "dev": true, + "dependencies": { + "is-url": "^1.2.4", + "postcss-values-parser": "^6.0.2" + }, + "engines": { + "node": "^14.0.0 || >=16.0.0" + }, + "peerDependencies": { + "postcss": "^8.4.38" + } + }, + "node_modules/detective-sass": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/detective-sass/-/detective-sass-6.0.0.tgz", + "integrity": "sha512-h5GCfFMkPm4ZUUfGHVPKNHKT8jV7cSmgK+s4dgQH4/dIUNh9/huR1fjEQrblOQNDalSU7k7g+tiW9LJ+nVEUhg==", + "dev": true, + "dependencies": { + "gonzales-pe": "^4.3.0", + "node-source-walk": "^7.0.0" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/detective-scss": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/detective-scss/-/detective-scss-5.0.0.tgz", + "integrity": "sha512-Y64HyMqntdsCh1qAH7ci95dk0nnpA29g319w/5d/oYcHolcGUVJbIhOirOFjfN1KnMAXAFm5FIkZ4l2EKFGgxg==", + "dev": true, + "dependencies": { + "gonzales-pe": "^4.3.0", + "node-source-walk": "^7.0.0" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/detective-stylus": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/detective-stylus/-/detective-stylus-5.0.0.tgz", + "integrity": "sha512-KMHOsPY6aq3196WteVhkY5FF+6Nnc/r7q741E+Gq+Ax9mhE2iwj8Hlw8pl+749hPDRDBHZ2WlgOjP+twIG61vQ==", + "dev": true, + "engines": { + "node": ">=18" + } + }, + "node_modules/detective-typescript": { + "version": "13.0.0", + "resolved": "https://registry.npmjs.org/detective-typescript/-/detective-typescript-13.0.0.tgz", + "integrity": "sha512-tcMYfiFWoUejSbvSblw90NDt76/4mNftYCX0SMnVRYzSXv8Fvo06hi4JOPdNvVNxRtCAKg3MJ3cBJh+ygEMH+A==", + "dev": true, + "dependencies": { + "@typescript-eslint/typescript-estree": "^7.6.0", + "ast-module-types": "^6.0.0", + "node-source-walk": "^7.0.0" + }, + "engines": { + "node": "^14.14.0 || >=16.0.0" + }, + "peerDependencies": { + "typescript": "^5.4.4" + } + }, + "node_modules/detective-typescript/node_modules/@typescript-eslint/types": { + "version": "7.17.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-7.17.0.tgz", + "integrity": "sha512-a29Ir0EbyKTKHnZWbNsrc/gqfIBqYPwj3F2M+jWE/9bqfEHg0AMtXzkbUkOG6QgEScxh2+Pz9OXe11jHDnHR7A==", + "dev": true, + "engines": { + "node": "^18.18.0 || >=20.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/detective-typescript/node_modules/@typescript-eslint/typescript-estree": { + "version": "7.17.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-7.17.0.tgz", + "integrity": "sha512-72I3TGq93t2GoSBWI093wmKo0n6/b7O4j9o8U+f65TVD0FS6bI2180X5eGEr8MA8PhKMvYe9myZJquUT2JkCZw==", + "dev": true, + "dependencies": { + "@typescript-eslint/types": "7.17.0", + "@typescript-eslint/visitor-keys": "7.17.0", + "debug": "^4.3.4", + "globby": "^11.1.0", + "is-glob": "^4.0.3", + "minimatch": "^9.0.4", + "semver": "^7.6.0", + "ts-api-utils": "^1.3.0" + }, + "engines": { + "node": "^18.18.0 || >=20.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/detective-typescript/node_modules/@typescript-eslint/visitor-keys": { + "version": "7.17.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-7.17.0.tgz", + "integrity": "sha512-RVGC9UhPOCsfCdI9pU++K4nD7to+jTcMIbXTSOcrLqUEW6gF2pU1UUbYJKc9cvcRSK1UDeMJ7pdMxf4bhMpV/A==", + "dev": true, + "dependencies": { + "@typescript-eslint/types": "7.17.0", + "eslint-visitor-keys": "^3.4.3" + }, + "engines": { + "node": "^18.18.0 || >=20.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/detective-typescript/node_modules/brace-expansion": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", + "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", + "dev": true, + "dependencies": { + "balanced-match": "^1.0.0" + } + }, + "node_modules/detective-typescript/node_modules/minimatch": { + "version": "9.0.5", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.5.tgz", + "integrity": "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==", + "dev": true, + "dependencies": { + "brace-expansion": "^2.0.1" + }, + "engines": { + "node": ">=16 || 14 >=14.17" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/detective-vue2": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/detective-vue2/-/detective-vue2-2.0.3.tgz", + "integrity": "sha512-AgWdSfVnft8uPGnUkdvE1EDadEENDCzoSRMt2xZfpxsjqVO617zGWXbB8TGIxHaqHz/nHa6lOSgAB8/dt0yEug==", + "dev": true, + "dependencies": { + "@vue/compiler-sfc": "^3.4.27", + "detective-es6": "^5.0.0", + "detective-sass": "^6.0.0", + "detective-scss": "^5.0.0", + "detective-stylus": "^5.0.0", + "detective-typescript": "^13.0.0" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "typescript": "^5.4.4" + } + }, "node_modules/didyoumean": { "version": "1.2.2", "resolved": "https://registry.npmjs.org/didyoumean/-/didyoumean-1.2.2.tgz", @@ -3349,6 +3710,12 @@ "integrity": "sha512-qeXC3Zbykq44RCrBa4kr8v/dWzYJA8rAwpyh9Qd+NKWoJfjG5vvJqy9XOJ9H4P/lqulZBCgUWAYi+FeK5AuJ8g==", "dev": true }, + "node_modules/emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", + "dev": true + }, "node_modules/entities": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/entities/-/entities-3.0.1.tgz", @@ -3361,6 +3728,15 @@ "url": "https://github.com/fb55/entities?sponsor=1" } }, + "node_modules/env-paths": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/env-paths/-/env-paths-2.2.1.tgz", + "integrity": "sha512-+h1lkLKhZMTYjog1VEpJNG7NZJWcuc2DDk/qsqSTRRCOXiLjeQ1d1/udrUGhqMxUgAlwKNZ0cf2uqan5GLuS2A==", + "dev": true, + "engines": { + "node": ">=6" + } + }, "node_modules/error-ex": { "version": "1.3.2", "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz", @@ -3391,6 +3767,27 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/escodegen": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/escodegen/-/escodegen-2.1.0.tgz", + "integrity": "sha512-2NlIDTwUWJN0mRPQOdtQBzbUHvdGY2P1VXSyU83Q3xKxM7WHX2Ql8dKq782Q9TgQUNOLEzEYu9bzLNj1q88I5w==", + "dev": true, + "dependencies": { + "esprima": "^4.0.1", + "estraverse": "^5.2.0", + "esutils": "^2.0.2" + }, + "bin": { + "escodegen": "bin/escodegen.js", + "esgenerate": "bin/esgenerate.js" + }, + "engines": { + "node": ">=6.0" + }, + "optionalDependencies": { + "source-map": "~0.6.1" + } + }, "node_modules/eslint": { "version": "8.47.0", "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.47.0.tgz", @@ -3531,6 +3928,19 @@ "url": "https://opencollective.com/eslint" } }, + "node_modules/esprima": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", + "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", + "dev": true, + "bin": { + "esparse": "bin/esparse.js", + "esvalidate": "bin/esvalidate.js" + }, + "engines": { + "node": ">=4" + } + }, "node_modules/esquery": { "version": "1.5.0", "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.5.0.tgz", @@ -3564,6 +3974,12 @@ "node": ">=4.0" } }, + "node_modules/estree-walker": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-2.0.2.tgz", + "integrity": "sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==", + "dev": true + }, "node_modules/esutils": { "version": "2.0.3", "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", @@ -3609,9 +4025,9 @@ "dev": true }, "node_modules/fast-glob": { - "version": "3.3.1", - "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.1.tgz", - "integrity": "sha512-kNFPyjhh5cKjrUltxs+wFx+ZkbRaxxmZ+X0ZU31SOsxCEtP9VPgtq2teZw1DebupL5GmDaNQ6yKMMVcM41iqDg==", + "version": "3.3.2", + "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.2.tgz", + "integrity": "sha512-oX2ruAFQwf/Orj8m737Y5adxDQO0LAB7/S5MnxCdTNDd4p6BsyIVsv9JQsATbTSq8KHRpLwIHbVlUNatxd+1Ow==", "dev": true, "dependencies": { "@nodelib/fs.stat": "^2.0.2", @@ -3763,6 +4179,28 @@ "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==", "dev": true }, + "node_modules/get-amd-module-type": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/get-amd-module-type/-/get-amd-module-type-6.0.0.tgz", + "integrity": "sha512-hFM7oivtlgJ3d6XWD6G47l8Wyh/C6vFw5G24Kk1Tbq85yh5gcM8Fne5/lFhiuxB+RT6+SI7I1ThB9lG4FBh3jw==", + "dev": true, + "dependencies": { + "ast-module-types": "^6.0.0", + "node-source-walk": "^7.0.0" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/get-caller-file": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", + "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", + "dev": true, + "engines": { + "node": "6.* || 8.* || >= 10.*" + } + }, "node_modules/get-port": { "version": "4.2.0", "resolved": "https://registry.npmjs.org/get-port/-/get-port-4.2.0.tgz", @@ -3851,6 +4289,21 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/gonzales-pe": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/gonzales-pe/-/gonzales-pe-4.3.0.tgz", + "integrity": "sha512-otgSPpUmdWJ43VXyiNgEYE4luzHCL2pz4wQ0OnDluC6Eg4Ko3Vexy/SrSynglw/eR+OhkzmqFCZa/OFa/RgAOQ==", + "dev": true, + "dependencies": { + "minimist": "^1.2.5" + }, + "bin": { + "gonzales": "bin/gonzales.js" + }, + "engines": { + "node": ">=0.6.0" + } + }, "node_modules/graphemer": { "version": "1.4.0", "resolved": "https://registry.npmjs.org/graphemer/-/graphemer-1.4.0.tgz", @@ -3970,6 +4423,16 @@ "node": ">= 4" } }, + "node_modules/immer": { + "version": "10.1.1", + "resolved": "https://registry.npmjs.org/immer/-/immer-10.1.1.tgz", + "integrity": "sha512-s2MPrmjovJcoMaHtx6K11Ra7oD05NT97w1IC5zpMkT6Atjr7H8LjaDd81iIxUYpMKSRRNMJE703M1Fhr/TctHw==", + "dev": true, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/immer" + } + }, "node_modules/import-fresh": { "version": "3.3.0", "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz", @@ -4065,6 +4528,15 @@ "node": ">=0.10.0" } }, + "node_modules/is-fullwidth-code-point": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", + "dev": true, + "engines": { + "node": ">=8" + } + }, "node_modules/is-glob": { "version": "4.0.3", "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", @@ -4131,6 +4603,24 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/is-url": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/is-url/-/is-url-1.2.4.tgz", + "integrity": "sha512-ITvGim8FhRiYe4IQ5uHSkj7pVaPDrCTkNd3yq3cV7iZAcJdHTUMPMEHcqSOy9xZ9qFenQCvi+2wjH9a1nXqHww==", + "dev": true + }, + "node_modules/is-url-superb": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/is-url-superb/-/is-url-superb-4.0.0.tgz", + "integrity": "sha512-GI+WjezhPPcbM+tqE9LnmsY5qqjwHzTvjJ36wxYX5ujNXefSUJ/T17r5bqDV8yLhcgB59KTPNOc9O9cmHTPWsA==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/is-wsl": { "version": "2.2.0", "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-2.2.0.tgz", @@ -4510,6 +5000,12 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/lodash-es": { + "version": "4.17.21", + "resolved": "https://registry.npmjs.org/lodash-es/-/lodash-es-4.17.21.tgz", + "integrity": "sha512-mKnC+QJ9pWVzv+C4/U3rRsHapFfHvQFoFB92e52xeyGMcX6/OlIl78je1u8vePzYZSkkogMPJ2yjxxsb89cxyw==", + "dev": true + }, "node_modules/lodash.merge": { "version": "4.6.2", "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz", @@ -4528,16 +5024,13 @@ "loose-envify": "cli.js" } }, - "node_modules/lru-cache": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", - "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", + "node_modules/magic-string": { + "version": "0.30.10", + "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.10.tgz", + "integrity": "sha512-iIRwTIf0QKV3UAnYK4PU8uiEc4SRh5jX0mwpIwETPpHdhVM4f53RSwS/vXvN1JhGX+Cs7B8qIq3d6AH49O5fAQ==", "dev": true, "dependencies": { - "yallist": "^4.0.0" - }, - "engines": { - "node": ">=10" + "@jridgewell/sourcemap-codec": "^1.4.15" } }, "node_modules/mdn-data": { @@ -4600,6 +5093,31 @@ "node": "*" } }, + "node_modules/minimist": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz", + "integrity": "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==", + "dev": true, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/module-definition": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/module-definition/-/module-definition-6.0.0.tgz", + "integrity": "sha512-sEGP5nKEXU7fGSZUML/coJbrO+yQtxcppDAYWRE9ovWsTbFoUHB2qDUx564WUzDaBHXsD46JBbIK5WVTwCyu3w==", + "dev": true, + "dependencies": { + "ast-module-types": "^6.0.0", + "node-source-walk": "^7.0.0" + }, + "bin": { + "module-definition": "bin/cli.js" + }, + "engines": { + "node": ">=18" + } + }, "node_modules/ms": { "version": "2.1.2", "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", @@ -4661,9 +5179,9 @@ } }, "node_modules/nanoid": { - "version": "3.3.6", - "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.6.tgz", - "integrity": "sha512-BGcqMMJuToF7i1rt+2PWSNVnWIkGCU78jBG3RxO/bZlnZPK2Cmi2QaffxGO/2RvWi9sL+FAiRiXMgsyxQ1DIDA==", + "version": "3.3.7", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.7.tgz", + "integrity": "sha512-eSRppjcPIatRIMC1U6UngP8XFcz8MQWGQdt1MTBQ7NaAmvXDfvNxbvWV3x2y6CdEUciCSsDHDQZbhYaB8QEo2g==", "dev": true, "funding": [ { @@ -4707,6 +5225,18 @@ "integrity": "sha512-uYr7J37ae/ORWdZeQ1xxMJe3NtdmqMC/JZK+geofDrkLUApKRHPd18/TxtBOJ4A0/+uUIliorNrfYV6s1b02eQ==", "dev": true }, + "node_modules/node-source-walk": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/node-source-walk/-/node-source-walk-7.0.0.tgz", + "integrity": "sha512-1uiY543L+N7Og4yswvlm5NCKgPKDEXd9AUR9Jh3gen6oOeBsesr6LqhXom1er3eRzSUcVRWXzhv8tSNrIfGHKw==", + "dev": true, + "dependencies": { + "@babel/parser": "^7.24.4" + }, + "engines": { + "node": ">=18" + } + }, "node_modules/normalize-path": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", @@ -4992,9 +5522,9 @@ } }, "node_modules/picocolors": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz", - "integrity": "sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==", + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.1.tgz", + "integrity": "sha512-anP1Z8qwhkbmu7MFP5iTt+wQKXgwzf7zTyGlcdzabySa9vd0Xt392U0rVmz9poOaBj0uHJKyyo9/upk0HrEQew==", "dev": true }, "node_modules/picomatch": { @@ -5027,10 +5557,19 @@ "node": ">= 6" } }, + "node_modules/pluralize": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/pluralize/-/pluralize-8.0.0.tgz", + "integrity": "sha512-Nc3IT5yHzflTfbjgqWcCPpo7DaKy4FnpB0l/zCAW0Tc7jxAiuqSxHasntB3D7887LSrA93kDJ9IXovxJYxyLCA==", + "dev": true, + "engines": { + "node": ">=4" + } + }, "node_modules/postcss": { - "version": "8.4.28", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.28.tgz", - "integrity": "sha512-Z7V5j0cq8oEKyejIKfpD8b4eBy9cwW2JWPk0+fB1HOAMsfHbnAXLLS+PfVWlzMSLQaWttKDt607I0XHmpE67Vw==", + "version": "8.4.40", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.40.tgz", + "integrity": "sha512-YF2kKIUzAofPMpfH6hOi2cGnv/HrUlfucspc7pDyvv7kGdqXrfj8SCl/t8owkEgKEuu8ZcRjSOxFxVLqwChZ2Q==", "dev": true, "funding": [ { @@ -5047,9 +5586,9 @@ } ], "dependencies": { - "nanoid": "^3.3.6", - "picocolors": "^1.0.0", - "source-map-js": "^1.0.2" + "nanoid": "^3.3.7", + "picocolors": "^1.0.1", + "source-map-js": "^1.2.0" }, "engines": { "node": "^10 || ^12 || >=14" @@ -5158,6 +5697,23 @@ "integrity": "sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==", "dev": true }, + "node_modules/postcss-values-parser": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/postcss-values-parser/-/postcss-values-parser-6.0.2.tgz", + "integrity": "sha512-YLJpK0N1brcNJrs9WatuJFtHaV9q5aAOj+S4DI5S7jgHlRfm0PIbDCAFRYMQD5SHq7Fy6xsDhyutgS0QOAs0qw==", + "dev": true, + "dependencies": { + "color-name": "^1.1.4", + "is-url-superb": "^4.0.0", + "quote-unquote": "^1.0.0" + }, + "engines": { + "node": ">=10" + }, + "peerDependencies": { + "postcss": "^8.2.9" + } + }, "node_modules/posthtml": { "version": "0.16.6", "resolved": "https://registry.npmjs.org/posthtml/-/posthtml-0.16.6.tgz", @@ -5207,6 +5763,44 @@ "node": ">=12" } }, + "node_modules/precinct": { + "version": "12.1.2", + "resolved": "https://registry.npmjs.org/precinct/-/precinct-12.1.2.tgz", + "integrity": "sha512-x2qVN3oSOp3D05ihCd8XdkIPuEQsyte7PSxzLqiRgktu79S5Dr1I75/S+zAup8/0cwjoiJTQztE9h0/sWp9bJQ==", + "dev": true, + "dependencies": { + "@dependents/detective-less": "^5.0.0", + "commander": "^12.1.0", + "detective-amd": "^6.0.0", + "detective-cjs": "^6.0.0", + "detective-es6": "^5.0.0", + "detective-postcss": "^7.0.0", + "detective-sass": "^6.0.0", + "detective-scss": "^5.0.0", + "detective-stylus": "^5.0.0", + "detective-typescript": "^13.0.0", + "detective-vue2": "^2.0.3", + "module-definition": "^6.0.0", + "node-source-walk": "^7.0.0", + "postcss": "^8.4.40", + "typescript": "^5.5.4" + }, + "bin": { + "precinct": "bin/cli.js" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/precinct/node_modules/commander": { + "version": "12.1.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-12.1.0.tgz", + "integrity": "sha512-Vw8qHK3bZM9y/P10u3Vib8o/DdkvA2OtPtZvD871QKjy74Wj1WSKFILMPRPSdUSx5RFK1arlJzEtA4PkFgnbuA==", + "dev": true, + "engines": { + "node": ">=18" + } + }, "node_modules/prelude-ls": { "version": "1.2.1", "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz", @@ -5243,6 +5837,12 @@ "node": ">=6.0.0" } }, + "node_modules/prexit": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/prexit/-/prexit-2.2.0.tgz", + "integrity": "sha512-MrkWg5/0XFTM0txQtPFZlhk3qhMtyd+bP1vXJKQqOOYcdQ8/Wl5+G0Utxv69TLfH0PMm/ushn0YTYQ2SH2WzJg==", + "dev": true + }, "node_modules/process": { "version": "0.11.10", "resolved": "https://registry.npmjs.org/process/-/process-0.11.10.tgz", @@ -5281,6 +5881,12 @@ } ] }, + "node_modules/quote-unquote": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/quote-unquote/-/quote-unquote-1.0.0.tgz", + "integrity": "sha512-twwRO/ilhlG/FIgYeKGFqyHhoEhqgnKVkcmqMKi2r524gz3ZbDTcyFt38E9xjJI2vT+KbRNHVbnJ/e0I25Azwg==", + "dev": true + }, "node_modules/react": { "version": "18.2.0", "resolved": "https://registry.npmjs.org/react/-/react-18.2.0.tgz", @@ -5334,6 +5940,15 @@ "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.14.0.tgz", "integrity": "sha512-srw17NI0TUWHuGa5CFGGmhfNIeja30WMBfbslPNhf6JrqQlLN5gcrvig1oqPxiVaXb0oW0XRKtH6Nngs5lKCIA==" }, + "node_modules/require-directory": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", + "integrity": "sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/resolve": { "version": "1.22.4", "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.4.tgz", @@ -5533,13 +6148,10 @@ ] }, "node_modules/semver": { - "version": "7.5.4", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz", - "integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==", + "version": "7.6.2", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.2.tgz", + "integrity": "sha512-FNAIBWCx9qcRhoHcgcJ0gvU7SN1lYU2ZXuSfl04bSC5OpvDHFyJCjdNHomPXxjQlCBU67YW64PzY7/VIEH7F2w==", "dev": true, - "dependencies": { - "lru-cache": "^6.0.0" - }, "bin": { "semver": "bin/semver.js" }, @@ -5593,9 +6205,9 @@ } }, "node_modules/source-map-js": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.0.2.tgz", - "integrity": "sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw==", + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.0.tgz", + "integrity": "sha512-itJW8lvSA0TXEphiRoawsCksnlf8SyvmFzIhltqAHluXd88pkCd+cXJVHTDwdCr0IzwptSm035IHQktUu1QUMg==", "dev": true, "engines": { "node": ">=0.10.0" @@ -5620,6 +6232,141 @@ "deprecated": "Modern JS already guarantees Array#sort() is a stable sort, so this library is deprecated. See the compatibility table on MDN: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/sort#browser_compatibility", "dev": true }, + "node_modules/steiger": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/steiger/-/steiger-0.4.0.tgz", + "integrity": "sha512-UCFYnZB386+1RSnbu1JsL/9ZTlHH7r8moz1RBg4I/wDULS2Yh8h/ypC6Uq+u2WJIwy7BjlO26JhDnmihXFm4nQ==", + "dev": true, + "dependencies": { + "@feature-sliced/filesystem": "^2.2.5", + "@feature-sliced/steiger-plugin": "0.4.0", + "chokidar": "^3.6.0", + "cosmiconfig": "^9.0.0", + "effector": "^23.2.1", + "globby": "^14.0.1", + "immer": "^10.1.1", + "patronum": "^2.2.0", + "prexit": "^2.2.0", + "yargs": "^17.7.2", + "zod": "^3.23.6", + "zod-validation-error": "^3.3.0" + }, + "bin": { + "steiger": "dist/cli.mjs" + } + }, + "node_modules/steiger/node_modules/cosmiconfig": { + "version": "9.0.0", + "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-9.0.0.tgz", + "integrity": "sha512-itvL5h8RETACmOTFc4UfIyB2RfEHi71Ax6E/PivVxq9NseKbOWpeyHEOIbmAw1rs8Ak0VursQNww7lf7YtUwzg==", + "dev": true, + "dependencies": { + "env-paths": "^2.2.1", + "import-fresh": "^3.3.0", + "js-yaml": "^4.1.0", + "parse-json": "^5.2.0" + }, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/d-fischer" + }, + "peerDependencies": { + "typescript": ">=4.9.5" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/steiger/node_modules/effector": { + "version": "23.2.2", + "resolved": "https://registry.npmjs.org/effector/-/effector-23.2.2.tgz", + "integrity": "sha512-gzwATi9pgZQx0TNhM2LESmoUpEO+vhibLZPCvVzi7spMvKFwKnfJV2PFj4xqNFFSC35TXaznx30ne62dCQ6ZRQ==", + "dev": true, + "funding": [ + { + "type": "patreon", + "url": "https://www.patreon.com/zero_bias" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/effector" + } + ], + "engines": { + "node": ">=11.0.0" + } + }, + "node_modules/steiger/node_modules/globby": { + "version": "14.0.2", + "resolved": "https://registry.npmjs.org/globby/-/globby-14.0.2.tgz", + "integrity": "sha512-s3Fq41ZVh7vbbe2PN3nrW7yC7U7MFVc5c98/iTl9c2GawNMKx/J648KQRW6WKkuU8GIbbh2IXfIRQjOZnXcTnw==", + "dev": true, + "dependencies": { + "@sindresorhus/merge-streams": "^2.1.0", + "fast-glob": "^3.3.2", + "ignore": "^5.2.4", + "path-type": "^5.0.0", + "slash": "^5.1.0", + "unicorn-magic": "^0.1.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/steiger/node_modules/path-type": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/path-type/-/path-type-5.0.0.tgz", + "integrity": "sha512-5HviZNaZcfqP95rwpv+1HDgUamezbqdSYTyzjTvwtJSnIH+3vnbmWsItli8OFEndS984VT55M3jduxZbX351gg==", + "dev": true, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/steiger/node_modules/patronum": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/patronum/-/patronum-2.2.0.tgz", + "integrity": "sha512-Idsb5swd+2UI1NuBlHJuVA4WlaUeEluZJxGAZ9obCViuEf4pP68bij3f1sZCM/vqqWPsbHclYweDNt/sWu0O1g==", + "dev": true, + "peerDependencies": { + "effector": "^23" + } + }, + "node_modules/steiger/node_modules/slash": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/slash/-/slash-5.1.0.tgz", + "integrity": "sha512-ZA6oR3T/pEyuqwMgAKT0/hAv8oAXckzbkmR0UkUosQ+Mc4RxGoJkRmwHgHufaenlyAgE1Mxgpdcrf75y6XcnDg==", + "dev": true, + "engines": { + "node": ">=14.16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "dev": true, + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, "node_modules/strip-ansi": { "version": "6.0.1", "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", @@ -5892,12 +6639,12 @@ } }, "node_modules/ts-api-utils": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/ts-api-utils/-/ts-api-utils-1.0.2.tgz", - "integrity": "sha512-Cbu4nIqnEdd+THNEsBdkolnOXhg0I8XteoHaEKgvsxpsbWda4IsUut2c187HxywQCvveojow0Dgw/amxtSKVkQ==", + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/ts-api-utils/-/ts-api-utils-1.3.0.tgz", + "integrity": "sha512-UQMIo7pb8WRomKR1/+MFVLTroIvDVtMX3K6OUir8ynLyzB8Jeriont2bTAtmNPa1ekAgN7YPDyf6V+ygrdU+eQ==", "dev": true, "engines": { - "node": ">=16.13.0" + "node": ">=16" }, "peerDependencies": { "typescript": ">=4.2.0" @@ -5909,6 +6656,26 @@ "integrity": "sha512-Y/arvbn+rrz3JCKl9C4kVNfTfSm2/mEp5FSz5EsZSANGPSlQrpRI5M4PKF+mJnE52jOO90PnPSc3Ur3bTQw0gA==", "dev": true }, + "node_modules/tsconfck": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/tsconfck/-/tsconfck-3.1.1.tgz", + "integrity": "sha512-00eoI6WY57SvZEVjm13stEVE90VkEdJAFGgpFLTsZbJyW/LwFQ7uQxJHWpZ2hzSWgCPKc9AnBnNP+0X7o3hAmQ==", + "dev": true, + "bin": { + "tsconfck": "bin/tsconfck.js" + }, + "engines": { + "node": "^18 || >=20" + }, + "peerDependencies": { + "typescript": "^5.0.0" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, "node_modules/tslib": { "version": "2.6.2", "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.2.tgz", @@ -5940,9 +6707,9 @@ } }, "node_modules/typescript": { - "version": "5.1.6", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.1.6.tgz", - "integrity": "sha512-zaWCozRZ6DLEWAWFrVDz1H6FVXzUSfTy5FUMWsQlU8Ym5JP9eO4xkTIROFCQvhQf61z6O/G6ugw3SgAnvvm+HA==", + "version": "5.5.4", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.5.4.tgz", + "integrity": "sha512-Mtq29sKDAEYP7aljRgtPOpTvOfbwRWlS6dPRzwjdE+C0R4brX/GUyhHSecbHMFLNBLcJIPt9nl9yG5TZ1weH+Q==", "dev": true, "bin": { "tsc": "bin/tsc", @@ -5952,6 +6719,18 @@ "node": ">=14.17" } }, + "node_modules/unicorn-magic": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/unicorn-magic/-/unicorn-magic-0.1.0.tgz", + "integrity": "sha512-lRfVq8fE8gz6QMBuDM6a+LO3IAzTi05H6gCVaUpir2E1Rwpo4ZUog45KpNXKC/Mn3Yb9UDuHumeFTo9iV/D9FQ==", + "dev": true, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/untildify": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/untildify/-/untildify-4.0.0.tgz", @@ -6045,6 +6824,23 @@ "node": ">= 8" } }, + "node_modules/wrap-ansi": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", + "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", + "dev": true, + "dependencies": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + } + }, "node_modules/wrappy": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", @@ -6057,11 +6853,14 @@ "integrity": "sha512-/eyHVRJQCirEkSZ1agRSCwriMhwlyUcFkXD5TPVSLP+IPzjsqMVzZwdoczLp1SoQU0R3dxz1RpIK+4YNQbCVOA==", "dev": true }, - "node_modules/yallist": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", - "dev": true + "node_modules/y18n": { + "version": "5.0.8", + "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", + "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==", + "dev": true, + "engines": { + "node": ">=10" + } }, "node_modules/yaml": { "version": "2.3.1", @@ -6072,6 +6871,33 @@ "node": ">= 14" } }, + "node_modules/yargs": { + "version": "17.7.2", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.7.2.tgz", + "integrity": "sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==", + "dev": true, + "dependencies": { + "cliui": "^8.0.1", + "escalade": "^3.1.1", + "get-caller-file": "^2.0.5", + "require-directory": "^2.1.1", + "string-width": "^4.2.3", + "y18n": "^5.0.5", + "yargs-parser": "^21.1.1" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/yargs-parser": { + "version": "21.1.1", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-21.1.1.tgz", + "integrity": "sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==", + "dev": true, + "engines": { + "node": ">=12" + } + }, "node_modules/yocto-queue": { "version": "0.1.0", "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", @@ -6083,6 +6909,27 @@ "funding": { "url": "https://github.com/sponsors/sindresorhus" } + }, + "node_modules/zod": { + "version": "3.23.8", + "resolved": "https://registry.npmjs.org/zod/-/zod-3.23.8.tgz", + "integrity": "sha512-XBx9AXhXktjUqnepgTiE5flcKIYWi/rme0Eaj+5Y0lftuGBq+jyRu/md4WnuxqgP1ubdpNCsYEYPxrzVHD8d6g==", + "dev": true, + "funding": { + "url": "https://github.com/sponsors/colinhacks" + } + }, + "node_modules/zod-validation-error": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/zod-validation-error/-/zod-validation-error-3.3.0.tgz", + "integrity": "sha512-Syib9oumw1NTqEv4LT0e6U83Td9aVRk9iTXPUQr1otyV1PuXQKOvOwhMNqZIq5hluzHP2pMgnOmHEo7kPdI2mw==", + "dev": true, + "engines": { + "node": ">=18.0.0" + }, + "peerDependencies": { + "zod": "^3.18.0" + } } } } diff --git a/web/package.json b/web/package.json index b6b576c..91a27f6 100644 --- a/web/package.json +++ b/web/package.json @@ -7,6 +7,7 @@ "watch": "npx parcel ./src/index.html", "lint": "eslint --ignore-path .gitignore .", "lint:fix": "npm run lint -- --fix", + "steiger": "npx steiger ./src", "tsc": "tsc --noEmit" }, "devDependencies": { @@ -20,6 +21,7 @@ "postcss": "^8.4.28", "prettier": "^3.0.2", "process": "^0.11.10", + "steiger": "^0.4.0", "tailwind-scrollbar": "^3.1.0", "tailwindcss": "^3.3.3", "typescript": "^5.1.6" diff --git a/web/src/app/chains/auth.ts b/web/src/app/chains/auth.ts index c19a871..94629e0 100644 --- a/web/src/app/chains/auth.ts +++ b/web/src/app/chains/auth.ts @@ -1,5 +1,11 @@ import { forbiddenRoute, homeRoute, loginRoute, notFoundRoute, registerAdminRoute } from "@/shared/routing"; -import { $isAuthorized, createInitialAdmin, notAllowedTriggered, notFoundTriggered, unauthorizedTriggered } from "@/shared/auth"; +import { + $isAuthorized, + createInitialAdmin, + notAllowedTriggered, + notFoundTriggered, + unauthorizedTriggered, +} from "@/shared/session"; import { redirect } from "atomic-router"; import { sample } from "effector"; diff --git a/web/src/app/index.ts b/web/src/app/index.ts index 07983be..ad0c462 100644 --- a/web/src/app/index.ts +++ b/web/src/app/index.ts @@ -1,6 +1,6 @@ import "./chains"; import { userModel } from "@/entities/user"; -import { notFoundTriggered, obtainSession } from "@/shared/auth"; +import { notFoundTriggered, obtainSession } from "@/shared/session"; import { Link, history, router } from "@/shared/routing"; import { sidebarClosed } from "@/shared/ui"; import { linkRouter, onAppMount } from "atomic-router-forest"; diff --git a/web/src/entities/api-token/model.ts b/web/src/entities/api-token/model.ts index c5f0624..c6c20b1 100644 --- a/web/src/entities/api-token/model.ts +++ b/web/src/entities/api-token/model.ts @@ -1,4 +1,4 @@ -import { ApiToken, getApiToken, getApiTokens } from "@/shared/api/api-tokens"; +import { ApiToken, getApiToken, getApiTokens } from "@/shared/api"; import { createEffect, createStore } from "effector"; const getApiTokensFx = createEffect(() => { diff --git a/web/src/entities/log/model.ts b/web/src/entities/log/model.ts index e84c96a..388b3b6 100644 --- a/web/src/entities/log/model.ts +++ b/web/src/entities/log/model.ts @@ -1,7 +1,7 @@ import { Log, getLogs } from "@/shared/api"; -import { Level, LogsGroup, getLogGroup } from "@/shared/api/logs"; +import { Level, LogsGroup, getLogGroup } from "@/shared/api"; import { DATEFORMAT_OPTIONS, objectToQueryString, queryStringToObject } from "@/shared/lib"; -import { $preferredLanguage } from "@/shared/lib/i18n/locale"; +import { $preferredLanguage } from "@/shared/lib"; import { combine, createEffect, createEvent, createStore, sample } from "effector"; const reset = createEffect(); diff --git a/web/src/entities/user/model.ts b/web/src/entities/user/model.ts index dcc13ea..1b0c305 100644 --- a/web/src/entities/user/model.ts +++ b/web/src/entities/user/model.ts @@ -1,6 +1,6 @@ import { User, getUsers, getUser } from "@/shared/api"; -import { setCurrentAccount } from "@/shared/auth"; -import { setLanguage } from "@/shared/lib/i18n"; +import { setCurrentAccount } from "@/shared/session"; +import { setLanguage } from "@/shared/lib"; import { createEffect, createEvent, createStore, sample } from "effector"; const LOCALE_KEY = "locale"; diff --git a/web/src/features/action-create/ui.ts b/web/src/features/action-create/ui.ts index 802d96d..d41f84b 100644 --- a/web/src/features/action-create/ui.ts +++ b/web/src/features/action-create/ui.ts @@ -3,7 +3,7 @@ import { h, list, remap, spec } from "forest"; import { $creationError, events, actionForm } from "./model"; import { combine, createEvent, createStore, sample } from "effector"; import { intersection, trigger } from "@/shared/lib"; -import { i18n } from "@/shared/lib/i18n"; +import { i18n } from "@/shared/lib"; import { schemaModel } from "@/entities/schema"; import { ActionToCreate, Condition } from "@/shared/api"; diff --git a/web/src/features/action-edit/model.ts b/web/src/features/action-edit/model.ts index 4e82721..cac7e89 100644 --- a/web/src/features/action-edit/model.ts +++ b/web/src/features/action-edit/model.ts @@ -1,10 +1,9 @@ import { actionsRoute } from "@/shared/routing"; import { ActionToCreate, ActionToUpdate, Condition, deleteAction, editAction } from "@/shared/api"; -import { rules } from "@/shared/lib"; +import { rules, i18n } from "@/shared/lib"; import { attach, createEffect, createEvent, createStore, sample } from "effector"; import { createForm } from "effector-forms"; import { actionModel } from "@/entities/action"; -import { i18n } from "@/shared/lib/i18n"; import { redirect } from "atomic-router"; const addCondition = createEvent(); diff --git a/web/src/features/action-edit/ui.ts b/web/src/features/action-edit/ui.ts index b83fe57..6bf4f6d 100644 --- a/web/src/features/action-edit/ui.ts +++ b/web/src/features/action-edit/ui.ts @@ -2,8 +2,7 @@ import { Button, ErrorHint, Input, Label, Multiselect, PlusIcon, Select, Text, T import { h, list, remap, spec } from "forest"; import { $editError, events, actionForm, deleteActionClicked } from "./model"; import { combine, createEvent, createStore, sample } from "effector"; -import { intersection, trigger } from "@/shared/lib"; -import { i18n } from "@/shared/lib/i18n"; +import { intersection, trigger, i18n } from "@/shared/lib"; import { ActionToCreate, Condition } from "@/shared/api"; import { schemaModel } from "@/entities/schema"; diff --git a/web/src/features/api-token-create/ui.ts b/web/src/features/api-token-create/ui.ts index 7e9534d..5bfbe99 100644 --- a/web/src/features/api-token-create/ui.ts +++ b/web/src/features/api-token-create/ui.ts @@ -2,7 +2,7 @@ import { Button, ErrorHint, Input } from "@/shared/ui"; import { h, spec } from "forest"; import { $creationError, $freshToken, apiTokenForm } from "./model"; import { createEvent } from "effector"; -import { i18n } from "@/shared/lib/i18n"; +import { i18n } from "@/shared/lib"; export const NewApiTokenForm = () => { h("form", () => { diff --git a/web/src/features/api-token-edit/model.ts b/web/src/features/api-token-edit/model.ts index d9f424c..54de154 100644 --- a/web/src/features/api-token-edit/model.ts +++ b/web/src/features/api-token-edit/model.ts @@ -1,8 +1,7 @@ import { apiTokenModel } from "@/entities/api-token"; import { apiTokensRoute } from "@/shared/routing"; import { ApiTokenToUpdate, deleteApiToken, editApiToken } from "@/shared/api"; -import { rules } from "@/shared/lib"; -import { i18n } from "@/shared/lib/i18n"; +import { rules, i18n } from "@/shared/lib"; import { redirect } from "atomic-router"; import { attach, createEffect, createEvent, createStore, sample } from "effector"; import { createForm } from "effector-forms"; diff --git a/web/src/features/api-token-edit/ui.ts b/web/src/features/api-token-edit/ui.ts index 80792be..be90b5f 100644 --- a/web/src/features/api-token-edit/ui.ts +++ b/web/src/features/api-token-edit/ui.ts @@ -1,7 +1,7 @@ import { Button, ErrorHint, Input } from "@/shared/ui"; import { h, spec } from "forest"; import { $editError, apiTokenForm, deleteApiTokenClicked } from "./model"; -import { i18n } from "@/shared/lib/i18n"; +import { i18n } from "@/shared/lib"; export const EditApiTokenForm = () => { h("form", () => { diff --git a/web/src/features/auth/model.ts b/web/src/features/auth/model.ts index fd05cff..5165f29 100644 --- a/web/src/features/auth/model.ts +++ b/web/src/features/auth/model.ts @@ -1,7 +1,7 @@ import { userModel } from "@/entities/user"; import { homeRoute } from "@/shared/routing"; import { postSession } from "@/shared/api"; -import { getSessionFx, tokenReceived } from "@/shared/auth"; +import { getSessionFx, tokenReceived } from "@/shared/session"; import { rules } from "@/shared/lib"; import { createEffect, createEvent, createStore, sample } from "effector"; import { createForm } from "effector-forms"; diff --git a/web/src/features/auth/ui.ts b/web/src/features/auth/ui.ts index d2f305d..1e3637c 100644 --- a/web/src/features/auth/ui.ts +++ b/web/src/features/auth/ui.ts @@ -1,7 +1,7 @@ import { Button, ErrorHint, Input } from "@/shared/ui"; import { $authError, authForm } from "./model"; import { h, spec } from "forest"; -import { i18n } from "@/shared/lib/i18n"; +import { i18n } from "@/shared/lib"; export const Auth = () => { h("div", () => { diff --git a/web/src/features/filter-date-logs/ui.ts b/web/src/features/filter-date-logs/ui.ts index 081101e..8e93f0e 100644 --- a/web/src/features/filter-date-logs/ui.ts +++ b/web/src/features/filter-date-logs/ui.ts @@ -1,4 +1,4 @@ -import { i18n } from "@/shared/lib/i18n"; +import { i18n } from "@/shared/lib"; import { Button, ButtonVariant, ClockIcon, DownIcon, Input } from "@/shared/ui"; import { Event, Store, createEvent, createStore, sample } from "effector"; import { DOMElement, h, node, spec } from "forest"; diff --git a/web/src/features/filter-level-logs/ui.ts b/web/src/features/filter-level-logs/ui.ts index 4943923..a4de44f 100644 --- a/web/src/features/filter-level-logs/ui.ts +++ b/web/src/features/filter-level-logs/ui.ts @@ -1,7 +1,6 @@ import { Level } from "@/shared/api"; -import { i18n } from "@/shared/lib/i18n"; -import { Button, ButtonVariant, DownIcon } from "@/shared/ui"; -import { FireIcon } from "@/shared/ui/icons"; +import { i18n } from "@/shared/lib"; +import { Button, ButtonVariant, DownIcon, FireIcon } from "@/shared/ui"; import { Event, Store, combine, createEvent, createStore, sample } from "effector"; import { DOMElement, h, list, node, spec } from "forest"; diff --git a/web/src/features/filter-logs/ui.ts b/web/src/features/filter-logs/ui.ts index b3363c2..ca08cfc 100644 --- a/web/src/features/filter-logs/ui.ts +++ b/web/src/features/filter-logs/ui.ts @@ -1,8 +1,7 @@ -import { Button, ButtonVariant, DownIcon, Dropdown } from "@/shared/ui"; +import { Button, ButtonVariant, DownIcon, Dropdown, FilterIcon } from "@/shared/ui"; import { Event, Store, createEvent, createStore, sample } from "effector"; import { DOMElement, h, node, spec } from "forest"; -import { FilterIcon } from "@/shared/ui"; -import { i18n } from "@/shared/lib/i18n"; +import { i18n } from "@/shared/lib"; export type FilterItem = { name: string; diff --git a/web/src/features/index.ts b/web/src/features/index.ts deleted file mode 100644 index a9fcc1e..0000000 --- a/web/src/features/index.ts +++ /dev/null @@ -1,14 +0,0 @@ -export { Filter, type FilterItem, type KindItem } from "./filter-logs"; -export { FilterDate } from "./filter-date-logs"; -export { Auth, logInFx } from "./auth"; -export { RegisterAdmin } from "./register-admin"; -export { NewMemberForm } from "./user-create"; -export { EditMemberForm } from "./user-edit"; -export { NewApiTokenForm } from "./api-token-create"; -export { EditApiTokenForm } from "./api-token-edit"; -export { NewTagForm } from "./tag-create"; -export { EditTagForm } from "./tag-edit"; -export { FilterLevel } from "./filter-level-logs"; -export { NewActionForm } from "./action-create"; -export { EditActionForm } from "./action-edit"; -export { LogGroupAction } from "./log-group-action"; diff --git a/web/src/features/register-admin/ui.ts b/web/src/features/register-admin/ui.ts index e58ca80..03f5e67 100644 --- a/web/src/features/register-admin/ui.ts +++ b/web/src/features/register-admin/ui.ts @@ -1,7 +1,7 @@ import { Button, ErrorHint, Input } from "@/shared/ui"; import { $registrationError, registerAdminForm } from "./model"; import { h, spec } from "forest"; -import { i18n } from "@/shared/lib/i18n"; +import { i18n } from "@/shared/lib"; export const RegisterAdmin = () => { h("div", () => { diff --git a/web/src/features/schema-create/ui.ts b/web/src/features/schema-create/ui.ts index 231b50c..a18e639 100644 --- a/web/src/features/schema-create/ui.ts +++ b/web/src/features/schema-create/ui.ts @@ -2,9 +2,8 @@ import { Button, ErrorHint, Input, Label, PlusIcon, Select, TrashIcon } from "@/ import { h, list, spec } from "forest"; import { $creationError, events, schemaForm } from "./model"; import { createEvent, sample } from "effector"; -import { trigger } from "@/shared/lib"; +import { trigger, i18n } from "@/shared/lib"; import { tagModel } from "@/entities/tag"; -import { i18n } from "@/shared/lib/i18n"; export const NewSchemaForm = () => { h("form", () => { diff --git a/web/src/features/schema-edit/model.ts b/web/src/features/schema-edit/model.ts index ad415a2..95fb5ed 100644 --- a/web/src/features/schema-edit/model.ts +++ b/web/src/features/schema-edit/model.ts @@ -2,8 +2,7 @@ import { schemaModel } from "@/entities/schema"; import { tagModel } from "@/entities/tag"; import { homeRoute } from "@/shared/routing"; import { SchemaField, SchemaKind, SchemaToUpdate, deleteSchema, editSchema } from "@/shared/api"; -import { rules } from "@/shared/lib"; -import { i18n } from "@/shared/lib/i18n"; +import { rules, i18n } from "@/shared/lib"; import { redirect } from "atomic-router"; import { attach, createEffect, createEvent, createStore, sample } from "effector"; import { createForm } from "effector-forms"; diff --git a/web/src/features/schema-edit/ui.ts b/web/src/features/schema-edit/ui.ts index 3c817e0..269825b 100644 --- a/web/src/features/schema-edit/ui.ts +++ b/web/src/features/schema-edit/ui.ts @@ -1,10 +1,9 @@ import { Button, ErrorHint, Input, Label, PlusIcon, Select, TrashIcon } from "@/shared/ui"; import { h, list, spec } from "forest"; import { $editError, deleteSchemaClicked, events, schemaForm } from "./model"; -import { trigger } from "@/shared/lib"; +import { trigger, i18n } from "@/shared/lib"; import { createEvent, sample } from "effector"; import { tagModel } from "@/entities/tag"; -import { i18n } from "@/shared/lib/i18n"; export const EditSchemaForm = () => { h("form", () => { diff --git a/web/src/features/tag-create/ui.ts b/web/src/features/tag-create/ui.ts index 27960cc..45077df 100644 --- a/web/src/features/tag-create/ui.ts +++ b/web/src/features/tag-create/ui.ts @@ -1,7 +1,7 @@ import { Button, ErrorHint, Input } from "@/shared/ui"; import { h } from "forest"; import { $creationError, tagForm } from "./model"; -import { i18n } from "@/shared/lib/i18n"; +import { i18n } from "@/shared/lib"; export const NewTagForm = () => { h("form", () => { diff --git a/web/src/features/tag-edit/model.ts b/web/src/features/tag-edit/model.ts index acf7d69..d6c54f1 100644 --- a/web/src/features/tag-edit/model.ts +++ b/web/src/features/tag-edit/model.ts @@ -1,8 +1,7 @@ import { tagModel } from "@/entities/tag"; import { tagsRoute } from "@/shared/routing"; import { TagToUpdate, deleteTag, editTag } from "@/shared/api"; -import { rules } from "@/shared/lib"; -import { i18n } from "@/shared/lib/i18n"; +import { rules, i18n } from "@/shared/lib"; import { redirect } from "atomic-router"; import { attach, createEffect, createEvent, createStore, sample } from "effector"; import { createForm } from "effector-forms"; diff --git a/web/src/features/tag-edit/ui.ts b/web/src/features/tag-edit/ui.ts index bb77929..4c7f665 100644 --- a/web/src/features/tag-edit/ui.ts +++ b/web/src/features/tag-edit/ui.ts @@ -1,7 +1,7 @@ import { Button, ErrorHint, Input } from "@/shared/ui"; import { h, spec } from "forest"; import { $editError, tagForm, deleteTagClicked } from "./model"; -import { i18n } from "@/shared/lib/i18n"; +import { i18n } from "@/shared/lib"; export const EditTagForm = () => { h("form", () => { diff --git a/web/src/features/user-create/ui.ts b/web/src/features/user-create/ui.ts index ec158a3..f5f3bb3 100644 --- a/web/src/features/user-create/ui.ts +++ b/web/src/features/user-create/ui.ts @@ -2,9 +2,9 @@ import { Button, ErrorHint, Input, Multiselect, Select } from "@/shared/ui"; import { h, spec } from "forest"; import { $creationError, events, memberForm } from "./model"; import { createStore } from "effector"; -import { UserRole } from "@/shared/api/users"; +import { UserRole } from "@/shared/api"; import { tagModel } from "@/entities/tag"; -import { i18n } from "@/shared/lib/i18n"; +import { i18n } from "@/shared/lib"; export const NewMemberForm = () => { h("form", () => { diff --git a/web/src/features/user-edit/model.ts b/web/src/features/user-edit/model.ts index 09cde4c..7421212 100644 --- a/web/src/features/user-edit/model.ts +++ b/web/src/features/user-edit/model.ts @@ -1,9 +1,8 @@ import { userModel } from "@/entities/user"; import { membersRoute } from "@/shared/routing"; import { UserToUpdate, editUser } from "@/shared/api"; -import { deleteUser } from "@/shared/api/users"; -import { rules } from "@/shared/lib"; -import { i18n } from "@/shared/lib/i18n"; +import { deleteUser } from "@/shared/api"; +import { rules, i18n } from "@/shared/lib"; import { redirect } from "atomic-router"; import { attach, createEffect, createEvent, createStore, sample } from "effector"; import { createForm } from "effector-forms"; diff --git a/web/src/features/user-edit/ui.ts b/web/src/features/user-edit/ui.ts index 4e3493d..f8b14e6 100644 --- a/web/src/features/user-edit/ui.ts +++ b/web/src/features/user-edit/ui.ts @@ -2,9 +2,9 @@ import { Button, ErrorHint, Input, Multiselect, Select } from "@/shared/ui"; import { h, spec } from "forest"; import { $editError, deleteUserClicked, events, memberForm } from "./model"; import { createStore } from "effector"; -import { UserRole } from "@/shared/api/users"; +import { UserRole } from "@/shared/api"; import { tagModel } from "@/entities/tag"; -import { i18n } from "@/shared/lib/i18n"; +import { i18n } from "@/shared/lib"; export const EditMemberForm = () => { h("form", () => { diff --git a/web/src/pages/action-create/index.ts b/web/src/pages/action-create/index.ts index 1587770..1554a47 100644 --- a/web/src/pages/action-create/index.ts +++ b/web/src/pages/action-create/index.ts @@ -3,7 +3,7 @@ import { h, spec } from "forest"; import { actionCreateRoute } from "@/shared/routing"; import { Header } from "@/shared/ui"; -import { NewActionForm } from "@/features"; +import { NewActionForm } from "@/features/action-create"; import { i18n } from "@/shared/lib/i18n"; export const ActionCreatePage = () => { diff --git a/web/src/pages/action-edit/index.ts b/web/src/pages/action-edit/index.ts index 3a49754..c52f037 100644 --- a/web/src/pages/action-edit/index.ts +++ b/web/src/pages/action-edit/index.ts @@ -3,7 +3,7 @@ import { h, spec } from "forest"; import { actionEditRoute } from "@/shared/routing"; import { Header } from "@/shared/ui"; -import { EditActionForm } from "@/features"; +import { EditActionForm } from "@/features/action-edit"; import { i18n } from "@/shared/lib/i18n"; export const ActionEditPage = () => { diff --git a/web/src/pages/actions-list/index.ts b/web/src/pages/actions-list/index.ts index 544979b..9aa443b 100644 --- a/web/src/pages/actions-list/index.ts +++ b/web/src/pages/actions-list/index.ts @@ -2,7 +2,7 @@ import { withRoute } from "atomic-router-forest"; import { h, spec } from "forest"; import { actionCreateRoute, actionsRoute } from "@/shared/routing"; -import { HeaderWithCreation } from "@/widgets"; +import { HeaderWithCreation } from "@/widgets/header-with-creation"; import { i18n } from "@/shared/lib/i18n"; import { ActionsList } from "@/widgets/actions-list"; diff --git a/web/src/pages/api-token-create/index.ts b/web/src/pages/api-token-create/index.ts index 9cd3870..9601e6b 100644 --- a/web/src/pages/api-token-create/index.ts +++ b/web/src/pages/api-token-create/index.ts @@ -3,7 +3,7 @@ import { h, spec } from "forest"; import { apiTokenCreateRoute } from "@/shared/routing"; import { Header } from "@/shared/ui"; -import { NewApiTokenForm } from "@/features"; +import { NewApiTokenForm } from "@/features/api-token-create"; import { i18n } from "@/shared/lib/i18n"; export const ApiTokenCreatePage = () => { diff --git a/web/src/pages/api-token-edit/index.ts b/web/src/pages/api-token-edit/index.ts index 26e804c..222171b 100644 --- a/web/src/pages/api-token-edit/index.ts +++ b/web/src/pages/api-token-edit/index.ts @@ -3,7 +3,7 @@ import { h, spec } from "forest"; import { apiTokenEditRoute } from "@/shared/routing"; import { Header } from "@/shared/ui"; -import { EditApiTokenForm } from "@/features"; +import { EditApiTokenForm } from "@/features/api-token-edit"; import { i18n } from "@/shared/lib/i18n"; export const ApiTokenEditPage = () => { diff --git a/web/src/pages/api-tokens-list/index.ts b/web/src/pages/api-tokens-list/index.ts index 163fce0..44a9991 100644 --- a/web/src/pages/api-tokens-list/index.ts +++ b/web/src/pages/api-tokens-list/index.ts @@ -2,8 +2,8 @@ import { withRoute } from "atomic-router-forest"; import { h, spec } from "forest"; import { apiTokenCreateRoute, apiTokensRoute } from "@/shared/routing"; -import { HeaderWithCreation } from "@/widgets"; -import { ApiTokensList } from "@/widgets"; +import { HeaderWithCreation } from "@/widgets/header-with-creation"; +import { ApiTokensList } from "@/widgets/api-tokens-list"; import { i18n } from "@/shared/lib/i18n"; export const ApiTokensListPage = () => { diff --git a/web/src/pages/home/index.ts b/web/src/pages/home/index.ts index 88125ec..d95b36c 100644 --- a/web/src/pages/home/index.ts +++ b/web/src/pages/home/index.ts @@ -2,7 +2,8 @@ import { h } from "forest"; import { withRoute } from "atomic-router-forest"; import { homeRoute, schemaCreateRoute } from "@/shared/routing"; -import { HeaderWithCreation, SchemasList } from "@/widgets"; +import { HeaderWithCreation } from "@/widgets/header-with-creation"; +import { SchemasList } from "@/widgets/schemas-list"; import { i18n } from "@/shared/lib/i18n"; export const HomePage = () => { diff --git a/web/src/pages/log/index.ts b/web/src/pages/log/index.ts index ffe836a..92bb127 100644 --- a/web/src/pages/log/index.ts +++ b/web/src/pages/log/index.ts @@ -4,7 +4,9 @@ import { h, spec } from "forest"; import { logModel } from "@/entities/log"; import { router, showLogRoute } from "@/shared/routing"; import { Spinner } from "@/shared/ui"; -import { GroupActionsList, LogsCard, SchemaHeader } from "@/widgets"; +import { GroupActionsList } from "@/widgets/group-actions-list"; +import { SchemaHeader } from "@/widgets/schema-header"; +import { LogsCard } from "@/widgets/logs-card"; import { schemaModel } from "@/entities/schema"; import { combine } from "effector"; diff --git a/web/src/pages/login/index.ts b/web/src/pages/login/index.ts index 8597b0c..7bdb248 100644 --- a/web/src/pages/login/index.ts +++ b/web/src/pages/login/index.ts @@ -2,7 +2,7 @@ import { h, spec } from "forest"; import { withRoute } from "atomic-router-forest"; import { loginRoute } from "@/shared/routing"; -import { AuthForm } from "@/widgets"; +import { AuthForm } from "@/widgets/auth-form"; export const LoginPage = () => { h("div", { diff --git a/web/src/pages/logs-list/index.ts b/web/src/pages/logs-list/index.ts index 5a61627..ab01f48 100644 --- a/web/src/pages/logs-list/index.ts +++ b/web/src/pages/logs-list/index.ts @@ -2,7 +2,10 @@ import { withRoute } from "atomic-router-forest"; import { h, spec } from "forest"; import { logsRoute } from "@/shared/routing"; -import { LogsFilter, LogsList, SchemaHeader, SearchBar } from "@/widgets"; +import { LogsFilter } from "@/widgets/logs-filter"; +import { LogsList } from "@/widgets/logs-list"; +import { SchemaHeader } from "@/widgets/schema-header"; +import { SearchBar } from "@/widgets/search-bar"; import { Pagination, Spinner } from "@/shared/ui"; import { logModel } from "@/entities/log"; diff --git a/web/src/pages/profile/index.ts b/web/src/pages/profile/index.ts index 2a309ee..640eb93 100644 --- a/web/src/pages/profile/index.ts +++ b/web/src/pages/profile/index.ts @@ -3,7 +3,7 @@ import { withRoute } from "atomic-router-forest"; import { profileRoute } from "@/shared/routing"; import { Header } from "@/shared/ui"; -import { UserProfile } from "@/widgets"; +import { UserProfile } from "@/widgets/user-profile"; import { i18n } from "@/shared/lib/i18n"; export const ProfilePage = () => { diff --git a/web/src/pages/register-admin/index.ts b/web/src/pages/register-admin/index.ts index c04dbe7..69ce8ca 100644 --- a/web/src/pages/register-admin/index.ts +++ b/web/src/pages/register-admin/index.ts @@ -2,7 +2,7 @@ import { h, spec } from "forest"; import { withRoute } from "atomic-router-forest"; import { registerAdminRoute } from "@/shared/routing"; -import { RegisterAdminForm } from "@/widgets"; +import { RegisterAdminForm } from "@/widgets/register-admin-form"; export const RegisterAdminPage = () => { h("div", { diff --git a/web/src/pages/tag-create/index.ts b/web/src/pages/tag-create/index.ts index a71c1b2..07cbbcc 100644 --- a/web/src/pages/tag-create/index.ts +++ b/web/src/pages/tag-create/index.ts @@ -3,7 +3,7 @@ import { h, spec } from "forest"; import { tagCreateRoute } from "@/shared/routing"; import { Header } from "@/shared/ui"; -import { NewTagForm } from "@/features"; +import { NewTagForm } from "@/features/tag-create"; import { i18n } from "@/shared/lib/i18n"; export const TagCreatePage = () => { diff --git a/web/src/pages/tag-edit/index.ts b/web/src/pages/tag-edit/index.ts index a25a3a2..51d6b5a 100644 --- a/web/src/pages/tag-edit/index.ts +++ b/web/src/pages/tag-edit/index.ts @@ -3,7 +3,7 @@ import { h, spec } from "forest"; import { tagEditRoute } from "@/shared/routing"; import { Header } from "@/shared/ui"; -import { EditTagForm } from "@/features"; +import { EditTagForm } from "@/features/tag-edit"; import { i18n } from "@/shared/lib/i18n"; export const TagEditPage = () => { diff --git a/web/src/pages/tags-list/index.ts b/web/src/pages/tags-list/index.ts index deb4716..3aeacb9 100644 --- a/web/src/pages/tags-list/index.ts +++ b/web/src/pages/tags-list/index.ts @@ -2,8 +2,8 @@ import { withRoute } from "atomic-router-forest"; import { h, spec } from "forest"; import { tagCreateRoute, tagsRoute } from "@/shared/routing"; -import { HeaderWithCreation } from "@/widgets"; -import { TagsList } from "@/widgets"; +import { HeaderWithCreation } from "@/widgets/header-with-creation"; +import { TagsList } from "@/widgets/tags-list"; import { i18n } from "@/shared/lib/i18n"; export const TagsListPage = () => { diff --git a/web/src/pages/users-list/index.ts b/web/src/pages/users-list/index.ts index b7c466f..ae74e7f 100644 --- a/web/src/pages/users-list/index.ts +++ b/web/src/pages/users-list/index.ts @@ -3,7 +3,7 @@ import { h, spec } from "forest"; import { memberCreateRoute, membersRoute } from "@/shared/routing"; import { UsersList } from "@/widgets/users-list"; -import { HeaderWithCreation } from "@/widgets"; +import { HeaderWithCreation } from "@/widgets/header-with-creation"; import { i18n } from "@/shared/lib/i18n"; export const UsersListPage = () => { diff --git a/web/src/shared/api/base.ts b/web/src/shared/api/base.ts index 4a44014..69465f4 100644 --- a/web/src/shared/api/base.ts +++ b/web/src/shared/api/base.ts @@ -1,5 +1,5 @@ import { attach, createEffect } from "effector"; -import { $token, notAllowedTriggered, notFoundTriggered, unauthorizedTriggered } from "@/shared/auth"; +import { $token, notAllowedTriggered, notFoundTriggered, unauthorizedTriggered } from "@/shared/session"; export type FetchMethods = "GET" | "POST" | "PUT" | "DELETE"; export type BaseResponse = { diff --git a/web/src/shared/api/index.ts b/web/src/shared/api/index.ts index 22ff0d2..d6fe581 100644 --- a/web/src/shared/api/index.ts +++ b/web/src/shared/api/index.ts @@ -23,13 +23,24 @@ export { createAction, deleteAction, } from "./actions"; -export { type Log, type Level, type LogsGroup, getLogs } from "./logs"; -export { type User, type UserToCreate, type UserToUpdate, getUsers, getUser, editUser, createUser } from "./users"; +export { type Log, type Level, type LogsGroup, getLogs, getLogGroup } from "./logs"; +export { + type User, + type UserToCreate, + type UserToUpdate, + type UserRole, + getUsers, + getUser, + editUser, + createUser, + deleteUser, +} from "./users"; export { type ApiToken, type ApiTokenToCreate, type ApiTokenToUpdate, getApiToken, + getApiTokens, editApiToken, deleteApiToken, createApiToken, diff --git a/web/src/shared/assets/index.ts b/web/src/shared/assets/index.ts new file mode 100644 index 0000000..e69de29 diff --git a/web/src/shared/lib/i18n/index.ts b/web/src/shared/lib/i18n/index.ts index 29a5501..cc2bd82 100644 --- a/web/src/shared/lib/i18n/index.ts +++ b/web/src/shared/lib/i18n/index.ts @@ -1,9 +1,12 @@ -import { TranslationPath } from "@/shared/types"; import { invokeTemplate } from "./templating"; import { locales } from "./translations"; import { Store } from "effector"; import { $preferredLanguage } from "./locale"; -export { setLanguage } from "./locale"; +import { Join, PathsToStringProps, Translation } from "./translations/types"; + +export { setLanguage, $preferredLanguage } from "./locale"; + +type TranslationPath = Join>; export const i18n = (path: TranslationPath, vars?: Record): Store => { const $locale = $preferredLanguage.map((lang) => locales[lang]); diff --git a/web/src/shared/lib/i18n/translations/en.ts b/web/src/shared/lib/i18n/translations/en.ts index 39c2722..60fb12b 100644 --- a/web/src/shared/lib/i18n/translations/en.ts +++ b/web/src/shared/lib/i18n/translations/en.ts @@ -1,4 +1,4 @@ -import { Translation } from "@/shared/types"; +import { Translation } from "./types"; export const en: Translation = { profile: { diff --git a/web/src/shared/lib/i18n/translations/index.ts b/web/src/shared/lib/i18n/translations/index.ts index b181bc3..3f10d99 100644 --- a/web/src/shared/lib/i18n/translations/index.ts +++ b/web/src/shared/lib/i18n/translations/index.ts @@ -1,6 +1,6 @@ -import { Translation } from "@/shared/types"; import { en } from "./en"; import { ru } from "./ru"; +import { Translation } from "./types"; export const locales: { [key: string]: Translation } = { en, diff --git a/web/src/shared/lib/i18n/translations/ru.ts b/web/src/shared/lib/i18n/translations/ru.ts index b0cce96..d429f12 100644 --- a/web/src/shared/lib/i18n/translations/ru.ts +++ b/web/src/shared/lib/i18n/translations/ru.ts @@ -1,4 +1,4 @@ -import { Translation } from "@/shared/types"; +import { Translation } from "./types"; export const ru: Translation = { profile: { diff --git a/web/src/shared/types/index.ts b/web/src/shared/lib/i18n/translations/types.ts similarity index 98% rename from web/src/shared/types/index.ts rename to web/src/shared/lib/i18n/translations/types.ts index 8cef1f0..0bc4cda 100644 --- a/web/src/shared/types/index.ts +++ b/web/src/shared/lib/i18n/translations/types.ts @@ -291,5 +291,3 @@ export type Translation = { empty_search_result: string; }; }; - -export type TranslationPath = Join>; diff --git a/web/src/shared/lib/index.ts b/web/src/shared/lib/index.ts index 1fe45a0..ecd726f 100644 --- a/web/src/shared/lib/index.ts +++ b/web/src/shared/lib/index.ts @@ -6,3 +6,4 @@ export { isObjectPresent } from "./presence"; export { themeChanged, $currentTheme, loadThemeFromStorageFx } from "./theming"; export { objectToQueryString, queryStringToObject } from "./parsing/query"; export { intersection } from "./intersection"; +export { i18n, $preferredLanguage, setLanguage } from "./i18n"; diff --git a/web/src/shared/routing/middlewares.ts b/web/src/shared/routing/middlewares.ts index ea09986..19b7b18 100644 --- a/web/src/shared/routing/middlewares.ts +++ b/web/src/shared/routing/middlewares.ts @@ -1,5 +1,12 @@ import { UserRole } from "@/shared/api/users"; -import { $currentAccount, $isAuthorized, getSessionFx, obtainSession, tokenReceived, unauthorizedTriggered } from "@/shared/auth"; +import { + $currentAccount, + $isAuthorized, + getSessionFx, + obtainSession, + tokenReceived, + unauthorizedTriggered, +} from "@/shared/session"; import { RouteInstance, RouteParamsAndQuery, chainRoute, redirect } from "atomic-router"; import { createEvent, sample } from "effector"; import { condition } from "patronum"; diff --git a/web/src/shared/auth/index.ts b/web/src/shared/session/index.ts similarity index 100% rename from web/src/shared/auth/index.ts rename to web/src/shared/session/index.ts diff --git a/web/src/shared/ui/index.ts b/web/src/shared/ui/index.ts index d5d2dbe..d266fe8 100644 --- a/web/src/shared/ui/index.ts +++ b/web/src/shared/ui/index.ts @@ -8,6 +8,7 @@ export { Header } from "./header"; export { Subheader } from "./subheader"; export { DownIcon, + FireIcon, FilterIcon, ClockIcon, PreviousIcon, diff --git a/web/src/shared/ui/permission-gate/index.ts b/web/src/shared/ui/permission-gate/index.ts index e3518ca..93b3320 100644 --- a/web/src/shared/ui/permission-gate/index.ts +++ b/web/src/shared/ui/permission-gate/index.ts @@ -1,5 +1,5 @@ import { UserRole } from "@/shared/api/users"; -import { $currentAccount } from "@/shared/auth"; +import { $currentAccount } from "@/shared/session"; import { combine, createStore } from "effector"; import { variant } from "forest"; diff --git a/web/src/widgets/auth-form/index.ts b/web/src/widgets/auth-form/index.ts index ac98814..2df1c30 100644 --- a/web/src/widgets/auth-form/index.ts +++ b/web/src/widgets/auth-form/index.ts @@ -1,4 +1,4 @@ -import { Auth } from "@/features"; +import { Auth } from "@/features/auth"; import { Logo } from "@/shared/ui"; export const AuthForm = () => { diff --git a/web/src/widgets/group-actions-list/index.ts b/web/src/widgets/group-actions-list/index.ts index 1eaacf1..2af52cc 100644 --- a/web/src/widgets/group-actions-list/index.ts +++ b/web/src/widgets/group-actions-list/index.ts @@ -1,6 +1,6 @@ import { actionModel } from "@/entities/action"; import { logModel } from "@/entities/log"; -import { LogGroupAction } from "@/features"; +import { LogGroupAction } from "@/features/log-group-action"; import { Log } from "@/shared/api"; import { Popup } from "@/shared/ui"; import { Store, createStore } from "effector"; diff --git a/web/src/widgets/index.ts b/web/src/widgets/index.ts deleted file mode 100644 index 0fc20ab..0000000 --- a/web/src/widgets/index.ts +++ /dev/null @@ -1,14 +0,0 @@ -export { SearchBar } from "./search-bar"; -export { SchemaHeader } from "./schema-header"; -export { LogsList } from "./logs-list"; -export { TagsList } from "./tags-list"; -export { ApiTokensList } from "./api-tokens-list"; -export { AuthForm } from "./auth-form"; -export { RegisterAdminForm } from "./register-admin-form"; -export { HeaderWithCreation } from "./header-with-creation"; -export { UserProfile } from "./user-profile"; -export { SchemasList } from "./schemas-list"; -export { GroupActionsList } from "./group-actions-list"; -export { LogsCard } from "./logs-card"; -export { LogsFilter } from "./logs-filter"; -export { LogsTable } from "./logs-table"; diff --git a/web/src/widgets/register-admin-form/index.ts b/web/src/widgets/register-admin-form/index.ts index 41376f5..990597b 100644 --- a/web/src/widgets/register-admin-form/index.ts +++ b/web/src/widgets/register-admin-form/index.ts @@ -1,4 +1,4 @@ -import { RegisterAdmin } from "@/features"; +import { RegisterAdmin } from "@/features/register-admin"; import { Header } from "@/shared/ui"; export const RegisterAdminForm = () => { diff --git a/web/src/widgets/schemas-list/index.ts b/web/src/widgets/schemas-list/index.ts index ff109ec..5c00a2d 100644 --- a/web/src/widgets/schemas-list/index.ts +++ b/web/src/widgets/schemas-list/index.ts @@ -3,7 +3,7 @@ import { h, list, remap, spec } from "forest"; import { $generalSchemas, $groupedTaggedSchemas, $searchQuery, $sortedTags, queryChanged } from "./model"; import { combine } from "effector"; import { SchemaCard } from "@/entities/schema"; -import { i18n } from "@/shared/lib/i18n"; +import { i18n } from "@/shared/lib"; export const SchemasList = () => { h("div", () => { diff --git a/web/src/widgets/search-bar/index.ts b/web/src/widgets/search-bar/index.ts index e62fefe..d7d8425 100644 --- a/web/src/widgets/search-bar/index.ts +++ b/web/src/widgets/search-bar/index.ts @@ -1,6 +1,8 @@ import { logModel } from "@/entities/log"; import { schemaModel } from "@/entities/schema"; -import { Filter, FilterDate, FilterLevel } from "@/features"; +import { FilterDate } from "@/features/filter-date-logs"; +import { Filter } from "@/features/filter-logs"; +import { FilterLevel } from "@/features/filter-level-logs"; import { logsRoute } from "@/shared/routing"; import { i18n } from "@/shared/lib/i18n"; import { Button, Search } from "@/shared/ui"; diff --git a/web/steiger.config.js b/web/steiger.config.js new file mode 100644 index 0000000..e7884f2 --- /dev/null +++ b/web/steiger.config.js @@ -0,0 +1,8 @@ +import { defineConfig } from "steiger"; + +export default defineConfig({ + rules: { + "insignificant-slice": "off", + "no-segmentless-slices": "off", + }, +});