From d13b9004c70280bd1003a8198eaf67858853b35c Mon Sep 17 00:00:00 2001 From: Paul Hildebrandt <hildebrandt@b1-systems.de> Date: Wed, 30 Oct 2024 10:44:40 +0100 Subject: [PATCH] tmp Signed-off-by: Paul Hildebrandt <hildebrandt@b1-systems.de> --- .env.example | 10 +- Dockerfile | 7 + README.md | 8 +- docs/getting_started.md | 6 + package.json | 13 +- pnpm-lock.yaml | 479 +++++++----------- src/app/auth.ts | 9 - src/app/page.tsx | 8 +- .../custom/FieldTemplate/FieldTemplate.tsx | 1 - .../form/custom/SelectWidget/SelectWidget.tsx | 194 +++++-- .../form/custom/SubmitButton/SubmitButton.tsx | 39 +- .../form/custom/SubmitButton/old.tsx | 59 +++ src/components/form/download-button.tsx | 13 +- src/components/form/form.tsx | 110 +--- src/components/form/uischema.ts | 18 +- src/components/header.tsx | 4 +- src/components/ui/avatar.tsx | 50 -- src/lib/utils.ts | 135 ++++- 18 files changed, 599 insertions(+), 564 deletions(-) create mode 100644 src/components/form/custom/SubmitButton/old.tsx delete mode 100644 src/components/ui/avatar.tsx diff --git a/.env.example b/.env.example index c1a20e7..df6f96d 100644 --- a/.env.example +++ b/.env.example @@ -1,6 +1,6 @@ -API_URL=https://capi-jsgen.moin.k8s.scs.community +API_URL= # URL of your capi-jsgen instance -AUTH_SECRET= -DEX_URL=https://dex.k8s.scs.community -DEX_CLIENT_ID= -DEX_CLIENT_SECRET= \ No newline at end of file +AUTH_SECRET= # Generate with `openssl rand -base64 32` +AUTH_TRUST_HOST=TRUE +DEX_URL= # URL of your dex instance +DEX_CLIENT_ID= # Client ID of your dex client \ No newline at end of file diff --git a/Dockerfile b/Dockerfile index 3a6858f..7f2fe0d 100644 --- a/Dockerfile +++ b/Dockerfile @@ -22,6 +22,13 @@ WORKDIR /app ENV NODE_ENV production ENV NEXT_TELEMETRY_DISABLED 1 +ENV API_URL https://capi-jsgen.moin.k8s.scs.community + +#ENV AUTH_SECRET +#ENV AUTH_TRUST_HOST TRUE +#ENV DEX_URL +#ENV DEX_CLIENT_ID + RUN addgroup --system --gid 1001 nodejs RUN adduser --system --uid 1001 nextjs diff --git a/README.md b/README.md index df8c0ef..877cefe 100644 --- a/README.md +++ b/README.md @@ -4,7 +4,7 @@ Web UI for creating Cluster objects based on SCS Cluster Stacks. ## Workflow -- Read ClusterClass schema definitions from the kube-apiserver of the moin-cluster via the API provided by [capi-jsgen](https://github.com/SovereignCloudStack/capi-jsgen) +- Read ClusterClass schema definitions from the kube-apiserver of your cluster via the API provided by [capi-jsgen](https://github.com/SovereignCloudStack/capi-jsgen) - Render yaml form with live editor - On Download: perform form validation, create yaml file and open up download prompt @@ -31,6 +31,12 @@ Web UI for creating Cluster objects based on SCS Cluster Stacks. - [pnpm](https://pnpm.io/installation) +#### Environment variables + +- Create a `.env` file similar to `.env.example` in the root of the application and fill in all values. + +#### Start the development server + ```bash pnpm i pnpm dev diff --git a/docs/getting_started.md b/docs/getting_started.md index 044852a..6938d0f 100644 --- a/docs/getting_started.md +++ b/docs/getting_started.md @@ -16,6 +16,12 @@ Alternatively you can simply follow the setup instructions outlined below to dep - [pnpm](https://pnpm.io/installation) +#### Environment variables + +- Create a `.env` file similar to `.env.example` in the root of the application and fill in all values. + +#### Start the development server + ```bash pnpm i pnpm dev diff --git a/package.json b/package.json index e6088f7..3208cc6 100644 --- a/package.json +++ b/package.json @@ -13,7 +13,6 @@ }, "dependencies": { "@hookform/resolvers": "^3.9.0", - "@radix-ui/react-avatar": "^1.1.1", "@radix-ui/react-checkbox": "^1.1.2", "@radix-ui/react-dropdown-menu": "^2.1.2", "@radix-ui/react-icons": "^1.3.0", @@ -33,14 +32,14 @@ "geist": "^1.3.1", "install": "^0.13.0", "js-yaml": "^4.1.0", - "lucide-react": "^0.452.0", + "lucide-react": "^0.453.0", "next": "14.2.15", "next-auth": "5.0.0-beta.22", "next-themes": "^0.3.0", "react": "^18.3.1", "react-dom": "^18.3.1", - "react-hook-form": "^7.53.0", - "react-syntax-highlighter": "^15.5.0", + "react-hook-form": "^7.53.1", + "react-syntax-highlighter": "^15.6.1", "react-wrap-balancer": "^1.1.1", "sort-json": "^2.0.1", "tailwind-merge": "^2.5.4", @@ -51,20 +50,20 @@ }, "devDependencies": { "@types/js-yaml": "^4.0.9", - "@types/node": "^22.7.5", + "@types/node": "^22.7.7", "@types/react": "^18.3.11", "@types/react-dom": "^18.3.1", "@types/react-syntax-highlighter": "^15.5.13", "@types/sort-json": "^2.0.3", "autoprefixer": "^10.4.20", - "eslint": "^9.12.0", + "eslint": "^9.13.0", "eslint-config-next": "14.2.15", "eslint-config-prettier": "^9.1.0", "postcss": "^8.4.47", "prettier": "^3.3.3", "prettier-plugin-tailwindcss": "^0.6.8", "shiki": "^1.22.0", - "tailwindcss": "^3.4.13", + "tailwindcss": "^3.4.14", "typescript": "^5.6.3" } } diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index aaf7a21..f497c6f 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -10,10 +10,7 @@ importers: dependencies: '@hookform/resolvers': specifier: ^3.9.0 - version: 3.9.0(react-hook-form@7.53.0(react@18.3.1)) - '@radix-ui/react-avatar': - specifier: ^1.1.1 - version: 1.1.1(@types/react-dom@18.3.1)(@types/react@18.3.11)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + version: 3.9.0(react-hook-form@7.53.1(react@18.3.1)) '@radix-ui/react-checkbox': specifier: ^1.1.2 version: 1.1.2(@types/react-dom@18.3.1)(@types/react@18.3.11)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) @@ -72,8 +69,8 @@ importers: specifier: ^4.1.0 version: 4.1.0 lucide-react: - specifier: ^0.452.0 - version: 0.452.0(react@18.3.1) + specifier: ^0.453.0 + version: 0.453.0(react@18.3.1) next: specifier: 14.2.15 version: 14.2.15(react-dom@18.3.1(react@18.3.1))(react@18.3.1) @@ -90,11 +87,11 @@ importers: specifier: ^18.3.1 version: 18.3.1(react@18.3.1) react-hook-form: - specifier: ^7.53.0 - version: 7.53.0(react@18.3.1) + specifier: ^7.53.1 + version: 7.53.1(react@18.3.1) react-syntax-highlighter: - specifier: ^15.5.0 - version: 15.5.0(react@18.3.1) + specifier: ^15.6.1 + version: 15.6.1(react@18.3.1) react-wrap-balancer: specifier: ^1.1.1 version: 1.1.1(react@18.3.1) @@ -106,7 +103,7 @@ importers: version: 2.5.4 tailwindcss-animate: specifier: ^1.0.7 - version: 1.0.7(tailwindcss@3.4.13) + version: 1.0.7(tailwindcss@3.4.14) vaul: specifier: ^1.1.0 version: 1.1.0(@types/react-dom@18.3.1)(@types/react@18.3.11)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) @@ -121,8 +118,8 @@ importers: specifier: ^4.0.9 version: 4.0.9 '@types/node': - specifier: ^22.7.5 - version: 22.7.5 + specifier: ^22.7.7 + version: 22.7.7 '@types/react': specifier: ^18.3.11 version: 18.3.11 @@ -139,14 +136,14 @@ importers: specifier: ^10.4.20 version: 10.4.20(postcss@8.4.47) eslint: - specifier: ^9.12.0 - version: 9.12.0(jiti@2.3.3) + specifier: ^9.13.0 + version: 9.13.0(jiti@2.3.3) eslint-config-next: specifier: 14.2.15 - version: 14.2.15(eslint@9.12.0(jiti@2.3.3))(typescript@5.6.3) + version: 14.2.15(eslint@9.13.0(jiti@2.3.3))(typescript@5.6.3) eslint-config-prettier: specifier: ^9.1.0 - version: 9.1.0(eslint@9.12.0(jiti@2.3.3)) + version: 9.1.0(eslint@9.13.0(jiti@2.3.3)) postcss: specifier: ^8.4.47 version: 8.4.47 @@ -160,8 +157,8 @@ importers: specifier: ^1.22.0 version: 1.22.0 tailwindcss: - specifier: ^3.4.13 - version: 3.4.13 + specifier: ^3.4.14 + version: 3.4.14 typescript: specifier: ^5.6.3 version: 5.6.3 @@ -204,24 +201,24 @@ packages: resolution: {integrity: sha512-fTxvnS1sRMu3+JjXwJG0j/i4RT9u4qJ+lqS/yCGap4lH4zZGzQ7tu+xZqQmcMZq5OBZDL4QRxQzRjkWcGt8IVw==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - '@eslint/core@0.6.0': - resolution: {integrity: sha512-8I2Q8ykA4J0x0o7cg67FPVnehcqWTBehu/lmY+bolPFHGjh49YzGBMXTvpqVgEbBdvNCSxj6iFgiIyHzf03lzg==} + '@eslint/core@0.7.0': + resolution: {integrity: sha512-xp5Jirz5DyPYlPiKat8jaq0EmYvDXKKpzTbxXMpT9eqlRJkRKIz9AGMdlvYjih+im+QlhWrpvVjl8IPC/lHlUw==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} '@eslint/eslintrc@3.1.0': resolution: {integrity: sha512-4Bfj15dVJdoy3RfZmmo86RK1Fwzn6SstsvK9JS+BaVKqC6QQQQyXekNaC+g+LKNgkQ+2VhGAzm6hO40AhMR3zQ==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - '@eslint/js@9.12.0': - resolution: {integrity: sha512-eohesHH8WFRUprDNyEREgqP6beG6htMeUYeCpkEgBCieCMme5r9zFWjzAJp//9S+Kub4rqE+jXe9Cp1a7IYIIA==} + '@eslint/js@9.13.0': + resolution: {integrity: sha512-IFLyoY4d72Z5y/6o/BazFBezupzI/taV8sGumxTAVw3lXG9A6md1Dc34T9s1FoD/an9pJH8RHbAxsaEbBed9lA==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} '@eslint/object-schema@2.1.4': resolution: {integrity: sha512-BsWiH1yFGjXXS2yvrf5LyuoSIIbPrGUWob917o+BTKuZ7qJdxX8aJLRxs1fS9n6r7vESrq1OUqb68dANcFXuQQ==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - '@eslint/plugin-kit@0.2.0': - resolution: {integrity: sha512-vH9PiIMMwvhCx31Af3HiGzsVNULDbyVkHXwlemn/B0TFj/00ho3y55efXrUZTfQipxoHC5u4xq6zblww1zm1Ig==} + '@eslint/plugin-kit@0.2.1': + resolution: {integrity: sha512-HFZ4Mp26nbWk9d/BpvP0YNL6W4UoZF0VFcTw/aPPA8RpOxeFQgK+ClABGgAUXs9Y/RGX/l1vOmrqz1MQt9MNuw==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} '@floating-ui/core@1.6.8': @@ -387,19 +384,6 @@ packages: '@types/react-dom': optional: true - '@radix-ui/react-avatar@1.1.1': - resolution: {integrity: sha512-eoOtThOmxeoizxpX6RiEsQZ2wj5r4+zoeqAwO0cBaFQGjJwIH3dIX0OCxNrCyrrdxG+vBweMETh3VziQG7c1kw==} - peerDependencies: - '@types/react': '*' - '@types/react-dom': '*' - react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc - react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc - peerDependenciesMeta: - '@types/react': - optional: true - '@types/react-dom': - optional: true - '@radix-ui/react-checkbox@1.1.2': resolution: {integrity: sha512-/i0fl686zaJbDQLNKrkCbMyDm6FQMt4jg323k7HuqitoANm9sE23Ql8yOK3Wusk34HSLKDChhMux05FnP6KUkw==} peerDependencies: @@ -1002,8 +986,8 @@ packages: '@types/mdast@4.0.4': resolution: {integrity: sha512-kGaNbPh1k7AFzgpud/gMdvIm5xuECykRR+JnWKQno9TAXVa6WIVCGTPvYGekIDL4uwCZQSYbUxNBSb1aUo79oA==} - '@types/node@22.7.5': - resolution: {integrity: sha512-jML7s2NAzMWc//QSJ1a3prpk78cOPchGvXJsC3C6R6PSMoooztvRVQEz89gmBTBY1SPMaqo5teB4uNHPdetShQ==} + '@types/node@22.7.7': + resolution: {integrity: sha512-SRxCrrg9CL/y54aiMCG3edPKdprgMVGDXjA3gB8UmmBW5TcXzRUYAh8EWzTnSJFAd1rgImPELza+A3bJ+qxz8Q==} '@types/prop-types@15.7.13': resolution: {integrity: sha512-hCZTSvwbzWGvhqxp/RqVqwU999pBf2vp7hzIjiYOsl8wqOmUxkQ6ddw1cV3l8811+kdUFus/q4d1Y3E3SyEifA==} @@ -1026,8 +1010,8 @@ packages: '@types/unist@3.0.3': resolution: {integrity: sha512-ko/gIFJRv177XgZsZcBwnqJN5x/Gien8qNOn0D5bQU/zAzVf9Zt3BlcUiLqhV9y4ARk0GbT3tnUiPNgnTXzc/Q==} - '@typescript-eslint/eslint-plugin@8.9.0': - resolution: {integrity: sha512-Y1n621OCy4m7/vTXNlCbMVp87zSd7NH0L9cXD8aIpOaNlzeWxIK4+Q19A68gSmTNRZn92UjocVUWDthGxtqHFg==} + '@typescript-eslint/eslint-plugin@8.10.0': + resolution: {integrity: sha512-phuB3hoP7FFKbRXxjl+DRlQDuJqhpOnm5MmtROXyWi3uS/Xg2ZXqiQfcG2BJHiN4QKyzdOJi3NEn/qTnjUlkmQ==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: '@typescript-eslint/parser': ^8.0.0 || ^8.0.0-alpha.0 @@ -1037,8 +1021,8 @@ packages: typescript: optional: true - '@typescript-eslint/parser@8.9.0': - resolution: {integrity: sha512-U+BLn2rqTTHnc4FL3FJjxaXptTxmf9sNftJK62XLz4+GxG3hLHm/SUNaaXP5Y4uTiuYoL5YLy4JBCJe3+t8awQ==} + '@typescript-eslint/parser@8.10.0': + resolution: {integrity: sha512-E24l90SxuJhytWJ0pTQydFT46Nk0Z+bsLKo/L8rtQSL93rQ6byd1V/QbDpHUTdLPOMsBCcYXZweADNCfOCmOAg==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: eslint: ^8.57.0 || ^9.0.0 @@ -1047,12 +1031,12 @@ packages: typescript: optional: true - '@typescript-eslint/scope-manager@8.9.0': - resolution: {integrity: sha512-bZu9bUud9ym1cabmOYH9S6TnbWRzpklVmwqICeOulTCZ9ue2/pczWzQvt/cGj2r2o1RdKoZbuEMalJJSYw3pHQ==} + '@typescript-eslint/scope-manager@8.10.0': + resolution: {integrity: sha512-AgCaEjhfql9MDKjMUxWvH7HjLeBqMCBfIaBbzzIcBbQPZE7CPh1m6FF+L75NUMJFMLYhCywJXIDEMa3//1A0dw==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - '@typescript-eslint/type-utils@8.9.0': - resolution: {integrity: sha512-JD+/pCqlKqAk5961vxCluK+clkppHY07IbV3vett97KOV+8C6l+CPEPwpUuiMwgbOz/qrN3Ke4zzjqbT+ls+1Q==} + '@typescript-eslint/type-utils@8.10.0': + resolution: {integrity: sha512-PCpUOpyQSpxBn230yIcK+LeCQaXuxrgCm2Zk1S+PTIRJsEfU6nJ0TtwyH8pIwPK/vJoA+7TZtzyAJSGBz+s/dg==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: typescript: '*' @@ -1060,12 +1044,12 @@ packages: typescript: optional: true - '@typescript-eslint/types@8.9.0': - resolution: {integrity: sha512-SjgkvdYyt1FAPhU9c6FiYCXrldwYYlIQLkuc+LfAhCna6ggp96ACncdtlbn8FmnG72tUkXclrDExOpEYf1nfJQ==} + '@typescript-eslint/types@8.10.0': + resolution: {integrity: sha512-k/E48uzsfJCRRbGLapdZgrX52csmWJ2rcowwPvOZ8lwPUv3xW6CcFeJAXgx4uJm+Ge4+a4tFOkdYvSpxhRhg1w==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - '@typescript-eslint/typescript-estree@8.9.0': - resolution: {integrity: sha512-9iJYTgKLDG6+iqegehc5+EqE6sqaee7kb8vWpmHZ86EqwDjmlqNNHeqDVqb9duh+BY6WCNHfIGvuVU3Tf9Db0g==} + '@typescript-eslint/typescript-estree@8.10.0': + resolution: {integrity: sha512-3OE0nlcOHaMvQ8Xu5gAfME3/tWVDpb/HxtpUZ1WeOAksZ/h/gwrBzCklaGzwZT97/lBbbxJ16dMA98JMEngW4w==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: typescript: '*' @@ -1073,14 +1057,14 @@ packages: typescript: optional: true - '@typescript-eslint/utils@8.9.0': - resolution: {integrity: sha512-PKgMmaSo/Yg/F7kIZvrgrWa1+Vwn036CdNUvYFEkYbPwOH4i8xvkaRlu148W3vtheWK9ckKRIz7PBP5oUlkrvQ==} + '@typescript-eslint/utils@8.10.0': + resolution: {integrity: sha512-Oq4uZ7JFr9d1ZunE/QKy5egcDRXT/FrS2z/nlxzPua2VHFtmMvFNDvpq1m/hq0ra+T52aUezfcjGRIB7vNJF9w==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: eslint: ^8.57.0 || ^9.0.0 - '@typescript-eslint/visitor-keys@8.9.0': - resolution: {integrity: sha512-Ht4y38ubk4L5/U8xKUBfKNYGmvKvA1CANoxiTRMM+tOLk3lbF3DvzZCxJCRSE+2GdCMSh6zq9VZJc3asc1XuAA==} + '@typescript-eslint/visitor-keys@8.10.0': + resolution: {integrity: sha512-k8nekgqwr7FadWk548Lfph6V3r9OVqjzAIVskE7orMZR23cGJjAOVazsZSJW+ElyjfTM4wx/1g88Mi70DDtG9A==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} '@ungap/structured-clone@1.2.0': @@ -1091,8 +1075,8 @@ packages: peerDependencies: acorn: ^6.0.0 || ^7.0.0 || ^8.0.0 - acorn@8.12.1: - resolution: {integrity: sha512-tcpGyI9zbizT9JbV6oYE477V6mTlXvvi0T0G3SNIYE2apm/G5huBa1+K89VGeovbg+jycCrfhl3ADxErOuO6Jg==} + acorn@8.13.0: + resolution: {integrity: sha512-8zSiw54Oxrdym50NlZ9sUusyO1Z1ZchgRLWRaK6c86XJFClyCgFKetdowBg5bKxyp/u+CDBJG4Mpp0m3HLZl9w==} engines: {node: '>=0.4.0'} hasBin: true @@ -1143,8 +1127,9 @@ packages: resolution: {integrity: sha512-y+CcFFwelSXpLZk/7fMB2mUbGtX9lKycf1MWJ7CaTIERyitVlyQx6C+sxcROU2BAJ24OiZyK+8wj2i8AlBoS3A==} engines: {node: '>=10'} - aria-query@5.1.3: - resolution: {integrity: sha512-R5iJ5lkuHybztUfuOAznmboyjWq8O6sqNqtK7CLOqdydi54VNbORp49mb14KbWgG1QD3JFO9hJdZ+y4KutfdOQ==} + aria-query@5.3.2: + resolution: {integrity: sha512-COROpnaoap1E2F000S62r6A60uHZnmlvomhfyT2DlTcrY1OrBKn2UhH7qn5wTC9zMvD0AY7csdPSNwKP+7WiQw==} + engines: {node: '>= 0.4'} array-buffer-byte-length@1.0.1: resolution: {integrity: sha512-ahC5W1xgou+KTXix4sAO8Ki12Q+jf4i0+tmk3sC+zgcynshkHxzpXdImBehiUYKKKDwvfFiJl1tZt6ewscS1Mg==} @@ -1192,8 +1177,8 @@ packages: resolution: {integrity: sha512-wvUjBtSGN7+7SjNpq/9M2Tg350UZD3q62IFZLbRAR1bSMlCo1ZaeW+BJ+D090e4hIIZLBcTDWe4Mh4jvUDajzQ==} engines: {node: '>= 0.4'} - axe-core@4.10.0: - resolution: {integrity: sha512-Mr2ZakwQ7XUAjp7pAwQWRhhK8mQQ6JAaNWSjmjxil0R8BPioMtQsTLOolGYkji1rcL++3dCqZA3zWqpT+9Ew6g==} + axe-core@4.10.1: + resolution: {integrity: sha512-qPC9o+kD8Tir0lzNGLeghbOrWMr3ZJpaRlCIb6Uobt/7N4FiEDvqUMnxzCHRHmg8vOg14kr5gVNyScRmbMaJ9g==} engines: {node: '>=4'} axobject-query@4.1.0: @@ -1238,8 +1223,8 @@ packages: resolution: {integrity: sha512-QOSvevhslijgYwRx6Rv7zKdMF8lbRmx+uQGx2+vDc+KI/eBnsy9kit5aj23AgGu3pa4t9AgwbnXWqS+iOY+2aA==} engines: {node: '>= 6'} - caniuse-lite@1.0.30001668: - resolution: {integrity: sha512-nWLrdxqCdblixUO+27JtGJJE/txpJlyUy5YN1u53wLZkP0emYCo5zgS6QYft7VUYR42LGgi/S5hdLZTrnyIddw==} + caniuse-lite@1.0.30001669: + resolution: {integrity: sha512-DlWzFDJqstqtIVx1zeSpIMLjunf5SmwOw0N2Ck/QSQdS8PLS4+9HrLaYei4w8BIAL7IB/UEDu889d8vhCTPA0w==} ccount@2.0.1: resolution: {integrity: sha512-eyrF0jiFpY+3drT6383f1qhkbGsLSifNAjA61IUjZjmLCWjItY6LB9ft9YhoDgwfmclB2zhu51Lc7+95b8NRAg==} @@ -1361,10 +1346,6 @@ packages: supports-color: optional: true - deep-equal@2.2.3: - resolution: {integrity: sha512-ZIwpnevOurS8bpT4192sqAowWM76JDKSHYzMLty3BZGSswgq6pBaH3DhCSW5xVAZICZyKdOBPjwww5wfgT/6PA==} - engines: {node: '>= 0.4'} - deep-is@0.1.4: resolution: {integrity: sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==} @@ -1407,8 +1388,8 @@ packages: eastasianwidth@0.2.0: resolution: {integrity: sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==} - electron-to-chromium@1.5.37: - resolution: {integrity: sha512-u7000ZB/X0K78TaQqXZ5ktoR7J79B9US7IkE4zyvcILYwOGY2Tx9GRPYstn7HmuPcMxZ+BDGqIsyLpZQi9ufPw==} + electron-to-chromium@1.5.41: + resolution: {integrity: sha512-dfdv/2xNjX0P8Vzme4cfzHqnPm5xsZXwsolTYr0eyW18IUmNyG08vL+fttvinTfhKfIKdRoqkDIC9e9iWQCNYQ==} emoji-regex@8.0.0: resolution: {integrity: sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==} @@ -1432,9 +1413,6 @@ packages: resolution: {integrity: sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==} engines: {node: '>= 0.4'} - es-get-iterator@1.1.3: - resolution: {integrity: sha512-sPZmqHBe6JIiTfN5q2pEi//TwxmAFHwj/XEuYjTuse78i8KxaqMTTzxPoFKuzRpDpTJ+0NAbpfenkmH2rePtuw==} - es-iterator-helpers@1.1.0: resolution: {integrity: sha512-/SurEfycdyssORP/E+bj4sEu1CWw4EmLDsHynHwSXQ7utgbrMRWW195pTrCjFgFCddf/UkYm3oqKPRq5i8bJbw==} engines: {node: '>= 0.4'} @@ -1524,8 +1502,8 @@ packages: '@typescript-eslint/parser': optional: true - eslint-plugin-jsx-a11y@6.10.0: - resolution: {integrity: sha512-ySOHvXX8eSN6zz8Bywacm7CvGNhUtdjvqfQDVe6020TUK34Cywkw7m0KsCCk1Qtm9G1FayfTN1/7mMYnYO2Bhg==} + eslint-plugin-jsx-a11y@6.10.1: + resolution: {integrity: sha512-zHByM9WTUMnfsDTafGXRiqxp6lFtNoSOWBY6FonVRn3A+BUwN1L/tdBXT40BcBJi0cZjOGTXZ0eD/rTG9fEJ0g==} engines: {node: '>=4.0'} peerDependencies: eslint: ^3 || ^4 || ^5 || ^6 || ^7 || ^8 || ^9 @@ -1554,8 +1532,8 @@ packages: resolution: {integrity: sha512-Q7lok0mqMUSf5a/AdAZkA5a/gHcO6snwQClVNNvFKCAVlxXucdU8pKydU5ZVZjBx5xr37vGbFFWtLQYreLzrZg==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - eslint@9.12.0: - resolution: {integrity: sha512-UVIOlTEWxwIopRL1wgSQYdnVDcEvs2wyaO6DGo5mXqe3r16IoCNWkR29iHhyaP4cICWjbgbmFUGAhh0GJRuGZw==} + eslint@9.13.0: + resolution: {integrity: sha512-EYZK6SX6zjFHST/HRytOdA/zE72Cq/bfw45LSyuwrdvcclb/gqV8RRQxywOBEWO2+WDpva6UZa4CcDeJKzUCFA==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} hasBin: true peerDependencies: @@ -1597,8 +1575,8 @@ packages: fast-levenshtein@2.0.6: resolution: {integrity: sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==} - fast-uri@3.0.2: - resolution: {integrity: sha512-GR6f0hD7XXyNJa25Tb9BuIdN0tdr+0BMi6/CJPH3wJO1JjNG3n/VsSw38AwRdKZABm8lGbPfakLRkYzx2V9row==} + fast-uri@3.0.3: + resolution: {integrity: sha512-aLrHthzCjH5He4Z2H9YZ+v6Ujb9ocRuW6ZzkJQOrTxleEijANq4v1TsaPaVG1PZcuurEzrLcWRyYBYXD5cEiaw==} fastq@1.17.1: resolution: {integrity: sha512-sRVD3lWVIXWg6By68ZN7vho9a1pQcN/WBFaAAsDDFzlJjvoGx0P8z7V1t72grFJfJhu3YPZBuu25f7Kaw2jN1w==} @@ -1749,6 +1727,9 @@ packages: highlight.js@10.7.3: resolution: {integrity: sha512-tzcUFauisWKNHaRkN4Wjl/ZA07gENAjFl3J/c480dprkGTg5EQstgaNFqBfUqCq54kZRIEcreTsAgF/m2quD7A==} + highlightjs-vue@1.0.0: + resolution: {integrity: sha512-PDEfEF102G23vHmPhLyPboFCD+BkMGu+GuJe2d9/eH4FsCwvgBpnc9n0pGE+ffKdph38s6foEZiEjdgHdzp+IA==} + html-void-elements@3.0.0: resolution: {integrity: sha512-bEqo66MRXsUGxWHV5IP0PUiAWwoEjba4VCzg0LjFJBpchPaTfyfCKTG6bc5F8ucKec3q5y6qOdGyYTSBEvhCrg==} @@ -1781,10 +1762,6 @@ packages: is-alphanumerical@1.0.4: resolution: {integrity: sha512-UzoZUr+XfVz3t3v4KyGEniVL9BDRoQtY7tOyrRybkVNjDFWyo1yhXNGrrBTQxp3ib9BLAWs7k2YKBQsFRkZG9A==} - is-arguments@1.1.1: - resolution: {integrity: sha512-8Q7EARjzEnKpt/PCD7e1cgUS0a6X8u5tdSiMqXhojOdoV9TsMsiO+9VLC5vAmO8N7/GmXn7yjR8qnA6bVAEzfA==} - engines: {node: '>= 0.4'} - is-array-buffer@3.0.4: resolution: {integrity: sha512-wcjaerHw0ydZwfhiKbXJWLDY8A7yV7KhjQOpb83hGgGfId/aQa4TOvwyzn2PuswW2gPCYEL/nEAiSVpdOj1lXw==} engines: {node: '>= 0.4'} @@ -1924,8 +1901,8 @@ packages: resolution: {integrity: sha512-EX4oNDwcXSivPrw2qKH2LB5PoFxEvgtv2JgwW0bU858HoLQ+kutSvjLMUqBd0PeJYEinLWhoI9Ol0eYMqj/wNQ==} hasBin: true - jose@5.9.4: - resolution: {integrity: sha512-WBBl6au1qg6OHj67yCffCgFR3BADJBXN8MdRvCgJDuMv3driV2nHr7jdGvaKX9IolosAsn+M0XRArqLXUhyJHQ==} + jose@5.9.6: + resolution: {integrity: sha512-AMlnetc9+CV9asI19zHmrgS/WYsWUwCn2R7RzlbJWD7F9eWYUTGyBmU9o6PxngtLGOiDGPRu+Uc4fhKzbpteZQ==} js-tokens@4.0.0: resolution: {integrity: sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==} @@ -2013,8 +1990,8 @@ packages: lru-cache@10.4.3: resolution: {integrity: sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==} - lucide-react@0.452.0: - resolution: {integrity: sha512-kNefjOUOGm+Mu3KDiryONyPba9r+nhcrz5oJs3N6JDzGboQNEXw5GB3yB8rnV9/FA4bPyggNU6CRSihZm9MvSw==} + lucide-react@0.453.0: + resolution: {integrity: sha512-kL+RGZCcJi9BvJtzg2kshO192Ddy9hv3ij+cPrVPWSRzgCWCVazoQJxOjAwgK53NomL07HB7GPHW120FimjNhQ==} peerDependencies: react: ^16.5.1 || ^17.0.0 || ^18.0.0 || ^19.0.0-rc @@ -2144,10 +2121,6 @@ packages: resolution: {integrity: sha512-IRZSRuzJiynemAXPYtPe5BoI/RESNYR7TYm50MC5Mqbd3Jmw5y790sErYw3V6SryFJD64b74qQQs9wn5Bg/k3g==} engines: {node: '>= 0.4'} - object-is@1.1.6: - resolution: {integrity: sha512-F8cZ+KfGlSGi09lJT7/Nd6KJZ9ygtvYC0/UYYLI9nmQKLMnydpB9yvbv9K1uSkEu7FU9vYPmVwLg328tX+ot3Q==} - engines: {node: '>= 0.4'} - object-keys@1.1.1: resolution: {integrity: sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==} engines: {node: '>= 0.4'} @@ -2212,8 +2185,8 @@ packages: resolution: {integrity: sha512-Xa4Nw17FS9ApQFJ9umLiJS4orGjm7ZzwUrwamcGQuHSzDyth9boKDaycYdDcZDuqYATXw4HFXgaqWTctW/v1HA==} engines: {node: '>=16 || 14 >=14.18'} - picocolors@1.1.0: - resolution: {integrity: sha512-TQ92mBOW0l3LeMeyLV6mzy/kWr8lkd/hp3mTg7wYK7zJhuBStmGMBG0BdeDZS/dZx1IukaX6Bk11zcln25o1Aw==} + picocolors@1.1.1: + resolution: {integrity: sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==} picomatch@2.3.1: resolution: {integrity: sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==} @@ -2380,8 +2353,8 @@ packages: peerDependencies: react: ^18.3.1 - react-hook-form@7.53.0: - resolution: {integrity: sha512-M1n3HhqCww6S2hxLxciEXy2oISPnAzxY7gvwVPrtlczTM/1dDadXgUxDpHMrMTblDOcm/AXtXxHwZ3jpg1mqKQ==} + react-hook-form@7.53.1: + resolution: {integrity: sha512-6aiQeBda4zjcuaugWvim9WsGqisoUk+etmFEsSUMm451/Ic8L/UAb7sRtMj3V+Hdzm6mMjU1VhiSzYUZeBm0Vg==} engines: {node: '>=18.0.0'} peerDependencies: react: ^16.8.0 || ^17 || ^18 || ^19 @@ -2432,8 +2405,8 @@ packages: '@types/react': optional: true - react-syntax-highlighter@15.5.0: - resolution: {integrity: sha512-+zq2myprEnQmH5yw6Gqc8lD55QHnpKaU8TOcFeC/Lg/MQSs8UknEA0JC4nTZGFAXC2J2Hyj/ijJ7NlabyPi2gg==} + react-syntax-highlighter@15.6.1: + resolution: {integrity: sha512-OqJ2/vL7lEeV5zTJyG7kmARppUjiB9h9udl4qHQjjgEos66z00Ia0OckwYfRxCSFrW8RJIBnsBwQsHZbVPspqg==} peerDependencies: react: '>= 0.14.0' @@ -2557,10 +2530,6 @@ packages: space-separated-tokens@2.0.2: resolution: {integrity: sha512-PEGlAwrG8yXGXRjW32fGbg66JAlOAwbObuqVoJpv/mRgoWDQfgH1wDPvtzWyUSNAXBGSk8h755YDbbcEy3SH2Q==} - stop-iteration-iterator@1.0.0: - resolution: {integrity: sha512-iCGQj+0l0HOdZ2AEeBADlsRC+vsnDsZsbdSiH1yNSjcfKM7fdpCMfqAL/dwF5BLiw/XhRft/Wax6zQbhq2BcjQ==} - engines: {node: '>= 0.4'} - streamsearch@1.1.0: resolution: {integrity: sha512-Mcc5wHehp9aXz1ax6bZUyY5afg9u2rv5cqQI3mRrYkGC8rW2hM02jWuwjtL++LS5qinSyhj2QfLyNsuc+VsExg==} engines: {node: '>=10.0.0'} @@ -2573,8 +2542,9 @@ packages: resolution: {integrity: sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==} engines: {node: '>=12'} - string.prototype.includes@2.0.0: - resolution: {integrity: sha512-E34CkBgyeqNDcrbU76cDjL5JLcVrtSdYq0MEh/B10r17pRP4ciHLwTgnuLV8Ay6cgEMLkcBkFCKyFZ43YldYzg==} + string.prototype.includes@2.0.1: + resolution: {integrity: sha512-o7+c9bW6zpAdJHTtujeePODAhkuicdAryFsfVKwA+wGw89wJ4GTY484WTucM9hLtDEOpOvI+aHnzqnC5lHp4Rg==} + engines: {node: '>= 0.4'} string.prototype.matchall@4.0.11: resolution: {integrity: sha512-NUdh0aDavY2og7IbBPenWqR9exH+E26Sv8e0/eTe1tltDGZL+GtBkDAnnyBtmekfK6/Dq3MkcGtzXFEd1LQrtg==} @@ -2647,8 +2617,8 @@ packages: peerDependencies: tailwindcss: '>=3.0.0 || insiders' - tailwindcss@3.4.13: - resolution: {integrity: sha512-KqjHOJKogOUt5Bs752ykCeiwvi0fKVkr5oqsFNt/8px/tA8scFPIlkygsf6jXrfCqGHz7VflA6+yytWuM+XhFw==} + tailwindcss@3.4.14: + resolution: {integrity: sha512-IcSvOcTRcUtQQ7ILQL5quRDg7Xs93PdJEk1ZLbhhvJc7uj/OAhYOnruEiwnGgBvUtaUAJ8/mhSw1o8L2jCiENA==} engines: {node: '>=14.0.0'} hasBin: true @@ -2685,8 +2655,8 @@ packages: tsconfig-paths@3.15.0: resolution: {integrity: sha512-2Ac2RgzDe/cn48GvOe3M+o82pEFewD3UPbyoUHHdKasHwJKjds4fLXWf/Ux5kATBKN20oaFGu+jbElp1pos0mg==} - tslib@2.7.0: - resolution: {integrity: sha512-gLXCKdN1/j47AiHiOkJN69hJmcbGTHI0ImLmbYLHykhgeN0jVGola9yVjFgzCUklsZQMW55o+dW7IXv3RCXDzA==} + tslib@2.8.0: + resolution: {integrity: sha512-jWVzBLplnCmoaTr13V9dYbiQ99wvZRd0vNWaDRg+aVYRcjDF3nDksxFDE/+fkXnKhpnUUkmx5pK/v8mCtLVqZA==} type-check@0.4.0: resolution: {integrity: sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==} @@ -2853,7 +2823,7 @@ snapshots: '@panva/hkdf': 1.2.1 '@types/cookie': 0.6.0 cookie: 0.6.0 - jose: 5.9.4 + jose: 5.9.6 oauth4webapi: 2.17.0 preact: 10.11.3 preact-render-to-string: 5.2.3(preact@10.11.3) @@ -2862,9 +2832,9 @@ snapshots: dependencies: regenerator-runtime: 0.14.1 - '@eslint-community/eslint-utils@4.4.0(eslint@9.12.0(jiti@2.3.3))': + '@eslint-community/eslint-utils@4.4.0(eslint@9.13.0(jiti@2.3.3))': dependencies: - eslint: 9.12.0(jiti@2.3.3) + eslint: 9.13.0(jiti@2.3.3) eslint-visitor-keys: 3.4.3 '@eslint-community/regexpp@4.11.1': {} @@ -2877,7 +2847,7 @@ snapshots: transitivePeerDependencies: - supports-color - '@eslint/core@0.6.0': {} + '@eslint/core@0.7.0': {} '@eslint/eslintrc@3.1.0': dependencies: @@ -2893,11 +2863,11 @@ snapshots: transitivePeerDependencies: - supports-color - '@eslint/js@9.12.0': {} + '@eslint/js@9.13.0': {} '@eslint/object-schema@2.1.4': {} - '@eslint/plugin-kit@0.2.0': + '@eslint/plugin-kit@0.2.1': dependencies: levn: 0.4.1 @@ -2918,9 +2888,9 @@ snapshots: '@floating-ui/utils@0.2.8': {} - '@hookform/resolvers@3.9.0(react-hook-form@7.53.0(react@18.3.1))': + '@hookform/resolvers@3.9.0(react-hook-form@7.53.1(react@18.3.1))': dependencies: - react-hook-form: 7.53.0(react@18.3.1) + react-hook-form: 7.53.1(react@18.3.1) '@humanfs/core@0.19.0': {} @@ -3028,18 +2998,6 @@ snapshots: '@types/react': 18.3.11 '@types/react-dom': 18.3.1 - '@radix-ui/react-avatar@1.1.1(@types/react-dom@18.3.1)(@types/react@18.3.11)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': - dependencies: - '@radix-ui/react-context': 1.1.1(@types/react@18.3.11)(react@18.3.1) - '@radix-ui/react-primitive': 2.0.0(@types/react-dom@18.3.1)(@types/react@18.3.11)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@radix-ui/react-use-callback-ref': 1.1.0(@types/react@18.3.11)(react@18.3.1) - '@radix-ui/react-use-layout-effect': 1.1.0(@types/react@18.3.11)(react@18.3.1) - react: 18.3.1 - react-dom: 18.3.1(react@18.3.1) - optionalDependencies: - '@types/react': 18.3.11 - '@types/react-dom': 18.3.1 - '@radix-ui/react-checkbox@1.1.2(@types/react-dom@18.3.1)(@types/react@18.3.11)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': dependencies: '@radix-ui/primitive': 1.1.0 @@ -3621,7 +3579,7 @@ snapshots: '@swc/helpers@0.5.5': dependencies: '@swc/counter': 0.1.3 - tslib: 2.7.0 + tslib: 2.8.0 '@types/cookie@0.6.0': {} @@ -3645,7 +3603,7 @@ snapshots: dependencies: '@types/unist': 3.0.3 - '@types/node@22.7.5': + '@types/node@22.7.7': dependencies: undici-types: 6.19.8 @@ -3670,15 +3628,15 @@ snapshots: '@types/unist@3.0.3': {} - '@typescript-eslint/eslint-plugin@8.9.0(@typescript-eslint/parser@8.9.0(eslint@9.12.0(jiti@2.3.3))(typescript@5.6.3))(eslint@9.12.0(jiti@2.3.3))(typescript@5.6.3)': + '@typescript-eslint/eslint-plugin@8.10.0(@typescript-eslint/parser@8.10.0(eslint@9.13.0(jiti@2.3.3))(typescript@5.6.3))(eslint@9.13.0(jiti@2.3.3))(typescript@5.6.3)': dependencies: '@eslint-community/regexpp': 4.11.1 - '@typescript-eslint/parser': 8.9.0(eslint@9.12.0(jiti@2.3.3))(typescript@5.6.3) - '@typescript-eslint/scope-manager': 8.9.0 - '@typescript-eslint/type-utils': 8.9.0(eslint@9.12.0(jiti@2.3.3))(typescript@5.6.3) - '@typescript-eslint/utils': 8.9.0(eslint@9.12.0(jiti@2.3.3))(typescript@5.6.3) - '@typescript-eslint/visitor-keys': 8.9.0 - eslint: 9.12.0(jiti@2.3.3) + '@typescript-eslint/parser': 8.10.0(eslint@9.13.0(jiti@2.3.3))(typescript@5.6.3) + '@typescript-eslint/scope-manager': 8.10.0 + '@typescript-eslint/type-utils': 8.10.0(eslint@9.13.0(jiti@2.3.3))(typescript@5.6.3) + '@typescript-eslint/utils': 8.10.0(eslint@9.13.0(jiti@2.3.3))(typescript@5.6.3) + '@typescript-eslint/visitor-keys': 8.10.0 + eslint: 9.13.0(jiti@2.3.3) graphemer: 1.4.0 ignore: 5.3.2 natural-compare: 1.4.0 @@ -3688,28 +3646,28 @@ snapshots: transitivePeerDependencies: - supports-color - '@typescript-eslint/parser@8.9.0(eslint@9.12.0(jiti@2.3.3))(typescript@5.6.3)': + '@typescript-eslint/parser@8.10.0(eslint@9.13.0(jiti@2.3.3))(typescript@5.6.3)': dependencies: - '@typescript-eslint/scope-manager': 8.9.0 - '@typescript-eslint/types': 8.9.0 - '@typescript-eslint/typescript-estree': 8.9.0(typescript@5.6.3) - '@typescript-eslint/visitor-keys': 8.9.0 + '@typescript-eslint/scope-manager': 8.10.0 + '@typescript-eslint/types': 8.10.0 + '@typescript-eslint/typescript-estree': 8.10.0(typescript@5.6.3) + '@typescript-eslint/visitor-keys': 8.10.0 debug: 4.3.7 - eslint: 9.12.0(jiti@2.3.3) + eslint: 9.13.0(jiti@2.3.3) optionalDependencies: typescript: 5.6.3 transitivePeerDependencies: - supports-color - '@typescript-eslint/scope-manager@8.9.0': + '@typescript-eslint/scope-manager@8.10.0': dependencies: - '@typescript-eslint/types': 8.9.0 - '@typescript-eslint/visitor-keys': 8.9.0 + '@typescript-eslint/types': 8.10.0 + '@typescript-eslint/visitor-keys': 8.10.0 - '@typescript-eslint/type-utils@8.9.0(eslint@9.12.0(jiti@2.3.3))(typescript@5.6.3)': + '@typescript-eslint/type-utils@8.10.0(eslint@9.13.0(jiti@2.3.3))(typescript@5.6.3)': dependencies: - '@typescript-eslint/typescript-estree': 8.9.0(typescript@5.6.3) - '@typescript-eslint/utils': 8.9.0(eslint@9.12.0(jiti@2.3.3))(typescript@5.6.3) + '@typescript-eslint/typescript-estree': 8.10.0(typescript@5.6.3) + '@typescript-eslint/utils': 8.10.0(eslint@9.13.0(jiti@2.3.3))(typescript@5.6.3) debug: 4.3.7 ts-api-utils: 1.3.0(typescript@5.6.3) optionalDependencies: @@ -3718,12 +3676,12 @@ snapshots: - eslint - supports-color - '@typescript-eslint/types@8.9.0': {} + '@typescript-eslint/types@8.10.0': {} - '@typescript-eslint/typescript-estree@8.9.0(typescript@5.6.3)': + '@typescript-eslint/typescript-estree@8.10.0(typescript@5.6.3)': dependencies: - '@typescript-eslint/types': 8.9.0 - '@typescript-eslint/visitor-keys': 8.9.0 + '@typescript-eslint/types': 8.10.0 + '@typescript-eslint/visitor-keys': 8.10.0 debug: 4.3.7 fast-glob: 3.3.2 is-glob: 4.0.3 @@ -3735,29 +3693,29 @@ snapshots: transitivePeerDependencies: - supports-color - '@typescript-eslint/utils@8.9.0(eslint@9.12.0(jiti@2.3.3))(typescript@5.6.3)': + '@typescript-eslint/utils@8.10.0(eslint@9.13.0(jiti@2.3.3))(typescript@5.6.3)': dependencies: - '@eslint-community/eslint-utils': 4.4.0(eslint@9.12.0(jiti@2.3.3)) - '@typescript-eslint/scope-manager': 8.9.0 - '@typescript-eslint/types': 8.9.0 - '@typescript-eslint/typescript-estree': 8.9.0(typescript@5.6.3) - eslint: 9.12.0(jiti@2.3.3) + '@eslint-community/eslint-utils': 4.4.0(eslint@9.13.0(jiti@2.3.3)) + '@typescript-eslint/scope-manager': 8.10.0 + '@typescript-eslint/types': 8.10.0 + '@typescript-eslint/typescript-estree': 8.10.0(typescript@5.6.3) + eslint: 9.13.0(jiti@2.3.3) transitivePeerDependencies: - supports-color - typescript - '@typescript-eslint/visitor-keys@8.9.0': + '@typescript-eslint/visitor-keys@8.10.0': dependencies: - '@typescript-eslint/types': 8.9.0 + '@typescript-eslint/types': 8.10.0 eslint-visitor-keys: 3.4.3 '@ungap/structured-clone@1.2.0': {} - acorn-jsx@5.3.2(acorn@8.12.1): + acorn-jsx@5.3.2(acorn@8.13.0): dependencies: - acorn: 8.12.1 + acorn: 8.13.0 - acorn@8.12.1: {} + acorn@8.13.0: {} ajv-formats@2.1.1(ajv@8.17.1): optionalDependencies: @@ -3773,7 +3731,7 @@ snapshots: ajv@8.17.1: dependencies: fast-deep-equal: 3.1.3 - fast-uri: 3.0.2 + fast-uri: 3.0.3 json-schema-traverse: 1.0.0 require-from-string: 2.0.2 @@ -3800,11 +3758,9 @@ snapshots: aria-hidden@1.2.4: dependencies: - tslib: 2.7.0 + tslib: 2.8.0 - aria-query@5.1.3: - dependencies: - deep-equal: 2.2.3 + aria-query@5.3.2: {} array-buffer-byte-length@1.0.1: dependencies: @@ -3876,10 +3832,10 @@ snapshots: autoprefixer@10.4.20(postcss@8.4.47): dependencies: browserslist: 4.24.0 - caniuse-lite: 1.0.30001668 + caniuse-lite: 1.0.30001669 fraction.js: 4.3.7 normalize-range: 0.1.2 - picocolors: 1.1.0 + picocolors: 1.1.1 postcss: 8.4.47 postcss-value-parser: 4.2.0 @@ -3887,7 +3843,7 @@ snapshots: dependencies: possible-typed-array-names: 1.0.0 - axe-core@4.10.0: {} + axe-core@4.10.1: {} axobject-query@4.1.0: {} @@ -3910,8 +3866,8 @@ snapshots: browserslist@4.24.0: dependencies: - caniuse-lite: 1.0.30001668 - electron-to-chromium: 1.5.37 + caniuse-lite: 1.0.30001669 + electron-to-chromium: 1.5.41 node-releases: 2.0.18 update-browserslist-db: 1.1.1(browserslist@4.24.0) @@ -3931,7 +3887,7 @@ snapshots: camelcase-css@2.0.1: {} - caniuse-lite@1.0.30001668: {} + caniuse-lite@1.0.30001669: {} ccount@2.0.1: {} @@ -4049,27 +4005,6 @@ snapshots: dependencies: ms: 2.1.3 - deep-equal@2.2.3: - dependencies: - array-buffer-byte-length: 1.0.1 - call-bind: 1.0.7 - es-get-iterator: 1.1.3 - get-intrinsic: 1.2.4 - is-arguments: 1.1.1 - is-array-buffer: 3.0.4 - is-date-object: 1.0.5 - is-regex: 1.1.4 - is-shared-array-buffer: 1.0.3 - isarray: 2.0.5 - object-is: 1.1.6 - object-keys: 1.1.1 - object.assign: 4.1.5 - regexp.prototype.flags: 1.5.3 - side-channel: 1.0.6 - which-boxed-primitive: 1.0.2 - which-collection: 1.0.2 - which-typed-array: 1.1.15 - deep-is@0.1.4: {} define-data-property@1.1.4: @@ -4106,7 +4041,7 @@ snapshots: eastasianwidth@0.2.0: {} - electron-to-chromium@1.5.37: {} + electron-to-chromium@1.5.41: {} emoji-regex@8.0.0: {} @@ -4172,18 +4107,6 @@ snapshots: es-errors@1.3.0: {} - es-get-iterator@1.1.3: - dependencies: - call-bind: 1.0.7 - get-intrinsic: 1.2.4 - has-symbols: 1.0.3 - is-arguments: 1.1.1 - is-map: 2.0.3 - is-set: 2.0.3 - is-string: 1.0.7 - isarray: 2.0.5 - stop-iteration-iterator: 1.0.0 - es-iterator-helpers@1.1.0: dependencies: call-bind: 1.0.7 @@ -4225,19 +4148,19 @@ snapshots: escape-string-regexp@4.0.0: {} - eslint-config-next@14.2.15(eslint@9.12.0(jiti@2.3.3))(typescript@5.6.3): + eslint-config-next@14.2.15(eslint@9.13.0(jiti@2.3.3))(typescript@5.6.3): dependencies: '@next/eslint-plugin-next': 14.2.15 '@rushstack/eslint-patch': 1.10.4 - '@typescript-eslint/eslint-plugin': 8.9.0(@typescript-eslint/parser@8.9.0(eslint@9.12.0(jiti@2.3.3))(typescript@5.6.3))(eslint@9.12.0(jiti@2.3.3))(typescript@5.6.3) - '@typescript-eslint/parser': 8.9.0(eslint@9.12.0(jiti@2.3.3))(typescript@5.6.3) - eslint: 9.12.0(jiti@2.3.3) + '@typescript-eslint/eslint-plugin': 8.10.0(@typescript-eslint/parser@8.10.0(eslint@9.13.0(jiti@2.3.3))(typescript@5.6.3))(eslint@9.13.0(jiti@2.3.3))(typescript@5.6.3) + '@typescript-eslint/parser': 8.10.0(eslint@9.13.0(jiti@2.3.3))(typescript@5.6.3) + eslint: 9.13.0(jiti@2.3.3) eslint-import-resolver-node: 0.3.9 - eslint-import-resolver-typescript: 3.6.3(@typescript-eslint/parser@8.9.0(eslint@9.12.0(jiti@2.3.3))(typescript@5.6.3))(eslint-import-resolver-node@0.3.9)(eslint-plugin-import@2.31.0)(eslint@9.12.0(jiti@2.3.3)) - eslint-plugin-import: 2.31.0(@typescript-eslint/parser@8.9.0(eslint@9.12.0(jiti@2.3.3))(typescript@5.6.3))(eslint-import-resolver-typescript@3.6.3)(eslint@9.12.0(jiti@2.3.3)) - eslint-plugin-jsx-a11y: 6.10.0(eslint@9.12.0(jiti@2.3.3)) - eslint-plugin-react: 7.37.1(eslint@9.12.0(jiti@2.3.3)) - eslint-plugin-react-hooks: 5.0.0-canary-7118f5dd7-20230705(eslint@9.12.0(jiti@2.3.3)) + eslint-import-resolver-typescript: 3.6.3(@typescript-eslint/parser@8.10.0(eslint@9.13.0(jiti@2.3.3))(typescript@5.6.3))(eslint-import-resolver-node@0.3.9)(eslint-plugin-import@2.31.0)(eslint@9.13.0(jiti@2.3.3)) + eslint-plugin-import: 2.31.0(@typescript-eslint/parser@8.10.0(eslint@9.13.0(jiti@2.3.3))(typescript@5.6.3))(eslint-import-resolver-typescript@3.6.3)(eslint@9.13.0(jiti@2.3.3)) + eslint-plugin-jsx-a11y: 6.10.1(eslint@9.13.0(jiti@2.3.3)) + eslint-plugin-react: 7.37.1(eslint@9.13.0(jiti@2.3.3)) + eslint-plugin-react-hooks: 5.0.0-canary-7118f5dd7-20230705(eslint@9.13.0(jiti@2.3.3)) optionalDependencies: typescript: 5.6.3 transitivePeerDependencies: @@ -4245,9 +4168,9 @@ snapshots: - eslint-plugin-import-x - supports-color - eslint-config-prettier@9.1.0(eslint@9.12.0(jiti@2.3.3)): + eslint-config-prettier@9.1.0(eslint@9.13.0(jiti@2.3.3)): dependencies: - eslint: 9.12.0(jiti@2.3.3) + eslint: 9.13.0(jiti@2.3.3) eslint-import-resolver-node@0.3.9: dependencies: @@ -4257,37 +4180,37 @@ snapshots: transitivePeerDependencies: - supports-color - eslint-import-resolver-typescript@3.6.3(@typescript-eslint/parser@8.9.0(eslint@9.12.0(jiti@2.3.3))(typescript@5.6.3))(eslint-import-resolver-node@0.3.9)(eslint-plugin-import@2.31.0)(eslint@9.12.0(jiti@2.3.3)): + eslint-import-resolver-typescript@3.6.3(@typescript-eslint/parser@8.10.0(eslint@9.13.0(jiti@2.3.3))(typescript@5.6.3))(eslint-import-resolver-node@0.3.9)(eslint-plugin-import@2.31.0)(eslint@9.13.0(jiti@2.3.3)): dependencies: '@nolyfill/is-core-module': 1.0.39 debug: 4.3.7 enhanced-resolve: 5.17.1 - eslint: 9.12.0(jiti@2.3.3) - eslint-module-utils: 2.12.0(@typescript-eslint/parser@8.9.0(eslint@9.12.0(jiti@2.3.3))(typescript@5.6.3))(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.6.3(@typescript-eslint/parser@8.9.0(eslint@9.12.0(jiti@2.3.3))(typescript@5.6.3))(eslint-import-resolver-node@0.3.9)(eslint-plugin-import@2.31.0)(eslint@9.12.0(jiti@2.3.3)))(eslint@9.12.0(jiti@2.3.3)) + eslint: 9.13.0(jiti@2.3.3) + eslint-module-utils: 2.12.0(@typescript-eslint/parser@8.10.0(eslint@9.13.0(jiti@2.3.3))(typescript@5.6.3))(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.6.3(@typescript-eslint/parser@8.10.0(eslint@9.13.0(jiti@2.3.3))(typescript@5.6.3))(eslint-import-resolver-node@0.3.9)(eslint-plugin-import@2.31.0)(eslint@9.13.0(jiti@2.3.3)))(eslint@9.13.0(jiti@2.3.3)) fast-glob: 3.3.2 get-tsconfig: 4.8.1 is-bun-module: 1.2.1 is-glob: 4.0.3 optionalDependencies: - eslint-plugin-import: 2.31.0(@typescript-eslint/parser@8.9.0(eslint@9.12.0(jiti@2.3.3))(typescript@5.6.3))(eslint-import-resolver-typescript@3.6.3)(eslint@9.12.0(jiti@2.3.3)) + eslint-plugin-import: 2.31.0(@typescript-eslint/parser@8.10.0(eslint@9.13.0(jiti@2.3.3))(typescript@5.6.3))(eslint-import-resolver-typescript@3.6.3)(eslint@9.13.0(jiti@2.3.3)) transitivePeerDependencies: - '@typescript-eslint/parser' - eslint-import-resolver-node - eslint-import-resolver-webpack - supports-color - eslint-module-utils@2.12.0(@typescript-eslint/parser@8.9.0(eslint@9.12.0(jiti@2.3.3))(typescript@5.6.3))(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.6.3(@typescript-eslint/parser@8.9.0(eslint@9.12.0(jiti@2.3.3))(typescript@5.6.3))(eslint-import-resolver-node@0.3.9)(eslint-plugin-import@2.31.0)(eslint@9.12.0(jiti@2.3.3)))(eslint@9.12.0(jiti@2.3.3)): + eslint-module-utils@2.12.0(@typescript-eslint/parser@8.10.0(eslint@9.13.0(jiti@2.3.3))(typescript@5.6.3))(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.6.3(@typescript-eslint/parser@8.10.0(eslint@9.13.0(jiti@2.3.3))(typescript@5.6.3))(eslint-import-resolver-node@0.3.9)(eslint-plugin-import@2.31.0)(eslint@9.13.0(jiti@2.3.3)))(eslint@9.13.0(jiti@2.3.3)): dependencies: debug: 3.2.7 optionalDependencies: - '@typescript-eslint/parser': 8.9.0(eslint@9.12.0(jiti@2.3.3))(typescript@5.6.3) - eslint: 9.12.0(jiti@2.3.3) + '@typescript-eslint/parser': 8.10.0(eslint@9.13.0(jiti@2.3.3))(typescript@5.6.3) + eslint: 9.13.0(jiti@2.3.3) eslint-import-resolver-node: 0.3.9 - eslint-import-resolver-typescript: 3.6.3(@typescript-eslint/parser@8.9.0(eslint@9.12.0(jiti@2.3.3))(typescript@5.6.3))(eslint-import-resolver-node@0.3.9)(eslint-plugin-import@2.31.0)(eslint@9.12.0(jiti@2.3.3)) + eslint-import-resolver-typescript: 3.6.3(@typescript-eslint/parser@8.10.0(eslint@9.13.0(jiti@2.3.3))(typescript@5.6.3))(eslint-import-resolver-node@0.3.9)(eslint-plugin-import@2.31.0)(eslint@9.13.0(jiti@2.3.3)) transitivePeerDependencies: - supports-color - eslint-plugin-import@2.31.0(@typescript-eslint/parser@8.9.0(eslint@9.12.0(jiti@2.3.3))(typescript@5.6.3))(eslint-import-resolver-typescript@3.6.3)(eslint@9.12.0(jiti@2.3.3)): + eslint-plugin-import@2.31.0(@typescript-eslint/parser@8.10.0(eslint@9.13.0(jiti@2.3.3))(typescript@5.6.3))(eslint-import-resolver-typescript@3.6.3)(eslint@9.13.0(jiti@2.3.3)): dependencies: '@rtsao/scc': 1.1.0 array-includes: 3.1.8 @@ -4296,9 +4219,9 @@ snapshots: array.prototype.flatmap: 1.3.2 debug: 3.2.7 doctrine: 2.1.0 - eslint: 9.12.0(jiti@2.3.3) + eslint: 9.13.0(jiti@2.3.3) eslint-import-resolver-node: 0.3.9 - eslint-module-utils: 2.12.0(@typescript-eslint/parser@8.9.0(eslint@9.12.0(jiti@2.3.3))(typescript@5.6.3))(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.6.3(@typescript-eslint/parser@8.9.0(eslint@9.12.0(jiti@2.3.3))(typescript@5.6.3))(eslint-import-resolver-node@0.3.9)(eslint-plugin-import@2.31.0)(eslint@9.12.0(jiti@2.3.3)))(eslint@9.12.0(jiti@2.3.3)) + eslint-module-utils: 2.12.0(@typescript-eslint/parser@8.10.0(eslint@9.13.0(jiti@2.3.3))(typescript@5.6.3))(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.6.3(@typescript-eslint/parser@8.10.0(eslint@9.13.0(jiti@2.3.3))(typescript@5.6.3))(eslint-import-resolver-node@0.3.9)(eslint-plugin-import@2.31.0)(eslint@9.13.0(jiti@2.3.3)))(eslint@9.13.0(jiti@2.3.3)) hasown: 2.0.2 is-core-module: 2.15.1 is-glob: 4.0.3 @@ -4310,37 +4233,37 @@ snapshots: string.prototype.trimend: 1.0.8 tsconfig-paths: 3.15.0 optionalDependencies: - '@typescript-eslint/parser': 8.9.0(eslint@9.12.0(jiti@2.3.3))(typescript@5.6.3) + '@typescript-eslint/parser': 8.10.0(eslint@9.13.0(jiti@2.3.3))(typescript@5.6.3) transitivePeerDependencies: - eslint-import-resolver-typescript - eslint-import-resolver-webpack - supports-color - eslint-plugin-jsx-a11y@6.10.0(eslint@9.12.0(jiti@2.3.3)): + eslint-plugin-jsx-a11y@6.10.1(eslint@9.13.0(jiti@2.3.3)): dependencies: - aria-query: 5.1.3 + aria-query: 5.3.2 array-includes: 3.1.8 array.prototype.flatmap: 1.3.2 ast-types-flow: 0.0.8 - axe-core: 4.10.0 + axe-core: 4.10.1 axobject-query: 4.1.0 damerau-levenshtein: 1.0.8 emoji-regex: 9.2.2 es-iterator-helpers: 1.1.0 - eslint: 9.12.0(jiti@2.3.3) + eslint: 9.13.0(jiti@2.3.3) hasown: 2.0.2 jsx-ast-utils: 3.3.5 language-tags: 1.0.9 minimatch: 3.1.2 object.fromentries: 2.0.8 safe-regex-test: 1.0.3 - string.prototype.includes: 2.0.0 + string.prototype.includes: 2.0.1 - eslint-plugin-react-hooks@5.0.0-canary-7118f5dd7-20230705(eslint@9.12.0(jiti@2.3.3)): + eslint-plugin-react-hooks@5.0.0-canary-7118f5dd7-20230705(eslint@9.13.0(jiti@2.3.3)): dependencies: - eslint: 9.12.0(jiti@2.3.3) + eslint: 9.13.0(jiti@2.3.3) - eslint-plugin-react@7.37.1(eslint@9.12.0(jiti@2.3.3)): + eslint-plugin-react@7.37.1(eslint@9.13.0(jiti@2.3.3)): dependencies: array-includes: 3.1.8 array.prototype.findlast: 1.2.5 @@ -4348,7 +4271,7 @@ snapshots: array.prototype.tosorted: 1.1.4 doctrine: 2.1.0 es-iterator-helpers: 1.1.0 - eslint: 9.12.0(jiti@2.3.3) + eslint: 9.13.0(jiti@2.3.3) estraverse: 5.3.0 hasown: 2.0.2 jsx-ast-utils: 3.3.5 @@ -4371,15 +4294,15 @@ snapshots: eslint-visitor-keys@4.1.0: {} - eslint@9.12.0(jiti@2.3.3): + eslint@9.13.0(jiti@2.3.3): dependencies: - '@eslint-community/eslint-utils': 4.4.0(eslint@9.12.0(jiti@2.3.3)) + '@eslint-community/eslint-utils': 4.4.0(eslint@9.13.0(jiti@2.3.3)) '@eslint-community/regexpp': 4.11.1 '@eslint/config-array': 0.18.0 - '@eslint/core': 0.6.0 + '@eslint/core': 0.7.0 '@eslint/eslintrc': 3.1.0 - '@eslint/js': 9.12.0 - '@eslint/plugin-kit': 0.2.0 + '@eslint/js': 9.13.0 + '@eslint/plugin-kit': 0.2.1 '@humanfs/node': 0.16.5 '@humanwhocodes/module-importer': 1.0.1 '@humanwhocodes/retry': 0.3.1 @@ -4415,8 +4338,8 @@ snapshots: espree@10.2.0: dependencies: - acorn: 8.12.1 - acorn-jsx: 5.3.2(acorn@8.12.1) + acorn: 8.13.0 + acorn-jsx: 5.3.2(acorn@8.13.0) eslint-visitor-keys: 4.1.0 esquery@1.6.0: @@ -4445,7 +4368,7 @@ snapshots: fast-levenshtein@2.0.6: {} - fast-uri@3.0.2: {} + fast-uri@3.0.3: {} fastq@1.17.1: dependencies: @@ -4616,6 +4539,8 @@ snapshots: highlight.js@10.7.3: {} + highlightjs-vue@1.0.0: {} + html-void-elements@3.0.0: {} ignore@5.3.2: {} @@ -4646,11 +4571,6 @@ snapshots: is-alphabetical: 1.0.4 is-decimal: 1.0.4 - is-arguments@1.1.1: - dependencies: - call-bind: 1.0.7 - has-tostringtag: 1.0.2 - is-array-buffer@3.0.4: dependencies: call-bind: 1.0.7 @@ -4784,7 +4704,7 @@ snapshots: jiti@2.3.3: optional: true - jose@5.9.4: {} + jose@5.9.6: {} js-tokens@4.0.0: {} @@ -4865,7 +4785,7 @@ snapshots: lru-cache@10.4.3: {} - lucide-react@0.452.0(react@18.3.1): + lucide-react@0.453.0(react@18.3.1): dependencies: react: 18.3.1 @@ -4949,7 +4869,7 @@ snapshots: '@next/env': 14.2.15 '@swc/helpers': 0.5.5 busboy: 1.6.0 - caniuse-lite: 1.0.30001668 + caniuse-lite: 1.0.30001669 graceful-fs: 4.2.11 postcss: 8.4.31 react: 18.3.1 @@ -4983,11 +4903,6 @@ snapshots: object-inspect@1.13.2: {} - object-is@1.1.6: - dependencies: - call-bind: 1.0.7 - define-properties: 1.2.1 - object-keys@1.1.1: {} object.assign@4.1.5: @@ -5069,7 +4984,7 @@ snapshots: lru-cache: 10.4.3 minipass: 7.1.2 - picocolors@1.1.0: {} + picocolors@1.1.1: {} picomatch@2.3.1: {} @@ -5113,13 +5028,13 @@ snapshots: postcss@8.4.31: dependencies: nanoid: 3.3.7 - picocolors: 1.1.0 + picocolors: 1.1.1 source-map-js: 1.2.1 postcss@8.4.47: dependencies: nanoid: 3.3.7 - picocolors: 1.1.0 + picocolors: 1.1.1 source-map-js: 1.2.1 preact-render-to-string@5.2.3(preact@10.11.3): @@ -5165,7 +5080,7 @@ snapshots: react: 18.3.1 scheduler: 0.23.2 - react-hook-form@7.53.0(react@18.3.1): + react-hook-form@7.53.1(react@18.3.1): dependencies: react: 18.3.1 @@ -5177,7 +5092,7 @@ snapshots: dependencies: react: 18.3.1 react-style-singleton: 2.2.1(@types/react@18.3.11)(react@18.3.1) - tslib: 2.7.0 + tslib: 2.8.0 optionalDependencies: '@types/react': 18.3.11 @@ -5186,7 +5101,7 @@ snapshots: react: 18.3.1 react-remove-scroll-bar: 2.3.6(@types/react@18.3.11)(react@18.3.1) react-style-singleton: 2.2.1(@types/react@18.3.11)(react@18.3.1) - tslib: 2.7.0 + tslib: 2.8.0 use-callback-ref: 1.3.2(@types/react@18.3.11)(react@18.3.1) use-sidecar: 1.1.2(@types/react@18.3.11)(react@18.3.1) optionalDependencies: @@ -5197,7 +5112,7 @@ snapshots: react: 18.3.1 react-remove-scroll-bar: 2.3.6(@types/react@18.3.11)(react@18.3.1) react-style-singleton: 2.2.1(@types/react@18.3.11)(react@18.3.1) - tslib: 2.7.0 + tslib: 2.8.0 use-callback-ref: 1.3.2(@types/react@18.3.11)(react@18.3.1) use-sidecar: 1.1.2(@types/react@18.3.11)(react@18.3.1) optionalDependencies: @@ -5208,14 +5123,15 @@ snapshots: get-nonce: 1.0.1 invariant: 2.2.4 react: 18.3.1 - tslib: 2.7.0 + tslib: 2.8.0 optionalDependencies: '@types/react': 18.3.11 - react-syntax-highlighter@15.5.0(react@18.3.1): + react-syntax-highlighter@15.6.1(react@18.3.1): dependencies: '@babel/runtime': 7.25.7 highlight.js: 10.7.3 + highlightjs-vue: 1.0.0 lowlight: 1.20.0 prismjs: 1.29.0 react: 18.3.1 @@ -5361,10 +5277,6 @@ snapshots: space-separated-tokens@2.0.2: {} - stop-iteration-iterator@1.0.0: - dependencies: - internal-slot: 1.0.7 - streamsearch@1.1.0: {} string-width@4.2.3: @@ -5379,8 +5291,9 @@ snapshots: emoji-regex: 9.2.2 strip-ansi: 7.1.0 - string.prototype.includes@2.0.0: + string.prototype.includes@2.0.1: dependencies: + call-bind: 1.0.7 define-properties: 1.2.1 es-abstract: 1.23.3 @@ -5463,11 +5376,11 @@ snapshots: tailwind-merge@2.5.4: {} - tailwindcss-animate@1.0.7(tailwindcss@3.4.13): + tailwindcss-animate@1.0.7(tailwindcss@3.4.14): dependencies: - tailwindcss: 3.4.13 + tailwindcss: 3.4.14 - tailwindcss@3.4.13: + tailwindcss@3.4.14: dependencies: '@alloc/quick-lru': 5.2.0 arg: 5.0.2 @@ -5482,7 +5395,7 @@ snapshots: micromatch: 4.0.8 normalize-path: 3.0.0 object-hash: 3.0.0 - picocolors: 1.1.0 + picocolors: 1.1.1 postcss: 8.4.47 postcss-import: 15.1.0(postcss@8.4.47) postcss-js: 4.0.1(postcss@8.4.47) @@ -5525,7 +5438,7 @@ snapshots: minimist: 1.2.8 strip-bom: 3.0.0 - tslib@2.7.0: {} + tslib@2.8.0: {} type-check@0.4.0: dependencies: @@ -5601,7 +5514,7 @@ snapshots: dependencies: browserslist: 4.24.0 escalade: 3.2.0 - picocolors: 1.1.0 + picocolors: 1.1.1 uri-js@4.4.1: dependencies: @@ -5610,7 +5523,7 @@ snapshots: use-callback-ref@1.3.2(@types/react@18.3.11)(react@18.3.1): dependencies: react: 18.3.1 - tslib: 2.7.0 + tslib: 2.8.0 optionalDependencies: '@types/react': 18.3.11 @@ -5618,7 +5531,7 @@ snapshots: dependencies: detect-node-es: 1.1.0 react: 18.3.1 - tslib: 2.7.0 + tslib: 2.8.0 optionalDependencies: '@types/react': 18.3.11 diff --git a/src/app/auth.ts b/src/app/auth.ts index fe45140..ff33727 100644 --- a/src/app/auth.ts +++ b/src/app/auth.ts @@ -22,15 +22,6 @@ const config = { client: { token_endpoint_auth_method: "none", }, - profile(profile) { - return { - id: profile.sub, - name: profile.name, - email: profile.email, - groups: profile.groups, - username: profile.preferred_username, - }; - }, }, ], basePath: "/api/auth", diff --git a/src/app/page.tsx b/src/app/page.tsx index 095982f..6b5a6e8 100644 --- a/src/app/page.tsx +++ b/src/app/page.tsx @@ -1,4 +1,4 @@ -export const revalidate = 1800; // revalidate every 30mins +export const revalidate = 900; // revalidate every 15mins import sortJson from "sort-json"; @@ -19,12 +19,12 @@ async function getClusterClasses() { const res: { [key: string]: string[] } = await fetch( process.env.API_URL + "/namespaces", ).then((response) => response.json()); - const clusterstacks: string[] = res["kaas-playground0"]; + const clusterstacks: string[] = res["kaas-playground1"]; const getAll: any[] = await Promise.all( clusterstacks.map((stack: any) => fetch( - process.env.API_URL + "/clusterschema/kaas-playground0/" + stack, + process.env.API_URL + "/clusterschema/kaas-playground1/" + stack, ).then((response) => response.json()), ), ); @@ -40,7 +40,7 @@ async function getClusterClasses() { return schemas; } catch (error) { - throw new Error("Failed to fetch cluster schemas"); + throw new Error("Failed to fetch and parse cluster schemas"); } } diff --git a/src/components/form/custom/FieldTemplate/FieldTemplate.tsx b/src/components/form/custom/FieldTemplate/FieldTemplate.tsx index 26a6278..c1d386c 100644 --- a/src/components/form/custom/FieldTemplate/FieldTemplate.tsx +++ b/src/components/form/custom/FieldTemplate/FieldTemplate.tsx @@ -67,7 +67,6 @@ export default function FieldTemplate< }`} > {label.charAt(0).toUpperCase() + label.slice(1)} - {required ? "*" : null} </label> )} {children} diff --git a/src/components/form/custom/SelectWidget/SelectWidget.tsx b/src/components/form/custom/SelectWidget/SelectWidget.tsx index 6b6af3c..2b7b5c7 100644 --- a/src/components/form/custom/SelectWidget/SelectWidget.tsx +++ b/src/components/form/custom/SelectWidget/SelectWidget.tsx @@ -8,6 +8,113 @@ import { WidgetProps, } from "@rjsf/utils"; import { ChangeEvent, FocusEvent } from "react"; +import * as React from "react"; +import * as SelectPrimitive from "@radix-ui/react-select"; +import { Check, ChevronDown } from "lucide-react"; +import { cn } from "@/lib/utils"; + +const Select = SelectPrimitive.Root; + +const SelectGroup = SelectPrimitive.Group; + +const SelectValue = SelectPrimitive.Value; + +const SelectTrigger = React.forwardRef< + React.ElementRef<typeof SelectPrimitive.Trigger>, + React.ComponentPropsWithoutRef<typeof SelectPrimitive.Trigger> +>(({ className, children, ...props }, ref) => ( + <SelectPrimitive.Trigger + ref={ref} + className={cn( + "flex h-10 w-full items-center justify-between rounded-md border border-input bg-background px-3 py-2 text-sm ring-offset-background placeholder:text-muted-foreground focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 disabled:cursor-not-allowed disabled:opacity-50", + className, + )} + {...props} + > + {children} + <SelectPrimitive.Icon asChild> + <ChevronDown className="h-4 w-4 opacity-50" /> + </SelectPrimitive.Icon> + </SelectPrimitive.Trigger> +)); +SelectTrigger.displayName = SelectPrimitive.Trigger.displayName; + +const SelectContent = React.forwardRef< + React.ElementRef<typeof SelectPrimitive.Content>, + React.ComponentPropsWithoutRef<typeof SelectPrimitive.Content> +>(({ className, children, position = "popper", ...props }, ref) => ( + <SelectPrimitive.Portal> + <SelectPrimitive.Content + ref={ref} + className={cn( + "relative z-50 min-w-[8rem] overflow-hidden rounded-md border bg-popover text-popover-foreground shadow-md data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0 data-[state=closed]:zoom-out-95 data-[state=open]:zoom-in-95 data-[side=bottom]:slide-in-from-top-2 data-[side=left]:slide-in-from-right-2 data-[side=right]:slide-in-from-left-2 data-[side=top]:slide-in-from-bottom-2", + position === "popper" && + "data-[side=bottom]:translate-y-1 data-[side=left]:-translate-x-1 data-[side=right]:translate-x-1 data-[side=top]:-translate-y-1", + className, + )} + position={position} + {...props} + > + <SelectPrimitive.Viewport + className={cn( + "p-1", + position === "popper" && + "h-[var(--radix-select-trigger-height)] w-full min-w-[var(--radix-select-trigger-width)]", + )} + > + {children} + </SelectPrimitive.Viewport> + </SelectPrimitive.Content> + </SelectPrimitive.Portal> +)); +SelectContent.displayName = SelectPrimitive.Content.displayName; + +const SelectLabel = React.forwardRef< + React.ElementRef<typeof SelectPrimitive.Label>, + React.ComponentPropsWithoutRef<typeof SelectPrimitive.Label> +>(({ className, ...props }, ref) => ( + <SelectPrimitive.Label + ref={ref} + className={cn("py-1.5 pl-8 pr-2 text-sm font-semibold", className)} + {...props} + /> +)); +SelectLabel.displayName = SelectPrimitive.Label.displayName; + +const SelectItem = React.forwardRef< + React.ElementRef<typeof SelectPrimitive.Item>, + React.ComponentPropsWithoutRef<typeof SelectPrimitive.Item> +>(({ className, children, ...props }, ref) => ( + <SelectPrimitive.Item + ref={ref} + className={cn( + "relative flex w-full cursor-default select-none items-center rounded-sm py-1.5 pl-8 pr-2 text-sm outline-none focus:bg-accent focus:text-accent-foreground data-[disabled]:pointer-events-none data-[disabled]:opacity-50", + className, + )} + {...props} + > + <span className="absolute left-2 flex h-3.5 w-3.5 items-center justify-center"> + <SelectPrimitive.ItemIndicator> + <Check className="h-4 w-4" /> + </SelectPrimitive.ItemIndicator> + </span> + + <SelectPrimitive.ItemText>{children}</SelectPrimitive.ItemText> + </SelectPrimitive.Item> +)); +SelectItem.displayName = SelectPrimitive.Item.displayName; + +const SelectSeparator = React.forwardRef< + React.ElementRef<typeof SelectPrimitive.Separator>, + React.ComponentPropsWithoutRef<typeof SelectPrimitive.Separator> +>(({ className, ...props }, ref) => ( + <SelectPrimitive.Separator + ref={ref} + className={cn("-mx-1 my-1 h-px bg-muted", className)} + {...props} + /> +)); +SelectSeparator.displayName = SelectPrimitive.Separator.displayName; export default function SelectWidget< T = any, @@ -50,68 +157,43 @@ export default function SelectWidget< ); return ( - <select - id={id} - name={id} + <Select value={ - typeof selectedIndexes === "undefined" ? emptyValue : selectedIndexes - } - required={required} - multiple={multiple} - disabled={disabled || readonly} - autoFocus={autofocus} - className={`flex h-10 w-full items-center justify-between rounded-md border border-border bg-background px-3 py-2 text-sm ring-offset-background placeholder:text-muted-foreground focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 disabled:cursor-not-allowed disabled:opacity-50 [&>span]:line-clamp-1 - ${rawErrors.length > 0 ? "border-red-500" : "border-muted"} - `} - onBlur={ - onBlur && - ((event: FocusEvent) => { - const newValue = getValue(event, multiple); - onBlur( - id, - enumOptionsValueForIndex<S>(newValue, enumOptions, optEmptyValue), - ); - }) - } - onFocus={ - onFocus && - ((event: FocusEvent) => { - const newValue = getValue(event, multiple); - onFocus( - id, - enumOptionsValueForIndex<S>(newValue, enumOptions, optEmptyValue), - ); - }) + typeof selectedIndexes === "undefined" + ? undefined + : String(selectedIndexes) } - onChange={(event: ChangeEvent) => { - const newValue = getValue(event, multiple); + onValueChange={(newValue) => { onChange( enumOptionsValueForIndex<S>(newValue, enumOptions, optEmptyValue), ); }} - aria-describedby={ariaDescribedByIds<T>(id)} + disabled={disabled || readonly} > - {!multiple && schema.default === undefined && ( - <option value="" className="bg-muted"> - {placeholder} - </option> - )} - {(enumOptions as any).map(({ value, label }: any, i: number) => { - const disabled: any = - Array.isArray(enumDisabled) && - (enumDisabled as any).indexOf(value) != -1; - return ( - <option - key={i} - id={label} - value={String(i)} - disabled={disabled} - className="bg-muted" - > - {label} - </option> - ); - })} - </select> + <SelectTrigger + id={id} + className={cn( + rawErrors.length > 0 ? "border-red-500" : "border-input", + "w-full", + )} + > + <SelectValue placeholder={placeholder} /> + </SelectTrigger> + <SelectContent> + {!multiple && schema.default === undefined && ( + <SelectItem value="__placeholder__">{placeholder}</SelectItem> + )} + {(enumOptions as any).map(({ value, label }: any, i: number) => { + const disabled: any = + Array.isArray(enumDisabled) && + (enumDisabled as any).indexOf(value) != -1; + return ( + <SelectItem key={i} value={String(i)} disabled={disabled}> + {label} + </SelectItem> + ); + })} + </SelectContent> + </Select> ); } diff --git a/src/components/form/custom/SubmitButton/SubmitButton.tsx b/src/components/form/custom/SubmitButton/SubmitButton.tsx index 54a512d..b7aee82 100644 --- a/src/components/form/custom/SubmitButton/SubmitButton.tsx +++ b/src/components/form/custom/SubmitButton/SubmitButton.tsx @@ -1,5 +1,3 @@ -import { useRef } from "react"; - import { FormContextType, getSubmitButtonOptions, @@ -8,8 +6,6 @@ import { SubmitButtonProps, } from "@rjsf/utils"; -import { Button } from "@/components/ui/button"; - export default function SubmitButton< T = any, S extends StrictRJSFSchema = RJSFSchema, @@ -21,39 +17,20 @@ export default function SubmitButton< props: submitButtonProps, } = getSubmitButtonOptions<T, S, F>(props.uiSchema); - const { uiSchema } = props; - if (norender) { return null; } - - const linkRef = useRef(null); - - const handleDownload = async () => { - const test = ["1"]; - const blob = new Blob(test, { - type: "application/yaml", - }); - const url = window.URL.createObjectURL(blob); - const link = linkRef.current as HTMLAnchorElement | null; - - if (!link) { - return; - } - - link.href = url; - link.download = "cluster.yaml"; - link.click(); - window.URL.revokeObjectURL(url); - }; + console.log(props); return ( <div> - <a ref={linkRef}> - <Button type="submit" {...submitButtonProps} onClick={handleDownload}> - Download - </Button> - </a> + <button + type="submit" + className="bg-primary px-4 py-2 text-sm text-primary-foreground hover:bg-primary/90 rounded-md" + {...submitButtonProps} + > + Download + </button> </div> ); } diff --git a/src/components/form/custom/SubmitButton/old.tsx b/src/components/form/custom/SubmitButton/old.tsx new file mode 100644 index 0000000..54a512d --- /dev/null +++ b/src/components/form/custom/SubmitButton/old.tsx @@ -0,0 +1,59 @@ +import { useRef } from "react"; + +import { + FormContextType, + getSubmitButtonOptions, + RJSFSchema, + StrictRJSFSchema, + SubmitButtonProps, +} from "@rjsf/utils"; + +import { Button } from "@/components/ui/button"; + +export default function SubmitButton< + T = any, + S extends StrictRJSFSchema = RJSFSchema, + F extends FormContextType = any, +>(props: SubmitButtonProps<T, S, F>) { + const { + submitText, + norender, + props: submitButtonProps, + } = getSubmitButtonOptions<T, S, F>(props.uiSchema); + + const { uiSchema } = props; + + if (norender) { + return null; + } + + const linkRef = useRef(null); + + const handleDownload = async () => { + const test = ["1"]; + const blob = new Blob(test, { + type: "application/yaml", + }); + const url = window.URL.createObjectURL(blob); + const link = linkRef.current as HTMLAnchorElement | null; + + if (!link) { + return; + } + + link.href = url; + link.download = "cluster.yaml"; + link.click(); + window.URL.revokeObjectURL(url); + }; + + return ( + <div> + <a ref={linkRef}> + <Button type="submit" {...submitButtonProps} onClick={handleDownload}> + Download + </Button> + </a> + </div> + ); +} diff --git a/src/components/form/download-button.tsx b/src/components/form/download-button.tsx index 563d3fb..09d5ef5 100644 --- a/src/components/form/download-button.tsx +++ b/src/components/form/download-button.tsx @@ -16,6 +16,7 @@ export function DownloadButton( formData: any, formStatus: any, ) { + // console.log(props) const { uiSchema } = props; const { norender } = getSubmitButtonOptions(uiSchema); if (norender) { @@ -41,10 +42,12 @@ export function DownloadButton( }; return ( - <a ref={linkRef}> - <Button type="submit" onClick={handleDownload} className="mt-8 mr-4"> - AHHHH - </Button> - </a> + <> + <a ref={linkRef}> + <Button type="submit" onClick={handleDownload} className="mt-8 mr-4"> + Download + </Button> + </a> + </> ); } diff --git a/src/components/form/form.tsx b/src/components/form/form.tsx index a66517b..2a8515b 100644 --- a/src/components/form/form.tsx +++ b/src/components/form/form.tsx @@ -3,13 +3,15 @@ import { useState } from "react"; import React from "react"; import validator from "@rjsf/validator-ajv8"; + +import { getDefaultRegistry } from "@rjsf/core"; +import { ObjectFieldTemplateProps } from "@rjsf/utils"; + import { stringify } from "yaml"; import SyntaxHighlighter from "react-syntax-highlighter"; -import SubmitButton from "@/components/form/custom/SubmitButton"; - import uiSchema from "@/components/form/uischema"; - +import SubmitButton from "@/components/form/custom/SubmitButton/SubmitButton"; import { Separator } from "@/components/ui/separator"; import { Card, @@ -19,20 +21,9 @@ import { CardHeader, CardTitle, } from "@/components/ui/card"; - import { widgets } from "@/components/form/widgets"; import { Form as RJSForm } from "@/components/form/custom"; -//import { Form as RJSForm } from "@/components/form/rjsf"; - -import { MultiInput } from "@/components/form/multi-input"; import { DownloadButton } from "@/components/form/download-button"; -import { - UiSchema, - RJSFSchema, - FieldProps, - RegistryFieldsType, -} from "@rjsf/utils"; -import version from "@/components/form/fields"; import { Select, @@ -44,9 +35,6 @@ import { SelectLabel, } from "@/components/ui/select"; -import { getDefaultRegistry } from "@rjsf/core"; -import { ObjectFieldTemplateProps } from "@rjsf/utils"; - import { convertYamlFormat } from "@/lib/utils"; export const ClusterForm = (schemas: any) => { @@ -55,77 +43,16 @@ export const ClusterForm = (schemas: any) => { const [clusterstack, setClusterStack] = useState(list[0]); const [formData, setFormData] = useState(null); - //const [activeSchema, setActiveSchema] = useState(schema[clusterstack]); const handleSwitch = (value: string) => { setClusterStack(value); setFormData(schema[value]); - //setActiveSchema(schema[value]); }; - const yaml_out = convertYamlFormat(stringify(formData)); // json to yaml conversion - - // custom field component - const fields: RegistryFieldsType = { k8s_version: version }; - - // CUSTOM GROUPS (Cluster, Machines, Variables) - const registry = getDefaultRegistry(); - const ObjectFieldTemplate = registry.templates.ObjectFieldTemplate; - const groups = [ - { - title: "cluster", - fields: [ - "metadata.properties.name", - "metadata.properties.namespace", - "version", - ], - }, - //{ title: "machines", fields: "spec.variables" }, - { title: "variables", fields: "spec.variables" }, - ]; - - const getPropsForGroup = ( - group: any, - props: ObjectFieldTemplateProps, - ): ObjectFieldTemplateProps => { - 2; - console.log(props.properties); - console.log(group.fields); - console.log(props.properties.filter((p) => console.log(p))); - - // More filtering might be required for propper functionality, this is just a POC - return { - ...props, - // properties: props.properties.filter((p) => group.fields.includes(p.name)), - }; - }; - - const ObjectFieldTemplateWrapper = (props: ObjectFieldTemplateProps) => { - return ( - <> - {groups.map((group) => { - const childProps = getPropsForGroup(group, props); - console.log(group); - return ( - <> - <Card> - <CardHeader> - <CardTitle className=""> - {group.title.charAt(0).toUpperCase() + group.title.slice(1)} - </CardTitle> - </CardHeader> - <CardContent className="space-y-4"> - <div> - <ObjectFieldTemplate key={group.title} {...childProps} /> - </div> - </CardContent> - </Card> - </> - ); - })} - </> - ); - }; + const yaml_out = convertYamlFormat(stringify(formData)) + .split("additionalProperties: false") + .slice(0, 1)[0] + .trimEnd(); return ( <> @@ -170,15 +97,22 @@ export const ClusterForm = (schemas: any) => { schema={schema[clusterstack]} uiSchema={uiSchema} validator={validator} - fields={fields} widgets={widgets} + formData={formData} onChange={(e: any) => setFormData(e.formData)} - templates={{ - ButtonTemplates: { SubmitButton }, - //ObjectFieldTemplate: ObjectFieldTemplateWrapper, - }} + // templates={{ ButtonTemplates: { SubmitButton } }} > - {/*<DownloadButton formStatus={validator} formData={formData}/> */} + {/*<DownloadButton formStatus={validator} formData={yaml_out}/> */} + {/*<SubmitButton + registry={{ + ...getDefaultRegistry(), + schemaUtils: validator, + }} + formStatus={validator} + formData={yaml_out} + /> + + */} </RJSForm> </CardContent> </Card> diff --git a/src/components/form/uischema.ts b/src/components/form/uischema.ts index 712333d..1f98866 100644 --- a/src/components/form/uischema.ts +++ b/src/components/form/uischema.ts @@ -6,11 +6,12 @@ const uiSchema: UiSchema = { metadata: { "ui:title": "", name: { - "ui:title": "Cluster name", + "ui:title": "Name", "ui:description": "Name of your Cluster", }, namespace: { "ui:description": "Namespace in which to deploy the Cluster", + "ui:widget": "select", }, labels: { "ui:widget": "hidden" }, }, @@ -22,7 +23,7 @@ const uiSchema: UiSchema = { services: { "ui:title": "", cidrBlocks: { - "ui:title": "", + "ui:field": "", items: { "ui:title": "Service CIDRs", "ui:description": "CIDR addresses for all services in the cluster", @@ -44,15 +45,14 @@ const uiSchema: UiSchema = { "ui:title": "", class: { "ui:widget": "hidden" }, version: { - "ui:title": "Kubernetes version", + "ui:title": "Kubernetes Version", "ui:description": "Select which Kubernetes minor version you want", - "ui:field": "k8s_version", - //"ui:widget": "select", + "ui:widget": "select", }, controlPlane: { "ui:title": "", replicas: { - "ui:title": "Control plane replicas", + "ui:title": "Control Plane Replicas", "ui:description": "How many control plane replicas you want", "ui:widget": "updown", }, @@ -77,12 +77,14 @@ const uiSchema: UiSchema = { external_id: { "ui:widget": "hidden" }, controller_root_disk: { "ui:title": "Controller Disk Size", - "ui:description": "Root disk size in GiB for control-plane nodes", + "ui:description": + "Root disk size in GiB for control-plane nodes. Should only be used for the diskless flavors.", "ui:widget": "updown", }, worker_root_disk: { "ui:title": "Worker Disk Size", - "ui:description": "Root disk size in GiB for worker nodes", + "ui:description": + "Root disk size in GiB for worker nodes. Should only be used for the diskless flavors.", "ui:widget": "updown", }, ssh_key: { diff --git a/src/components/header.tsx b/src/components/header.tsx index f611710..39dc59d 100644 --- a/src/components/header.tsx +++ b/src/components/header.tsx @@ -4,9 +4,7 @@ import UserButton from "@/components/user-button"; export default function Header() { return ( <header className="sticky top-0 z-50 border-b transition-colors border-border/40 bg-background/95 backdrop-blur supports-[backdrop-filter]:bg-background/60"> - <Navbar> - <UserButton /> - </Navbar> + <Navbar>{/*<UserButton />*/}</Navbar> </header> ); } diff --git a/src/components/ui/avatar.tsx b/src/components/ui/avatar.tsx deleted file mode 100644 index 09cd14d..0000000 --- a/src/components/ui/avatar.tsx +++ /dev/null @@ -1,50 +0,0 @@ -"use client"; - -import * as React from "react"; -import * as AvatarPrimitive from "@radix-ui/react-avatar"; - -import { cn } from "@/lib/utils"; - -const Avatar = React.forwardRef< - React.ElementRef<typeof AvatarPrimitive.Root>, - React.ComponentPropsWithoutRef<typeof AvatarPrimitive.Root> ->(({ className, ...props }, ref) => ( - <AvatarPrimitive.Root - ref={ref} - className={cn( - "relative flex h-10 w-10 shrink-0 overflow-hidden rounded-full", - className, - )} - {...props} - /> -)); -Avatar.displayName = AvatarPrimitive.Root.displayName; - -const AvatarImage = React.forwardRef< - React.ElementRef<typeof AvatarPrimitive.Image>, - React.ComponentPropsWithoutRef<typeof AvatarPrimitive.Image> ->(({ className, ...props }, ref) => ( - <AvatarPrimitive.Image - ref={ref} - className={cn("aspect-square h-full w-full", className)} - {...props} - /> -)); -AvatarImage.displayName = AvatarPrimitive.Image.displayName; - -const AvatarFallback = React.forwardRef< - React.ElementRef<typeof AvatarPrimitive.Fallback>, - React.ComponentPropsWithoutRef<typeof AvatarPrimitive.Fallback> ->(({ className, ...props }, ref) => ( - <AvatarPrimitive.Fallback - ref={ref} - className={cn( - "flex h-full w-full items-center justify-center rounded-full bg-muted", - className, - )} - {...props} - /> -)); -AvatarFallback.displayName = AvatarPrimitive.Fallback.displayName; - -export { Avatar, AvatarImage, AvatarFallback }; diff --git a/src/lib/utils.ts b/src/lib/utils.ts index 4512c29..f2529fa 100644 --- a/src/lib/utils.ts +++ b/src/lib/utils.ts @@ -120,6 +120,7 @@ function formatTitle(key: string): string { const customSpelling: { [key: string]: string } = { openstack: "OpenStack", apiserver: "API Server", + ips: "IPs", }; return key @@ -172,7 +173,11 @@ function convertVariablesFormat(obj: GenericObject): GenericObject { export function convertYamlFormat(input: string): string { const parsedYaml = yaml.load(input) as GenericObject; const convertedYaml = convertVariablesFormat(parsedYaml); - return yaml.dump(convertedYaml, { quotingType: '"' }).trimEnd(); + return yaml + .dump(convertedYaml, { + quotingType: '"', + }) + .trimEnd(); } interface EnumField { @@ -196,7 +201,7 @@ function addEnumToFields(variables: any, fields: EnumField[]) { return variables; } -const variableFieldsToModify: EnumField[] = [ +const VariableFieldsToModify: EnumField[] = [ { fieldName: "controller_flavor", enumValues: ["SCS-2V-4-20s", "SCS-2V-8-20s"], @@ -204,7 +209,7 @@ const variableFieldsToModify: EnumField[] = [ }, { fieldName: "worker_flavor", - enumValues: ["SCS-2V-4-20s", "SCS-2V-8-20s"], + enumValues: ["SCS-2V-4", "SCS-2V-4-20", "SCS-2V-4-20s", "SCS-2V-8-20s"], type: "string", }, { @@ -217,23 +222,127 @@ const variableFieldsToModify: EnumField[] = [ enumValues: ["none", "octavia-amphora", "octavia-ovn", "yawol"], type: "string", }, +]; + +const TopologyFieldsToModify: EnumField[] = [ { fieldName: "version", - enumValues: ["none", "octavia-amphora", "octavia-ovn", "yawol"], + enumValues: [ + "v1.29.3", + "v1.30.0", + "v1.30.1", + "v1.30.2", + "v1.30.3", + "v1.30.4", + "v1.30.5", + "v1.31.0", + "v1.31.1", + ], + type: "string", + }, +]; + +const MetadataFieldsToModify: EnumField[] = [ + { + fieldName: "namespace", + enumValues: [ + "kaas-playground0", + "kaas-playground1", + "kaas-playground2", + "kaas-playground3", + "kaas-playground4", + "kaas-playground5", + "kaas-playground6", + "kaas-playground7", + "kaas-playground8", + "kaas-playground9", + ], type: "string", }, ]; +function addEnumToTopologyFields(topology: any, fields: EnumField[]): any { + fields.forEach((field) => { + if (topology[field.fieldName]) { + topology[field.fieldName] = { + ...topology[field.fieldName], + enum: field.enumValues, + type: field.type || "string", + }; + } + }); + return topology; +} + export function modifySchemas( definitions: object[], - fieldsToModify: EnumField[] = variableFieldsToModify, + variableFieldsToModify: EnumField[] = VariableFieldsToModify, + topologyFieldsToModify: EnumField[] = TopologyFieldsToModify, + metadataFieldsToModify: EnumField[] = MetadataFieldsToModify, ) { - return updateArrayObjects( - definitions, - "properties.spec.properties.topology.properties.variables", - (variables, key) => { - const transformedVariables = transformDataStructure(variables.items); - return addEnumToFields(transformedVariables, fieldsToModify); - }, - ); + return definitions.map((definition) => { + // Delete $id and $schema keys at the root of each schema + delete (definition as any)["$id"]; + delete (definition as any)["$schema"]; + // Make sure name and namespace are required in metadata + const metadataRequiredFields = ["name", "namespace"]; + (definition as any).properties.metadata.required = [ + ...new Set([ + ...((definition as any).properties.metadata.required || []), + ...metadataRequiredFields, + ]), + ]; + + // Modify metadata fields + if ((definition as any).properties.metadata) { + (definition as any).properties.metadata = addEnumToFields( + (definition as any).properties.metadata, + metadataFieldsToModify, + ); + } + + return updateArrayObjects( + [definition], + "properties.spec.properties", + (spec, key) => { + // Modify topology + if (spec.topology) { + spec.topology = updateArrayObjects( + [spec.topology], + "properties", + (topology, key) => { + // Modify variables + if (topology.variables) { + const transformedVariables = transformDataStructure( + topology.variables.items, + ); + topology.variables = addEnumToFields( + transformedVariables, + variableFieldsToModify, + ); + } + + // Modify topology fields + topology = addEnumToTopologyFields( + topology, + topologyFieldsToModify, + ); + + // Modify controlPlane replicas + if (topology.controlPlane?.properties?.replicas?.default) { + topology.controlPlane.properties.replicas.default = parseInt( + topology.controlPlane.properties.replicas.default, + 10, + ); + } + + return topology; + }, + )[0]; + } + + return spec; + }, + )[0]; + }); }