diff --git a/.gitignore b/.gitignore index 6a2741f..a202137 100644 --- a/.gitignore +++ b/.gitignore @@ -1,5 +1,9 @@ config.json +pending.json nftables.conf +interfaces.conf go.work nfsense -nfsense.exe \ No newline at end of file +nfsense.exe +out/* +out \ No newline at end of file diff --git a/client/package.json b/client/package.json index a5abd1b..53c536a 100644 --- a/client/package.json +++ b/client/package.json @@ -12,6 +12,7 @@ }, "dependencies": { "@intlify/unplugin-vue-i18n": "^0.8.2", + "@vee-validate/zod": "^4.8.4", "@vueuse/core": "^9.13.0", "@vueuse/head": "^1.1.15", "axios": "^1.3.4", @@ -25,7 +26,9 @@ "vue": "^3.2.45", "vue-i18n": "9", "vue-router": "4", - "ws": "^8.13.0" + "vue-toast-notification": "^3.0", + "ws": "^8.13.0", + "zod": "^3.21.4" }, "devDependencies": { "@iconify/json": "^2.2.30", diff --git a/client/pnpm-lock.yaml b/client/pnpm-lock.yaml index d730ebd..9999180 100644 --- a/client/pnpm-lock.yaml +++ b/client/pnpm-lock.yaml @@ -1,80 +1,120 @@ -lockfileVersion: 5.4 - -specifiers: - '@iconify/json': ^2.2.30 - '@intlify/unplugin-vue-i18n': ^0.8.2 - '@types/events': ^3.0.0 - '@types/markdown-it-link-attributes': ^3.0.1 - '@typescript-eslint/parser': ^5.54.1 - '@vitejs/plugin-vue': ^4.0.0 - '@vue-macros/reactivity-transform': ^0.2.4 - '@vue-macros/volar': ^0.8.4 - '@vueuse/core': ^9.13.0 - '@vueuse/head': ^1.1.15 - axios: ^1.3.4 - eslint: ^8.35.0 - eslint-plugin-vue: ^9.9.0 - events: ^3.3.0 - focus-trap: ^7.3.1 - focus-trap-vue: ^4.0.2 - markdown-it-link-attributes: ^4.0.1 - markdown-it-shiki: ^0.8.0 - simple-jsonrpc-js: ^1.2.0 - typescript: ^4.9.3 - unplugin-auto-import: ^0.15.0 - unplugin-icons: ^0.15.3 - unplugin-vue-components: ^0.24.0 - unplugin-vue-macros: ^1.9.1 - vee-validate: ^4.8.4 - vite: ^4.1.0 - vite-plugin-pages: ^0.28.0 - vite-plugin-vue-markdown: ^0.22.4 - vue: ^3.2.45 - vue-i18n: '9' - vue-router: '4' - vue-tsc: ^1.0.24 - ws: ^8.13.0 +lockfileVersion: '6.0' dependencies: - '@intlify/unplugin-vue-i18n': 0.8.2_vue-i18n@9.2.2 - '@vueuse/core': 9.13.0_vue@3.2.47 - '@vueuse/head': 1.1.15_vue@3.2.47 - axios: 1.3.4 - events: 3.3.0 - focus-trap: 7.3.1 - focus-trap-vue: 4.0.2_oggptlzwchqpaguemspe4ract4 - markdown-it-link-attributes: 4.0.1 - markdown-it-shiki: 0.8.0 - simple-jsonrpc-js: 1.2.0 - vee-validate: 4.8.4_vue@3.2.47 - vue: 3.2.47 - vue-i18n: 9.2.2_vue@3.2.47 - vue-router: 4.1.6_vue@3.2.47 - ws: 8.13.0 + '@intlify/unplugin-vue-i18n': + specifier: ^0.8.2 + version: 0.8.2(vue-i18n@9.2.2) + '@vee-validate/zod': + specifier: ^4.8.4 + version: 4.8.4(vue@3.2.47) + '@vueuse/core': + specifier: ^9.13.0 + version: 9.13.0(vue@3.2.47) + '@vueuse/head': + specifier: ^1.1.15 + version: 1.1.15(vue@3.2.47) + axios: + specifier: ^1.3.4 + version: 1.3.4 + events: + specifier: ^3.3.0 + version: 3.3.0 + focus-trap: + specifier: ^7.3.1 + version: 7.3.1 + focus-trap-vue: + specifier: ^4.0.2 + version: 4.0.2(focus-trap@7.3.1)(vue@3.2.47) + markdown-it-link-attributes: + specifier: ^4.0.1 + version: 4.0.1 + markdown-it-shiki: + specifier: ^0.8.0 + version: 0.8.0 + simple-jsonrpc-js: + specifier: ^1.2.0 + version: 1.2.0 + vee-validate: + specifier: ^4.8.4 + version: 4.8.4(vue@3.2.47) + vue: + specifier: ^3.2.45 + version: 3.2.47 + vue-i18n: + specifier: '9' + version: 9.2.2(vue@3.2.47) + vue-router: + specifier: '4' + version: 4.1.6(vue@3.2.47) + vue-toast-notification: + specifier: ^3.0 + version: 3.1.1(vue@3.2.47) + ws: + specifier: ^8.13.0 + version: 8.13.0 + zod: + specifier: ^3.21.4 + version: 3.21.4 devDependencies: - '@iconify/json': 2.2.30 - '@types/events': 3.0.0 - '@types/markdown-it-link-attributes': 3.0.1 - '@typescript-eslint/parser': 5.54.1_ycpbpc6yetojsgtrx3mwntkhsu - '@vitejs/plugin-vue': 4.0.0_vite@4.1.4+vue@3.2.47 - '@vue-macros/reactivity-transform': 0.2.4_vue@3.2.47 - '@vue-macros/volar': 0.8.4_igk56f2koesnegulglkulhcgka - eslint: 8.35.0 - eslint-plugin-vue: 9.9.0_eslint@8.35.0 - typescript: 4.9.5 - unplugin-auto-import: 0.15.0_@vueuse+core@9.13.0 - unplugin-icons: 0.15.3 - unplugin-vue-components: 0.24.0_vue@3.2.47 - unplugin-vue-macros: 1.9.1_qnq6tcennvnlbajhsceuubx7mq - vite: 4.1.4 - vite-plugin-pages: 0.28.0_vite@4.1.4 - vite-plugin-vue-markdown: 0.22.4_vite@4.1.4 - vue-tsc: 1.2.0_typescript@4.9.5 + '@iconify/json': + specifier: ^2.2.30 + version: 2.2.30 + '@types/events': + specifier: ^3.0.0 + version: 3.0.0 + '@types/markdown-it-link-attributes': + specifier: ^3.0.1 + version: 3.0.1 + '@typescript-eslint/parser': + specifier: ^5.54.1 + version: 5.54.1(eslint@8.35.0)(typescript@4.9.5) + '@vitejs/plugin-vue': + specifier: ^4.0.0 + version: 4.0.0(vite@4.1.4)(vue@3.2.47) + '@vue-macros/reactivity-transform': + specifier: ^0.2.4 + version: 0.2.4(vue@3.2.47) + '@vue-macros/volar': + specifier: ^0.8.4 + version: 0.8.4(@vue-macros/reactivity-transform@0.2.4)(vue-tsc@1.2.0)(vue@3.2.47) + eslint: + specifier: ^8.35.0 + version: 8.35.0 + eslint-plugin-vue: + specifier: ^9.9.0 + version: 9.9.0(eslint@8.35.0) + typescript: + specifier: ^4.9.3 + version: 4.9.5 + unplugin-auto-import: + specifier: ^0.15.0 + version: 0.15.0(@vueuse/core@9.13.0) + unplugin-icons: + specifier: ^0.15.3 + version: 0.15.3 + unplugin-vue-components: + specifier: ^0.24.0 + version: 0.24.0(vue@3.2.47) + unplugin-vue-macros: + specifier: ^1.9.1 + version: 1.9.1(@vueuse/core@9.13.0)(vite@4.1.4)(vue@3.2.47) + vite: + specifier: ^4.1.0 + version: 4.1.4 + vite-plugin-pages: + specifier: ^0.28.0 + version: 0.28.0(vite@4.1.4) + vite-plugin-vue-markdown: + specifier: ^0.22.4 + version: 0.22.4(vite@4.1.4) + vue-tsc: + specifier: ^1.0.24 + version: 1.2.0(typescript@4.9.5) packages: - /@ampproject/remapping/2.2.0: + /@ampproject/remapping@2.2.0: resolution: {integrity: sha512-qRmjj8nj9qmLTQXXmaR1cck3UXSRMPrbsLJAasZpF+t3riI71BXed5ebIOYwQntykeZuhjsdweEc9BxH5Jc26w==} engines: {node: '>=6.0.0'} dependencies: @@ -82,37 +122,37 @@ packages: '@jridgewell/trace-mapping': 0.3.17 dev: true - /@antfu/install-pkg/0.1.1: + /@antfu/install-pkg@0.1.1: resolution: {integrity: sha512-LyB/8+bSfa0DFGC06zpCEfs89/XoWZwws5ygEa5D+Xsm3OfI+aXQ86VgVG7Acyef+rSZ5HE7J8rrxzrQeM3PjQ==} dependencies: execa: 5.1.1 find-up: 5.0.0 dev: true - /@antfu/utils/0.7.2: + /@antfu/utils@0.7.2: resolution: {integrity: sha512-vy9fM3pIxZmX07dL+VX1aZe7ynZ+YyB0jY+jE6r3hOK6GNY2t6W8rzpFC4tgpbXUYABkFQwgJq2XYXlxbXAI0g==} dev: true - /@babel/code-frame/7.18.6: + /@babel/code-frame@7.18.6: resolution: {integrity: sha512-TDCmlK5eOvH+eH7cdAFlNXeVJqWIQ7gW9tY1GJIpUtFb6CmjVyq2VM3u71bOyR8CRihcCgMUYoDNyLXao3+70Q==} engines: {node: '>=6.9.0'} dependencies: '@babel/highlight': 7.18.6 dev: true - /@babel/compat-data/7.21.0: + /@babel/compat-data@7.21.0: resolution: {integrity: sha512-gMuZsmsgxk/ENC3O/fRw5QY8A9/uxQbbCEypnLIiYYc/qVJtEV7ouxC3EllIIwNzMqAQee5tanFabWsUOutS7g==} engines: {node: '>=6.9.0'} dev: true - /@babel/core/7.21.0: + /@babel/core@7.21.0: resolution: {integrity: sha512-PuxUbxcW6ZYe656yL3EAhpy7qXKq0DmYsrJLpbB8XrsCP9Nm+XCg9XFMb5vIDliPD7+U/+M+QJlH17XOcB7eXA==} engines: {node: '>=6.9.0'} dependencies: '@ampproject/remapping': 2.2.0 '@babel/code-frame': 7.18.6 '@babel/generator': 7.21.1 - '@babel/helper-compilation-targets': 7.20.7_@babel+core@7.21.0 + '@babel/helper-compilation-targets': 7.20.7(@babel/core@7.21.0) '@babel/helper-module-transforms': 7.21.2 '@babel/helpers': 7.21.0 '@babel/parser': 7.21.2 @@ -128,7 +168,7 @@ packages: - supports-color dev: true - /@babel/generator/7.21.1: + /@babel/generator@7.21.1: resolution: {integrity: sha512-1lT45bAYlQhFn/BHivJs43AiW2rg3/UbLyShGfF3C0KmHvO5fSghWd5kBJy30kpRRucGzXStvnnCFniCR2kXAA==} engines: {node: '>=6.9.0'} dependencies: @@ -138,7 +178,7 @@ packages: jsesc: 2.5.2 dev: true - /@babel/helper-compilation-targets/7.20.7_@babel+core@7.21.0: + /@babel/helper-compilation-targets@7.20.7(@babel/core@7.21.0): resolution: {integrity: sha512-4tGORmfQcrc+bvrjb5y3dG9Mx1IOZjsHqQVUz7XCNHO+iTmqxWnVg3KRygjGmpRLJGdQSKuvFinbIb0CnZwHAQ==} engines: {node: '>=6.9.0'} peerDependencies: @@ -152,12 +192,12 @@ packages: semver: 6.3.0 dev: true - /@babel/helper-environment-visitor/7.18.9: + /@babel/helper-environment-visitor@7.18.9: resolution: {integrity: sha512-3r/aACDJ3fhQ/EVgFy0hpj8oHyHpQc+LPtJoY9SzTThAsStm4Ptegq92vqKoE3vD706ZVFWITnMnxucw+S9Ipg==} engines: {node: '>=6.9.0'} dev: true - /@babel/helper-function-name/7.21.0: + /@babel/helper-function-name@7.21.0: resolution: {integrity: sha512-HfK1aMRanKHpxemaY2gqBmL04iAPOPRj7DxtNbiDOrJK+gdwkiNRVpCpUJYbUT+aZyemKN8brqTOxzCaG6ExRg==} engines: {node: '>=6.9.0'} dependencies: @@ -165,21 +205,21 @@ packages: '@babel/types': 7.21.2 dev: true - /@babel/helper-hoist-variables/7.18.6: + /@babel/helper-hoist-variables@7.18.6: resolution: {integrity: sha512-UlJQPkFqFULIcyW5sbzgbkxn2FKRgwWiRexcuaR8RNJRy8+LLveqPjwZV/bwrLZCN0eUHD/x8D0heK1ozuoo6Q==} engines: {node: '>=6.9.0'} dependencies: '@babel/types': 7.21.2 dev: true - /@babel/helper-module-imports/7.18.6: + /@babel/helper-module-imports@7.18.6: resolution: {integrity: sha512-0NFvs3VkuSYbFi1x2Vd6tKrywq+z/cLeYC/RJNFrIX/30Bf5aiGYbtvGXolEktzJH8o5E5KJ3tT+nkxuuZFVlA==} engines: {node: '>=6.9.0'} dependencies: '@babel/types': 7.21.2 dev: true - /@babel/helper-module-transforms/7.21.2: + /@babel/helper-module-transforms@7.21.2: resolution: {integrity: sha512-79yj2AR4U/Oqq/WOV7Lx6hUjau1Zfo4cI+JLAVYeMV5XIlbOhmjEk5ulbTc9fMpmlojzZHkUUxAiK+UKn+hNQQ==} engines: {node: '>=6.9.0'} dependencies: @@ -195,34 +235,34 @@ packages: - supports-color dev: true - /@babel/helper-simple-access/7.20.2: + /@babel/helper-simple-access@7.20.2: resolution: {integrity: sha512-+0woI/WPq59IrqDYbVGfshjT5Dmk/nnbdpcF8SnMhhXObpTq2KNBdLFRFrkVdbDOyUmHBCxzm5FHV1rACIkIbA==} engines: {node: '>=6.9.0'} dependencies: '@babel/types': 7.21.2 dev: true - /@babel/helper-split-export-declaration/7.18.6: + /@babel/helper-split-export-declaration@7.18.6: resolution: {integrity: sha512-bde1etTx6ZyTmobl9LLMMQsaizFVZrquTEHOqKeQESMKo4PlObf+8+JA25ZsIpZhT/WEd39+vOdLXAFG/nELpA==} engines: {node: '>=6.9.0'} dependencies: '@babel/types': 7.21.2 dev: true - /@babel/helper-string-parser/7.19.4: + /@babel/helper-string-parser@7.19.4: resolution: {integrity: sha512-nHtDoQcuqFmwYNYPz3Rah5ph2p8PFeFCsZk9A/48dPc/rGocJ5J3hAAZ7pb76VWX3fZKu+uEr/FhH5jLx7umrw==} engines: {node: '>=6.9.0'} - /@babel/helper-validator-identifier/7.19.1: + /@babel/helper-validator-identifier@7.19.1: resolution: {integrity: sha512-awrNfaMtnHUr653GgGEs++LlAvW6w+DcPrOliSMXWCKo597CwL5Acf/wWdNkf/tfEQE3mjkeD1YOVZOUV/od1w==} engines: {node: '>=6.9.0'} - /@babel/helper-validator-option/7.21.0: + /@babel/helper-validator-option@7.21.0: resolution: {integrity: sha512-rmL/B8/f0mKS2baE9ZpyTcTavvEuWhTTW8amjzXNvYG4AwBsqTLikfXsEofsJEfKHf+HQVQbFOHy6o+4cnC/fQ==} engines: {node: '>=6.9.0'} dev: true - /@babel/helpers/7.21.0: + /@babel/helpers@7.21.0: resolution: {integrity: sha512-XXve0CBtOW0pd7MRzzmoyuSj0e3SEzj8pgyFxnTT1NJZL38BD1MK7yYrm8yefRPIDvNNe14xR4FdbHwpInD4rA==} engines: {node: '>=6.9.0'} dependencies: @@ -233,7 +273,7 @@ packages: - supports-color dev: true - /@babel/highlight/7.18.6: + /@babel/highlight@7.18.6: resolution: {integrity: sha512-u7stbOuYjaPezCuLj29hNW1v64M2Md2qupEKP1fHc7WdOA3DgLh37suiSrZYY7haUB7iBeQZ9P1uiRF359do3g==} engines: {node: '>=6.9.0'} dependencies: @@ -242,19 +282,19 @@ packages: js-tokens: 4.0.0 dev: true - /@babel/parser/7.21.2: + /@babel/parser@7.21.2: resolution: {integrity: sha512-URpaIJQwEkEC2T9Kn+Ai6Xe/02iNaVCuT/PtoRz3GPVJVDpPd7mLo+VddTbhCRU9TXqW5mSrQfXZyi8kDKOVpQ==} engines: {node: '>=6.0.0'} hasBin: true dependencies: '@babel/types': 7.21.2 - /@babel/standalone/7.21.2: + /@babel/standalone@7.21.2: resolution: {integrity: sha512-ySP/TJcyqMJVg1M/lmnPVi6L+F+IJpQ4+0lqtf723LERbk1N8/0JgLgm346cRAzfHaoXkLq/M/mJBd2uo25RBA==} engines: {node: '>=6.9.0'} dev: true - /@babel/template/7.20.7: + /@babel/template@7.20.7: resolution: {integrity: sha512-8SegXApWe6VoNw0r9JHpSteLKTpTiLZ4rMlGIm9JQ18KiCtyQiAMEazujAHrUS5flrcqYZa75ukev3P6QmUwUw==} engines: {node: '>=6.9.0'} dependencies: @@ -263,7 +303,7 @@ packages: '@babel/types': 7.21.2 dev: true - /@babel/traverse/7.21.2: + /@babel/traverse@7.21.2: resolution: {integrity: sha512-ts5FFU/dSUPS13tv8XiEObDu9K+iagEKME9kAbaP7r0Y9KtZJZ+NGndDvWoRAYNpeWafbpFeki3q9QoMD6gxyw==} engines: {node: '>=6.9.0'} dependencies: @@ -281,7 +321,7 @@ packages: - supports-color dev: true - /@babel/types/7.21.2: + /@babel/types@7.21.2: resolution: {integrity: sha512-3wRZSs7jiFaB8AjxiiD+VqN5DTG2iRvJGQ+qYFrs/654lg6kGTQWIOFjlBo5RaXuAZjBmP3+OQH4dmhqiiyYxw==} engines: {node: '>=6.9.0'} dependencies: @@ -289,16 +329,7 @@ packages: '@babel/helper-validator-identifier': 7.19.1 to-fast-properties: 2.0.0 - /@esbuild/android-arm/0.16.17: - resolution: {integrity: sha512-N9x1CMXVhtWEAMS7pNNONyA14f71VPQN9Cnavj1XQh6T7bskqiLLrSca4O0Vr8Wdcga943eThxnVp3JLnBMYtw==} - engines: {node: '>=12'} - cpu: [arm] - os: [android] - requiresBuild: true - dev: true - optional: true - - /@esbuild/android-arm64/0.16.17: + /@esbuild/android-arm64@0.16.17: resolution: {integrity: sha512-MIGl6p5sc3RDTLLkYL1MyL8BMRN4tLMRCn+yRJJmEDvYZ2M7tmAf80hx1kbNEUX2KJ50RRtxZ4JHLvCfuB6kBg==} engines: {node: '>=12'} cpu: [arm64] @@ -307,7 +338,16 @@ packages: dev: true optional: true - /@esbuild/android-x64/0.16.17: + /@esbuild/android-arm@0.16.17: + resolution: {integrity: sha512-N9x1CMXVhtWEAMS7pNNONyA14f71VPQN9Cnavj1XQh6T7bskqiLLrSca4O0Vr8Wdcga943eThxnVp3JLnBMYtw==} + engines: {node: '>=12'} + cpu: [arm] + os: [android] + requiresBuild: true + dev: true + optional: true + + /@esbuild/android-x64@0.16.17: resolution: {integrity: sha512-a3kTv3m0Ghh4z1DaFEuEDfz3OLONKuFvI4Xqczqx4BqLyuFaFkuaG4j2MtA6fuWEFeC5x9IvqnX7drmRq/fyAQ==} engines: {node: '>=12'} cpu: [x64] @@ -316,7 +356,7 @@ packages: dev: true optional: true - /@esbuild/darwin-arm64/0.16.17: + /@esbuild/darwin-arm64@0.16.17: resolution: {integrity: sha512-/2agbUEfmxWHi9ARTX6OQ/KgXnOWfsNlTeLcoV7HSuSTv63E4DqtAc+2XqGw1KHxKMHGZgbVCZge7HXWX9Vn+w==} engines: {node: '>=12'} cpu: [arm64] @@ -325,7 +365,7 @@ packages: dev: true optional: true - /@esbuild/darwin-x64/0.16.17: + /@esbuild/darwin-x64@0.16.17: resolution: {integrity: sha512-2By45OBHulkd9Svy5IOCZt376Aa2oOkiE9QWUK9fe6Tb+WDr8hXL3dpqi+DeLiMed8tVXspzsTAvd0jUl96wmg==} engines: {node: '>=12'} cpu: [x64] @@ -334,7 +374,7 @@ packages: dev: true optional: true - /@esbuild/freebsd-arm64/0.16.17: + /@esbuild/freebsd-arm64@0.16.17: resolution: {integrity: sha512-mt+cxZe1tVx489VTb4mBAOo2aKSnJ33L9fr25JXpqQqzbUIw/yzIzi+NHwAXK2qYV1lEFp4OoVeThGjUbmWmdw==} engines: {node: '>=12'} cpu: [arm64] @@ -343,7 +383,7 @@ packages: dev: true optional: true - /@esbuild/freebsd-x64/0.16.17: + /@esbuild/freebsd-x64@0.16.17: resolution: {integrity: sha512-8ScTdNJl5idAKjH8zGAsN7RuWcyHG3BAvMNpKOBaqqR7EbUhhVHOqXRdL7oZvz8WNHL2pr5+eIT5c65kA6NHug==} engines: {node: '>=12'} cpu: [x64] @@ -352,16 +392,7 @@ packages: dev: true optional: true - /@esbuild/linux-arm/0.16.17: - resolution: {integrity: sha512-iihzrWbD4gIT7j3caMzKb/RsFFHCwqqbrbH9SqUSRrdXkXaygSZCZg1FybsZz57Ju7N/SHEgPyaR0LZ8Zbe9gQ==} - engines: {node: '>=12'} - cpu: [arm] - os: [linux] - requiresBuild: true - dev: true - optional: true - - /@esbuild/linux-arm64/0.16.17: + /@esbuild/linux-arm64@0.16.17: resolution: {integrity: sha512-7S8gJnSlqKGVJunnMCrXHU9Q8Q/tQIxk/xL8BqAP64wchPCTzuM6W3Ra8cIa1HIflAvDnNOt2jaL17vaW+1V0g==} engines: {node: '>=12'} cpu: [arm64] @@ -370,7 +401,16 @@ packages: dev: true optional: true - /@esbuild/linux-ia32/0.16.17: + /@esbuild/linux-arm@0.16.17: + resolution: {integrity: sha512-iihzrWbD4gIT7j3caMzKb/RsFFHCwqqbrbH9SqUSRrdXkXaygSZCZg1FybsZz57Ju7N/SHEgPyaR0LZ8Zbe9gQ==} + engines: {node: '>=12'} + cpu: [arm] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@esbuild/linux-ia32@0.16.17: resolution: {integrity: sha512-kiX69+wcPAdgl3Lonh1VI7MBr16nktEvOfViszBSxygRQqSpzv7BffMKRPMFwzeJGPxcio0pdD3kYQGpqQ2SSg==} engines: {node: '>=12'} cpu: [ia32] @@ -379,7 +419,7 @@ packages: dev: true optional: true - /@esbuild/linux-loong64/0.16.17: + /@esbuild/linux-loong64@0.16.17: resolution: {integrity: sha512-dTzNnQwembNDhd654cA4QhbS9uDdXC3TKqMJjgOWsC0yNCbpzfWoXdZvp0mY7HU6nzk5E0zpRGGx3qoQg8T2DQ==} engines: {node: '>=12'} cpu: [loong64] @@ -388,7 +428,7 @@ packages: dev: true optional: true - /@esbuild/linux-mips64el/0.16.17: + /@esbuild/linux-mips64el@0.16.17: resolution: {integrity: sha512-ezbDkp2nDl0PfIUn0CsQ30kxfcLTlcx4Foz2kYv8qdC6ia2oX5Q3E/8m6lq84Dj/6b0FrkgD582fJMIfHhJfSw==} engines: {node: '>=12'} cpu: [mips64el] @@ -397,7 +437,7 @@ packages: dev: true optional: true - /@esbuild/linux-ppc64/0.16.17: + /@esbuild/linux-ppc64@0.16.17: resolution: {integrity: sha512-dzS678gYD1lJsW73zrFhDApLVdM3cUF2MvAa1D8K8KtcSKdLBPP4zZSLy6LFZ0jYqQdQ29bjAHJDgz0rVbLB3g==} engines: {node: '>=12'} cpu: [ppc64] @@ -406,7 +446,7 @@ packages: dev: true optional: true - /@esbuild/linux-riscv64/0.16.17: + /@esbuild/linux-riscv64@0.16.17: resolution: {integrity: sha512-ylNlVsxuFjZK8DQtNUwiMskh6nT0vI7kYl/4fZgV1llP5d6+HIeL/vmmm3jpuoo8+NuXjQVZxmKuhDApK0/cKw==} engines: {node: '>=12'} cpu: [riscv64] @@ -415,7 +455,7 @@ packages: dev: true optional: true - /@esbuild/linux-s390x/0.16.17: + /@esbuild/linux-s390x@0.16.17: resolution: {integrity: sha512-gzy7nUTO4UA4oZ2wAMXPNBGTzZFP7mss3aKR2hH+/4UUkCOyqmjXiKpzGrY2TlEUhbbejzXVKKGazYcQTZWA/w==} engines: {node: '>=12'} cpu: [s390x] @@ -424,7 +464,7 @@ packages: dev: true optional: true - /@esbuild/linux-x64/0.16.17: + /@esbuild/linux-x64@0.16.17: resolution: {integrity: sha512-mdPjPxfnmoqhgpiEArqi4egmBAMYvaObgn4poorpUaqmvzzbvqbowRllQ+ZgzGVMGKaPkqUmPDOOFQRUFDmeUw==} engines: {node: '>=12'} cpu: [x64] @@ -433,7 +473,7 @@ packages: dev: true optional: true - /@esbuild/netbsd-x64/0.16.17: + /@esbuild/netbsd-x64@0.16.17: resolution: {integrity: sha512-/PzmzD/zyAeTUsduZa32bn0ORug+Jd1EGGAUJvqfeixoEISYpGnAezN6lnJoskauoai0Jrs+XSyvDhppCPoKOA==} engines: {node: '>=12'} cpu: [x64] @@ -442,7 +482,7 @@ packages: dev: true optional: true - /@esbuild/openbsd-x64/0.16.17: + /@esbuild/openbsd-x64@0.16.17: resolution: {integrity: sha512-2yaWJhvxGEz2RiftSk0UObqJa/b+rIAjnODJgv2GbGGpRwAfpgzyrg1WLK8rqA24mfZa9GvpjLcBBg8JHkoodg==} engines: {node: '>=12'} cpu: [x64] @@ -451,7 +491,7 @@ packages: dev: true optional: true - /@esbuild/sunos-x64/0.16.17: + /@esbuild/sunos-x64@0.16.17: resolution: {integrity: sha512-xtVUiev38tN0R3g8VhRfN7Zl42YCJvyBhRKw1RJjwE1d2emWTVToPLNEQj/5Qxc6lVFATDiy6LjVHYhIPrLxzw==} engines: {node: '>=12'} cpu: [x64] @@ -460,7 +500,7 @@ packages: dev: true optional: true - /@esbuild/win32-arm64/0.16.17: + /@esbuild/win32-arm64@0.16.17: resolution: {integrity: sha512-ga8+JqBDHY4b6fQAmOgtJJue36scANy4l/rL97W+0wYmijhxKetzZdKOJI7olaBaMhWt8Pac2McJdZLxXWUEQw==} engines: {node: '>=12'} cpu: [arm64] @@ -469,7 +509,7 @@ packages: dev: true optional: true - /@esbuild/win32-ia32/0.16.17: + /@esbuild/win32-ia32@0.16.17: resolution: {integrity: sha512-WnsKaf46uSSF/sZhwnqE4L/F89AYNMiD4YtEcYekBt9Q7nj0DiId2XH2Ng2PHM54qi5oPrQ8luuzGszqi/veig==} engines: {node: '>=12'} cpu: [ia32] @@ -478,7 +518,7 @@ packages: dev: true optional: true - /@esbuild/win32-x64/0.16.17: + /@esbuild/win32-x64@0.16.17: resolution: {integrity: sha512-y+EHuSchhL7FjHgvQL/0fnnFmO4T1bhvWANX6gcnqTjtnKWbTvUMCpGnv2+t+31d7RzyEAYAd4u2fnIhHL6N/Q==} engines: {node: '>=12'} cpu: [x64] @@ -487,7 +527,7 @@ packages: dev: true optional: true - /@eslint/eslintrc/2.0.0: + /@eslint/eslintrc@2.0.0: resolution: {integrity: sha512-fluIaaV+GyV24CCu/ggiHdV+j4RNh85yQnAYS/G2mZODZgGmmlrgCydjUcV3YvxCm9x8nMAfThsqTni4KiXT4A==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} dependencies: @@ -504,12 +544,12 @@ packages: - supports-color dev: true - /@eslint/js/8.35.0: + /@eslint/js@8.35.0: resolution: {integrity: sha512-JXdzbRiWclLVoD8sNUjR443VVlYqiYmDVT6rGUEIEHU5YJW0gaVZwV2xgM7D4arkvASqD0IlLUVjHiFuxaftRw==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} dev: true - /@humanwhocodes/config-array/0.11.8: + /@humanwhocodes/config-array@0.11.8: resolution: {integrity: sha512-UybHIJzJnR5Qc/MsD9Kr+RpO2h+/P1GhOwdiLPXK5TWk5sgTdu88bTD9UP+CKbPPh5Rni1u0GjAdYQLemG8g+g==} engines: {node: '>=10.10.0'} dependencies: @@ -520,27 +560,27 @@ packages: - supports-color dev: true - /@humanwhocodes/module-importer/1.0.1: + /@humanwhocodes/module-importer@1.0.1: resolution: {integrity: sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==} engines: {node: '>=12.22'} dev: true - /@humanwhocodes/object-schema/1.2.1: + /@humanwhocodes/object-schema@1.2.1: resolution: {integrity: sha512-ZnQMnLV4e7hDlUvw8H+U8ASL02SS2Gn6+9Ac3wGGLIe7+je2AeAOxPY+izIPJDfFDb7eDjev0Us8MO1iFRN8hA==} dev: true - /@iconify/json/2.2.30: + /@iconify/json@2.2.30: resolution: {integrity: sha512-F+eeFDEe+5iZ6wn/GrpQhycWN5XeULA17oPZdl8t+BuOwrq0rRWanB0sruGRir+SScsUuKR2TJyWTaQwmqtnvQ==} dependencies: '@iconify/types': 2.0.0 pathe: 1.1.0 dev: true - /@iconify/types/2.0.0: + /@iconify/types@2.0.0: resolution: {integrity: sha512-+wluvCrRhXrhyOmRDJ3q8mux9JkKy5SJ/v8ol2tu4FVjyYvtEzkc/3pK15ET6RKg4b4w4BmTk1+gsCUhf21Ykg==} dev: true - /@iconify/utils/2.1.4: + /@iconify/utils@2.1.4: resolution: {integrity: sha512-7vzsYIvxv5Hng0MNEtSSnyMBD/+zqnORqmKiYsSgpMBGSz1r93URgBZHPYCZ1/gpoaVstYW4/SVLGCMJBNMCLQ==} dependencies: '@antfu/install-pkg': 0.1.1 @@ -553,7 +593,7 @@ packages: - supports-color dev: true - /@intlify/bundle-utils/4.0.0_vue-i18n@9.2.2: + /@intlify/bundle-utils@4.0.0(vue-i18n@9.2.2): resolution: {integrity: sha512-klXrYT9VXyKEXsD6UY3pShg0O5MPC07n0TZ5RrSs5ry6T1eZVolIFGJi9c3qcDrh1qjJxgikRnPBmD7qGDqbjw==} engines: {node: '>= 12'} peerDependencies: @@ -569,11 +609,11 @@ packages: '@intlify/shared': 9.3.0-beta.17 jsonc-eslint-parser: 1.4.1 source-map: 0.6.1 - vue-i18n: 9.2.2_vue@3.2.47 + vue-i18n: 9.2.2(vue@3.2.47) yaml-eslint-parser: 0.3.2 dev: false - /@intlify/core-base/9.2.2: + /@intlify/core-base@9.2.2: resolution: {integrity: sha512-JjUpQtNfn+joMbrXvpR4hTF8iJQ2sEFzzK3KIESOx+f+uwIjgw20igOyaIdhfsVVBCds8ZM64MoeNSx+PHQMkA==} engines: {node: '>= 14'} dependencies: @@ -583,14 +623,14 @@ packages: '@intlify/vue-devtools': 9.2.2 dev: false - /@intlify/devtools-if/9.2.2: + /@intlify/devtools-if@9.2.2: resolution: {integrity: sha512-4ttr/FNO29w+kBbU7HZ/U0Lzuh2cRDhP8UlWOtV9ERcjHzuyXVZmjyleESK6eVP60tGC9QtQW9yZE+JeRhDHkg==} engines: {node: '>= 14'} dependencies: '@intlify/shared': 9.2.2 dev: false - /@intlify/message-compiler/9.2.2: + /@intlify/message-compiler@9.2.2: resolution: {integrity: sha512-IUrQW7byAKN2fMBe8z6sK6riG1pue95e5jfokn8hA5Q3Bqy4MBJ5lJAofUsawQJYHeoPJ7svMDyBaVJ4d0GTtA==} engines: {node: '>= 14'} dependencies: @@ -598,7 +638,7 @@ packages: source-map: 0.6.1 dev: false - /@intlify/message-compiler/9.3.0-beta.17: + /@intlify/message-compiler@9.3.0-beta.17: resolution: {integrity: sha512-i7hvVIRk1Ax2uKa9xLRJCT57to08OhFMhFXXjWN07rmx5pWQYQ23MfX1xgggv9drnWTNhqEiD+u4EJeHoS5+Ww==} engines: {node: '>= 14'} dependencies: @@ -606,17 +646,17 @@ packages: source-map: 0.6.1 dev: false - /@intlify/shared/9.2.2: + /@intlify/shared@9.2.2: resolution: {integrity: sha512-wRwTpsslgZS5HNyM7uDQYZtxnbI12aGiBZURX3BTR9RFIKKRWpllTsgzHWvj3HKm3Y2Sh5LPC1r0PDCKEhVn9Q==} engines: {node: '>= 14'} dev: false - /@intlify/shared/9.3.0-beta.17: + /@intlify/shared@9.3.0-beta.17: resolution: {integrity: sha512-mscf7RQsUTOil35jTij4KGW1RC9SWQjYScwLxP53Ns6g24iEd5HN7ksbt9O6FvTmlQuX77u+MXpBdfJsGqizLQ==} engines: {node: '>= 14'} dev: false - /@intlify/unplugin-vue-i18n/0.8.2_vue-i18n@9.2.2: + /@intlify/unplugin-vue-i18n@0.8.2(vue-i18n@9.2.2): resolution: {integrity: sha512-cRnzPqSEZQOmTD+p4pwc3RTS9HxreLqfID0keoqZDZweCy/CGRMLLTNd15S4TUf1vSBhPF03DItEFDr1F+8MDA==} engines: {node: '>= 14.16'} peerDependencies: @@ -631,7 +671,7 @@ packages: vue-i18n-bridge: optional: true dependencies: - '@intlify/bundle-utils': 4.0.0_vue-i18n@9.2.2 + '@intlify/bundle-utils': 4.0.0(vue-i18n@9.2.2) '@intlify/shared': 9.3.0-beta.17 '@rollup/pluginutils': 4.2.1 '@vue/compiler-sfc': 3.2.47 @@ -643,12 +683,12 @@ packages: picocolors: 1.0.0 source-map: 0.6.1 unplugin: 1.1.0 - vue-i18n: 9.2.2_vue@3.2.47 + vue-i18n: 9.2.2(vue@3.2.47) transitivePeerDependencies: - supports-color dev: false - /@intlify/vue-devtools/9.2.2: + /@intlify/vue-devtools@9.2.2: resolution: {integrity: sha512-+dUyqyCHWHb/UcvY1MlIpO87munedm3Gn6E9WWYdWrMuYLcoIoOEVDWSS8xSwtlPU+kA+MEQTP6Q1iI/ocusJg==} engines: {node: '>= 14'} dependencies: @@ -656,7 +696,7 @@ packages: '@intlify/shared': 9.2.2 dev: false - /@jridgewell/gen-mapping/0.1.1: + /@jridgewell/gen-mapping@0.1.1: resolution: {integrity: sha512-sQXCasFk+U8lWYEe66WxRDOE9PjVz4vSM51fTu3Hw+ClTpUSQb718772vH3pyS5pShp6lvQM7SxgIDXXXmOX7w==} engines: {node: '>=6.0.0'} dependencies: @@ -664,7 +704,7 @@ packages: '@jridgewell/sourcemap-codec': 1.4.14 dev: true - /@jridgewell/gen-mapping/0.3.2: + /@jridgewell/gen-mapping@0.3.2: resolution: {integrity: sha512-mh65xKQAzI6iBcFzwv28KVWSmCkdRBWoOh+bYQGW3+6OZvbbN3TqMGo5hqYxQniRcH9F2VZIoJCm4pa3BPDK/A==} engines: {node: '>=6.0.0'} dependencies: @@ -673,35 +713,35 @@ packages: '@jridgewell/trace-mapping': 0.3.17 dev: true - /@jridgewell/resolve-uri/3.1.0: + /@jridgewell/resolve-uri@3.1.0: resolution: {integrity: sha512-F2msla3tad+Mfht5cJq7LSXcdudKTWCVYUgw6pLFOOHSTtZlj6SWNYAp+AhuqLmWdBO2X5hPrLcu8cVP8fy28w==} engines: {node: '>=6.0.0'} dev: true - /@jridgewell/set-array/1.1.2: + /@jridgewell/set-array@1.1.2: resolution: {integrity: sha512-xnkseuNADM0gt2bs+BvhO0p78Mk762YnZdsuzFV018NoG1Sj1SCQvpSqa7XUaTam5vAGasABV9qXASMKnFMwMw==} engines: {node: '>=6.0.0'} dev: true - /@jridgewell/sourcemap-codec/1.4.14: + /@jridgewell/sourcemap-codec@1.4.14: resolution: {integrity: sha512-XPSJHWmi394fuUuzDnGz1wiKqWfo1yXecHQMRf2l6hztTO+nPru658AyDngaBe7isIxEkRsPR3FZh+s7iVa4Uw==} dev: true - /@jridgewell/trace-mapping/0.3.17: + /@jridgewell/trace-mapping@0.3.17: resolution: {integrity: sha512-MCNzAp77qzKca9+W/+I0+sEpaUnZoeasnghNeVc41VZCEKaCH73Vq3BZZ/SzWIgrqE4H4ceI+p+b6C0mHf9T4g==} dependencies: '@jridgewell/resolve-uri': 3.1.0 '@jridgewell/sourcemap-codec': 1.4.14 dev: true - /@mdit-vue/plugin-component/0.11.2: + /@mdit-vue/plugin-component@0.11.2: resolution: {integrity: sha512-ucFiEULCkLcCG1Tf1MfG5u5PS4BIXWIeKGHRGsXxz1ix2GbZWKFVgWEdNEckBu8s75Fv1WJLIOiAYZyri2f1nw==} dependencies: '@types/markdown-it': 12.2.3 markdown-it: 13.0.1 dev: true - /@mdit-vue/plugin-frontmatter/0.11.1: + /@mdit-vue/plugin-frontmatter@0.11.1: resolution: {integrity: sha512-AdZJInjD1pTJXlfhuoBS5ycuIQ3ewBfY0R/XHM3TRDEaDHQJHxouUCpCyijZmpdljTU45lFetIowaKtAi7GBog==} dependencies: '@mdit-vue/types': 0.11.0 @@ -710,29 +750,29 @@ packages: markdown-it: 13.0.1 dev: true - /@mdit-vue/types/0.11.0: + /@mdit-vue/types@0.11.0: resolution: {integrity: sha512-ygCGP7vFpqS02hpZwEe1uz8cfImWX06+zRs08J+tCZRKb6k+easIaIHFtY9ZSxt7j9L/gAPLDo/5RmOT6z0DPQ==} dev: true - /@nodelib/fs.scandir/2.1.5: + /@nodelib/fs.scandir@2.1.5: resolution: {integrity: sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==} engines: {node: '>= 8'} dependencies: '@nodelib/fs.stat': 2.0.5 run-parallel: 1.2.0 - /@nodelib/fs.stat/2.0.5: + /@nodelib/fs.stat@2.0.5: resolution: {integrity: sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==} engines: {node: '>= 8'} - /@nodelib/fs.walk/1.2.8: + /@nodelib/fs.walk@1.2.8: resolution: {integrity: sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==} engines: {node: '>= 8'} dependencies: '@nodelib/fs.scandir': 2.1.5 fastq: 1.15.0 - /@nuxt/kit/3.2.3: + /@nuxt/kit@3.2.3: resolution: {integrity: sha512-wcsVlQLwGkh1cRhAFWHc3uYHdIxFTRNdRUzNyfqoX9DL0Fuga3K75q/PBY0xg1viA9R6F5BMPhc7KDLSWbXtWg==} engines: {node: ^14.18.0 || ^16.10.0 || ^17.0.0 || ^18.0.0 || ^19.0.0} dependencies: @@ -759,7 +799,7 @@ packages: - supports-color dev: true - /@nuxt/schema/3.2.3: + /@nuxt/schema@3.2.3: resolution: {integrity: sha512-AXzRnBivCwn5RpNFWjUkvOPGPSHl5BM+6GfOpSNglPXi0tiQJ+rawSl7no7BkxGDmQ44Bx9AXwvHTrgjpcuo4g==} engines: {node: ^14.18.0 || ^16.10.0 || ^17.0.0 || ^18.0.0 || ^19.0.0} dependencies: @@ -781,7 +821,7 @@ packages: - supports-color dev: true - /@pkgr/utils/2.3.1: + /@pkgr/utils@2.3.1: resolution: {integrity: sha512-wfzX8kc1PMyUILA+1Z/EqoE4UCXGy0iRGMhPwdfae1+f0OXlLqCk+By+aMzgJBzR9AzS4CDizioG6Ss1gvAFJw==} engines: {node: ^12.20.0 || ^14.18.0 || >=16.0.0} dependencies: @@ -793,11 +833,11 @@ packages: tslib: 2.5.0 dev: false - /@polka/url/1.0.0-next.21: + /@polka/url@1.0.0-next.21: resolution: {integrity: sha512-a5Sab1C4/icpTZVzZc5Ghpz88yQtGOyNqYXcZgOssB2uuAr+wF/MvN6bgtW32q7HHrvBki+BsZ0OuNv6EV3K9g==} dev: true - /@rollup/pluginutils/4.2.1: + /@rollup/pluginutils@4.2.1: resolution: {integrity: sha512-iKnFXr7NkdZAIHiIWE+BX5ULi/ucVFYWD6TbAV+rZctiRTY2PL6tsIKhoIOaoskiWAkgu+VsbXgUVDNLHf+InQ==} engines: {node: '>= 8.0.0'} dependencies: @@ -805,7 +845,7 @@ packages: picomatch: 2.3.1 dev: false - /@rollup/pluginutils/5.0.2: + /@rollup/pluginutils@5.0.2: resolution: {integrity: sha512-pTd9rIsP92h+B6wWwFbW8RkZv4hiR/xKsqre4SIuAOaOEQRxi0lqLke9k2/7WegC85GgUs9pjmOjCUi3In4vwA==} engines: {node: '>=14.0.0'} peerDependencies: @@ -819,49 +859,49 @@ packages: picomatch: 2.3.1 dev: true - /@types/debug/4.1.7: + /@types/debug@4.1.7: resolution: {integrity: sha512-9AonUzyTjXXhEOa0DnqpzZi6VHlqKMswga9EXjpXnnqxwLtdvPPtlO8evrI5D9S6asFRCQ6v+wpiUKbw+vKqyg==} dependencies: '@types/ms': 0.7.31 dev: true - /@types/estree/1.0.0: + /@types/estree@1.0.0: resolution: {integrity: sha512-WulqXMDUTYAXCjZnk6JtIHPigp55cVtDgDrO2gHRwhyJto21+1zbVCtOYB2L1F9w4qCQ0rOGWBnBe0FNTiEJIQ==} dev: true - /@types/events/3.0.0: + /@types/events@3.0.0: resolution: {integrity: sha512-EaObqwIvayI5a8dCzhFrjKzVwKLxjoG9T6Ppd5CEo07LRKfQ8Yokw54r5+Wq7FaBQ+yXRvQAYPrHwya1/UFt9g==} dev: true - /@types/linkify-it/3.0.2: + /@types/linkify-it@3.0.2: resolution: {integrity: sha512-HZQYqbiFVWufzCwexrvh694SOim8z2d+xJl5UNamcvQFejLY/2YUtzXHYi3cHdI7PMlS8ejH2slRAOJQ32aNbA==} dev: true - /@types/markdown-it-link-attributes/3.0.1: + /@types/markdown-it-link-attributes@3.0.1: resolution: {integrity: sha512-K8RnNb1q8j7rDOJbMF7AnlhCC/45BjrQ8z3WZWOrvkBIl8u9RXvmBdG/hfpnmK1JhhEZcmFEKWt+ilW1Mly+2Q==} dependencies: '@types/markdown-it': 12.2.3 dev: true - /@types/markdown-it/12.2.3: + /@types/markdown-it@12.2.3: resolution: {integrity: sha512-GKMHFfv3458yYy+v/N8gjufHO6MSZKCOXpZc5GXIWWy8uldwfmPn98vp81gZ5f9SVw8YYBctgfJ22a2d7AOMeQ==} dependencies: '@types/linkify-it': 3.0.2 '@types/mdurl': 1.0.2 dev: true - /@types/mdurl/1.0.2: + /@types/mdurl@1.0.2: resolution: {integrity: sha512-eC4U9MlIcu2q0KQmXszyn5Akca/0jrQmwDRgpAMJai7qBWq4amIQhZyNau4VYGtCeALvW1/NtjzJJ567aZxfKA==} dev: true - /@types/ms/0.7.31: + /@types/ms@0.7.31: resolution: {integrity: sha512-iiUgKzV9AuaEkZqkOLDIvlQiL6ltuZd9tGcW3gwpnX8JbuiuhFlEGmmFXEXkN50Cvq7Os88IY2v0dkDqXYWVgA==} dev: true - /@types/web-bluetooth/0.0.16: + /@types/web-bluetooth@0.0.16: resolution: {integrity: sha512-oh8q2Zc32S6gd/j50GowEjKLoOVOwHP/bWVjKJInBwQqdOYMdPrf1oVlelTlyfFK3CKxL1uahMDAr+vy8T7yMQ==} - /@typescript-eslint/parser/5.54.1_ycpbpc6yetojsgtrx3mwntkhsu: + /@typescript-eslint/parser@5.54.1(eslint@8.35.0)(typescript@4.9.5): resolution: {integrity: sha512-8zaIXJp/nG9Ff9vQNh7TI+C3nA6q6iIsGJ4B4L6MhZ7mHnTMR4YP5vp2xydmFXIy8rpyIVbNAG44871LMt6ujg==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} peerDependencies: @@ -873,7 +913,7 @@ packages: dependencies: '@typescript-eslint/scope-manager': 5.54.1 '@typescript-eslint/types': 5.54.1 - '@typescript-eslint/typescript-estree': 5.54.1_typescript@4.9.5 + '@typescript-eslint/typescript-estree': 5.54.1(typescript@4.9.5) debug: 4.3.4 eslint: 8.35.0 typescript: 4.9.5 @@ -881,7 +921,7 @@ packages: - supports-color dev: true - /@typescript-eslint/scope-manager/5.54.1: + /@typescript-eslint/scope-manager@5.54.1: resolution: {integrity: sha512-zWKuGliXxvuxyM71UA/EcPxaviw39dB2504LqAmFDjmkpO8qNLHcmzlh6pbHs1h/7YQ9bnsO8CCcYCSA8sykUg==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} dependencies: @@ -889,12 +929,12 @@ packages: '@typescript-eslint/visitor-keys': 5.54.1 dev: true - /@typescript-eslint/types/5.54.1: + /@typescript-eslint/types@5.54.1: resolution: {integrity: sha512-G9+1vVazrfAfbtmCapJX8jRo2E4MDXxgm/IMOF4oGh3kq7XuK3JRkOg6y2Qu1VsTRmWETyTkWt1wxy7X7/yLkw==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} dev: true - /@typescript-eslint/typescript-estree/5.54.1_typescript@4.9.5: + /@typescript-eslint/typescript-estree@5.54.1(typescript@4.9.5): resolution: {integrity: sha512-bjK5t+S6ffHnVwA0qRPTZrxKSaFYocwFIkZx5k7pvWfsB1I57pO/0M0Skatzzw1sCkjJ83AfGTL0oFIFiDX3bg==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} peerDependencies: @@ -909,13 +949,13 @@ packages: globby: 11.1.0 is-glob: 4.0.3 semver: 7.3.8 - tsutils: 3.21.0_typescript@4.9.5 + tsutils: 3.21.0(typescript@4.9.5) typescript: 4.9.5 transitivePeerDependencies: - supports-color dev: true - /@typescript-eslint/visitor-keys/5.54.1: + /@typescript-eslint/visitor-keys@5.54.1: resolution: {integrity: sha512-q8iSoHTgwCfgcRJ2l2x+xCbu8nBlRAlsQ33k24Adj8eoVBE0f8dUeI+bAa8F84Mv05UGbAx57g2zrRsYIooqQg==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} dependencies: @@ -923,34 +963,34 @@ packages: eslint-visitor-keys: 3.3.0 dev: true - /@unhead/dom/1.1.15: + /@unhead/dom@1.1.15: resolution: {integrity: sha512-b1S8avVokif15pankINlFrKrxW2pEJ4R4vt/IEDLhjsAq4oDeLpbFUQNvFeEQafaXBdryCTWICJX8MQrzs9INA==} dependencies: '@unhead/schema': 1.1.15 '@unhead/shared': 1.1.15 dev: false - /@unhead/schema/1.1.15: + /@unhead/schema@1.1.15: resolution: {integrity: sha512-331yP1JrJfvaa2TvfiVGLlgwl9bVgFVJ0pMy1hPBM/0+J09d6SKy4khZb2j0WtgVofY6FnThmKWDNCngCzRZhg==} dependencies: hookable: 5.4.2 zhead: 2.0.4 dev: false - /@unhead/shared/1.1.15: + /@unhead/shared@1.1.15: resolution: {integrity: sha512-s41AbZFeTAV982pP5+MUno3UlKcSxziMjs+D6TAKP+OdNhyN/W557TUVKbBY/4EWWYl5c0wJhjeuVduJBQpSSQ==} dependencies: '@unhead/schema': 1.1.15 dev: false - /@unhead/ssr/1.1.15: + /@unhead/ssr@1.1.15: resolution: {integrity: sha512-ZDj3lJuMOTrhDrNFQLETC1xQN2z53GzXV4kRQ6Baeqb9uDR+3q1yeHV+eL7DEqR8aPCHt26gs5c8OYJsfE1HFQ==} dependencies: '@unhead/schema': 1.1.15 '@unhead/shared': 1.1.15 dev: false - /@unhead/vue/1.1.15_vue@3.2.47: + /@unhead/vue@1.1.15(vue@3.2.47): resolution: {integrity: sha512-EX8zsb3dNhC72tpz6BExK3oIpy2t6f2QbpYsr6gthgtLMJqe8SPjgJlKGcVEegZhPw4bmMzMk72Dak3qomb98A==} peerDependencies: vue: '>=2.7 || >=3' @@ -962,7 +1002,17 @@ packages: vue: 3.2.47 dev: false - /@vitejs/plugin-vue/4.0.0_vite@4.1.4+vue@3.2.47: + /@vee-validate/zod@4.8.4(vue@3.2.47): + resolution: {integrity: sha512-hdbVB+LjEj0Oa0G3LI9NIbQ5hPuCaGwVCYDXUUUubnuJSawzKYjUh/dq1WhPsNW8PljrVLiS3iszWgtbJjcygQ==} + dependencies: + type-fest: 3.7.2 + vee-validate: 4.8.4(vue@3.2.47) + zod: 3.21.4 + transitivePeerDependencies: + - vue + dev: false + + /@vitejs/plugin-vue@4.0.0(vite@4.1.4)(vue@3.2.47): resolution: {integrity: sha512-e0X4jErIxAB5oLtDqbHvHpJe/uWNkdpYV83AOG2xo2tEVSzCzewgJMtREZM30wXnM5ls90hxiOtAuVU6H5JgbA==} engines: {node: ^14.18.0 || >=16.0.0} peerDependencies: @@ -973,38 +1023,38 @@ packages: vue: 3.2.47 dev: true - /@volar/language-core/1.0.24: + /@volar/language-core@1.0.24: resolution: {integrity: sha512-vTN+alJiWwK0Pax6POqrmevbtFW2dXhjwWiW/MW4f48eDYPLdyURWcr8TixO7EN/nHsUBj2udT7igFKPtjyAKg==} dependencies: '@volar/source-map': 1.0.24 muggle-string: 0.1.0 dev: true - /@volar/language-core/1.3.0-alpha.0: + /@volar/language-core@1.3.0-alpha.0: resolution: {integrity: sha512-W3uMzecHPcbwddPu4SJpUcPakRBK/y/BP+U0U6NiPpUX1tONLC4yCawt+QBJqtgJ+sfD6ztf5PyvPL3hQRqfOA==} dependencies: '@volar/source-map': 1.3.0-alpha.0 dev: true - /@volar/source-map/1.0.24: + /@volar/source-map@1.0.24: resolution: {integrity: sha512-Qsv/tkplx18pgBr8lKAbM1vcDqgkGKQzbChg6NW+v0CZc3G7FLmK+WrqEPzKlN7Cwdc6XVL559Nod8WKAfKr4A==} dependencies: muggle-string: 0.1.0 dev: true - /@volar/source-map/1.3.0-alpha.0: + /@volar/source-map@1.3.0-alpha.0: resolution: {integrity: sha512-jSdizxWFvDTvkPYZnO6ew3sBZUnS0abKCbuopkc0JrIlFbznWC/fPH3iPFIMS8/IIkRxq1Jh9VVG60SmtsdaMQ==} dependencies: muggle-string: 0.2.2 dev: true - /@volar/typescript/1.3.0-alpha.0: + /@volar/typescript@1.3.0-alpha.0: resolution: {integrity: sha512-5UItyW2cdH2mBLu4RrECRNJRgtvvzKrSCn2y3v/D61QwIDkGx4aeil6x8RFuUL5TFtV6QvVHXnsOHxNgd+sCow==} dependencies: '@volar/language-core': 1.3.0-alpha.0 dev: true - /@volar/vue-language-core/1.2.0: + /@volar/vue-language-core@1.2.0: resolution: {integrity: sha512-w7yEiaITh2WzKe6u8ZdeLKCUz43wdmY/OqAmsB/PGDvvhTcVhCJ6f0W/RprZL1IhqH8wALoWiwEh/Wer7ZviMQ==} dependencies: '@volar/language-core': 1.3.0-alpha.0 @@ -1018,37 +1068,37 @@ packages: vue-template-compiler: 2.7.14 dev: true - /@volar/vue-typescript/1.2.0: + /@volar/vue-typescript@1.2.0: resolution: {integrity: sha512-zjmRi9y3J1EkG+pfuHp8IbHmibihrKK485cfzsHjiuvJMGrpkWvlO5WVEk8oslMxxeGC5XwBFE9AOlvh378EPA==} dependencies: '@volar/typescript': 1.3.0-alpha.0 '@volar/vue-language-core': 1.2.0 dev: true - /@vue-macros/api/0.4.5_vue@3.2.47: + /@vue-macros/api@0.4.5(vue@3.2.47): resolution: {integrity: sha512-qXngAM8bvy0tXY58lLkBoCV0r1Z+ZaJN2WgVMm/0Lgqf5pszcVTgsNEsb8uGgPfenBiRad4o7vvpxHXXO9QNyQ==} engines: {node: '>=14.19.0'} dependencies: '@babel/types': 7.21.2 - '@vue-macros/common': 1.1.0_vue@3.2.47 + '@vue-macros/common': 1.1.0(vue@3.2.47) transitivePeerDependencies: - vue dev: true - /@vue-macros/better-define/1.3.5_vue@3.2.47: + /@vue-macros/better-define@1.3.5(vue@3.2.47): resolution: {integrity: sha512-ooFpF1J3Cuwryjt1bwpp/aevWwQZg4bTyD7hfIdYoL6SP4Mp+ewp+zI/pbxmCZOcIPy04degUhcMo0PQA9bLnw==} engines: {node: '>=14.19.0'} dependencies: '@rollup/pluginutils': 5.0.2 - '@vue-macros/api': 0.4.5_vue@3.2.47 - '@vue-macros/common': 1.1.0_vue@3.2.47 + '@vue-macros/api': 0.4.5(vue@3.2.47) + '@vue-macros/common': 1.1.0(vue@3.2.47) unplugin: 1.1.0 transitivePeerDependencies: - rollup - vue dev: true - /@vue-macros/common/1.1.0_vue@3.2.47: + /@vue-macros/common@1.1.0(vue@3.2.47): resolution: {integrity: sha512-BvreSru0kh6q/PFAt4erTY29buoVzLoUfXp1nW2cS9PQ589Y76iACw0NcjflXUUxGPRxQkQK+iRx/c4pUj0eeQ==} engines: {node: '>=14.19.0'} peerDependencies: @@ -1064,7 +1114,7 @@ packages: vue: 3.2.47 dev: true - /@vue-macros/define-model/1.3.3_wahnhgkv24wdnnevlbh26c63xq: + /@vue-macros/define-model@1.3.3(@vueuse/core@9.13.0)(vue@3.2.47): resolution: {integrity: sha512-xDDWXo+vzUdUaS+J0Jg2jOGNaEXRaLZkWsB034usU0CFJ/hCAl+nYHrTDQnCPh12XlaetxNajxwWMDBvqzYjmA==} engines: {node: '>=14.19.0'} peerDependencies: @@ -1074,8 +1124,8 @@ packages: optional: true dependencies: '@rollup/pluginutils': 5.0.2 - '@vue-macros/common': 1.1.0_vue@3.2.47 - '@vueuse/core': 9.13.0_vue@3.2.47 + '@vue-macros/common': 1.1.0(vue@3.2.47) + '@vueuse/core': 9.13.0(vue@3.2.47) ast-walker-scope: 0.4.0 unplugin: 1.1.0 transitivePeerDependencies: @@ -1083,21 +1133,21 @@ packages: - vue dev: true - /@vue-macros/define-props-refs/0.2.2_vue@3.2.47: + /@vue-macros/define-props-refs@0.2.2(vue@3.2.47): resolution: {integrity: sha512-8ZV0bWc0/Y3TJ0WHhDXDOBCTbTr94iuVXydH/K9WfQL0aAHqG9Vw638CotEeW6VHiUKSwA5+/hHMZwlRfLlpgg==} engines: {node: '>=14.19.0'} peerDependencies: vue: ^2.7.0 || ^3.2.25 dependencies: '@rollup/pluginutils': 5.0.2 - '@vue-macros/common': 1.1.0_vue@3.2.47 + '@vue-macros/common': 1.1.0(vue@3.2.47) unplugin: 1.1.0 vue: 3.2.47 transitivePeerDependencies: - rollup dev: true - /@vue-macros/define-props/0.4.0_vr7yg7432jseo5qubl5iatrj4q: + /@vue-macros/define-props@0.4.0(@vue-macros/reactivity-transform@0.2.4)(vue@3.2.47): resolution: {integrity: sha512-nbCxN5xODrngdgDF6mrRjglNC3S++RcESZlaN/SuBF7o5LiYsrdWqg575w5vapMudQ58vvslTTfsEeV1rOpYOA==} engines: {node: '>=14.19.0'} peerDependencies: @@ -1105,43 +1155,43 @@ packages: vue: ^2.7.0 || ^3.2.25 dependencies: '@rollup/pluginutils': 5.0.2 - '@vue-macros/common': 1.1.0_vue@3.2.47 - '@vue-macros/reactivity-transform': 0.2.4_vue@3.2.47 + '@vue-macros/common': 1.1.0(vue@3.2.47) + '@vue-macros/reactivity-transform': 0.2.4(vue@3.2.47) unplugin: 1.1.0 vue: 3.2.47 transitivePeerDependencies: - rollup dev: true - /@vue-macros/define-render/1.2.3_vue@3.2.47: + /@vue-macros/define-render@1.2.3(vue@3.2.47): resolution: {integrity: sha512-rU4NIfoq9oE5V80AImc/rkg51a/fvJsCAmTeWM2xd6Z+yKubfH+7WsQrVlwPZbyORip0VRAe2tWFyv8cibY8WQ==} engines: {node: '>=14.19.0'} peerDependencies: vue: ^2.7.0 || ^3.0.0 dependencies: '@rollup/pluginutils': 5.0.2 - '@vue-macros/common': 1.1.0_vue@3.2.47 + '@vue-macros/common': 1.1.0(vue@3.2.47) unplugin: 1.1.0 vue: 3.2.47 transitivePeerDependencies: - rollup dev: true - /@vue-macros/define-slots/0.2.3_vue@3.2.47: + /@vue-macros/define-slots@0.2.3(vue@3.2.47): resolution: {integrity: sha512-h3L6gAHScSAbEaGgyTKCA3tYuCqfhvIYNNDxdQu6zPE/tYjnFG/vi3pypdW1H4VmwQf/jhV0IHDT+Kaf3TEnVA==} engines: {node: '>=14.19.0'} peerDependencies: vue: ^2.7.0 || ^3.0.0 dependencies: '@rollup/pluginutils': 5.0.2 - '@vue-macros/common': 1.1.0_vue@3.2.47 + '@vue-macros/common': 1.1.0(vue@3.2.47) unplugin: 1.1.0 vue: 3.2.47 transitivePeerDependencies: - rollup dev: true - /@vue-macros/devtools/0.1.2_vite@4.1.4: + /@vue-macros/devtools@0.1.2(vite@4.1.4): resolution: {integrity: sha512-LhWTb0pPoTcFmK8GZb80+q83ypEK8QS1sS2i+kKbrfvjTYnb4wQ6W3ee53WHX9+sC/Tm3HNmzhjWEBQO0Ybcqg==} engines: {node: '>=14.19.0'} peerDependencies: @@ -1155,38 +1205,38 @@ packages: vue: 3.2.47 dev: true - /@vue-macros/export-props/0.2.2_vue@3.2.47: + /@vue-macros/export-props@0.2.2(vue@3.2.47): resolution: {integrity: sha512-ZYeDTAiZRke7Ku9Qm3Jn3ibZcNfjocZ9KW7j8nN5l4MsYdXBeLJQp21ZujQZug/2QaIGbuiDDMa+0RpaFI81tQ==} engines: {node: '>=14.19.0'} peerDependencies: vue: ^2.7.0 || ^3.2.25 dependencies: '@rollup/pluginutils': 5.0.2 - '@vue-macros/common': 1.1.0_vue@3.2.47 + '@vue-macros/common': 1.1.0(vue@3.2.47) unplugin: 1.1.0 vue: 3.2.47 transitivePeerDependencies: - rollup dev: true - /@vue-macros/hoist-static/1.2.2_vue@3.2.47: + /@vue-macros/hoist-static@1.2.2(vue@3.2.47): resolution: {integrity: sha512-TJP1QY/3ILahmhgVKbBaxUZDwjSToZIkoB3BNY7+tCl46ikU6kfEi4Z7MxRxXegHEvcYctlfTKUziQRoDh1OCA==} engines: {node: '>=14.19.0'} dependencies: '@rollup/pluginutils': 5.0.2 - '@vue-macros/common': 1.1.0_vue@3.2.47 + '@vue-macros/common': 1.1.0(vue@3.2.47) unplugin: 1.1.0 transitivePeerDependencies: - rollup - vue dev: true - /@vue-macros/named-template/0.2.3_vue@3.2.47: + /@vue-macros/named-template@0.2.3(vue@3.2.47): resolution: {integrity: sha512-zl8wZU87eN/V9hdYnzqD6cI85Kc3B7nysYGG1AAJlxdfIUeM06WOWVDSMzc49Bg7avw/42RiIKaknxeFdi0N0Q==} engines: {node: '>=14.19.0'} dependencies: '@rollup/pluginutils': 5.0.2 - '@vue-macros/common': 1.1.0_vue@3.2.47 + '@vue-macros/common': 1.1.0(vue@3.2.47) '@vue/compiler-dom': 3.2.47 unplugin: 1.1.0 transitivePeerDependencies: @@ -1194,7 +1244,7 @@ packages: - vue dev: true - /@vue-macros/reactivity-transform/0.2.4_vue@3.2.47: + /@vue-macros/reactivity-transform@0.2.4(vue@3.2.47): resolution: {integrity: sha512-3DhJoZrubm7rFXJScbcjqNJliY/mnqjte2ZZtiZBdwId+qwpmvmzKy3jRHcv6h7D+HwBsnQN9i8rIis46HNdvA==} engines: {node: '>=14.19.0'} peerDependencies: @@ -1202,7 +1252,7 @@ packages: dependencies: '@babel/parser': 7.21.2 '@rollup/pluginutils': 5.0.2 - '@vue-macros/common': 1.1.0_vue@3.2.47 + '@vue-macros/common': 1.1.0(vue@3.2.47) '@vue/compiler-core': 3.2.47 '@vue/shared': 3.2.47 magic-string: 0.29.0 @@ -1212,12 +1262,12 @@ packages: - rollup dev: true - /@vue-macros/setup-block/0.1.2_vue@3.2.47: + /@vue-macros/setup-block@0.1.2(vue@3.2.47): resolution: {integrity: sha512-P0p8VH7okOZ79jdx5081jpygoa4NsarTX2iIwjKDTtBSioCzCKgbMNN41XYlIOt6Q8PtNP/rScUzo7efKtgBqA==} engines: {node: '>=14.19.0'} dependencies: '@rollup/pluginutils': 5.0.2 - '@vue-macros/common': 1.1.0_vue@3.2.47 + '@vue-macros/common': 1.1.0(vue@3.2.47) '@vue/compiler-dom': 3.2.47 unplugin: 1.1.0 transitivePeerDependencies: @@ -1225,53 +1275,53 @@ packages: - vue dev: true - /@vue-macros/setup-component/0.15.3_vue@3.2.47: + /@vue-macros/setup-component@0.15.3(vue@3.2.47): resolution: {integrity: sha512-4gNzkeiLx5nKux72yeGs3CgRrlbeJzfbqPjGFxOmQYwpwtxPkBxEE/W0u8IJVwAGB/DttELMnHJP7i0bul05hQ==} engines: {node: '>=14.19.0'} dependencies: '@rollup/pluginutils': 5.0.2 - '@vue-macros/common': 1.1.0_vue@3.2.47 + '@vue-macros/common': 1.1.0(vue@3.2.47) unplugin: 1.1.0 transitivePeerDependencies: - rollup - vue dev: true - /@vue-macros/setup-sfc/0.14.2_vue@3.2.47: + /@vue-macros/setup-sfc@0.14.2(vue@3.2.47): resolution: {integrity: sha512-C26NKGDpnN0Dn7wR0Gc69Rrzc9NdAlXwi3x2FC88KNJ6o8kq/2VKnqaI1W2DZMYmtIUkUFT1PxNFZ6d5AYQAMw==} engines: {node: '>=14.19.0'} dependencies: '@rollup/pluginutils': 5.0.2 - '@vue-macros/common': 1.1.0_vue@3.2.47 + '@vue-macros/common': 1.1.0(vue@3.2.47) unplugin: 1.1.0 transitivePeerDependencies: - rollup - vue dev: true - /@vue-macros/short-emits/1.2.3_vue@3.2.47: + /@vue-macros/short-emits@1.2.3(vue@3.2.47): resolution: {integrity: sha512-S3zPFCsFiAzEI2D0HMjOYyaNjzYU1jeJC/k/Bx5nB+/UaGsAnr4HLNo9SjH5HgUjtvKLGPJIER7Zg/LgDfj3ow==} engines: {node: '>=14.19.0'} dependencies: '@rollup/pluginutils': 5.0.2 - '@vue-macros/common': 1.1.0_vue@3.2.47 + '@vue-macros/common': 1.1.0(vue@3.2.47) unplugin: 1.1.0 transitivePeerDependencies: - rollup - vue dev: true - /@vue-macros/short-vmodel/1.1.2_vue@3.2.47: + /@vue-macros/short-vmodel@1.1.2(vue@3.2.47): resolution: {integrity: sha512-HYC0b4o895HDMh0ZhMNS1rLQC3sUFPcB3YuISa5FhDD4x9gfyliGUjzXI3wAcaeW4mXbXwxhmvg0M8P62C2Obg==} engines: {node: '>=14.19.0'} dependencies: - '@vue-macros/common': 1.1.0_vue@3.2.47 + '@vue-macros/common': 1.1.0(vue@3.2.47) '@vue/compiler-core': 3.2.47 transitivePeerDependencies: - vue dev: true - /@vue-macros/volar/0.8.4_igk56f2koesnegulglkulhcgka: + /@vue-macros/volar@0.8.4(@vue-macros/reactivity-transform@0.2.4)(vue-tsc@1.2.0)(vue@3.2.47): resolution: {integrity: sha512-zShxUN5Pceuqo0X+hzk1/HGghp1UuJmUZHNxqxSqYz1zfjQsb9QVB9RZq0NKeXqVaQ5+ALY3uPwnW4zAIDHFjA==} engines: {node: '>=14.19.0'} peerDependencies: @@ -1281,18 +1331,18 @@ packages: optional: true dependencies: '@volar/language-core': 1.0.24 - '@vue-macros/common': 1.1.0_vue@3.2.47 - '@vue-macros/define-props': 0.4.0_vr7yg7432jseo5qubl5iatrj4q - '@vue-macros/short-vmodel': 1.1.2_vue@3.2.47 + '@vue-macros/common': 1.1.0(vue@3.2.47) + '@vue-macros/define-props': 0.4.0(@vue-macros/reactivity-transform@0.2.4)(vue@3.2.47) + '@vue-macros/short-vmodel': 1.1.2(vue@3.2.47) muggle-string: 0.2.2 - vue-tsc: 1.2.0_typescript@4.9.5 + vue-tsc: 1.2.0(typescript@4.9.5) transitivePeerDependencies: - '@vue-macros/reactivity-transform' - rollup - vue dev: true - /@vue/compiler-core/3.2.47: + /@vue/compiler-core@3.2.47: resolution: {integrity: sha512-p4D7FDnQb7+YJmO2iPEv0SQNeNzcbHdGByJDsT4lynf63AFkOTFN07HsiRSvjGo0QrxR/o3d0hUyNCUnBU2Tig==} dependencies: '@babel/parser': 7.21.2 @@ -1300,13 +1350,13 @@ packages: estree-walker: 2.0.2 source-map: 0.6.1 - /@vue/compiler-dom/3.2.47: + /@vue/compiler-dom@3.2.47: resolution: {integrity: sha512-dBBnEHEPoftUiS03a4ggEig74J2YBZ2UIeyfpcRM2tavgMWo4bsEfgCGsu+uJIL/vax9S+JztH8NmQerUo7shQ==} dependencies: '@vue/compiler-core': 3.2.47 '@vue/shared': 3.2.47 - /@vue/compiler-sfc/3.2.47: + /@vue/compiler-sfc@3.2.47: resolution: {integrity: sha512-rog05W+2IFfxjMcFw10tM9+f7i/+FFpZJJ5XHX72NP9eC2uRD+42M3pYcQqDXVYoj74kHMSEdQ/WmCjt8JFksQ==} dependencies: '@babel/parser': 7.21.2 @@ -1320,17 +1370,17 @@ packages: postcss: 8.4.21 source-map: 0.6.1 - /@vue/compiler-ssr/3.2.47: + /@vue/compiler-ssr@3.2.47: resolution: {integrity: sha512-wVXC+gszhulcMD8wpxMsqSOpvDZ6xKXSVWkf50Guf/S+28hTAXPDYRTbLQ3EDkOP5Xz/+SY37YiwDquKbJOgZw==} dependencies: '@vue/compiler-dom': 3.2.47 '@vue/shared': 3.2.47 - /@vue/devtools-api/6.5.0: + /@vue/devtools-api@6.5.0: resolution: {integrity: sha512-o9KfBeaBmCKl10usN4crU53fYtC1r7jJwdGKjPT24t348rHxgfpZ0xL3Xm/gLUYnc0oTp8LAmrxOeLyu6tbk2Q==} dev: false - /@vue/reactivity-transform/3.2.47: + /@vue/reactivity-transform@3.2.47: resolution: {integrity: sha512-m8lGXw8rdnPVVIdIFhf0LeQ/ixyHkH5plYuS83yop5n7ggVJU+z5v0zecwEnX7fa7HNLBhh2qngJJkxpwEEmYA==} dependencies: '@babel/parser': 7.21.2 @@ -1339,25 +1389,25 @@ packages: estree-walker: 2.0.2 magic-string: 0.25.9 - /@vue/reactivity/3.2.47: + /@vue/reactivity@3.2.47: resolution: {integrity: sha512-7khqQ/75oyyg+N/e+iwV6lpy1f5wq759NdlS1fpAhFXa8VeAIKGgk2E/C4VF59lx5b+Ezs5fpp/5WsRYXQiKxQ==} dependencies: '@vue/shared': 3.2.47 - /@vue/runtime-core/3.2.47: + /@vue/runtime-core@3.2.47: resolution: {integrity: sha512-RZxbLQIRB/K0ev0K9FXhNbBzT32H9iRtYbaXb0ZIz2usLms/D55dJR2t6cIEUn6vyhS3ALNvNthI+Q95C+NOpA==} dependencies: '@vue/reactivity': 3.2.47 '@vue/shared': 3.2.47 - /@vue/runtime-dom/3.2.47: + /@vue/runtime-dom@3.2.47: resolution: {integrity: sha512-ArXrFTjS6TsDei4qwNvgrdmHtD930KgSKGhS5M+j8QxXrDJYLqYw4RRcDy1bz1m1wMmb6j+zGLifdVHtkXA7gA==} dependencies: '@vue/runtime-core': 3.2.47 '@vue/shared': 3.2.47 csstype: 2.6.21 - /@vue/server-renderer/3.2.47_vue@3.2.47: + /@vue/server-renderer@3.2.47(vue@3.2.47): resolution: {integrity: sha512-dN9gc1i8EvmP9RCzvneONXsKfBRgqFeFZLurmHOveL7oH6HiFXJw5OGu294n1nHc/HMgTy6LulU/tv5/A7f/LA==} peerDependencies: vue: 3.2.47 @@ -1366,21 +1416,21 @@ packages: '@vue/shared': 3.2.47 vue: 3.2.47 - /@vue/shared/3.2.47: + /@vue/shared@3.2.47: resolution: {integrity: sha512-BHGyyGN3Q97EZx0taMQ+OLNuZcW3d37ZEVmEAyeoA9ERdGvm9Irc/0Fua8SNyOtV1w6BS4q25wbMzJujO9HIfQ==} - /@vueuse/core/9.13.0_vue@3.2.47: + /@vueuse/core@9.13.0(vue@3.2.47): resolution: {integrity: sha512-pujnclbeHWxxPRqXWmdkKV5OX4Wk4YeK7wusHqRwU0Q7EFusHoqNA/aPhB6KCh9hEqJkLAJo7bb0Lh9b+OIVzw==} dependencies: '@types/web-bluetooth': 0.0.16 '@vueuse/metadata': 9.13.0 - '@vueuse/shared': 9.13.0_vue@3.2.47 - vue-demi: 0.13.11_vue@3.2.47 + '@vueuse/shared': 9.13.0(vue@3.2.47) + vue-demi: 0.13.11(vue@3.2.47) transitivePeerDependencies: - '@vue/composition-api' - vue - /@vueuse/head/1.1.15_vue@3.2.47: + /@vueuse/head@1.1.15(vue@3.2.47): resolution: {integrity: sha512-LJqvb7dpSqnsdn6YWUxv97vWCnn/s6IfBrE4ih5kRlh8XQXr/HjXJ8IyIxxp0X7QDr3FhOsjRDpJSiQbDYbBdQ==} peerDependencies: vue: '>=2.7 || >=3' @@ -1388,22 +1438,22 @@ packages: '@unhead/dom': 1.1.15 '@unhead/schema': 1.1.15 '@unhead/ssr': 1.1.15 - '@unhead/vue': 1.1.15_vue@3.2.47 + '@unhead/vue': 1.1.15(vue@3.2.47) vue: 3.2.47 dev: false - /@vueuse/metadata/9.13.0: + /@vueuse/metadata@9.13.0: resolution: {integrity: sha512-gdU7TKNAUVlXXLbaF+ZCfte8BjRJQWPCa2J55+7/h+yDtzw3vOoGQDRXzI6pyKyo6bXFT5/QoPE4hAknExjRLQ==} - /@vueuse/shared/9.13.0_vue@3.2.47: + /@vueuse/shared@9.13.0(vue@3.2.47): resolution: {integrity: sha512-UrnhU+Cnufu4S6JLCPZnkWh0WwZGUp72ktOF2DFptMlOs3TOdVv8xJN53zhHGARmVOsz5KqOls09+J1NR6sBKw==} dependencies: - vue-demi: 0.13.11_vue@3.2.47 + vue-demi: 0.13.11(vue@3.2.47) transitivePeerDependencies: - '@vue/composition-api' - vue - /acorn-jsx/5.3.2_acorn@7.4.1: + /acorn-jsx@5.3.2(acorn@7.4.1): resolution: {integrity: sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==} peerDependencies: acorn: ^6.0.0 || ^7.0.0 || ^8.0.0 @@ -1411,7 +1461,7 @@ packages: acorn: 7.4.1 dev: false - /acorn-jsx/5.3.2_acorn@8.8.2: + /acorn-jsx@5.3.2(acorn@8.8.2): resolution: {integrity: sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==} peerDependencies: acorn: ^6.0.0 || ^7.0.0 || ^8.0.0 @@ -1419,18 +1469,18 @@ packages: acorn: 8.8.2 dev: true - /acorn/7.4.1: + /acorn@7.4.1: resolution: {integrity: sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A==} engines: {node: '>=0.4.0'} hasBin: true dev: false - /acorn/8.8.2: + /acorn@8.8.2: resolution: {integrity: sha512-xjIYgE8HBrkpd/sJqOGNspf8uHG+NOHGOw6a/Urj8taM2EXfdNAH2oFcPeIFfsv3+kz/mJrS5VuMqbNLjCa2vw==} engines: {node: '>=0.4.0'} hasBin: true - /agent-base/6.0.2: + /agent-base@6.0.2: resolution: {integrity: sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==} engines: {node: '>= 6.0.0'} dependencies: @@ -1439,7 +1489,7 @@ packages: - supports-color dev: true - /ajv/6.12.6: + /ajv@6.12.6: resolution: {integrity: sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==} dependencies: fast-deep-equal: 3.1.3 @@ -1448,51 +1498,51 @@ packages: uri-js: 4.4.1 dev: true - /ansi-regex/5.0.1: + /ansi-regex@5.0.1: resolution: {integrity: sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==} engines: {node: '>=8'} dev: true - /ansi-sequence-parser/1.1.0: + /ansi-sequence-parser@1.1.0: resolution: {integrity: sha512-lEm8mt52to2fT8GhciPCGeCXACSz2UwIN4X2e2LJSnZ5uAbn2/dsYdOmUXq0AtWS5cpAupysIneExOgH0Vd2TQ==} dev: false - /ansi-styles/3.2.1: + /ansi-styles@3.2.1: resolution: {integrity: sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==} engines: {node: '>=4'} dependencies: color-convert: 1.9.3 dev: true - /ansi-styles/4.3.0: + /ansi-styles@4.3.0: resolution: {integrity: sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==} engines: {node: '>=8'} dependencies: color-convert: 2.0.1 dev: true - /anymatch/3.1.3: + /anymatch@3.1.3: resolution: {integrity: sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==} engines: {node: '>= 8'} dependencies: normalize-path: 3.0.0 picomatch: 2.3.1 - /argparse/1.0.10: + /argparse@1.0.10: resolution: {integrity: sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==} dependencies: sprintf-js: 1.0.3 dev: true - /argparse/2.0.1: + /argparse@2.0.1: resolution: {integrity: sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==} - /array-union/2.1.0: + /array-union@2.1.0: resolution: {integrity: sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==} engines: {node: '>=8'} dev: true - /ast-walker-scope/0.4.0: + /ast-walker-scope@0.4.0: resolution: {integrity: sha512-THVisYmmqkcopZXJDniGgVW6BRKtjutRLytqAgw0XDabYZmxC0GfFggTFZouMhvNT7jPBkx0vOy/2Y+udCDwgg==} engines: {node: '>=14.19.0'} dependencies: @@ -1500,16 +1550,16 @@ packages: '@babel/types': 7.21.2 dev: true - /asynckit/0.4.0: + /asynckit@0.4.0: resolution: {integrity: sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==} dev: false - /available-typed-arrays/1.0.5: + /available-typed-arrays@1.0.5: resolution: {integrity: sha512-DMD0KiN46eipeziST1LPP/STfDU0sufISXmjSgvVsoU2tqxctQeASejWcfNtxYKqETM1UxQ8sp2OrSBWpHY6sw==} engines: {node: '>= 0.4'} dev: true - /axios/1.3.4: + /axios@1.3.4: resolution: {integrity: sha512-toYm+Bsyl6VC5wSkfkbbNB6ROv7KY93PEBBL6xyDczaIHasAiv4wPqQ/c4RjoQzipxRD2W5g21cOqQulZ7rHwQ==} dependencies: follow-redirects: 1.15.2 @@ -1519,38 +1569,38 @@ packages: - debug dev: false - /balanced-match/1.0.2: + /balanced-match@1.0.2: resolution: {integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==} dev: true - /binary-extensions/2.2.0: + /binary-extensions@2.2.0: resolution: {integrity: sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==} engines: {node: '>=8'} - /boolbase/1.0.0: + /boolbase@1.0.0: resolution: {integrity: sha512-JZOSA7Mo9sNGB8+UjSgzdLtokWAky1zbztM3WRLCbZ70/3cTANmQmOdR7y2g+J0e2WXywy1yS468tY+IruqEww==} dev: true - /brace-expansion/1.1.11: + /brace-expansion@1.1.11: resolution: {integrity: sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==} dependencies: balanced-match: 1.0.2 concat-map: 0.0.1 dev: true - /brace-expansion/2.0.1: + /brace-expansion@2.0.1: resolution: {integrity: sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==} dependencies: balanced-match: 1.0.2 dev: true - /braces/3.0.2: + /braces@3.0.2: resolution: {integrity: sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==} engines: {node: '>=8'} dependencies: fill-range: 7.0.1 - /browserslist/4.21.5: + /browserslist@4.21.5: resolution: {integrity: sha512-tUkiguQGW7S3IhB7N+c2MV/HZPSCPAAiYBZXLsBhFB/PCy6ZKKsZrmBayHV9fdGV/ARIfJ14NkxKzRDjvp7L6w==} engines: {node: ^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7} hasBin: true @@ -1558,10 +1608,10 @@ packages: caniuse-lite: 1.0.30001460 electron-to-chromium: 1.4.320 node-releases: 2.0.10 - update-browserslist-db: 1.0.10_browserslist@4.21.5 + update-browserslist-db: 1.0.10(browserslist@4.21.5) dev: true - /c12/1.1.2: + /c12@1.1.2: resolution: {integrity: sha512-fHT5HDEHNMb2oImnqJ88/UlpEOkY/chdyYxSd3YCpvBqBvU0IDlHTkNc7GnjObDMxdis2lL+rwlQcNq8VeZESA==} dependencies: defu: 6.1.2 @@ -1576,23 +1626,23 @@ packages: - supports-color dev: true - /call-bind/1.0.2: + /call-bind@1.0.2: resolution: {integrity: sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==} dependencies: function-bind: 1.1.1 get-intrinsic: 1.2.0 dev: true - /callsites/3.1.0: + /callsites@3.1.0: resolution: {integrity: sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==} engines: {node: '>=6'} dev: true - /caniuse-lite/1.0.30001460: + /caniuse-lite@1.0.30001460: resolution: {integrity: sha512-Bud7abqjvEjipUkpLs4D7gR0l8hBYBHoa+tGtKJHvT2AYzLp1z7EmVkUT4ERpVUfca8S2HGIVs883D8pUH1ZzQ==} dev: true - /chalk/2.4.2: + /chalk@2.4.2: resolution: {integrity: sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==} engines: {node: '>=4'} dependencies: @@ -1601,7 +1651,7 @@ packages: supports-color: 5.5.0 dev: true - /chalk/4.1.2: + /chalk@4.1.2: resolution: {integrity: sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==} engines: {node: '>=10'} dependencies: @@ -1609,7 +1659,7 @@ packages: supports-color: 7.2.0 dev: true - /chokidar/3.5.3: + /chokidar@3.5.3: resolution: {integrity: sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==} engines: {node: '>= 8.10.0'} dependencies: @@ -1623,64 +1673,64 @@ packages: optionalDependencies: fsevents: 2.3.2 - /chownr/2.0.0: + /chownr@2.0.0: resolution: {integrity: sha512-bIomtDF5KGpdogkLd9VspvFzk9KfpyyGlS8YFVZl7TGPBHL5snIOnxeshwVgPteQ9b4Eydl+pVbIyE1DcvCWgQ==} engines: {node: '>=10'} dev: true - /color-convert/1.9.3: + /color-convert@1.9.3: resolution: {integrity: sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==} dependencies: color-name: 1.1.3 dev: true - /color-convert/2.0.1: + /color-convert@2.0.1: resolution: {integrity: sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==} engines: {node: '>=7.0.0'} dependencies: color-name: 1.1.4 dev: true - /color-name/1.1.3: + /color-name@1.1.3: resolution: {integrity: sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==} dev: true - /color-name/1.1.4: + /color-name@1.1.4: resolution: {integrity: sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==} dev: true - /colorette/2.0.19: + /colorette@2.0.19: resolution: {integrity: sha512-3tlv/dIP7FWvj3BsbHrGLJ6l/oKh1O3TcgBqMn+yyCagOxc23fyzDS6HypQbgxWbkpDnf52p1LuR4eWDQ/K9WQ==} dev: true - /combined-stream/1.0.8: + /combined-stream@1.0.8: resolution: {integrity: sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==} engines: {node: '>= 0.8'} dependencies: delayed-stream: 1.0.0 dev: false - /concat-map/0.0.1: + /concat-map@0.0.1: resolution: {integrity: sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==} dev: true - /consola/2.15.3: + /consola@2.15.3: resolution: {integrity: sha512-9vAdYbHj6x2fLKC4+oPH0kFzY/orMZyG2Aj+kNylHxKGJ/Ed4dpNyAQYwJOdqO4zdM7XpVHmyejQDcQHrnuXbw==} dev: true - /convert-source-map/1.9.0: + /convert-source-map@1.9.0: resolution: {integrity: sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A==} dev: true - /core-util-is/1.0.3: + /core-util-is@1.0.3: resolution: {integrity: sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==} dev: true - /create-require/1.1.1: + /create-require@1.1.1: resolution: {integrity: sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ==} dev: true - /cross-spawn/7.0.3: + /cross-spawn@7.0.3: resolution: {integrity: sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==} engines: {node: '>= 8'} dependencies: @@ -1688,20 +1738,20 @@ packages: shebang-command: 2.0.0 which: 2.0.2 - /cssesc/3.0.0: + /cssesc@3.0.0: resolution: {integrity: sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==} engines: {node: '>=4'} hasBin: true dev: true - /csstype/2.6.21: + /csstype@2.6.21: resolution: {integrity: sha512-Z1PhmomIfypOpoMjRQB70jfvy/wxT50qW08YXO5lMIJkrdq4yOTR+AW7FqutScmB9NkLwxo+jU+kZLbofZZq/w==} - /de-indent/1.0.2: + /de-indent@1.0.2: resolution: {integrity: sha512-e/1zu3xH5MQryN2zdVaF0OrdNLUbvWxzMbi+iNA6Bky7l1RoP8a2fIbRocyHclXt/arDrrR6lL3TqFD9pMQTsg==} dev: true - /debug/4.3.4: + /debug@4.3.4: resolution: {integrity: sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==} engines: {node: '>=6.0'} peerDependencies: @@ -1712,7 +1762,7 @@ packages: dependencies: ms: 2.1.2 - /deep-equal/2.2.0: + /deep-equal@2.2.0: resolution: {integrity: sha512-RdpzE0Hv4lhowpIUKKMJfeH6C1pXdtT1/it80ubgWqwI3qpuxUBpC1S4hnHg+zjnuOoDkzUtUCEEkG+XG5l3Mw==} dependencies: call-bind: 1.0.2 @@ -1734,16 +1784,16 @@ packages: which-typed-array: 1.1.9 dev: true - /deep-is/0.1.4: + /deep-is@0.1.4: resolution: {integrity: sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==} dev: true - /define-lazy-prop/2.0.0: + /define-lazy-prop@2.0.0: resolution: {integrity: sha512-Ds09qNh8yw3khSjiJjiUInaGX9xlqZDY7JVryGxdxV7NPeuqQfplOpQ66yJFZut3jLa5zOwkXw1g9EI2uKh4Og==} engines: {node: '>=8'} dev: false - /define-properties/1.2.0: + /define-properties@1.2.0: resolution: {integrity: sha512-xvqAVKGfT1+UAvPwKTVw/njhdQ8ZhXK4lI0bCIuCMrp2up9nPnaDftrLtmpTazqd1o+UY4zgzU+avtMbDP+ldA==} engines: {node: '>= 0.4'} dependencies: @@ -1751,43 +1801,43 @@ packages: object-keys: 1.1.1 dev: true - /defu/6.1.2: + /defu@6.1.2: resolution: {integrity: sha512-+uO4+qr7msjNNWKYPHqN/3+Dx3NFkmIzayk2L1MyZQlvgZb/J1A0fo410dpKrN2SnqFjt8n4JL8fDJE0wIgjFQ==} dev: true - /delayed-stream/1.0.0: + /delayed-stream@1.0.0: resolution: {integrity: sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==} engines: {node: '>=0.4.0'} dev: false - /destr/1.2.2: + /destr@1.2.2: resolution: {integrity: sha512-lrbCJwD9saUQrqUfXvl6qoM+QN3W7tLV5pAOs+OqOmopCCz/JkE05MHedJR1xfk4IAnZuJXPVuN5+7jNA2ZCiA==} dev: true - /dir-glob/3.0.1: + /dir-glob@3.0.1: resolution: {integrity: sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==} engines: {node: '>=8'} dependencies: path-type: 4.0.0 dev: true - /doctrine/3.0.0: + /doctrine@3.0.0: resolution: {integrity: sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==} engines: {node: '>=6.0.0'} dependencies: esutils: 2.0.3 dev: true - /dotenv/16.0.3: + /dotenv@16.0.3: resolution: {integrity: sha512-7GO6HghkA5fYG9TYnNxi14/7K9f5occMlp3zXAuSxn7CKCxt9xbNWG7yF8hTCSUchlfWSe3uLmlPfigevRItzQ==} engines: {node: '>=12'} dev: true - /electron-to-chromium/1.4.320: + /electron-to-chromium@1.4.320: resolution: {integrity: sha512-h70iRscrNluMZPVICXYl5SSB+rBKo22XfuIS1ER0OQxQZpKTnFpuS6coj7wY9M/3trv7OR88rRMOlKmRvDty7Q==} dev: true - /enhanced-resolve/4.5.0: + /enhanced-resolve@4.5.0: resolution: {integrity: sha512-Nv9m36S/vxpsI+Hc4/ZGRs0n9mXqSWGGq49zxb/cJfPAQMbUtttJAlNPS4AQzaBdw/pKskw5bMbekT/Y7W/Wlg==} engines: {node: '>=6.9.0'} dependencies: @@ -1796,19 +1846,19 @@ packages: tapable: 1.1.3 dev: true - /entities/3.0.1: + /entities@3.0.1: resolution: {integrity: sha512-WiyBqoomrwMdFG1e0kqvASYfnlb0lp8M5o5Fw2OFq1hNZxxcNk8Ik0Xm7LxzBhuidnZB/UtBqVCgUz3kBOP51Q==} engines: {node: '>=0.12'} dev: true - /errno/0.1.8: + /errno@0.1.8: resolution: {integrity: sha512-dJ6oBr5SQ1VSd9qkk7ByRgb/1SH4JZjCHSW/mr63/QcXO9zLVxvJ6Oy13nio03rxpSnVDDjFor75SjVeZWPW/A==} hasBin: true dependencies: prr: 1.0.1 dev: true - /es-get-iterator/1.1.3: + /es-get-iterator@1.1.3: resolution: {integrity: sha512-sPZmqHBe6JIiTfN5q2pEi//TwxmAFHwj/XEuYjTuse78i8KxaqMTTzxPoFKuzRpDpTJ+0NAbpfenkmH2rePtuw==} dependencies: call-bind: 1.0.2 @@ -1822,7 +1872,7 @@ packages: stop-iteration-iterator: 1.0.0 dev: true - /esbuild/0.16.17: + /esbuild@0.16.17: resolution: {integrity: sha512-G8LEkV0XzDMNwXKgM0Jwu3nY3lSTwSGY6XbxM9cr9+s0T/qSV1q1JVPBGzm3dcjhCic9+emZDmMffkwgPeOeLg==} engines: {node: '>=12'} hasBin: true @@ -1852,45 +1902,45 @@ packages: '@esbuild/win32-x64': 0.16.17 dev: true - /escalade/3.1.1: + /escalade@3.1.1: resolution: {integrity: sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==} engines: {node: '>=6'} dev: true - /escape-string-regexp/1.0.5: + /escape-string-regexp@1.0.5: resolution: {integrity: sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==} engines: {node: '>=0.8.0'} dev: true - /escape-string-regexp/4.0.0: + /escape-string-regexp@4.0.0: resolution: {integrity: sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==} engines: {node: '>=10'} dev: true - /escape-string-regexp/5.0.0: + /escape-string-regexp@5.0.0: resolution: {integrity: sha512-/veY75JbMK4j1yjvuUxuVsiS/hr/4iHs9FTT6cgTexxdE0Ly/glccBAkloH/DofkjRbZU3bnoj38mOmhkZ0lHw==} engines: {node: '>=12'} dev: true - /eslint-plugin-vue/9.9.0_eslint@8.35.0: + /eslint-plugin-vue@9.9.0(eslint@8.35.0): resolution: {integrity: sha512-YbubS7eK0J7DCf0U2LxvVP7LMfs6rC6UltihIgval3azO3gyDwEGVgsCMe1TmDiEkl6GdMKfRpaME6QxIYtzDQ==} engines: {node: ^14.17.0 || >=16.0.0} peerDependencies: eslint: ^6.2.0 || ^7.0.0 || ^8.0.0 dependencies: eslint: 8.35.0 - eslint-utils: 3.0.0_eslint@8.35.0 + eslint-utils: 3.0.0(eslint@8.35.0) natural-compare: 1.4.0 nth-check: 2.1.1 postcss-selector-parser: 6.0.11 semver: 7.3.8 - vue-eslint-parser: 9.1.0_eslint@8.35.0 + vue-eslint-parser: 9.1.0(eslint@8.35.0) xml-name-validator: 4.0.0 transitivePeerDependencies: - supports-color dev: true - /eslint-scope/7.1.1: + /eslint-scope@7.1.1: resolution: {integrity: sha512-QKQM/UXpIiHcLqJ5AOyIW7XZmzjkzQXYE54n1++wb0u9V/abW3l9uQnxX8Z5Xd18xyKIMTUAyQ0k1e8pz6LUrw==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} dependencies: @@ -1898,14 +1948,14 @@ packages: estraverse: 5.3.0 dev: true - /eslint-utils/2.1.0: + /eslint-utils@2.1.0: resolution: {integrity: sha512-w94dQYoauyvlDc43XnGB8lU3Zt713vNChgt4EWwhXAP2XkBvndfxF0AgIqKOOasjPIPzj9JqgwkwbCYD0/V3Zg==} engines: {node: '>=6'} dependencies: eslint-visitor-keys: 1.3.0 dev: false - /eslint-utils/3.0.0_eslint@8.35.0: + /eslint-utils@3.0.0(eslint@8.35.0): resolution: {integrity: sha512-uuQC43IGctw68pJA1RgbQS8/NP7rch6Cwd4j3ZBtgo4/8Flj4eGE7ZYSZRN3iq5pVUv6GPdW5Z1RFleo84uLDA==} engines: {node: ^10.0.0 || ^12.0.0 || >= 14.0.0} peerDependencies: @@ -1915,22 +1965,22 @@ packages: eslint-visitor-keys: 2.1.0 dev: true - /eslint-visitor-keys/1.3.0: + /eslint-visitor-keys@1.3.0: resolution: {integrity: sha512-6J72N8UNa462wa/KFODt/PJ3IU60SDpC3QXC1Hjc1BXXpfL2C9R5+AU7jhe0F6GREqVMh4Juu+NY7xn+6dipUQ==} engines: {node: '>=4'} dev: false - /eslint-visitor-keys/2.1.0: + /eslint-visitor-keys@2.1.0: resolution: {integrity: sha512-0rSmRBzXgDzIsD6mGdJgevzgezI534Cer5L/vyMX0kHzT/jiB43jRhd9YUlMGYLQy2zprNmoT8qasCGtY+QaKw==} engines: {node: '>=10'} dev: true - /eslint-visitor-keys/3.3.0: + /eslint-visitor-keys@3.3.0: resolution: {integrity: sha512-mQ+suqKJVyeuwGYHAdjMFqjCyfl8+Ldnxuyp3ldiMBFKkvytrXUZWaiPCEav8qDHKty44bD+qV1IP4T+w+xXRA==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} dev: true - /eslint/8.35.0: + /eslint@8.35.0: resolution: {integrity: sha512-BxAf1fVL7w+JLRQhWl2pzGeSiGqbWumV4WNvc9Rhp6tiCtm4oHnyPBSEtMGZwrQgudFQ+otqzWoPB7x+hxoWsw==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} hasBin: true @@ -1947,7 +1997,7 @@ packages: doctrine: 3.0.0 escape-string-regexp: 4.0.0 eslint-scope: 7.1.1 - eslint-utils: 3.0.0_eslint@8.35.0 + eslint-utils: 3.0.0(eslint@8.35.0) eslint-visitor-keys: 3.3.0 espree: 9.4.1 esquery: 1.5.0 @@ -1979,76 +2029,76 @@ packages: - supports-color dev: true - /espree/6.2.1: + /espree@6.2.1: resolution: {integrity: sha512-ysCxRQY3WaXJz9tdbWOwuWr5Y/XrPTGX9Kiz3yoUXwW0VZ4w30HTkQLaGx/+ttFjF8i+ACbArnB4ce68a9m5hw==} engines: {node: '>=6.0.0'} dependencies: acorn: 7.4.1 - acorn-jsx: 5.3.2_acorn@7.4.1 + acorn-jsx: 5.3.2(acorn@7.4.1) eslint-visitor-keys: 1.3.0 dev: false - /espree/9.4.1: + /espree@9.4.1: resolution: {integrity: sha512-XwctdmTO6SIvCzd9810yyNzIrOrqNYV9Koizx4C/mRhf9uq0o4yHoCEU/670pOxOL/MSraektvSAji79kX90Vg==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} dependencies: acorn: 8.8.2 - acorn-jsx: 5.3.2_acorn@8.8.2 + acorn-jsx: 5.3.2(acorn@8.8.2) eslint-visitor-keys: 3.3.0 dev: true - /esprima-extract-comments/1.1.0: + /esprima-extract-comments@1.1.0: resolution: {integrity: sha512-sBQUnvJwpeE9QnPrxh7dpI/dp67erYG4WXEAreAMoelPRpMR7NWb4YtwRPn9b+H1uLQKl/qS8WYmyaljTpjIsw==} engines: {node: '>=4'} dependencies: esprima: 4.0.1 dev: true - /esprima/4.0.1: + /esprima@4.0.1: resolution: {integrity: sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==} engines: {node: '>=4'} hasBin: true dev: true - /esquery/1.5.0: + /esquery@1.5.0: resolution: {integrity: sha512-YQLXUplAwJgCydQ78IMJywZCceoqk1oH01OERdSAJc/7U2AylwjhSCLDEtqwg811idIS/9fIU5GjG73IgjKMVg==} engines: {node: '>=0.10'} dependencies: estraverse: 5.3.0 dev: true - /esrecurse/4.3.0: + /esrecurse@4.3.0: resolution: {integrity: sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==} engines: {node: '>=4.0'} dependencies: estraverse: 5.3.0 dev: true - /estraverse/5.3.0: + /estraverse@5.3.0: resolution: {integrity: sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==} engines: {node: '>=4.0'} dev: true - /estree-walker/2.0.2: + /estree-walker@2.0.2: resolution: {integrity: sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==} - /estree-walker/3.0.3: + /estree-walker@3.0.3: resolution: {integrity: sha512-7RUKfXgSMMkzt6ZuXmqapOurLGPPfgj6l9uRZ7lRGolvk0y2yocc35LdcxKC5PQZdn2DMqioAQ2NoWcrTKmm6g==} dependencies: '@types/estree': 1.0.0 dev: true - /esutils/2.0.3: + /esutils@2.0.3: resolution: {integrity: sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==} engines: {node: '>=0.10.0'} dev: true - /events/3.3.0: + /events@3.3.0: resolution: {integrity: sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==} engines: {node: '>=0.8.x'} dev: false - /execa/5.1.1: + /execa@5.1.1: resolution: {integrity: sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==} engines: {node: '>=10'} dependencies: @@ -2063,14 +2113,14 @@ packages: strip-final-newline: 2.0.0 dev: true - /extend-shallow/2.0.1: + /extend-shallow@2.0.1: resolution: {integrity: sha512-zCnTtlxNoAiDc3gqY2aYAWFx7XWWiasuF2K8Me5WbN8otHKTUKBwjPtNpRs/rbUZm7KxWAaNj7P1a/p52GbVug==} engines: {node: '>=0.10.0'} dependencies: is-extendable: 0.1.1 dev: true - /extract-comments/1.1.0: + /extract-comments@1.1.0: resolution: {integrity: sha512-dzbZV2AdSSVW/4E7Ti5hZdHWbA+Z80RJsJhr5uiL10oyjl/gy7/o+HI1HwK4/WSZhlq4SNKU3oUzXlM13Qx02Q==} engines: {node: '>=6'} dependencies: @@ -2078,11 +2128,11 @@ packages: parse-code-context: 1.0.0 dev: true - /fast-deep-equal/3.1.3: + /fast-deep-equal@3.1.3: resolution: {integrity: sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==} dev: true - /fast-glob/3.2.12: + /fast-glob@3.2.12: resolution: {integrity: sha512-DVj4CQIYYow0BlaelwK1pHl5n5cRSJfM60UA0zK891sVInoPri2Ekj7+e1CT3/3qxXenpI+nBBmQAcJPJgaj4w==} engines: {node: '>=8.6.0'} dependencies: @@ -2092,33 +2142,33 @@ packages: merge2: 1.4.1 micromatch: 4.0.5 - /fast-json-stable-stringify/2.1.0: + /fast-json-stable-stringify@2.1.0: resolution: {integrity: sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==} dev: true - /fast-levenshtein/2.0.6: + /fast-levenshtein@2.0.6: resolution: {integrity: sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==} dev: true - /fastq/1.15.0: + /fastq@1.15.0: resolution: {integrity: sha512-wBrocU2LCXXa+lWBt8RoIRD89Fi8OdABODa/kEnyeyjS5aZO5/GNvI5sEINADqP/h8M29UHTHUb53sUu5Ihqdw==} dependencies: reusify: 1.0.4 - /file-entry-cache/6.0.1: + /file-entry-cache@6.0.1: resolution: {integrity: sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==} engines: {node: ^10.12.0 || >=12.0.0} dependencies: flat-cache: 3.0.4 dev: true - /fill-range/7.0.1: + /fill-range@7.0.1: resolution: {integrity: sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==} engines: {node: '>=8'} dependencies: to-regex-range: 5.0.1 - /find-up/5.0.0: + /find-up@5.0.0: resolution: {integrity: sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==} engines: {node: '>=10'} dependencies: @@ -2126,7 +2176,7 @@ packages: path-exists: 4.0.0 dev: true - /flat-cache/3.0.4: + /flat-cache@3.0.4: resolution: {integrity: sha512-dm9s5Pw7Jc0GvMYbshN6zchCA9RgQlzzEZX3vylR9IqFfS8XciblUXOKfW6SiuJ0e13eDYZoZV5wdrev7P3Nwg==} engines: {node: ^10.12.0 || >=12.0.0} dependencies: @@ -2134,16 +2184,16 @@ packages: rimraf: 3.0.2 dev: true - /flat/5.0.2: + /flat@5.0.2: resolution: {integrity: sha512-b6suED+5/3rTpUBdG1gupIl8MPFCAMA0QXwmljLhvCUKcUvdE4gWky9zpuGCcXHOsz4J9wPGNWq6OKpmIzz3hQ==} hasBin: true dev: true - /flatted/3.2.7: + /flatted@3.2.7: resolution: {integrity: sha512-5nqDSxl8nn5BSNxyR3n4I6eDmbolI6WT+QqR547RwxQapgjQBmtktdP+HTBb/a/zLsbzERTONyUB5pefh5TtjQ==} dev: true - /focus-trap-vue/4.0.2_oggptlzwchqpaguemspe4ract4: + /focus-trap-vue@4.0.2(focus-trap@7.3.1)(vue@3.2.47): resolution: {integrity: sha512-2iQN2xKCSCzyhcD90VpueQcTIAhaCRxxo67fkz7RSqLmEd16QKjfGslCr3KxvBx0LfpVN9j0IAyKKuJKw3Intg==} peerDependencies: focus-trap: ^7.0.0 @@ -2153,13 +2203,13 @@ packages: vue: 3.2.47 dev: false - /focus-trap/7.3.1: + /focus-trap@7.3.1: resolution: {integrity: sha512-bX/u4FJ+F0Pp6b/8Q9W8Br/JaLJ7rrhOJAzai9JU8bh4BPdOjEATy4pxHcbBBxFjPN4d1oHy7/KqknEdOetm9w==} dependencies: tabbable: 6.1.1 dev: false - /follow-redirects/1.15.2: + /follow-redirects@1.15.2: resolution: {integrity: sha512-VQLG33o04KaQ8uYi2tVNbdrWp1QWxNNea+nmIB4EVM28v0hmP17z7aG1+wAkNzVq4KeXTq3221ye5qTJP91JwA==} engines: {node: '>=4.0'} peerDependencies: @@ -2169,13 +2219,13 @@ packages: optional: true dev: false - /for-each/0.3.3: + /for-each@0.3.3: resolution: {integrity: sha512-jqYfLp7mo9vIyQf8ykW2v7A+2N4QjeCeI5+Dz9XraiO1ign81wjiH7Fb9vSOWvQfNtmSa4H2RoQTrrXivdUZmw==} dependencies: is-callable: 1.2.7 dev: true - /form-data/4.0.0: + /form-data@4.0.0: resolution: {integrity: sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww==} engines: {node: '>= 6'} dependencies: @@ -2184,38 +2234,38 @@ packages: mime-types: 2.1.35 dev: false - /fs-minipass/2.1.0: + /fs-minipass@2.1.0: resolution: {integrity: sha512-V/JgOLFCS+R6Vcq0slCuaeWEdNC3ouDlJMNIsacH2VtALiu9mV4LPrHc5cDl8k5aw6J8jwgWWpiTo5RYhmIzvg==} engines: {node: '>= 8'} dependencies: minipass: 3.3.6 dev: true - /fs.realpath/1.0.0: + /fs.realpath@1.0.0: resolution: {integrity: sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==} dev: true - /fsevents/2.3.2: + /fsevents@2.3.2: resolution: {integrity: sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==} engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0} os: [darwin] requiresBuild: true optional: true - /function-bind/1.1.1: + /function-bind@1.1.1: resolution: {integrity: sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==} dev: true - /functions-have-names/1.2.3: + /functions-have-names@1.2.3: resolution: {integrity: sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ==} dev: true - /gensync/1.0.0-beta.2: + /gensync@1.0.0-beta.2: resolution: {integrity: sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==} engines: {node: '>=6.9.0'} dev: true - /get-intrinsic/1.2.0: + /get-intrinsic@1.2.0: resolution: {integrity: sha512-L049y6nFOuom5wGyRc3/gdTLO94dySVKRACj1RmJZBQXlbTMhtNIgkWkUHq+jYmZvKf14EW1EoJnnjbmoHij0Q==} dependencies: function-bind: 1.1.1 @@ -2223,12 +2273,12 @@ packages: has-symbols: 1.0.3 dev: true - /get-stream/6.0.1: + /get-stream@6.0.1: resolution: {integrity: sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==} engines: {node: '>=10'} dev: true - /giget/1.1.2: + /giget@1.1.2: resolution: {integrity: sha512-HsLoS07HiQ5oqvObOI+Qb2tyZH4Gj5nYGfF9qQcZNrPw+uEFhdXtgJr01aO2pWadGHucajYDLxxbtQkm97ON2A==} hasBin: true dependencies: @@ -2243,20 +2293,20 @@ packages: - supports-color dev: true - /glob-parent/5.1.2: + /glob-parent@5.1.2: resolution: {integrity: sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==} engines: {node: '>= 6'} dependencies: is-glob: 4.0.3 - /glob-parent/6.0.2: + /glob-parent@6.0.2: resolution: {integrity: sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==} engines: {node: '>=10.13.0'} dependencies: is-glob: 4.0.3 dev: true - /glob/7.2.3: + /glob@7.2.3: resolution: {integrity: sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==} dependencies: fs.realpath: 1.0.0 @@ -2267,23 +2317,23 @@ packages: path-is-absolute: 1.0.1 dev: true - /globals/11.12.0: + /globals@11.12.0: resolution: {integrity: sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==} engines: {node: '>=4'} dev: true - /globals/13.20.0: + /globals@13.20.0: resolution: {integrity: sha512-Qg5QtVkCy/kv3FUSlu4ukeZDVf9ee0iXLAUYX13gbR17bnejFTzr4iS9bY7kwCf1NztRNm1t91fjOiyx4CSwPQ==} engines: {node: '>=8'} dependencies: type-fest: 0.20.2 dev: true - /globalyzer/0.1.0: + /globalyzer@0.1.0: resolution: {integrity: sha512-40oNTM9UfG6aBmuKxk/giHn5nQ8RVz/SS4Ir6zgzOv9/qC3kKZ9v4etGTcJbEl/NyVQH7FGU7d+X1egr57Md2Q==} dev: false - /globby/11.1.0: + /globby@11.1.0: resolution: {integrity: sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==} engines: {node: '>=10'} dependencies: @@ -2295,7 +2345,7 @@ packages: slash: 3.0.0 dev: true - /globby/13.1.3: + /globby@13.1.3: resolution: {integrity: sha512-8krCNHXvlCgHDpegPzleMq07yMYTO2sXKASmZmquEYWEmCx6J5UTRbp5RwMJkTJGtcQ44YpiUYUiN0b9mzy8Bw==} engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} dependencies: @@ -2306,25 +2356,25 @@ packages: slash: 4.0.0 dev: true - /globrex/0.1.2: + /globrex@0.1.2: resolution: {integrity: sha512-uHJgbwAMwNFf5mLst7IWLNg14x1CkeqglJb/K3doi4dw6q2IvAAmM/Y81kevy83wP+Sst+nutFTYOGg3d1lsxg==} dev: false - /gopd/1.0.1: + /gopd@1.0.1: resolution: {integrity: sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA==} dependencies: get-intrinsic: 1.2.0 dev: true - /graceful-fs/4.2.10: + /graceful-fs@4.2.10: resolution: {integrity: sha512-9ByhssR2fPVsNZj478qUUbKfmL0+t5BDVyjShtyZZLiK7ZDAArFFfopyOTj0M05wE2tJPisA4iTnnXl2YoPvOA==} dev: true - /grapheme-splitter/1.0.4: + /grapheme-splitter@1.0.4: resolution: {integrity: sha512-bzh50DW9kTPM00T8y4o8vQg89Di9oLJVLW/KaOGIXJWP/iqCN6WKYkbNOF04vFLJhwcpYUh9ydh/+5vpOqV4YQ==} dev: true - /gray-matter/4.0.3: + /gray-matter@4.0.3: resolution: {integrity: sha512-5v6yZd4JK3eMI3FqqCouswVqwugaA9r4dNZB1wwcmrD02QkV5H0y7XBQW8QwQqEaZY1pM9aqORSORhJRdNK44Q==} engines: {node: '>=6.0'} dependencies: @@ -2334,58 +2384,58 @@ packages: strip-bom-string: 1.0.0 dev: true - /has-bigints/1.0.2: + /has-bigints@1.0.2: resolution: {integrity: sha512-tSvCKtBr9lkF0Ex0aQiP9N+OpV4zi2r/Nee5VkRDbaqv35RLYMzbwQfFSZZH0kR+Rd6302UJZ2p/bJCEoR3VoQ==} dev: true - /has-flag/3.0.0: + /has-flag@3.0.0: resolution: {integrity: sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==} engines: {node: '>=4'} dev: true - /has-flag/4.0.0: + /has-flag@4.0.0: resolution: {integrity: sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==} engines: {node: '>=8'} dev: true - /has-property-descriptors/1.0.0: + /has-property-descriptors@1.0.0: resolution: {integrity: sha512-62DVLZGoiEBDHQyqG4w9xCuZ7eJEwNmJRWw2VY84Oedb7WFcA27fiEVe8oUQx9hAUJ4ekurquucTGwsyO1XGdQ==} dependencies: get-intrinsic: 1.2.0 dev: true - /has-symbols/1.0.3: + /has-symbols@1.0.3: resolution: {integrity: sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==} engines: {node: '>= 0.4'} dev: true - /has-tostringtag/1.0.0: + /has-tostringtag@1.0.0: resolution: {integrity: sha512-kFjcSNhnlGV1kyoGk7OXKSawH5JOb/LzUc5w9B02hOTO0dfFRjbHQKvg1d6cf3HbeUmtU9VbbV3qzZ2Teh97WQ==} engines: {node: '>= 0.4'} dependencies: has-symbols: 1.0.3 dev: true - /has/1.0.3: + /has@1.0.3: resolution: {integrity: sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==} engines: {node: '>= 0.4.0'} dependencies: function-bind: 1.1.1 dev: true - /hash-sum/2.0.0: + /hash-sum@2.0.0: resolution: {integrity: sha512-WdZTbAByD+pHfl/g9QSsBIIwy8IT+EsPiKDs0KNX+zSHhdDLFKdZu0BQHljvO+0QI/BasbMSUa8wYNCZTvhslg==} dev: true - /he/1.2.0: + /he@1.2.0: resolution: {integrity: sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==} hasBin: true dev: true - /hookable/5.4.2: + /hookable@5.4.2: resolution: {integrity: sha512-6rOvaUiNKy9lET1X0ECnyZ5O5kSV0PJbtA5yZUgdEF7fGJEVwSLSislltyt7nFwVVALYHQJtfGeAR2Y0A0uJkg==} - /https-proxy-agent/5.0.1: + /https-proxy-agent@5.0.1: resolution: {integrity: sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA==} engines: {node: '>= 6'} dependencies: @@ -2395,17 +2445,17 @@ packages: - supports-color dev: true - /human-signals/2.1.0: + /human-signals@2.1.0: resolution: {integrity: sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==} engines: {node: '>=10.17.0'} dev: true - /ignore/5.2.4: + /ignore@5.2.4: resolution: {integrity: sha512-MAb38BcSbH0eHNBxn7ql2NH/kX33OkB3lZ1BNdh7ENeRChHTYsTvWrMubiIAMNS2llXEEgZ1MUOBtXChP3kaFQ==} engines: {node: '>= 4'} dev: true - /import-fresh/3.3.0: + /import-fresh@3.3.0: resolution: {integrity: sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==} engines: {node: '>=6'} dependencies: @@ -2413,23 +2463,23 @@ packages: resolve-from: 4.0.0 dev: true - /imurmurhash/0.1.4: + /imurmurhash@0.1.4: resolution: {integrity: sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==} engines: {node: '>=0.8.19'} dev: true - /inflight/1.0.6: + /inflight@1.0.6: resolution: {integrity: sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==} dependencies: once: 1.4.0 wrappy: 1.0.2 dev: true - /inherits/2.0.4: + /inherits@2.0.4: resolution: {integrity: sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==} dev: true - /internal-slot/1.0.5: + /internal-slot@1.0.5: resolution: {integrity: sha512-Y+R5hJrzs52QCG2laLn4udYVnxsfny9CpOhNhUvk/SSSVyF6T27FzRbF0sroPidSu3X8oEAkOn2K804mjpt6UQ==} engines: {node: '>= 0.4'} dependencies: @@ -2438,7 +2488,7 @@ packages: side-channel: 1.0.4 dev: true - /is-arguments/1.1.1: + /is-arguments@1.1.1: resolution: {integrity: sha512-8Q7EARjzEnKpt/PCD7e1cgUS0a6X8u5tdSiMqXhojOdoV9TsMsiO+9VLC5vAmO8N7/GmXn7yjR8qnA6bVAEzfA==} engines: {node: '>= 0.4'} dependencies: @@ -2446,7 +2496,7 @@ packages: has-tostringtag: 1.0.0 dev: true - /is-array-buffer/3.0.2: + /is-array-buffer@3.0.2: resolution: {integrity: sha512-y+FyyR/w8vfIRq4eQcM1EYgSTnmHXPqaF+IgzgraytCFq5Xh8lllDVmAZolPJiZttZLeFSINPYMaEJ7/vWUa1w==} dependencies: call-bind: 1.0.2 @@ -2454,19 +2504,19 @@ packages: is-typed-array: 1.1.10 dev: true - /is-bigint/1.0.4: + /is-bigint@1.0.4: resolution: {integrity: sha512-zB9CruMamjym81i2JZ3UMn54PKGsQzsJeo6xvN3HJJ4CAsQNB6iRutp2To77OfCNuoxspsIhzaPoO1zyCEhFOg==} dependencies: has-bigints: 1.0.2 dev: true - /is-binary-path/2.1.0: + /is-binary-path@2.1.0: resolution: {integrity: sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==} engines: {node: '>=8'} dependencies: binary-extensions: 2.2.0 - /is-boolean-object/1.1.2: + /is-boolean-object@1.1.2: resolution: {integrity: sha512-gDYaKHJmnj4aWxyj6YHyXVpdQawtVLHU5cb+eztPGczf6cjuTdwve5ZIEfgXqH4e57An1D1AKf8CZ3kYrQRqYA==} engines: {node: '>= 0.4'} dependencies: @@ -2474,66 +2524,66 @@ packages: has-tostringtag: 1.0.0 dev: true - /is-callable/1.2.7: + /is-callable@1.2.7: resolution: {integrity: sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA==} engines: {node: '>= 0.4'} dev: true - /is-core-module/2.11.0: + /is-core-module@2.11.0: resolution: {integrity: sha512-RRjxlvLDkD1YJwDbroBHMb+cukurkDWNyHx7D3oNB5x9rb5ogcksMC5wHCadcXoo67gVr/+3GFySh3134zi6rw==} dependencies: has: 1.0.3 dev: true - /is-date-object/1.0.5: + /is-date-object@1.0.5: resolution: {integrity: sha512-9YQaSxsAiSwcvS33MBk3wTCVnWK+HhF8VZR2jRxehM16QcVOdHqPn4VPHmRK4lSr38n9JriurInLcP90xsYNfQ==} engines: {node: '>= 0.4'} dependencies: has-tostringtag: 1.0.0 dev: true - /is-docker/2.2.1: + /is-docker@2.2.1: resolution: {integrity: sha512-F+i2BKsFrH66iaUFc0woD8sLy8getkwTwtOBjvs56Cx4CgJDeKQeqfz8wAYiSb8JOprWhHH5p77PbmYCvvUuXQ==} engines: {node: '>=8'} hasBin: true dev: false - /is-extendable/0.1.1: + /is-extendable@0.1.1: resolution: {integrity: sha512-5BMULNob1vgFX6EjQw5izWDxrecWK9AM72rugNr0TFldMOi0fj6Jk+zeKIt0xGj4cEfQIJth4w3OKWOJ4f+AFw==} engines: {node: '>=0.10.0'} dev: true - /is-extglob/2.1.1: + /is-extglob@2.1.1: resolution: {integrity: sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==} engines: {node: '>=0.10.0'} - /is-glob/4.0.3: + /is-glob@4.0.3: resolution: {integrity: sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==} engines: {node: '>=0.10.0'} dependencies: is-extglob: 2.1.1 - /is-map/2.0.2: + /is-map@2.0.2: resolution: {integrity: sha512-cOZFQQozTha1f4MxLFzlgKYPTyj26picdZTx82hbc/Xf4K/tZOOXSCkMvU4pKioRXGDLJRn0GM7Upe7kR721yg==} dev: true - /is-number-object/1.0.7: + /is-number-object@1.0.7: resolution: {integrity: sha512-k1U0IRzLMo7ZlYIfzRu23Oh6MiIFasgpb9X76eqfFZAqwH44UI4KTBvBYIZ1dSL9ZzChTB9ShHfLkR4pdW5krQ==} engines: {node: '>= 0.4'} dependencies: has-tostringtag: 1.0.0 dev: true - /is-number/7.0.0: + /is-number@7.0.0: resolution: {integrity: sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==} engines: {node: '>=0.12.0'} - /is-path-inside/3.0.3: + /is-path-inside@3.0.3: resolution: {integrity: sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==} engines: {node: '>=8'} dev: true - /is-regex/1.1.4: + /is-regex@1.1.4: resolution: {integrity: sha512-kvRdxDsxZjhzUX07ZnLydzS1TU/TJlTUHHY4YLL87e37oUA49DfkLqgy+VjFocowy29cKvcSiu+kIv728jTTVg==} engines: {node: '>= 0.4'} dependencies: @@ -2541,36 +2591,36 @@ packages: has-tostringtag: 1.0.0 dev: true - /is-set/2.0.2: + /is-set@2.0.2: resolution: {integrity: sha512-+2cnTEZeY5z/iXGbLhPrOAaK/Mau5k5eXq9j14CpRTftq0pAJu2MwVRSZhyZWBzx3o6X795Lz6Bpb6R0GKf37g==} dev: true - /is-shared-array-buffer/1.0.2: + /is-shared-array-buffer@1.0.2: resolution: {integrity: sha512-sqN2UDu1/0y6uvXyStCOzyhAjCSlHceFoMKJW8W9EU9cvic/QdsZ0kEU93HEy3IUEFZIiH/3w+AH/UQbPHNdhA==} dependencies: call-bind: 1.0.2 dev: true - /is-stream/2.0.1: + /is-stream@2.0.1: resolution: {integrity: sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==} engines: {node: '>=8'} dev: true - /is-string/1.0.7: + /is-string@1.0.7: resolution: {integrity: sha512-tE2UXzivje6ofPW7l23cjDOMa09gb7xlAqG6jG5ej6uPV32TlWP3NKPigtaGeHNu9fohccRYvIiZMfOOnOYUtg==} engines: {node: '>= 0.4'} dependencies: has-tostringtag: 1.0.0 dev: true - /is-symbol/1.0.4: + /is-symbol@1.0.4: resolution: {integrity: sha512-C/CPBqKWnvdcxqIARxyOh4v1UUEOCHpgDa0WYgpKDFMszcrPcffg5uhwSgPCLD2WWxmq6isisz87tzT01tuGhg==} engines: {node: '>= 0.4'} dependencies: has-symbols: 1.0.3 dev: true - /is-typed-array/1.1.10: + /is-typed-array@1.1.10: resolution: {integrity: sha512-PJqgEHiWZvMpaFZ3uTc8kHPM4+4ADTlDniuQL7cU/UDA0Ql7F70yGfHph3cLNe+c9toaigv+DFzTJKhc2CtO6A==} engines: {node: '>= 0.4'} dependencies: @@ -2581,49 +2631,49 @@ packages: has-tostringtag: 1.0.0 dev: true - /is-weakmap/2.0.1: + /is-weakmap@2.0.1: resolution: {integrity: sha512-NSBR4kH5oVj1Uwvv970ruUkCV7O1mzgVFO4/rev2cLRda9Tm9HrL70ZPut4rOHgY0FNrUu9BCbXA2sdQ+x0chA==} dev: true - /is-weakset/2.0.2: + /is-weakset@2.0.2: resolution: {integrity: sha512-t2yVvttHkQktwnNNmBQ98AhENLdPUTDTE21uPqAQ0ARwQfGeQKRVS0NNurH7bTf7RrvcVn1OOge45CnBeHCSmg==} dependencies: call-bind: 1.0.2 get-intrinsic: 1.2.0 dev: true - /is-wsl/2.2.0: + /is-wsl@2.2.0: resolution: {integrity: sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww==} engines: {node: '>=8'} dependencies: is-docker: 2.2.1 dev: false - /isarray/1.0.0: + /isarray@1.0.0: resolution: {integrity: sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==} dev: true - /isarray/2.0.5: + /isarray@2.0.5: resolution: {integrity: sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==} dev: true - /isexe/2.0.0: + /isexe@2.0.0: resolution: {integrity: sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==} - /jiti/1.17.1: + /jiti@1.17.1: resolution: {integrity: sha512-NZIITw8uZQFuzQimqjUxIrIcEdxYDFIe/0xYfIlVXTkiBjjyBEvgasj5bb0/cHtPRD/NziPbT312sFrkI5ALpw==} hasBin: true dev: true - /js-sdsl/4.3.0: + /js-sdsl@4.3.0: resolution: {integrity: sha512-mifzlm2+5nZ+lEcLJMoBK0/IH/bDg8XnJfd/Wq6IP+xoCjLZsTOnV2QpxlVbX9bMnkl5PdEjNtBJ9Cj1NjifhQ==} dev: true - /js-tokens/4.0.0: + /js-tokens@4.0.0: resolution: {integrity: sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==} dev: true - /js-yaml/3.14.1: + /js-yaml@3.14.1: resolution: {integrity: sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==} hasBin: true dependencies: @@ -2631,32 +2681,32 @@ packages: esprima: 4.0.1 dev: true - /js-yaml/4.1.0: + /js-yaml@4.1.0: resolution: {integrity: sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==} hasBin: true dependencies: argparse: 2.0.1 - /jsesc/2.5.2: + /jsesc@2.5.2: resolution: {integrity: sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==} engines: {node: '>=4'} hasBin: true dev: true - /json-schema-traverse/0.4.1: + /json-schema-traverse@0.4.1: resolution: {integrity: sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==} dev: true - /json-stable-stringify-without-jsonify/1.0.1: + /json-stable-stringify-without-jsonify@1.0.1: resolution: {integrity: sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==} dev: true - /json5/2.2.3: + /json5@2.2.3: resolution: {integrity: sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==} engines: {node: '>=6'} hasBin: true - /jsonc-eslint-parser/1.4.1: + /jsonc-eslint-parser@1.4.1: resolution: {integrity: sha512-hXBrvsR1rdjmB2kQmUjf1rEIa+TqHBGMge8pwi++C+Si1ad7EjZrJcpgwym+QGK/pqTx+K7keFAtLlVNdLRJOg==} engines: {node: '>=8.10.0'} dependencies: @@ -2667,23 +2717,23 @@ packages: semver: 6.3.0 dev: false - /jsonc-parser/3.2.0: + /jsonc-parser@3.2.0: resolution: {integrity: sha512-gfFQZrcTc8CnKXp6Y4/CBT3fTc0OVuDofpre4aEeEpSBPV5X5v4+Vmx+8snU7RLPrNHPKSgLxGo9YuQzz20o+w==} - /kind-of/6.0.3: + /kind-of@6.0.3: resolution: {integrity: sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==} engines: {node: '>=0.10.0'} dev: true - /knitwork/1.0.0: + /knitwork@1.0.0: resolution: {integrity: sha512-dWl0Dbjm6Xm+kDxhPQJsCBTxrJzuGl0aP9rhr+TG8D3l+GL90N8O8lYUi7dTSAN2uuDqCtNgb6aEuQH5wsiV8Q==} dev: true - /kolorist/1.7.0: + /kolorist@1.7.0: resolution: {integrity: sha512-ymToLHqL02udwVdbkowNpzjFd6UzozMtshPQKVi5k1EjKRqKqBrOnE9QbLEb0/pV76SAiIT13hdL8R6suc+f3g==} dev: true - /levn/0.4.1: + /levn@0.4.1: resolution: {integrity: sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==} engines: {node: '>= 0.8.0'} dependencies: @@ -2691,99 +2741,99 @@ packages: type-check: 0.4.0 dev: true - /linkify-it/4.0.1: + /linkify-it@4.0.1: resolution: {integrity: sha512-C7bfi1UZmoj8+PQx22XyeXCuBlokoyWQL5pWSP+EI6nzRylyThouddufc2c1NDIcP9k5agmN9fLpA7VNJfIiqw==} dependencies: uc.micro: 1.0.6 dev: true - /local-pkg/0.4.3: + /local-pkg@0.4.3: resolution: {integrity: sha512-SFppqq5p42fe2qcZQqqEOiVRXl+WCP1MdT6k7BDEW1j++sp5fIY+/fdRQitvKgB5BrBcmrs5m/L0v2FrU5MY1g==} engines: {node: '>=14'} dev: true - /locate-path/6.0.0: + /locate-path@6.0.0: resolution: {integrity: sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==} engines: {node: '>=10'} dependencies: p-locate: 5.0.0 dev: true - /lodash._reinterpolate/3.0.0: + /lodash._reinterpolate@3.0.0: resolution: {integrity: sha512-xYHt68QRoYGjeeM/XOE1uJtvXQAgvszfBhjV4yvsQH0u2i9I6cI6c6/eG4Hh3UAOVn0y/xAXwmTzEay49Q//HA==} dev: true - /lodash.merge/4.6.2: + /lodash.merge@4.6.2: resolution: {integrity: sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==} dev: true - /lodash.template/4.5.0: + /lodash.template@4.5.0: resolution: {integrity: sha512-84vYFxIkmidUiFxidA/KjjH9pAycqW+h980j7Fuz5qxRtO9pgB7MDFTdys1N7A5mcucRiDyEq4fusljItR1T/A==} dependencies: lodash._reinterpolate: 3.0.0 lodash.templatesettings: 4.2.0 dev: true - /lodash.templatesettings/4.2.0: + /lodash.templatesettings@4.2.0: resolution: {integrity: sha512-stgLz+i3Aa9mZgnjr/O+v9ruKZsPsndy7qPZOchbqk2cnTU1ZaldKK+v7m54WoKIyxiuMZTKT2H81F8BeAc3ZQ==} dependencies: lodash._reinterpolate: 3.0.0 dev: true - /lodash/4.17.21: + /lodash@4.17.21: resolution: {integrity: sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==} - /lru-cache/5.1.1: + /lru-cache@5.1.1: resolution: {integrity: sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==} dependencies: yallist: 3.1.1 dev: true - /lru-cache/6.0.0: + /lru-cache@6.0.0: resolution: {integrity: sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==} engines: {node: '>=10'} dependencies: yallist: 4.0.0 dev: true - /magic-string/0.25.9: + /magic-string@0.25.9: resolution: {integrity: sha512-RmF0AsMzgt25qzqqLc1+MbHmhdx0ojF2Fvs4XnOqz2ZOBXzzkEwc/dJQZCYHAn7v1jbVOjAZfK8msRn4BxO4VQ==} dependencies: sourcemap-codec: 1.4.8 - /magic-string/0.27.0: + /magic-string@0.27.0: resolution: {integrity: sha512-8UnnX2PeRAPZuN12svgR9j7M1uWMovg/CEnIwIG0LFkXSJJe4PdfUGiTGl8V9bsBHFUtfVINcSyYxd7q+kx9fA==} engines: {node: '>=12'} dependencies: '@jridgewell/sourcemap-codec': 1.4.14 dev: true - /magic-string/0.29.0: + /magic-string@0.29.0: resolution: {integrity: sha512-WcfidHrDjMY+eLjlU+8OvwREqHwpgCeKVBUpQ3OhYYuvfaYCUgcbuBzappNzZvg/v8onU3oQj+BYpkOJe9Iw4Q==} engines: {node: '>=12'} dependencies: '@jridgewell/sourcemap-codec': 1.4.14 dev: true - /magic-string/0.30.0: + /magic-string@0.30.0: resolution: {integrity: sha512-LA+31JYDJLs82r2ScLrlz1GjSgu66ZV518eyWT+S8VhyQn/JL0u9MeBOvQMGYiPk1DBiSN9DDMOcXvigJZaViQ==} engines: {node: '>=12'} dependencies: '@jridgewell/sourcemap-codec': 1.4.14 dev: true - /markdown-it-link-attributes/4.0.1: + /markdown-it-link-attributes@4.0.1: resolution: {integrity: sha512-pg5OK0jPLg62H4k7M9mRJLT61gUp9nvG0XveKYHMOOluASo9OEF13WlXrpAp2aj35LbedAy3QOCgQCw0tkLKAQ==} dev: false - /markdown-it-shiki/0.8.0: + /markdown-it-shiki@0.8.0: resolution: {integrity: sha512-RsMhQPFnQlXIlTdu94cYjCKeX3G3JmAijICB1BuoIZn12HEWIGGF970tytOq1404ioM3mXkETjXtBu7D73BzWQ==} dependencies: shiki: 0.14.1 synckit: 0.8.5 dev: false - /markdown-it/13.0.1: + /markdown-it@13.0.1: resolution: {integrity: sha512-lTlxriVoy2criHP0JKRhO2VDG9c2ypWCsT237eDiLqi09rmbKoUetyGHq2uOIRoRS//kfoJckS0eUzzkDR+k2Q==} hasBin: true dependencies: @@ -2794,11 +2844,11 @@ packages: uc.micro: 1.0.6 dev: true - /mdurl/1.0.1: + /mdurl@1.0.1: resolution: {integrity: sha512-/sKlQJCBYVY9Ers9hqzKou4H6V5UWc/M59TH2dvkt+84itfnq7uFOMLpOiOS4ujvHP4etln18fmIxA5R5fll0g==} dev: true - /memory-fs/0.5.0: + /memory-fs@0.5.0: resolution: {integrity: sha512-jA0rdU5KoQMC0e6ppoNRtpp6vjFq6+NY7r8hywnC7V+1Xj/MtHwGIbB1QaK/dunyjWteJzmkpd7ooeWg10T7GA==} engines: {node: '>=4.3.0 <5.0.0 || >=5.10'} dependencies: @@ -2806,71 +2856,71 @@ packages: readable-stream: 2.3.8 dev: true - /merge-stream/2.0.0: + /merge-stream@2.0.0: resolution: {integrity: sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==} dev: true - /merge2/1.4.1: + /merge2@1.4.1: resolution: {integrity: sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==} engines: {node: '>= 8'} - /micromatch/4.0.5: + /micromatch@4.0.5: resolution: {integrity: sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==} engines: {node: '>=8.6'} dependencies: braces: 3.0.2 picomatch: 2.3.1 - /mime-db/1.52.0: + /mime-db@1.52.0: resolution: {integrity: sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==} engines: {node: '>= 0.6'} dev: false - /mime-types/2.1.35: + /mime-types@2.1.35: resolution: {integrity: sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==} engines: {node: '>= 0.6'} dependencies: mime-db: 1.52.0 dev: false - /mimic-fn/2.1.0: + /mimic-fn@2.1.0: resolution: {integrity: sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==} engines: {node: '>=6'} dev: true - /minimatch/3.1.2: + /minimatch@3.1.2: resolution: {integrity: sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==} dependencies: brace-expansion: 1.1.11 dev: true - /minimatch/6.2.0: + /minimatch@6.2.0: resolution: {integrity: sha512-sauLxniAmvnhhRjFwPNnJKaPFYyddAgbYdeUpHULtCT/GhzdCx/MDNy+Y40lBxTQUrMzDE8e0S43Z5uqfO0REg==} engines: {node: '>=10'} dependencies: brace-expansion: 2.0.1 dev: true - /minimatch/7.4.2: + /minimatch@7.4.2: resolution: {integrity: sha512-xy4q7wou3vUoC9k1xGTXc+awNdGaGVHtFUaey8tiX4H1QRc04DZ/rmDFwNm2EBsuYEhAZ6SgMmYf3InGY6OauA==} engines: {node: '>=10'} dependencies: brace-expansion: 2.0.1 dev: true - /minipass/3.3.6: + /minipass@3.3.6: resolution: {integrity: sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==} engines: {node: '>=8'} dependencies: yallist: 4.0.0 dev: true - /minipass/4.2.4: + /minipass@4.2.4: resolution: {integrity: sha512-lwycX3cBMTvcejsHITUgYj6Gy6A7Nh4Q6h9NP4sTHY1ccJlC7yKzDmiShEHsJ16Jf1nKGDEaiHxiltsJEvk0nQ==} engines: {node: '>=8'} dev: true - /minizlib/2.1.2: + /minizlib@2.1.2: resolution: {integrity: sha512-bAxsR8BVfj60DWXHE3u30oHzfl4G7khkSuPW+qvpd7jFRHm7dLxOjUk1EHACJ/hxLY8phGJ0YhYHZo7jil7Qdg==} engines: {node: '>= 8'} dependencies: @@ -2878,13 +2928,13 @@ packages: yallist: 4.0.0 dev: true - /mkdirp/1.0.4: + /mkdirp@1.0.4: resolution: {integrity: sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==} engines: {node: '>=10'} hasBin: true dev: true - /mlly/1.1.1: + /mlly@1.1.1: resolution: {integrity: sha512-Jnlh4W/aI4GySPo6+DyTN17Q75KKbLTyFK8BrGhjNP4rxuUjbRWhE6gHg3bs33URWAF44FRm7gdQA348i3XxRw==} dependencies: acorn: 8.8.2 @@ -2893,66 +2943,66 @@ packages: ufo: 1.1.1 dev: true - /mri/1.2.0: + /mri@1.2.0: resolution: {integrity: sha512-tzzskb3bG8LvYGFF/mDTpq3jpI6Q9wc3LEmBaghu+DdCssd1FakN7Bc0hVNmEyGq1bq3RgfkCb3cmQLpNPOroA==} engines: {node: '>=4'} dev: true - /mrmime/1.0.1: + /mrmime@1.0.1: resolution: {integrity: sha512-hzzEagAgDyoU1Q6yg5uI+AorQgdvMCur3FcKf7NhMKWsaYg+RnbTyHRa/9IlLF9rf455MOCtcqqrQQ83pPP7Uw==} engines: {node: '>=10'} dev: true - /ms/2.1.2: + /ms@2.1.2: resolution: {integrity: sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==} - /muggle-string/0.1.0: + /muggle-string@0.1.0: resolution: {integrity: sha512-Tr1knR3d2mKvvWthlk7202rywKbiOm4rVFLsfAaSIhJ6dt9o47W4S+JMtWhd/PW9Wrdew2/S2fSvhz3E2gkfEg==} dev: true - /muggle-string/0.2.2: + /muggle-string@0.2.2: resolution: {integrity: sha512-YVE1mIJ4VpUMqZObFndk9CJu6DBJR/GB13p3tXuNbwD4XExaI5EOuRl6BHeIDxIqXZVxSfAC+y6U1Z/IxCfKUg==} dev: true - /nanoid/3.3.4: + /nanoid@3.3.4: resolution: {integrity: sha512-MqBkQh/OHTS2egovRtLk45wEyNXwF+cokD+1YPf9u5VfJiRdAiRwB2froX5Co9Rh20xs4siNPm8naNotSD6RBw==} engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1} hasBin: true - /natural-compare/1.4.0: + /natural-compare@1.4.0: resolution: {integrity: sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==} dev: true - /node-fetch-native/1.0.2: + /node-fetch-native@1.0.2: resolution: {integrity: sha512-KIkvH1jl6b3O7es/0ShyCgWLcfXxlBrLBbP3rOr23WArC66IMcU4DeZEeYEOwnopYhawLTn7/y+YtmASe8DFVQ==} dev: true - /node-releases/2.0.10: + /node-releases@2.0.10: resolution: {integrity: sha512-5GFldHPXVG/YZmFzJvKK2zDSzPKhEp0+ZR5SVaoSag9fsL5YgHbUHDfnG5494ISANDcK4KwPXAx2xqVEydmd7w==} dev: true - /normalize-path/3.0.0: + /normalize-path@3.0.0: resolution: {integrity: sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==} engines: {node: '>=0.10.0'} - /npm-run-path/4.0.1: + /npm-run-path@4.0.1: resolution: {integrity: sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==} engines: {node: '>=8'} dependencies: path-key: 3.1.1 dev: true - /nth-check/2.1.1: + /nth-check@2.1.1: resolution: {integrity: sha512-lqjrjmaOoAnWfMmBPL+XNnynZh2+swxiX3WUE0s4yEHI6m+AwrK2UZOimIRl3X/4QctVqS8AiZjFqyOGrMXb/w==} dependencies: boolbase: 1.0.0 dev: true - /object-inspect/1.12.3: + /object-inspect@1.12.3: resolution: {integrity: sha512-geUvdk7c+eizMNUDkRpW1wJwgfOiOeHbxBR/hLXK1aT6zmVSO0jsQcs7fj6MGw89jC/cjGfLcNOrtMYtGqm81g==} dev: true - /object-is/1.1.5: + /object-is@1.1.5: resolution: {integrity: sha512-3cyDsyHgtmi7I7DfSSI2LDp6SK2lwvtbg0p0R1e0RvTqF5ceGx+K2dfSjm1bKDMVCFEDAQvy+o8c6a7VujOddw==} engines: {node: '>= 0.4'} dependencies: @@ -2960,12 +3010,12 @@ packages: define-properties: 1.2.0 dev: true - /object-keys/1.1.1: + /object-keys@1.1.1: resolution: {integrity: sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==} engines: {node: '>= 0.4'} dev: true - /object.assign/4.1.4: + /object.assign@4.1.4: resolution: {integrity: sha512-1mxKf0e58bvyjSCtKYY4sRe9itRk3PJpquJOjeIkz885CczcI4IvJJDLPS72oowuSh+pBxUFROpX+TU++hxhZQ==} engines: {node: '>= 0.4'} dependencies: @@ -2975,20 +3025,20 @@ packages: object-keys: 1.1.1 dev: true - /once/1.4.0: + /once@1.4.0: resolution: {integrity: sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==} dependencies: wrappy: 1.0.2 dev: true - /onetime/5.1.2: + /onetime@5.1.2: resolution: {integrity: sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==} engines: {node: '>=6'} dependencies: mimic-fn: 2.1.0 dev: true - /open/8.4.2: + /open@8.4.2: resolution: {integrity: sha512-7x81NCL719oNbsq/3mh+hVrAWmFuEYUqrq/Iw3kUzH8ReypT9QQ0BLoJS7/G9k6N81XjW4qHWtjWwe/9eLy1EQ==} engines: {node: '>=12'} dependencies: @@ -2997,7 +3047,7 @@ packages: is-wsl: 2.2.0 dev: false - /optionator/0.9.1: + /optionator@0.9.1: resolution: {integrity: sha512-74RlY5FCnhq4jRxVUPKDaRwrVNXMqsGsiW6AJw4XK8hmtm10wC0ypZBLw5IIp85NZMr91+qd1RvvENwg7jjRFw==} engines: {node: '>= 0.8.0'} dependencies: @@ -3009,66 +3059,66 @@ packages: word-wrap: 1.2.3 dev: true - /p-limit/3.1.0: + /p-limit@3.1.0: resolution: {integrity: sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==} engines: {node: '>=10'} dependencies: yocto-queue: 0.1.0 dev: true - /p-locate/5.0.0: + /p-locate@5.0.0: resolution: {integrity: sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==} engines: {node: '>=10'} dependencies: p-limit: 3.1.0 dev: true - /parent-module/1.0.1: + /parent-module@1.0.1: resolution: {integrity: sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==} engines: {node: '>=6'} dependencies: callsites: 3.1.0 dev: true - /parse-code-context/1.0.0: + /parse-code-context@1.0.0: resolution: {integrity: sha512-OZQaqKaQnR21iqhlnPfVisFjBWjhnMl5J9MgbP8xC+EwoVqbXrq78lp+9Zb3ahmLzrIX5Us/qbvBnaS3hkH6OA==} engines: {node: '>=6'} dev: true - /path-exists/4.0.0: + /path-exists@4.0.0: resolution: {integrity: sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==} engines: {node: '>=8'} dev: true - /path-is-absolute/1.0.1: + /path-is-absolute@1.0.1: resolution: {integrity: sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==} engines: {node: '>=0.10.0'} dev: true - /path-key/3.1.1: + /path-key@3.1.1: resolution: {integrity: sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==} engines: {node: '>=8'} - /path-parse/1.0.7: + /path-parse@1.0.7: resolution: {integrity: sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==} dev: true - /path-type/4.0.0: + /path-type@4.0.0: resolution: {integrity: sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==} engines: {node: '>=8'} dev: true - /pathe/1.1.0: + /pathe@1.1.0: resolution: {integrity: sha512-ODbEPR0KKHqECXW1GoxdDb+AZvULmXjVPy4rt+pGo2+TnjJTIPJQSVS6N63n8T2Ip+syHhbn52OewKicV0373w==} - /picocolors/1.0.0: + /picocolors@1.0.0: resolution: {integrity: sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==} - /picomatch/2.3.1: + /picomatch@2.3.1: resolution: {integrity: sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==} engines: {node: '>=8.6'} - /pkg-types/1.0.2: + /pkg-types@1.0.2: resolution: {integrity: sha512-hM58GKXOcj8WTqUXnsQyJYXdeAPbythQgEF3nTcEo+nkD49chjQ9IKm/QJy9xf6JakXptz86h7ecP2024rrLaQ==} dependencies: jsonc-parser: 3.2.0 @@ -3076,13 +3126,13 @@ packages: pathe: 1.1.0 dev: true - /postcss-import-resolver/2.0.0: + /postcss-import-resolver@2.0.0: resolution: {integrity: sha512-y001XYgGvVwgxyxw9J1a5kqM/vtmIQGzx34g0A0Oy44MFcy/ZboZw1hu/iN3VYFjSTRzbvd7zZJJz0Kh0AGkTw==} dependencies: enhanced-resolve: 4.5.0 dev: true - /postcss-selector-parser/6.0.11: + /postcss-selector-parser@6.0.11: resolution: {integrity: sha512-zbARubNdogI9j7WY4nQJBiNqQf3sLS3wCP4WfOidu+p28LofJqDH1tcXypGrcmMHhDk2t9wGhCsYe/+szLTy1g==} engines: {node: '>=4'} dependencies: @@ -3090,7 +3140,7 @@ packages: util-deprecate: 1.0.2 dev: true - /postcss/8.4.21: + /postcss@8.4.21: resolution: {integrity: sha512-tP7u/Sn/dVxK2NnruI4H9BG+x+Wxz6oeZ1cJ8P6G/PZY0IKk4k/63TDsQf2kQq3+qoJeLm2kIBUNlZe3zgb4Zg==} engines: {node: ^10 || ^12 || >=14} dependencies: @@ -3098,32 +3148,32 @@ packages: picocolors: 1.0.0 source-map-js: 1.0.2 - /prelude-ls/1.2.1: + /prelude-ls@1.2.1: resolution: {integrity: sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==} engines: {node: '>= 0.8.0'} dev: true - /process-nextick-args/2.0.1: + /process-nextick-args@2.0.1: resolution: {integrity: sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==} dev: true - /proxy-from-env/1.1.0: + /proxy-from-env@1.1.0: resolution: {integrity: sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==} dev: false - /prr/1.0.1: + /prr@1.0.1: resolution: {integrity: sha512-yPw4Sng1gWghHQWj0B3ZggWUm4qVbPwPFcRG8KyxiU7J2OHFSoEHKS+EZ3fv5l1t9CyCiop6l/ZYeWbrgoQejw==} dev: true - /punycode/2.3.0: + /punycode@2.3.0: resolution: {integrity: sha512-rRV+zQD8tVFys26lAGR9WUuS4iUAngJScM+ZRSKtvl5tKeZ2t5bvdNFdNHBW9FWR4guGHlgmsZ1G7BSm2wTbuA==} engines: {node: '>=6'} dev: true - /queue-microtask/1.2.3: + /queue-microtask@1.2.3: resolution: {integrity: sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==} - /rc9/2.0.1: + /rc9@2.0.1: resolution: {integrity: sha512-9EfjLgNmzP9255YX8bGnILQcmdtOXKtUlFTu8bOZPJVtaUDZ2imswcUdpK51tMjTRQyB7r5RebNijrzuyGXcVA==} dependencies: defu: 6.1.2 @@ -3131,7 +3181,7 @@ packages: flat: 5.0.2 dev: true - /readable-stream/2.3.8: + /readable-stream@2.3.8: resolution: {integrity: sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==} dependencies: core-util-is: 1.0.3 @@ -3143,13 +3193,13 @@ packages: util-deprecate: 1.0.2 dev: true - /readdirp/3.6.0: + /readdirp@3.6.0: resolution: {integrity: sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==} engines: {node: '>=8.10.0'} dependencies: picomatch: 2.3.1 - /regexp.prototype.flags/1.4.3: + /regexp.prototype.flags@1.4.3: resolution: {integrity: sha512-fjggEOO3slI6Wvgjwflkc4NFRCTZAu5CnNfBd5qOMYhWdn67nJBBu34/TkD++eeFmd8C9r9jfXJ27+nSiRkSUA==} engines: {node: '>= 0.4'} dependencies: @@ -3158,17 +3208,17 @@ packages: functions-have-names: 1.2.3 dev: true - /regexpp/3.2.0: + /regexpp@3.2.0: resolution: {integrity: sha512-pq2bWo9mVD43nbts2wGv17XLiNLya+GklZ8kaDLV2Z08gDCsGpnKn9BFMepvWuHCbyVvY7J5o5+BVvoQbmlJLg==} engines: {node: '>=8'} dev: true - /resolve-from/4.0.0: + /resolve-from@4.0.0: resolution: {integrity: sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==} engines: {node: '>=4'} dev: true - /resolve/1.22.1: + /resolve@1.22.1: resolution: {integrity: sha512-nBpuuYuY5jFsli/JIs1oldw6fOQCBioohqWZg/2hiaOybXOft4lonv85uDOKXdf8rhyK159cxU5cDcK/NKk8zw==} hasBin: true dependencies: @@ -3177,18 +3227,18 @@ packages: supports-preserve-symlinks-flag: 1.0.0 dev: true - /reusify/1.0.4: + /reusify@1.0.4: resolution: {integrity: sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==} engines: {iojs: '>=1.0.0', node: '>=0.10.0'} - /rimraf/3.0.2: + /rimraf@3.0.2: resolution: {integrity: sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==} hasBin: true dependencies: glob: 7.2.3 dev: true - /rollup/3.18.0: + /rollup@3.18.0: resolution: {integrity: sha512-J8C6VfEBjkvYPESMQYxKHxNOh4A5a3FlP+0BETGo34HEcE4eTlgCrO2+eWzlu2a/sHs2QUkZco+wscH7jhhgWg==} engines: {node: '>=14.18.0', npm: '>=8.0.0'} hasBin: true @@ -3196,20 +3246,20 @@ packages: fsevents: 2.3.2 dev: true - /run-parallel/1.2.0: + /run-parallel@1.2.0: resolution: {integrity: sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==} dependencies: queue-microtask: 1.2.3 - /safe-buffer/5.1.2: + /safe-buffer@5.1.2: resolution: {integrity: sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==} dev: true - /scule/1.0.0: + /scule@1.0.0: resolution: {integrity: sha512-4AsO/FrViE/iDNEPaAQlb77tf0csuq27EsVpy6ett584EcRTp6pTDLoGWVxCD77y5iU5FauOvhsI4o1APwPoSQ==} dev: true - /section-matter/1.0.0: + /section-matter@1.0.0: resolution: {integrity: sha512-vfD3pmTzGpufjScBh50YHKzEu2lxBWhVEHsNGoEXmCmn2hKGfeNLYMzCJpe8cD7gqX7TJluOVpBkAequ6dgMmA==} engines: {node: '>=4'} dependencies: @@ -3217,11 +3267,11 @@ packages: kind-of: 6.0.3 dev: true - /semver/6.3.0: + /semver@6.3.0: resolution: {integrity: sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==} hasBin: true - /semver/7.3.8: + /semver@7.3.8: resolution: {integrity: sha512-NB1ctGL5rlHrPJtFDVIVzTyQylMLu9N9VICA6HSFJo8MCGVTMW6gfpicwKmmK/dAjTOrqu5l63JJOpDSrAis3A==} engines: {node: '>=10'} hasBin: true @@ -3229,17 +3279,17 @@ packages: lru-cache: 6.0.0 dev: true - /shebang-command/2.0.0: + /shebang-command@2.0.0: resolution: {integrity: sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==} engines: {node: '>=8'} dependencies: shebang-regex: 3.0.0 - /shebang-regex/3.0.0: + /shebang-regex@3.0.0: resolution: {integrity: sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==} engines: {node: '>=8'} - /shiki/0.14.1: + /shiki@0.14.1: resolution: {integrity: sha512-+Jz4nBkCBe0mEDqo1eKRcCdjRtrCjozmcbTUjbPTX7OOJfEbTZzlUWlZtGe3Gb5oV1/jnojhG//YZc3rs9zSEw==} dependencies: ansi-sequence-parser: 1.1.0 @@ -3248,7 +3298,7 @@ packages: vscode-textmate: 8.0.0 dev: false - /side-channel/1.0.4: + /side-channel@1.0.4: resolution: {integrity: sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw==} dependencies: call-bind: 1.0.2 @@ -3256,15 +3306,15 @@ packages: object-inspect: 1.12.3 dev: true - /signal-exit/3.0.7: + /signal-exit@3.0.7: resolution: {integrity: sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==} dev: true - /simple-jsonrpc-js/1.2.0: + /simple-jsonrpc-js@1.2.0: resolution: {integrity: sha512-owkAmh7fjSYBUZVestTPCZMKYQvNiDejqZ/iGfVaKs1nrC1ZBDA3qGraf94+JNFJmu536Tb8oPe8PSPuq7GO6Q==} dev: false - /sirv/2.0.2: + /sirv@2.0.2: resolution: {integrity: sha512-4Qog6aE29nIjAOKe/wowFTxOdmbEZKb+3tsLljaBRzJwtqto0BChD2zzH0LhgCSXiI+V7X+Y45v14wBZQ1TK3w==} engines: {node: '>= 10'} dependencies: @@ -3273,97 +3323,97 @@ packages: totalist: 3.0.0 dev: true - /slash/3.0.0: + /slash@3.0.0: resolution: {integrity: sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==} engines: {node: '>=8'} dev: true - /slash/4.0.0: + /slash@4.0.0: resolution: {integrity: sha512-3dOsAHXXUkQTpOYcoAxLIorMTp4gIQr5IW3iVb7A7lFIp0VHhnynm9izx6TssdrIcVIESAlVjtnO2K8bg+Coew==} engines: {node: '>=12'} dev: true - /source-map-js/1.0.2: + /source-map-js@1.0.2: resolution: {integrity: sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw==} engines: {node: '>=0.10.0'} - /source-map/0.6.1: + /source-map@0.6.1: resolution: {integrity: sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==} engines: {node: '>=0.10.0'} - /sourcemap-codec/1.4.8: + /sourcemap-codec@1.4.8: resolution: {integrity: sha512-9NykojV5Uih4lgo5So5dtw+f0JgJX30KCNI8gwhz2J9A15wD0Ml6tjHKwf6fTSa6fAdVBdZeNOs9eJ71qCk8vA==} deprecated: Please use @jridgewell/sourcemap-codec instead - /sprintf-js/1.0.3: + /sprintf-js@1.0.3: resolution: {integrity: sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==} dev: true - /std-env/3.3.2: + /std-env@3.3.2: resolution: {integrity: sha512-uUZI65yrV2Qva5gqE0+A7uVAvO40iPo6jGhs7s8keRfHCmtg+uB2X6EiLGCI9IgL1J17xGhvoOqSz79lzICPTA==} dev: true - /stop-iteration-iterator/1.0.0: + /stop-iteration-iterator@1.0.0: resolution: {integrity: sha512-iCGQj+0l0HOdZ2AEeBADlsRC+vsnDsZsbdSiH1yNSjcfKM7fdpCMfqAL/dwF5BLiw/XhRft/Wax6zQbhq2BcjQ==} engines: {node: '>= 0.4'} dependencies: internal-slot: 1.0.5 dev: true - /string_decoder/1.1.1: + /string_decoder@1.1.1: resolution: {integrity: sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==} dependencies: safe-buffer: 5.1.2 dev: true - /strip-ansi/6.0.1: + /strip-ansi@6.0.1: resolution: {integrity: sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==} engines: {node: '>=8'} dependencies: ansi-regex: 5.0.1 dev: true - /strip-bom-string/1.0.0: + /strip-bom-string@1.0.0: resolution: {integrity: sha512-uCC2VHvQRYu+lMh4My/sFNmF2klFymLX1wHJeXnbEJERpV/ZsVuonzerjfrGpIGF7LBVa1O7i9kjiWvJiFck8g==} engines: {node: '>=0.10.0'} dev: true - /strip-final-newline/2.0.0: + /strip-final-newline@2.0.0: resolution: {integrity: sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==} engines: {node: '>=6'} dev: true - /strip-json-comments/3.1.1: + /strip-json-comments@3.1.1: resolution: {integrity: sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==} engines: {node: '>=8'} dev: true - /strip-literal/1.0.1: + /strip-literal@1.0.1: resolution: {integrity: sha512-QZTsipNpa2Ppr6v1AmJHESqJ3Uz247MUS0OjrnnZjFAvEoWqxuyFuXn2xLgMtRnijJShAa1HL0gtJyUs7u7n3Q==} dependencies: acorn: 8.8.2 dev: true - /supports-color/5.5.0: + /supports-color@5.5.0: resolution: {integrity: sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==} engines: {node: '>=4'} dependencies: has-flag: 3.0.0 dev: true - /supports-color/7.2.0: + /supports-color@7.2.0: resolution: {integrity: sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==} engines: {node: '>=8'} dependencies: has-flag: 4.0.0 dev: true - /supports-preserve-symlinks-flag/1.0.0: + /supports-preserve-symlinks-flag@1.0.0: resolution: {integrity: sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==} engines: {node: '>= 0.4'} dev: true - /synckit/0.8.5: + /synckit@0.8.5: resolution: {integrity: sha512-L1dapNV6vu2s/4Sputv8xGsCdAVlb5nRDMFU/E27D44l5U6cw1g0dGd45uLc+OXjNMmF4ntiMdCimzcjFKQI8Q==} engines: {node: ^14.18.0 || >=16.0.0} dependencies: @@ -3371,16 +3421,16 @@ packages: tslib: 2.5.0 dev: false - /tabbable/6.1.1: + /tabbable@6.1.1: resolution: {integrity: sha512-4kl5w+nCB44EVRdO0g/UGoOp3vlwgycUVtkk/7DPyeLZUCuNFFKCFG6/t/DgHLrUPHjrZg6s5tNm+56Q2B0xyg==} dev: false - /tapable/1.1.3: + /tapable@1.1.3: resolution: {integrity: sha512-4WK/bYZmj8xLr+HUCODHGF1ZFzsYffasLUgEiMBY4fgtltdO6B4WJtlSbPaDTLpYTcGVwM2qLnFTICEcNxs3kA==} engines: {node: '>=6'} dev: true - /tar/6.1.13: + /tar@6.1.13: resolution: {integrity: sha512-jdIBIN6LTIe2jqzay/2vtYLlBHa3JF42ot3h1dW8Q0PaAG4v8rm0cvpVePtau5C6OKXGGcgO9q2AMNSWxiLqKw==} engines: {node: '>=10'} dependencies: @@ -3392,41 +3442,41 @@ packages: yallist: 4.0.0 dev: true - /text-table/0.2.0: + /text-table@0.2.0: resolution: {integrity: sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==} dev: true - /tiny-glob/0.2.9: + /tiny-glob@0.2.9: resolution: {integrity: sha512-g/55ssRPUjShh+xkfx9UPDXqhckHEsHr4Vd9zX55oSdGZc/MD0m3sferOkwWtp98bv+kcVfEHtRJgBVJzelrzg==} dependencies: globalyzer: 0.1.0 globrex: 0.1.2 dev: false - /to-fast-properties/2.0.0: + /to-fast-properties@2.0.0: resolution: {integrity: sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog==} engines: {node: '>=4'} - /to-regex-range/5.0.1: + /to-regex-range@5.0.1: resolution: {integrity: sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==} engines: {node: '>=8.0'} dependencies: is-number: 7.0.0 - /totalist/3.0.0: + /totalist@3.0.0: resolution: {integrity: sha512-eM+pCBxXO/njtF7vdFsHuqb+ElbxqtI4r5EAvk6grfAFyJ6IvWlSkfZ5T9ozC6xWw3Fj1fGoSmrl0gUs46JVIw==} engines: {node: '>=6'} dev: true - /tslib/1.14.1: + /tslib@1.14.1: resolution: {integrity: sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==} dev: true - /tslib/2.5.0: + /tslib@2.5.0: resolution: {integrity: sha512-336iVw3rtn2BUK7ORdIAHTyxHGRIHVReokCR3XjbckJMK7ms8FysBfhLR8IXnAgy7T0PTPNBWKiH514FOW/WSg==} dev: false - /tsutils/3.21.0_typescript@4.9.5: + /tsutils@3.21.0(typescript@4.9.5): resolution: {integrity: sha512-mHKK3iUXL+3UF6xL5k0PEhKRUBKPBCv/+RkEOpjRWxxx27KKRBmmA60A9pgOUvMi8GKhRMPEmjBRPzs2W7O1OA==} engines: {node: '>= 6'} peerDependencies: @@ -3436,33 +3486,38 @@ packages: typescript: 4.9.5 dev: true - /type-check/0.4.0: + /type-check@0.4.0: resolution: {integrity: sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==} engines: {node: '>= 0.8.0'} dependencies: prelude-ls: 1.2.1 dev: true - /type-fest/0.20.2: + /type-fest@0.20.2: resolution: {integrity: sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==} engines: {node: '>=10'} dev: true - /typescript/4.9.5: + /type-fest@3.7.2: + resolution: {integrity: sha512-f9BHrLjRJ4MYkfOsnC/53PNDzZJcVo14MqLp2+hXE39p5bgwqohxR5hDZztwxlbxmIVuvC2EFAKrAkokq23PLA==} + engines: {node: '>=14.16'} + dev: false + + /typescript@4.9.5: resolution: {integrity: sha512-1FXk9E2Hm+QzZQ7z+McJiHL4NW1F2EzMu9Nq9i3zAaGqibafqYwCVU6WyWAuyQRRzOlxou8xZSyXLEN8oKj24g==} engines: {node: '>=4.2.0'} hasBin: true dev: true - /uc.micro/1.0.6: + /uc.micro@1.0.6: resolution: {integrity: sha512-8Y75pvTYkLJW2hWQHXxoqRgV7qb9B+9vFEtidML+7koHUFapnVJAZ6cKs+Qjz5Aw3aZWHMC6u0wJE3At+nSGwA==} dev: true - /ufo/1.1.1: + /ufo@1.1.1: resolution: {integrity: sha512-MvlCc4GHrmZdAllBc0iUDowff36Q9Ndw/UzqmEKyrfSzokTd9ZCy1i+IIk5hrYKkjoYVQyNbrw7/F8XJ2rEwTg==} dev: true - /unctx/2.1.2: + /unctx@2.1.2: resolution: {integrity: sha512-KK18aLRKe3OlbPyHbXAkIWSU3xK8GInomXfA7fzDMGFXQ1crX1UWrCzKesVXeUyHIayHUrnTvf87IPCKMyeKTg==} dependencies: acorn: 8.8.2 @@ -3471,7 +3526,7 @@ packages: unplugin: 1.1.0 dev: true - /unhead/1.1.15: + /unhead@1.1.15: resolution: {integrity: sha512-rpOTD35CDz9KFvBKt42KRKZRsYIDY7Sjh5XhBL2SH6XUHdRdqTDIVjHtrxIwRQkfnMdUAZUSy6KYaiAMQFUOiw==} dependencies: '@unhead/dom': 1.1.15 @@ -3480,7 +3535,7 @@ packages: hookable: 5.4.2 dev: false - /unimport/2.2.4: + /unimport@2.2.4: resolution: {integrity: sha512-qMgmeEGqqrrmEtm0dqxMG37J6xBtrriqxq9hILvDb+e6l2F0yTnJomLoCCp0eghLR7bYGeBsUU5Y0oyiUYhViw==} dependencies: '@rollup/pluginutils': 5.0.2 @@ -3498,7 +3553,7 @@ packages: - rollup dev: true - /unimport/3.0.2: + /unimport@3.0.2: resolution: {integrity: sha512-OQ0hShpcerS1PSsISsyn/NV2dGe5xfdUn4p5nwOodq0iqq5xxYQrTidHqlFGjxIliPDtDJp80OeySzyPTjYHmA==} dependencies: '@rollup/pluginutils': 5.0.2 @@ -3516,7 +3571,7 @@ packages: - rollup dev: true - /unplugin-auto-import/0.15.0_@vueuse+core@9.13.0: + /unplugin-auto-import@0.15.0(@vueuse/core@9.13.0): resolution: {integrity: sha512-TYlqpTiX1jlbc2+EVaM0jfwdvbIdDWLHAPqw/l+7+QRm9rkqK2j8LQGjY3tAPbe66r5EirgTlrrXQG/MNVTv7w==} engines: {node: '>=14'} peerDependencies: @@ -3528,7 +3583,7 @@ packages: '@antfu/utils': 0.7.2 '@nuxt/kit': 3.2.3 '@rollup/pluginutils': 5.0.2 - '@vueuse/core': 9.13.0_vue@3.2.47 + '@vueuse/core': 9.13.0(vue@3.2.47) local-pkg: 0.4.3 magic-string: 0.30.0 minimatch: 7.4.2 @@ -3539,7 +3594,7 @@ packages: - supports-color dev: true - /unplugin-combine/0.6.0_vite@4.1.4: + /unplugin-combine@0.6.0(vite@4.1.4): resolution: {integrity: sha512-cZkTg2Z3CcScyRi6QtpVxBZoCMsPaEHyKNh7HyqMkfWV7sKNwHllYezVOFINOGNzqSS1+xWLY3iDCiTVoH3oaA==} engines: {node: '>=14.19.0'} peerDependencies: @@ -3562,7 +3617,7 @@ packages: vite: 4.1.4 dev: true - /unplugin-icons/0.15.3: + /unplugin-icons@0.15.3: resolution: {integrity: sha512-YWgJqv5AahrokeOnta8uX/m1damZA6Rf6zPClgHg2Fa/45iyOe3Lj+Wn/Ba+CSsq9yBffn17YfKfJNyWCNZPvw==} peerDependencies: '@svgr/core': '>=5.5.0' @@ -3590,7 +3645,7 @@ packages: - supports-color dev: true - /unplugin-vue-components/0.24.0_vue@3.2.47: + /unplugin-vue-components@0.24.0(vue@3.2.47): resolution: {integrity: sha512-U+Pr5StEhlD1LzsJC63f3FoTje3IbqRuSIui9RBnOokowzMM2uK2jZkc1ccLWmhLa8P9qJwEdj93LE/NG83eiw==} engines: {node: '>=14'} peerDependencies: @@ -3617,12 +3672,12 @@ packages: - supports-color dev: true - /unplugin-vue-define-options/1.2.3_vue@3.2.47: + /unplugin-vue-define-options@1.2.3(vue@3.2.47): resolution: {integrity: sha512-ku2Z5uD8uWE2vvQ2FeUlPKPcsHhDH2crL9up1nWXDAg15dfa2ap05e3T3dYmRvBpCsYhOqrt/Mi8JDVfo8EVDw==} engines: {node: '>=14.19.0'} dependencies: '@rollup/pluginutils': 5.0.2 - '@vue-macros/common': 1.1.0_vue@3.2.47 + '@vue-macros/common': 1.1.0(vue@3.2.47) ast-walker-scope: 0.4.0 unplugin: 1.1.0 transitivePeerDependencies: @@ -3630,32 +3685,32 @@ packages: - vue dev: true - /unplugin-vue-macros/1.9.1_qnq6tcennvnlbajhsceuubx7mq: + /unplugin-vue-macros@1.9.1(@vueuse/core@9.13.0)(vite@4.1.4)(vue@3.2.47): resolution: {integrity: sha512-XS7pAUL0GxXOIylSbICVqtsJbDhAeokHAwquP9Hfb121hXMLr7xOXk8WGnYMp+z1wJiVyt3amHkRzfHfEWJctA==} engines: {node: '>=14.19.0'} peerDependencies: vue: ^2.7.0 || ^3.2.25 dependencies: '@rollup/pluginutils': 5.0.2 - '@vue-macros/better-define': 1.3.5_vue@3.2.47 - '@vue-macros/common': 1.1.0_vue@3.2.47 - '@vue-macros/define-model': 1.3.3_wahnhgkv24wdnnevlbh26c63xq - '@vue-macros/define-props': 0.4.0_vr7yg7432jseo5qubl5iatrj4q - '@vue-macros/define-props-refs': 0.2.2_vue@3.2.47 - '@vue-macros/define-render': 1.2.3_vue@3.2.47 - '@vue-macros/define-slots': 0.2.3_vue@3.2.47 - '@vue-macros/devtools': 0.1.2_vite@4.1.4 - '@vue-macros/export-props': 0.2.2_vue@3.2.47 - '@vue-macros/hoist-static': 1.2.2_vue@3.2.47 - '@vue-macros/named-template': 0.2.3_vue@3.2.47 - '@vue-macros/reactivity-transform': 0.2.4_vue@3.2.47 - '@vue-macros/setup-block': 0.1.2_vue@3.2.47 - '@vue-macros/setup-component': 0.15.3_vue@3.2.47 - '@vue-macros/setup-sfc': 0.14.2_vue@3.2.47 - '@vue-macros/short-emits': 1.2.3_vue@3.2.47 + '@vue-macros/better-define': 1.3.5(vue@3.2.47) + '@vue-macros/common': 1.1.0(vue@3.2.47) + '@vue-macros/define-model': 1.3.3(@vueuse/core@9.13.0)(vue@3.2.47) + '@vue-macros/define-props': 0.4.0(@vue-macros/reactivity-transform@0.2.4)(vue@3.2.47) + '@vue-macros/define-props-refs': 0.2.2(vue@3.2.47) + '@vue-macros/define-render': 1.2.3(vue@3.2.47) + '@vue-macros/define-slots': 0.2.3(vue@3.2.47) + '@vue-macros/devtools': 0.1.2(vite@4.1.4) + '@vue-macros/export-props': 0.2.2(vue@3.2.47) + '@vue-macros/hoist-static': 1.2.2(vue@3.2.47) + '@vue-macros/named-template': 0.2.3(vue@3.2.47) + '@vue-macros/reactivity-transform': 0.2.4(vue@3.2.47) + '@vue-macros/setup-block': 0.1.2(vue@3.2.47) + '@vue-macros/setup-component': 0.15.3(vue@3.2.47) + '@vue-macros/setup-sfc': 0.14.2(vue@3.2.47) + '@vue-macros/short-emits': 1.2.3(vue@3.2.47) unplugin: 1.1.0 - unplugin-combine: 0.6.0_vite@4.1.4 - unplugin-vue-define-options: 1.2.3_vue@3.2.47 + unplugin-combine: 0.6.0(vite@4.1.4) + unplugin-vue-define-options: 1.2.3(vue@3.2.47) vue: 3.2.47 transitivePeerDependencies: - '@vueuse/core' @@ -3665,7 +3720,7 @@ packages: - webpack dev: true - /unplugin/1.1.0: + /unplugin@1.1.0: resolution: {integrity: sha512-I8obQ8Rs/hnkxokRV6g8JKOQFgYNnTd9DL58vcSt5IJ9AkK8wbrtsnzD5hi4BJlvcY536JzfEXj9L6h7j559/A==} dependencies: acorn: 8.8.2 @@ -3673,7 +3728,7 @@ packages: webpack-sources: 3.2.3 webpack-virtual-modules: 0.5.0 - /untyped/1.2.2: + /untyped@1.2.2: resolution: {integrity: sha512-EANYd5L6AdpgfldlgMcmvOOnj092nWhy0ybhc7uhEH12ipytDYz89EOegBQKj8qWL3u1wgYnmFjADhsuCJs5Aw==} dependencies: '@babel/core': 7.21.0 @@ -3684,7 +3739,7 @@ packages: - supports-color dev: true - /update-browserslist-db/1.0.10_browserslist@4.21.5: + /update-browserslist-db@1.0.10(browserslist@4.21.5): resolution: {integrity: sha512-OztqDenkfFkbSG+tRxBeAnCVPckDBcvibKd35yDONx6OU8N7sqgwc7rCbkJ/WcYtVRZ4ba68d6byhC21GFh7sQ==} hasBin: true peerDependencies: @@ -3695,17 +3750,17 @@ packages: picocolors: 1.0.0 dev: true - /uri-js/4.4.1: + /uri-js@4.4.1: resolution: {integrity: sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==} dependencies: punycode: 2.3.0 dev: true - /util-deprecate/1.0.2: + /util-deprecate@1.0.2: resolution: {integrity: sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==} dev: true - /vee-validate/4.8.4_vue@3.2.47: + /vee-validate@4.8.4(vue@3.2.47): resolution: {integrity: sha512-wlLBy50t4EMEin5oqxS2mxpqW02TkIsk0H3LcivLztNJKKLW17hpPSQtQnn8wjDLoWWZ/CVOfep6aw77aCAavg==} peerDependencies: vue: ^3.0.0 @@ -3714,7 +3769,7 @@ packages: vue: 3.2.47 dev: false - /vite-plugin-pages/0.28.0_vite@4.1.4: + /vite-plugin-pages@0.28.0(vite@4.1.4): resolution: {integrity: sha512-yncDncFVnjUzhqJnwCgGDZoZ/wO6MEOMe93f2MQjplKXm1MpmHCrTkFCPnQyYGZTVKPAN+y7BQcIpNWPFLQ4+w==} peerDependencies: '@vue/compiler-sfc': ^2.7.0 || ^3.0.0 @@ -3737,7 +3792,7 @@ packages: - supports-color dev: true - /vite-plugin-vue-markdown/0.22.4_vite@4.1.4: + /vite-plugin-vue-markdown@0.22.4(vite@4.1.4): resolution: {integrity: sha512-+kDzqGI5Lq0Wa6M4EJtV7cqOIHgGp6g4jcazXljQKLl9Og4fRs6FuGAPa2HiJ44Z9es85LAPiPbTjwrZEGEUKA==} peerDependencies: vite: ^2.0.0 || ^3.0.0-0 || ^4.0.0 @@ -3754,7 +3809,7 @@ packages: - rollup dev: true - /vite/4.1.4: + /vite@4.1.4: resolution: {integrity: sha512-3knk/HsbSTKEin43zHu7jTwYWv81f8kgAL99G5NWBcA1LKvtvcVAC4JjBH1arBunO9kQka+1oGbrMKOjk4ZrBg==} engines: {node: ^14.18.0 || >=16.0.0} hasBin: true @@ -3787,15 +3842,15 @@ packages: fsevents: 2.3.2 dev: true - /vscode-oniguruma/1.7.0: + /vscode-oniguruma@1.7.0: resolution: {integrity: sha512-L9WMGRfrjOhgHSdOYgCt/yRMsXzLDJSL7BPrOZt73gU0iWO4mpqzqQzOz5srxqTvMBaR0XZTSrVWo4j55Rc6cA==} dev: false - /vscode-textmate/8.0.0: + /vscode-textmate@8.0.0: resolution: {integrity: sha512-AFbieoL7a5LMqcnOF04ji+rpXadgOXnZsxQr//r83kLPr7biP7am3g9zbaZIaBGwBRWeSvoMD4mgPdX3e4NWBg==} dev: false - /vue-demi/0.13.11_vue@3.2.47: + /vue-demi@0.13.11(vue@3.2.47): resolution: {integrity: sha512-IR8HoEEGM65YY3ZJYAjMlKygDQn25D5ajNFNoKh9RSDMQtlzCxtfQjdQgv9jjK+m3377SsJXY8ysq8kLCZL25A==} engines: {node: '>=12'} hasBin: true @@ -3809,7 +3864,7 @@ packages: dependencies: vue: 3.2.47 - /vue-eslint-parser/9.1.0_eslint@8.35.0: + /vue-eslint-parser@9.1.0(eslint@8.35.0): resolution: {integrity: sha512-NGn/iQy8/Wb7RrRa4aRkokyCZfOUWk19OP5HP6JEozQFX5AoS/t+Z0ZN7FY4LlmWc4FNI922V7cvX28zctN8dQ==} engines: {node: ^14.17.0 || >=16.0.0} peerDependencies: @@ -3827,7 +3882,7 @@ packages: - supports-color dev: true - /vue-i18n/9.2.2_vue@3.2.47: + /vue-i18n@9.2.2(vue@3.2.47): resolution: {integrity: sha512-yswpwtj89rTBhegUAv9Mu37LNznyu3NpyLQmozF3i1hYOhwpG8RjcjIFIIfnu+2MDZJGSZPXaKWvnQA71Yv9TQ==} engines: {node: '>= 14'} peerDependencies: @@ -3840,7 +3895,7 @@ packages: vue: 3.2.47 dev: false - /vue-router/4.1.6_vue@3.2.47: + /vue-router@4.1.6(vue@3.2.47): resolution: {integrity: sha512-DYWYwsG6xNPmLq/FmZn8Ip+qrhFEzA14EI12MsMgVxvHFDYvlr4NXpVF5hrRH1wVcDP8fGi5F4rxuJSl8/r+EQ==} peerDependencies: vue: ^3.2.0 @@ -3849,14 +3904,23 @@ packages: vue: 3.2.47 dev: false - /vue-template-compiler/2.7.14: + /vue-template-compiler@2.7.14: resolution: {integrity: sha512-zyA5Y3ArvVG0NacJDkkzJuPQDF8RFeRlzV2vLeSnhSpieO6LK2OVbdLPi5MPPs09Ii+gMO8nY4S3iKQxBxDmWQ==} dependencies: de-indent: 1.0.2 he: 1.2.0 dev: true - /vue-tsc/1.2.0_typescript@4.9.5: + /vue-toast-notification@3.1.1(vue@3.2.47): + resolution: {integrity: sha512-DXEE38NxXFCNinKI+MyZBMWsaqE9Lwxg9GkMVkzKXY1ACCeNztBXuUiSvKMe36dnnYd1qnlP+cWNSvHlkt5xNA==} + engines: {node: '>=12.15.0'} + peerDependencies: + vue: ^3.0 + dependencies: + vue: 3.2.47 + dev: false + + /vue-tsc@1.2.0(typescript@4.9.5): resolution: {integrity: sha512-rIlzqdrhyPYyLG9zxsVRa+JEseeS9s8F2BbVVVWRRsTZvJO2BbhLEb2HW3MY+DFma0378tnIqs+vfTzbcQtRFw==} hasBin: true peerDependencies: @@ -3867,23 +3931,23 @@ packages: typescript: 4.9.5 dev: true - /vue/3.2.47: + /vue@3.2.47: resolution: {integrity: sha512-60188y/9Dc9WVrAZeUVSDxRQOZ+z+y5nO2ts9jWXSTkMvayiWxCWOWtBQoYjLeccfXkiiPZWAHcV+WTPhkqJHQ==} dependencies: '@vue/compiler-dom': 3.2.47 '@vue/compiler-sfc': 3.2.47 '@vue/runtime-dom': 3.2.47 - '@vue/server-renderer': 3.2.47_vue@3.2.47 + '@vue/server-renderer': 3.2.47(vue@3.2.47) '@vue/shared': 3.2.47 - /webpack-sources/3.2.3: + /webpack-sources@3.2.3: resolution: {integrity: sha512-/DyMEOrDgLKKIG0fmvtz+4dUX/3Ghozwgm6iPp8KRhvn+eQf9+Q7GWxVNMk3+uCPWfdXYC4ExGBckIXdFEfH1w==} engines: {node: '>=10.13.0'} - /webpack-virtual-modules/0.5.0: + /webpack-virtual-modules@0.5.0: resolution: {integrity: sha512-kyDivFZ7ZM0BVOUteVbDFhlRt7Ah/CSPwJdi8hBpkK7QLumUqdLtVfm/PX/hkcnrvr0i77fO5+TjZ94Pe+C9iw==} - /which-boxed-primitive/1.0.2: + /which-boxed-primitive@1.0.2: resolution: {integrity: sha512-bwZdv0AKLpplFY2KZRX6TvyuN7ojjr7lwkg6ml0roIy9YeuSr7JS372qlNW18UQYzgYK9ziGcerWqZOmEn9VNg==} dependencies: is-bigint: 1.0.4 @@ -3893,7 +3957,7 @@ packages: is-symbol: 1.0.4 dev: true - /which-collection/1.0.1: + /which-collection@1.0.1: resolution: {integrity: sha512-W8xeTUwaln8i3K/cY1nGXzdnVZlidBcagyNFtBdD5kxnb4TvGKR7FfSIS3mYpwWS1QUCutfKz8IY8RjftB0+1A==} dependencies: is-map: 2.0.2 @@ -3902,7 +3966,7 @@ packages: is-weakset: 2.0.2 dev: true - /which-typed-array/1.1.9: + /which-typed-array@1.1.9: resolution: {integrity: sha512-w9c4xkx6mPidwp7180ckYWfMmvxpjlZuIudNtDf4N/tTAUB8VJbX25qZoAsrtGuYNnGw3pa0AXgbGKRB8/EceA==} engines: {node: '>= 0.4'} dependencies: @@ -3914,23 +3978,23 @@ packages: is-typed-array: 1.1.10 dev: true - /which/2.0.2: + /which@2.0.2: resolution: {integrity: sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==} engines: {node: '>= 8'} hasBin: true dependencies: isexe: 2.0.0 - /word-wrap/1.2.3: + /word-wrap@1.2.3: resolution: {integrity: sha512-Hz/mrNwitNRh/HUAtM/VT/5VH+ygD6DV7mYKZAtHOrbs8U7lvPS6xf7EJKMF0uW1KJCl0H701g3ZGus+muE5vQ==} engines: {node: '>=0.10.0'} dev: true - /wrappy/1.0.2: + /wrappy@1.0.2: resolution: {integrity: sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==} dev: true - /ws/8.13.0: + /ws@8.13.0: resolution: {integrity: sha512-x9vcZYTrFPC7aSIbj7sRCYo7L/Xb8Iy+pW0ng0wt2vCJv7M9HOMy0UoN3rr+IFC7hb7vXoqS+P9ktyLLLhO+LA==} engines: {node: '>=10.0.0'} peerDependencies: @@ -3943,20 +4007,20 @@ packages: optional: true dev: false - /xml-name-validator/4.0.0: + /xml-name-validator@4.0.0: resolution: {integrity: sha512-ICP2e+jsHvAj2E2lIHxa5tjXRlKDJo4IdvPvCXbXQGdzSfmSpNVyIKMvoZHjDY9DP0zV17iI85o90vRFXNccRw==} engines: {node: '>=12'} dev: true - /yallist/3.1.1: + /yallist@3.1.1: resolution: {integrity: sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==} dev: true - /yallist/4.0.0: + /yallist@4.0.0: resolution: {integrity: sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==} dev: true - /yaml-eslint-parser/0.3.2: + /yaml-eslint-parser@0.3.2: resolution: {integrity: sha512-32kYO6kJUuZzqte82t4M/gB6/+11WAuHiEnK7FreMo20xsCKPeFH5tDBU7iWxR7zeJpNnMXfJyXwne48D0hGrg==} dependencies: eslint-visitor-keys: 1.3.0 @@ -3964,21 +4028,25 @@ packages: yaml: 1.10.2 dev: false - /yaml/1.10.2: + /yaml@1.10.2: resolution: {integrity: sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg==} engines: {node: '>= 6'} dev: false - /yaml/2.2.1: + /yaml@2.2.1: resolution: {integrity: sha512-e0WHiYql7+9wr4cWMx3TVQrNwejKaEe7/rHNmQmqRjazfOP5W8PB6Jpebb5o6fIapbz9o9+2ipcaTM2ZwDI6lw==} engines: {node: '>= 14'} dev: true - /yocto-queue/0.1.0: + /yocto-queue@0.1.0: resolution: {integrity: sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==} engines: {node: '>=10'} dev: true - /zhead/2.0.4: + /zhead@2.0.4: resolution: {integrity: sha512-V4R94t3ifk9AURym6OskbKcnowzgp5Z88tkoL/NF67vyryNxC62u6mx5F1Ux4oh4+YN7FFmKYEyWy6m5kfPH6g==} dev: false + + /zod@3.21.4: + resolution: {integrity: sha512-m46AKbrzKVzOzs/DZgVnG5H55N1sv1M8qZU3A8RIKbs3mrACDNeIOeilDymVb2HdmP8uwshOCF4uJ8uM9rCqJw==} + dev: false diff --git a/client/src/App.vue b/client/src/App.vue index 3892b31..9001616 100644 --- a/client/src/App.vue +++ b/client/src/App.vue @@ -5,9 +5,12 @@ import { authenticate, logout, checkAuthentication, setup } from "./api"; import IDashboard from '~icons/ri/dashboard-2-line'; import IRule from '~icons/material-symbols/rule-folder-outline-sharp'; import IAddress from '~icons/eos-icons/ip'; +import IEthernet from '~icons/bi/ethernet'; import IService from '~icons/material-symbols/home-repair-service'; import ISNAT from '~icons/mdi/arrow-expand-right'; import IDNAT from '~icons/mdi/arrow-collapse-right'; +import IConfig from '~icons/grommet-icons/document-config'; +import IStaticRoutes from '~icons/material-symbols/drive-folder-upload-outline-sharp'; enum NavState { Open, Reduced, Collapsed }; const NavStateCount = 3; @@ -17,8 +20,11 @@ const navRoutes = { "/firewall/forwardrules": { icon: IRule, caption: "Rules" }, "/firewall/sourcenatrules": { icon: ISNAT, caption: "SNAT" }, "/firewall/destinationnatrules": { icon: IDNAT, caption: "DNAT" }, + "/network/interfaces": { icon: IEthernet, caption: "Interfaces" }, + "/network/staticroutes": { icon: IStaticRoutes, caption: "Static Routes" }, "/object/addresses": { icon: IAddress, caption: "Addresses" }, "/object/services": { icon: IService, caption: "Services" }, + "/config/config": { icon: IConfig, caption: "Config" }, }; enum AuthState { Unauthenticated, MfaRequired, Authenticated }; diff --git a/client/src/api.ts b/client/src/api.ts index 99a5aa6..6712627 100644 --- a/client/src/api.ts +++ b/client/src/api.ts @@ -1,6 +1,9 @@ // import WebSocketServer from 'ws'; import JsonRPC from 'simple-jsonrpc-js'; import axios from "axios"; +import { useToast } from 'vue-toast-notification'; + +const $toast = useToast(); let jrpc = new JsonRPC.connect_xhr('/api'); // let socket = new WebSocket("ws://"+ window.location.host +"/ws/api"); @@ -21,6 +24,7 @@ export async function apiCall(method: string, params: Record): Prom if (ex.code === 401) { UnauthorizedCallback(); } else { + $toast.error(method+ ': ' + ex.message); console.debug("api call epic fail", ex); } return { Data: null, Error: ex}; diff --git a/client/src/components/NiceForm.vue b/client/src/components/NiceForm.vue new file mode 100644 index 0000000..71c0077 --- /dev/null +++ b/client/src/components/NiceForm.vue @@ -0,0 +1,87 @@ + + + + + \ No newline at end of file diff --git a/client/src/components/NiceTable.vue b/client/src/components/NiceTable.vue index a38ad3d..b4500fb 100644 --- a/client/src/components/NiceTable.vue +++ b/client/src/components/NiceTable.vue @@ -15,15 +15,20 @@ const props = defineModel<{ sortSelf?: boolean, sortBy?: string, sortDesc?: boolean, + selection?: number[], + draggable?: boolean, }>(); -let { columns, data, sort, sortSelf, sortBy, sortDesc } = $(props); +let { columns, data, sort, sortSelf, sortBy, sortDesc, selection, draggable } = $(props); const emit = defineEmits<{ (event: 'rowAction', index: number): void, (event: 'selectionChanged'): void + (event: 'draggedRow', draggedRow: number, draggedOverRow: number): void, }>(); -let selection = $ref([] as number[]); +if (selection == undefined) { + selection = []; +} const displayData = $computed(() => (sortSelf && sortBy !== '') ? data?.sort((a, b) => { @@ -97,7 +102,9 @@ function dragDropRow() { data.splice(draggedRow, 1); data.splice(draggedOverRow, 0, row); data = data; + emit("draggedRow", draggedRow, draggedOverRow); } + // Reset drag data draggedRow = 0; draggedOverRow = 0; @@ -123,7 +130,7 @@ function dragDropRow() { + +const props = defineModel<{ + title: string, + loading: boolean, + columns?: { + heading: string, + path: string, + component?: Component, + }[], + data: Record[], + tableProps: any, + selection?: number[], +}>(); + +let { title, loading, columns, data, selection, tableProps } = $(props); + +const emit = defineEmits<{ + (event: 'draggedRow', draggedRow: number, draggedOverRow: number): void, +}>(); + +async function draggedRow(draggedRow: number, draggedOverRow: number) { + emit("draggedRow", draggedRow, draggedOverRow); +} + + + + \ No newline at end of file diff --git a/client/src/components/inputs/CheckBox.vue b/client/src/components/inputs/CheckBox.vue new file mode 100644 index 0000000..e756b61 --- /dev/null +++ b/client/src/components/inputs/CheckBox.vue @@ -0,0 +1,21 @@ + + + + + \ No newline at end of file diff --git a/client/src/components/inputs/MultilineTextBox.vue b/client/src/components/inputs/MultilineTextBox.vue new file mode 100644 index 0000000..7fba52a --- /dev/null +++ b/client/src/components/inputs/MultilineTextBox.vue @@ -0,0 +1,18 @@ + + + \ No newline at end of file diff --git a/client/src/pages/network/Interfaces.vue b/client/src/pages/network/Interfaces.vue new file mode 100644 index 0000000..290b2aa --- /dev/null +++ b/client/src/pages/network/Interfaces.vue @@ -0,0 +1,66 @@ + + + \ No newline at end of file diff --git a/client/src/pages/network/StaticRoutes.vue b/client/src/pages/network/StaticRoutes.vue new file mode 100644 index 0000000..d0dc76a --- /dev/null +++ b/client/src/pages/network/StaticRoutes.vue @@ -0,0 +1,51 @@ + + + \ No newline at end of file diff --git a/client/src/pages/object/Addresses.vue b/client/src/pages/object/Addresses.vue index e8e2e9c..a6eff5c 100644 --- a/client/src/pages/object/Addresses.vue +++ b/client/src/pages/object/Addresses.vue @@ -2,6 +2,9 @@ import { apiCall } from "../../api"; let addresses = $ref([]); +let loading = $ref(false); +let selection = $ref([] as number[]); + const columns = [ {heading: 'Name', path: 'name'}, {heading: 'Type', path: 'type'}, @@ -10,6 +13,7 @@ const columns = [ ]; async function load(){ + loading = true let res = await apiCall("Object.GetAddresses", {}); if (res.Error === null) { addresses = res.Data.Addresses; @@ -17,6 +21,52 @@ async function load(){ } else { console.debug("error", res); } + loading = false +} + +const displayData = $computed(() => { + let data: any; + data = []; + for (const name in addresses) { + data.push({ + name, + value: getAddressValue(addresses[name]), + type: addresses[name].type, + comment: addresses[name].comment, + }); + } + return data; +}); + +function getAddressValue(s: any): string { + let value: string; + switch (s.type) { + case "host": + value = s.host; + break; + case "range": + value = s.range; + break; + case "network": + value = s.network; + break; + case "group": + value = s.children; + break; + default: + value = "unkown"; + } + return value; +} + +async function deleteAddress(){ + let res = await apiCall("Object.DeleteAddress", {name: displayData[selection[0]].name}); + if (res.Error === null) { + console.debug("deleted address"); + } else { + console.debug("error", res); + } + load(); } onMounted(async() => { @@ -26,10 +76,10 @@ onMounted(async() => { \ No newline at end of file diff --git a/client/src/pages/object/Services.vue b/client/src/pages/object/Services.vue index 6c40b92..54e45cd 100644 --- a/client/src/pages/object/Services.vue +++ b/client/src/pages/object/Services.vue @@ -1,7 +1,10 @@ \ No newline at end of file diff --git a/client/src/plugins.ts b/client/src/plugins.ts new file mode 100644 index 0000000..be2f551 --- /dev/null +++ b/client/src/plugins.ts @@ -0,0 +1,9 @@ +import { useRouter } from 'vue-router'; +import { useToast } from "vue-toast-notification"; + +export default function initiateCommonPlugins() { + const router = useRouter(); + const toast = useToast(); + + return { router, toast }; +} \ No newline at end of file diff --git a/go.mod b/go.mod index ba80e2c..e483b15 100644 --- a/go.mod +++ b/go.mod @@ -13,8 +13,12 @@ require ( github.com/go-playground/locales v0.14.1 // indirect github.com/go-playground/universal-translator v0.18.1 // indirect github.com/go-playground/validator/v10 v10.11.2 // indirect + github.com/godbus/dbus/v5 v5.1.0 // indirect github.com/klauspost/compress v1.10.3 // indirect github.com/leodido/go-urn v1.2.1 // indirect + github.com/r3labs/diff/v3 v3.0.1 // indirect + github.com/vmihailenco/msgpack/v5 v5.3.5 // indirect + github.com/vmihailenco/tagparser/v2 v2.0.0 // indirect golang.org/x/crypto v0.5.0 // indirect golang.org/x/sys v0.4.0 // indirect golang.org/x/text v0.6.0 // indirect diff --git a/go.sum b/go.sum index 3dda176..e817307 100644 --- a/go.sum +++ b/go.sum @@ -23,6 +23,8 @@ github.com/gobwas/pool v0.2.0 h1:QEmUOlnSjWtnpRGHF3SauEiOsy82Cup83Vf2LcMlnc8= github.com/gobwas/pool v0.2.0/go.mod h1:q8bcK0KcYlCgd9e7WYLm9LpyS+YeLd8JVDW6WezmKEw= github.com/gobwas/ws v1.0.2 h1:CoAavW/wd/kulfZmSIBt6p24n4j7tHgNVCjsfHVNUbo= github.com/gobwas/ws v1.0.2/go.mod h1:szmBTxLgaFppYjEmNtny/v3w89xOydFnnZMcgRRu/EM= +github.com/godbus/dbus/v5 v5.1.0 h1:4KLkAxT3aOY8Li4FRJe/KvhoNFFxo0m6fNuFUO8QJUk= +github.com/godbus/dbus/v5 v5.1.0/go.mod h1:xhWf0FNVPg57R7Z0UbKHbJfkEywrmjJnf7w5xrFpKfA= github.com/golang/protobuf v1.3.3/go.mod h1:vzj43D7+SQXF/4pzW/hwtAqwc6iTitCiVSaWz5lYuqw= github.com/golang/protobuf v1.3.5 h1:F768QJ1E9tib+q5Sc8MkdJi1RxLTbRcTf8LJV56aRls= github.com/golang/protobuf v1.3.5/go.mod h1:6O5/vntMXwX2lRkT1hjjk0nAC1IDOTvTlVgjlRvqsdk= @@ -48,6 +50,8 @@ github.com/modern-go/concurrent v0.0.0-20180228061459-e0a39a4cb421/go.mod h1:6dJ github.com/modern-go/reflect2 v0.0.0-20180701023420-4b7aa43c6742 h1:Esafd1046DLDQ0W1YjYsBW+p8U2u7vzgW2SQVmlNazg= github.com/modern-go/reflect2 v0.0.0-20180701023420-4b7aa43c6742/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0= github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= +github.com/r3labs/diff/v3 v3.0.1 h1:CBKqf3XmNRHXKmdU7mZP1w7TV0pDyVCis1AUHtA4Xtg= +github.com/r3labs/diff/v3 v3.0.1/go.mod h1:f1S9bourRbiM66NskseyUdo0fTmEE0qKrikYJX63dgo= github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI= github.com/stretchr/testify v1.4.0/go.mod h1:j7eGeouHqKxXV5pUuKE4zz7dFj8WfuZ+81PSLYec5m4= @@ -56,6 +60,10 @@ github.com/ugorji/go v1.1.7 h1:/68gy2h+1mWMrwZFeD1kQialdSzAb432dtpeJ42ovdo= github.com/ugorji/go v1.1.7/go.mod h1:kZn38zHttfInRq0xu/PH0az30d+z6vm202qpg1oXVMw= github.com/ugorji/go/codec v1.1.7 h1:2SvQaVZ1ouYrrKKwoSk2pzd4A9evlKJb9oTL+OaLUSs= github.com/ugorji/go/codec v1.1.7/go.mod h1:Ax+UKWsSmolVDwsd+7N3ZtXu+yMGCf907BLYF3GoBXY= +github.com/vmihailenco/msgpack/v5 v5.3.5 h1:5gO0H1iULLWGhs2H5tbAHIZTV8/cYafcFOr9znI5mJU= +github.com/vmihailenco/msgpack/v5 v5.3.5/go.mod h1:7xyJ9e+0+9SaZT0Wt1RGleJXzli6Q/V5KbhBonMG9jc= +github.com/vmihailenco/tagparser/v2 v2.0.0 h1:y09buUbR+b5aycVFQs/g70pqKVZNBmxwAhO7/IwNM9g= +github.com/vmihailenco/tagparser/v2 v2.0.0/go.mod h1:Wri+At7QHww0WTrCBeu4J6bNtoV6mEfg5OIWRZA9qds= go4.org/netipx v0.0.0-20230125063823-8449b0a6169f h1:ketMxHg+vWm3yccyYiq+uK8D3fRmna2Fcj+awpQp84s= go4.org/netipx v0.0.0-20230125063823-8449b0a6169f/go.mod h1:tgPU4N2u9RByaTN3NC2p9xOzyFpte4jYwsIIRF7XlSc= golang.org/x/crypto v0.5.0 h1:U/0M97KRkSFvyD/3FSmdP5W5swImpNgle/EHFhOsQPE= diff --git a/internal/api/config/config.go b/internal/api/config/config.go new file mode 100644 index 0000000..8e7e6d2 --- /dev/null +++ b/internal/api/config/config.go @@ -0,0 +1,7 @@ +package config + +import "nfsense.net/nfsense/internal/config" + +type Config struct { + ConfigManager *config.ConfigManager +} diff --git a/internal/api/config/pending.go b/internal/api/config/pending.go new file mode 100644 index 0000000..db437e3 --- /dev/null +++ b/internal/api/config/pending.go @@ -0,0 +1,40 @@ +package config + +import ( + "context" + "fmt" + + "github.com/r3labs/diff/v3" +) + +type GetPendingStatusResult struct { + Changed bool +} + +func (c *Config) GetPendingStatus(ctx context.Context, params struct{}) (GetPendingStatusResult, error) { + return GetPendingStatusResult{ + Changed: c.ConfigManager.AreChangesPending(), + }, nil +} + +type GetPendingChangelogResult struct { + Changelog diff.Changelog +} + +func (c *Config) GetPendingChangelog(ctx context.Context, params struct{}) (GetPendingChangelogResult, error) { + log, err := c.ConfigManager.GetPendingChangelog() + if err != nil { + return GetPendingChangelogResult{}, fmt.Errorf("Get Pending changelog %w", err) + } + return GetPendingChangelogResult{ + Changelog: log, + }, nil +} + +func (c *Config) ApplyPendingChanges(ctx context.Context, params struct{}) (struct{}, error) { + return struct{}{}, c.ConfigManager.ApplyPendingChanges() +} + +func (c *Config) DiscardPendingChanges(ctx context.Context, params struct{}) (struct{}, error) { + return struct{}{}, c.ConfigManager.DiscardPendingConfig() +} diff --git a/internal/api/firewall/destination_nat_rules.go b/internal/api/firewall/destination_nat_rules.go index 7d3e4b5..f82a20a 100644 --- a/internal/api/firewall/destination_nat_rules.go +++ b/internal/api/firewall/destination_nat_rules.go @@ -2,19 +2,85 @@ package firewall import ( "context" + "fmt" "nfsense.net/nfsense/internal/definitions" ) -type GetDestinationNATRulesParameters struct { -} - type GetDestinationNATRulesResult struct { - DestinationNATRules []definitions.DestinationNATRule + DestinationNATRules []definitions.DestinationNATRule `json:"destination_nat_rules"` } -func (f *Firewall) GetDestinationNATRules(ctx context.Context, params GetForwardRulesParameters) (GetDestinationNATRulesResult, error) { +func (f *Firewall) GetDestinationNATRules(ctx context.Context, params struct{}) (GetDestinationNATRulesResult, error) { return GetDestinationNATRulesResult{ - DestinationNATRules: f.Conf.Firewall.DestinationNATRules, + DestinationNATRules: f.ConfigManager.GetPendingConfig().Firewall.DestinationNATRules, }, nil } + +type CreateDestinationNATRuleParameters struct { + DestinationNATRule definitions.DestinationNATRule `json:"destination_nat_rule"` +} + +func (f *Firewall) CreateDestinationNATRule(ctx context.Context, params CreateDestinationNATRuleParameters) (struct{}, error) { + t, conf := f.ConfigManager.StartTransaction() + defer t.Discard() + + conf.Firewall.DestinationNATRules = append(conf.Firewall.DestinationNATRules, params.DestinationNATRule) + return struct{}{}, t.Commit() +} + +type UpdateDestinationNATRuleParameters struct { + Index uint64 `json:"index"` + DestinationNATRule definitions.DestinationNATRule `json:"destination_nat_rule"` +} + +func (f *Firewall) UpdateDestinationNATRule(ctx context.Context, params UpdateDestinationNATRuleParameters) (struct{}, error) { + if int(params.Index) >= len(f.ConfigManager.GetPendingConfig().Firewall.DestinationNATRules) { + return struct{}{}, fmt.Errorf("DestinationNATRule does not Exist") + } + + t, conf := f.ConfigManager.StartTransaction() + defer t.Discard() + + conf.Firewall.DestinationNATRules[params.Index] = params.DestinationNATRule + return struct{}{}, t.Commit() +} + +type MoveDestinationNATRuleParameters struct { + Index uint64 `json:"index"` + ToIndex uint64 `json:"to_index"` +} + +func (f *Firewall) MoveDestinationNATRule(ctx context.Context, params MoveDestinationNATRuleParameters) (struct{}, error) { + if int(params.Index) >= len(f.ConfigManager.GetPendingConfig().Firewall.DestinationNATRules) { + return struct{}{}, fmt.Errorf("DestinationNATRule does not Exist") + } + + t, conf := f.ConfigManager.StartTransaction() + defer t.Discard() + + rule := conf.Firewall.DestinationNATRules[params.Index] + sliceWithoutRule := append(conf.Firewall.DestinationNATRules[:params.Index], conf.Firewall.DestinationNATRules[params.Index+1:]...) + newSlice := make([]definitions.DestinationNATRule, params.ToIndex+1) + copy(newSlice, sliceWithoutRule[:params.ToIndex]) + newSlice[params.ToIndex] = rule + conf.Firewall.DestinationNATRules = append(newSlice, sliceWithoutRule[params.ToIndex:]...) + + return struct{}{}, t.Commit() +} + +type DeleteDestinationNATRuleParameters struct { + Index uint64 `json:"index"` +} + +func (f *Firewall) DeleteDestinationNATRule(ctx context.Context, params DeleteDestinationNATRuleParameters) (struct{}, error) { + if int(params.Index) >= len(f.ConfigManager.GetPendingConfig().Firewall.DestinationNATRules) { + return struct{}{}, fmt.Errorf("DestinationNATRule does not Exist") + } + + t, conf := f.ConfigManager.StartTransaction() + defer t.Discard() + + conf.Firewall.DestinationNATRules = append(conf.Firewall.DestinationNATRules[:params.Index], conf.Firewall.DestinationNATRules[params.Index+1:]...) + return struct{}{}, t.Commit() +} diff --git a/internal/api/firewall/firewall.go b/internal/api/firewall/firewall.go index 31ef0ec..1bde05c 100644 --- a/internal/api/firewall/firewall.go +++ b/internal/api/firewall/firewall.go @@ -1,9 +1,9 @@ package firewall import ( - "nfsense.net/nfsense/internal/definitions" + "nfsense.net/nfsense/internal/config" ) type Firewall struct { - Conf *definitions.Config + ConfigManager *config.ConfigManager } diff --git a/internal/api/firewall/forward_rules.go b/internal/api/firewall/forward_rules.go index c8b0870..b1895a8 100644 --- a/internal/api/firewall/forward_rules.go +++ b/internal/api/firewall/forward_rules.go @@ -2,19 +2,85 @@ package firewall import ( "context" + "fmt" "nfsense.net/nfsense/internal/definitions" ) -type GetForwardRulesParameters struct { -} - type GetForwardRulesResult struct { - ForwardRules []definitions.ForwardRule + ForwardRules []definitions.ForwardRule `json:"forward_rules"` } -func (f *Firewall) GetForwardRules(ctx context.Context, params GetForwardRulesParameters) (GetForwardRulesResult, error) { +func (f *Firewall) GetForwardRules(ctx context.Context, params struct{}) (GetForwardRulesResult, error) { return GetForwardRulesResult{ - ForwardRules: f.Conf.Firewall.ForwardRules, + ForwardRules: f.ConfigManager.GetPendingConfig().Firewall.ForwardRules, }, nil } + +type CreateForwardRuleParameters struct { + ForwardRule definitions.ForwardRule `json:"forward_rule"` +} + +func (f *Firewall) CreateForwardRule(ctx context.Context, params CreateForwardRuleParameters) (struct{}, error) { + t, conf := f.ConfigManager.StartTransaction() + defer t.Discard() + + conf.Firewall.ForwardRules = append(conf.Firewall.ForwardRules, params.ForwardRule) + return struct{}{}, t.Commit() +} + +type UpdateForwardRuleParameters struct { + Index uint64 `json:"index"` + ForwardRule definitions.ForwardRule `json:"forward_rule"` +} + +func (f *Firewall) UpdateForwardRule(ctx context.Context, params UpdateForwardRuleParameters) (struct{}, error) { + if int(params.Index) >= len(f.ConfigManager.GetPendingConfig().Firewall.ForwardRules) { + return struct{}{}, fmt.Errorf("ForwardRule does not Exist") + } + + t, conf := f.ConfigManager.StartTransaction() + defer t.Discard() + + conf.Firewall.ForwardRules[params.Index] = params.ForwardRule + return struct{}{}, t.Commit() +} + +type MoveForwardRuleParameters struct { + Index uint64 `json:"index"` + ToIndex uint64 `json:"to_index"` +} + +func (f *Firewall) MoveForwardRule(ctx context.Context, params MoveForwardRuleParameters) (struct{}, error) { + if int(params.Index) >= len(f.ConfigManager.GetPendingConfig().Firewall.ForwardRules) { + return struct{}{}, fmt.Errorf("ForwardRule does not Exist") + } + + t, conf := f.ConfigManager.StartTransaction() + defer t.Discard() + + rule := conf.Firewall.ForwardRules[params.Index] + sliceWithoutRule := append(conf.Firewall.ForwardRules[:params.Index], conf.Firewall.ForwardRules[params.Index+1:]...) + newSlice := make([]definitions.ForwardRule, params.ToIndex+1) + copy(newSlice, sliceWithoutRule[:params.ToIndex]) + newSlice[params.ToIndex] = rule + conf.Firewall.ForwardRules = append(newSlice, sliceWithoutRule[params.ToIndex:]...) + + return struct{}{}, t.Commit() +} + +type DeleteForwardRuleParameters struct { + Index uint64 `json:"index"` +} + +func (f *Firewall) DeleteForwardRule(ctx context.Context, params DeleteForwardRuleParameters) (struct{}, error) { + if int(params.Index) >= len(f.ConfigManager.GetPendingConfig().Firewall.ForwardRules) { + return struct{}{}, fmt.Errorf("ForwardRule does not Exist") + } + + t, conf := f.ConfigManager.StartTransaction() + defer t.Discard() + + conf.Firewall.ForwardRules = append(conf.Firewall.ForwardRules[:params.Index], conf.Firewall.ForwardRules[params.Index+1:]...) + return struct{}{}, t.Commit() +} diff --git a/internal/api/firewall/source_nat_rules.go b/internal/api/firewall/source_nat_rules.go index 0933760..6abe25a 100644 --- a/internal/api/firewall/source_nat_rules.go +++ b/internal/api/firewall/source_nat_rules.go @@ -2,19 +2,85 @@ package firewall import ( "context" + "fmt" "nfsense.net/nfsense/internal/definitions" ) -type GetSourceNATRulesParameters struct { -} - type GetSourceNATRulesResult struct { - SourceNATRules []definitions.SourceNATRule + SourceNATRules []definitions.SourceNATRule `json:"source_nat_rules"` } -func (f *Firewall) GetSourceNATRules(ctx context.Context, params GetForwardRulesParameters) (GetSourceNATRulesResult, error) { +func (f *Firewall) GetSourceNATRules(ctx context.Context, params struct{}) (GetSourceNATRulesResult, error) { return GetSourceNATRulesResult{ - SourceNATRules: f.Conf.Firewall.SourceNATRules, + SourceNATRules: f.ConfigManager.GetPendingConfig().Firewall.SourceNATRules, }, nil } + +type CreateSourceNATRuleParameters struct { + SourceNATRule definitions.SourceNATRule `json:"source_nat_rule"` +} + +func (f *Firewall) CreateSourceNATRule(ctx context.Context, params CreateSourceNATRuleParameters) (struct{}, error) { + t, conf := f.ConfigManager.StartTransaction() + defer t.Discard() + + conf.Firewall.SourceNATRules = append(conf.Firewall.SourceNATRules, params.SourceNATRule) + return struct{}{}, t.Commit() +} + +type UpdateSourceNATRuleParameters struct { + Index uint64 `json:"index"` + SourceNATRule definitions.SourceNATRule `json:"source_nat_rule"` +} + +func (f *Firewall) UpdateSourceNATRule(ctx context.Context, params UpdateSourceNATRuleParameters) (struct{}, error) { + if int(params.Index) >= len(f.ConfigManager.GetPendingConfig().Firewall.SourceNATRules) { + return struct{}{}, fmt.Errorf("SourceNATRule does not Exist") + } + + t, conf := f.ConfigManager.StartTransaction() + defer t.Discard() + + conf.Firewall.SourceNATRules[params.Index] = params.SourceNATRule + return struct{}{}, t.Commit() +} + +type MoveSourceNATRuleParameters struct { + Index uint64 `json:"index"` + ToIndex uint64 `json:"to_index"` +} + +func (f *Firewall) MoveSourceNATRule(ctx context.Context, params MoveSourceNATRuleParameters) (struct{}, error) { + if int(params.Index) >= len(f.ConfigManager.GetPendingConfig().Firewall.SourceNATRules) { + return struct{}{}, fmt.Errorf("SourceNATRule does not Exist") + } + + t, conf := f.ConfigManager.StartTransaction() + defer t.Discard() + + rule := conf.Firewall.SourceNATRules[params.Index] + sliceWithoutRule := append(conf.Firewall.SourceNATRules[:params.Index], conf.Firewall.SourceNATRules[params.Index+1:]...) + newSlice := make([]definitions.SourceNATRule, params.ToIndex+1) + copy(newSlice, sliceWithoutRule[:params.ToIndex]) + newSlice[params.ToIndex] = rule + conf.Firewall.SourceNATRules = append(newSlice, sliceWithoutRule[params.ToIndex:]...) + + return struct{}{}, t.Commit() +} + +type DeleteSourceNATRuleParameters struct { + Index uint64 `json:"index"` +} + +func (f *Firewall) DeleteSourceNATRule(ctx context.Context, params DeleteSourceNATRuleParameters) (struct{}, error) { + if int(params.Index) >= len(f.ConfigManager.GetPendingConfig().Firewall.SourceNATRules) { + return struct{}{}, fmt.Errorf("SourceNATRule does not Exist") + } + + t, conf := f.ConfigManager.StartTransaction() + defer t.Discard() + + conf.Firewall.SourceNATRules = append(conf.Firewall.SourceNATRules[:params.Index], conf.Firewall.SourceNATRules[params.Index+1:]...) + return struct{}{}, t.Commit() +} diff --git a/internal/api/network/interfaces.go b/internal/api/network/interfaces.go new file mode 100644 index 0000000..0b5656a --- /dev/null +++ b/internal/api/network/interfaces.go @@ -0,0 +1,86 @@ +package network + +import ( + "context" + "fmt" + + "nfsense.net/nfsense/internal/definitions" + "nfsense.net/nfsense/internal/networkd/dbus" +) + +type GetLinksResult struct { + Links []dbus.Link +} + +func (f *Network) GetLinks(ctx context.Context, params struct{}) (GetLinksResult, error) { + links, err := dbus.GetLinks(*f.DbusConn) + if err != nil { + return GetLinksResult{}, fmt.Errorf("Getting Links: %w", err) + } + return GetLinksResult{ + Links: links, + }, nil +} + +type GetInterfacesResult struct { + Interfaces map[string]definitions.Interface +} + +func (f *Network) GetInterfaces(ctx context.Context, params struct{}) (GetInterfacesResult, error) { + return GetInterfacesResult{ + Interfaces: f.ConfigManager.GetPendingConfig().Network.Interfaces, + }, nil +} + +type CreateInterfaceParameters struct { + Name string + definitions.Interface +} + +func (f *Network) CreateInterface(ctx context.Context, params CreateInterfaceParameters) (struct{}, error) { + _, ok := f.ConfigManager.GetPendingConfig().Network.Interfaces[params.Name] + if ok { + return struct{}{}, fmt.Errorf("Interface already Exists") + } + + t, conf := f.ConfigManager.StartTransaction() + defer t.Discard() + + conf.Network.Interfaces[params.Name] = params.Interface + return struct{}{}, t.Commit() +} + +type UpdateInterfaceParameters struct { + Name string + definitions.Interface +} + +func (f *Network) UpdateInterface(ctx context.Context, params UpdateInterfaceParameters) (struct{}, error) { + _, ok := f.ConfigManager.GetPendingConfig().Network.Interfaces[params.Name] + if !ok { + return struct{}{}, fmt.Errorf("Interface does not Exist") + } + + t, conf := f.ConfigManager.StartTransaction() + defer t.Discard() + + conf.Network.Interfaces[params.Name] = params.Interface + return struct{}{}, t.Commit() +} + +type DeleteInterfaceParameters struct { + Name string +} + +func (f *Network) DeleteInterface(ctx context.Context, params DeleteInterfaceParameters) (struct{}, error) { + _, ok := f.ConfigManager.GetPendingConfig().Network.Interfaces[params.Name] + if !ok { + return struct{}{}, fmt.Errorf("Interface does not Exist") + } + + t, conf := f.ConfigManager.StartTransaction() + defer t.Discard() + + delete(conf.Network.Interfaces, params.Name) + return struct{}{}, t.Commit() +} diff --git a/internal/api/network/network.go b/internal/api/network/network.go new file mode 100644 index 0000000..4811b49 --- /dev/null +++ b/internal/api/network/network.go @@ -0,0 +1,11 @@ +package network + +import ( + "github.com/godbus/dbus/v5" + "nfsense.net/nfsense/internal/config" +) + +type Network struct { + ConfigManager *config.ConfigManager + DbusConn *dbus.Conn +} diff --git a/internal/api/network/static_routes.go b/internal/api/network/static_routes.go new file mode 100644 index 0000000..1ce276b --- /dev/null +++ b/internal/api/network/static_routes.go @@ -0,0 +1,59 @@ +package network + +import ( + "context" + "fmt" + + "nfsense.net/nfsense/internal/definitions" +) + +type GetStaticRoutesResult struct { + StaticRoutes []definitions.StaticRoute +} + +func (f *Network) GetStaticRoutes(ctx context.Context, params struct{}) (GetStaticRoutesResult, error) { + return GetStaticRoutesResult{ + StaticRoutes: f.ConfigManager.GetPendingConfig().Network.StaticRoutes, + }, nil +} + +func (f *Network) CreateStaticRoute(ctx context.Context, params definitions.StaticRoute) (struct{}, error) { + t, conf := f.ConfigManager.StartTransaction() + defer t.Discard() + + conf.Network.StaticRoutes = append(conf.Network.StaticRoutes, params) + return struct{}{}, t.Commit() +} + +type UpdateStaticRouteParameters struct { + Index uint + definitions.StaticRoute +} + +func (f *Network) UpdateStaticRoute(ctx context.Context, params UpdateStaticRouteParameters) (struct{}, error) { + if int(params.Index) >= len(f.ConfigManager.GetPendingConfig().Firewall.DestinationNATRules) { + return struct{}{}, fmt.Errorf("StaticRoute does not Exist") + } + + t, conf := f.ConfigManager.StartTransaction() + defer t.Discard() + + conf.Network.StaticRoutes = append(conf.Network.StaticRoutes, params.StaticRoute) + return struct{}{}, t.Commit() +} + +type DeleteStaticRouteParameters struct { + Index uint +} + +func (f *Network) DeleteStaticRoute(ctx context.Context, params DeleteStaticRouteParameters) (struct{}, error) { + if int(params.Index) >= len(f.ConfigManager.GetPendingConfig().Firewall.DestinationNATRules) { + return struct{}{}, fmt.Errorf("StaticRoute does not Exist") + } + + t, conf := f.ConfigManager.StartTransaction() + defer t.Discard() + + conf.Network.StaticRoutes = append(conf.Network.StaticRoutes[:params.Index], conf.Network.StaticRoutes[params.Index+1:]...) + return struct{}{}, t.Commit() +} diff --git a/internal/api/object/addresses.go b/internal/api/object/addresses.go index 971e940..3dde45b 100644 --- a/internal/api/object/addresses.go +++ b/internal/api/object/addresses.go @@ -2,19 +2,70 @@ package object import ( "context" + "fmt" "nfsense.net/nfsense/internal/definitions" ) -type GetAddressesParameters struct { -} - type GetAddressesResult struct { Addresses map[string]definitions.Address } -func (f *Object) GetAddresses(ctx context.Context, params GetAddressesParameters) (GetAddressesResult, error) { +func (f *Object) GetAddresses(ctx context.Context, params struct{}) (GetAddressesResult, error) { return GetAddressesResult{ - Addresses: f.Conf.Object.Addresses, + Addresses: f.ConfigManager.GetPendingConfig().Object.Addresses, }, nil } + +type CreateAddressParameters struct { + Name string + Address definitions.Address +} + +func (f *Object) CreateAddress(ctx context.Context, params CreateAddressParameters) (struct{}, error) { + _, ok := f.ConfigManager.GetPendingConfig().Object.Addresses[params.Name] + if ok { + return struct{}{}, fmt.Errorf("Address already Exists") + } + + t, conf := f.ConfigManager.StartTransaction() + defer t.Discard() + + conf.Object.Addresses[params.Name] = params.Address + return struct{}{}, t.Commit() +} + +type UpdateAddressParameters struct { + Name string + Address definitions.Address +} + +func (f *Object) UpdateAddress(ctx context.Context, params UpdateAddressParameters) (struct{}, error) { + _, ok := f.ConfigManager.GetPendingConfig().Object.Addresses[params.Name] + if !ok { + return struct{}{}, fmt.Errorf("Address does not Exist") + } + + t, conf := f.ConfigManager.StartTransaction() + defer t.Discard() + + conf.Object.Addresses[params.Name] = params.Address + return struct{}{}, t.Commit() +} + +type DeleteAddressParameters struct { + Name string +} + +func (f *Object) DeleteAddress(ctx context.Context, params DeleteAddressParameters) (struct{}, error) { + _, ok := f.ConfigManager.GetPendingConfig().Object.Addresses[params.Name] + if !ok { + return struct{}{}, fmt.Errorf("Interface does not Exist") + } + + t, conf := f.ConfigManager.StartTransaction() + defer t.Discard() + + delete(conf.Object.Addresses, params.Name) + return struct{}{}, t.Commit() +} diff --git a/internal/api/object/object.go b/internal/api/object/object.go index 3324fca..e34d905 100644 --- a/internal/api/object/object.go +++ b/internal/api/object/object.go @@ -1,7 +1,7 @@ package object -import "nfsense.net/nfsense/internal/definitions" +import "nfsense.net/nfsense/internal/config" type Object struct { - Conf *definitions.Config + ConfigManager *config.ConfigManager } diff --git a/internal/api/object/services.go b/internal/api/object/services.go index 44a2343..756c11a 100644 --- a/internal/api/object/services.go +++ b/internal/api/object/services.go @@ -2,19 +2,70 @@ package object import ( "context" + "fmt" "nfsense.net/nfsense/internal/definitions" ) -type GetServicesParameters struct { -} - type GetServicesResult struct { Services map[string]definitions.Service } -func (f *Object) GetServices(ctx context.Context, params GetServicesParameters) (GetServicesResult, error) { +func (f *Object) GetServices(ctx context.Context, params struct{}) (GetServicesResult, error) { return GetServicesResult{ - Services: f.Conf.Object.Services, + Services: f.ConfigManager.GetPendingConfig().Object.Services, }, nil } + +type CreateServiceParameters struct { + Name string + Service definitions.Service +} + +func (f *Object) CreateService(ctx context.Context, params CreateServiceParameters) (struct{}, error) { + _, ok := f.ConfigManager.GetPendingConfig().Object.Services[params.Name] + if ok { + return struct{}{}, fmt.Errorf("Service already Exists") + } + + t, conf := f.ConfigManager.StartTransaction() + defer t.Discard() + + conf.Object.Services[params.Name] = params.Service + return struct{}{}, t.Commit() +} + +type UpdateServiceParameters struct { + Name string + Service definitions.Service +} + +func (f *Object) UpdateService(ctx context.Context, params UpdateServiceParameters) (struct{}, error) { + _, ok := f.ConfigManager.GetPendingConfig().Object.Services[params.Name] + if !ok { + return struct{}{}, fmt.Errorf("Service does not Exist") + } + + t, conf := f.ConfigManager.StartTransaction() + defer t.Discard() + + conf.Object.Services[params.Name] = params.Service + return struct{}{}, t.Commit() +} + +type DeleteServiceParameters struct { + Name string +} + +func (f *Object) DeleteService(ctx context.Context, params DeleteServiceParameters) (struct{}, error) { + _, ok := f.ConfigManager.GetPendingConfig().Object.Services[params.Name] + if !ok { + return struct{}{}, fmt.Errorf("Interface does not Exist") + } + + t, conf := f.ConfigManager.StartTransaction() + defer t.Discard() + + delete(conf.Object.Services, params.Name) + return struct{}{}, t.Commit() +} diff --git a/internal/config/apply.go b/internal/config/apply.go new file mode 100644 index 0000000..8b18d94 --- /dev/null +++ b/internal/config/apply.go @@ -0,0 +1,52 @@ +package config + +import ( + "fmt" + "os" + + "golang.org/x/exp/slog" + "nfsense.net/nfsense/internal/definitions" +) + +// ApplyPendingChanges Takes all pending Changes and Tries to Apply them using the Registered Apply Functions. +// In Case of error it Attempts to Revert to the Current Config +func (m *ConfigManager) ApplyPendingChanges() error { + slog.Info("Applying Pending Changes...") + for _, fn := range m.applyFunctions { + err := fn(*m.currentConfig, *m.pendingConfig) + if err != nil { + slog.Error("Applying Pending Changes", err) + err2 := revertToCurrent(m) + if err2 != nil { + slog.Error("Reverting Error", err2) + return fmt.Errorf("Apply Error %w; Reverting Error %w", err, err2) + } + return err + } + } + m.currentConfig = m.pendingConfig.Clone() + + err := m.saveConfig(m.currentConfigFilePath, m.pendingConfig) + if err != nil { + return fmt.Errorf("Save Current Config: %w", err) + } + err = os.Remove(m.pendingConfigFilePath) + if err != nil { + return fmt.Errorf("Delete Pending Config: %w", err) + } + return nil +} + +func revertToCurrent(m *ConfigManager) error { + for _, fn := range m.applyFunctions { + err := fn(*m.pendingConfig, *m.currentConfig) + if err != nil { + return err + } + } + return nil +} + +func (m *ConfigManager) RegisterApplyFunction(fn func(currentConfig definitions.Config, pendingConfig definitions.Config) error) { + m.applyFunctions = append(m.applyFunctions, fn) +} diff --git a/internal/config/diff.go b/internal/config/diff.go new file mode 100644 index 0000000..4175b6d --- /dev/null +++ b/internal/config/diff.go @@ -0,0 +1,11 @@ +package config + +import "github.com/r3labs/diff/v3" + +func (m *ConfigManager) AreChangesPending() bool { + return diff.Changed(m.currentConfig, m.pendingConfig) +} + +func (m *ConfigManager) GetPendingChangelog() (diff.Changelog, error) { + return diff.Diff(m.currentConfig, m.pendingConfig, diff.SliceOrdering(true)) +} diff --git a/internal/config/discard.go b/internal/config/discard.go new file mode 100644 index 0000000..f4163ae --- /dev/null +++ b/internal/config/discard.go @@ -0,0 +1,16 @@ +package config + +import ( + "errors" + "os" +) + +func (m *ConfigManager) DiscardPendingConfig() error { + m.pendingConfig = m.currentConfig.Clone() + + err := os.Remove(m.pendingConfigFilePath) + if !errors.Is(err, os.ErrNotExist) { + return err + } + return nil +} diff --git a/internal/config/get.go b/internal/config/get.go new file mode 100644 index 0000000..f778196 --- /dev/null +++ b/internal/config/get.go @@ -0,0 +1,11 @@ +package config + +import "nfsense.net/nfsense/internal/definitions" + +func (m *ConfigManager) GetCurrentConfig() definitions.Config { + return *m.currentConfig.Clone() +} + +func (m *ConfigManager) GetPendingConfig() definitions.Config { + return *m.pendingConfig.Clone() +} diff --git a/internal/config/load.go b/internal/config/load.go new file mode 100644 index 0000000..1bd064a --- /dev/null +++ b/internal/config/load.go @@ -0,0 +1,57 @@ +package config + +import ( + "encoding/json" + "fmt" + "os" + + "nfsense.net/nfsense/internal/definitions" +) + +func (m *ConfigManager) LoadCurrentConfigFromDisk() error { + var config definitions.Config + configFile, err := os.Open(m.currentConfigFilePath) + if err != nil { + return fmt.Errorf("opening Config File %w", err) + } + defer configFile.Close() + + jsonParser := json.NewDecoder(configFile) + jsonParser.DisallowUnknownFields() + err = jsonParser.Decode(&config) + if err != nil { + return fmt.Errorf("decoding Config File %w", err) + } + + err = definitions.ValidateConfig(&config) + if err != nil { + return fmt.Errorf("validating Config: %w", err) + } + + m.currentConfig = &config + return nil +} + +func (m *ConfigManager) LoadPendingConfigFromDisk() error { + var config definitions.Config + configFile, err := os.Open(m.pendingConfigFilePath) + if err != nil { + return fmt.Errorf("opening Config File %w", err) + } + defer configFile.Close() + + jsonParser := json.NewDecoder(configFile) + jsonParser.DisallowUnknownFields() + err = jsonParser.Decode(&config) + if err != nil { + return fmt.Errorf("decoding Config File %w", err) + } + + err = definitions.ValidateConfig(&config) + if err != nil { + return fmt.Errorf("validating Config: %w", err) + } + + m.pendingConfig = &config + return nil +} diff --git a/internal/config/manager.go b/internal/config/manager.go new file mode 100644 index 0000000..ac748dc --- /dev/null +++ b/internal/config/manager.go @@ -0,0 +1,29 @@ +package config + +import ( + "sync" + + "nfsense.net/nfsense/internal/definitions" +) + +type ConfigManager struct { + currentConfigFilePath string + pendingConfigFilePath string + + currentConfig *definitions.Config + pendingConfig *definitions.Config + + transactionMutex sync.Mutex + + applyFunctions []func(currentConfig definitions.Config, pendingConfig definitions.Config) error +} + +func CreateConfigManager() *ConfigManager { + manager := ConfigManager{ + currentConfigFilePath: "config.json", + pendingConfigFilePath: "pending.json", + currentConfig: &definitions.Config{}, + pendingConfig: &definitions.Config{}, + } + return &manager +} diff --git a/internal/config/save.go b/internal/config/save.go new file mode 100644 index 0000000..73f95f0 --- /dev/null +++ b/internal/config/save.go @@ -0,0 +1,23 @@ +package config + +import ( + "encoding/json" + "fmt" + "os" + + "nfsense.net/nfsense/internal/definitions" +) + +func (m *ConfigManager) saveConfig(path string, conf *definitions.Config) error { + data, err := json.MarshalIndent(conf, "", " ") + if err != nil { + return fmt.Errorf("Marshal Config: %w", err) + } + + err = os.WriteFile(path, data, 0644) + if err != nil { + return fmt.Errorf("Write Config: %w", err) + } + + return nil +} diff --git a/internal/config/transaction.go b/internal/config/transaction.go new file mode 100644 index 0000000..f9c8fdb --- /dev/null +++ b/internal/config/transaction.go @@ -0,0 +1,62 @@ +package config + +import ( + "fmt" + "sync" + + "nfsense.net/nfsense/internal/definitions" +) + +type ConfigTransaction struct { + finished bool + mutex sync.Mutex + configManager *ConfigManager + changes *definitions.Config +} + +func (m *ConfigManager) StartTransaction() (*ConfigTransaction, *definitions.Config) { + m.transactionMutex.Lock() + confCopy := m.pendingConfig.Clone() + return &ConfigTransaction{ + configManager: m, + changes: confCopy, + }, confCopy +} + +func (t *ConfigTransaction) Commit() error { + t.mutex.Lock() + defer t.mutex.Unlock() + + if t.finished { + return fmt.Errorf("transaction already finished") + } + + t.finished = true + defer t.configManager.transactionMutex.Unlock() + + err := definitions.ValidateConfig(t.changes) + if err != nil { + return fmt.Errorf("validating Config before Apply: %w", err) + } + + err = t.configManager.saveConfig(t.configManager.pendingConfigFilePath, t.changes) + if err != nil { + return fmt.Errorf("Save Current Config: %w", err) + } + + t.configManager.pendingConfig = t.changes.Clone() + + return nil +} + +// Discard Discards the Transaction. +// Is a noop if The Transaction Already Finished due to a Commit() or another Discard() +func (t *ConfigTransaction) Discard() { + t.mutex.Lock() + defer t.mutex.Unlock() + + if !t.finished { + t.finished = true + t.configManager.transactionMutex.Unlock() + } +} diff --git a/internal/definitions/address.go b/internal/definitions/address.go index 9394a2f..0a86e99 100644 --- a/internal/definitions/address.go +++ b/internal/definitions/address.go @@ -8,12 +8,12 @@ import ( ) type Address struct { - Type AddressType `json:"type" validate:"min=0,max=3"` - Comment string `json:"comment,omitempty"` - Host *netip.Addr `json:"host,omitempty" validate:"excluded_unless=Type 0"` - Range *netipx.IPRange `json:"range,omitempty" validate:"excluded_unless=Type 1"` - Network *IPNet `json:"network,omitempty" validate:"excluded_unless=Type 2"` - Children *[]string `json:"children,omitempty"` + Type AddressType `json:"type" validate:"min=0,max=3"` + Comment string `json:"comment,omitempty"` + Host *netip.Addr `json:"host,omitempty" validate:"excluded_unless=Type 0"` + Range *netipx.IPRange `json:"range,omitempty" validate:"excluded_unless=Type 1"` + NetworkAddress *IPNet `json:"network,omitempty" validate:"excluded_unless=Type 2"` + Children *[]string `json:"children,omitempty"` } type AddressType int @@ -21,7 +21,7 @@ type AddressType int const ( Host AddressType = iota Range - Network + NetworkAddress AddressGroup ) @@ -33,7 +33,7 @@ func (t *AddressType) FromString(input string) AddressType { return map[string]AddressType{ "host": Host, "range": Range, - "network": Network, + "network": NetworkAddress, "group": AddressGroup, }[input] } diff --git a/internal/definitions/config.go b/internal/definitions/config.go index 8669570..fa1d004 100644 --- a/internal/definitions/config.go +++ b/internal/definitions/config.go @@ -1,6 +1,7 @@ package definitions import ( + "encoding/json" "fmt" "github.com/go-playground/validator/v10" @@ -11,6 +12,21 @@ type Config struct { ConfigVersion uint64 `json:"config_version" validate:"required,eq=1"` Firewall Firewall `json:"firewall" validate:"required,dive"` Object Object `json:"object" validate:"required,dive"` + Network Network `json:"network" validate:"required,dive"` +} + +// Clone TODO find a better way to deep copy +func (c *Config) Clone() *Config { + data, err := json.Marshal(c) + if err != nil { + panic(fmt.Errorf("Marshal Error: %w", err)) + } + var clone Config + err = json.Unmarshal(data, &clone) + if err != nil { + panic(fmt.Errorf("Unmarshal Error: %w", err)) + } + return &clone } func ValidateConfig(conf *Config) error { diff --git a/internal/definitions/hardwareaddress.go b/internal/definitions/hardwareaddress.go new file mode 100644 index 0000000..07f3a67 --- /dev/null +++ b/internal/definitions/hardwareaddress.go @@ -0,0 +1,30 @@ +package definitions + +import ( + "encoding/json" + "net" +) + +type HardwareAddress struct { + net.HardwareAddr +} + +// MarshalJSON for IPCIDR +func (i HardwareAddress) MarshalJSON() ([]byte, error) { + return json.Marshal(i.String()) +} + +// UnmarshalJSON for IPCIDR +func (i *HardwareAddress) UnmarshalJSON(b []byte) error { + var s string + if err := json.Unmarshal(b, &s); err != nil { + return err + } + + mac, err := net.ParseMAC(s) + if err != nil { + return err + } + i.HardwareAddr = mac + return nil +} diff --git a/internal/definitions/interface.go b/internal/definitions/interface.go new file mode 100644 index 0000000..f757349 --- /dev/null +++ b/internal/definitions/interface.go @@ -0,0 +1,89 @@ +package definitions + +import ( + "encoding/json" +) + +type Interface struct { + Alias string `json:"alias,omitempty" validate:"min=0,max=3"` + Type InterfaceType `json:"type" validate:"min=0,max=3"` + AddressingMode InterfaceAddressingMode `json:"addressing_mode" validate:"min=0,max=2"` + Address *IPCIDR `json:"address,omitempty" validate:"excluded_unless=AddressingMode 1"` + HardwareDevice *string `json:"hardware_device,omitempty"` + // TODO fix Validator for int pointers with min=0,max=4094 + VlanID *uint `json:"vlan_id,omitempty"` + VlanParent *string `json:"vlan_parent,omitempty"` + BondMembers *[]string `json:"bond_members,omitempty"` + BridgeMembers *[]string `json:"bridge_members,omitempty"` + Comment string `json:"comment,omitempty"` +} + +type InterfaceType int + +const ( + Hardware InterfaceType = iota + Vlan + Bond + Bridge +) + +func (t InterfaceType) String() string { + return [...]string{"hardware", "vlan", "bond", "bridge"}[t] +} + +func (t *InterfaceType) FromString(input string) InterfaceType { + return map[string]InterfaceType{ + "hardware": Hardware, + "vlan": Vlan, + "bond": Bond, + "bridge": Bridge, + }[input] +} + +func (t InterfaceType) MarshalJSON() ([]byte, error) { + return json.Marshal(t.String()) +} + +func (t *InterfaceType) UnmarshalJSON(b []byte) error { + var s string + err := json.Unmarshal(b, &s) + if err != nil { + return err + } + *t = t.FromString(s) + return nil +} + +type InterfaceAddressingMode int + +const ( + None InterfaceAddressingMode = iota + Static + Dhcp +) + +func (t InterfaceAddressingMode) String() string { + return [...]string{"none", "static", "dhcp"}[t] +} + +func (t *InterfaceAddressingMode) FromString(input string) InterfaceAddressingMode { + return map[string]InterfaceAddressingMode{ + "none": None, + "static": Static, + "dhcp": Dhcp, + }[input] +} + +func (t InterfaceAddressingMode) MarshalJSON() ([]byte, error) { + return json.Marshal(t.String()) +} + +func (t *InterfaceAddressingMode) UnmarshalJSON(b []byte) error { + var s string + err := json.Unmarshal(b, &s) + if err != nil { + return err + } + *t = t.FromString(s) + return nil +} diff --git a/internal/definitions/ipcidr.go b/internal/definitions/ipcidr.go new file mode 100644 index 0000000..480ef07 --- /dev/null +++ b/internal/definitions/ipcidr.go @@ -0,0 +1,32 @@ +package definitions + +import ( + "encoding/json" + "net" +) + +// IPCIDR is IP Address with the mask in CIDR format +type IPCIDR struct { + net.IPNet +} + +// MarshalJSON for IPCIDR +func (i IPCIDR) MarshalJSON() ([]byte, error) { + return json.Marshal(i.String()) +} + +// UnmarshalJSON for IPCIDR +func (i *IPCIDR) UnmarshalJSON(b []byte) error { + var s string + if err := json.Unmarshal(b, &s); err != nil { + return err + } + + ip, ipnet, err := net.ParseCIDR(s) + if err != nil { + return err + } + i.IPNet = *ipnet + i.IPNet.IP = ip + return nil +} diff --git a/internal/definitions/network.go b/internal/definitions/network.go new file mode 100644 index 0000000..c3840ce --- /dev/null +++ b/internal/definitions/network.go @@ -0,0 +1,6 @@ +package definitions + +type Network struct { + Interfaces map[string]Interface `json:"interfaces" validate:"required,dive"` + StaticRoutes []StaticRoute `json:"static_routes" validate:"required,dive"` +} diff --git a/internal/definitions/static_route.go b/internal/definitions/static_route.go new file mode 100644 index 0000000..c5b6b52 --- /dev/null +++ b/internal/definitions/static_route.go @@ -0,0 +1,13 @@ +package definitions + +import ( + "net/netip" +) + +type StaticRoute struct { + Name string `json:"name,omitempty"` + Interface string `json:"interface,omitempty"` + Gateway netip.Addr `json:"gateway,omitempty"` + Destination IPNet `json:"destination,omitempty"` + Metric uint `json:"metric,omitempty"` +} diff --git a/internal/jsonrpc/handler.go b/internal/jsonrpc/handler.go index 27d34d0..278d3cc 100644 --- a/internal/jsonrpc/handler.go +++ b/internal/jsonrpc/handler.go @@ -81,7 +81,8 @@ func (h *Handler) HandleRequest(ctx context.Context, s *session.Session, r io.Re defer func() { if r := recover(); r != nil { - slog.Error("Recovered Panic Executing API Method", fmt.Errorf("%v", r), "method", req.Method, "id", req.ID, "stack", debug.Stack()) + slog.Error("Recovered Panic Executing API Method", fmt.Errorf("%v", r), "method", req.Method, "params", fmt.Sprintf("%+v", params[2]), "id", req.ID, "stack", debug.Stack()) + respondError(w, req.ID, ErrInternalError, fmt.Errorf("%v", r)) } }() res := method.handlerFunc.Call(params) @@ -89,8 +90,9 @@ func (h *Handler) HandleRequest(ctx context.Context, s *session.Session, r io.Re if !res[1].IsNil() { reqerr := res[1].Interface().(error) - slog.Error("API Method", reqerr, "method", req.Method, "id", req.ID) + slog.Error("API Method", reqerr, "method", req.Method, "id", req.ID, "params", fmt.Sprintf("%+v", params[2])) respondError(w, req.ID, ErrInternalError, reqerr) + return nil } respondResult(w, req.ID, result) diff --git a/internal/networkd/apply.go b/internal/networkd/apply.go new file mode 100644 index 0000000..21757f6 --- /dev/null +++ b/internal/networkd/apply.go @@ -0,0 +1,75 @@ +package networkd + +import ( + "bytes" + "fmt" + "os" + "os/exec" + "path/filepath" + + "golang.org/x/exp/slog" + "nfsense.net/nfsense/internal/definitions" +) + +const basepath = "/etc/systemd/network" + +func ApplyNetworkdConfiguration(currentConfig definitions.Config, pendingConfig definitions.Config) error { + files, err := GenerateNetworkdConfiguration(pendingConfig) + if err != nil { + return fmt.Errorf("Generating Networkd Configuration: %w", err) + } + + err = RemoveContents(basepath) + if err != nil { + return fmt.Errorf("Removing old Config Files: %w", err) + } + + for _, file := range files { + f, err := os.Create(basepath + "/" + file.Name) + if err != nil { + return fmt.Errorf("creating File: %w", err) + } + + _, err = f.WriteString(file.Content + "\n") + if err != nil { + return fmt.Errorf("writing File: %w", err) + } + + err = f.Sync() + if err != nil { + return fmt.Errorf("syncing File: %w", err) + } + } + + cmd := exec.Command("systemctl", "restart", "systemd-networkd") + + var out bytes.Buffer + cmd.Stdout = &out + + err = cmd.Run() + if err != nil { + return fmt.Errorf("restarting networkd: %w", err) + } + slog.Info("networkd output", "out", out.String()) + + return nil +} + +func RemoveContents(dir string) error { + d, err := os.Open(dir) + if err != nil { + return err + } + defer d.Close() + names, err := d.Readdirnames(-1) + if err != nil { + return err + } + for _, name := range names { + err = os.RemoveAll(filepath.Join(dir, name)) + if err != nil { + return err + } + } + return nil +} diff --git a/internal/networkd/configuration.go b/internal/networkd/configuration.go new file mode 100644 index 0000000..128b59e --- /dev/null +++ b/internal/networkd/configuration.go @@ -0,0 +1,171 @@ +package networkd + +import ( + "bytes" + "fmt" + + "golang.org/x/exp/slog" + "nfsense.net/nfsense/internal/definitions" +) + +type NetworkdConfigFile struct { + Name string + Content string +} + +type InterfaceWithName struct { + Name string + definitions.Interface + Vlans []string + StaticRoutes []definitions.StaticRoute +} + +type BondMembership struct { + Name string + BondName string +} + +type BridgeMembership struct { + Name string + BridgeName string +} + +func GenerateNetworkdConfiguration(conf definitions.Config) ([]NetworkdConfigFile, error) { + files := []NetworkdConfigFile{} + + // Step 1 Generate vlan netdev files + for name, inter := range conf.Network.Interfaces { + if inter.Type == definitions.Vlan { + buf := new(bytes.Buffer) + err := templates.ExecuteTemplate(buf, "create-vlan.netdev.tmpl", InterfaceWithName{ + Name: name, + Interface: inter, + }) + if err != nil { + return nil, fmt.Errorf("executing create-vlan.netdev.tmpl template: %w", err) + } + files = append(files, NetworkdConfigFile{ + Name: fmt.Sprintf("10-create-vlan-%v.netdev", name), + Content: buf.String(), + }) + } + } + + // Step 2 Generate bond netdev files + for name, inter := range conf.Network.Interfaces { + if inter.Type == definitions.Bond { + buf := new(bytes.Buffer) + err := templates.ExecuteTemplate(buf, "create-bond.netdev.tmpl", InterfaceWithName{ + Name: name, + Interface: inter, + }) + if err != nil { + return nil, fmt.Errorf("executing create-bond.netdev.tmpl template: %w", err) + } + files = append(files, NetworkdConfigFile{ + Name: fmt.Sprintf("20-create-bond-%v.netdev", name), + Content: buf.String(), + }) + } + } + + // Step 3 Generate bridge netdev files + for name, inter := range conf.Network.Interfaces { + if inter.Type == definitions.Bridge { + buf := new(bytes.Buffer) + err := templates.ExecuteTemplate(buf, "create-bridge.netdev.tmpl", InterfaceWithName{ + Name: name, + Interface: inter, + }) + if err != nil { + return nil, fmt.Errorf("executing create-bridge.netdev.tmpl template: %w", err) + } + files = append(files, NetworkdConfigFile{ + Name: fmt.Sprintf("30-create-bridge-%v.netdev", name), + Content: buf.String(), + }) + } + } + + // Step 4 Generate Bond Members + for name, inter := range conf.Network.Interfaces { + if inter.Type == definitions.Bond && inter.BondMembers != nil { + for _, member := range *inter.BondMembers { + buf := new(bytes.Buffer) + err := templates.ExecuteTemplate(buf, "bond-membership.network.tmpl", BondMembership{ + Name: member, + BondName: name, + }) + if err != nil { + return nil, fmt.Errorf("executing bond-membership.network.tmpl template: %w", err) + } + files = append(files, NetworkdConfigFile{ + Name: fmt.Sprintf("40-bond-membership-%v.network", name), + Content: buf.String(), + }) + } + } + } + + // Step 5 Generate Bridge Members + for name, inter := range conf.Network.Interfaces { + if inter.Type == definitions.Bridge && inter.BridgeMembers != nil { + for _, member := range *inter.BridgeMembers { + buf := new(bytes.Buffer) + err := templates.ExecuteTemplate(buf, "bridge-membership.network.tmpl", BridgeMembership{ + Name: member, + BridgeName: name, + }) + if err != nil { + return nil, fmt.Errorf("executing bridge-membership.network.tmpl template: %w", err) + } + files = append(files, NetworkdConfigFile{ + Name: fmt.Sprintf("50-bridge-membership-%v.network", name), + Content: buf.String(), + }) + } + } + } + + // Step 6 Generate addressing network files + for name, inter := range conf.Network.Interfaces { + // Vlans + vlans := []string{} + if inter.Type != definitions.Vlan { + vlans := []string{} + for vlanName, vlanInter := range conf.Network.Interfaces { + if vlanInter.Type == definitions.Vlan { + if *vlanInter.VlanParent == name { + vlans = append(vlans, vlanName) + } + } + } + slog.Info("Vlans on interface", "interface", name, "count", len(vlans)) + } + + // Static Routes + staticRoutes := []definitions.StaticRoute{} + for _, route := range conf.Network.StaticRoutes { + if route.Interface == name { + staticRoutes = append(staticRoutes, route) + } + } + + buf := new(bytes.Buffer) + err := templates.ExecuteTemplate(buf, "config-addressing.network.tmpl", InterfaceWithName{ + Name: name, + Interface: inter, + Vlans: vlans, + StaticRoutes: staticRoutes, + }) + if err != nil { + return nil, fmt.Errorf("executing config-addressing.network.tmpl template: %w", err) + } + files = append(files, NetworkdConfigFile{ + Name: fmt.Sprintf("60-config-addressing-%v.network", name), + Content: buf.String(), + }) + } + + return files, nil +} diff --git a/internal/networkd/dbus/link.go b/internal/networkd/dbus/link.go new file mode 100644 index 0000000..e11b0d2 --- /dev/null +++ b/internal/networkd/dbus/link.go @@ -0,0 +1,48 @@ +package dbus + +import ( + "fmt" + + "github.com/godbus/dbus/v5" + "golang.org/x/exp/slog" +) + +type Link struct { + Name string `json:"name"` + CarrierState string `json:"carrier_state"` + OperationalState string `json:"operational_state"` +} + +func GetLinks(dbusConn dbus.Conn) ([]Link, error) { + managerObj := dbusConn.Object("org.freedesktop.network1", dbus.ObjectPath("/org/freedesktop/network1")) + + var links [][]any + err := managerObj.Call("org.freedesktop.network1.Manager.ListLinks", 0).Store(&links) + if err != nil { + return nil, fmt.Errorf("Calling ListLinks %w", err) + } + slog.Info("Dbus Result", "links", links) + + result := []Link{} + + for _, link := range links { + name := link[1].(string) + path := link[2].(dbus.ObjectPath) + linkObj := dbusConn.Object("org.freedesktop.network1", path) + carrierState, err := linkObj.GetProperty("org.freedesktop.network1.Link.CarrierState") + if err != nil { + return nil, fmt.Errorf("GetProperty CarrierState %w", err) + } + operationalState, err := linkObj.GetProperty("org.freedesktop.network1.Link.OperationalState") + if err != nil { + return nil, fmt.Errorf("GetProperty OperationalState %w", err) + } + result = append(result, Link{ + Name: name, + CarrierState: carrierState.String(), + OperationalState: operationalState.String(), + }) + } + + return result, nil +} diff --git a/internal/networkd/template.go b/internal/networkd/template.go new file mode 100644 index 0000000..70cf99d --- /dev/null +++ b/internal/networkd/template.go @@ -0,0 +1,19 @@ +package networkd + +import ( + "embed" + "text/template" +) + +//go:embed template +var templateFS embed.FS +var templates *template.Template + +func init() { + + var err error + templates, err = template.New("").ParseFS(templateFS, "template/*.tmpl") + if err != nil { + panic(err) + } +} diff --git a/internal/networkd/template/bond-membership.network.tmpl b/internal/networkd/template/bond-membership.network.tmpl new file mode 100644 index 0000000..1e87faf --- /dev/null +++ b/internal/networkd/template/bond-membership.network.tmpl @@ -0,0 +1,9 @@ +[Match] +{{- if eq .Type 0 }} +Name={{ .HardwareDevice }} +{{- else }} +Name={{ .Name }} +{{- end }} + +[Network] +Bond={{ .BondName }} diff --git a/internal/networkd/template/bridge-membership.network.tmpl b/internal/networkd/template/bridge-membership.network.tmpl new file mode 100644 index 0000000..fe1b0b6 --- /dev/null +++ b/internal/networkd/template/bridge-membership.network.tmpl @@ -0,0 +1,9 @@ +[Match] +{{- if eq .Type 0 }} +Name={{ .HardwareDevice }} +{{- else }} +Name={{ .Name }} +{{- end }} + +[Network] +Bridge={{ .BridgeName }} diff --git a/internal/networkd/template/config-addressing.network.tmpl b/internal/networkd/template/config-addressing.network.tmpl new file mode 100644 index 0000000..a9dafb9 --- /dev/null +++ b/internal/networkd/template/config-addressing.network.tmpl @@ -0,0 +1,26 @@ +[Match] +{{- if eq .Type 0 }} +Name={{ .HardwareDevice }} +{{- else }} +Name={{ .Name }} +{{- end }} + +[Network] +LLMNR=no +{{- if eq .AddressingMode 1 }} +Address={{ .Address }} +{{- else if eq .AddressingMode 2 }} +DHCP=yes +{{- end }} +{{- range .Vlans }} +VLAN={{ . }} +{{- end}} + +{{- range .StaticRoutes }} +[Route] +Destination={{ .Destination }} +Gateway={{ .Gateway }} +{{- if ne .Metric 0 }} +Metric={{ .Metric }} +{{- end }} +{{end}} \ No newline at end of file diff --git a/internal/networkd/template/create-bond.netdev.tmpl b/internal/networkd/template/create-bond.netdev.tmpl new file mode 100644 index 0000000..dddf771 --- /dev/null +++ b/internal/networkd/template/create-bond.netdev.tmpl @@ -0,0 +1,6 @@ +[NetDev] +Name={{ .Name }} +Kind=bond + +[Bond] +Mode=active-backup \ No newline at end of file diff --git a/internal/networkd/template/create-bridge.netdev.tmpl b/internal/networkd/template/create-bridge.netdev.tmpl new file mode 100644 index 0000000..36dbb7f --- /dev/null +++ b/internal/networkd/template/create-bridge.netdev.tmpl @@ -0,0 +1,3 @@ +[NetDev] +Name={{ .Name }} +Kind=bridge \ No newline at end of file diff --git a/internal/networkd/template/create-vlan.netdev.tmpl b/internal/networkd/template/create-vlan.netdev.tmpl new file mode 100644 index 0000000..2d6b5ce --- /dev/null +++ b/internal/networkd/template/create-vlan.netdev.tmpl @@ -0,0 +1,6 @@ +[NetDev] +Name={{ .Name }} +Kind=vlan + +[VLAN] +Id={{ .VlanID }} \ No newline at end of file diff --git a/internal/nftables/match.go b/internal/nftables/match.go index da45bfc..6fb6d28 100644 --- a/internal/nftables/match.go +++ b/internal/nftables/match.go @@ -77,8 +77,8 @@ func GenerateAddressMatcher(allAddresses map[string]definitions.Address, match d sourceAddresses = append(sourceAddresses, address.Host.String()) case definitions.Range: sourceAddresses = append(sourceAddresses, address.Range.String()) - case definitions.Network: - sourceAddresses = append(sourceAddresses, address.Network.String()) + case definitions.NetworkAddress: + sourceAddresses = append(sourceAddresses, address.NetworkAddress.String()) default: panic("invalid address type") } @@ -90,8 +90,8 @@ func GenerateAddressMatcher(allAddresses map[string]definitions.Address, match d destinationAddresses = append(destinationAddresses, address.Host.String()) case definitions.Range: destinationAddresses = append(destinationAddresses, address.Range.String()) - case definitions.Network: - destinationAddresses = append(destinationAddresses, address.Network.String()) + case definitions.NetworkAddress: + destinationAddresses = append(destinationAddresses, address.NetworkAddress.String()) default: panic("invalid address type") } diff --git a/internal/server/server.go b/internal/server/server.go index d54c9ba..cfa0fe7 100644 --- a/internal/server/server.go +++ b/internal/server/server.go @@ -8,7 +8,7 @@ import ( "golang.org/x/exp/slog" - "nfsense.net/nfsense/internal/definitions" + "nfsense.net/nfsense/internal/config" "nfsense.net/nfsense/internal/jsonrpc" "nfsense.net/nfsense/internal/session" ) @@ -18,7 +18,7 @@ var mux = http.NewServeMux() var apiHandler *jsonrpc.Handler var stopCleanup chan struct{} -func StartWebserver(conf *definitions.Config, _apiHandler *jsonrpc.Handler) { +func StartWebserver(configManager *config.ConfigManager, _apiHandler *jsonrpc.Handler) { server.Addr = ":8080" server.Handler = mux apiHandler = _apiHandler diff --git a/main.go b/main.go index 939865c..eda5146 100644 --- a/main.go +++ b/main.go @@ -2,20 +2,22 @@ package main import ( "context" - "encoding/json" + "errors" "flag" - "fmt" "os" "os/signal" "syscall" "time" + "github.com/godbus/dbus/v5" "golang.org/x/exp/slog" + configAPI "nfsense.net/nfsense/internal/api/config" "nfsense.net/nfsense/internal/api/firewall" + "nfsense.net/nfsense/internal/api/network" "nfsense.net/nfsense/internal/api/object" - "nfsense.net/nfsense/internal/definitions" + "nfsense.net/nfsense/internal/config" "nfsense.net/nfsense/internal/jsonrpc" - "nfsense.net/nfsense/internal/nftables" + "nfsense.net/nfsense/internal/networkd" "nfsense.net/nfsense/internal/server" ) @@ -25,27 +27,41 @@ func main() { slog.Info("Starting...") - conf, err := LoadConfiguration("config.json") + dbusConn, err := dbus.ConnectSystemBus() if err != nil { - slog.Error("Loading Config", err) + slog.Error("Connecting to DBus", err) + // os.Exit(1) + } + defer dbusConn.Close() + + configManager := config.CreateConfigManager() + configManager.RegisterApplyFunction(networkd.ApplyNetworkdConfiguration) + + err = configManager.LoadCurrentConfigFromDisk() + if err != nil { + slog.Error("Loading Current Config", err) os.Exit(1) } - slog.Info("Config Loaded", "config", conf) + slog.Info("Config Loaded") - err = definitions.ValidateConfig(conf) + err = configManager.LoadPendingConfigFromDisk() if err != nil { - slog.Error("Validating Config", err) - os.Exit(1) + if !errors.Is(err, os.ErrNotExist) { + slog.Error("Loading Pending Config", err) + } + err = configManager.DiscardPendingConfig() + if err != nil { + slog.Error("Discarding Pending Config", err) + os.Exit(1) + } } - slog.Info("Validating Config...") - if *applyPtr { slog.Info("Applying Config...") - err := apply(conf) + err := configManager.ApplyPendingChanges() if err != nil { - slog.Error("Applying Config", err) + slog.Error("Applying Pending Config", err) os.Exit(1) } slog.Info("Config Applied, Exiting...") @@ -54,10 +70,10 @@ func main() { slog.Info("Setup API...") apiHandler := jsonrpc.NewHandler(100 << 20) - RegisterAPIMethods(apiHandler, conf) + RegisterAPIMethods(apiHandler, configManager, dbusConn) slog.Info("Starting Webserver...") - server.StartWebserver(conf, apiHandler) + server.StartWebserver(configManager, apiHandler) slog.Info("Ready.") @@ -75,38 +91,9 @@ func main() { slog.Info("Done") } -func LoadConfiguration(file string) (*definitions.Config, error) { - var config definitions.Config - configFile, err := os.Open(file) - if err != nil { - return nil, fmt.Errorf("opening Config File %w", err) - } - defer configFile.Close() - - jsonParser := json.NewDecoder(configFile) - jsonParser.DisallowUnknownFields() - err = jsonParser.Decode(&config) - if err != nil { - return nil, fmt.Errorf("decoding Config File %w", err) - } - return &config, nil -} - -func RegisterAPIMethods(apiHandler *jsonrpc.Handler, conf *definitions.Config) { - apiHandler.Register("Firewall", &firewall.Firewall{Conf: conf}) - apiHandler.Register("Object", &object.Object{Conf: conf}) -} - -func apply(conf *definitions.Config) error { - fileContent, err := nftables.GenerateNfTablesFile(*conf) - if err != nil { - return fmt.Errorf("Generating nftables file %w", err) - } - - err = nftables.ApplyNfTablesFile(fileContent) - if err != nil { - return fmt.Errorf("Applying nftables %w", err) - } - slog.Info("Wrote nftables File!") - return nil +func RegisterAPIMethods(apiHandler *jsonrpc.Handler, configManager *config.ConfigManager, dbusConn *dbus.Conn) { + apiHandler.Register("Config", &configAPI.Config{ConfigManager: configManager}) + apiHandler.Register("Firewall", &firewall.Firewall{ConfigManager: configManager}) + apiHandler.Register("Network", &network.Network{ConfigManager: configManager, DbusConn: dbusConn}) + apiHandler.Register("Object", &object.Object{ConfigManager: configManager}) }