fix(cli): improve error logging and remove actionableError calls

This commit is contained in:
melvinchia3636
2026-01-29 08:21:48 +08:00
parent ad2e7fb623
commit 761369f597
40 changed files with 260 additions and 209 deletions

View File

@@ -15,7 +15,7 @@
# IDE and editor files
**/.vscode
**/.idea
**/*.swp
**/*.swe
**/*.swo
# Test files

145
bun.lock
View File

@@ -53,6 +53,69 @@
"vite": "^7.1.9",
},
},
"apps/lifeforge--achievements": {
"name": "@lifeforge/lifeforge--achievements",
"version": "0.0.8",
"peerDependencies": {
"@lifeforge/server-utils": "workspace:*",
"lifeforge-ui": "workspace:*",
"shared": "workspace:*",
},
},
"apps/lifeforge--calendar": {
"name": "@lifeforge/lifeforge--calendar",
"version": "0.0.5",
"dependencies": {
"node-ical": "^0.21.0",
"react-big-calendar": "^1.19.4",
"react-markdown": "^10.1.0",
"react-tooltip": "^5.30.0",
"rrule": "^2.8.1",
"zustand": "^5.0.8",
},
"devDependencies": {
"@types/react-big-calendar": "^1.16.3",
},
"peerDependencies": {
"@lifeforge/server-utils": "workspace:*",
"lifeforge-ui": "workspace:*",
"shared": "workspace:*",
},
},
"apps/lifeforge--movies": {
"name": "@lifeforge/lifeforge--movies",
"version": "0.0.5",
"dependencies": {
"qrcode.react": "^4.2.0",
},
"peerDependencies": {
"@lifeforge/server-utils": "workspace:*",
"lifeforge-ui": "workspace:*",
"shared": "workspace:*",
},
},
"apps/lifeforge--wallet": {
"name": "@lifeforge/lifeforge--wallet",
"version": "0.0.5",
"dependencies": {
"@vis.gl/react-google-maps": "^1.5.5",
"chart.js": "^4.5.0",
"moment-range": "^4.0.2",
"react-chartjs-2": "^5.3.0",
"react-to-print": "^3.1.1",
"react-virtualized": "^9.22.6",
"recharts": "^2.15.0",
"zustand": "^5.0.8",
},
"devDependencies": {
"@types/react-virtualized": "^9.22.3",
},
"peerDependencies": {
"@lifeforge/server-utils": "workspace:*",
"lifeforge-ui": "workspace:*",
"shared": "workspace:*",
},
},
"client": {
"name": "@lifeforge/client",
"version": "0.0.0",
@@ -661,10 +724,20 @@
"@jridgewell/trace-mapping": ["@jridgewell/trace-mapping@0.3.31", "", { "dependencies": { "@jridgewell/resolve-uri": "^3.1.0", "@jridgewell/sourcemap-codec": "^1.4.14" } }, "sha512-zzNR+SdQSDJzc8joaeP8QQoCQr8NuYx2dIIytl1QeBEZHJ9uW6hebsrYgbz8hJwUQao3TWCMtmfV8Nu1twOLAw=="],
"@kurkle/color": ["@kurkle/color@0.3.4", "", {}, "sha512-M5UknZPHRu3DEDWoipU6sE8PdkZ6Z/S+v4dD+Ke8IaNlpdSQah50lz1KtcFBa2vsdOnwbbnxJwVM4wty6udA5w=="],
"@lifeforge/client": ["@lifeforge/client@workspace:client"],
"@lifeforge/lifeforge--achievements": ["@lifeforge/lifeforge--achievements@workspace:apps/lifeforge--achievements"],
"@lifeforge/lifeforge--calendar": ["@lifeforge/lifeforge--calendar@workspace:apps/lifeforge--calendar"],
"@lifeforge/lifeforge--lang-en": ["@lifeforge/lifeforge--lang-en@workspace:locales/lifeforge--lang-en"],
"@lifeforge/lifeforge--movies": ["@lifeforge/lifeforge--movies@workspace:apps/lifeforge--movies"],
"@lifeforge/lifeforge--wallet": ["@lifeforge/lifeforge--wallet@workspace:apps/lifeforge--wallet"],
"@lifeforge/log": ["@lifeforge/log@workspace:packages/lifeforge-log"],
"@lifeforge/server": ["@lifeforge/server@workspace:server"],
@@ -749,6 +822,8 @@
"@polka/url": ["@polka/url@1.0.0-next.29", "", {}, "sha512-wwQAWhWSuHaag8c4q/KN/vCoeOJYshAIvMQwD4GpSb3OiZklFfvAgmj0VCBBImRpuF/aFgIRzllXlVX93Jevww=="],
"@popperjs/core": ["@popperjs/core@2.11.8", "", {}, "sha512-P1st0aksCrn9sGZhp8GMYwBnQsbvAWsZAX44oXNNvLHGqAOcoVxmjZiohstwQ7SqKnbR47akdNi+uleWD8+g6A=="],
"@radix-ui/number": ["@radix-ui/number@1.1.1", "", {}, "sha512-MkKCwxlXTgz6CFoJx3pCwn07GKp36+aZyu/u2Ln2VrA5DcdyCZkASEDBTd8x5whTQQL5CiYf4prXKLcgQdv29g=="],
"@radix-ui/primitive": ["@radix-ui/primitive@1.1.3", "", {}, "sha512-JTF99U/6XIjCBo0wqkU5sK10glYe27MRRsfwoiq5zzOEZLHU3A3KCMa5X/azekYRCJ0HlwI0crAXS/5dEHTzDg=="],
@@ -829,6 +904,8 @@
"@react-types/shared": ["@react-types/shared@3.32.1", "", { "peerDependencies": { "react": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1" } }, "sha512-famxyD5emrGGpFuUlgOP6fVW2h/ZaF405G5KDi3zPHzyjAWys/8W6NAVJtNbkCkhedmvL0xOhvt8feGXyXaw5w=="],
"@restart/hooks": ["@restart/hooks@0.4.16", "", { "dependencies": { "dequal": "^2.0.3" }, "peerDependencies": { "react": ">=16.8.0" } }, "sha512-f7aCv7c+nU/3mF7NWLtVVr0Ra80RqsO89hO72r+Y/nvQr5+q0UFGkocElTH6MJApvReVh6JHUFYn2cw1WdHF3w=="],
"@rolldown/pluginutils": ["@rolldown/pluginutils@1.0.0-beta.27", "", {}, "sha512-+d0F4MKMCbeVUJwG96uQ4SgAznZNSq93I3V+9NHA4OpvqG8mRCpGdKmK8l/dl02h2CCDHwW2FqilnTyDcAnqjA=="],
"@rollup/pluginutils": ["@rollup/pluginutils@5.3.0", "", { "dependencies": { "@types/estree": "^1.0.0", "estree-walker": "^2.0.2", "picomatch": "^4.0.2" }, "peerDependencies": { "rollup": "^1.20.0||^2.0.0||^3.0.0||^4.0.0" }, "optionalPeers": ["rollup"] }, "sha512-5EdhGZtnu3V88ces7s53hhfK5KSASnJZv8Lulpc04cWO3REESroJXg73DFsOmgbU2BhwV0E20bu2IDZb3VKW4Q=="],
@@ -1071,6 +1148,8 @@
"@types/d3-zoom": ["@types/d3-zoom@3.0.8", "", { "dependencies": { "@types/d3-interpolate": "*", "@types/d3-selection": "*" } }, "sha512-iqMC4/YlFCSlO8+2Ii1GGGliCAY4XdeG748w5vQUbevlbDu0zSjH/+jojorQVBK/se0j6DUFNPBGSqD3YWYnDw=="],
"@types/date-arithmetic": ["@types/date-arithmetic@4.1.4", "", {}, "sha512-p9eZ2X9B80iKiTW4ukVj8B4K6q9/+xFtQ5MGYA5HWToY9nL4EkhV9+6ftT2VHpVMEZb5Tv00Iel516bVdO+yRw=="],
"@types/debug": ["@types/debug@4.1.12", "", { "dependencies": { "@types/ms": "*" } }, "sha512-vIChWdVG3LG1SMxEvI/AK+FWJthlrqlTu7fbrlywTkkaONwk/UAGaULXRlf8vkzFBLVm0zkMdCquhL5aOjhXPQ=="],
"@types/deep-eql": ["@types/deep-eql@4.0.2", "", {}, "sha512-c9h9dVVMigMPc4bwTvC5dxqtqJZwQPePsWjPlpSOnojbor6pGqdk541lfA7AqFQr5pB1BRdq0juY9db81BwyFw=="],
@@ -1091,6 +1170,8 @@
"@types/geojson": ["@types/geojson@7946.0.16", "", {}, "sha512-6C8nqWur3j98U6+lXDfTUWIfgvZU+EumvpHKcYjujKH7woYyLj2sUmff0tRhrqM7BohUw7Pz3ZB1jj2gW9Fvmg=="],
"@types/google.maps": ["@types/google.maps@3.58.1", "", {}, "sha512-X9QTSvGJ0nCfMzYOnaVs/k6/4L+7F5uCS+4iUmkLEls6J9S/Phv+m/i3mDeyc49ZBgwab3EFO1HEoBY7k98EGQ=="],
"@types/hast": ["@types/hast@3.0.4", "", { "dependencies": { "@types/unist": "*" } }, "sha512-WPs+bbQw5aCj+x6laNGWLH3wviHtoCv/P3+otBhbOhJgG8qtpdAMlTCxLtsTWA7LH1Oh/bFCHsBn0TPS5m30EQ=="],
"@types/http-errors": ["@types/http-errors@2.0.5", "", {}, "sha512-r8Tayk8HJnX0FztbZN7oVqGccWgw98T/0neJphO91KkmOzug1KkofZURD4UaD5uH8AqcFLfdPErnBod0u71/qg=="],
@@ -1137,6 +1218,8 @@
"@types/react": ["@types/react@19.2.9", "", { "dependencies": { "csstype": "^3.2.2" } }, "sha512-Lpo8kgb/igvMIPeNV2rsYKTgaORYdO1XGVZ4Qz3akwOj0ySGYMPlQWa8BaLn0G63D1aSaAQ5ldR06wCpChQCjA=="],
"@types/react-big-calendar": ["@types/react-big-calendar@1.16.3", "", { "dependencies": { "@types/date-arithmetic": "*", "@types/prop-types": "*", "@types/react": "*" } }, "sha512-CR+5BKMhlr/wPgsp+sXOeNKNkoU1h/+6H1XoWuL7xnurvzGRQv/EnM8jPS9yxxBvXI8pjQBaJcI7RTSGiewG/Q=="],
"@types/react-custom-scrollbars": ["@types/react-custom-scrollbars@4.0.13", "", { "dependencies": { "@types/react": "*" } }, "sha512-t+15reWgAE1jXlrhaZoxjuH/SQf+EG0rzAzSCzTIkSiP5CDT7KhoExNPwIa6uUxtPkjc3gdW/ry7GetLEwCfGA=="],
"@types/react-dom": ["@types/react-dom@19.2.3", "", { "peerDependencies": { "@types/react": "^19.2.0" } }, "sha512-jp2L/eY6fn+KgVVQAOqYItbF0VY/YApe5Mz2F0aykSO8gx31bYCZyvSeYxCHKvzHG5eZjc+zyaS5BrBWya2+kQ=="],
@@ -1173,6 +1256,8 @@
"@types/uuid": ["@types/uuid@10.0.0", "", {}, "sha512-7gqG38EyHgyP1S+7+xomFtL+ZNHcKv6DwNaCZmJmo1vgMugyF3TCnXVg4t1uk89mLNwnLtnY3TpOpCOyp1/xHQ=="],
"@types/warning": ["@types/warning@3.0.3", "", {}, "sha512-D1XC7WK8K+zZEveUPY+cf4+kgauk8N4eHr/XIHXGlGYkHLud6hK9lYfZk1ry1TNh798cZUCgb6MqGEG8DkJt6Q=="],
"@types/yauzl": ["@types/yauzl@2.10.3", "", { "dependencies": { "@types/node": "*" } }, "sha512-oJoftv0LSuaDZE3Le4DbKX+KS9G36NzOeSap90UIK0yMA/NhKJhqlSGtNDORNRaIbQfzjXDrQa0ytJ6mNRGz/Q=="],
"@typescript-eslint/eslint-plugin": ["@typescript-eslint/eslint-plugin@7.18.0", "", { "dependencies": { "@eslint-community/regexpp": "^4.10.0", "@typescript-eslint/scope-manager": "7.18.0", "@typescript-eslint/type-utils": "7.18.0", "@typescript-eslint/utils": "7.18.0", "@typescript-eslint/visitor-keys": "7.18.0", "graphemer": "^1.4.0", "ignore": "^5.3.1", "natural-compare": "^1.4.0", "ts-api-utils": "^1.3.0" }, "peerDependencies": { "@typescript-eslint/parser": "^7.0.0", "eslint": "^8.56.0" } }, "sha512-94EQTWZ40mzBc42ATNIBimBEDltSJ9RQHCC8vc/PDbxi4k8dVwUAv4o98dk50M1zB+JGFxp43FP7f8+FP8R6Sw=="],
@@ -1259,6 +1344,8 @@
"@ungap/structured-clone": ["@ungap/structured-clone@1.3.0", "", {}, "sha512-WmoN8qaIAo7WTYWbAZuG8PYEhn5fkz7dZrqTBZ7dtt//lL2Gwms1IcnQ5yHqjDfX8Ft5j4YzDM23f87zBfDe9g=="],
"@vis.gl/react-google-maps": ["@vis.gl/react-google-maps@1.7.1", "", { "dependencies": { "@types/google.maps": "^3.54.10", "fast-deep-equal": "^3.1.3" }, "peerDependencies": { "react": ">=16.8.0 || ^19.0 || ^19.0.0-rc", "react-dom": ">=16.8.0 || ^19.0 || ^19.0.0-rc" } }, "sha512-F/GJzJyri7Jqf+bkLNxoi2RcH2hCIo1I3//PyiILqQzdzglMoqZVO1DLXlHPifNdebk1/zib6dMJA3i73nwmuQ=="],
"@vitejs/plugin-react": ["@vitejs/plugin-react@4.7.0", "", { "dependencies": { "@babel/core": "^7.28.0", "@babel/plugin-transform-react-jsx-self": "^7.27.1", "@babel/plugin-transform-react-jsx-source": "^7.27.1", "@rolldown/pluginutils": "1.0.0-beta.27", "@types/babel__core": "^7.20.5", "react-refresh": "^0.17.0" }, "peerDependencies": { "vite": "^4.2.0 || ^5.0.0 || ^6.0.0 || ^7.0.0" } }, "sha512-gUu9hwfWvvEDBBmgtAowQCojwZmJ5mcLn3aufeCsitijs3+f2NsrPtlAWIR6OPiqljl96GVCUbLe0HyqIpVaoA=="],
"@vitest/browser": ["@vitest/browser@1.6.1", "", { "dependencies": { "@vitest/utils": "1.6.1", "magic-string": "^0.30.5", "sirv": "^2.0.4" }, "peerDependencies": { "playwright": "*", "vitest": "1.6.1", "webdriverio": "*" }, "optionalPeers": ["playwright", "webdriverio"] }, "sha512-9ZYW6KQ30hJ+rIfJoGH4wAub/KAb4YrFzX0kVLASvTm7nJWVC5EAv5SlzlXVl3h3DaUq5aqHlZl77nmOPnALUQ=="],
@@ -1515,6 +1602,8 @@
"character-reference-invalid": ["character-reference-invalid@1.1.4", "", {}, "sha512-mKKUkUbhPpQlCOfIuZkvSEgktjPFIsZKRRbC6KWVEMvlzblj3i3asQv5ODsrwt0N3pHAEvjP8KTQPHkp0+6jOg=="],
"chart.js": ["chart.js@4.5.1", "", { "dependencies": { "@kurkle/color": "^0.3.0" } }, "sha512-GIjfiT9dbmHRiYi6Nl2yFCq7kkwdkp1W/lp2J99rX0yo9tgJGn3lKQATztIjb5tVtevcBtIdICNWqlq5+E8/Pw=="],
"check-error": ["check-error@1.0.3", "", { "dependencies": { "get-func-name": "^2.0.2" } }, "sha512-iKEoDYaRmd1mxM90a2OEfWhjsjPpYPuQ+lMYsoxB126+t8fw7ySEO48nmDg5COTjxDI65/Y2OWpeEHk3ZOe8zg=="],
"cheerio": ["cheerio@1.1.2", "", { "dependencies": { "cheerio-select": "^2.1.0", "dom-serializer": "^2.0.0", "domhandler": "^5.0.3", "domutils": "^3.2.2", "encoding-sniffer": "^0.2.1", "htmlparser2": "^10.0.0", "parse5": "^7.3.0", "parse5-htmlparser2-tree-adapter": "^7.1.0", "parse5-parser-stream": "^7.1.2", "undici": "^7.12.0", "whatwg-mimetype": "^4.0.0" } }, "sha512-IkxPpb5rS/d1IiLbHMgfPuS0FgiWTtFIm/Nj+2woXDLTZ7fOT2eqzgYbdMlLweqlHbsZjxEChoVK+7iph7jyQg=="],
@@ -1653,6 +1742,8 @@
"cytoscape-fcose": ["cytoscape-fcose@2.2.0", "", { "dependencies": { "cose-base": "^2.2.0" }, "peerDependencies": { "cytoscape": "^3.2.0" } }, "sha512-ki1/VuRIHFCzxWNrsshHYPs6L7TvLu3DL+TyIGEsRcvVERmxokbf5Gdk7mFxZnTdiGtnA4cfSmjZJMviqSuZrQ=="],
"d": ["d@1.0.2", "", { "dependencies": { "es5-ext": "^0.10.64", "type": "^2.7.2" } }, "sha512-MOqHvMWF9/9MX6nza0KgvFH4HpMU0EF5uUDXqX/BtxtU8NfB0QzRtJ8Oe/6SuS4kbhyzVJwjd97EA4PKrzJ8bw=="],
"d3": ["d3@7.9.0", "", { "dependencies": { "d3-array": "3", "d3-axis": "3", "d3-brush": "3", "d3-chord": "3", "d3-color": "3", "d3-contour": "4", "d3-delaunay": "6", "d3-dispatch": "3", "d3-drag": "3", "d3-dsv": "3", "d3-ease": "3", "d3-fetch": "3", "d3-force": "3", "d3-format": "3", "d3-geo": "3", "d3-hierarchy": "3", "d3-interpolate": "3", "d3-path": "3", "d3-polygon": "3", "d3-quadtree": "3", "d3-random": "3", "d3-scale": "4", "d3-scale-chromatic": "3", "d3-selection": "3", "d3-shape": "3", "d3-time": "3", "d3-time-format": "4", "d3-timer": "3", "d3-transition": "3", "d3-zoom": "3" } }, "sha512-e1U46jVP+w7Iut8Jt8ri1YsPOvFpg46k+K8TpCb0P+zjCkjkPnV7WzfDJzMHy1LnA+wj5pLT1wjO901gLXeEhA=="],
"d3-array": ["d3-array@3.2.4", "", { "dependencies": { "internmap": "1 - 2" } }, "sha512-tdQAmyA18i4J7wprpYq8ClcxZy3SC31QMeByyCFyRt7BVHdREQZ5lpzoe5mFEYZUWe+oq8HBvk9JjpibyEV4Jg=="],
@@ -1733,6 +1824,8 @@
"data-view-byte-offset": ["data-view-byte-offset@1.0.1", "", { "dependencies": { "call-bound": "^1.0.2", "es-errors": "^1.3.0", "is-data-view": "^1.0.1" } }, "sha512-BS8PfmtDGnrgYdOonGZQdLZslWIeCGFP9tpan0hi1Co2Zr2NKADsvGYA8XxuG/4UWgJ6Cjtv+YJnB6MM69QGlQ=="],
"date-arithmetic": ["date-arithmetic@4.1.0", "", {}, "sha512-QWxYLR5P/6GStZcdem+V1xoto6DMadYWpMXU82ES3/RfR3Wdwr3D0+be7mgOJ+Ov0G9D5Dmb9T17sNLQYj9XOg=="],
"date-fns": ["date-fns@4.1.0", "", {}, "sha512-Ukq0owbQXxa/U3EGtsdVBkR1w7KOQ5gIBqdH2hkvknzZPYvBxb/aa6E8L7tmjFtkwZBu3UXBbjIgPo/Ez4xaNg=="],
"dateformat": ["dateformat@4.6.3", "", {}, "sha512-2P0p0pFGzHS5EMnhdxQi7aJN+iMheud0UhG4dlE1DLAlvL8JHjJJTX/CSm4JXwV0Ka5nGk3zC5mcb5bUQUxxMA=="],
@@ -1869,6 +1962,12 @@
"es-to-primitive": ["es-to-primitive@1.3.0", "", { "dependencies": { "is-callable": "^1.2.7", "is-date-object": "^1.0.5", "is-symbol": "^1.0.4" } }, "sha512-w+5mJ3GuFL+NjVtJlvydShqE1eN3h3PbI7/5LAsYJP/2qtuMXjfL2LpHSRqo4b4eSF5K/DH1JXKUAHSB2UW50g=="],
"es5-ext": ["es5-ext@0.10.64", "", { "dependencies": { "es6-iterator": "^2.0.3", "es6-symbol": "^3.1.3", "esniff": "^2.0.1", "next-tick": "^1.1.0" } }, "sha512-p2snDhiLaXe6dahss1LddxqEm+SkuDvV8dnIQG0MWjyHpcMNfXKPE+/Cc0y+PhxJX3A4xGNeFCj5oc0BUh6deg=="],
"es6-iterator": ["es6-iterator@2.0.3", "", { "dependencies": { "d": "1", "es5-ext": "^0.10.35", "es6-symbol": "^3.1.1" } }, "sha512-zw4SRzoUkd+cl+ZoE15A9o1oQd920Bb0iOJMQkQhl3jNc03YqVjAhG7scf9C5KWRU/R13Orf588uCC6525o02g=="],
"es6-symbol": ["es6-symbol@3.1.4", "", { "dependencies": { "d": "^1.0.2", "ext": "^1.7.0" } }, "sha512-U9bFFjX8tFiATgtkJ1zg25+KviIXpgRvRHS8sau3GfhVzThRQrOeksPeT0BWW2MNZs1OEWJ1DPXOQMn0KKRkvg=="],
"esast-util-from-estree": ["esast-util-from-estree@2.0.0", "", { "dependencies": { "@types/estree-jsx": "^1.0.0", "devlop": "^1.0.0", "estree-util-visit": "^2.0.0", "unist-util-position-from-estree": "^2.0.0" } }, "sha512-4CyanoAudUSBAn5K13H4JhsMH6L9ZP7XbLVe/dKybkxMO7eDyLsT8UHl9TRNrU2Gr9nz+FovfSIjuXWJ81uVwQ=="],
"esast-util-from-js": ["esast-util-from-js@2.0.1", "", { "dependencies": { "@types/estree-jsx": "^1.0.0", "acorn": "^8.0.0", "esast-util-from-estree": "^2.0.0", "vfile-message": "^4.0.0" } }, "sha512-8Ja+rNJ0Lt56Pcf3TAmpBZjmx8ZcK5Ts4cAzIOjsjevg9oSXJnl6SUQ2EevU8tv3h6ZLWmoKL5H4fgWvdvfETw=="],
@@ -1955,6 +2054,8 @@
"eslint-visitor-keys": ["eslint-visitor-keys@4.2.1", "", {}, "sha512-Uhdk5sfqcee/9H/rCOJikYz67o0a2Tw2hGRPOG2Y1R2dg7brRe1uG0yaNQDHu+TO/uQPF/5eCapvYSmHUjt7JQ=="],
"esniff": ["esniff@2.0.1", "", { "dependencies": { "d": "^1.0.1", "es5-ext": "^0.10.62", "event-emitter": "^0.3.5", "type": "^2.7.2" } }, "sha512-kTUIGKQ/mDPFoJ0oVfcmyJn4iBDRptjNVIzwIFR7tqWXdVI9xfA2RMwY/gbSpJG3lkdWNEjLap/NqVHZiJsdfg=="],
"espree": ["espree@10.4.0", "", { "dependencies": { "acorn": "^8.15.0", "acorn-jsx": "^5.3.2", "eslint-visitor-keys": "^4.2.1" } }, "sha512-j6PAQ2uUr79PZhBjP5C5fhl8e39FmRnOjsD5lGnWrFU8i2G776tBK7+nP8KuQUTTyAZUwfQqXAgrVH5MbH9CYQ=="],
"esprima": ["esprima@4.0.1", "", { "bin": { "esparse": "./bin/esparse.js", "esvalidate": "./bin/esvalidate.js" } }, "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A=="],
@@ -1983,6 +2084,8 @@
"etag": ["etag@1.8.1", "", {}, "sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg=="],
"event-emitter": ["event-emitter@0.3.5", "", { "dependencies": { "d": "1", "es5-ext": "~0.10.14" } }, "sha512-D9rRn9y7kLPnJ+hMq7S/nhvoKwwvVJahBi2BPmx3bvbsEdK3W9ii8cBSGjP+72/LnM4n6fo3+dkCX5FeTQruXA=="],
"event-stream": ["event-stream@3.3.4", "", { "dependencies": { "duplexer": "~0.1.1", "from": "~0", "map-stream": "~0.1.0", "pause-stream": "0.0.11", "split": "0.3", "stream-combiner": "~0.0.4", "through": "~2.3.1" } }, "sha512-QHpkERcGsR0T7Qm3HNJSyXKEEj8AHNxkY3PK8TS2KJvQ7NiSHe3DDpwVKKtoYprL/AreyzFBeIkBIWChAqn60g=="],
"event-target-shim": ["event-target-shim@5.0.1", "", {}, "sha512-i/2XbnSz/uxRCU6+NdVJgKWDTM427+MqYbkQzD321DuCQJUqOuJKIA0IM2+W2xtYHdKOmZ4dR6fExsd4SXL+WQ=="],
@@ -2003,6 +2106,8 @@
"exsolve": ["exsolve@1.0.8", "", {}, "sha512-LmDxfWXwcTArk8fUEnOfSZpHOJ6zOMUJKOtFLFqJLoKJetuQG874Uc7/Kki7zFLzYybmZhp1M7+98pfMqeX8yA=="],
"ext": ["ext@1.7.0", "", { "dependencies": { "type": "^2.7.2" } }, "sha512-6hxeJYaL110a9b5TEJSj0gojyHQAmA2ch5Os+ySCiA1QGdS697XWY1pzsrSjqA9LDEEgdB/KypIlR59RcLuHYw=="],
"extend": ["extend@3.0.2", "", {}, "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g=="],
"extend-shallow": ["extend-shallow@2.0.1", "", { "dependencies": { "is-extendable": "^0.1.0" } }, "sha512-zCnTtlxNoAiDc3gqY2aYAWFx7XWWiasuF2K8Me5WbN8otHKTUKBwjPtNpRs/rbUZm7KxWAaNj7P1a/p52GbVug=="],
@@ -2149,6 +2254,8 @@
"global-dirs": ["global-dirs@3.0.1", "", { "dependencies": { "ini": "2.0.0" } }, "sha512-NBcGGFbBA9s1VzD41QXDG+3++t9Mn5t1FpLdhESY6oKY4gYTFpX4wO3sqGUa0Srjtbfj3szX0RnemmrVRUdULA=="],
"globalize": ["globalize@0.1.1", "", {}, "sha512-5e01v8eLGfuQSOvx2MsDMOWS0GFtCx1wPzQSmcHw4hkxFzrQDBO3Xwg/m8Hr/7qXMrHeOIE29qWVzyv06u1TZA=="],
"globals": ["globals@16.5.0", "", {}, "sha512-c/c15i26VrJ4IRt5Z89DnIzCGDn9EcebibhAOjw5ibqEHsE1wLUgkPn9RDmNcUKyU87GeaL633nyJ+pplFR2ZQ=="],
"globalthis": ["globalthis@1.0.4", "", { "dependencies": { "define-properties": "^1.2.1", "gopd": "^1.0.1" } }, "sha512-DpLKbNU4WylpxJykQujfCcwYWiV/Jhm50Goo0wrVILAv5jOr9d+H+UR3PhSCD2rCCEIg0uc+G+muBTwD54JhDQ=="],
@@ -2227,6 +2334,8 @@
"html-parse-stringify": ["html-parse-stringify@3.0.1", "", { "dependencies": { "void-elements": "3.1.0" } }, "sha512-KknJ50kTInJ7qIScF3jeaFRpMpE8/lfiTdzf/twXyPBLAGrLRTmkz3AdTnKeh40X8k9L2fdYwEp/42WGXIRGcg=="],
"html-url-attributes": ["html-url-attributes@3.0.1", "", {}, "sha512-ol6UPyBWqsrO6EJySPz2O7ZSr856WDrEzM5zMqp+FJJLGMW35cLYmmZnl0vztAZxRUoNZJFTCohfjuIJ8I4QBQ=="],
"htmlparser2": ["htmlparser2@10.0.0", "", { "dependencies": { "domelementtype": "^2.3.0", "domhandler": "^5.0.3", "domutils": "^3.2.1", "entities": "^6.0.0" } }, "sha512-TwAZM+zE5Tq3lrEHvOlvwgj1XLWQCtaaibSN11Q+gGBAS7Y1uZSWwXXRe4iF6OXnaq1riyQAPFOBtYc77Mxq0g=="],
"http-errors": ["http-errors@2.0.1", "", { "dependencies": { "depd": "~2.0.0", "inherits": "~2.0.4", "setprototypeof": "~1.2.0", "statuses": "~2.0.2", "toidentifier": "~1.0.1" } }, "sha512-4FbRdAX+bSdmo4AUFuS0WNiPz8NgFt+r8ThgNWmlrjQjt1Q7ZR9+zTlce2859x4KSXrwIsaeTqDoKQmtP8pLmQ=="],
@@ -2275,6 +2384,8 @@
"internmap": ["internmap@2.0.3", "", {}, "sha512-5Hh7Y1wQbvY5ooGgPbDaL5iYLAPzMTUrjMulskHLH6wnv/A+1q5rgEaiuqEjB+oxGXIVZs1FF+R/KPN3ZSQYYg=="],
"invariant": ["invariant@2.2.4", "", { "dependencies": { "loose-envify": "^1.0.0" } }, "sha512-phJfQVBuaJM5raOpJjSfkiD6BpbCE4Ns//LaXl6wGYtUBY83nWS6Rf9tXm2e8VaK60JEjYldbPif/A2B1C2gNA=="],
"ipaddr.js": ["ipaddr.js@1.9.1", "", {}, "sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g=="],
"is-accessor-descriptor": ["is-accessor-descriptor@1.0.1", "", { "dependencies": { "hasown": "^2.0.0" } }, "sha512-YBUanLI8Yoihw923YeFUS5fs0fF2f5TSFTNiYAAzhhDscDa3lEqYuz1pDOEP5KvX94I9ey3vsqjJcLVFVU+3QA=="],
@@ -2527,6 +2638,8 @@
"lru-cache": ["lru-cache@11.2.4", "", {}, "sha512-B5Y16Jr9LB9dHVkh6ZevG+vAbOsNOYCX+sXvFWFu7B3Iz5mijW3zdbMyhsh8ANd2mSWBYdJgnqi+mL7/LrOPYg=="],
"luxon": ["luxon@3.7.2", "", {}, "sha512-vtEhXh/gNjI9Yg1u4jX/0YVPMvxzHuGgCm6tC5kZyb08yjGWGnqAjGJvcXbqQR2P3MyMEFnRbpcdFS6PBcLqew=="],
"lz-string": ["lz-string@1.5.0", "", { "bin": { "lz-string": "bin/bin.js" } }, "sha512-h5bgJWpxJNswbU7qCrV0tIKQCaS3blPDrqKWx+QxzuzL1zGUzij9XCWLrSLsJPu5t+eWA/ycetzYAO5IOMcWAQ=="],
"magic-string": ["magic-string@0.27.0", "", { "dependencies": { "@jridgewell/sourcemap-codec": "^1.4.13" } }, "sha512-8UnnX2PeRAPZuN12svgR9j7M1uWMovg/CEnIwIG0LFkXSJJe4PdfUGiTGl8V9bsBHFUtfVINcSyYxd7q+kx9fA=="],
@@ -2585,6 +2698,8 @@
"media-typer": ["media-typer@0.3.0", "", {}, "sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ=="],
"memoize-one": ["memoize-one@6.0.0", "", {}, "sha512-rkpe71W0N0c0Xz6QD0eJETuWAJGnJ9afsl1srmwPrI+yBCkge5EycXXbYRyvL29zZVUWQCY7InPRCv3GDXuZNw=="],
"merge-descriptors": ["merge-descriptors@1.0.3", "", {}, "sha512-gaNvAS7TZ897/rVaZ0nMtAyxNyi/pdbjbAwUpFQpN70GqnVfOiXpeUUMKRBmzXaSQ8DdTX4/0ms62r2K+hE6mQ=="],
"merge-stream": ["merge-stream@2.0.0", "", {}, "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w=="],
@@ -2693,6 +2808,12 @@
"mlly": ["mlly@1.8.0", "", { "dependencies": { "acorn": "^8.15.0", "pathe": "^2.0.3", "pkg-types": "^1.3.1", "ufo": "^1.6.1" } }, "sha512-l8D9ODSRWLe2KHJSifWGwBqpTZXIXTeo8mlKjY+E2HAakaTeNpqAyBZ8GSqLzHgw4XmHmC8whvpjJNMbFZN7/g=="],
"moment": ["moment@2.30.1", "", {}, "sha512-uEmtNhbDOrWPFS+hdjFCBfy9f2YoyzRpwcl+DqpC6taX21FzsTLQVbMV/W7PzNSX6x/bhC1zA3c2UQ5NzH6how=="],
"moment-range": ["moment-range@4.0.2", "", { "dependencies": { "es6-symbol": "^3.1.0" }, "peerDependencies": { "moment": ">= 2" } }, "sha512-n8sceWwSTjmz++nFHzeNEUsYtDqjgXgcOBzsHi+BoXQU2FW+eU92LUaK8gqOiSu5PG57Q9sYj1Fz4LRDj4FtKA=="],
"moment-timezone": ["moment-timezone@0.6.0", "", { "dependencies": { "moment": "^2.29.4" } }, "sha512-ldA5lRNm3iJCWZcBCab4pnNL3HSZYXVb/3TYr75/1WCTWYuTqYUb5f/S384pncYjJ88lbO8Z4uPDvmoluHJc8Q=="],
"morgan": ["morgan@1.10.1", "", { "dependencies": { "basic-auth": "~2.0.1", "debug": "2.6.9", "depd": "~2.0.0", "on-finished": "~2.3.0", "on-headers": "~1.1.0" } }, "sha512-223dMRJtI/l25dJKWpgij2cMtywuG/WiUKXdvwfbhGKBhy1puASqXwFzmWZ7+K73vUPoR7SS2Qz2cI/g9MKw0A=="],
"mri": ["mri@1.2.0", "", {}, "sha512-tzzskb3bG8LvYGFF/mDTpq3jpI6Q9wc3LEmBaghu+DdCssd1FakN7Bc0hVNmEyGq1bq3RgfkCb3cmQLpNPOroA=="],
@@ -2725,10 +2846,14 @@
"neo-async": ["neo-async@2.6.2", "", {}, "sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw=="],
"next-tick": ["next-tick@1.1.0", "", {}, "sha512-CXdUiJembsNjuToQvxayPZF9Vqht7hewsvy2sOWafLvi2awflj9mOC6bHIg50orX8IJvWKY9wYQ/zB2kogPslQ=="],
"node-domexception": ["node-domexception@1.0.0", "", {}, "sha512-/jKZoMpw0F8GRwl4/eLROPA3cfcXtLApP0QzLmUT/HuPCZWyB7IY9ZrMeKw2O/nFIqPQB3PVM9aYm0F312AXDQ=="],
"node-fetch": ["node-fetch@2.7.0", "", { "dependencies": { "whatwg-url": "^5.0.0" }, "peerDependencies": { "encoding": "^0.1.0" }, "optionalPeers": ["encoding"] }, "sha512-c4FRfUm/dbcWZ7U+1Wq0AwCyFL+3nt2bEw05wfxSz+DWpWsitgmSgYmy2dQdWyKC1694ELPqMs/YzUSNozLt8A=="],
"node-ical": ["node-ical@0.21.0", "", { "dependencies": { "moment-timezone": "^0.6.0", "rrule": "2.8.1" } }, "sha512-69YB4OnngmGJjGKR5PudfiWEDsjFWi6w2dgHsiyDUaFRiR/3uX4VZG0SjkkiaKrvMFcuqwsoUImfRcoLTVr6uQ=="],
"node-releases": ["node-releases@2.0.27", "", {}, "sha512-nmh3lCkYZ3grZvqcCH+fjmQ7X+H0OeZgP40OierEaAptX4XofMh5kwNbWh7lBduUzCcV/8kZ+NDLCwm2iorIlA=="],
"normalize-path": ["normalize-path@3.0.0", "", {}, "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA=="],
@@ -2965,6 +3090,10 @@
"react": ["react@19.2.3", "", {}, "sha512-Ku/hhYbVjOQnXDZFv2+RibmLFGwFdeeKHFcOTlrt7xplBnya5OGn/hIRDsqDiSUcfORsDC7MPxwork8jBwsIWA=="],
"react-big-calendar": ["react-big-calendar@1.19.4", "", { "dependencies": { "@babel/runtime": "^7.20.7", "clsx": "^1.2.1", "date-arithmetic": "^4.1.0", "dayjs": "^1.11.7", "dom-helpers": "^5.2.1", "globalize": "^0.1.1", "invariant": "^2.2.4", "lodash": "^4.17.21", "lodash-es": "^4.17.21", "luxon": "^3.2.1", "memoize-one": "^6.0.0", "moment": "^2.29.4", "moment-timezone": "^0.5.40", "prop-types": "^15.8.1", "react-overlays": "^5.2.1", "uncontrollable": "^7.2.1" }, "peerDependencies": { "react": "^16.14.0 || ^17 || ^18 || ^19", "react-dom": "^16.14.0 || ^17 || ^18 || ^19" } }, "sha512-FrvbDx2LF6JAWFD96LU1jjloppC5OgIvMYUYIPzAw5Aq+ArYFPxAjLqXc4DyxfsQDN0TJTMuS/BIbcSB7Pg0YA=="],
"react-chartjs-2": ["react-chartjs-2@5.3.1", "", { "peerDependencies": { "chart.js": "^4.1.1", "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0" } }, "sha512-h5IPXKg9EXpjoBzUfyWJvllMjG2mQ4EiuHQFhms/AjUm0XSZHhyRy2xVmLXHKrtcdrPO4mnGqRtYoD0vp95A0A=="],
"react-currency-input-field": ["react-currency-input-field@3.10.0", "", { "peerDependencies": { "react": "^16.9.0 || ^17.0.0 || ^18.0.0 || ^19.0.0" } }, "sha512-GRmZogHh1e1LrmgXg/fKHSuRLYUnj/c/AumfvfuDMA0UX1mDR6u2NR0fzDemRdq4tNHNLucJeJ2OKCr3ehqyDA=="],
"react-custom-scrollbars": ["react-custom-scrollbars@4.2.1", "", { "dependencies": { "dom-css": "^2.0.0", "prop-types": "^15.5.10", "raf": "^3.1.0" }, "peerDependencies": { "react": "^0.14.0 || ^15.0.0 || ^16.0.0", "react-dom": "^0.14.0 || ^15.0.0 || ^16.0.0" } }, "sha512-VtJTUvZ7kPh/auZWIbBRceGPkE30XBYe+HktFxuMWBR2eVQQ+Ur6yFJMoaYcNpyGq22uYJ9Wx4UAEcC0K+LNPQ=="],
@@ -2991,10 +3120,14 @@
"react-lifecycles-compat": ["react-lifecycles-compat@3.0.4", "", {}, "sha512-fBASbA6LnOU9dOU2eW7aQ8xmYBSXUIWr+UmF9b1efZBazGNO+rcXT/icdKnYm2pTwcRylVUYwW7H1PHfLekVzA=="],
"react-markdown": ["react-markdown@10.1.0", "", { "dependencies": { "@types/hast": "^3.0.0", "@types/mdast": "^4.0.0", "devlop": "^1.0.0", "hast-util-to-jsx-runtime": "^2.0.0", "html-url-attributes": "^3.0.0", "mdast-util-to-hast": "^13.0.0", "remark-parse": "^11.0.0", "remark-rehype": "^11.0.0", "unified": "^11.0.0", "unist-util-visit": "^5.0.0", "vfile": "^6.0.0" }, "peerDependencies": { "@types/react": ">=18", "react": ">=18" } }, "sha512-qKxVopLT/TyA6BX3Ue5NwabOsAzm0Q7kAPwq6L+wWDwisYs7R8vZ0nRXqq6rkueboxpkjvLGU9fWifiX/ZZFxQ=="],
"react-medium-image-zoom": ["react-medium-image-zoom@5.4.0", "", { "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" } }, "sha512-BsE+EnFVQzFIlyuuQrZ9iTwyKpKkqdFZV1ImEQN573QPqGrIUuNni7aF+sZwDcxlsuOMayCr6oO/PZR/yJnbRg=="],
"react-otp-input": ["react-otp-input@3.1.1", "", { "peerDependencies": { "react": ">=16.8.6 || ^17.0.0 || ^18.0.0", "react-dom": ">=16.8.6 || ^17.0.0 || ^18.0.0" } }, "sha512-bjPavgJ0/Zmf/AYi4onj8FbH93IjeD+e8pWwxIJreDEWsU1ILR5fs8jEJmMGWSBe/yyvPP6X/W6Mk9UkOCkTPw=="],
"react-overlays": ["react-overlays@5.2.1", "", { "dependencies": { "@babel/runtime": "^7.13.8", "@popperjs/core": "^2.11.6", "@restart/hooks": "^0.4.7", "@types/warning": "^3.0.0", "dom-helpers": "^5.2.0", "prop-types": "^15.7.2", "uncontrollable": "^7.2.1", "warning": "^4.0.3" }, "peerDependencies": { "react": ">=16.3.0", "react-dom": ">=16.3.0" } }, "sha512-GLLSOLWr21CqtJn8geSwQfoJufdt3mfdsnIiQswouuQ2MMPns+ihZklxvsTDKD3cR2tF8ELbi5xUsvqVhR6WvA=="],
"react-photo-album": ["react-photo-album@2.4.1", "", { "peerDependencies": { "react": ">=16.8.0" } }, "sha512-dzqP5QbYAugA0uZTl3qsVldckzDXYDkDOvA8CpACl51hSEfhJmCfwhbnI4WBHnETQHv48nnNQ1jhrulst8njLA=="],
"react-refresh": ["react-refresh@0.17.0", "", {}, "sha512-z6F7K9bV85EfseRCp2bzrpyQ0Gkw1uLoCel9XBVWPg/TjRj94SkJzUTGfOa4bs7iJvBWtQG0Wq7wnI0syw3EBQ=="],
@@ -3015,6 +3148,8 @@
"react-syntax-highlighter": ["react-syntax-highlighter@15.6.6", "", { "dependencies": { "@babel/runtime": "^7.3.1", "highlight.js": "^10.4.1", "highlightjs-vue": "^1.0.0", "lowlight": "^1.17.0", "prismjs": "^1.30.0", "refractor": "^3.6.0" }, "peerDependencies": { "react": ">= 0.14.0" } }, "sha512-DgXrc+AZF47+HvAPEmn7Ua/1p10jNoVZVI/LoPiYdtY+OM+/nG5yefLHKJwdKqY1adMuHFbeyBaG9j64ML7vTw=="],
"react-to-print": ["react-to-print@3.2.0", "", { "peerDependencies": { "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ~19" } }, "sha512-IX2D0mebKMgYTBD6s5tf9B7YRL3RFWjRoevYK8JKgRwn94Rep7PFZyeOTGjCmXofKB1SKzvPSzDrAMG4I2PIwg=="],
"react-toastify": ["react-toastify@11.0.5", "", { "dependencies": { "clsx": "^2.1.1" }, "peerDependencies": { "react": "^18 || ^19", "react-dom": "^18 || ^19" } }, "sha512-EpqHBGvnSTtHYhCPLxML05NLY2ZX0JURbAdNYa6BUkk+amz4wbKBQvoKQAB0ardvSarUBuY4Q4s1sluAzZwkmA=="],
"react-tooltip": ["react-tooltip@5.30.0", "", { "dependencies": { "@floating-ui/dom": "^1.6.1", "classnames": "^2.3.0" }, "peerDependencies": { "react": ">=16.14.0", "react-dom": ">=16.14.0" } }, "sha512-Yn8PfbgQ/wmqnL7oBpz1QiDaLKrzZMdSUUdk7nVeGTwzbxCAJiJzR4VSYW+eIO42F1INt57sPUmpgKv0KwJKtg=="],
@@ -3421,6 +3556,8 @@
"tweetnacl": ["tweetnacl@0.14.5", "", {}, "sha512-KXXFFdAbFXY4geFIwoyNK+f5Z1b7swfXABfL7HXCmoIWMKU3dmS26672A4EeQtDzLKy7SXmfBu51JolvEKwtGA=="],
"type": ["type@2.7.3", "", {}, "sha512-8j+1QmAbPvLZow5Qpi6NCaN8FB60p/6x8/vfNqOk/hC+HuvFZhL4+WfekuhQLiqFZXOgQdrs3B+XxEmCc6b3FQ=="],
"type-check": ["type-check@0.4.0", "", { "dependencies": { "prelude-ls": "^1.2.1" } }, "sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew=="],
"type-detect": ["type-detect@4.1.0", "", {}, "sha512-Acylog8/luQ8L7il+geoSxhEkazvkslg7PSNKOX59mbB9cOveP5aq9h74Y7YU8yDpJwetzQQrfIwtf4Wp4LKcw=="],
@@ -3451,6 +3588,8 @@
"unbox-primitive": ["unbox-primitive@1.1.0", "", { "dependencies": { "call-bound": "^1.0.3", "has-bigints": "^1.0.2", "has-symbols": "^1.1.0", "which-boxed-primitive": "^1.1.1" } }, "sha512-nWJ91DjeOkej/TA8pXQ3myruKpKEYgqvpw9lz4OPHj/NWFNluYrjbz9j01CJ8yKQd2g4jFoOkINCTW2I5LEEyw=="],
"uncontrollable": ["uncontrollable@7.2.1", "", { "dependencies": { "@babel/runtime": "^7.6.3", "@types/react": ">=16.9.11", "invariant": "^2.2.4", "react-lifecycles-compat": "^3.0.4" }, "peerDependencies": { "react": ">=15.0.0" } }, "sha512-svtcfoTADIB0nT9nltgjujTi7BzVmwjZClOmskKu/E8FW9BXzg9os8OLr4f8Dlnk0rYWJIWr4wv9eKUXiQvQwQ=="],
"undici": ["undici@7.18.2", "", {}, "sha512-y+8YjDFzWdQlSE9N5nzKMT3g4a5UBX1HKowfdXh0uvAnTaqqwqB92Jt4UXBAeKekDs5IaDKyJFR4X1gYVCgXcw=="],
"undici-types": ["undici-types@7.16.0", "", {}, "sha512-Zz+aZWSj8LE6zoxD+xrjh4VfkIG8Ya6LvYkZqtUQGJPZjYl53ypCaUwWqo7eI0x66KBGeRo+mlBEkMSeSZ38Nw=="],
@@ -3545,6 +3684,8 @@
"w3c-xmlserializer": ["w3c-xmlserializer@5.0.0", "", { "dependencies": { "xml-name-validator": "^5.0.0" } }, "sha512-o8qghlI8NZHU1lLPrpi2+Uq7abh4GGPpYANlalzWxyWteJOCsr/P+oPBA49TOLu5FTZO4d3F9MnWJfiMo4BkmA=="],
"warning": ["warning@4.0.3", "", { "dependencies": { "loose-envify": "^1.0.0" } }, "sha512-rpJyN222KWIvHJ/F53XSZv0Zl/accqHR8et1kpaMTD/fLCRxtV8iX8czMzY7sVZupTI3zcUTg8eycS2kNF9l6w=="],
"wasm-feature-detect": ["wasm-feature-detect@1.8.0", "", {}, "sha512-zksaLKM2fVlnB5jQQDqKXXwYHLQUVH9es+5TOOHwGOVJOCeRBCiPjwSg+3tN2AdTCzjgli4jijCH290kXb/zWQ=="],
"web-streams-polyfill": ["web-streams-polyfill@3.3.3", "", {}, "sha512-d2JWLCivmZYTSIoge9MsgFCZrt571BikcWGYkjC1khllbTeDlGqZ2D8vD8E/lJa8WGWbb7Plm8/XJYV7IJHZZw=="],
@@ -4053,6 +4194,10 @@
"rc/strip-json-comments": ["strip-json-comments@2.0.1", "", {}, "sha512-4gB8na07fecVVkOI6Rs4e7T6NOTki5EmL7TUduTs6bu3EdnSycntVJ4re8kgZA+wx9IueI2Y11bfbgwtzuE0KQ=="],
"react-big-calendar/clsx": ["clsx@1.2.1", "", {}, "sha512-EcR6r5a8bj6pu3ycsa/E/cKVGuTgZJZdsyUYHOksG/UHIiKfjxzRxYJpyVBwYaQeOvghal9fcc4PidlgzugAQg=="],
"react-big-calendar/moment-timezone": ["moment-timezone@0.5.48", "", { "dependencies": { "moment": "^2.29.4" } }, "sha512-f22b8LV1gbTO2ms2j2z13MuPogNoh5UzxL3nzNAYKGraILnbGc9NEE6dyiiiLv46DGRb8A4kg8UKWLjPthxBHw=="],
"react-datepicker/@floating-ui/react": ["@floating-ui/react@0.27.16", "", { "dependencies": { "@floating-ui/react-dom": "^2.1.6", "@floating-ui/utils": "^0.2.10", "tabbable": "^6.0.0" }, "peerDependencies": { "react": ">=17.0.0", "react-dom": ">=17.0.0" } }, "sha512-9O8N4SeG2z++TSM8QA/KTeKFBVCNEz/AGS7gWPJf6KFRzmRWixFRnCnkPHRDwSVZW6QPDO6uT0P2SpWNKCc9/g=="],
"react-docgen/doctrine": ["doctrine@3.0.0", "", { "dependencies": { "esutils": "^2.0.2" } }, "sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w=="],

View File

@@ -244,7 +244,7 @@ export default function useQRLoginSession({
// Connect WebSocket
connectWebSocket(sessionId)
} catch (error) {
console.error('Failed to initialize QR session:', error)
console.error('Failed to initialize QR session: ', error)
setStatus('error')
toast.error(t('messages.unknownError'))
}

View File

@@ -32,7 +32,7 @@ const addFontToStylesheet = (font: FontFamily) => {
sheet.insertRule(fontFaceRule, ruleIndex)
ruleIndices.push(ruleIndex)
} catch (err) {
console.error('Failed to insert font rule:', fontFaceRule, err)
console.error('Failed to insert font rule: ', fontFaceRule, err)
}
})

View File

@@ -78,8 +78,8 @@ i18n
}
}
})
.catch(() => {
console.error('Failed to initialize i18n')
.catch(err => {
console.error('Failed to initialize i18n: ', err)
})
export default i18n

View File

@@ -7,7 +7,6 @@ import { type Logger, createLogger } from './logger'
export interface CLILogger extends Logger {
success(message: string): void
print(message: string): void
actionableError(message: string, suggestion: string): void
}
function wrapWithCLIMethods(logger: Logger): CLILogger {
@@ -25,12 +24,7 @@ function wrapWithCLIMethods(logger: Logger): CLILogger {
print(message: string) {
logger.info(message)
},
actionableError(message: string, suggestion: string) {
logger.error(message)
logger.info(
`${chalk.yellow('→')} ${chalk.dim('Suggestion:')} ${suggestion}`
)
},
child(bindings: object): CLILogger {
return wrapWithCLIMethods(logger.child(bindings))
}

View File

@@ -62,8 +62,8 @@ i18n
}
}
})
.catch(() => {
console.error('Failed to initialize i18n')
.catch(err => {
console.error('Failed to initialize i18n: ', err)
})
export default i18n

View File

@@ -14,13 +14,15 @@ export default function EncryptionWrapper({
}
if (error) {
console.error('Encryption initialization error: ', error)
return (
<EmptyStateScreen
icon="tabler:lock-off"
message={{
title: 'Encryption failed',
description:
'Failed to initialize encryption. Please try again later.'
'Failed to initialize encryption. Check the console for more details.'
}}
/>
)

View File

@@ -33,7 +33,7 @@ export default function EncryptionProvider({
initializeEncryption(apiHost)
.then(() => setReady(true))
.catch(err => {
console.error('Failed to initialize encryption:', err)
console.error('Failed to initialize encryption: ', err)
setError(err.message)
})
}, [apiHost, ready])

View File

@@ -43,9 +43,8 @@ export async function downloadPocketBaseBinary(): Promise<void> {
osName = 'windows'
break
default:
logger.actionableError(
`Unsupported platform: ${platform}`,
'PocketBase supports darwin, linux, and windows'
logger.error(
`Unsupported platform: ${platform}. PocketBase supports darwin, linux, and windows`
)
process.exit(1)
}
@@ -63,9 +62,8 @@ export async function downloadPocketBaseBinary(): Promise<void> {
archName = 'amd64'
break
default:
logger.actionableError(
`Unsupported architecture: ${arch}`,
'PocketBase supports arm64 and amd64'
logger.error(
`Unsupported architecture: ${arch}. PocketBase supports arm64 and amd64`
)
process.exit(1)
}
@@ -116,10 +114,8 @@ export async function downloadPocketBaseBinary(): Promise<void> {
logger.success(`Downloaded PocketBase ${chalk.blue(`v${PB_VERSION}`)}`)
} catch (error) {
logger.actionableError(
`Failed to download PocketBase: ${error instanceof Error ? error.message : 'Unknown error'}`,
'Check your internet connection and try again'
)
logger.error('Failed to download PocketBase.')
logger.debug(`Error details: ${error}`)
process.exit(1)
}
}

View File

@@ -14,9 +14,8 @@ export function validatePocketBaseNotInitialized(
const pbInitialized = fs.existsSync(PB_DATA_DIR)
if (pbInitialized && exitOnFailure) {
logger.actionableError(
`PocketBase is already initialized in ${chalk.blue(PB_DATA_DIR)}, aborting.`,
'If you want to re-initialize, please remove the existing pb_data folder in the database directory.'
logger.warn(
`PocketBase is already initialized in ${chalk.blue(PB_DATA_DIR)}, skipping.`
)
process.exit(1)
}
@@ -48,10 +47,8 @@ export function createPocketBaseSuperuser(
logger.success('Created superuser')
} catch (error) {
logger.actionableError(
`Failed to create superuser: ${error instanceof Error ? error.message : 'Unknown error'}`,
'Check your PocketBase configuration and try again'
)
logger.error(`Failed to create superuser`)
logger.debug(`Error details: ${error}`)
process.exit(1)
}
}

View File

@@ -31,13 +31,8 @@ export async function generateMigrationsHandler(
logger.success('Migrations generated successfully')
} catch (error) {
logger.actionableError(
'Migration script failed',
'Check the schema definitions and PocketBase configuration'
)
logger.debug(
`Error details: ${error instanceof Error ? error.message : String(error)}`
)
logger.error('Migration script failed')
logger.debug(`Error details: ${error}`)
killPB?.()
process.exit(1)

View File

@@ -1,4 +1,3 @@
import chalk from 'chalk'
import fs from 'fs'
import { PB_BINARY_PATH, PB_DIR, PB_KWARGS } from '@/constants/db'
@@ -25,17 +24,15 @@ export const SERVICE_COMMANDS: Record<string, ServiceConfig> = {
}
if (checkPortInUse(8090)) {
logger.actionableError(
'No Pocketbase instance found running, but port 8090 is already in use.',
'Please free up the port. Are you using the port for another application? (e.g., port forwarding, etc.)'
logger.error(
'No Pocketbase instance found running, but port 8090 is already in use.'
)
process.exit(1)
}
if (!fs.existsSync(PB_BINARY_PATH)) {
logger.actionableError(
`PocketBase binary does not exist: ${PB_BINARY_PATH}`,
`Please run "${chalk.blue('bun forge db init')}" to initialize the database`
logger.error(
`PocketBase binary does not exist: ${PB_BINARY_PATH}. Please run "bun forge db init" to initialize the database.`
)
process.exit(1)
}
@@ -57,10 +54,7 @@ export const SERVICE_COMMANDS: Record<string, ServiceConfig> = {
const PORT = process.env.PORT || '3636'
if (checkPortInUse(Number(PORT))) {
logger.actionableError(
`Port ${PORT} is already in use.`,
'Please free up the port or set a different PORT environment variable.'
)
logger.error(`Port ${PORT} is already in use.`)
process.exit(1)
}

View File

@@ -65,10 +65,7 @@ export async function startAllServices(): Promise<void> {
prefixColors: ['cyan', 'green', 'magenta']
})
} catch (error) {
logger.actionableError(
'Failed to start all services',
'Ensure PocketBase is properly configured and all dependencies are installed'
)
logger.error('Failed to start all services')
logger.debug(`Error details: ${error}`)
process.exit(1)
}

View File

@@ -30,10 +30,7 @@ export function devHandler(service: string, extraArgs: string[] = []): void {
try {
startSingleService(service, extraArgs)
} catch (error) {
logger.actionableError(
`Failed to start ${chalk.blue(service)} service`,
'Check if all required dependencies are installed and environment variables are set'
)
logger.error(`Failed to start ${chalk.blue(service)} service`)
logger.debug(`Error details: ${error}`)
process.exit(1)
}

View File

@@ -11,9 +11,8 @@ async function ensureLocaleNotInUse(shortName: string) {
killPB?.()
if (user.language === shortName) {
logger.actionableError(
`Cannot uninstall locale "${shortName}"`,
'This language is currently selected. Change your language first.'
logger.error(
`Cannot uninstall locale "${shortName}". It is currently selected by the user.`
)
process.exit(1)

View File

@@ -19,10 +19,7 @@ function getPackagesToCheck(langCode?: string) {
: localePackages
if (!packagesToCheck?.length) {
logger.actionableError(
`Locale "${langCode}" is not installed`,
'Run "bun forge locales list" to see installed locales'
)
logger.error(`Locale "${langCode}" is not installed`)
process.exit(0)
}

View File

@@ -20,9 +20,8 @@ export default async function validateLocalesAuthor(modulePath: string) {
if (usernamePrefix === 'lifeforge') {
validateMaintainerAccess(auth.username || '')
} else {
logger.actionableError(
`Cannot publish as "${auth.username}" - package belongs to "${usernamePrefix}"`,
`You can only publish packages starting with @lifeforge/${auth.username}--`
logger.error(
`Cannot publish as "${auth.username}" - package belongs to "${usernamePrefix}". You can only publish packages starting with @lifeforge/${auth.username}--`
)
process.exit(1)
}

View File

@@ -15,17 +15,15 @@ export async function installLocaleHandler(langCode: string): Promise<void> {
)
if (!/^@lifeforge\/lang-[a-z]{2}(-[A-Z]{2})?$/i.test(fullName)) {
logger.actionableError(
`Invalid locale name: ${chalk.blue(langCode)}`,
'Locale names should follow the format "xx" or "xx-XX", where "xx" is a two-letter language code and "XX" is a two-letter country code.'
logger.error(
`Invalid locale name: ${chalk.blue(langCode)}. Locale names should follow the format "xx" or "xx-XX", where "xx" is a two-letter language code and "XX" is a two-letter country code.`
)
process.exit(1)
}
if (fs.existsSync(targetDir)) {
logger.actionableError(
`Locale already exists at locales/${shortName}`,
`Remove it first with: bun forge locales uninstall ${shortName}`
logger.error(
`Locale already exists at locales/${shortName}. Remove it first with: bun forge locales uninstall ${shortName}`
)
process.exit(1)
@@ -41,10 +39,8 @@ export async function installLocaleHandler(langCode: string): Promise<void> {
logger.success(`Installed ${chalk.blue(fullName)}`)
} catch (error) {
logger.actionableError(
`Failed to install ${chalk.blue(fullName)}`,
'Make sure the locale exists in the registry'
)
throw error
logger.error(`Failed to install ${chalk.blue(fullName)}`)
logger.debug(`Error details: ${error}`)
process.exit(1)
}
}

View File

@@ -16,12 +16,9 @@ export async function publishLocaleHandler(langCode: string): Promise<void> {
const { fullName, targetDir } = normalizePackage(langCode, 'locale')
if (!fs.existsSync(targetDir)) {
logger.actionableError(
`Locale "${langCode}" not found in locales/`,
'Run "bun forge locales list" to see available locales'
)
logger.error(`Locale "${langCode}" not found in locales/`)
return
process.exit(1)
}
logger.info('Validating locale structure...')
@@ -48,11 +45,8 @@ export async function publishLocaleHandler(langCode: string): Promise<void> {
} catch (error) {
revertPackageVersion(targetDir, oldVersion)
logger.actionableError(
`Failed to publish ${chalk.blue(fullName)}`,
'Check if you are properly authenticated with the registry'
)
throw error
logger.error(`Failed to publish ${chalk.blue(fullName)}`)
logger.debug(`Error details: ${error}`)
process.exit(1)
}
}

View File

@@ -19,12 +19,9 @@ export async function uninstallLocaleHandler(langCode: string): Promise<void> {
const found = findPackageName(fullName)
if (!found) {
logger.actionableError(
`Locale "${shortName}" is not installed`,
'Run "bun forge locales list" to see installed locales'
)
logger.error(`Locale "${shortName}" is not installed`)
return
process.exit(1)
}
await ensureLocaleNotInUse(shortName)

View File

@@ -32,7 +32,8 @@ export async function upgradeLocaleHandler(langCode?: string): Promise<void> {
logger.success(`Upgraded ${chalk.blue(upgrade.name)}`)
upgradedCount++
} catch (error) {
logger.error(`Failed to upgrade ${chalk.blue(upgrade.name)}: ${error}`)
logger.error(`Failed to upgrade ${chalk.blue(upgrade.name)}`)
logger.debug(`Error details: ${error}`)
}
}

View File

@@ -29,10 +29,7 @@ export function validateLocaleStructureHandler(lang: string) {
const { targetDir } = normalizePackage(lang, 'locale')
if (!fs.existsSync(targetDir)) {
logger.actionableError(
`Locale "${lang}" not found in locales/`,
'Run "bun forge locales list" to see available locales'
)
logger.error(`Locale "${lang}" not found in locales/`)
process.exit(1)
}
@@ -40,10 +37,7 @@ export function validateLocaleStructureHandler(lang: string) {
const packageJsonPath = path.join(targetDir, 'package.json')
if (!fs.existsSync(packageJsonPath)) {
logger.actionableError(
`Locale "${lang}" is missing package.json`,
'Run "bun forge locales list" to see available locales'
)
logger.error(`Locale "${lang}" is missing package.json`)
process.exit(1)
}
@@ -63,9 +57,8 @@ export function validateLocaleStructureHandler(lang: string) {
}
if (`@lifeforge/${lang}` !== packageJson.data.name) {
logger.actionableError(
`The folder name "${lang}" does not match the package name "${packageJson.data.name}"`,
'Please make sure the folder name matches the package name'
logger.error(
`The folder name "${lang}" does not match the package name "${packageJson.data.name}"`
)
process.exit(1)
@@ -82,10 +75,7 @@ export function validateLocaleStructureHandler(lang: string) {
file.endsWith('.json')
)
) {
logger.actionableError(
`Locale "${lang}" contains non-JSON files`,
'Please make sure all files in the locale directory are JSON files'
)
logger.error(`Locale "${lang}" contains non-JSON files`)
process.exit(1)
}
@@ -96,10 +86,7 @@ export function validateLocaleStructureHandler(lang: string) {
try {
JSON.parse(fs.readFileSync(filePath, 'utf-8'))
} catch {
logger.actionableError(
`Locale "${lang}" contains invalid JSON files "${file}"`,
'Please make sure all files in the locale directory are valid JSON files'
)
logger.error(`Locale "${lang}" contains invalid JSON files "${file}"`)
process.exit(1)
}

View File

@@ -1,6 +1,7 @@
import logger from '@/utils/logger'
import chalk from 'chalk'
import logger from '@/utils/logger'
/**
* Extract username and module name from a package name format
*
@@ -19,9 +20,8 @@ export function parsePackageName(
if (!withoutScope.includes('--')) {
if (!isLibModule) {
logger.actionableError(
`Invalid package name: ${chalk.blue(packageName)}`,
'Package name must include "--" separator (e.g., username--module-name)'
logger.error(
`Invalid package name: ${chalk.blue(packageName)}. Package name must include "--" separator (e.g., username--module-name)`
)
process.exit(1)
}

View File

@@ -17,9 +17,8 @@ export default async function validateModuleAuthor(modulePath: string) {
)
if (!packageJson.success) {
logger.actionableError(
'Invalid package.json',
'Please fix the package.json file'
logger.error(
'Invalid package.json. Please refer to the documentation for the correct format.'
)
process.exit(1)
}
@@ -32,9 +31,8 @@ export default async function validateModuleAuthor(modulePath: string) {
if (usernamePrefix === 'lifeforge') {
validateMaintainerAccess(auth.username || '')
} else {
logger.actionableError(
`Cannot publish as "${auth.username}" - package belongs to "${usernamePrefix}"`,
`You can only publish packages starting with @lifeforge/${auth.username}--`
logger.error(
`Cannot publish as "${auth.username}" - package belongs to "${usernamePrefix}". You can only publish packages starting with @lifeforge/${auth.username}--`
)
process.exit(1)
}

View File

@@ -85,7 +85,8 @@ export async function buildModuleHandler(
})
clientBuiltCount++
} catch (error) {
logger.error(`Failed to build ${shortName} client: ${error}`)
logger.error(`Failed to build ${shortName} client.`)
logger.debug(`Error details: ${error}`)
}
}
}
@@ -100,7 +101,8 @@ export async function buildModuleHandler(
})
serverBuiltCount++
} catch (error) {
logger.error(`Failed to build ${shortName} server: ${error}`)
logger.error(`Failed to build ${shortName} server.`)
logger.debug(`Error details: ${error}`)
}
}
}

View File

@@ -194,10 +194,7 @@ async function compareModule(packageName: string): Promise<boolean | null> {
const { fullName, shortName, targetDir } = normalizePackage(packageName)
if (!fs.existsSync(targetDir)) {
logger.actionableError(
`Module ${chalk.blue(shortName)} is not installed`,
'Run "bun forge modules list" to see installed modules'
)
logger.error(`Module ${chalk.blue(shortName)} is not installed`)
return null
}

View File

@@ -44,26 +44,19 @@ export async function installModuleHandler(
const { fullName, shortName, targetDir } = normalizePackage(moduleName)
if (!/^@lifeforge\/[a-z0-9-_]+--[a-z0-9-_]+$/i.test(fullName)) {
logger.actionableError(
`Invalid module name: ${chalk.blue(moduleName)}`,
'Module names can only contain letters, numbers, hyphens, and underscores.'
logger.error(
`Invalid module name: ${chalk.blue(moduleName)}. Module names can only contain letters, numbers, hyphens, and underscores.`
)
continue
}
if (fs.existsSync(targetDir)) {
logger.actionableError(
`Module already exists at apps/${shortName}`,
`Remove it first with: bun forge modules uninstall ${shortName}`
)
logger.error(`Module already exists at apps/${shortName}`)
continue
}
if (!(await checkPackageExists(fullName))) {
logger.actionableError(
`Module ${chalk.blue(fullName)} does not exist in registry`,
'Check the module name and try again'
)
logger.error(`Module ${chalk.blue(fullName)} does not exist in registry`)
continue
}

View File

@@ -60,10 +60,7 @@ export async function publishModuleHandler(moduleName: string): Promise<void> {
const modulePath = path.join(ROOT_DIR, 'apps', moduleName)
if (!fs.existsSync(modulePath)) {
logger.actionableError(
`Module ${chalk.blue(moduleName)} not found in apps/`,
'Make sure the module exists in the apps directory'
)
logger.error(`Module ${chalk.blue(moduleName)} not found in apps/`)
process.exit(1)
}
@@ -96,10 +93,7 @@ export async function publishModuleHandler(moduleName: string): Promise<void> {
} catch (error) {
revertPackageVersion(modulePath, oldVersion)
logger.actionableError(
`Publish failed for ${chalk.blue(moduleName)}`,
'Check npm authentication and try again'
)
logger.error(`Publish failed for ${chalk.blue(moduleName)}`)
logger.debug(`Error: ${error}`)
process.exit(1)
} finally {

View File

@@ -31,9 +31,8 @@ export async function uninstallModuleHandler(
const { targetDir, fullName } = normalizePackage(moduleName)
if (!findPackageName(fullName, 'apps')) {
logger.actionableError(
`Module ${chalk.blue(fullName)} is not installed`,
'Run "bun forge modules list" to see installed modules'
logger.error(
`Module ${chalk.blue(fullName)} not found in apps/package.json`
)
continue
}

View File

@@ -75,7 +75,8 @@ async function upgradeModule(
return true
} catch (error) {
logger.error(`Failed to upgrade ${chalk.blue(fullName)}: ${error}`)
logger.error(`Failed to upgrade ${chalk.blue(fullName)}.`)
logger.debug(`Error details: ${error}`)
if (fs.existsSync(backupPath)) {
fs.renameSync(backupPath, targetDir)
@@ -105,9 +106,8 @@ export async function upgradeModuleHandler(moduleName?: string): Promise<void> {
const mod = modules[fullName]
if (!mod) {
logger.actionableError(
`Module ${chalk.blue(moduleName)} is not installed`,
'Run "bun forge modules list" to see installed modules'
logger.error(
`Module ${chalk.blue(moduleName)} not found in apps/package.json`
)
process.exit(1)
}

View File

@@ -26,9 +26,8 @@ export function validateProjectArguments(projects: string[] | undefined): void {
const validation = validateProjects(projects, validProjects)
if (!validation.isValid) {
logger.actionableError(
`Invalid project(s): ${validation.invalidProjects.join(', ')}`,
'Available projects: ' + validProjects.join(', ')
logger.error(
`Invalid project(s): ${validation.invalidProjects.join(', ')}. Available projects: ${validProjects.join(', ')}`
)
process.exit(1)
}

View File

@@ -38,8 +38,9 @@ export async function getAPIKey(): Promise<string | null> {
return CryptoJS.AES.decrypt(apiKey.key, MASTER_KEY).toString(
CryptoJS.enc.Utf8
)
} catch {
} catch (error) {
logger.error('Failed to decrypt OpenAI API key.')
logger.debug(`Error details: ${error}`)
return null
} finally {

View File

@@ -34,10 +34,8 @@ export default function executeCommand(
try {
cmd = typeof command === 'function' ? command() : command
} catch (error) {
logger.actionableError(
`Failed to generate command: ${error}`,
'Check the command generation logic for errors'
)
logger.error(`Failed to generate command.`)
logger.debug(`Error details: ${error}`)
process.exit(1)
}
@@ -81,10 +79,7 @@ export default function executeCommand(
throw error
}
logger.actionableError(
`Command execution failed: ${cmd}`,
'Check if the command exists and you have the necessary permissions'
)
logger.error(`Command execution failed: ${cmd}`)
logger.debug(`Error details: ${error}`)
process.exit(1)
}
@@ -138,11 +133,7 @@ export function installPackage(
const installedPath = path.join(ROOT_DIR, 'node_modules', fullName)
if (!fs.existsSync(installedPath)) {
logger.actionableError(
`Failed to install ${fullName}`,
'Check if the package exists in the registry'
)
logger.error(`Failed to find installed package at ${installedPath}`)
process.exit(1)
}

View File

@@ -61,7 +61,8 @@ export function restartServerContainer(): void {
execSync(`docker restart ${SERVER_CONTAINER}`, { stdio: 'inherit' })
logger.success('Server container restarted')
} catch (error) {
logger.error(`Failed to restart Docker server: ${error}`)
logger.error(`Failed to restart Docker server.`)
logger.debug(`Error details: ${error}`)
}
}
@@ -91,7 +92,8 @@ export function stopService(serviceName: string): void {
executeCommand(`docker stop ${serviceName}`, { stdio: 'inherit' })
logger.success(`Service ${serviceName} stopped`)
} catch (error) {
logger.error(`Failed to stop Docker service ${serviceName}: ${error}`)
logger.error(`Failed to stop Docker service ${serviceName}.`)
logger.debug(`Error details: ${error}`)
}
}
@@ -105,6 +107,7 @@ export function startService(serviceName: string): void {
executeCommand(`docker start ${serviceName}`, { stdio: 'inherit' })
logger.success(`Service ${serviceName} started`)
} catch (error) {
logger.error(`Failed to start Docker service ${serviceName}: ${error}`)
logger.error(`Failed to start Docker service ${serviceName}.`)
logger.debug(`Error details: ${error}`)
}
}

View File

@@ -28,10 +28,8 @@ export function validateMaintainerAccess(username: string): void {
process.exit(1)
} catch (error) {
logger.actionableError(
`Failed to check maintainer access for ${username}.`,
`Error: ${error instanceof Error ? error.message : String(error)}`
)
logger.error(`Failed to check maintainer access for ${username}.`)
logger.debug(`Error details: ${error}`)
process.exit(1)
}
@@ -74,7 +72,8 @@ export function getGithubUser(): { name: string; email: string } | null {
return null
} catch (error) {
logger.debug(`Failed to fetch GitHub user info: ${error}`)
logger.error(`Failed to fetch GitHub user info.`)
logger.debug(`Error details: ${error}`)
return null
}

View File

@@ -33,9 +33,8 @@ export function getEnvVars<const T extends readonly string[]>(
}
if (missing.length > 0) {
logger.actionableError(
`Missing required environment variables: ${missing.join(', ')}`,
'Use the "forge db init" command to set up the environment variables, or set them manually in your env/.env.local file'
logger.error(
`Missing required environment variables: ${missing.join(', ')}`
)
process.exit(1)
}
@@ -62,10 +61,7 @@ export function getEnvVar(varName: string, fallback?: string): string {
return fallback
}
logger.actionableError(
`Missing required environment variable: ${varName}`,
'Use the "forge db init" command to set up the environment variables, or set them manually in your env/.env.local file'
)
logger.error(`Missing required environment variable: ${varName}`)
process.exit(1)
}

View File

@@ -49,6 +49,7 @@ export default function initGitRepository(targetDir: string): void {
logger.debug(`Git repository initialized with remote: ${repoUrl}`)
} catch (error) {
logger.debug(`Failed to initialize git repository: ${error}`)
logger.error(`Failed to initialize git repository.`)
logger.debug(`Error details: ${error}`)
}
}

View File

@@ -57,10 +57,7 @@ function ensurePackageJsonExists(target: PackageJsonTarget): void {
}
if (target === 'root') {
logger.actionableError(
'Root package.json not found',
'Ensure you are in the LifeForge project root directory'
)
logger.error('Root package.json not found')
process.exit(1)
}

View File

@@ -63,9 +63,8 @@ export function checkRunningPBInstances(exitOnError = true): boolean {
if (validPids.length > 0) {
if (exitOnError) {
logger.actionableError(
`PocketBase is already running (PID: ${validPids.join(', ')})`,
'Stop the existing instance with "pkill -f pocketbase" before proceeding'
logger.error(
`PocketBase is already running (PID: ${validPids.join(', ')})`
)
process.exit(1)
}
@@ -108,10 +107,7 @@ export async function startPBServer(): Promise<number> {
}
if (output.includes('bind: address already in use')) {
logger.actionableError(
'Port 8090 is already in use',
'Run "pkill -f pocketbase" to stop existing instances, or check for other apps using port 8090'
)
logger.error('Port 8090 is already in use')
process.exit(1)
}
})
@@ -160,10 +156,10 @@ export async function startPocketbase(): Promise<(() => void) | null> {
killExistingProcess(pbPid)
}
} catch (error) {
logger.actionableError(
`Failed to start PocketBase server: ${error instanceof Error ? error.message : 'Unknown error'}`,
'Run "bun forge db init" to initialize the database or check if the PocketBase binary exists'
logger.error(
`Failed to start PocketBase server: ${error instanceof Error ? error.message : 'Unknown error'}`
)
logger.debug(`Error details: ${error}`)
process.exit(1)
}
}
@@ -230,10 +226,8 @@ export default async function getPBInstance(createNewInstance = true): Promise<{
killPB
}
} catch (error) {
logger.actionableError(
`Authentication failed: ${error instanceof Error ? error.message : 'Unknown error'}`,
'Check PB_EMAIL and PB_PASSWORD in env/.env.local are correct'
)
logger.error(`Pocketbase authentication failed.`)
logger.debug(`Error details: ${error}`)
process.exit(1)
}
}