diff --git a/bun.lock b/bun.lock index 494e62dd..b9f4e297 100644 --- a/bun.lock +++ b/bun.lock @@ -26,21 +26,21 @@ "@vitejs/plugin-legacy": "^8.0.1", "better-typescript-lib": "^2.12.0", "browserslist": "^4.28.2", - "caniuse-lite": "^1.0.30001786", + "caniuse-lite": "^1.0.30001787", "eslint": "^10.2.0", "eslint-plugin-functional": "^9.0.4", "eslint-plugin-jsx-a11y": "^6.10.2", - "eslint-plugin-oxlint": "^1.58.0", + "eslint-plugin-oxlint": "^1.59.0", "eslint-plugin-perfectionist": "^5.8.0", "eslint-plugin-sonarjs": "^4.0.2", "fdir": "^6.5.0", "globals": "^17.4.0", "jiti": "^2.6.1", - "knip": "^6.3.0", + "knip": "^6.3.1", "lightningcss": "^1.32.0", "lightningcss-cli": "^1.32.0", "oxlint": "^1.59.0", - "oxlint-tsgolint": "^0.19.0", + "oxlint-tsgolint": "^0.20.0", "playwright": "^1.59.1", "prettier": "^3.8.1", "prettier-plugin-pkg": "^0.22.1", @@ -53,8 +53,8 @@ "stylelint-declaration-block-no-ignored-properties": "^3.0.0", "stylelint-plugin-logical-css": "^2.1.0", "typescript": "6.0.2", - "typescript-eslint": "^8.58.0", - "vite": "^8.0.5", + "typescript-eslint": "^8.58.1", + "vite": "^8.0.7", "vite-tsconfig-paths": "^6.1.1", }, }, @@ -268,11 +268,11 @@ "@effect/language-service": ["@effect/language-service@0.84.3", "", { "bin": { "effect-language-service": "cli.js" } }, "sha512-zpxi6rLCwst/cBQd7ElwDvt36Y6Jvz8v6bCLnNiOL6OXvdLmqjOFWyzWZdMh92vvBQA/aVKhfIAAOP3o4wKt0A=="], - "@emnapi/core": ["@emnapi/core@1.9.2", "", { "dependencies": { "@emnapi/wasi-threads": "1.2.1", "tslib": "^2.4.0" } }, "sha512-UC+ZhH3XtczQYfOlu3lNEkdW/p4dsJ1r/bP7H8+rhao3TTTMO1ATq/4DdIi23XuGoFY+Cz0JmCbdVl0hz9jZcA=="], + "@emnapi/core": ["@emnapi/core@1.9.1", "", { "dependencies": { "@emnapi/wasi-threads": "1.2.0", "tslib": "^2.4.0" } }, "sha512-mukuNALVsoix/w1BJwFzwXBN/dHeejQtuVzcDsfOEsdpCumXb/E9j8w11h5S54tT1xhifGfbbSm/ICrObRb3KA=="], - "@emnapi/runtime": ["@emnapi/runtime@1.9.2", "", { "dependencies": { "tslib": "^2.4.0" } }, "sha512-3U4+MIWHImeyu1wnmVygh5WlgfYDtyf0k8AbLhMFxOipihf6nrWC4syIm/SwEeec0mNSafiiNnMJwbza/Is6Lw=="], + "@emnapi/runtime": ["@emnapi/runtime@1.9.1", "", { "dependencies": { "tslib": "^2.4.0" } }, "sha512-VYi5+ZVLhpgK4hQ0TAjiQiZ6ol0oe4mBx7mVv7IflsiEp0OWoVsp/+f9Vc1hOhE0TtkORVrI1GvzyreqpgWtkA=="], - "@emnapi/wasi-threads": ["@emnapi/wasi-threads@1.2.1", "", { "dependencies": { "tslib": "^2.4.0" } }, "sha512-uTII7OYF+/Mes/MrcIOYp5yOtSMLBWSIoLPpcgwipoiKbli6k322tcoFsxoIIxPDqW01SQGAgko4EzZi2BNv2w=="], + "@emnapi/wasi-threads": ["@emnapi/wasi-threads@1.2.0", "", { "dependencies": { "tslib": "^2.4.0" } }, "sha512-N10dEJNSsUx41Z6pZsXU8FjPjpBEplgH24sfkmITrBED1/U2Esum9F3lfLrMjKHHjmi557zQn7kR9R+XWXu5Rg=="], "@es-joy/jsdoccomment": ["@es-joy/jsdoccomment@0.86.0", "", { "dependencies": { "@types/estree": "^1.0.8", "@typescript-eslint/types": "^8.58.0", "comment-parser": "1.4.6", "esquery": "^1.7.0", "jsdoc-type-pratt-parser": "~7.2.0" } }, "sha512-ukZmRQ81WiTpDWO6D/cTBM7XbrNtutHKvAVnZN/8pldAwLoJArGOvkNyxPTBGsPjsoaQBJxlH+tE2TNA/92Qgw=="], @@ -428,17 +428,17 @@ "@oxc-resolver/binding-win32-x64-msvc": ["@oxc-resolver/binding-win32-x64-msvc@11.19.1", "", { "os": "win32", "cpu": "x64" }, "sha512-6hIU3RQu45B+VNTY4Ru8ppFwjVS/S5qwYyGhBotmjxfEKk41I2DlGtRfGJndZ5+6lneE2pwloqunlOyZuX/XAw=="], - "@oxlint-tsgolint/darwin-arm64": ["@oxlint-tsgolint/darwin-arm64@0.19.0", "", { "os": "darwin", "cpu": "arm64" }, "sha512-FVOIp5Njte8Z6PpINz7sL5blqSro0pAL8VAHYQ+K5Xm4cOrPQ6DGIhH14oXnbRjzn8Kl69qjz8TPteyn8EqwsQ=="], + "@oxlint-tsgolint/darwin-arm64": ["@oxlint-tsgolint/darwin-arm64@0.20.0", "", { "os": "darwin", "cpu": "arm64" }, "sha512-KKQcIHZHMxqpHUA1VXIbOG6chNCFkUWbQy6M+AFVtPKkA/3xAeJkJ3njoV66bfzwPHRcWQO+kcj5XqtbkjakoA=="], - "@oxlint-tsgolint/darwin-x64": ["@oxlint-tsgolint/darwin-x64@0.19.0", "", { "os": "darwin", "cpu": "x64" }, "sha512-GakDTDACePvqOFq3N4oQCl8SyMMa7VBnqV0gDcXPuK50jdWCUqlxM9tgRJarjyIVvmDEJRGYOen+4uBtVwg4Aw=="], + "@oxlint-tsgolint/darwin-x64": ["@oxlint-tsgolint/darwin-x64@0.20.0", "", { "os": "darwin", "cpu": "x64" }, "sha512-7HeVMuclGfG+NLZi2ybY0T4fMI7/XxO/208rJk+zEIloKkVnlh11Wd241JMGwgNFXn+MLJbOqOfojDb2Dt4L1g=="], - "@oxlint-tsgolint/linux-arm64": ["@oxlint-tsgolint/linux-arm64@0.19.0", "", { "os": "linux", "cpu": "arm64" }, "sha512-Ya0R7somo+KDhhkPtENJ9Q28Fost+aqA3MPe86pEqgmukHFc/KO65PgShOSbIFjZNptELEQvsWL8gDxYZWhH3w=="], + "@oxlint-tsgolint/linux-arm64": ["@oxlint-tsgolint/linux-arm64@0.20.0", "", { "os": "linux", "cpu": "arm64" }, "sha512-zxhUwz+WSxE6oWlZLK2z2ps9yC6ebmgoYmjAl0Oa48+GqkZ56NVgo+wb8DURNv6xrggzHStQxqQxe3mK51HZag=="], - "@oxlint-tsgolint/linux-x64": ["@oxlint-tsgolint/linux-x64@0.19.0", "", { "os": "linux", "cpu": "x64" }, "sha512-yFH378jWc1k/oJmpk+TKpWbKvFieJJvsOHxVMSNFc+ukqs44ZSHVt4HFfAhXAt/bzVK2f7EIDTGp8Hm1OjoJ6Q=="], + "@oxlint-tsgolint/linux-x64": ["@oxlint-tsgolint/linux-x64@0.20.0", "", { "os": "linux", "cpu": "x64" }, "sha512-/1l6FnahC9im8PK+Ekkx/V3yetO/PzZnJegE2FXcv/iXEhbeVxP/ouiTYcUQu9shT1FWJCSNti1VJHH+21Y1dg=="], - "@oxlint-tsgolint/win32-arm64": ["@oxlint-tsgolint/win32-arm64@0.19.0", "", { "os": "win32", "cpu": "arm64" }, "sha512-R6NyAtha7OWxh7NGBeFxqDTGAVl1Xj4xLa8Qj39PKbIDqBeVW8BIb+1nEnRp+Mo/VpRoeoFAcqlBsuMcUMd26Q=="], + "@oxlint-tsgolint/win32-arm64": ["@oxlint-tsgolint/win32-arm64@0.20.0", "", { "os": "win32", "cpu": "arm64" }, "sha512-oPZ5Yz8sVdo7P/5q+i3IKeix31eFZ55JAPa1+RGPoe9PoaYVsdMvR6Jvib6YtrqoJnFPlg3fjEjlEPL8VBKYJA=="], - "@oxlint-tsgolint/win32-x64": ["@oxlint-tsgolint/win32-x64@0.19.0", "", { "os": "win32", "cpu": "x64" }, "sha512-2ePvxcbS5tPOmrQvxR8Kc+IqzdTtlrGeMDv+jjTYfkTFPmh2rF9yxVchi/4WM6js3gt2UauQeMV/tfnZNemENQ=="], + "@oxlint-tsgolint/win32-x64": ["@oxlint-tsgolint/win32-x64@0.20.0", "", { "os": "win32", "cpu": "x64" }, "sha512-4stx8RHj3SP9vQyRF/yZbz5igtPvYMEUR8CUoha4BVNZihi39DpCR8qkU7lpjB5Ga1DRMo2pHaA4bdTOMaY4mw=="], "@oxlint/binding-android-arm-eabi": ["@oxlint/binding-android-arm-eabi@1.59.0", "", { "os": "android", "cpu": "arm" }, "sha512-etYDw/UaEv936AQUd/CRMBVd+e+XuuU6wC+VzOv1STvsTyZenLChepLWqLtnyTTp4YMlM22ypzogDDwqYxv5cg=="], @@ -512,37 +512,37 @@ "@reteps/dockerfmt": ["@reteps/dockerfmt@0.5.2", "", {}, "sha512-Hbr7yen4fP5TxGM54ucXa4o5NwWXatJ6Bd9I8gp0PValYbI4Rug2Gu+rVv7K7o/efQc3F5ctqWJz47rYaa8zBw=="], - "@rolldown/binding-android-arm64": ["@rolldown/binding-android-arm64@1.0.0-rc.12", "", { "os": "android", "cpu": "arm64" }, "sha512-pv1y2Fv0JybcykuiiD3qBOBdz6RteYojRFY1d+b95WVuzx211CRh+ytI/+9iVyWQ6koTh5dawe4S/yRfOFjgaA=="], + "@rolldown/binding-android-arm64": ["@rolldown/binding-android-arm64@1.0.0-rc.13", "", { "os": "android", "cpu": "arm64" }, "sha512-5ZiiecKH2DXAVJTNN13gNMUcCDg4Jy8ZjbXEsPnqa248wgOVeYRX0iqXXD5Jz4bI9BFHgKsI2qmyJynstbmr+g=="], - "@rolldown/binding-darwin-arm64": ["@rolldown/binding-darwin-arm64@1.0.0-rc.12", "", { "os": "darwin", "cpu": "arm64" }, "sha512-cFYr6zTG/3PXXF3pUO+umXxt1wkRK/0AYT8lDwuqvRC+LuKYWSAQAQZjCWDQpAH172ZV6ieYrNnFzVVcnSflAg=="], + "@rolldown/binding-darwin-arm64": ["@rolldown/binding-darwin-arm64@1.0.0-rc.13", "", { "os": "darwin", "cpu": "arm64" }, "sha512-tz/v/8G77seu8zAB3A5sK3UFoOl06zcshEzhUO62sAEtrEuW/H1CcyoupOrD+NbQJytYgA4CppXPzlrmp4JZKA=="], - "@rolldown/binding-darwin-x64": ["@rolldown/binding-darwin-x64@1.0.0-rc.12", "", { "os": "darwin", "cpu": "x64" }, "sha512-ZCsYknnHzeXYps0lGBz8JrF37GpE9bFVefrlmDrAQhOEi4IOIlcoU1+FwHEtyXGx2VkYAvhu7dyBf75EJQffBw=="], + "@rolldown/binding-darwin-x64": ["@rolldown/binding-darwin-x64@1.0.0-rc.13", "", { "os": "darwin", "cpu": "x64" }, "sha512-8DakphqOz8JrMYWTJmWA+vDJxut6LijZ8Xcdc4flOlAhU7PNVwo2MaWBF9iXjJAPo5rC/IxEFZDhJ3GC7NHvug=="], - "@rolldown/binding-freebsd-x64": ["@rolldown/binding-freebsd-x64@1.0.0-rc.12", "", { "os": "freebsd", "cpu": "x64" }, "sha512-dMLeprcVsyJsKolRXyoTH3NL6qtsT0Y2xeuEA8WQJquWFXkEC4bcu1rLZZSnZRMtAqwtrF/Ib9Ddtpa/Gkge9Q=="], + "@rolldown/binding-freebsd-x64": ["@rolldown/binding-freebsd-x64@1.0.0-rc.13", "", { "os": "freebsd", "cpu": "x64" }, "sha512-4wBQFfjDuXYN/SVI8inBF3Aa+isq40rc6VMFbk5jcpolUBTe5cYnMsHZ51nFWsx3PVyyNN3vgoESki0Hmr/4BA=="], - "@rolldown/binding-linux-arm-gnueabihf": ["@rolldown/binding-linux-arm-gnueabihf@1.0.0-rc.12", "", { "os": "linux", "cpu": "arm" }, "sha512-YqWjAgGC/9M1lz3GR1r1rP79nMgo3mQiiA+Hfo+pvKFK1fAJ1bCi0ZQVh8noOqNacuY1qIcfyVfP6HoyBRZ85Q=="], + "@rolldown/binding-linux-arm-gnueabihf": ["@rolldown/binding-linux-arm-gnueabihf@1.0.0-rc.13", "", { "os": "linux", "cpu": "arm" }, "sha512-JW/e4yPIXLms+jmnbwwy5LA/LxVwZUWLN8xug+V200wzaVi5TEGIWQlh8o91gWYFxW609euI98OCCemmWGuPrw=="], - "@rolldown/binding-linux-arm64-gnu": ["@rolldown/binding-linux-arm64-gnu@1.0.0-rc.12", "", { "os": "linux", "cpu": "arm64" }, "sha512-/I5AS4cIroLpslsmzXfwbe5OmWvSsrFuEw3mwvbQ1kDxJ822hFHIx+vsN/TAzNVyepI/j/GSzrtCIwQPeKCLIg=="], + "@rolldown/binding-linux-arm64-gnu": ["@rolldown/binding-linux-arm64-gnu@1.0.0-rc.13", "", { "os": "linux", "cpu": "arm64" }, "sha512-ZfKWpXiUymDnavepCaM6KG/uGydJ4l2nBmMxg60Ci4CbeefpqjPWpfaZM7PThOhk2dssqBAcwLc6rAyr0uTdXg=="], - "@rolldown/binding-linux-arm64-musl": ["@rolldown/binding-linux-arm64-musl@1.0.0-rc.12", "", { "os": "linux", "cpu": "arm64" }, "sha512-V6/wZztnBqlx5hJQqNWwFdxIKN0m38p8Jas+VoSfgH54HSj9tKTt1dZvG6JRHcjh6D7TvrJPWFGaY9UBVOaWPw=="], + "@rolldown/binding-linux-arm64-musl": ["@rolldown/binding-linux-arm64-musl@1.0.0-rc.13", "", { "os": "linux", "cpu": "arm64" }, "sha512-bmRg3O6Z0gq9yodKKWCIpnlH051sEfdVwt+6m5UDffAQMUUqU0xjnQqqAUm+Gu7ofAAly9DqiQDtKu2nPDEABA=="], - "@rolldown/binding-linux-ppc64-gnu": ["@rolldown/binding-linux-ppc64-gnu@1.0.0-rc.12", "", { "os": "linux", "cpu": "ppc64" }, "sha512-AP3E9BpcUYliZCxa3w5Kwj9OtEVDYK6sVoUzy4vTOJsjPOgdaJZKFmN4oOlX0Wp0RPV2ETfmIra9x1xuayFB7g=="], + "@rolldown/binding-linux-ppc64-gnu": ["@rolldown/binding-linux-ppc64-gnu@1.0.0-rc.13", "", { "os": "linux", "cpu": "ppc64" }, "sha512-8Wtnbw4k7pMYN9B/mOEAsQ8HOiq7AZ31Ig4M9BKn2So4xRaFEhtCSa4ZJaOutOWq50zpgR4N5+L/opnlaCx8wQ=="], - "@rolldown/binding-linux-s390x-gnu": ["@rolldown/binding-linux-s390x-gnu@1.0.0-rc.12", "", { "os": "linux", "cpu": "s390x" }, "sha512-nWwpvUSPkoFmZo0kQazZYOrT7J5DGOJ/+QHHzjvNlooDZED8oH82Yg67HvehPPLAg5fUff7TfWFHQS8IV1n3og=="], + "@rolldown/binding-linux-s390x-gnu": ["@rolldown/binding-linux-s390x-gnu@1.0.0-rc.13", "", { "os": "linux", "cpu": "s390x" }, "sha512-D/0Nlo8mQuxSMohNJUF2lDXWRsFDsHldfRRgD9bRgktj+EndGPj4DOV37LqDKPYS+osdyhZEH7fTakTAEcW7qg=="], - "@rolldown/binding-linux-x64-gnu": ["@rolldown/binding-linux-x64-gnu@1.0.0-rc.12", "", { "os": "linux", "cpu": "x64" }, "sha512-RNrafz5bcwRy+O9e6P8Z/OCAJW/A+qtBczIqVYwTs14pf4iV1/+eKEjdOUta93q2TsT/FI0XYDP3TCky38LMAg=="], + "@rolldown/binding-linux-x64-gnu": ["@rolldown/binding-linux-x64-gnu@1.0.0-rc.13", "", { "os": "linux", "cpu": "x64" }, "sha512-eRrPvat2YaVQcwwKi/JzOP6MKf1WRnOCr+VaI3cTWz3ZoLcP/654z90lVCJ4dAuMEpPdke0n+qyAqXDZdIC4rA=="], - "@rolldown/binding-linux-x64-musl": ["@rolldown/binding-linux-x64-musl@1.0.0-rc.12", "", { "os": "linux", "cpu": "x64" }, "sha512-Jpw/0iwoKWx3LJ2rc1yjFrj+T7iHZn2JDg1Yny1ma0luviFS4mhAIcd1LFNxK3EYu3DHWCps0ydXQ5i/rrJ2ig=="], + "@rolldown/binding-linux-x64-musl": ["@rolldown/binding-linux-x64-musl@1.0.0-rc.13", "", { "os": "linux", "cpu": "x64" }, "sha512-PsdONiFRp8hR8KgVjTWjZ9s7uA3uueWL0t74/cKHfM4dR5zXYv4AjB8BvA+QDToqxAFg4ZkcVEqeu5F7inoz5w=="], - "@rolldown/binding-openharmony-arm64": ["@rolldown/binding-openharmony-arm64@1.0.0-rc.12", "", { "os": "none", "cpu": "arm64" }, "sha512-vRugONE4yMfVn0+7lUKdKvN4D5YusEiPilaoO2sgUWpCvrncvWgPMzK00ZFFJuiPgLwgFNP5eSiUlv2tfc+lpA=="], + "@rolldown/binding-openharmony-arm64": ["@rolldown/binding-openharmony-arm64@1.0.0-rc.13", "", { "os": "none", "cpu": "arm64" }, "sha512-hCNXgC5dI3TVOLrPT++PKFNZ+1EtS0mLQwfXXXSUD/+rGlB65gZDwN/IDuxLpQP4x8RYYHqGomlUXzpO8aVI2w=="], - "@rolldown/binding-wasm32-wasi": ["@rolldown/binding-wasm32-wasi@1.0.0-rc.12", "", { "dependencies": { "@napi-rs/wasm-runtime": "^1.1.1" }, "cpu": "none" }, "sha512-ykGiLr/6kkiHc0XnBfmFJuCjr5ZYKKofkx+chJWDjitX+KsJuAmrzWhwyOMSHzPhzOHOy7u9HlFoa5MoAOJ/Zg=="], + "@rolldown/binding-wasm32-wasi": ["@rolldown/binding-wasm32-wasi@1.0.0-rc.13", "", { "dependencies": { "@emnapi/core": "1.9.1", "@emnapi/runtime": "1.9.1", "@napi-rs/wasm-runtime": "^1.1.2" }, "cpu": "none" }, "sha512-viLS5C5et8NFtLWw9Sw3M/w4vvnVkbWkO7wSNh3C+7G1+uCkGpr6PcjNDSFcNtmXY/4trjPBqUfcOL+P3sWy/g=="], - "@rolldown/binding-win32-arm64-msvc": ["@rolldown/binding-win32-arm64-msvc@1.0.0-rc.12", "", { "os": "win32", "cpu": "arm64" }, "sha512-5eOND4duWkwx1AzCxadcOrNeighiLwMInEADT0YM7xeEOOFcovWZCq8dadXgcRHSf3Ulh1kFo/qvzoFiCLOL1Q=="], + "@rolldown/binding-win32-arm64-msvc": ["@rolldown/binding-win32-arm64-msvc@1.0.0-rc.13", "", { "os": "win32", "cpu": "arm64" }, "sha512-Fqa3Tlt1xL4wzmAYxGNFV36Hb+VfPc9PYU+E25DAnswXv3ODDu/yyWjQDbXMo5AGWkQVjLgQExuVu8I/UaZhPQ=="], - "@rolldown/binding-win32-x64-msvc": ["@rolldown/binding-win32-x64-msvc@1.0.0-rc.12", "", { "os": "win32", "cpu": "x64" }, "sha512-PyqoipaswDLAZtot351MLhrlrh6lcZPo2LSYE+VDxbVk24LVKAGOuE4hb8xZQmrPAuEtTZW8E6D2zc5EUZX4Lw=="], + "@rolldown/binding-win32-x64-msvc": ["@rolldown/binding-win32-x64-msvc@1.0.0-rc.13", "", { "os": "win32", "cpu": "x64" }, "sha512-/pLI5kPkGEi44TDlnbio3St/5gUFeN51YWNAk/Gnv6mEQBOahRBh52qVFVBpmrnU01n2yysvBML9Ynu7K4kGAQ=="], - "@rolldown/pluginutils": ["@rolldown/pluginutils@1.0.0-rc.12", "", {}, "sha512-HHMwmarRKvoFsJorqYlFeFRzXZqCt2ETQlEDOb9aqssrnVBB1/+xgTGtuTrIk5vzLNX1MjMtTf7W9z3tsSbrxw=="], + "@rolldown/pluginutils": ["@rolldown/pluginutils@1.0.0-rc.13", "", {}, "sha512-3ngTAv6F/Py35BsYbeeLeecvhMKdsKm4AoOETVhAA+Qc8nrA2I0kF7oa93mE9qnIurngOSpMnQ0x2nQY2FPviA=="], "@sentry-internal/browser-utils": ["@sentry-internal/browser-utils@10.47.0", "", { "dependencies": { "@sentry/core": "10.47.0" } }, "sha512-bVFRAeJWMBcBCvJKIFCMJ1/yQToL4vPGqfmlnDZeypcxkqUDKQ/Y3ziLHXoDL2sx0lagcgU2vH1QhCQ67Aujjw=="], @@ -586,25 +586,25 @@ "@types/unist": ["@types/unist@3.0.3", "", {}, "sha512-ko/gIFJRv177XgZsZcBwnqJN5x/Gien8qNOn0D5bQU/zAzVf9Zt3BlcUiLqhV9y4ARk0GbT3tnUiPNgnTXzc/Q=="], - "@typescript-eslint/eslint-plugin": ["@typescript-eslint/eslint-plugin@8.58.0", "", { "dependencies": { "@eslint-community/regexpp": "^4.12.2", "@typescript-eslint/scope-manager": "8.58.0", "@typescript-eslint/type-utils": "8.58.0", "@typescript-eslint/utils": "8.58.0", "@typescript-eslint/visitor-keys": "8.58.0", "ignore": "^7.0.5", "natural-compare": "^1.4.0", "ts-api-utils": "^2.5.0" }, "peerDependencies": { "@typescript-eslint/parser": "^8.58.0", "eslint": "^8.57.0 || ^9.0.0 || ^10.0.0", "typescript": ">=4.8.4 <6.1.0" } }, "sha512-RLkVSiNuUP1C2ROIWfqX+YcUfLaSnxGE/8M+Y57lopVwg9VTYYfhuz15Yf1IzCKgZj6/rIbYTmJCUSqr76r0Wg=="], + "@typescript-eslint/eslint-plugin": ["@typescript-eslint/eslint-plugin@8.58.1", "", { "dependencies": { "@eslint-community/regexpp": "^4.12.2", "@typescript-eslint/scope-manager": "8.58.1", "@typescript-eslint/type-utils": "8.58.1", "@typescript-eslint/utils": "8.58.1", "@typescript-eslint/visitor-keys": "8.58.1", "ignore": "^7.0.5", "natural-compare": "^1.4.0", "ts-api-utils": "^2.5.0" }, "peerDependencies": { "@typescript-eslint/parser": "^8.58.1", "eslint": "^8.57.0 || ^9.0.0 || ^10.0.0", "typescript": ">=4.8.4 <6.1.0" } }, "sha512-eSkwoemjo76bdXl2MYqtxg51HNwUSkWfODUOQ3PaTLZGh9uIWWFZIjyjaJnex7wXDu+TRx+ATsnSxdN9YWfRTQ=="], - "@typescript-eslint/parser": ["@typescript-eslint/parser@8.58.0", "", { "dependencies": { "@typescript-eslint/scope-manager": "8.58.0", "@typescript-eslint/types": "8.58.0", "@typescript-eslint/typescript-estree": "8.58.0", "@typescript-eslint/visitor-keys": "8.58.0", "debug": "^4.4.3" }, "peerDependencies": { "eslint": "^8.57.0 || ^9.0.0 || ^10.0.0", "typescript": ">=4.8.4 <6.1.0" } }, "sha512-rLoGZIf9afaRBYsPUMtvkDWykwXwUPL60HebR4JgTI8mxfFe2cQTu3AGitANp4b9B2QlVru6WzjgB2IzJKiCSA=="], + "@typescript-eslint/parser": ["@typescript-eslint/parser@8.58.1", "", { "dependencies": { "@typescript-eslint/scope-manager": "8.58.1", "@typescript-eslint/types": "8.58.1", "@typescript-eslint/typescript-estree": "8.58.1", "@typescript-eslint/visitor-keys": "8.58.1", "debug": "^4.4.3" }, "peerDependencies": { "eslint": "^8.57.0 || ^9.0.0 || ^10.0.0", "typescript": ">=4.8.4 <6.1.0" } }, "sha512-gGkiNMPqerb2cJSVcruigx9eHBlLG14fSdPdqMoOcBfh+vvn4iCq2C8MzUB89PrxOXk0y3GZ1yIWb9aOzL93bw=="], - "@typescript-eslint/project-service": ["@typescript-eslint/project-service@8.58.0", "", { "dependencies": { "@typescript-eslint/tsconfig-utils": "^8.58.0", "@typescript-eslint/types": "^8.58.0", "debug": "^4.4.3" }, "peerDependencies": { "typescript": ">=4.8.4 <6.1.0" } }, "sha512-8Q/wBPWLQP1j16NxoPNIKpDZFMaxl7yWIoqXWYeWO+Bbd2mjgvoF0dxP2jKZg5+x49rgKdf7Ck473M8PC3V9lg=="], + "@typescript-eslint/project-service": ["@typescript-eslint/project-service@8.58.1", "", { "dependencies": { "@typescript-eslint/tsconfig-utils": "^8.58.1", "@typescript-eslint/types": "^8.58.1", "debug": "^4.4.3" }, "peerDependencies": { "typescript": ">=4.8.4 <6.1.0" } }, "sha512-gfQ8fk6cxhtptek+/8ZIqw8YrRW5048Gug8Ts5IYcMLCw18iUgrZAEY/D7s4hkI0FxEfGakKuPK/XUMPzPxi5g=="], "@typescript-eslint/scope-manager": ["@typescript-eslint/scope-manager@8.58.0", "", { "dependencies": { "@typescript-eslint/types": "8.58.0", "@typescript-eslint/visitor-keys": "8.58.0" } }, "sha512-W1Lur1oF50FxSnNdGp3Vs6P+yBRSmZiw4IIjEeYxd8UQJwhUF0gDgDD/W/Tgmh73mxgEU3qX0Bzdl/NGuSPEpQ=="], - "@typescript-eslint/tsconfig-utils": ["@typescript-eslint/tsconfig-utils@8.58.0", "", { "peerDependencies": { "typescript": ">=4.8.4 <6.1.0" } }, "sha512-doNSZEVJsWEu4htiVC+PR6NpM+pa+a4ClH9INRWOWCUzMst/VA9c4gXq92F8GUD1rwhNvRLkgjfYtFXegXQF7A=="], + "@typescript-eslint/tsconfig-utils": ["@typescript-eslint/tsconfig-utils@8.58.1", "", { "peerDependencies": { "typescript": ">=4.8.4 <6.1.0" } }, "sha512-JAr2hOIct2Q+qk3G+8YFfqkqi7sC86uNryT+2i5HzMa2MPjw4qNFvtjnw1IiA1rP7QhNKVe21mSSLaSjwA1Olw=="], "@typescript-eslint/type-utils": ["@typescript-eslint/type-utils@8.58.0", "", { "dependencies": { "@typescript-eslint/types": "8.58.0", "@typescript-eslint/typescript-estree": "8.58.0", "@typescript-eslint/utils": "8.58.0", "debug": "^4.4.3", "ts-api-utils": "^2.5.0" }, "peerDependencies": { "eslint": "^8.57.0 || ^9.0.0 || ^10.0.0", "typescript": ">=4.8.4 <6.1.0" } }, "sha512-aGsCQImkDIqMyx1u4PrVlbi/krmDsQUs4zAcCV6M7yPcPev+RqVlndsJy9kJ8TLihW9TZ0kbDAzctpLn5o+lOg=="], "@typescript-eslint/types": ["@typescript-eslint/types@8.58.0", "", {}, "sha512-O9CjxypDT89fbHxRfETNoAnHj/i6IpRK0CvbVN3qibxlLdo5p5hcLmUuCCrHMpxiWSwKyI8mCP7qRNYuOJ0Uww=="], - "@typescript-eslint/typescript-estree": ["@typescript-eslint/typescript-estree@8.58.0", "", { "dependencies": { "@typescript-eslint/project-service": "8.58.0", "@typescript-eslint/tsconfig-utils": "8.58.0", "@typescript-eslint/types": "8.58.0", "@typescript-eslint/visitor-keys": "8.58.0", "debug": "^4.4.3", "minimatch": "^10.2.2", "semver": "^7.7.3", "tinyglobby": "^0.2.15", "ts-api-utils": "^2.5.0" }, "peerDependencies": { "typescript": ">=4.8.4 <6.1.0" } }, "sha512-7vv5UWbHqew/dvs+D3e1RvLv1v2eeZ9txRHPnEEBUgSNLx5ghdzjHa0sgLWYVKssH+lYmV0JaWdoubo0ncGYLA=="], + "@typescript-eslint/typescript-estree": ["@typescript-eslint/typescript-estree@8.58.1", "", { "dependencies": { "@typescript-eslint/project-service": "8.58.1", "@typescript-eslint/tsconfig-utils": "8.58.1", "@typescript-eslint/types": "8.58.1", "@typescript-eslint/visitor-keys": "8.58.1", "debug": "^4.4.3", "minimatch": "^10.2.2", "semver": "^7.7.3", "tinyglobby": "^0.2.15", "ts-api-utils": "^2.5.0" }, "peerDependencies": { "typescript": ">=4.8.4 <6.1.0" } }, "sha512-w4w7WR7GHOjqqPnvAYbazq+Y5oS68b9CzasGtnd6jIeOIeKUzYzupGTB2T4LTPSv4d+WPeccbxuneTFHYgAAWg=="], "@typescript-eslint/utils": ["@typescript-eslint/utils@8.58.0", "", { "dependencies": { "@eslint-community/eslint-utils": "^4.9.1", "@typescript-eslint/scope-manager": "8.58.0", "@typescript-eslint/types": "8.58.0", "@typescript-eslint/typescript-estree": "8.58.0" }, "peerDependencies": { "eslint": "^8.57.0 || ^9.0.0 || ^10.0.0", "typescript": ">=4.8.4 <6.1.0" } }, "sha512-RfeSqcFeHMHlAWzt4TBjWOAtoW9lnsAGiP3GbaX9uVgTYYrMbVnGONEfUCiSss+xMHFl+eHZiipmA8WkQ7FuNA=="], - "@typescript-eslint/visitor-keys": ["@typescript-eslint/visitor-keys@8.58.0", "", { "dependencies": { "@typescript-eslint/types": "8.58.0", "eslint-visitor-keys": "^5.0.0" } }, "sha512-XJ9UD9+bbDo4a4epraTwG3TsNPeiB9aShrUneAVXy8q4LuwowN+qu89/6ByLMINqvIMeI9H9hOHQtg/ijrYXzQ=="], + "@typescript-eslint/visitor-keys": ["@typescript-eslint/visitor-keys@8.58.1", "", { "dependencies": { "@typescript-eslint/types": "8.58.1", "eslint-visitor-keys": "^5.0.0" } }, "sha512-y+vH7QE8ycjoa0bWciFg7OpFcipUuem1ujhrdLtq1gByKwfbC7bPeKsiny9e0urg93DqwGcHey+bGRKCnF1nZQ=="], "@typescript/lib-decorators": ["@better-typescript-lib/decorators@2.12.0", "", { "peerDependencies": { "typescript": ">=4.5.2" } }, "sha512-/m9Q5Xk66ThUJidTsxmXJH0+49iCLl5PFmue0HkNSGrcPU96oaoKNY5sH1AslwA/OWVvBg3hE58ZwSGm6TQFuQ=="], @@ -726,7 +726,7 @@ "callsites": ["callsites@3.1.0", "", {}, "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ=="], - "caniuse-lite": ["caniuse-lite@1.0.30001786", "", {}, "sha512-4oxTZEvqmLLrERwxO76yfKM7acZo310U+v4kqexI2TL1DkkUEMT8UijrxxcnVdxR3qkVf5awGRX+4Z6aPHVKrA=="], + "caniuse-lite": ["caniuse-lite@1.0.30001787", "", {}, "sha512-mNcrMN9KeI68u7muanUpEejSLghOKlVhRqS/Za2IeyGllJ9I9otGpR9g3nsw7n4W378TE/LyIteA0+/FOZm4Kg=="], "change-case": ["change-case@5.4.4", "", {}, "sha512-HRQyTk2/YPEkt9TnUPbOpr64Uw3KOicFWPVBb+xiHvd6eBx/qPr9xqfBFDT8P2vWsvvz4jbEkfDe71W3VyNu2w=="], @@ -838,7 +838,7 @@ "eslint-plugin-jsx-a11y": ["eslint-plugin-jsx-a11y@6.10.2", "", { "dependencies": { "aria-query": "^5.3.2", "array-includes": "^3.1.8", "array.prototype.flatmap": "^1.3.2", "ast-types-flow": "^0.0.8", "axe-core": "^4.10.0", "axobject-query": "^4.1.0", "damerau-levenshtein": "^1.0.8", "emoji-regex": "^9.2.2", "hasown": "^2.0.2", "jsx-ast-utils": "^3.3.5", "language-tags": "^1.0.9", "minimatch": "^3.1.2", "object.fromentries": "^2.0.8", "safe-regex-test": "^1.0.3", "string.prototype.includes": "^2.0.1" }, "peerDependencies": { "eslint": "^3 || ^4 || ^5 || ^6 || ^7 || ^8 || ^9" } }, "sha512-scB3nz4WmG75pV8+3eRUQOHZlNSUhFNq37xnpgRkCCELU3XMvXAxLk1eqWWyE22Ki4Q01Fnsw9BA3cJHDPgn2Q=="], - "eslint-plugin-oxlint": ["eslint-plugin-oxlint@1.58.0", "", { "dependencies": { "jsonc-parser": "^3.3.1" }, "peerDependencies": { "oxlint": "~1.58.0" } }, "sha512-L3aZSg0x2fL0dXyOgoK8A1QUbnfGzXt6bX4AFD7Scauw6zVUBOZrES5eRTzLLGgeVg0el5lvqHGl1WFAGo14DA=="], + "eslint-plugin-oxlint": ["eslint-plugin-oxlint@1.59.0", "", { "dependencies": { "jsonc-parser": "^3.3.1" }, "peerDependencies": { "oxlint": "~1.59.0" } }, "sha512-g0DR+xSsnUdyaMc2KAXvBVGWz5V4GwlAE1PM+ocKxl2Eg7YgOjkRLLbxgJ3bhYOhRLhD8F0X4DjJu2FSDvrvAg=="], "eslint-plugin-perfectionist": ["eslint-plugin-perfectionist@5.8.0", "", { "dependencies": { "@typescript-eslint/utils": "^8.58.0", "natural-orderby": "^5.0.0" }, "peerDependencies": { "eslint": "^8.45.0 || ^9.0.0 || ^10.0.0" } }, "sha512-k8uIptWIxkUclonCFGyDzgYs9NI+Qh0a7cUXS3L7IYZDEsjXuimFBVbxXPQQngWqMiaxJRwbtYB4smMGMqF+cw=="], @@ -1076,7 +1076,7 @@ "kind-of": ["kind-of@6.0.3", "", {}, "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw=="], - "knip": ["knip@6.3.0", "", { "dependencies": { "@nodelib/fs.walk": "^1.2.3", "fast-glob": "^3.3.3", "formatly": "^0.3.0", "get-tsconfig": "4.13.7", "jiti": "^2.6.0", "minimist": "^1.2.8", "oxc-parser": "^0.121.0", "oxc-resolver": "^11.19.1", "picocolors": "^1.1.1", "picomatch": "^4.0.1", "smol-toml": "^1.6.1", "strip-json-comments": "5.0.3", "unbash": "^2.2.0", "yaml": "^2.8.2", "zod": "^4.1.11" }, "bin": { "knip": "bin/knip.js", "knip-bun": "bin/knip-bun.js" } }, "sha512-g6dVPoTw6iNm3cubC5IWxVkVsd0r5hXhTBTbAGIEQN53GdA2ZM/slMTPJ7n5l8pBebNQPHpxjmKxuR4xVQ2/hQ=="], + "knip": ["knip@6.3.1", "", { "dependencies": { "@nodelib/fs.walk": "^1.2.3", "fast-glob": "^3.3.3", "formatly": "^0.3.0", "get-tsconfig": "4.13.7", "jiti": "^2.6.0", "minimist": "^1.2.8", "oxc-parser": "^0.121.0", "oxc-resolver": "^11.19.1", "picocolors": "^1.1.1", "picomatch": "^4.0.1", "smol-toml": "^1.6.1", "strip-json-comments": "5.0.3", "unbash": "^2.2.0", "yaml": "^2.8.2", "zod": "^4.1.11" }, "bin": { "knip": "bin/knip.js", "knip-bun": "bin/knip-bun.js" } }, "sha512-22kLJloVcOVOAudCxlFOC0ICAMme7dKsS7pVTEnrmyKGpswb8ieznvAiSKUeFVDJhb01ect6dkDc1Ha1g1sPpg=="], "known-css-properties": ["known-css-properties@0.37.0", "", {}, "sha512-JCDrsP4Z1Sb9JwG0aJ8Eo2r7k4Ou5MwmThS/6lcIe1ICyb7UBJKGRIUUdqc2ASdE/42lgz6zFUnzAIhtXnBVrQ=="], @@ -1258,7 +1258,7 @@ "oxlint": ["oxlint@1.59.0", "", { "optionalDependencies": { "@oxlint/binding-android-arm-eabi": "1.59.0", "@oxlint/binding-android-arm64": "1.59.0", "@oxlint/binding-darwin-arm64": "1.59.0", "@oxlint/binding-darwin-x64": "1.59.0", "@oxlint/binding-freebsd-x64": "1.59.0", "@oxlint/binding-linux-arm-gnueabihf": "1.59.0", "@oxlint/binding-linux-arm-musleabihf": "1.59.0", "@oxlint/binding-linux-arm64-gnu": "1.59.0", "@oxlint/binding-linux-arm64-musl": "1.59.0", "@oxlint/binding-linux-ppc64-gnu": "1.59.0", "@oxlint/binding-linux-riscv64-gnu": "1.59.0", "@oxlint/binding-linux-riscv64-musl": "1.59.0", "@oxlint/binding-linux-s390x-gnu": "1.59.0", "@oxlint/binding-linux-x64-gnu": "1.59.0", "@oxlint/binding-linux-x64-musl": "1.59.0", "@oxlint/binding-openharmony-arm64": "1.59.0", "@oxlint/binding-win32-arm64-msvc": "1.59.0", "@oxlint/binding-win32-ia32-msvc": "1.59.0", "@oxlint/binding-win32-x64-msvc": "1.59.0" }, "peerDependencies": { "oxlint-tsgolint": ">=0.18.0" }, "optionalPeers": ["oxlint-tsgolint"], "bin": { "oxlint": "bin/oxlint" } }, "sha512-0xBLeGGjP4vD9pygRo8iuOkOzEU1MqOnfiOl7KYezL/QvWL8NUg6n03zXc7ZVqltiOpUxBk2zgHI3PnRIEdAvw=="], - "oxlint-tsgolint": ["oxlint-tsgolint@0.19.0", "", { "optionalDependencies": { "@oxlint-tsgolint/darwin-arm64": "0.19.0", "@oxlint-tsgolint/darwin-x64": "0.19.0", "@oxlint-tsgolint/linux-arm64": "0.19.0", "@oxlint-tsgolint/linux-x64": "0.19.0", "@oxlint-tsgolint/win32-arm64": "0.19.0", "@oxlint-tsgolint/win32-x64": "0.19.0" }, "bin": { "tsgolint": "bin/tsgolint.js" } }, "sha512-pSzUmDjMyjC8iUUZ7fCLo0D1iUaYIfodd/WIQ6Zra11YkjkUQk3BOFoW4I5ec6uZ/0s2FEmxtiZ7hiTXFRp1cg=="], + "oxlint-tsgolint": ["oxlint-tsgolint@0.20.0", "", { "optionalDependencies": { "@oxlint-tsgolint/darwin-arm64": "0.20.0", "@oxlint-tsgolint/darwin-x64": "0.20.0", "@oxlint-tsgolint/linux-arm64": "0.20.0", "@oxlint-tsgolint/linux-x64": "0.20.0", "@oxlint-tsgolint/win32-arm64": "0.20.0", "@oxlint-tsgolint/win32-x64": "0.20.0" }, "bin": { "tsgolint": "bin/tsgolint.js" } }, "sha512-/Uc9TQyN1l8w9QNvXtVHYtz+SzDJHKpb5X0UnHodl0BVzijUPk0LPlDOHAvogd1UI+iy9ZSF6gQxEqfzUxCULQ=="], "p-limit": ["p-limit@3.1.0", "", { "dependencies": { "yocto-queue": "^0.1.0" } }, "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ=="], @@ -1368,7 +1368,7 @@ "reusify": ["reusify@1.1.0", "", {}, "sha512-g6QUff04oZpHs0eG5p83rFLhHeV00ug/Yf9nZM6fLeUrPguBTkTQOdpAWWspMh55TZfVQDPaN3NQJfbVRAxdIw=="], - "rolldown": ["rolldown@1.0.0-rc.12", "", { "dependencies": { "@oxc-project/types": "=0.122.0", "@rolldown/pluginutils": "1.0.0-rc.12" }, "optionalDependencies": { "@rolldown/binding-android-arm64": "1.0.0-rc.12", "@rolldown/binding-darwin-arm64": "1.0.0-rc.12", "@rolldown/binding-darwin-x64": "1.0.0-rc.12", "@rolldown/binding-freebsd-x64": "1.0.0-rc.12", "@rolldown/binding-linux-arm-gnueabihf": "1.0.0-rc.12", "@rolldown/binding-linux-arm64-gnu": "1.0.0-rc.12", "@rolldown/binding-linux-arm64-musl": "1.0.0-rc.12", "@rolldown/binding-linux-ppc64-gnu": "1.0.0-rc.12", "@rolldown/binding-linux-s390x-gnu": "1.0.0-rc.12", "@rolldown/binding-linux-x64-gnu": "1.0.0-rc.12", "@rolldown/binding-linux-x64-musl": "1.0.0-rc.12", "@rolldown/binding-openharmony-arm64": "1.0.0-rc.12", "@rolldown/binding-wasm32-wasi": "1.0.0-rc.12", "@rolldown/binding-win32-arm64-msvc": "1.0.0-rc.12", "@rolldown/binding-win32-x64-msvc": "1.0.0-rc.12" }, "bin": { "rolldown": "bin/cli.mjs" } }, "sha512-yP4USLIMYrwpPHEFB5JGH1uxhcslv6/hL0OyvTuY+3qlOSJvZ7ntYnoWpehBxufkgN0cvXxppuTu5hHa/zPh+A=="], + "rolldown": ["rolldown@1.0.0-rc.13", "", { "dependencies": { "@oxc-project/types": "=0.123.0", "@rolldown/pluginutils": "1.0.0-rc.13" }, "optionalDependencies": { "@rolldown/binding-android-arm64": "1.0.0-rc.13", "@rolldown/binding-darwin-arm64": "1.0.0-rc.13", "@rolldown/binding-darwin-x64": "1.0.0-rc.13", "@rolldown/binding-freebsd-x64": "1.0.0-rc.13", "@rolldown/binding-linux-arm-gnueabihf": "1.0.0-rc.13", "@rolldown/binding-linux-arm64-gnu": "1.0.0-rc.13", "@rolldown/binding-linux-arm64-musl": "1.0.0-rc.13", "@rolldown/binding-linux-ppc64-gnu": "1.0.0-rc.13", "@rolldown/binding-linux-s390x-gnu": "1.0.0-rc.13", "@rolldown/binding-linux-x64-gnu": "1.0.0-rc.13", "@rolldown/binding-linux-x64-musl": "1.0.0-rc.13", "@rolldown/binding-openharmony-arm64": "1.0.0-rc.13", "@rolldown/binding-wasm32-wasi": "1.0.0-rc.13", "@rolldown/binding-win32-arm64-msvc": "1.0.0-rc.13", "@rolldown/binding-win32-x64-msvc": "1.0.0-rc.13" }, "bin": { "rolldown": "bin/cli.mjs" } }, "sha512-bvVj8YJmf0rq4pSFmH7laLa6pYrhghv3PRzrCdRAr23g66zOKVJ4wkvFtgohtPLWmthgg8/rkaqRHrpUEh0Zbw=="], "run-parallel": ["run-parallel@1.2.0", "", { "dependencies": { "queue-microtask": "^1.2.2" } }, "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA=="], @@ -1556,7 +1556,7 @@ "typescript": ["typescript@6.0.2", "", { "bin": { "tsc": "bin/tsc", "tsserver": "bin/tsserver" } }, "sha512-bGdAIrZ0wiGDo5l8c++HWtbaNCWTS4UTv7RaTH/ThVIgjkveJt83m74bBHMJkuCbslY8ixgLBVZJIOiQlQTjfQ=="], - "typescript-eslint": ["typescript-eslint@8.58.0", "", { "dependencies": { "@typescript-eslint/eslint-plugin": "8.58.0", "@typescript-eslint/parser": "8.58.0", "@typescript-eslint/typescript-estree": "8.58.0", "@typescript-eslint/utils": "8.58.0" }, "peerDependencies": { "eslint": "^8.57.0 || ^9.0.0 || ^10.0.0", "typescript": ">=4.8.4 <6.1.0" } }, "sha512-e2TQzKfaI85fO+F3QywtX+tCTsu/D3WW5LVU6nz8hTFKFZ8yBJ6mSYRpXqdR3mFjPWmO0eWsTa5f+UpAOe/FMA=="], + "typescript-eslint": ["typescript-eslint@8.58.1", "", { "dependencies": { "@typescript-eslint/eslint-plugin": "8.58.1", "@typescript-eslint/parser": "8.58.1", "@typescript-eslint/typescript-estree": "8.58.1", "@typescript-eslint/utils": "8.58.1" }, "peerDependencies": { "eslint": "^8.57.0 || ^9.0.0 || ^10.0.0", "typescript": ">=4.8.4 <6.1.0" } }, "sha512-gf6/oHChByg9HJvhMO1iBexJh12AqqTfnuxscMDOVqfJW3htsdRJI/GfPpHTTcyeB8cSTUY2JcZmVgoyPqcrDg=="], "unbash": ["unbash@2.2.0", "", {}, "sha512-X2wH19RAPZE3+ldGicOkoj/SIA83OIxcJ6Cuaw23hf8Xc6fQpvZXY0SftE2JgS0QhYLUG4uwodSI3R53keyh7w=="], @@ -1588,7 +1588,7 @@ "varint": ["varint@6.0.0", "", {}, "sha512-cXEIW6cfr15lFv563k4GuVuW/fiwjknytD37jIOLSdSWuOI6WnO/oKwmP2FQTU2l01LP8/M5TSAJpzUaGe3uWg=="], - "vite": ["vite@8.0.5", "", { "dependencies": { "lightningcss": "^1.32.0", "picomatch": "^4.0.4", "postcss": "^8.5.8", "rolldown": "1.0.0-rc.12", "tinyglobby": "^0.2.15" }, "optionalDependencies": { "fsevents": "~2.3.3" }, "peerDependencies": { "@types/node": "^20.19.0 || >=22.12.0", "@vitejs/devtools": "^0.1.0", "esbuild": "^0.27.0 || ^0.28.0", "jiti": ">=1.21.0", "less": "^4.0.0", "sass": "^1.70.0", "sass-embedded": "^1.70.0", "stylus": ">=0.54.8", "sugarss": "^5.0.0", "terser": "^5.16.0", "tsx": "^4.8.1", "yaml": "^2.4.2" }, "optionalPeers": ["@types/node", "@vitejs/devtools", "esbuild", "jiti", "less", "sass", "sass-embedded", "stylus", "sugarss", "terser", "tsx", "yaml"], "bin": { "vite": "bin/vite.js" } }, "sha512-nmu43Qvq9UopTRfMx2jOYW5l16pb3iDC1JH6yMuPkpVbzK0k+L7dfsEDH4jRgYFmsg0sTAqkojoZgzLMlwHsCQ=="], + "vite": ["vite@8.0.7", "", { "dependencies": { "lightningcss": "^1.32.0", "picomatch": "^4.0.4", "postcss": "^8.5.8", "rolldown": "1.0.0-rc.13", "tinyglobby": "^0.2.15" }, "optionalDependencies": { "fsevents": "~2.3.3" }, "peerDependencies": { "@types/node": "^20.19.0 || >=22.12.0", "@vitejs/devtools": "^0.1.0", "esbuild": "^0.27.0 || ^0.28.0", "jiti": ">=1.21.0", "less": "^4.0.0", "sass": "^1.70.0", "sass-embedded": "^1.70.0", "stylus": ">=0.54.8", "sugarss": "^5.0.0", "terser": "^5.16.0", "tsx": "^4.8.1", "yaml": "^2.4.2" }, "optionalPeers": ["@types/node", "@vitejs/devtools", "esbuild", "jiti", "less", "sass", "sass-embedded", "stylus", "sugarss", "terser", "tsx", "yaml"], "bin": { "vite": "bin/vite.js" } }, "sha512-P1PbweD+2/udplnThz3btF4cf6AgPky7kk23RtHUkJIU5BIxwPprhRGmOAHs6FTI7UiGbTNrgNP6jSYD6JaRnw=="], "vite-tsconfig-paths": ["vite-tsconfig-paths@6.1.1", "", { "dependencies": { "debug": "^4.1.1", "globrex": "^0.1.2", "tsconfck": "^3.0.3" }, "peerDependencies": { "vite": "*" } }, "sha512-2cihq7zliibCCZ8P9cKJrQBkfgdvcFkOOc3Y02o3GWUDLgqjWsZudaoiuOwO/gzTzy17cS5F7ZPo4bsnS4DGkg=="], @@ -1634,14 +1634,36 @@ "@gcch/configuration-eslint/eslint": ["eslint@10.1.0", "", { "dependencies": { "@eslint-community/eslint-utils": "^4.8.0", "@eslint-community/regexpp": "^4.12.2", "@eslint/config-array": "^0.23.3", "@eslint/config-helpers": "^0.5.3", "@eslint/core": "^1.1.1", "@eslint/plugin-kit": "^0.6.1", "@humanfs/node": "^0.16.6", "@humanwhocodes/module-importer": "^1.0.1", "@humanwhocodes/retry": "^0.4.2", "@types/estree": "^1.0.6", "ajv": "^6.14.0", "cross-spawn": "^7.0.6", "debug": "^4.3.2", "escape-string-regexp": "^4.0.0", "eslint-scope": "^9.1.2", "eslint-visitor-keys": "^5.0.1", "espree": "^11.2.0", "esquery": "^1.7.0", "esutils": "^2.0.2", "fast-deep-equal": "^3.1.3", "file-entry-cache": "^8.0.0", "find-up": "^5.0.0", "glob-parent": "^6.0.2", "ignore": "^5.2.0", "imurmurhash": "^0.1.4", "is-glob": "^4.0.0", "json-stable-stringify-without-jsonify": "^1.0.1", "minimatch": "^10.2.4", "natural-compare": "^1.4.0", "optionator": "^0.9.3" }, "peerDependencies": { "jiti": "*" }, "optionalPeers": ["jiti"], "bin": { "eslint": "bin/eslint.js" } }, "sha512-S9jlY/ELKEUwwQnqWDO+f+m6sercqOPSqXM5Go94l7DOmxHVDgmSFGWEzeE/gwgTAr0W103BWt0QLe/7mabIvA=="], - "@gcch/configuration-oxlint/oxlint-tsgolint": ["oxlint-tsgolint@0.20.0", "", { "optionalDependencies": { "@oxlint-tsgolint/darwin-arm64": "0.20.0", "@oxlint-tsgolint/darwin-x64": "0.20.0", "@oxlint-tsgolint/linux-arm64": "0.20.0", "@oxlint-tsgolint/linux-x64": "0.20.0", "@oxlint-tsgolint/win32-arm64": "0.20.0", "@oxlint-tsgolint/win32-x64": "0.20.0" }, "bin": { "tsgolint": "bin/tsgolint.js" } }, "sha512-/Uc9TQyN1l8w9QNvXtVHYtz+SzDJHKpb5X0UnHodl0BVzijUPk0LPlDOHAvogd1UI+iy9ZSF6gQxEqfzUxCULQ=="], + "@gcch/configuration-eslint/typescript-eslint": ["typescript-eslint@8.58.0", "", { "dependencies": { "@typescript-eslint/eslint-plugin": "8.58.0", "@typescript-eslint/parser": "8.58.0", "@typescript-eslint/typescript-estree": "8.58.0", "@typescript-eslint/utils": "8.58.0" }, "peerDependencies": { "eslint": "^8.57.0 || ^9.0.0 || ^10.0.0", "typescript": ">=4.8.4 <6.1.0" } }, "sha512-e2TQzKfaI85fO+F3QywtX+tCTsu/D3WW5LVU6nz8hTFKFZ8yBJ6mSYRpXqdR3mFjPWmO0eWsTa5f+UpAOe/FMA=="], "@gcch/configuration-prettier/prettier-plugin-sh": ["prettier-plugin-sh@0.18.0", "", { "dependencies": { "@reteps/dockerfmt": "^0.3.6", "sh-syntax": "^0.5.8" }, "peerDependencies": { "prettier": "^3.6.0" } }, "sha512-cW1XL27FOJQ/qGHOW6IHwdCiNWQsAgK+feA8V6+xUTaH0cD3Mh+tFAtBvEEWvuY6hTDzRV943Fzeii+qMOh7nQ=="], "@keyv/bigmap/keyv": ["keyv@5.6.0", "", { "dependencies": { "@keyv/serialize": "^1.1.1" } }, "sha512-CYDD3SOtsHtyXeEORYRx2qBtpDJFjRTGXUtmNEMGyzYOKj1TE3tycdlho7kA1Ufx9OYWZzg52QFBGALTirzDSw=="], + "@typescript-eslint/eslint-plugin/@typescript-eslint/scope-manager": ["@typescript-eslint/scope-manager@8.58.1", "", { "dependencies": { "@typescript-eslint/types": "8.58.1", "@typescript-eslint/visitor-keys": "8.58.1" } }, "sha512-TPYUEqJK6avLcEjumWsIuTpuYODTTDAtoMdt8ZZa93uWMTX13Nb8L5leSje1NluammvU+oI3QRr5lLXPgihX3w=="], + + "@typescript-eslint/eslint-plugin/@typescript-eslint/type-utils": ["@typescript-eslint/type-utils@8.58.1", "", { "dependencies": { "@typescript-eslint/types": "8.58.1", "@typescript-eslint/typescript-estree": "8.58.1", "@typescript-eslint/utils": "8.58.1", "debug": "^4.4.3", "ts-api-utils": "^2.5.0" }, "peerDependencies": { "eslint": "^8.57.0 || ^9.0.0 || ^10.0.0", "typescript": ">=4.8.4 <6.1.0" } }, "sha512-HUFxvTJVroT+0rXVJC7eD5zol6ID+Sn5npVPWoFuHGg9Ncq5Q4EYstqR+UOqaNRFXi5TYkpXXkLhoCHe3G0+7w=="], + + "@typescript-eslint/eslint-plugin/@typescript-eslint/utils": ["@typescript-eslint/utils@8.58.1", "", { "dependencies": { "@eslint-community/eslint-utils": "^4.9.1", "@typescript-eslint/scope-manager": "8.58.1", "@typescript-eslint/types": "8.58.1", "@typescript-eslint/typescript-estree": "8.58.1" }, "peerDependencies": { "eslint": "^8.57.0 || ^9.0.0 || ^10.0.0", "typescript": ">=4.8.4 <6.1.0" } }, "sha512-Ln8R0tmWC7pTtLOzgJzYTXSCjJ9rDNHAqTaVONF4FEi2qwce8mD9iSOxOpLFFvWp/wBFlew0mjM1L1ihYWfBdQ=="], + "@typescript-eslint/eslint-plugin/ignore": ["ignore@7.0.5", "", {}, "sha512-Hs59xBNfUIunMFgWAbGX5cq6893IbWg4KnrjbYwX3tx0ztorVgTDA6B2sxf8ejHJ4wz8BqGUMYlnzNBer5NvGg=="], + "@typescript-eslint/parser/@typescript-eslint/scope-manager": ["@typescript-eslint/scope-manager@8.58.1", "", { "dependencies": { "@typescript-eslint/types": "8.58.1", "@typescript-eslint/visitor-keys": "8.58.1" } }, "sha512-TPYUEqJK6avLcEjumWsIuTpuYODTTDAtoMdt8ZZa93uWMTX13Nb8L5leSje1NluammvU+oI3QRr5lLXPgihX3w=="], + + "@typescript-eslint/parser/@typescript-eslint/types": ["@typescript-eslint/types@8.58.1", "", {}, "sha512-io/dV5Aw5ezwzfPBBWLoT+5QfVtP8O7q4Kftjn5azJ88bYyp/ZMCsyW1lpKK46EXJcaYMZ1JtYj+s/7TdzmQMw=="], + + "@typescript-eslint/project-service/@typescript-eslint/types": ["@typescript-eslint/types@8.58.1", "", {}, "sha512-io/dV5Aw5ezwzfPBBWLoT+5QfVtP8O7q4Kftjn5azJ88bYyp/ZMCsyW1lpKK46EXJcaYMZ1JtYj+s/7TdzmQMw=="], + + "@typescript-eslint/scope-manager/@typescript-eslint/visitor-keys": ["@typescript-eslint/visitor-keys@8.58.0", "", { "dependencies": { "@typescript-eslint/types": "8.58.0", "eslint-visitor-keys": "^5.0.0" } }, "sha512-XJ9UD9+bbDo4a4epraTwG3TsNPeiB9aShrUneAVXy8q4LuwowN+qu89/6ByLMINqvIMeI9H9hOHQtg/ijrYXzQ=="], + + "@typescript-eslint/type-utils/@typescript-eslint/typescript-estree": ["@typescript-eslint/typescript-estree@8.58.0", "", { "dependencies": { "@typescript-eslint/project-service": "8.58.0", "@typescript-eslint/tsconfig-utils": "8.58.0", "@typescript-eslint/types": "8.58.0", "@typescript-eslint/visitor-keys": "8.58.0", "debug": "^4.4.3", "minimatch": "^10.2.2", "semver": "^7.7.3", "tinyglobby": "^0.2.15", "ts-api-utils": "^2.5.0" }, "peerDependencies": { "typescript": ">=4.8.4 <6.1.0" } }, "sha512-7vv5UWbHqew/dvs+D3e1RvLv1v2eeZ9txRHPnEEBUgSNLx5ghdzjHa0sgLWYVKssH+lYmV0JaWdoubo0ncGYLA=="], + + "@typescript-eslint/typescript-estree/@typescript-eslint/types": ["@typescript-eslint/types@8.58.1", "", {}, "sha512-io/dV5Aw5ezwzfPBBWLoT+5QfVtP8O7q4Kftjn5azJ88bYyp/ZMCsyW1lpKK46EXJcaYMZ1JtYj+s/7TdzmQMw=="], + + "@typescript-eslint/utils/@typescript-eslint/typescript-estree": ["@typescript-eslint/typescript-estree@8.58.0", "", { "dependencies": { "@typescript-eslint/project-service": "8.58.0", "@typescript-eslint/tsconfig-utils": "8.58.0", "@typescript-eslint/types": "8.58.0", "@typescript-eslint/visitor-keys": "8.58.0", "debug": "^4.4.3", "minimatch": "^10.2.2", "semver": "^7.7.3", "tinyglobby": "^0.2.15", "ts-api-utils": "^2.5.0" }, "peerDependencies": { "typescript": ">=4.8.4 <6.1.0" } }, "sha512-7vv5UWbHqew/dvs+D3e1RvLv1v2eeZ9txRHPnEEBUgSNLx5ghdzjHa0sgLWYVKssH+lYmV0JaWdoubo0ncGYLA=="], + + "@typescript-eslint/visitor-keys/@typescript-eslint/types": ["@typescript-eslint/types@8.58.1", "", {}, "sha512-io/dV5Aw5ezwzfPBBWLoT+5QfVtP8O7q4Kftjn5azJ88bYyp/ZMCsyW1lpKK46EXJcaYMZ1JtYj+s/7TdzmQMw=="], + "astro-eslint-parser/eslint-scope": ["eslint-scope@8.4.0", "", { "dependencies": { "esrecurse": "^4.3.0", "estraverse": "^5.2.0" } }, "sha512-sNXOfKCn74rt8RICKMvJS7XKV/Xk9kA7DyJr8mJik3S7Cwgy3qlkkmyS2uQB3jiJg6VNdZd/pDBJu0nvG2NlTg=="], "astro-eslint-parser/eslint-visitor-keys": ["eslint-visitor-keys@4.2.1", "", {}, "sha512-Uhdk5sfqcee/9H/rCOJikYz67o0a2Tw2hGRPOG2Y1R2dg7brRe1uG0yaNQDHu+TO/uQPF/5eCapvYSmHUjt7JQ=="], @@ -1680,7 +1702,7 @@ "qified/hookified": ["hookified@2.1.1", "", {}, "sha512-AHb76R16GB5EsPBE2J7Ko5kiEyXwviB9P5SMrAKcuAu4vJPZttViAbj9+tZeaQE5zjDme+1vcHP78Yj/WoAveA=="], - "rolldown/@oxc-project/types": ["@oxc-project/types@0.122.0", "", {}, "sha512-oLAl5kBpV4w69UtFZ9xqcmTi+GENWOcPF7FCrczTiBbmC0ibXxCwyvZGbO39rCVEuLGAZM84DH0pUIyyv/YJzA=="], + "rolldown/@oxc-project/types": ["@oxc-project/types@0.123.0", "", {}, "sha512-YtECP/y8Mj1lSHiUWGSRzy/C6teUKlS87dEfuVKT09LgQbUsBW1rNg+MiJ4buGu3yuADV60gbIvo9/HplA56Ew=="], "stylelint/file-entry-cache": ["file-entry-cache@11.1.2", "", { "dependencies": { "flat-cache": "^6.1.20" } }, "sha512-N2WFfK12gmrK1c1GXOqiAJ1tc5YE+R53zvQ+t5P8S5XhnmKYVB5eZEiLNZKDSmoG8wqqbF9EXYBBW/nef19log=="], @@ -1696,6 +1718,8 @@ "table/strip-ansi": ["strip-ansi@6.0.1", "", { "dependencies": { "ansi-regex": "^5.0.1" } }, "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A=="], + "typescript-eslint/@typescript-eslint/utils": ["@typescript-eslint/utils@8.58.1", "", { "dependencies": { "@eslint-community/eslint-utils": "^4.9.1", "@typescript-eslint/scope-manager": "8.58.1", "@typescript-eslint/types": "8.58.1", "@typescript-eslint/typescript-estree": "8.58.1" }, "peerDependencies": { "eslint": "^8.57.0 || ^9.0.0 || ^10.0.0", "typescript": ">=4.8.4 <6.1.0" } }, "sha512-Ln8R0tmWC7pTtLOzgJzYTXSCjJ9rDNHAqTaVONF4FEi2qwce8mD9iSOxOpLFFvWp/wBFlew0mjM1L1ihYWfBdQ=="], + "vite/fsevents": ["fsevents@2.3.3", "", { "os": "darwin" }, "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw=="], "@gcch/configuration-eslint/eslint/@eslint/config-array": ["@eslint/config-array@0.23.3", "", { "dependencies": { "@eslint/object-schema": "^3.0.3", "debug": "^4.3.1", "minimatch": "^10.2.4" } }, "sha512-j+eEWmB6YYLwcNOdlwQ6L2OsptI/LO6lNBuLIqe5R7RetD658HLoF+Mn7LzYmAWWNNzdC6cqP+L6r8ujeYXWLw=="], @@ -1706,20 +1730,32 @@ "@gcch/configuration-eslint/eslint/@eslint/plugin-kit": ["@eslint/plugin-kit@0.6.1", "", { "dependencies": { "@eslint/core": "^1.1.1", "levn": "^0.4.1" } }, "sha512-iH1B076HoAshH1mLpHMgwdGeTs0CYwL0SPMkGuSebZrwBp16v415e9NZXg2jtrqPVQjf6IANe2Vtlr5KswtcZQ=="], - "@gcch/configuration-oxlint/oxlint-tsgolint/@oxlint-tsgolint/darwin-arm64": ["@oxlint-tsgolint/darwin-arm64@0.20.0", "", { "os": "darwin", "cpu": "arm64" }, "sha512-KKQcIHZHMxqpHUA1VXIbOG6chNCFkUWbQy6M+AFVtPKkA/3xAeJkJ3njoV66bfzwPHRcWQO+kcj5XqtbkjakoA=="], + "@gcch/configuration-eslint/typescript-eslint/@typescript-eslint/eslint-plugin": ["@typescript-eslint/eslint-plugin@8.58.0", "", { "dependencies": { "@eslint-community/regexpp": "^4.12.2", "@typescript-eslint/scope-manager": "8.58.0", "@typescript-eslint/type-utils": "8.58.0", "@typescript-eslint/utils": "8.58.0", "@typescript-eslint/visitor-keys": "8.58.0", "ignore": "^7.0.5", "natural-compare": "^1.4.0", "ts-api-utils": "^2.5.0" }, "peerDependencies": { "@typescript-eslint/parser": "^8.58.0", "eslint": "^8.57.0 || ^9.0.0 || ^10.0.0", "typescript": ">=4.8.4 <6.1.0" } }, "sha512-RLkVSiNuUP1C2ROIWfqX+YcUfLaSnxGE/8M+Y57lopVwg9VTYYfhuz15Yf1IzCKgZj6/rIbYTmJCUSqr76r0Wg=="], - "@gcch/configuration-oxlint/oxlint-tsgolint/@oxlint-tsgolint/darwin-x64": ["@oxlint-tsgolint/darwin-x64@0.20.0", "", { "os": "darwin", "cpu": "x64" }, "sha512-7HeVMuclGfG+NLZi2ybY0T4fMI7/XxO/208rJk+zEIloKkVnlh11Wd241JMGwgNFXn+MLJbOqOfojDb2Dt4L1g=="], + "@gcch/configuration-eslint/typescript-eslint/@typescript-eslint/parser": ["@typescript-eslint/parser@8.58.0", "", { "dependencies": { "@typescript-eslint/scope-manager": "8.58.0", "@typescript-eslint/types": "8.58.0", "@typescript-eslint/typescript-estree": "8.58.0", "@typescript-eslint/visitor-keys": "8.58.0", "debug": "^4.4.3" }, "peerDependencies": { "eslint": "^8.57.0 || ^9.0.0 || ^10.0.0", "typescript": ">=4.8.4 <6.1.0" } }, "sha512-rLoGZIf9afaRBYsPUMtvkDWykwXwUPL60HebR4JgTI8mxfFe2cQTu3AGitANp4b9B2QlVru6WzjgB2IzJKiCSA=="], - "@gcch/configuration-oxlint/oxlint-tsgolint/@oxlint-tsgolint/linux-arm64": ["@oxlint-tsgolint/linux-arm64@0.20.0", "", { "os": "linux", "cpu": "arm64" }, "sha512-zxhUwz+WSxE6oWlZLK2z2ps9yC6ebmgoYmjAl0Oa48+GqkZ56NVgo+wb8DURNv6xrggzHStQxqQxe3mK51HZag=="], - - "@gcch/configuration-oxlint/oxlint-tsgolint/@oxlint-tsgolint/linux-x64": ["@oxlint-tsgolint/linux-x64@0.20.0", "", { "os": "linux", "cpu": "x64" }, "sha512-/1l6FnahC9im8PK+Ekkx/V3yetO/PzZnJegE2FXcv/iXEhbeVxP/ouiTYcUQu9shT1FWJCSNti1VJHH+21Y1dg=="], - - "@gcch/configuration-oxlint/oxlint-tsgolint/@oxlint-tsgolint/win32-arm64": ["@oxlint-tsgolint/win32-arm64@0.20.0", "", { "os": "win32", "cpu": "arm64" }, "sha512-oPZ5Yz8sVdo7P/5q+i3IKeix31eFZ55JAPa1+RGPoe9PoaYVsdMvR6Jvib6YtrqoJnFPlg3fjEjlEPL8VBKYJA=="], - - "@gcch/configuration-oxlint/oxlint-tsgolint/@oxlint-tsgolint/win32-x64": ["@oxlint-tsgolint/win32-x64@0.20.0", "", { "os": "win32", "cpu": "x64" }, "sha512-4stx8RHj3SP9vQyRF/yZbz5igtPvYMEUR8CUoha4BVNZihi39DpCR8qkU7lpjB5Ga1DRMo2pHaA4bdTOMaY4mw=="], + "@gcch/configuration-eslint/typescript-eslint/@typescript-eslint/typescript-estree": ["@typescript-eslint/typescript-estree@8.58.0", "", { "dependencies": { "@typescript-eslint/project-service": "8.58.0", "@typescript-eslint/tsconfig-utils": "8.58.0", "@typescript-eslint/types": "8.58.0", "@typescript-eslint/visitor-keys": "8.58.0", "debug": "^4.4.3", "minimatch": "^10.2.2", "semver": "^7.7.3", "tinyglobby": "^0.2.15", "ts-api-utils": "^2.5.0" }, "peerDependencies": { "typescript": ">=4.8.4 <6.1.0" } }, "sha512-7vv5UWbHqew/dvs+D3e1RvLv1v2eeZ9txRHPnEEBUgSNLx5ghdzjHa0sgLWYVKssH+lYmV0JaWdoubo0ncGYLA=="], "@gcch/configuration-prettier/prettier-plugin-sh/@reteps/dockerfmt": ["@reteps/dockerfmt@0.3.6", "", {}, "sha512-Tb5wIMvBf/nLejTQ61krK644/CEMB/cpiaIFXqGApfGqO3GwcR3qnI0DbmkFVCl2OyEp8LnLX3EkucoL0+tbFg=="], + "@typescript-eslint/eslint-plugin/@typescript-eslint/scope-manager/@typescript-eslint/types": ["@typescript-eslint/types@8.58.1", "", {}, "sha512-io/dV5Aw5ezwzfPBBWLoT+5QfVtP8O7q4Kftjn5azJ88bYyp/ZMCsyW1lpKK46EXJcaYMZ1JtYj+s/7TdzmQMw=="], + + "@typescript-eslint/eslint-plugin/@typescript-eslint/type-utils/@typescript-eslint/types": ["@typescript-eslint/types@8.58.1", "", {}, "sha512-io/dV5Aw5ezwzfPBBWLoT+5QfVtP8O7q4Kftjn5azJ88bYyp/ZMCsyW1lpKK46EXJcaYMZ1JtYj+s/7TdzmQMw=="], + + "@typescript-eslint/eslint-plugin/@typescript-eslint/utils/@typescript-eslint/types": ["@typescript-eslint/types@8.58.1", "", {}, "sha512-io/dV5Aw5ezwzfPBBWLoT+5QfVtP8O7q4Kftjn5azJ88bYyp/ZMCsyW1lpKK46EXJcaYMZ1JtYj+s/7TdzmQMw=="], + + "@typescript-eslint/type-utils/@typescript-eslint/typescript-estree/@typescript-eslint/project-service": ["@typescript-eslint/project-service@8.58.0", "", { "dependencies": { "@typescript-eslint/tsconfig-utils": "^8.58.0", "@typescript-eslint/types": "^8.58.0", "debug": "^4.4.3" }, "peerDependencies": { "typescript": ">=4.8.4 <6.1.0" } }, "sha512-8Q/wBPWLQP1j16NxoPNIKpDZFMaxl7yWIoqXWYeWO+Bbd2mjgvoF0dxP2jKZg5+x49rgKdf7Ck473M8PC3V9lg=="], + + "@typescript-eslint/type-utils/@typescript-eslint/typescript-estree/@typescript-eslint/tsconfig-utils": ["@typescript-eslint/tsconfig-utils@8.58.0", "", { "peerDependencies": { "typescript": ">=4.8.4 <6.1.0" } }, "sha512-doNSZEVJsWEu4htiVC+PR6NpM+pa+a4ClH9INRWOWCUzMst/VA9c4gXq92F8GUD1rwhNvRLkgjfYtFXegXQF7A=="], + + "@typescript-eslint/type-utils/@typescript-eslint/typescript-estree/@typescript-eslint/visitor-keys": ["@typescript-eslint/visitor-keys@8.58.0", "", { "dependencies": { "@typescript-eslint/types": "8.58.0", "eslint-visitor-keys": "^5.0.0" } }, "sha512-XJ9UD9+bbDo4a4epraTwG3TsNPeiB9aShrUneAVXy8q4LuwowN+qu89/6ByLMINqvIMeI9H9hOHQtg/ijrYXzQ=="], + + "@typescript-eslint/utils/@typescript-eslint/typescript-estree/@typescript-eslint/project-service": ["@typescript-eslint/project-service@8.58.0", "", { "dependencies": { "@typescript-eslint/tsconfig-utils": "^8.58.0", "@typescript-eslint/types": "^8.58.0", "debug": "^4.4.3" }, "peerDependencies": { "typescript": ">=4.8.4 <6.1.0" } }, "sha512-8Q/wBPWLQP1j16NxoPNIKpDZFMaxl7yWIoqXWYeWO+Bbd2mjgvoF0dxP2jKZg5+x49rgKdf7Ck473M8PC3V9lg=="], + + "@typescript-eslint/utils/@typescript-eslint/typescript-estree/@typescript-eslint/tsconfig-utils": ["@typescript-eslint/tsconfig-utils@8.58.0", "", { "peerDependencies": { "typescript": ">=4.8.4 <6.1.0" } }, "sha512-doNSZEVJsWEu4htiVC+PR6NpM+pa+a4ClH9INRWOWCUzMst/VA9c4gXq92F8GUD1rwhNvRLkgjfYtFXegXQF7A=="], + + "@typescript-eslint/utils/@typescript-eslint/typescript-estree/@typescript-eslint/visitor-keys": ["@typescript-eslint/visitor-keys@8.58.0", "", { "dependencies": { "@typescript-eslint/types": "8.58.0", "eslint-visitor-keys": "^5.0.0" } }, "sha512-XJ9UD9+bbDo4a4epraTwG3TsNPeiB9aShrUneAVXy8q4LuwowN+qu89/6ByLMINqvIMeI9H9hOHQtg/ijrYXzQ=="], + "eslint-plugin-jsx-a11y/minimatch/brace-expansion": ["brace-expansion@1.1.13", "", { "dependencies": { "balanced-match": "^1.0.0", "concat-map": "0.0.1" } }, "sha512-9ZLprWS6EENmhEOpjCYW2c8VkmOvckIJZfkr7rBW6dObmfgJ/L1GpSYW5Hpo9lDz4D1+n0Ckz8rU7FwHDQiG/w=="], "stylelint/file-entry-cache/flat-cache": ["flat-cache@6.1.22", "", { "dependencies": { "cacheable": "^2.3.4", "flatted": "^3.4.2", "hookified": "^1.15.0" } }, "sha512-N2dnzVJIphnNsjHcrxGW7DePckJ6haPrSFqpsBUhHYgwtKGVq4JrBGielEGD2fCVnsGm1zlBVZ8wGhkyuetgug=="], @@ -1730,8 +1766,24 @@ "table/strip-ansi/ansi-regex": ["ansi-regex@5.0.1", "", {}, "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ=="], + "typescript-eslint/@typescript-eslint/utils/@typescript-eslint/scope-manager": ["@typescript-eslint/scope-manager@8.58.1", "", { "dependencies": { "@typescript-eslint/types": "8.58.1", "@typescript-eslint/visitor-keys": "8.58.1" } }, "sha512-TPYUEqJK6avLcEjumWsIuTpuYODTTDAtoMdt8ZZa93uWMTX13Nb8L5leSje1NluammvU+oI3QRr5lLXPgihX3w=="], + + "typescript-eslint/@typescript-eslint/utils/@typescript-eslint/types": ["@typescript-eslint/types@8.58.1", "", {}, "sha512-io/dV5Aw5ezwzfPBBWLoT+5QfVtP8O7q4Kftjn5azJ88bYyp/ZMCsyW1lpKK46EXJcaYMZ1JtYj+s/7TdzmQMw=="], + "@gcch/configuration-eslint/eslint/@eslint/config-array/@eslint/object-schema": ["@eslint/object-schema@3.0.3", "", {}, "sha512-iM869Pugn9Nsxbh/YHRqYiqd23AmIbxJOcpUMOuWCVNdoQJ5ZtwL6h3t0bcZzJUlC3Dq9jCFCESBZnX0GTv7iQ=="], + "@gcch/configuration-eslint/typescript-eslint/@typescript-eslint/eslint-plugin/@typescript-eslint/visitor-keys": ["@typescript-eslint/visitor-keys@8.58.0", "", { "dependencies": { "@typescript-eslint/types": "8.58.0", "eslint-visitor-keys": "^5.0.0" } }, "sha512-XJ9UD9+bbDo4a4epraTwG3TsNPeiB9aShrUneAVXy8q4LuwowN+qu89/6ByLMINqvIMeI9H9hOHQtg/ijrYXzQ=="], + + "@gcch/configuration-eslint/typescript-eslint/@typescript-eslint/eslint-plugin/ignore": ["ignore@7.0.5", "", {}, "sha512-Hs59xBNfUIunMFgWAbGX5cq6893IbWg4KnrjbYwX3tx0ztorVgTDA6B2sxf8ejHJ4wz8BqGUMYlnzNBer5NvGg=="], + + "@gcch/configuration-eslint/typescript-eslint/@typescript-eslint/parser/@typescript-eslint/visitor-keys": ["@typescript-eslint/visitor-keys@8.58.0", "", { "dependencies": { "@typescript-eslint/types": "8.58.0", "eslint-visitor-keys": "^5.0.0" } }, "sha512-XJ9UD9+bbDo4a4epraTwG3TsNPeiB9aShrUneAVXy8q4LuwowN+qu89/6ByLMINqvIMeI9H9hOHQtg/ijrYXzQ=="], + + "@gcch/configuration-eslint/typescript-eslint/@typescript-eslint/typescript-estree/@typescript-eslint/project-service": ["@typescript-eslint/project-service@8.58.0", "", { "dependencies": { "@typescript-eslint/tsconfig-utils": "^8.58.0", "@typescript-eslint/types": "^8.58.0", "debug": "^4.4.3" }, "peerDependencies": { "typescript": ">=4.8.4 <6.1.0" } }, "sha512-8Q/wBPWLQP1j16NxoPNIKpDZFMaxl7yWIoqXWYeWO+Bbd2mjgvoF0dxP2jKZg5+x49rgKdf7Ck473M8PC3V9lg=="], + + "@gcch/configuration-eslint/typescript-eslint/@typescript-eslint/typescript-estree/@typescript-eslint/tsconfig-utils": ["@typescript-eslint/tsconfig-utils@8.58.0", "", { "peerDependencies": { "typescript": ">=4.8.4 <6.1.0" } }, "sha512-doNSZEVJsWEu4htiVC+PR6NpM+pa+a4ClH9INRWOWCUzMst/VA9c4gXq92F8GUD1rwhNvRLkgjfYtFXegXQF7A=="], + + "@gcch/configuration-eslint/typescript-eslint/@typescript-eslint/typescript-estree/@typescript-eslint/visitor-keys": ["@typescript-eslint/visitor-keys@8.58.0", "", { "dependencies": { "@typescript-eslint/types": "8.58.0", "eslint-visitor-keys": "^5.0.0" } }, "sha512-XJ9UD9+bbDo4a4epraTwG3TsNPeiB9aShrUneAVXy8q4LuwowN+qu89/6ByLMINqvIMeI9H9hOHQtg/ijrYXzQ=="], + "eslint-plugin-jsx-a11y/minimatch/brace-expansion/balanced-match": ["balanced-match@1.0.2", "", {}, "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw=="], } } diff --git a/composer.lock b/composer.lock index a0b99075..ff04a496 100644 --- a/composer.lock +++ b/composer.lock @@ -585,7 +585,7 @@ }, { "name": "illuminate/collections", - "version": "v13.3.0", + "version": "v13.4.0", "source": { "type": "git", "url": "https://github.com/illuminate/collections.git", @@ -644,7 +644,7 @@ }, { "name": "illuminate/conditionable", - "version": "v13.3.0", + "version": "v13.4.0", "source": { "type": "git", "url": "https://github.com/illuminate/conditionable.git", @@ -690,7 +690,7 @@ }, { "name": "illuminate/contracts", - "version": "v13.3.0", + "version": "v13.4.0", "source": { "type": "git", "url": "https://github.com/illuminate/contracts.git", @@ -738,7 +738,7 @@ }, { "name": "illuminate/macroable", - "version": "v13.3.0", + "version": "v13.4.0", "source": { "type": "git", "url": "https://github.com/illuminate/macroable.git", @@ -784,7 +784,7 @@ }, { "name": "illuminate/reflection", - "version": "v13.3.0", + "version": "v13.4.0", "source": { "type": "git", "url": "https://github.com/illuminate/reflection.git", @@ -835,16 +835,16 @@ }, { "name": "illuminate/support", - "version": "v13.3.0", + "version": "v13.4.0", "source": { "type": "git", "url": "https://github.com/illuminate/support.git", - "reference": "f31e168e236a90d96d7894cd1f107b1ba095de69" + "reference": "e7ce0496cae80c3e1aa72e37f09335a6454846dc" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/illuminate/support/zipball/f31e168e236a90d96d7894cd1f107b1ba095de69", - "reference": "f31e168e236a90d96d7894cd1f107b1ba095de69", + "url": "https://api.github.com/repos/illuminate/support/zipball/e7ce0496cae80c3e1aa72e37f09335a6454846dc", + "reference": "e7ce0496cae80c3e1aa72e37f09335a6454846dc", "shasum": "" }, "require": { @@ -910,7 +910,7 @@ "issues": "https://github.com/laravel/framework/issues", "source": "https://github.com/laravel/framework" }, - "time": "2026-03-30T13:32:27+00:00" + "time": "2026-04-07T13:34:38+00:00" }, { "name": "laravel/helpers", @@ -1220,16 +1220,16 @@ }, { "name": "nesbot/carbon", - "version": "3.11.3", + "version": "3.11.4", "source": { "type": "git", "url": "https://github.com/CarbonPHP/carbon.git", - "reference": "6a7e652845bb018c668220c2a545aded8594fbbf" + "reference": "e890471a3494740f7d9326d72ce6a8c559ffee60" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/CarbonPHP/carbon/zipball/6a7e652845bb018c668220c2a545aded8594fbbf", - "reference": "6a7e652845bb018c668220c2a545aded8594fbbf", + "url": "https://api.github.com/repos/CarbonPHP/carbon/zipball/e890471a3494740f7d9326d72ce6a8c559ffee60", + "reference": "e890471a3494740f7d9326d72ce6a8c559ffee60", "shasum": "" }, "require": { @@ -1321,7 +1321,7 @@ "type": "tidelift" } ], - "time": "2026-03-11T17:23:39+00:00" + "time": "2026-04-07T09:57:54+00:00" }, { "name": "oscarotero/env", diff --git a/mago-schema.json b/mago-schema.json new file mode 100644 index 00000000..88432f04 --- /dev/null +++ b/mago-schema.json @@ -0,0 +1,7467 @@ +{ + "$defs": { + "AnalyzerConfiguration": { + "additionalProperties": false, + "description": "Configuration options for the static analyzer.", + "properties": { + "allow-possibly-undefined-array-keys": { + "default": true, + "description": "Allow accessing array keys that may not be defined without reporting an issue.", + "type": "boolean" + }, + "analyze-dead-code": { + "default": false, + "description": "Whether to analyze dead code.", + "type": "boolean" + }, + "baseline": { + "default": null, + "description": "Path to a baseline file to ignore listed issues.", + "type": ["string", "null"] + }, + "baseline-variant": { + "$ref": "#/$defs/BaselineVariant", + "default": "loose", + "description": "The baseline variant to use when generating new baselines.\n\nOptions:\n\n- `\"strict\"`: Exact line matching with start/end line numbers\n- `\"loose\"`: Count-based matching by (file, code, message) tuple (default)\n\nThe loose variant is more resilient to code changes as line number shifts\ndon't affect the baseline." + }, + "check-arrow-function-missing-type-hints": { + "default": false, + "description": "Check for missing type hints (both parameters and return types) in arrow functions when `check_missing_type_hints` is enabled.\n\nWhen `true`, arrow functions (declared with `fn() => ...`) will be checked for missing\ntype hints. When `false`, arrow functions are ignored, which is useful because arrow\nfunctions often rely on type inference and are typically short, making types obvious.\n\nDefaults to `false`.", + "type": "boolean" + }, + "check-closure-missing-type-hints": { + "default": false, + "description": "Check for missing type hints (both parameters and return types) in closures when `check_missing_type_hints` is enabled.\n\nWhen `true`, closures (anonymous functions declared with `function() {}`) will be\nchecked for missing type hints. When `false`, closures are ignored, which is useful\nbecause closures often rely on type inference.\n\nDefaults to `false`.", + "type": "boolean" + }, + "check-experimental": { + "default": false, + "description": "Check for incorrect casing when referencing classes, interfaces, traits, enums,\nand functions.\n\nDefaults to `false`.", + "type": "boolean" + }, + "check-missing-override": { + "default": false, + "description": "Check for missing `#[Override]` attributes on overriding methods.\n\nWhen enabled, the analyzer reports methods that override a parent method without\nthe `#[Override]` attribute (PHP 8.3+).\n\nDefaults to `true`.", + "type": "boolean" + }, + "check-missing-type-hints": { + "default": false, + "description": "Check for missing type hints on parameters, properties, and return types.\n\nWhen enabled, the analyzer will report warnings for function parameters, class properties,\nand function return types that lack explicit type declarations.\n\nDefaults to `false`.", + "type": "boolean" + }, + "check-name-casing": { + "default": false, + "description": "Defaults to `false`.", + "type": "boolean" + }, + "check-property-initialization": { + "default": false, + "description": "Enable property initialization checking (`missing-constructor`, `uninitialized-property`).\n\nWhen `false`, disables both `missing-constructor` and `uninitialized-property` issues\nentirely. This is useful for projects that prefer to rely on runtime errors for\nproperty initialization.\n\nDefaults to `false`.", + "type": "boolean" + }, + "check-throws": { + "default": false, + "description": "Whether to check for thrown exceptions.", + "type": "boolean" + }, + "check-use-statements": { + "default": false, + "description": "Check for non-existent symbols in use statements.\n\nWhen enabled, the analyzer will report use statements that import symbols\n(classes, interfaces, traits, enums, functions, or constants) that do not exist\nin the codebase.\n\nDefaults to `false`.", + "type": "boolean" + }, + "class-initializers": { + "default": [], + "description": "Method names treated as class initializers (like `__construct`).\n\nProperties initialized in these methods count as \"definitely initialized\"\njust like in the constructor. This is useful for frameworks that use\nlifecycle methods like PHPUnit's `setUp()` or framework `boot()` methods.\n\nExample: `[\"setUp\", \"initialize\", \"boot\"]`\n\nDefaults to empty (no additional initializers).", + "items": { + "type": "string" + }, + "type": "array" + }, + "disable-default-plugins": { + "default": false, + "description": "Disable all default plugins (including stdlib).\n\nWhen set to `true`, no plugins will be loaded by default, and only plugins\nexplicitly listed in `plugins` will be enabled.\n\nDefaults to `false`.", + "type": "boolean" + }, + "enforce-class-finality": { + "default": false, + "description": "Enforce that concrete classes are declared `final`.\n\nWhen enabled, the analyzer reports a warning for any class that is not\n`final`, `abstract`, or annotated with `@api`, provided the class has no children.\n\nDefaults to `false`.", + "type": "boolean" + }, + "excludes": { + "default": [], + "description": "A list of patterns to exclude from analysis.", + "items": { + "type": "string" + }, + "type": "array" + }, + "find-unused-definitions": { + "default": true, + "description": "Whether to find unused definitions.", + "type": "boolean" + }, + "find-unused-expressions": { + "default": true, + "description": "Whether to find unused expressions.", + "type": "boolean" + }, + "find-unused-parameters": { + "default": false, + "description": "Find and report unused function/method parameters.\n\nWhen enabled, the analyzer reports parameters that are declared but never used\nwithin the function body.\n\nDefaults to `true`.", + "type": "boolean" + }, + "ignore": { + "default": [], + "description": "Ignore specific issues based on their code, optionally scoped to paths.", + "items": { + "$ref": "#/$defs/IgnoreEntry" + }, + "type": "array" + }, + "memoize-properties": { + "default": true, + "description": "Whether to memoize properties.", + "type": "boolean" + }, + "minimum-fail-level": { + "$ref": "#/$defs/Level", + "default": "Error", + "description": "Set the minimum issue severity that causes the command to fail.\n\nThe command will exit with a non-zero status if any issues at or above\nthis level are found. For example, setting this to `\"warning\"` means\nthe command fails on warnings and errors, but not on notes or help suggestions.\n\nOptions: `\"note\"`, `\"help\"`, `\"warning\"`, `\"error\"`\n\nCan be overridden by the `--minimum-fail-level` CLI flag.\n\nDefaults to `\"error\"`." + }, + "no-boolean-literal-comparison": { + "default": false, + "description": "Disallow comparisons where a boolean literal is used as an operand.\n\nDefaults to `false`.", + "type": "boolean" + }, + "perform-heuristic-checks": { + "description": "**Deprecated**: Use `check-missing-override` and `find-unused-parameters` instead.\n\nWhen set to `true`, enables both `check-missing-override` and `find-unused-parameters`.\nWhen set to `false`, disables both.\n\nThis option is kept for backwards compatibility with existing configurations.", + "type": ["boolean", "null"], + "writeOnly": true + }, + "performance": { + "$ref": "#/$defs/PerformanceConfiguration", + "default": { + "array-combination-threshold": 128, + "consensus-limit-threshold": 256, + "disjunction-complexity-threshold": 4096, + "formula-size-threshold": 512, + "integer-combination-threshold": 128, + "negation-complexity-threshold": 4096, + "saturation-complexity-threshold": 8192, + "string-combination-threshold": 128 + }, + "description": "Performance tuning settings.\n\nThese thresholds control how deeply the analyzer explores complex logical formulas.\nHigher values allow more precise analysis but may significantly increase analysis time.\nLower values improve speed but may reduce precision on complex conditional code." + }, + "plugins": { + "default": [], + "description": "List of plugins to enable (by name or alias).\n\nPlugins can be specified by their canonical name or any of their aliases:\n- `stdlib` (aliases: `standard`, `std`, `php-stdlib`)\n- `psl` (aliases: `php-standard-library`, `azjezz-psl`)\n- `flow-php` (aliases: `flow`, `flow-etl`)\n- `psr-container` (aliases: `psr-11`)\n\nExample: `plugins = [\"stdlib\", \"psl\"]`", + "items": { + "type": "string" + }, + "type": "array" + }, + "register-super-globals": { + "default": true, + "description": "Register superglobals (e.g., `$_GET`, `$_POST`, `$_SERVER`) in the analysis context.\n\nIf disabled, super globals won't be available unless explicitly imported using\nthe `global` keyword.\n\nDefaults to `true`.", + "type": "boolean" + }, + "require-api-or-internal": { + "default": false, + "description": "Require `@api` or `@internal` annotations on abstract classes, interfaces, and traits.\n\nWhen enabled, the analyzer reports a warning for any abstract class, interface,\nor trait that is not annotated with either `@api` or `@internal`.\n\nDefaults to `false`.", + "type": "boolean" + }, + "strict-list-index-checks": { + "default": false, + "description": "Enforce strict checks when accessing list elements by index.\n\nWhen `true`, the analyzer requires that any integer used to access a `list`\nelement is provably non-negative (e.g., of type `int<0, max>`). This helps\nprevent potential runtime errors from using a negative index.\n\nWhen `false` (the default), any `int` is permitted as an index, offering\nmore flexibility at the cost of type safety.", + "type": "boolean" + }, + "trust-existence-checks": { + "default": true, + "description": "Trust symbol existence checks to narrow types.\n\nWhen enabled, conditional checks like `method_exists()`, `property_exists()`,\n`function_exists()`, and `defined()` will narrow the type within the conditional block,\nsuppressing errors for symbols that are verified to exist at runtime.\n\nWhen disabled, these checks are ignored and the analyzer requires explicit type hints,\nwhich is stricter but may produce more false positives for dynamic code.\n\nDefaults to `true`.", + "type": "boolean" + }, + "unchecked-exception-classes": { + "default": [], + "description": "Exceptions to ignore (exact class match only, not subclasses).\n\nWhen an exception class is listed here, only that exact class will be ignored\nduring `check_throws` analysis. Parent classes and subclasses are not affected.", + "items": { + "type": "string" + }, + "type": "array" + }, + "unchecked-exceptions": { + "default": [], + "description": "Exceptions to ignore including all subclasses (hierarchy-aware).\n\nWhen an exception class is listed here, any exception of that class or any of its\nsubclasses will be ignored during `check_throws` analysis.\n\nFor example, adding `LogicException` will ignore `LogicException`, `InvalidArgumentException`,\n`OutOfBoundsException`, and all other subclasses.", + "items": { + "type": "string" + }, + "type": "array" + } + }, + "type": "object" + }, + "ArrayStyleOption": { + "enum": ["short", "long"], + "type": "string" + }, + "AssertionStyle": { + "enum": ["static", "self_", "this"], + "type": "string" + }, + "BaselineVariant": { + "description": "The variant of baseline format to use.", + "oneOf": [ + { + "const": "strict", + "description": "Strict baseline with exact line matching.\n\nEach issue is stored with its exact start and end line numbers.\nAny change in line numbers requires baseline regeneration.", + "type": "string" + }, + { + "const": "loose", + "description": "Loose baseline with count-based matching.\n\nIssues are grouped by (file, code, message) and stored with a count.\nMore resilient to code changes as line shifts don't affect the baseline.", + "type": "string" + } + ] + }, + "BraceStyle": { + "description": "Specifies brace placement style for various constructs.\n\n- `SameLine`: Opening brace on the same line as the declaration\n- `NextLine`: Opening brace on the next line for single-line signatures;\n on the same line when the signature breaks across multiple lines\n- `AlwaysNextLine`: Opening brace always on the next line, regardless of\n whether the signature breaks", + "enum": ["same_line", "next_line", "always_next_line"], + "type": "string" + }, + "DisallowedEntry": { + "anyOf": [ + { + "description": "Simple string entry (just the name).", + "type": "string" + }, + { + "description": "Entry with name and optional help message.", + "properties": { + "help": { + "type": ["string", "null"] + }, + "name": { + "type": "string" + } + }, + "required": ["name"], + "type": "object" + } + ], + "description": "An entry that can be either a simple string or an object with name and optional help." + }, + "EndOfLine": { + "description": "Specifies the style of line endings.", + "enum": ["auto", "lf", "crlf", "cr"], + "type": "string" + }, + "FormatterConfiguration": { + "additionalProperties": false, + "description": "Configuration options for formatting source code.", + "properties": { + "align-assignment-like": { + "default": false, + "description": "Whether to align consecutive assignment-like constructs in columns.\n\nWhen enabled, consecutive variable assignments, class properties, class constants,\nglobal constants, array key-value pairs, and backed enum cases are column-aligned.\n\nFor arrays, this applies to multiline or width-broken mappings. Compact inline arrays\nstay compact and are not padded into columns.\n\nExample with `true`:\n```php\n$foo = 1;\n$b = 2;\n$ccccccc = 3;\n\nclass X {\n public string $foo = 1;\n public readonly int $barrrr = 2;\n}\n```\n\nExample with `false`:\n```php\n$foo = 1;\n$b = 2;\n$ccccccc = 3;\n```\n\nNote: Blank lines and comments break alignment runs. In class bodies,\ndifferent member types (properties vs constants) are aligned separately.\n\nDefault: false", + "type": "boolean" + }, + "always-break-attribute-named-argument-lists": { + "default": false, + "description": "Whether to always break named argument lists in attributes into multiple lines.\n\nWhen enabled:\n```php\n#[SomeAttribute(\n argument1: 'value1',\n argument2: 'value2',\n)]\nclass Foo {}\n```\n\nDefault: false", + "type": "boolean" + }, + "always-break-named-arguments-list": { + "default": false, + "description": "Whether to always break named argument lists into multiple lines.\n\nWhen enabled:\n```php\n$foo = some_function(\n argument1: 'value1',\n argument2: 'value2',\n);\n```\n\nDefault: false", + "type": "boolean" + }, + "array-table-style-alignment": { + "default": true, + "description": "Whether to use table-style alignment for arrays.\n\nWhen enabled, array elements are aligned in a table-like format:\n```php\n$array = [\n ['foo', 1.2, 123, false],\n ['bar', 52.4, 456, true],\n ['baz', 3.6, 789, false],\n ['qux', 4.8, 1, true],\n ['quux', 5.0, 12, false],\n];\n```\n\nDefault: true", + "type": "boolean" + }, + "break-promoted-properties-list": { + "default": true, + "description": "Whether to break a parameter list with one or more promoted properties into multiple lines.\n\nWhen enabled, parameter lists with promoted properties are always multi-line:\n```php\nclass User {\n public function __construct(\n public string $name,\n public string $email,\n ) {}\n}\n```\n\nWhen disabled, they may be kept on a single line if space allows:\n```php\nclass User {\n public function __construct(public string $name, public string $email) {}\n}\n```\n\nDefault: true", + "type": "boolean" + }, + "classlike-brace-style": { + "$ref": "#/$defs/BraceStyle", + "default": "always_next_line", + "description": "Brace placement for class-like structures (classes, interfaces, traits, enums).\n\nExample with `same_line`:\n```php\nclass Foo {\n}\n```\n\nExample with `next_line` or `always_next_line`:\n```php\nclass Foo\n{\n}\n```\n\nDefault: `always_next_line`" + }, + "closure-brace-style": { + "$ref": "#/$defs/BraceStyle", + "default": "same_line", + "description": "Brace placement for closures.\n\nExample with `same_line`:\n```php\n$closure = function() {\n return 'Hello, world!';\n};\n```\n\nExample with `next_line`:\n```php\n$closure = function()\n{\n return 'Hello, world!';\n};\n```\n\nDefault: `same_line`" + }, + "control-brace-style": { + "$ref": "#/$defs/BraceStyle", + "default": "same_line", + "description": "Brace placement for control structures (if, for, while, etc.).\n\nExample with `same_line`:\n```php\nif ($expr) {\n return 'Hello, world!';\n}\n```\n\nExample with `next_line`:\n```php\nif ($expr)\n{\n return 'Hello, world!';\n}\n```\n\nDefault: `same_line`" + }, + "empty-line-after-class-like-constant": { + "default": false, + "description": "Whether to add an empty line after class-like constant.\n\nNote: if an empty line already exists, it will be preserved regardless of this\nsettings value.\n\nDefault: false", + "type": "boolean" + }, + "empty-line-after-class-like-open": { + "default": false, + "description": "Whether to add an empty line immediately after a class-like opening brace.\n\nDefault: false", + "type": "boolean" + }, + "empty-line-after-control-structure": { + "default": false, + "description": "Whether to add an empty line after control structures (if, for, foreach, while, do, switch).\n\nNote: if an empty line already exists, it will be preserved regardless of this\nsettings value.\n\nDefault: false", + "type": "boolean" + }, + "empty-line-after-declare": { + "default": true, + "description": "Whether to add an empty line after declare statement.\n\nNote: if an empty line already exists, it will be preserved regardless of this\nsettings value.\n\nDefault: true", + "type": "boolean" + }, + "empty-line-after-enum-case": { + "default": false, + "description": "Whether to add an empty line after enum case.\n\nNote: if an empty line already exists, it will be preserved regardless of this\nsettings value.\n\nDefault: false", + "type": "boolean" + }, + "empty-line-after-method": { + "default": true, + "description": "Whether to add an empty line after method.\n\nNote: if an empty line already exists, it will be preserved regardless of this\nsettings value.\n\nDefault: true", + "type": "boolean" + }, + "empty-line-after-namespace": { + "default": true, + "description": "Whether to add an empty line after namespace.\n\nNote: if an empty line already exists, it will be preserved regardless of this\nsettings value.\n\nDefault: true", + "type": "boolean" + }, + "empty-line-after-opening-tag": { + "default": true, + "description": "Whether to add an empty line after opening tag.\n\nNote: if an empty line already exists, it will be preserved regardless of this\nsettings value.\n\nDefault: true", + "type": "boolean" + }, + "empty-line-after-property": { + "default": false, + "description": "Whether to add an empty line after property.\n\nNote: if an empty line already exists, it will be preserved regardless of this\nsettings value.\n\nDefault: false", + "type": "boolean" + }, + "empty-line-after-symbols": { + "default": true, + "description": "Whether to add an empty line after symbols (class, enum, interface, trait, function, const).\n\nNote: if an empty line already exists, it will be preserved regardless of this\nsettings value.\n\nDefault: true", + "type": "boolean" + }, + "empty-line-after-trait-use": { + "default": false, + "description": "Whether to add an empty line after trait use.\n\nNote: if an empty line already exists, it will be preserved regardless of this\nsettings value.\n\nDefault: false", + "type": "boolean" + }, + "empty-line-after-use": { + "default": true, + "description": "Whether to add an empty line after use statements.\n\nNote: if an empty line already exists, it will be preserved regardless of this\nsettings value.\n\nDefault: true", + "type": "boolean" + }, + "empty-line-before-class-like-close": { + "default": false, + "description": "Whether to insert an empty line before the closing brace of class-like\nstructures when the class body is not empty.\n\nWhen enabled, a blank line will be inserted immediately before the `}`\nthat closes a class, trait, interface or enum, but only if the body\ncontains at least one member.\n\nDefault: false", + "type": "boolean" + }, + "empty-line-before-dangling-comments": { + "default": true, + "description": "Whether to add an empty line before dangling comments.\n\nDefault: true", + "type": "boolean" + }, + "empty-line-before-return": { + "default": false, + "description": "Whether to add an empty line before return statements.\n\nDefault: false", + "type": "boolean" + }, + "empty-line-between-same-symbols": { + "default": true, + "description": "Whether to add an empty line between consecutive symbols of the same type.\n\nOnly applies when `empty_line_after_symbols` is true.\n\nDefault: true", + "type": "boolean" + }, + "end-of-line": { + "$ref": "#/$defs/EndOfLine", + "default": "auto", + "description": "End-of-line characters to use.\n\nDefault: \"lf\"" + }, + "excludes": { + "description": "A list of patterns to exclude from formatting.\n\nDefaults to `[]`.", + "items": { + "type": "string" + }, + "type": "array" + }, + "expand-use-groups": { + "default": true, + "description": "Whether to expand grouped use statements into individual statements.\n\nWhen enabled:\n```php\nuse Foo\\Bar;\nuse Foo\\Baz;\n```\n\nWhen disabled:\n```php\nuse Foo\\{Bar, Baz};\n```\n\nDefault: true", + "type": "boolean" + }, + "first-method-chain-on-new-line": { + "default": true, + "description": "When method chaining breaks across lines, place the first method on a new line.\n\nThis follows PER-CS 4.7: \"When [method chaining is] put on separate lines, [...] the first method MUST be on the next line.\"\n\nWhen enabled:\n```php\n$this\n ->getCache()\n ->forget();\n```\n\nWhen disabled:\n```php\n$this->getCache()\n ->forget();\n```\n\nDefault: `true`", + "type": "boolean" + }, + "following-clause-on-newline": { + "default": false, + "description": "Whether to place `else`, `elseif`, `catch` and `finally` on a new line.\n\nDefault: false", + "type": "boolean" + }, + "function-brace-style": { + "$ref": "#/$defs/BraceStyle", + "default": "next_line", + "description": "Brace placement for function declarations.\n\nExample with `same_line`:\n```php\nfunction foo() {\n return 'Hello, world!';\n}\n```\n\nExample with `next_line`:\n```php\nfunction foo()\n{\n return 'Hello, world!';\n}\n```\n\nDefault: `next_line`" + }, + "indent-binary-expression-continuation": { + "default": false, + "description": "Whether to indent continuation lines of binary expressions.\n\nWhen enabled, if a binary expression breaks across lines, the continuation\nis indented relative to the start of the expression:\n```php\n$emailNotifications = $this->stringUtils->splitStringToArray($jobPosting->getVacancyEmailNotification())\n ?? [];\n```\n\nWhen disabled, the continuation aligns with the start of the assignment:\n```php\n$emailNotifications = $this->stringUtils->splitStringToArray($jobPosting->getVacancyEmailNotification())\n?? [];\n```\n\nDefault: false", + "type": "boolean" + }, + "indent-heredoc": { + "default": true, + "description": "Whether to indent heredoc/nowdoc content.\n\nDefault: true", + "type": "boolean" + }, + "inline-abstract-property-hooks": { + "default": true, + "description": "Whether to keep abstract property hooks inline.\n\nWhen enabled: `public int $id { get; }`\nWhen disabled: hook list is always expanded\n\nDefault: true ([PER-CS 4.10](https://www.php-fig.org/per/coding-style/#410-interface-and-abstract-properties) compliant)", + "type": "boolean" + }, + "inline-empty-anonymous-class-braces": { + "default": true, + "description": "Place empty anonymous class bodies on the same line.\n\nExample with `false`:\n```php\n$anon = new class\n{\n};\n```\n\nExample with `true`:\n```php\n$anon = new class {};\n```\n\nDefault: true", + "type": "boolean" + }, + "inline-empty-classlike-braces": { + "default": true, + "description": "Place empty class-like bodies on the same line.\n\nExample with `false`:\n```php\nclass Foo\n{\n}\n```\n\nExample with `true`:\n```php\nclass Foo {}\n```\n\nDefault: true", + "type": "boolean" + }, + "inline-empty-closure-braces": { + "default": true, + "description": "Place empty closure bodies on the same line.\n\nExample with `false`:\n```php\n$closure = function()\n{\n};\n```\n\nExample with `true`:\n```php\n$closure = function() {};\n```\n\nDefault: true", + "type": "boolean" + }, + "inline-empty-constructor-braces": { + "default": true, + "description": "Place empty constructor bodies on the same line.\n\nExample with `false`:\n```php\nclass Foo {\n public function __construct()\n {\n }\n}\n```\n\nExample with `true`:\n```php\nclass Foo {\n public function __construct() {}\n}\n```\n\nDefault: true", + "type": "boolean" + }, + "inline-empty-control-braces": { + "default": false, + "description": "Place empty control structure bodies on the same line.\n\nExample with `false`:\n```php\nif ($expr)\n{\n}\n```\n\nExample with `true`:\n```php\nif ($expr) {}\n```\n\nDefault: false", + "type": "boolean" + }, + "inline-empty-function-braces": { + "default": true, + "description": "Place empty function bodies on the same line.\n\nExample with `false`:\n```php\nfunction foo()\n{\n}\n```\n\nExample with `true`:\n```php\nfunction foo() {}\n```\n\nDefault: true", + "type": "boolean" + }, + "inline-empty-method-braces": { + "default": true, + "description": "Place empty method bodies on the same line.\n\nExample with `false`:\n```php\nclass Foo\n{\n public function bar()\n {\n }\n}\n```\n\nExample with `true`:\n```php\nclass Foo\n{\n public function bar() {}\n}\n```\n\nDefault: true", + "type": "boolean" + }, + "line-before-binary-operator": { + "default": true, + "description": "Whether to add a line before binary operators or after when breaking.\n\nWhen true:\n```php\n$foo = 'Hello, '\n . 'world!';\n```\n\nWhen false:\n```php\n$foo = 'Hello, ' .\n 'world!';\n```\n\nNote: If the right side has a leading comment, this setting is always false.\n\nDefault: true", + "type": "boolean" + }, + "method-brace-style": { + "$ref": "#/$defs/BraceStyle", + "default": "next_line", + "description": "Brace placement for method declarations.\n\nExample with `same_line`:\n```php\nclass Foo\n{\n public function bar() {\n return 'Hello, world!';\n }\n}\n```\n\nExample with `next_line`:\n```php\nclass Foo\n{\n public function bar()\n {\n return 'Hello, world!';\n }\n}\n```\n\nDefault: `next_line`" + }, + "method-chain-breaking-style": { + "$ref": "#/$defs/MethodChainBreakingStyle", + "default": "next_line", + "description": "How to format broken method/property chains.\n\nWhen `next_line`, the first method/property starts on a new line:\n```php\n$foo\n ->bar()\n ->baz();\n```\n\nWhen `same_line`, the first method/property stays on the same line:\n```php\n$foo->bar()\n ->baz();\n```\n\nDefault: `next_line`" + }, + "method-chain-semicolon-on-next-line": { + "default": false, + "description": "When a method chain breaks across multiple lines, place the semicolon on its own line.\n\nWhen enabled:\n```php\n$object->method1()\n ->method2()\n ->method3()\n;\n```\n\nWhen disabled:\n```php\n$object->method1()\n ->method2()\n ->method3();\n```\n\nDefault: `false`", + "type": "boolean" + }, + "null-type-hint": { + "$ref": "#/$defs/NullTypeHint", + "default": "question", + "description": "How to format null type hints.\n\nWith `Question`:\n```php\nfunction foo(\n ?string $a,\n null|int|string $b,\n int|null|string $c,\n) {}\n```\n\nWith `NullPipe`:\n```php\nfunction foo(\n null|string $a,\n null|int|string $b,\n int|null|string $c,\n) {}\n```\n\nWith `NullPipeLast`:\n```php\nfunction foo(\n string|null $a,\n int|string|null $b,\n int|string|null $c,\n) {}\n```\n\nDefault: `Question`" + }, + "opening-tag-on-own-line": { + "default": true, + "description": "Whether the opening `bar();\n```\n\nWhen disabled (PHP 8.4+ only):\n```php\n$foo = new Foo->bar();\n```\n\nDefault: false", + "type": "boolean" + }, + "parentheses-in-attribute": { + "default": false, + "description": "Whether to include parentheses in attributes with no arguments.\n\nWhen enabled:\n```php\n#[SomeAttribute()]\nclass Foo {}\n```\n\nWhen disabled:\n```php\n#[SomeAttribute]\nclass Foo {}\n```\n\nDefault: false", + "type": "boolean" + }, + "parentheses-in-exit-and-die": { + "default": true, + "description": "Whether to include parentheses in `exit` and `die` constructs.\n\nWhen enabled:\n```php\nexit();\ndie();\n```\n\nWhen disabled:\n```php\nexit;\ndie;\n```\n\nDefault: true", + "type": "boolean" + }, + "parentheses-in-new-expression": { + "default": true, + "description": "Whether to include parentheses in `new` expressions when no arguments are provided.\n\nWhen enabled:\n```php\n$foo = new Foo();\n```\n\nWhen disabled:\n```php\n$foo = new Foo;\n```\n\nDefault: true", + "type": "boolean" + }, + "preserve-breaking-argument-list": { + "default": false, + "description": "Whether to preserve line breaks in argument lists, even if they could fit on a single line.\n\nDefault: false", + "type": "boolean" + }, + "preserve-breaking-array-like": { + "default": true, + "description": "Whether to preserve line breaks in array-like structures, even if they could fit on a single line.\n\nDefault: true", + "type": "boolean" + }, + "preserve-breaking-attribute-list": { + "default": false, + "description": "Whether to preserve line breaks in attribute lists, even if they could fit on a single line.\n\nDefault: false", + "type": "boolean" + }, + "preserve-breaking-condition-expression": { + "default": false, + "description": "Whether to preserve line breaks in condition expressions (if, elseif, while, do-while, switch, match).\n\nWhen enabled, if the original source has conditions broken across multiple lines,\nthe formatter maintains that layout using PER Coding Style 3.0 rules.\n\nDefault: false", + "type": "boolean" + }, + "preserve-breaking-conditional-expression": { + "default": false, + "description": "Whether to preserve line breaks in conditional (ternary) expressions.\n\nDefault: false", + "type": "boolean" + }, + "preserve-breaking-member-access-chain": { + "default": false, + "description": "Whether to preserve line breaks in method chains, even if they could fit on a single line.\n\nDefault: false", + "type": "boolean" + }, + "preserve-breaking-parameter-list": { + "default": false, + "description": "Whether to preserve line breaks in parameter lists, even if they could fit on a single line.\n\nDefault: false", + "type": "boolean" + }, + "preset": { + "anyOf": [ + { + "$ref": "#/$defs/FormatterPreset" + }, + { + "type": "null" + } + ] + }, + "print-width": { + "default": 120, + "description": "Maximum line length that the printer will wrap on.\n\nDefault: 120", + "format": "uint", + "minimum": 0, + "type": "integer" + }, + "remove-trailing-close-tag": { + "default": true, + "description": "Whether to remove the trailing PHP close tag (`?>`) from files.\n\nDefault: true", + "type": "boolean" + }, + "separate-class-like-members": { + "default": true, + "description": "Whether to separate class-like members of different kinds with a blank line.\n\nDefault: true", + "type": "boolean" + }, + "separate-use-types": { + "default": true, + "description": "Whether to insert a blank line between different types of use statements.\n\nWhen enabled:\n```php\nuse Foo\\Bar;\nuse Foo\\Baz;\n\nuse function Foo\\bar;\nuse function Foo\\baz;\n\nuse const Foo\\A;\nuse const Foo\\B;\n```\n\nWhen disabled:\n```php\nuse Foo\\Bar;\nuse Foo\\Baz;\nuse function Foo\\bar;\nuse function Foo\\baz;\nuse const Foo\\A;\nuse const Foo\\B;\n```\n\nDefault: true", + "type": "boolean" + }, + "single-quote": { + "default": true, + "description": "Whether to use single quotes instead of double quotes for strings.\n\nThe formatter automatically determines which quotes to use based on the string content,\nwith a preference for single quotes if this option is enabled.\n\nDecision logic:\n- If the string contains more single quotes than double quotes, double quotes are used\n- If the string contains more double quotes than single quotes, single quotes are used\n- If equal number of both, single quotes are used if this option is true\n\nDefault: true", + "type": "boolean" + }, + "sort-class-methods": { + "default": false, + "description": "Whether to sort class methods by visibility and name.\n\nWhen enabled, methods in class-like structures are automatically reordered:\n1. Constructor (`__construct`) - always first\n2. Static methods (by visibility: public, protected, private)\n - Abstract methods before concrete methods\n - Alphabetically by name within each group\n3. Instance methods (by visibility: public, protected, private)\n - Abstract methods before concrete methods\n - Alphabetically by name within each group\n4. Other magic methods (e.g., `__toString`, `__get`, `__set`)\n - Sorted alphabetically by name\n5. Destructor (`__destruct`) - always last\n\nThis applies to all class-like structures: classes, traits, interfaces, and enums.\nOther members (constants, properties, trait uses, enum cases) remain in their original positions.\n\nDefault: false", + "type": "boolean" + }, + "sort-uses": { + "default": true, + "description": "Whether to sort use statements alphabetically.\n\nDefault: true", + "type": "boolean" + }, + "space-after-additive-unary-prefix-operator": { + "default": false, + "description": "Whether to add a space after the additive unary operators (+ and -).\n\nWhen enabled: `+ $i`\nWhen disabled: `+$i`\n\nDefault: false", + "type": "boolean" + }, + "space-after-bitwise-not-unary-prefix-operator": { + "default": false, + "description": "Whether to add a space after the bitwise not operator (~).\n\nWhen enabled: `~ $foo`\nWhen disabled: `~$foo`\n\nDefault: false", + "type": "boolean" + }, + "space-after-cast-unary-prefix-operators": { + "default": true, + "description": "Whether to add a space after cast operators (int, float, string, etc.).\n\nWhen enabled: `(int) $foo`\nWhen disabled: `(int)$foo`\n\nDefault: true", + "type": "boolean" + }, + "space-after-decrement-unary-prefix-operator": { + "default": false, + "description": "Whether to add a space after the decrement prefix operator (--).\n\nWhen enabled: `-- $i`\nWhen disabled: `--$i`\n\nDefault: false", + "type": "boolean" + }, + "space-after-error-control-unary-prefix-operator": { + "default": false, + "description": "Whether to add a space after the error control operator (@).\n\nWhen enabled: `@ $foo`\nWhen disabled: `@$foo`\n\nDefault: false", + "type": "boolean" + }, + "space-after-increment-unary-prefix-operator": { + "default": false, + "description": "Whether to add a space after the increment prefix operator (++).\n\nWhen enabled: `++ $i`\nWhen disabled: `++$i`\n\nDefault: false", + "type": "boolean" + }, + "space-after-logical-not-unary-prefix-operator": { + "default": false, + "description": "Whether to add a space after the logical not operator (!).\n\nWhen enabled: `! $foo`\nWhen disabled: `!$foo`\n\nDefault: false", + "type": "boolean" + }, + "space-after-reference-unary-prefix-operator": { + "default": false, + "description": "Whether to add a space after the reference operator (&).\n\nWhen enabled: `& $foo`\nWhen disabled: `&$foo`\n\nDefault: false", + "type": "boolean" + }, + "space-around-assignment-in-declare": { + "default": false, + "description": "Whether to add spaces around the assignment in declare statements.\n\nWhen enabled: `declare(strict_types = 1)`\nWhen disabled: `declare(strict_types=1)`\n\nDefault: false", + "type": "boolean" + }, + "space-around-concatenation-binary-operator": { + "default": true, + "description": "Whether to add spaces around the concatenation operator (.)\n\nWhen enabled: `$a . $b`\nWhen disabled: `$a.$b`\n\nDefault: true", + "type": "boolean" + }, + "space-before-arrow-function-parameter-list-parenthesis": { + "default": false, + "description": "Whether to add a space before the opening parameters in arrow functions.\n\nWhen enabled: `fn ($x) => $x * 2`\nWhen disabled: `fn($x) => $x * 2`\n\nDefault: false", + "type": "boolean" + }, + "space-before-closure-parameter-list-parenthesis": { + "default": true, + "description": "Whether to add a space before the opening parameters in closures.\n\nWhen enabled: `function ($x) use ($y)`\nWhen disabled: `function($x) use ($y)`\n\nDefault: true", + "type": "boolean" + }, + "space-before-closure-use-clause-parenthesis": { + "default": true, + "description": "Whether to add a space before the opening parenthesis in closure use clause.\n\nWhen enabled: `function() use ($var)`\nWhen disabled: `function() use($var)`\n\nDefault: true", + "type": "boolean" + }, + "space-before-hook-parameter-list-parenthesis": { + "default": false, + "description": "Whether to add a space before the opening parameters in hooks.\n\nWhen enabled: `$hook ($param)`\nWhen disabled: `$hook($param)`\n\nDefault: false", + "type": "boolean" + }, + "space-within-grouping-parenthesis": { + "default": false, + "description": "Whether to add spaces within grouping parentheses.\n\nWhen enabled: `( $expr ) - $expr`\nWhen disabled: `($expr) - $expr`\n\nDefault: false", + "type": "boolean" + }, + "tab-width": { + "default": 4, + "description": "Number of spaces per indentation level.\n\nDefault: 4", + "format": "uint", + "minimum": 0, + "type": "integer" + }, + "trailing-comma": { + "default": true, + "description": "Whether to add a trailing comma to the last element in multi-line syntactic structures.\n\nWhen enabled, trailing commas are added to lists, arrays, parameter lists,\nargument lists, and other similar structures when they span multiple lines.\n\nDefault: true", + "type": "boolean" + }, + "uppercase-literal-keyword": { + "default": false, + "description": "Whether to print boolean and null literals in upper-case (e.g. `TRUE`, `FALSE`, `NULL`).\nWhen enabled these literals are printed in uppercase; when disabled they are printed\nin lowercase.\n\nDefault: false", + "type": "boolean" + }, + "use-tabs": { + "default": false, + "description": "Whether to use tabs instead of spaces for indentation.\n\nDefault: false", + "type": "boolean" + } + }, + "title": "FormatterConfiguration", + "type": "object" + }, + "FormatterPreset": { + "description": "Available formatter presets.", + "type": "string" + }, + "GlobConfiguration": { + "additionalProperties": false, + "description": "Configuration for glob pattern matching behavior.\n\nThese settings control how glob patterns in `paths`, `includes`, and `excludes` are interpreted.\nAll defaults match standard glob behavior for backwards compatibility.", + "properties": { + "backslash-escape": { + "default": true, + "description": "Whether `\\` escapes special characters in patterns.\n\nDefault: `true`.", + "type": "boolean" + }, + "case-insensitive": { + "default": false, + "description": "Match patterns case-insensitively.\n\nDefault: `false`.", + "type": "boolean" + }, + "empty-alternates": { + "default": false, + "description": "Whether an empty case in alternates is allowed.\n\nWhen enabled, `{,a}` matches both `\"\"` and `\"a\"`.\n\nDefault: `false`.", + "type": "boolean" + }, + "literal-separator": { + "default": false, + "description": "When `true`, a single `*` does not match path separators (`/`).\n\nThis makes `src/*/Test` match only `src/foo/Test`, not `src/foo/bar/Test`.\nUse `**` for recursive matching across directories.\n\nDefault: `false`.", + "type": "boolean" + } + }, + "type": "object" + }, + "GuardConfiguration": { + "additionalProperties": false, + "properties": { + "baseline": { + "default": null, + "description": "Path to a baseline file to ignore listed issues.", + "type": ["string", "null"] + }, + "baseline-variant": { + "$ref": "#/$defs/BaselineVariant", + "default": "loose", + "description": "The baseline variant to use when generating new baselines.\n\nOptions:\n\n- `\"strict\"`: Exact line matching with start/end line numbers\n- `\"loose\"`: Count-based matching by (file, code, message) tuple (default)\n\nThe loose variant is more resilient to code changes as line number shifts\ndon't affect the baseline." + }, + "excludes": { + "default": [], + "description": "A list of patterns to exclude from guard checking.", + "items": { + "type": "string" + }, + "type": "array" + }, + "minimum-fail-level": { + "$ref": "#/$defs/Level", + "default": "Error", + "description": "Set the minimum issue severity that causes the command to fail.\n\nOptions: `\"note\"`, `\"help\"`, `\"warning\"`, `\"error\"`\n\nCan be overridden by the `--minimum-fail-level` CLI flag.\n\nDefaults to `\"error\"`." + }, + "mode": { + "$ref": "#/$defs/GuardMode", + "default": "default" + }, + "perimeter": { + "$ref": "#/$defs/PerimeterSettings", + "default": { + "layering": [], + "layers": {}, + "rules": [] + } + }, + "structural": { + "$ref": "#/$defs/StructuralSettings", + "default": { + "rules": [] + } + } + }, + "type": "object" + }, + "GuardMode": { + "description": "Specifies which guard modes to run.", + "oneOf": [ + { + "const": "default", + "description": "Run both structural and perimeter guards (default)", + "type": "string" + }, + { + "const": "structural", + "description": "Run only structural guard", + "type": "string" + }, + { + "const": "perimeter", + "description": "Run only perimeter guard", + "type": "string" + } + ] + }, + "IgnoreEntry": { + "anyOf": [ + { + "description": "Ignore a code everywhere: `\"code1\"`", + "type": "string" + }, + { + "description": "Ignore a code in specific paths: `{ code = \"code2\", in = \"path/\" }`", + "properties": { + "code": { + "type": "string" + }, + "in": { + "items": { + "type": "string" + }, + "type": "array" + } + }, + "required": ["code", "in"], + "type": "object" + } + ], + "description": "Represents an entry in the analyzer's `ignore` configuration.\n\nCan be either a plain code string (ignored everywhere) or a scoped entry\nthat only ignores a code in specific paths." + }, + "Level": { + "description": "Represents the severity level of an issue.", + "oneOf": [ + { + "const": "Note", + "description": "A note, providing additional information or context.", + "type": "string" + }, + { + "const": "Help", + "description": "A help message, suggesting possible solutions or further actions.", + "type": "string" + }, + { + "const": "Warning", + "description": "A warning, indicating a potential problem that may need attention.", + "type": "string" + }, + { + "const": "Error", + "description": "An error, indicating a problem that prevents the code from functioning correctly.", + "type": "string" + } + ] + }, + "LinterConfiguration": { + "additionalProperties": false, + "properties": { + "baseline": { + "default": null, + "description": "Path to a baseline file to ignore listed issues.", + "type": ["string", "null"] + }, + "baseline-variant": { + "$ref": "#/$defs/BaselineVariant", + "default": "loose", + "description": "The baseline variant to use when generating new baselines.\n\nOptions:\n\n- `\"strict\"`: Exact line matching with start/end line numbers\n- `\"loose\"`: Count-based matching by (file, code, message) tuple (default)\n\nThe loose variant is more resilient to code changes as line number shifts\ndon't affect the baseline." + }, + "excludes": { + "default": [], + "description": "A list of patterns to exclude from linting.", + "items": { + "type": "string" + }, + "type": "array" + }, + "integrations": { + "default": [], + "description": "Integrations to enable during linting.", + "items": { + "type": "string" + }, + "type": "array" + }, + "minimum-fail-level": { + "$ref": "#/$defs/Level", + "default": "Error", + "description": "Set the minimum issue severity that causes the command to fail.\n\nOptions: `\"note\"`, `\"help\"`, `\"warning\"`, `\"error\"`\n\nCan be overridden by the `--minimum-fail-level` CLI flag.\n\nDefaults to `\"error\"`." + }, + "rules": { + "$ref": "#/$defs/RulesSettings", + "default": { + "ambiguous-constant-access": { + "enabled": false, + "level": "Help" + }, + "ambiguous-function-call": { + "enabled": false, + "level": "Help" + }, + "array-style": { + "enabled": true, + "level": "Note", + "style": "short" + }, + "assert-description": { + "enabled": true, + "level": "Warning" + }, + "assertion-style": { + "enabled": true, + "level": "Warning", + "style": "static" + }, + "block-statement": { + "enabled": true, + "level": "Note" + }, + "braced-string-interpolation": { + "enabled": true, + "level": "Note" + }, + "class-name": { + "enabled": true, + "level": "Help", + "psr": false + }, + "combine-consecutive-issets": { + "enabled": true, + "level": "Warning" + }, + "constant-condition": { + "enabled": true, + "level": "Help" + }, + "constant-name": { + "enabled": true, + "level": "Help" + }, + "cyclomatic-complexity": { + "enabled": true, + "level": "Error", + "method-threshold": null, + "threshold": 15 + }, + "deprecated-cast": { + "enabled": true, + "level": "Error" + }, + "deprecated-shell-execute-string": { + "enabled": true, + "level": "Error" + }, + "deprecated-switch-semicolon": { + "enabled": true, + "level": "Error" + }, + "disallowed-functions": { + "enabled": true, + "extensions": [], + "functions": [], + "level": "Warning" + }, + "enum-name": { + "enabled": true, + "level": "Help" + }, + "excessive-nesting": { + "enabled": true, + "function-like-threshold": null, + "level": "Warning", + "threshold": 7 + }, + "excessive-parameter-list": { + "constructor-threshold": null, + "enabled": true, + "level": "Error", + "threshold": 5 + }, + "explicit-nullable-param": { + "enabled": true, + "level": "Warning" + }, + "explicit-octal": { + "enabled": true, + "level": "Warning" + }, + "file-name": { + "check-functions": false, + "enabled": true, + "level": "Warning" + }, + "final-controller": { + "enabled": true, + "level": "Error" + }, + "function-name": { + "camel": false, + "either": false, + "enabled": true, + "level": "Help" + }, + "halstead": { + "difficulty-threshold": 12.0, + "effort-threshold": 5000.0, + "enabled": true, + "level": "Warning", + "volume-threshold": 1000.0 + }, + "identity-comparison": { + "enabled": true, + "level": "Warning" + }, + "ineffective-format-ignore-next": { + "enabled": true, + "level": "Warning" + }, + "ineffective-format-ignore-region": { + "enabled": true, + "level": "Warning" + }, + "inline-variable-return": { + "enabled": true, + "level": "Warning" + }, + "instanceof-stringable": { + "enabled": true, + "level": "Warning" + }, + "interface-name": { + "enabled": true, + "level": "Help", + "psr": false + }, + "invalid-open-tag": { + "enabled": true, + "level": "Note" + }, + "kan-defect": { + "enabled": true, + "level": "Error", + "threshold": 1.6 + }, + "literal-named-argument": { + "check-first-argument": false, + "enabled": true, + "level": "Warning", + "threshold": 1 + }, + "loop-does-not-iterate": { + "enabled": true, + "level": "Warning" + }, + "lowercase-keyword": { + "enabled": true, + "level": "Help" + }, + "lowercase-type-hint": { + "enabled": true, + "level": "Help" + }, + "method-name": { + "camel": true, + "either": false, + "enabled": false, + "level": "Help", + "use-snake-case-for-tests": false + }, + "middleware-in-routes": { + "enabled": true, + "level": "Warning" + }, + "missing-docs": { + "classes": false, + "constants": true, + "enabled": false, + "enum-cases": true, + "enums": false, + "functions": true, + "interfaces": false, + "level": "Help", + "methods": true, + "properties": true, + "statics": true, + "traits": false + }, + "no-alias-function": { + "enabled": true, + "level": "Note" + }, + "no-alternative-syntax": { + "enabled": false, + "level": "Warning" + }, + "no-array-accumulation-in-loop": { + "enabled": false, + "level": "Warning" + }, + "no-assign-in-argument": { + "enabled": false, + "level": "Warning" + }, + "no-assign-in-condition": { + "enabled": true, + "level": "Warning" + }, + "no-boolean-flag-parameter": { + "enabled": true, + "exclude-constructors": true, + "exclude-setters": false, + "level": "Help" + }, + "no-closing-tag": { + "enabled": true, + "level": "Help" + }, + "no-db-schema-change": { + "enabled": true, + "level": "Error" + }, + "no-debug-symbols": { + "enabled": true, + "level": "Note" + }, + "no-direct-db-query": { + "enabled": true, + "level": "Warning" + }, + "no-else-clause": { + "enabled": true, + "level": "Help" + }, + "no-empty": { + "enabled": true, + "level": "Error" + }, + "no-empty-catch-clause": { + "enabled": true, + "level": "Warning" + }, + "no-empty-comment": { + "enabled": true, + "level": "Note", + "preserve-single-line-comments": false + }, + "no-empty-loop": { + "enabled": true, + "level": "Note" + }, + "no-error-control-operator": { + "enabled": true, + "level": "Error" + }, + "no-eval": { + "enabled": true, + "level": "Error" + }, + "no-ffi": { + "enabled": true, + "level": "Error" + }, + "no-fully-qualified-global-class-like": { + "enabled": false, + "level": "Help" + }, + "no-fully-qualified-global-constant": { + "enabled": false, + "level": "Help" + }, + "no-fully-qualified-global-function": { + "enabled": false, + "level": "Help" + }, + "no-global": { + "enabled": true, + "level": "Error" + }, + "no-goto": { + "enabled": true, + "level": "Note" + }, + "no-hash-comment": { + "enabled": true, + "level": "Warning" + }, + "no-hash-emoji": { + "enabled": true, + "level": "Warning" + }, + "no-ini-set": { + "enabled": true, + "level": "Warning" + }, + "no-inline": { + "enabled": false, + "level": "Error" + }, + "no-insecure-comparison": { + "enabled": true, + "level": "Error" + }, + "no-is-null": { + "enabled": false, + "level": "Note" + }, + "no-isset": { + "allow-array-checks": false, + "enabled": true, + "level": "Warning" + }, + "no-iterator-to-array-in-foreach": { + "enabled": false, + "level": "Warning" + }, + "no-literal-password": { + "enabled": true, + "level": "Error" + }, + "no-multi-assignments": { + "enabled": true, + "level": "Warning" + }, + "no-nested-ternary": { + "enabled": true, + "level": "Warning" + }, + "no-noop": { + "enabled": true, + "level": "Help" + }, + "no-only": { + "enabled": true, + "level": "Error" + }, + "no-parameter-shadowing": { + "enabled": false, + "level": "Warning" + }, + "no-php-tag-terminator": { + "enabled": true, + "level": "Note" + }, + "no-protected-in-final": { + "enabled": true, + "level": "Help" + }, + "no-redundant-binary-string-prefix": { + "enabled": true, + "level": "Help" + }, + "no-redundant-block": { + "enabled": true, + "level": "Help" + }, + "no-redundant-continue": { + "enabled": true, + "level": "Help" + }, + "no-redundant-file": { + "enabled": true, + "level": "Help" + }, + "no-redundant-final": { + "enabled": true, + "level": "Help" + }, + "no-redundant-isset": { + "enabled": true, + "level": "Help" + }, + "no-redundant-label": { + "enabled": true, + "level": "Help" + }, + "no-redundant-literal-return": { + "enabled": true, + "level": "Warning" + }, + "no-redundant-math": { + "enabled": true, + "level": "Help" + }, + "no-redundant-method-override": { + "enabled": true, + "level": "Help" + }, + "no-redundant-nullsafe": { + "enabled": true, + "level": "Help" + }, + "no-redundant-parentheses": { + "enabled": true, + "level": "Help" + }, + "no-redundant-readonly": { + "enabled": true, + "level": "Help" + }, + "no-redundant-string-concat": { + "enabled": true, + "level": "Help" + }, + "no-redundant-use": { + "enabled": true, + "level": "Warning" + }, + "no-redundant-write-visibility": { + "enabled": true, + "level": "Help" + }, + "no-redundant-yield-from": { + "enabled": true, + "level": "Help" + }, + "no-request-all": { + "enabled": true, + "level": "Warning" + }, + "no-request-variable": { + "enabled": true, + "level": "Error" + }, + "no-roles-as-capabilities": { + "enabled": true, + "level": "Warning" + }, + "no-self-assignment": { + "enabled": true, + "level": "Warning" + }, + "no-shell-execute-string": { + "enabled": true, + "level": "Error" + }, + "no-short-bool-cast": { + "enabled": false, + "level": "Help" + }, + "no-short-opening-tag": { + "enabled": true, + "level": "Warning" + }, + "no-shorthand-ternary": { + "enabled": true, + "level": "Warning" + }, + "no-sprintf-concat": { + "enabled": true, + "level": "Warning" + }, + "no-trailing-space": { + "enabled": true, + "level": "Note" + }, + "no-underscore-class": { + "enabled": true, + "level": "Warning" + }, + "no-unescaped-output": { + "enabled": true, + "level": "Error" + }, + "no-unsafe-finally": { + "enabled": true, + "level": "Error" + }, + "no-variable-variable": { + "enabled": true, + "level": "Warning" + }, + "no-void-reference-return": { + "enabled": true, + "level": "Warning" + }, + "optional-param-order": { + "enabled": true, + "level": "Warning" + }, + "prefer-anonymous-migration": { + "enabled": true, + "level": "Warning" + }, + "prefer-arrow-function": { + "enabled": true, + "level": "Help" + }, + "prefer-early-continue": { + "enabled": true, + "level": "Help", + "max_allowed_statements": 0 + }, + "prefer-first-class-callable": { + "check-functions": false, + "enabled": true, + "level": "Warning" + }, + "prefer-interface": { + "enabled": true, + "level": "Note" + }, + "prefer-pre-increment": { + "enabled": false, + "level": "Help" + }, + "prefer-static-closure": { + "enabled": true, + "level": "Help" + }, + "prefer-test-attribute": { + "enabled": false, + "level": "Warning" + }, + "prefer-view-array": { + "enabled": true, + "level": "Help" + }, + "prefer-while-loop": { + "enabled": true, + "level": "Note" + }, + "property-name": { + "camel": true, + "either": false, + "enabled": false, + "level": "Help" + }, + "psl-array-functions": { + "enabled": true, + "level": "Warning" + }, + "psl-data-structures": { + "enabled": true, + "level": "Warning" + }, + "psl-datetime": { + "enabled": true, + "level": "Warning" + }, + "psl-math-functions": { + "enabled": true, + "level": "Warning" + }, + "psl-output": { + "enabled": true, + "level": "Error" + }, + "psl-randomness-functions": { + "enabled": true, + "level": "Warning" + }, + "psl-regex-functions": { + "enabled": true, + "level": "Warning" + }, + "psl-sleep-functions": { + "enabled": true, + "level": "Warning" + }, + "psl-string-functions": { + "enabled": true, + "level": "Warning" + }, + "readable-literal": { + "enabled": true, + "level": "Warning", + "min-digits": 5 + }, + "require-namespace": { + "enabled": false, + "level": "Warning" + }, + "require-preg-quote-delimiter": { + "enabled": true, + "level": "Warning" + }, + "sensitive-parameter": { + "enabled": true, + "level": "Error" + }, + "single-class-per-file": { + "enabled": true, + "level": "Warning" + }, + "sorted-integer-keys": { + "enabled": false, + "level": "Help" + }, + "str-contains": { + "enabled": true, + "level": "Warning" + }, + "str-starts-with": { + "enabled": true, + "level": "Warning" + }, + "strict-assertions": { + "enabled": true, + "level": "Warning" + }, + "strict-behavior": { + "allow-loose-behavior": false, + "enabled": true, + "level": "Warning" + }, + "strict-types": { + "allow-disabling": false, + "enabled": true, + "level": "Warning" + }, + "switch-continue-to-break": { + "enabled": false, + "level": "Warning" + }, + "tagged-fixme": { + "enabled": true, + "level": "Warning" + }, + "tagged-todo": { + "enabled": true, + "level": "Warning" + }, + "tainted-data-to-sink": { + "enabled": true, + "known-sink-functions": ["printf"], + "level": "Error" + }, + "too-many-enum-cases": { + "enabled": true, + "level": "Error", + "threshold": 20 + }, + "too-many-methods": { + "count-hooks": false, + "count-setters-and-getters": false, + "enabled": true, + "level": "Error", + "threshold": 10 + }, + "too-many-properties": { + "enabled": true, + "level": "Error", + "threshold": 10 + }, + "trait-name": { + "enabled": true, + "level": "Help", + "psr": false + }, + "use-compound-assignment": { + "enabled": true, + "level": "Help" + }, + "use-dedicated-expectation": { + "enabled": true, + "level": "Warning" + }, + "use-simpler-expectation": { + "enabled": true, + "level": "Warning" + }, + "use-specific-assertions": { + "enabled": true, + "level": "Warning" + }, + "use-specific-expectations": { + "enabled": true, + "level": "Warning" + }, + "use-wp-functions": { + "enabled": true, + "level": "Warning" + }, + "valid-docblock": { + "enabled": true, + "level": "Note" + }, + "variable-name": { + "camel": false, + "check-parameters": true, + "either": true, + "enabled": false, + "level": "Help" + }, + "yoda-conditions": { + "enabled": false, + "level": "Help" + } + }, + "description": "Settings for various linting rules." + } + }, + "type": "object" + }, + "MethodChainBreakingStyle": { + "enum": ["same_line", "next_line"], + "type": "string" + }, + "NullTypeHint": { + "description": "Specifies null type hint style.", + "enum": ["null_pipe", "null_pipe_last", "question"], + "type": "string" + }, + "PHPVersion": { + "description": "Represents a PHP version in `(major, minor, patch)` format,\npacked internally into a single `u32` for easy comparison.\n\n# Examples\n\n```\nuse mago_php_version::PHPVersion;\n\nlet version = PHPVersion::new(8, 4, 0);\nassert_eq!(version.major(), 8);\nassert_eq!(version.minor(), 4);\nassert_eq!(version.patch(), 0);\nassert_eq!(version.to_version_id(), 0x08_04_00);\nassert_eq!(version.to_string(), \"8.4.0\");\n```", + "type": "string" + }, + "ParserConfiguration": { + "additionalProperties": false, + "description": "Configuration for the PHP parser.\n\nControls how PHP code is parsed, including lexer-level settings\nthat affect tokenization behavior.", + "properties": { + "enable-short-tags": { + "default": true, + "description": "Whether to enable PHP short open tags (` - + + diff --git a/web/app/themes/haiku-atelier-2024/assets/img/icons/aboutlclick-black.svg b/web/app/themes/haiku-atelier-2024/assets/img/icons/aboutlclick-black.svg index c1584366..d91f14b2 100755 --- a/web/app/themes/haiku-atelier-2024/assets/img/icons/aboutlclick-black.svg +++ b/web/app/themes/haiku-atelier-2024/assets/img/icons/aboutlclick-black.svg @@ -1,17 +1,11 @@ - + diff --git a/web/app/themes/haiku-atelier-2024/assets/img/icons/aboutlclick-yellow.svg b/web/app/themes/haiku-atelier-2024/assets/img/icons/aboutlclick-yellow.svg index 4cf51fac..59e3cb1a 100755 --- a/web/app/themes/haiku-atelier-2024/assets/img/icons/aboutlclick-yellow.svg +++ b/web/app/themes/haiku-atelier-2024/assets/img/icons/aboutlclick-yellow.svg @@ -1,17 +1,11 @@ - + diff --git a/web/app/themes/haiku-atelier-2024/assets/img/icons/arrow-droite.svg b/web/app/themes/haiku-atelier-2024/assets/img/icons/arrow-droite.svg index 5f7ad017..8a066f89 100755 --- a/web/app/themes/haiku-atelier-2024/assets/img/icons/arrow-droite.svg +++ b/web/app/themes/haiku-atelier-2024/assets/img/icons/arrow-droite.svg @@ -1,6 +1,3 @@ - + diff --git a/web/app/themes/haiku-atelier-2024/assets/img/icons/arrow.svg b/web/app/themes/haiku-atelier-2024/assets/img/icons/arrow.svg index 8539738e..29538a2f 100755 --- a/web/app/themes/haiku-atelier-2024/assets/img/icons/arrow.svg +++ b/web/app/themes/haiku-atelier-2024/assets/img/icons/arrow.svg @@ -1,6 +1,3 @@ - + diff --git a/web/app/themes/haiku-atelier-2024/assets/img/icons/cloud-gris.svg b/web/app/themes/haiku-atelier-2024/assets/img/icons/cloud-gris.svg index 5f051a6f..b9c2c019 100755 --- a/web/app/themes/haiku-atelier-2024/assets/img/icons/cloud-gris.svg +++ b/web/app/themes/haiku-atelier-2024/assets/img/icons/cloud-gris.svg @@ -1,10 +1,4 @@ - - + + diff --git a/web/app/themes/haiku-atelier-2024/assets/img/icons/cloud-penche.svg b/web/app/themes/haiku-atelier-2024/assets/img/icons/cloud-penche.svg index 9f524cc5..4489329e 100755 --- a/web/app/themes/haiku-atelier-2024/assets/img/icons/cloud-penche.svg +++ b/web/app/themes/haiku-atelier-2024/assets/img/icons/cloud-penche.svg @@ -1,9 +1,3 @@ - - + + diff --git a/web/app/themes/haiku-atelier-2024/assets/img/icons/cloud-rouge.svg b/web/app/themes/haiku-atelier-2024/assets/img/icons/cloud-rouge.svg index da5c389b..9ab7beb4 100755 --- a/web/app/themes/haiku-atelier-2024/assets/img/icons/cloud-rouge.svg +++ b/web/app/themes/haiku-atelier-2024/assets/img/icons/cloud-rouge.svg @@ -1,10 +1,4 @@ - - + + diff --git a/web/app/themes/haiku-atelier-2024/assets/img/icons/cloud.svg b/web/app/themes/haiku-atelier-2024/assets/img/icons/cloud.svg index ce3ff3a0..820d0d96 100755 --- a/web/app/themes/haiku-atelier-2024/assets/img/icons/cloud.svg +++ b/web/app/themes/haiku-atelier-2024/assets/img/icons/cloud.svg @@ -1,10 +1,4 @@ - - + + diff --git a/web/app/themes/haiku-atelier-2024/assets/img/icons/cross.svg b/web/app/themes/haiku-atelier-2024/assets/img/icons/cross.svg index 75344bbc..2351314c 100755 --- a/web/app/themes/haiku-atelier-2024/assets/img/icons/cross.svg +++ b/web/app/themes/haiku-atelier-2024/assets/img/icons/cross.svg @@ -1,24 +1,16 @@ diff --git a/web/app/themes/haiku-atelier-2024/assets/img/icons/dot.svg b/web/app/themes/haiku-atelier-2024/assets/img/icons/dot.svg index 8f87880b..29f5c55e 100755 --- a/web/app/themes/haiku-atelier-2024/assets/img/icons/dot.svg +++ b/web/app/themes/haiku-atelier-2024/assets/img/icons/dot.svg @@ -1,6 +1,3 @@ - + diff --git a/web/app/themes/haiku-atelier-2024/assets/img/icons/fleche-droite.svg b/web/app/themes/haiku-atelier-2024/assets/img/icons/fleche-droite.svg index 5bbf5b22..8fea268c 100755 --- a/web/app/themes/haiku-atelier-2024/assets/img/icons/fleche-droite.svg +++ b/web/app/themes/haiku-atelier-2024/assets/img/icons/fleche-droite.svg @@ -1,11 +1,6 @@ - + diff --git a/web/app/themes/haiku-atelier-2024/assets/img/icons/fleche-gauche.svg b/web/app/themes/haiku-atelier-2024/assets/img/icons/fleche-gauche.svg index aad06ba8..a5c20bdf 100755 --- a/web/app/themes/haiku-atelier-2024/assets/img/icons/fleche-gauche.svg +++ b/web/app/themes/haiku-atelier-2024/assets/img/icons/fleche-gauche.svg @@ -1,8 +1,6 @@ diff --git a/web/app/themes/haiku-atelier-2024/assets/img/logos/logo-full.svg b/web/app/themes/haiku-atelier-2024/assets/img/logos/logo-full.svg index 459e994f..ccd733b2 100755 --- a/web/app/themes/haiku-atelier-2024/assets/img/logos/logo-full.svg +++ b/web/app/themes/haiku-atelier-2024/assets/img/logos/logo-full.svg @@ -2,31 +2,22 @@ - - + - + C260.5,116.523,270.5,124.023,250.495,123.773z" /> + diff --git a/web/app/themes/haiku-atelier-2024/assets/img/logos/logo-lines.svg b/web/app/themes/haiku-atelier-2024/assets/img/logos/logo-lines.svg index d12c9960..18ac0bec 100755 --- a/web/app/themes/haiku-atelier-2024/assets/img/logos/logo-lines.svg +++ b/web/app/themes/haiku-atelier-2024/assets/img/logos/logo-lines.svg @@ -1,9 +1,3 @@ - - + + diff --git a/web/app/themes/haiku-atelier-2024/assets/img/logos/logo-text.svg b/web/app/themes/haiku-atelier-2024/assets/img/logos/logo-text.svg index 4fdbe3a0..381a2a83 100755 --- a/web/app/themes/haiku-atelier-2024/assets/img/logos/logo-text.svg +++ b/web/app/themes/haiku-atelier-2024/assets/img/logos/logo-text.svg @@ -2,32 +2,22 @@ diff --git a/web/app/themes/haiku-atelier-2024/assets/img/logos/logo-v2-text.svg b/web/app/themes/haiku-atelier-2024/assets/img/logos/logo-v2-text.svg index e3433e47..56e92936 100755 --- a/web/app/themes/haiku-atelier-2024/assets/img/logos/logo-v2-text.svg +++ b/web/app/themes/haiku-atelier-2024/assets/img/logos/logo-v2-text.svg @@ -1,8 +1,6 @@ diff --git a/web/app/themes/haiku-atelier-2024/assets/img/paypal/logo-paypal.svg b/web/app/themes/haiku-atelier-2024/assets/img/paypal/logo-paypal.svg index 36f5e954..432e32ee 100755 --- a/web/app/themes/haiku-atelier-2024/assets/img/paypal/logo-paypal.svg +++ b/web/app/themes/haiku-atelier-2024/assets/img/paypal/logo-paypal.svg @@ -1,24 +1,15 @@ - + + - diff --git a/web/app/themes/haiku-atelier-2024/assets/img/paypal/titre-paypal.svg b/web/app/themes/haiku-atelier-2024/assets/img/paypal/titre-paypal.svg index f9e1c827..13a7c958 100755 --- a/web/app/themes/haiku-atelier-2024/assets/img/paypal/titre-paypal.svg +++ b/web/app/themes/haiku-atelier-2024/assets/img/paypal/titre-paypal.svg @@ -1,9 +1,3 @@ - - + + diff --git a/web/app/themes/haiku-atelier-2024/src/inc/WP/Term.php b/web/app/themes/haiku-atelier-2024/src/inc/WP/Term.php index e96155df..199bfd5f 100644 --- a/web/app/themes/haiku-atelier-2024/src/inc/WP/Term.php +++ b/web/app/themes/haiku-atelier-2024/src/inc/WP/Term.php @@ -20,9 +20,9 @@ final readonly class Term { if ($term_data instanceof WP_Term) { return some($term_data); - } else { - return none(); } + + return none(); } /** diff --git a/web/app/themes/haiku-atelier-2024/src/scripts/scripts-page-produit.ts b/web/app/themes/haiku-atelier-2024/src/scripts/scripts-page-produit.ts index dc978ed8..858960cd 100755 --- a/web/app/themes/haiku-atelier-2024/src/scripts/scripts-page-produit.ts +++ b/web/app/themes/haiku-atelier-2024/src/scripts/scripts-page-produit.ts @@ -1,11 +1,21 @@ // Scripts pour la Page Produit import { pipe } from "@mobily/ts-belt"; -import { forEach as arrayForEach } from "@mobily/ts-belt/Array"; import { get as dictGet } from "@mobily/ts-belt/Dict"; import { tap as optionTap } from "@mobily/ts-belt/Option"; -import { Array as FxArray, Effect, pipe as epipe, Option, Stream } from "effect"; -import { EitherAsync, Maybe } from "purify-ts"; +import { + Array as FxArray, + Effect, + pipe as epipe, + Option, + Stream, + ServiceMap, + Layer, + ManagedRuntime, + Console, + HashMap, +} from "effect"; +import { EitherAsync } from "purify-ts"; import { match, P } from "ts-pattern"; import { ValiError } from "valibot"; import type { AnySchema } from "valibot"; @@ -21,7 +31,6 @@ import { ATTRIBUT_CHARGEMENT, ATTRIBUT_DESACTIVE, ATTRIBUT_HIDDEN, - ATTRIBUT_PRIX, DOM_BOUTON_AJOUT_PANIER, DOM_BOUTONS_ACCORDEON, DOM_CONTENUS_ACCORDEON, @@ -31,15 +40,19 @@ import { import { lanceAnimationCycleLoading } from "./lib/animations.ts"; import { mustGetEleInDocument, mustGetElesInDocument, recupereElementDocumentEither } from "./lib/dom.ts"; import { BadRequestError, reporteErreur, ServerError } from "./lib/erreurs.ts"; -import { estHTMLSelectElement } from "./lib/gardes.ts"; import { emetMessageMajBoutonPanier } from "./lib/messages.ts"; import { newPartialResponse, postBackend, safeFetch } from "./lib/reseau.ts"; import { WCStoreCartAddItemArgsSchema } from "./lib/schemas/api/cart-add-item.ts"; import { WCStoreCartSchema } from "./lib/schemas/api/cart.ts"; import { safeSchemaParse } from "./lib/validation"; -import { getAllSelectorFromDocument } from "../scripts-effect/lib/dom.ts"; +import { getAllSelectorFromDocument, getFirstSelectorFromDocument } from "../scripts-effect/lib/dom.ts"; +import { NonEmptyReadonlyArray } from "effect/Array"; +import { NoSuchElementError } from "effect/Cause"; -type EnsembleLienContenu = [HTMLAnchorElement, HTMLElement]; +type DetailEnsemble = { + button: HTMLButtonElement; + content: HTMLDivElement; +}; /** États utiles pour les scripts de la page. */ type EtatsPage = { @@ -52,15 +65,68 @@ type EtatsPage = { // @ts-expect-error -- États injectĂ©s par le modĂšle PHP const ETATS_PAGE: EtatsPage = _etats; -/** - * Fonction utilitaire pour dĂ©plier toutes les sections de la BoĂźte des Informations Produit en ajustant les attributs - * correspondants. - */ -const deplieToutesSections = (ensembleLiensContenus: Array): void => - arrayForEach(ensembleLiensContenus, (ensemble: EnsembleLienContenu): void => { - Maybe.fromNullable(ensemble.at(0)).ifJust((e): void => e.setAttribute(ATTRIBUT_ARIA_EXPANDED, "false")); - Maybe.fromNullable(ensemble.at(1)).ifJust((e): void => e.setAttribute(ATTRIBUT_HIDDEN, "true")); - }); +class ProductPageElements extends ServiceMap.Service< + ProductPageElements, + { + AddProductButton: HTMLButtonElement; + DetailsButtons: NonEmptyReadonlyArray; + DetailsContents: NonEmptyReadonlyArray; + Details: HashMap.HashMap; + ProductPrice: HTMLParagraphElement; + ProductRawJson: HTMLScriptElement; + VariationChoiceForm: HTMLFormElement; + VariationSelectors: ReadonlyArray; + } +>()("haikuatelier.fr/Produit/ProductPageElements") { + static readonly layer = Layer.effect( + ProductPageElements, + Effect.gen(function* () { + const AddProductButton = yield* getFirstSelectorFromDocument(DOM_BOUTON_AJOUT_PANIER); + const DetailsButtons = yield* getAllSelectorFromDocument(DOM_BOUTONS_ACCORDEON); + const DetailsContents = yield* getAllSelectorFromDocument(DOM_CONTENUS_ACCORDEON); + const ProductPrice = yield* getFirstSelectorFromDocument(DOM_PRIX_PRODUIT); + const ProductRawJson = yield* getFirstSelectorFromDocument("#product-json"); + const VariationChoiceForm = yield* getFirstSelectorFromDocument("#variation-choice"); + const VariationSelectors = yield* pipe( + getAllSelectorFromDocument(".selecteur-produit select"), + Option.orElseSome(() => FxArray.empty()), + ); + + const Details = yield* pipe( + DetailsButtons, + FxArray.map( + (button: HTMLButtonElement, index: number): Effect.Effect<[string, DetailEnsemble], NoSuchElementError> => + Effect.gen(function* () { + const contentId = yield* Option.fromNullishOr(button.getAttribute(ATTRIBUT_ARIA_CONTROLS)); + const content = yield* FxArray.get(DetailsContents, index); + + return [contentId, { button, content } satisfies DetailEnsemble]; + }), + ), + Effect.all, + Effect.map(HashMap.fromIterable), + ); + + return { + AddProductButton, + DetailsButtons, + DetailsContents, + Details, + ProductPrice, + ProductRawJson, + VariationChoiceForm, + VariationSelectors, + }; + }), + ); +} + +const ProductPageRuntime = ManagedRuntime.make( + pipe( + ProductPageElements.layer, + Layer.tapError((error) => Console.error("ManagedRuntime", "Impossible de crĂ©er le Layer :", error.name)), + ), +); // ÉlĂ©ments d'intĂ©rĂȘt const E = { @@ -73,66 +139,16 @@ const E = { VARIATION_CHOICE_FORM: mustGetEleInDocument("#variation-choice"), }; -// TODO: Moderniser. -const gereAccordeonDetailsProduit = (): void => { - const contenus = new Map(); +const toggleAllDetails = Effect.fn("toggleAllDetails")(function* () { + const PageElements = yield* ProductPageElements; + // RĂ©cupĂšre les Ensembles sous forme de tableau. + const details = [...HashMap.values(PageElements.Details)]; - // Créé la Map avec les ensembles Lien-Contenu - E.BOUTONS_ACCORDEON.forEach((bouton, index): void => { - const idContenu: null | string = bouton.getAttribute(ATTRIBUT_ARIA_CONTROLS); - const sectionCorrespondante: HTMLDivElement | undefined = E.CONTENUS_ACCORDEON[index]; - - if (!idContenu) { - throw new Error("Le lien ne dispose pas d'ID !"); - } - if (!sectionCorrespondante) { - throw new Error("Le lien ne dispose pas de section correspondante !"); - } - - contenus.set(idContenu, [bouton, sectionCorrespondante]); - - bouton.addEventListener("click", (evenement: Event): void => { - // EmpĂȘche la pollution de l'historique de navigation - evenement.preventDefault(); - - // Sauvegarde l'Ă©tat d'ouverture de la section avant de toutes les fermer - const estAncienContenuDeplie: boolean = bouton.getAttribute(ATTRIBUT_ARIA_EXPANDED) === "true"; - pipe(contenus.values(), Array.from, deplieToutesSections); - - // Ne fais rien de plus si l'onglet sĂ©lectionnĂ© Ă©tait le courant - if (estAncienContenuDeplie) { - return; - } - - // Ouvre le nouvel onglet sĂ©lectionnĂ© - bouton.setAttribute(ATTRIBUT_ARIA_EXPANDED, "true"); - sectionCorrespondante.removeAttribute(ATTRIBUT_HIDDEN); - }); + FxArray.forEach(details, (detail: DetailEnsemble) => { + detail.button.toggleAttribute(ATTRIBUT_ARIA_EXPANDED, false); + detail.content.toggleAttribute(ATTRIBUT_HIDDEN, true); }); - - // Ajoute des Écouteurs d'ÉvĂ©nements - E.DOM_VARIATION.ifRight((selecteur): void => - selecteur.addEventListener("change", (evenement: Event): void => { - const cibleSelecteur: Maybe = Maybe.fromNullable(evenement.target).filter( - estHTMLSelectElement, - ); - - // Active le Bouton si le SĂ©lecteur est valide - cibleSelecteur - .map((v) => v.validity.valid) - .ifJust((v: boolean) => E.BOUTON_AJOUT_PANIER.toggleAttribute(ATTRIBUT_DESACTIVE, !v)); - - // Met Ă  jour le prix affichĂ© pour la Variation - cibleSelecteur - .chainNullable((s) => s.selectedOptions[0]) - .chainNullable((e) => e.getAttribute(ATTRIBUT_PRIX)) - .ifJust((p) => { - E.PRIX_PRODUIT.textContent = `${p}€`; - }); - }), - ); - E.BOUTON_AJOUT_PANIER.addEventListener("click", (event: MouseEvent): void => ajouteProduitAuPanier(event)); -}; +}); // TODO: Utiliser Effect. const getAttributesFromDom = (): ReadonlyArray => { @@ -265,9 +281,13 @@ const ajouteProduitAuPanier = (event: MouseEvent): void => { .run(); }; +/** + * Initialise l'Ă©tat initial d'interactivitĂ© du Bouton d'ajout de Produit au Panier. + */ const initAddToCartButton = Effect.fn("initAddToCartButton")(function* () { + const { AddProductButton, VariationSelectors } = yield* ProductPageElements; /** Est-ce que le Produit affichĂ© est en stock ? */ - const isProductInStock = E.BOUTON_AJOUT_PANIER.hasAttribute("data-in-stock"); + const isProductInStock = AddProductButton.hasAttribute("data-in-stock") === true; // S'il n'y a pas de stock, ne rien faire. if (isProductInStock === false) { @@ -275,37 +295,83 @@ const initAddToCartButton = Effect.fn("initAddToCartButton")(function* () { return yield* Effect.void; } - const variationSelectors = getAllSelectorFromDocument(".selecteur-produit select"); - // S'il n'y a pas de SĂ©lecteurs de variations, activer le Bouton d'ajout au Panier. - if (Option.isNone(variationSelectors)) { + if (FxArray.isReadonlyArrayEmpty(VariationSelectors)) { + console.debug("initAddToCartButton", "Produt simple."); E.BOUTON_AJOUT_PANIER.removeAttribute(ATTRIBUT_DESACTIVE); } return yield* Effect.void; }); +const onFormChange = Effect.fnUntraced(function* (event: Event) { + const { AddProductButton } = yield* ProductPageElements; + // La cible ne peut qu'ĂȘtre un Formulaire. + const target = event.target as HTMLFormElement; + const isClickAllowed = target.checkValidity() === false; + + // Active/dĂ©sactive le Bouton en fonction de la validitĂ© du Formulaire du Produit. + AddProductButton.toggleAttribute(ATTRIBUT_DESACTIVE, isClickAllowed); + + return yield* Effect.void; +}); + +/** + * Initialise la mise Ă  jour de l'Ă©tat d'interactivitĂ© du Bouton d'ajout de Produit au Panier en fonction des actions de l'Utilisateur. + */ const initAddToCartInteractionUpdates = Effect.fn("initAddToCartInteractionUpdates")(function* () { return yield* pipe( Stream.fromEventListener(E.VARIATION_CHOICE_FORM, "change"), - Stream.tap((event: Event) => { - console.debug("initAddToCartInteractionUpdates", "hello"); - // La cible ne peut qu'ĂȘtre un Formulaire. - const target = event.target as HTMLFormElement; - const isClickAllowed = target.checkValidity() === false; + Stream.tap(onFormChange), + Stream.runDrain, + ); +}); - // Active/dĂ©sactive le Bouton en fonction de la validitĂ© du Formulaire du Produit. - E.BOUTON_AJOUT_PANIER.toggleAttribute(ATTRIBUT_DESACTIVE, isClickAllowed); +const onDetailButtonClick = Effect.fnUntraced(function* (event: Event) { + const { Details } = yield* ProductPageElements; + // EmpĂȘche la pollution de l'historique de navigation + event.preventDefault(); - return Effect.void; - }), + // La cible est connue. + const target = event.target as HTMLButtonElement; + // RĂ©cupĂšre le contenu correspondant. + const linkedSection = yield* pipe( + Option.fromNullishOr(target.getAttribute(ATTRIBUT_ARIA_CONTROLS)), + Option.flatMap((contentId: string) => HashMap.get(Details, contentId)), + ); + // Sauvegarde l'Ă©tat d'ouverture de la Section avant de toutes les fermer. + const wasCurrentSection: boolean = target.getAttribute(ATTRIBUT_ARIA_EXPANDED) === "true"; + + // Replie toutes les Sections. + yield* toggleAllDetails(); + + // Ne fais rien de plus si l'onglet sĂ©lectionnĂ© Ă©tait le courant + if (wasCurrentSection === true) { + return yield* Effect.void; + } + + // Ouvre le nouvel onglet sĂ©lectionnĂ© + target.toggleAttribute(ATTRIBUT_ARIA_EXPANDED, true); + linkedSection.content.toggleAttribute(ATTRIBUT_HIDDEN, false); + + return yield* Effect.void; +}); + +const initDetailInteractions = Effect.fn("initDetailInteractions")(function* () { + const PageElements = yield* ProductPageElements; + + return yield* pipe( + FxArray.map(PageElements.DetailsButtons, (button: HTMLButtonElement) => + pipe(Stream.fromEventListener(button, "click"), Stream.tap(onDetailButtonClick)), + ), + Stream.mergeAll({ concurrency: "unbounded" }), Stream.runDrain, ); }); document.addEventListener("DOMContentLoaded", (): void => { - gereAccordeonDetailsProduit(); - Effect.runFork(initAddToCartButton()); - Effect.runFork(initAddToCartInteractionUpdates()); + ProductPageRuntime.runFork(pipe(initAddToCartButton(), Effect.tapCause(Console.error))); + ProductPageRuntime.runFork(pipe(initAddToCartInteractionUpdates(), Effect.tapCause(Console.error))); + ProductPageRuntime.runFork(pipe(initDetailInteractions(), Effect.tapCause(Console.error))); updatePriceOnAttributeChange(); }); diff --git a/web/app/themes/haiku-atelier-2024/views/404.twig b/web/app/themes/haiku-atelier-2024/views/404.twig index c4de500a..3396dc17 100755 --- a/web/app/themes/haiku-atelier-2024/views/404.twig +++ b/web/app/themes/haiku-atelier-2024/views/404.twig @@ -1,10 +1,7 @@ {% extends 'base.twig' %} {% block contenu %} -
+

Sorry!

@@ -16,10 +13,7 @@

- + Go back to the Shop

diff --git a/web/app/themes/haiku-atelier-2024/views/a-propos.twig b/web/app/themes/haiku-atelier-2024/views/a-propos.twig index 814c6348..b03a53a5 100755 --- a/web/app/themes/haiku-atelier-2024/views/a-propos.twig +++ b/web/app/themes/haiku-atelier-2024/views/a-propos.twig @@ -6,147 +6,103 @@
- {{ - images.genere_source_img_multi_formats("#{ site.theme.link }/assets/img/about/haikuabout", 'A montage of many different pictures/drawings of jewelry and of someone working.', image_dimensions[0], image_dimensions[1], 'storytelling-montage') - }} + {{ images.genere_source_img_multi_formats("#{ site.theme.link }/assets/img/about/haikuabout", 'A montage of many different pictures/drawings of jewelry and of someone working.', image_dimensions[0], image_dimensions[1], 'storytelling-montage') }} {# Épingles #} {# Boütes de texte #} -
-

- HaĂŻkus are short japanese poems written in three lines to capture the beauty of small details in the - everyday life. + HaĂŻkus are short japanese poems written in three lines to capture the beauty of small details in the everyday life.

More than poetry, it’s a philosophy.

-
-

- Haiku Atelier creates minimalist and subtil jewelry with an edgy twist, trying to distillate some poetry - through those small objects. + Haiku Atelier creates minimalist and subtil jewelry with an edgy twist, trying to distillate some poetry through those small objects.

@@ -154,112 +110,73 @@

-
-

- After learning the art of jewelry making for two years in Paris, Manon Designere launched the brand Haiku, - gleaning into the Japanese minimalist aesthetic. + After learning the art of jewelry making for two years in Paris, Manon Designere launched the brand Haiku, gleaning into the Japanese minimalist aesthetic.

- Now based in Brussels, she still makes everything by hand, pouring her soul into her work to share her - vision of the world. + Now based in Brussels, she still makes everything by hand, pouring her soul into her work to share her vision of the world.

-
-

Here you can see some of the tools used at the studio.

- From sketches to models, from soldering to polishing, the numerous steps behind each piece are what makes it - so unique. + From sketches to models, from soldering to polishing, the numerous steps behind each piece are what makes it so unique.

A touch of animism to value handcrafted objects, restrain mass production and lead toward slow life.

-
-

- We pay a lot of attention choosing the materials we work on: all of the pieces are made in 80% recycled - sterling silver. + We pay a lot of attention choosing the materials we work on: all of the pieces are made in 80% recycled sterling silver.

- We also choose to propose many designs in a mix of sterling silver and silver gilded parts to avoid relying - too much on the gold plating process, which can be pollutant. + We also choose to propose many designs in a mix of sterling silver and silver gilded parts to avoid relying too much on the gold plating process, which can be pollutant.

- The packagings are also carefully selected, produced nearby, made in eco-friendly coton or paper. Our gift - bags are even handmade in dead-stock fabrics. + The packagings are also carefully selected, produced nearby, made in eco-friendly coton or paper. Our gift bags are even handmade in dead-stock fabrics.

-
-

- We hope that those small objects will move you, as we are moved by the beauty hidden behind a ray of - sunshine, a leaf falling from a branch, the smell of an old book, the song of birds before dawn... + We hope that those small objects will move you, as we are moved by the beauty hidden behind a ray of sunshine, a leaf falling from a branch, the smell of an old book, the song of birds before dawn...

Haiku jewelry are like a bit of poetry to wear everywhere.

diff --git a/web/app/themes/haiku-atelier-2024/views/accueil.twig b/web/app/themes/haiku-atelier-2024/views/accueil.twig index 4c2b1efa..d1091518 100755 --- a/web/app/themes/haiku-atelier-2024/views/accueil.twig +++ b/web/app/themes/haiku-atelier-2024/views/accueil.twig @@ -2,122 +2,75 @@ {% import 'macros/images.twig' as images %} {% block contenu %} -
+
diff --git a/web/app/themes/haiku-atelier-2024/views/base.twig b/web/app/themes/haiku-atelier-2024/views/base.twig index d4bc8ddf..0a1e8db7 100755 --- a/web/app/themes/haiku-atelier-2024/views/base.twig +++ b/web/app/themes/haiku-atelier-2024/views/base.twig @@ -8,10 +8,7 @@ {% endblock head %} {% endblock conteneur_html_head %} - + {# En-tĂȘte #} {{ include('parts/en-tete.twig') }} @@ -21,21 +18,15 @@ {# Bouton Revenir en haut #} {# Pied de page #} diff --git a/web/app/themes/haiku-atelier-2024/views/boutique.twig b/web/app/themes/haiku-atelier-2024/views/boutique.twig index 6d1cf9ab..2b67eaaf 100755 --- a/web/app/themes/haiku-atelier-2024/views/boutique.twig +++ b/web/app/themes/haiku-atelier-2024/views/boutique.twig @@ -24,10 +24,8 @@ const _etats = {
diff --git a/web/app/themes/haiku-atelier-2024/views/cgv.twig b/web/app/themes/haiku-atelier-2024/views/cgv.twig index ead460f3..1d10ec98 100755 --- a/web/app/themes/haiku-atelier-2024/views/cgv.twig +++ b/web/app/themes/haiku-atelier-2024/views/cgv.twig @@ -1,10 +1,7 @@ {% extends 'base.twig' %} {% block contenu %} -
+

Terms & Conditions

@@ -17,22 +14,15 @@

- Each piece, made in sterling silver and 18k gold plated silver, is made to order. As soon as we receive your - order, depending on its complexity, production in our workshop will take between 2 to 7 working days. It - will then be send to you, at the latest, within 14 days of your order. + Each piece, made in sterling silver and 18k gold plated silver, is made to order. As soon as we receive your order, depending on its complexity, production in our workshop will take between 2 to 7 working days. It will then be send to you, at the latest, within 14 days of your order.

- The products are delivered by Mondial Relay or UPS. Products are delivered in France, Europe, and any - country included by those two delivery companies.

+ The products are delivered by Mondial Relay or UPS. Products are delivered in France, Europe, and any country included by those two delivery companies.

- The details of delivery costs and times are specified in during the payment process. The delivery times are - mentioned for information only. When the order is sent, the customers will receive an e-mail from the - carrier allowing them to track their package. + The details of delivery costs and times are specified in during the payment process. The delivery times are mentioned for information only. When the order is sent, the customers will receive an e-mail from the carrier allowing them to track their package.

- Haiku Atelier cannot be held responsible for delays in delivery due to errors or disruptions attributable to - carriers (including in the event of a total or partial strike in particular of the postal services and means - of transport and/or communications). + Haiku Atelier cannot be held responsible for delays in delivery due to errors or disruptions attributable to carriers (including in the event of a total or partial strike in particular of the postal services and means of transport and/or communications).

@@ -42,21 +32,14 @@

- If for any reason you are not satisfied with your purchase, we will refund or exchange it within 14 days of - receipt. If more than 30 days have past since your purchase, unfortunately, we cannot offer a refund or an - exchange. + If for any reason you are not satisfied with your purchase, we will refund or exchange it within 14 days of receipt. If more than 30 days have past since your purchase, unfortunately, we cannot offer a refund or an exchange.

- To be eligible for a return or an exchange, your item must be in the same condition as received, unworn and - unused, in its original packaging. You will also need the receipt or proof of purchase. + To be eligible for a return or an exchange, your item must be in the same condition as received, unworn and unused, in its original packaging. You will also need the receipt or proof of purchase.

- To start a return you can contact us at haiku.atelier@gmail.com. Please note that returns and exchange will need to be send back our workshop - in Brussels. + To start a return you can contact us at haiku.atelier@gmail.com. Please note that returns and exchange will need to be send back our workshop in Brussels.

@@ -64,15 +47,11 @@

- The site does not provide any return labels. Return costs are the responsibility of the customer. Taxes or - duties on international deliveries are non-refundable. Haiku Atelier undertakes to reimburse the price of - the product and the initial shipping costs, upon receipt of the product. + The site does not provide any return labels. Return costs are the responsibility of the customer. Taxes or duties on international deliveries are non-refundable. Haiku Atelier undertakes to reimburse the price of the product and the initial shipping costs, upon receipt of the product.

- Once the returned product has been quality checked and approved, the refund will be made via the original - method of payment used for the returned order and a confirmation email will be sent to the customer. Haiku - Atelier is not responsible for items purchased from other retailers. + Once the returned product has been quality checked and approved, the refund will be made via the original method of payment used for the returned order and a confirmation email will be sent to the customer. Haiku Atelier is not responsible for items purchased from other retailers.

@@ -82,17 +61,11 @@

- Please inspect your order upon receipt and contact us immediately if the item is defective, damaged, or if - you received the wrong item. Make written observations at the latest within three (3) days following the - delivery, to Haiku Atelier, by sending a photograph of the product. Unfortunately we cannot accept returns - on sale items and gift cards. + Please inspect your order upon receipt and contact us immediately if the item is defective, damaged, or if you received the wrong item. Make written observations at the latest within three (3) days following the delivery, to Haiku Atelier, by sending a photograph of the product. Unfortunately we cannot accept returns on sale items and gift cards.

- Haiku Atelier jewelry are guarantee for a year. If your piece unexpectedly broke or loses its gold color - within a year, you can send it back to us and we will repair it for free, you will just have to organize - your own shipping label (our workshop is located in Brussels).
We still provide after sale services - past the guarantee year, the price of those services will be determined depending on each case. + Haiku Atelier jewelry are guarantee for a year. If your piece unexpectedly broke or loses its gold color within a year, you can send it back to us and we will repair it for free, you will just have to organize your own shipping label (our workshop is located in Brussels).
We still provide after sale services past the guarantee year, the price of those services will be determined depending on each case.

@@ -102,37 +75,23 @@

- This website is operated by Manon Designere - créatrice de bijoux, whose registered office is located at 45 - rue de Franceville, 93220 Gagny, France. These general terms and conditions of use and sale (the "GTCU") - govern the use of the site by any user wishing to access the site and make a purchase on the site (the - "User" or the "Customer"). + This website is operated by Manon Designere - créatrice de bijoux, whose registered office is located at 45 rue de Franceville, 93220 Gagny, France. These general terms and conditions of use and sale (the "GTCU") govern the use of the site by any user wishing to access the site and make a purchase on the site (the "User" or the "Customer").

- By accessing the site, the user acknowledges having read and fully and unreservedly accepts the GTCU. Haiku - Atelier reserves the right to modify the GTCU at any time. The change will take effect immediately upon - posting the GTCU. + By accessing the site, the user acknowledges having read and fully and unreservedly accepts the GTCU. Haiku Atelier reserves the right to modify the GTCU at any time. The change will take effect immediately upon posting the GTCU.

- The products governed by these GTCUs are those which appear on the site (the “Products”). The products are - offered for sale within the limits of available stocks. The site does not guarantee that the products will - be in stock. The site reserves the right to remove a product at any time for any reason. + The products governed by these GTCUs are those which appear on the site (the “Products”). The products are offered for sale within the limits of available stocks. The site does not guarantee that the products will be in stock. The site reserves the right to remove a product at any time for any reason.

- The colors, features, specifications, and details of the products are described and presented with the - greatest possible accuracy. However, the site does not warrant that the colors, features, specifications, - and details of the products will be accurate, complete, reliable, current, or free from other errors, and - users' digital display may not accurately reflect the actual colors and details of the products. + The colors, features, specifications, and details of the products are described and presented with the greatest possible accuracy. However, the site does not warrant that the colors, features, specifications, and details of the products will be accurate, complete, reliable, current, or free from other errors, and users' digital display may not accurately reflect the actual colors and details of the products.

- The prices of the products are indicated in Euros all taxes included, including the applicable French VAT - (20%). The prices of the products are exclusive of delivery costs (shipping, packaging, and making up the - package according to the applicable amounts). The amount of the delivery costs will be specified before the - validation of the order. The prices of the products may be modified at any time. However, a price cannot be - modified once the purchase order has been validated. + The prices of the products are indicated in Euros all taxes included, including the applicable French VAT (20%). The prices of the products are exclusive of delivery costs (shipping, packaging, and making up the package according to the applicable amounts). The amount of the delivery costs will be specified before the validation of the order. The prices of the products may be modified at any time. However, a price cannot be modified once the purchase order has been validated.

@@ -146,24 +105,15 @@

- Haiku Atelier will not be held responsible for the failure to deliver a package due to an incorrect or - incomplete delivery address. Once the undelivered products have been collected by Haiku Atelier, a new - delivery will be possible and incur a reshipping fee invoiced to the customer. + Haiku Atelier will not be held responsible for the failure to deliver a package due to an incorrect or incomplete delivery address. Once the undelivered products have been collected by Haiku Atelier, a new delivery will be possible and incur a reshipping fee invoiced to the customer.

- International deliveries are subject to import charges, duties, taxes, or fees of the destination country. - These funds are set by the government of that country, in accordance with import/export regulations, and - billed by the courier. Haiku Atelier is not responsible for these duties, taxes, or other charges.
If - a package is returned because a customer has refused to pay any import taxes or customs duties owed, the - package refund will not include shipping and return costs. + International deliveries are subject to import charges, duties, taxes, or fees of the destination country. These funds are set by the government of that country, in accordance with import/export regulations, and billed by the courier. Haiku Atelier is not responsible for these duties, taxes, or other charges.
If a package is returned because a customer has refused to pay any import taxes or customs duties owed, the package refund will not include shipping and return costs.

- Haiku Atelier is the exclusive owner of all intellectual property rights or holds the rights of use relating - to both the structure and the content of the site. The GTCU are subject to French law, regardless of the - country of residence of the user and the place of placing the purchase order.
In the absence of an - amicable agreement, any dispute will be submitted to the competent French courts. + Haiku Atelier is the exclusive owner of all intellectual property rights or holds the rights of use relating to both the structure and the content of the site. The GTCU are subject to French law, regardless of the country of residence of the user and the place of placing the purchase order.
In the absence of an amicable agreement, any dispute will be submitted to the competent French courts.

@@ -174,10 +124,7 @@

Contact:
- For inquiries and customer service, please refer to our Contact page. + For inquiries and customer service, please refer to our Contact page.

diff --git a/web/app/themes/haiku-atelier-2024/views/contact.twig b/web/app/themes/haiku-atelier-2024/views/contact.twig index c328e154..98c47caa 100755 --- a/web/app/themes/haiku-atelier-2024/views/contact.twig +++ b/web/app/themes/haiku-atelier-2024/views/contact.twig @@ -1,10 +1,7 @@ {% extends 'base.twig' %} {% block contenu %} -

+

Say hi!

@@ -12,16 +9,9 @@

- For any inquiries, from simple information questions to problems with your products, or just to say hi, don't - hesitate to contact us at + For any inquiries, from simple information questions to problems with your products, or just to say hi, don't hesitate to contact us at haikuatelier@gmail.com - or on Instagram at + or on Instagram at haiku.atelier .

diff --git a/web/app/themes/haiku-atelier-2024/views/echec-commande.twig b/web/app/themes/haiku-atelier-2024/views/echec-commande.twig index 2d46c2ba..b3be1373 100755 --- a/web/app/themes/haiku-atelier-2024/views/echec-commande.twig +++ b/web/app/themes/haiku-atelier-2024/views/echec-commande.twig @@ -1,22 +1,15 @@ {% extends 'base.twig' %} {% block contenu %} -
+

Failed order!

-

Sadly, something went wrong during your order, or you chose to cancel it. You can try again if you want: your - cart is still there.

-

If an error persists and you don't know what's going on, please don't hesitate to contact us!

+

Sadly, something went wrong during your order, or you chose to cancel it. You can try again if you want: your cart is still there.

+

If an error persists and you don't know what's going on, please don't hesitate to contact us!

diff --git a/web/app/themes/haiku-atelier-2024/views/macros/images.twig b/web/app/themes/haiku-atelier-2024/views/macros/images.twig index c3438269..fe7ed055 100755 --- a/web/app/themes/haiku-atelier-2024/views/macros/images.twig +++ b/web/app/themes/haiku-atelier-2024/views/macros/images.twig @@ -1,25 +1,13 @@ {% macro genere_source_img_multi_formats(rel_url, alt = '', width, height, id = '') %} - - - + + + {{ alt }} diff --git a/web/app/themes/haiku-atelier-2024/views/panier.twig b/web/app/themes/haiku-atelier-2024/views/panier.twig index e2a12450..024d7e88 100755 --- a/web/app/themes/haiku-atelier-2024/views/panier.twig +++ b/web/app/themes/haiku-atelier-2024/views/panier.twig @@ -12,10 +12,7 @@ const _etats = { {% endblock head %} {% block contenu %} -
+
{# « Your Cart » #} {{ include('parts/pages/panier/panneau-panier.twig') }} {# Your Info #} @@ -23,10 +20,7 @@ const _etats = {

Sorry! Your cart is empty.

- + Go back to the Shop
diff --git a/web/app/themes/haiku-atelier-2024/views/parts/en-tete.twig b/web/app/themes/haiku-atelier-2024/views/parts/en-tete.twig index 88445b66..2e6d83ca 100755 --- a/web/app/themes/haiku-atelier-2024/views/parts/en-tete.twig +++ b/web/app/themes/haiku-atelier-2024/views/parts/en-tete.twig @@ -1,54 +1,39 @@
{# TODO: Utiliser un Menu WordPress ? #} -