Adopt sveltekit-superforms #21

Closed
schreifuchs wants to merge 1 commits from issue-8 into main
11 changed files with 500 additions and 141 deletions
+3 -2
View File
@@ -44,9 +44,11 @@
"prettier-plugin-svelte": "^3.4.0",
"svelte": "^5.43.14",
"svelte-check": "^4.3.4",
"sveltekit-superforms": "^2.30.1",
"tailwindcss": "^4.1.17",
"typescript": "^5.9.3",
"typescript-eslint": "^8.47.0",
"valibot": "^1.1.0",
"vite": "^7.2.4"
},
"dependencies": {
@@ -54,7 +56,6 @@
"@sveltejs/adapter-auto": "^7.0.0",
"postgres": "^3.4.7",
"sanitize-html": "^2.17.0",
"tailwind-merge": "^3.4.0",
"valibot": "^1.1.0"
"tailwind-merge": "^3.4.0"
}
}
+414 -3
View File
@@ -23,9 +23,6 @@ importers:
tailwind-merge:
specifier: ^3.4.0
version: 3.4.0
valibot:
specifier: ^1.1.0
version: 1.1.0(typescript@5.9.3)
devDependencies:
'@auth/core':
specifier: 0.41.1
@@ -102,6 +99,9 @@ importers:
svelte-check:
specifier: ^4.3.4
version: 4.3.4(picomatch@4.0.3)(svelte@5.43.14)(typescript@5.9.3)
sveltekit-superforms:
specifier: ^2.30.1
version: 2.30.1(@sveltejs/kit@2.49.0(@sveltejs/vite-plugin-svelte@6.2.1(svelte@5.43.14)(vite@7.2.4(@types/node@20.19.25)(jiti@2.6.1)(lightningcss@1.30.2)))(svelte@5.43.14)(vite@7.2.4(@types/node@20.19.25)(jiti@2.6.1)(lightningcss@1.30.2)))(@types/json-schema@7.0.15)(svelte@5.43.14)(typescript@5.9.3)
tailwindcss:
specifier: ^4.1.17
version: 4.1.17
@@ -111,6 +111,9 @@ importers:
typescript-eslint:
specifier: ^8.47.0
version: 8.48.0(eslint@9.39.1(jiti@2.6.1))(typescript@5.9.3)
valibot:
specifier: ^1.1.0
version: 1.1.0(typescript@5.9.3)
vite:
specifier: ^7.2.4
version: 7.2.4(@types/node@20.19.25)(jiti@2.6.1)(lightningcss@1.30.2)
@@ -121,6 +124,12 @@ packages:
resolution: {integrity: sha512-UrcABB+4bUrFABwbluTIBErXwvbsU/V7TZWfmbgJfbkwiBuziS9gxdODUyuiecfdGQ85jglMW6juS3+z5TsKLw==}
engines: {node: '>=10'}
'@ark/schema@0.56.0':
resolution: {integrity: sha512-ECg3hox/6Z/nLajxXqNhgPtNdHWC9zNsDyskwO28WinoFEnWow4IsERNz9AnXRhTZJnYIlAJ4uGn3nlLk65vZA==}
'@ark/util@0.56.0':
resolution: {integrity: sha512-BghfRC8b9pNs3vBoDJhcta0/c1J1rsoS1+HgVUreMFPdhz/CRAKReAu57YEllNaSy98rWAdY1gE+gFup7OXpgA==}
'@auth/core@0.41.1':
resolution: {integrity: sha512-t9cJ2zNYAdWMacGRMT6+r4xr1uybIdmYa49calBPeTqwgAFPV/88ac9TEvCR85pvATiSPt8VaNf+Gt24JIT/uw==}
peerDependencies:
@@ -154,6 +163,10 @@ packages:
nodemailer:
optional: true
'@babel/runtime@7.29.2':
resolution: {integrity: sha512-JiDShH45zKHWyGe4ZNVRrCjBz8Nh9TMmZG1kh4QTK8hCBTWBi8Da+i7s1fJw7/lYpM4ccepSNfqzZ/QvABBi5g==}
engines: {node: '>=6.9.0'}
'@drizzle-team/brocli@0.10.2':
resolution: {integrity: sha512-z33Il7l5dKjUgGULTqBsQBQwckHh5AbIuxhdsIxDDiZAzBOrZO6q9ogcWC65kU382AfynTfgNumVcNIjuIua6w==}
@@ -500,6 +513,9 @@ packages:
resolution: {integrity: sha512-43/qtrDUokr7LJqoF2c3+RInu/t4zfrpYdoSDfYyhg52rwLV6TnOvdG4fXm7IkSB3wErkcmJS9iEhjVtOSEjjA==}
engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
'@exodus/schemasafe@1.3.0':
resolution: {integrity: sha512-5Aap/GaRupgNx/feGBwLLTVv8OQFfv3pq2lPRzPg9R+IOBnDgghTGW7l7EuVXOvg5cc/xSAlRW8rBrjIC3Nvqw==}
'@floating-ui/core@1.7.3':
resolution: {integrity: sha512-sGnvb5dmrJaKEZ+LDIpguvdX3bDlEllmv4/ClQ9awcmCZrlx5jQyyMWFM5kBI+EyNOCDDiKk8il0zeuX3Zlg/w==}
@@ -515,6 +531,12 @@ packages:
svelte: ^5.0.0
tailwindcss: ^4.1.4
'@hapi/hoek@9.3.0':
resolution: {integrity: sha512-/c6rf4UJlmHlC9b5BaNvzAcFv7HZ2QHaV0D4/HNlBdvFnvQq8RI4kYdhyPCl7Xj+oWvTWQ8ujhqS53LIgAe6KQ==}
'@hapi/topo@5.1.0':
resolution: {integrity: sha512-foQZKJig7Ob0BMAYBfcJk8d77QtOe7Wo4ox7ff1lQYoNNAb6jwcY1ncdoy2e9wQZzvNy7ODZCYJkK8kzmcAnAg==}
'@humanfs/core@0.19.1':
resolution: {integrity: sha512-5DyQ4+1JEUzejeK1JGICcideyfUbGixgS9jNgex5nqkW+cY7WZhxBigmieN5Qnw9ZosSNVC9KQKyb+GUaGyKUA==}
engines: {node: '>=18.18.0'}
@@ -556,6 +578,9 @@ packages:
'@popperjs/core@2.11.8':
resolution: {integrity: sha512-P1st0aksCrn9sGZhp8GMYwBnQsbvAWsZAX44oXNNvLHGqAOcoVxmjZiohstwQ7SqKnbR47akdNi+uleWD8+g6A==}
'@poppinss/macroable@1.1.2':
resolution: {integrity: sha512-FAVBRzzWhYP5mA3lCwLH1A0fKBqq5anyjGet90Z81aRK5c/+LTGUE1zJhZrErjaenBSOOI9BVUs3WVmotneFQA==}
'@remirror/core-constants@3.0.0':
resolution: {integrity: sha512-42aWfPrimMfDKDi4YegyS7x+/0tlzaqwPQCULLanv3DMIlu96KTJR0fM5isWX2UViOqlGnX6YFgqWepcX+XMNg==}
@@ -638,56 +663,67 @@ packages:
resolution: {integrity: sha512-k9oD15soC/Ln6d2Wv/JOFPzZXIAIFLp6B+i14KhxAfnq76ajt0EhYc5YPeX6W1xJkAdItcVT+JhKl1QZh44/qw==}
cpu: [arm]
os: [linux]
libc: [glibc]
'@rollup/rollup-linux-arm-musleabihf@4.53.3':
resolution: {integrity: sha512-vTNlKq+N6CK/8UktsrFuc+/7NlEYVxgaEgRXVUVK258Z5ymho29skzW1sutgYjqNnquGwVUObAaxae8rZ6YMhg==}
cpu: [arm]
os: [linux]
libc: [musl]
'@rollup/rollup-linux-arm64-gnu@4.53.3':
resolution: {integrity: sha512-RGrFLWgMhSxRs/EWJMIFM1O5Mzuz3Xy3/mnxJp/5cVhZ2XoCAxJnmNsEyeMJtpK+wu0FJFWz+QF4mjCA7AUQ3w==}
cpu: [arm64]
os: [linux]
libc: [glibc]
'@rollup/rollup-linux-arm64-musl@4.53.3':
resolution: {integrity: sha512-kASyvfBEWYPEwe0Qv4nfu6pNkITLTb32p4yTgzFCocHnJLAHs+9LjUu9ONIhvfT/5lv4YS5muBHyuV84epBo/A==}
cpu: [arm64]
os: [linux]
libc: [musl]
'@rollup/rollup-linux-loong64-gnu@4.53.3':
resolution: {integrity: sha512-JiuKcp2teLJwQ7vkJ95EwESWkNRFJD7TQgYmCnrPtlu50b4XvT5MOmurWNrCj3IFdyjBQ5p9vnrX4JM6I8OE7g==}
cpu: [loong64]
os: [linux]
libc: [glibc]
'@rollup/rollup-linux-ppc64-gnu@4.53.3':
resolution: {integrity: sha512-EoGSa8nd6d3T7zLuqdojxC20oBfNT8nexBbB/rkxgKj5T5vhpAQKKnD+h3UkoMuTyXkP5jTjK/ccNRmQrPNDuw==}
cpu: [ppc64]
os: [linux]
libc: [glibc]
'@rollup/rollup-linux-riscv64-gnu@4.53.3':
resolution: {integrity: sha512-4s+Wped2IHXHPnAEbIB0YWBv7SDohqxobiiPA1FIWZpX+w9o2i4LezzH/NkFUl8LRci/8udci6cLq+jJQlh+0g==}
cpu: [riscv64]
os: [linux]
libc: [glibc]
'@rollup/rollup-linux-riscv64-musl@4.53.3':
resolution: {integrity: sha512-68k2g7+0vs2u9CxDt5ktXTngsxOQkSEV/xBbwlqYcUrAVh6P9EgMZvFsnHy4SEiUl46Xf0IObWVbMvPrr2gw8A==}
cpu: [riscv64]
os: [linux]
libc: [musl]
'@rollup/rollup-linux-s390x-gnu@4.53.3':
resolution: {integrity: sha512-VYsFMpULAz87ZW6BVYw3I6sWesGpsP9OPcyKe8ofdg9LHxSbRMd7zrVrr5xi/3kMZtpWL/wC+UIJWJYVX5uTKg==}
cpu: [s390x]
os: [linux]
libc: [glibc]
'@rollup/rollup-linux-x64-gnu@4.53.3':
resolution: {integrity: sha512-3EhFi1FU6YL8HTUJZ51imGJWEX//ajQPfqWLI3BQq4TlvHy4X0MOr5q3D2Zof/ka0d5FNdPwZXm3Yyib/UEd+w==}
cpu: [x64]
os: [linux]
libc: [glibc]
'@rollup/rollup-linux-x64-musl@4.53.3':
resolution: {integrity: sha512-eoROhjcc6HbZCJr+tvVT8X4fW3/5g/WkGvvmwz/88sDtSJzO7r/blvoBDgISDiCjDRZmHpwud7h+6Q9JxFwq1Q==}
cpu: [x64]
os: [linux]
libc: [musl]
'@rollup/rollup-openharmony-arm64@4.53.3':
resolution: {integrity: sha512-OueLAWgrNSPGAdUdIjSWXw+u/02BRTcnfw9PN41D2vq/JSEPnJnVuBgw18VkN8wcd4fjUs+jFHVM4t9+kBSNLw==}
@@ -714,9 +750,21 @@ packages:
cpu: [x64]
os: [win32]
'@sideway/address@4.1.5':
resolution: {integrity: sha512-IqO/DUQHUkPeixNQ8n0JA6102hT9CmaljNTPmQ1u8MEhBo/R4Q8eKLN/vGZxuebwOroDB4cbpjheD4+/sKFK4Q==}
'@sideway/formula@3.0.1':
resolution: {integrity: sha512-/poHZJJVjx3L+zVD6g9KgHfYnb443oi7wLu/XKojDviHy6HOEOA6z1Trk5aR1dGcmPenJEgb2sK2I80LeS3MIg==}
'@sideway/pinpoint@2.0.0':
resolution: {integrity: sha512-RNiOoTPkptFtSVzQevY/yWtZwf/RxyVnPy/OcA9HBM3MlGDnBEYL5B41H0MTn0Uec8Hi+2qUtTfG2WWZBmMejQ==}
'@standard-schema/spec@1.0.0':
resolution: {integrity: sha512-m2bOd0f2RT9k8QJx1JN85cZYyH1RqFBdlwtkSlf4tBDYLCiiZnv1fIIwacK6cqwXavOydf0NPToMQgpKq+dVlA==}
'@standard-schema/spec@1.1.0':
resolution: {integrity: sha512-l2aFy5jALhniG5HgqrD6jXLi/rUWrKvqN/qJx6yoJsgKhblVd+iqqU4RCXavm/jPityDo5TCvKMnpjKnOriy0w==}
'@sveltejs/acorn-typescript@1.0.7':
resolution: {integrity: sha512-znp1A/Y1Jj4l/Zy7PX5DZKBE0ZNY+5QBngiE21NJkfSTyzzC5iKNWOtwFXKtIrn7MXEFBck4jD95iBNkGjK92Q==}
peerDependencies:
@@ -823,24 +871,28 @@ packages:
engines: {node: '>= 10'}
cpu: [arm64]
os: [linux]
libc: [glibc]
'@tailwindcss/oxide-linux-arm64-musl@4.1.17':
resolution: {integrity: sha512-HvZLfGr42i5anKtIeQzxdkw/wPqIbpeZqe7vd3V9vI3RQxe3xU1fLjss0TjyhxWcBaipk7NYwSrwTwK1hJARMg==}
engines: {node: '>= 10'}
cpu: [arm64]
os: [linux]
libc: [musl]
'@tailwindcss/oxide-linux-x64-gnu@4.1.17':
resolution: {integrity: sha512-M3XZuORCGB7VPOEDH+nzpJ21XPvK5PyjlkSFkFziNHGLc5d6g3di2McAAblmaSUNl8IOmzYwLx9NsE7bplNkwQ==}
engines: {node: '>= 10'}
cpu: [x64]
os: [linux]
libc: [glibc]
'@tailwindcss/oxide-linux-x64-musl@4.1.17':
resolution: {integrity: sha512-k7f+pf9eXLEey4pBlw+8dgfJHY4PZ5qOUFDyNf7SI6lHjQ9Zt7+NcscjpwdCEbYi6FI5c2KDTDWyf2iHcCSyyQ==}
engines: {node: '>= 10'}
cpu: [x64]
os: [linux]
libc: [musl]
'@tailwindcss/oxide-wasm32-wasi@4.1.17':
resolution: {integrity: sha512-cEytGqSSoy7zK4JRWiTCx43FsKP/zGr0CsuMawhH67ONlH+T79VteQeJQRO/X7L0juEUA8ZyuYikcRBf0vsxhg==}
@@ -1235,6 +1287,25 @@ packages:
'@types/unist@3.0.3':
resolution: {integrity: sha512-ko/gIFJRv177XgZsZcBwnqJN5x/Gien8qNOn0D5bQU/zAzVf9Zt3BlcUiLqhV9y4ARk0GbT3tnUiPNgnTXzc/Q==}
'@types/validator@13.15.10':
resolution: {integrity: sha512-T8L6i7wCuyoK8A/ZeLYt1+q0ty3Zb9+qbSSvrIVitzT3YjZqkTZ40IbRsPanlB4h1QB3JVL1SYCdR6ngtFYcuA==}
'@typeschema/class-validator@0.3.0':
resolution: {integrity: sha512-OJSFeZDIQ8EK1HTljKLT5CItM2wsbgczLN8tMEfz3I1Lmhc5TBfkZ0eikFzUC16tI3d1Nag7um6TfCgp2I2Bww==}
peerDependencies:
class-validator: ^0.14.1
peerDependenciesMeta:
class-validator:
optional: true
'@typeschema/core@0.14.0':
resolution: {integrity: sha512-Ia6PtZHcL3KqsAWXjMi5xIyZ7XMH4aSnOQes8mfMLx+wGFGtGRNlwe6Y7cYvX+WfNK67OL0/HSe9t8QDygV0/w==}
peerDependencies:
'@types/json-schema': ^7.0.15
peerDependenciesMeta:
'@types/json-schema':
optional: true
'@typescript-eslint/eslint-plugin@8.48.0':
resolution: {integrity: sha512-XxXP5tL1txl13YFtrECECQYeZjBZad4fyd3cFV4a19LkAY/bIp9fev3US4S5fDVV2JaYFiKAZ/GRTOLer+mbyQ==}
engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
@@ -1294,6 +1365,19 @@ packages:
resolution: {integrity: sha512-T0XJMaRPOH3+LBbAfzR2jalckP1MSG/L9eUtY0DEzUyVaXJ/t6zN0nR7co5kz0Jko/nkSYCBRkz1djvjajVTTg==}
engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
'@valibot/to-json-schema@1.6.0':
resolution: {integrity: sha512-d6rYyK5KVa2XdqamWgZ4/Nr+cXhxjy7lmpe6Iajw15J/jmU+gyxl2IEd1Otg1d7Rl3gOQL5reulnSypzBtYy1A==}
peerDependencies:
valibot: ^1.3.0
'@vinejs/compiler@3.0.0':
resolution: {integrity: sha512-v9Lsv59nR56+bmy2p0+czjZxsLHwaibJ+SV5iK9JJfehlJMa501jUJQqqz4X/OqKXrxtE3uTQmSqjUqzF3B2mw==}
engines: {node: '>=18.0.0'}
'@vinejs/vine@3.0.1':
resolution: {integrity: sha512-ZtvYkYpZOYdvbws3uaOAvTFuvFXoQGAtmzeiXu+XSMGxi5GVsODpoI9Xu9TplEMuD/5fmAtBbKb9cQHkWkLXDQ==}
engines: {node: '>=18.16.0'}
'@yr/monotone-cubic-spline@1.0.3':
resolution: {integrity: sha512-FQXkOta0XBSUPHndIKON2Y9JeQz5ZeMqLYZVVK93FliNBFm7LNMIZmY6FrMEB9XPcDbE2bekMbZD6kzDkxwYjA==}
@@ -1324,6 +1408,12 @@ packages:
resolution: {integrity: sha512-COROpnaoap1E2F000S62r6A60uHZnmlvomhfyT2DlTcrY1OrBKn2UhH7qn5wTC9zMvD0AY7csdPSNwKP+7WiQw==}
engines: {node: '>= 0.4'}
arkregex@0.0.5:
resolution: {integrity: sha512-ncYjBdLlh5/QnVsAA8De16Tc9EqmYM7y/WU9j+236KcyYNUXogpz3sC4ATIZYzzLxwI+0sEOaQLEmLmRleaEXw==}
arktype@2.2.0:
resolution: {integrity: sha512-t54MZ7ti5BhOEvzEkgKnWvqj+UbDfWig+DHr5I34xatymPusKLS0lQpNJd8M6DzmIto2QGszHfNKoFIT8tMCZQ==}
axobject-query@4.1.0:
resolution: {integrity: sha512-qIj0G9wZbMGNLjLmg1PT6v2mE9AH2zlnADJD/2tC6E00hgmhUOfEB6greHPAfLRSufHqROIUTkw6E+M3lH0PTQ==}
engines: {node: '>= 0.4'}
@@ -1344,6 +1434,10 @@ packages:
resolution: {integrity: sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==}
engines: {node: '>=6'}
camelcase@8.0.0:
resolution: {integrity: sha512-8WB3Jcas3swSvjIeA2yvCJ+Miyz5l1ZmB6HFb9R1317dt9LCQoswg/BGrmAmkWVEszSrrg4RwmO46qIm2OEnSA==}
engines: {node: '>=16'}
chalk@4.1.2:
resolution: {integrity: sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==}
engines: {node: '>=10'}
@@ -1352,6 +1446,9 @@ packages:
resolution: {integrity: sha512-Qgzu8kfBvo+cA4962jnP1KkS6Dop5NS6g7R5LFYJr4b8Ub94PPQXUksCw9PvXoeXPRRddRNC5C1JQUR2SMGtnA==}
engines: {node: '>= 14.16.0'}
class-validator@0.14.4:
resolution: {integrity: sha512-AwNusCCam51q703dW82x95tOqQp6oC9HNUl724KxJJOfnKscI8dOloXFgyez7LbTTKWuRBA37FScqVbJEoq8Yw==}
clsx@2.1.1:
resolution: {integrity: sha512-eYm0QWBtUrBWZWG0d386OGAw16Z995PiOVo2B7bjWSbHedGl5e0ZWaq65kOGgUSNesEIDkB9ISbTg/JK9dhCZA==}
engines: {node: '>=6'}
@@ -1392,6 +1489,9 @@ packages:
date-fns@4.1.0:
resolution: {integrity: sha512-Ukq0owbQXxa/U3EGtsdVBkR1w7KOQ5gIBqdH2hkvknzZPYvBxb/aa6E8L7tmjFtkwZBu3UXBbjIgPo/Ez4xaNg==}
dayjs@1.11.20:
resolution: {integrity: sha512-YbwwqR/uYpeoP4pu043q+LTDLFBLApUP6VxRihdfNTqu4ubqMlGDLd6ErXhEgsyvY0K6nCs7nggYumAN+9uEuQ==}
debug@4.4.3:
resolution: {integrity: sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==}
engines: {node: '>=6.0'}
@@ -1419,9 +1519,15 @@ packages:
devalue@5.5.0:
resolution: {integrity: sha512-69sM5yrHfFLJt0AZ9QqZXGCPfJ7fQjvpln3Rq5+PS03LD32Ost1Q9N+eEnaQwGRIriKkMImXD56ocjQmfjbV3w==}
devalue@5.6.4:
resolution: {integrity: sha512-Gp6rDldRsFh/7XuouDbxMH3Mx8GMCcgzIb1pDTvNyn8pZGQ22u+Wa+lGV9dQCltFQ7uVw0MhRyb8XDskNFOReA==}
devlop@1.1.0:
resolution: {integrity: sha512-RWmIqhcFf1lRYBvNmr7qTNuyCt/7/ns2jbpp1+PalgE/rDQcBT0fioSMUpJ93irlUhC5hrg4cYqe6U+0ImW0rA==}
dlv@1.1.3:
resolution: {integrity: sha512-+HlytyjlPKnIG8XuRG8WvmBP8xs8P71y+SKKS6ZXWoEgLuePxtDoUEiH7WkdePWrQ5JBpE6aoVqfZfJUQkjXwA==}
dom-serializer@2.0.0:
resolution: {integrity: sha512-wIkAryiqt/nV5EQKqQpo3SToSOV9J0DnbJqwK7Wv/Trc92zIAYZ4FlMu+JPFW1DfGFt81ZTCGgDEabffXeLyJg==}
@@ -1531,6 +1637,9 @@ packages:
sqlite3:
optional: true
effect@3.21.0:
resolution: {integrity: sha512-PPN80qRokCd1f015IANNhrwOnLO7GrrMQfk4/lnZRE/8j7UPWrNNjPV0uBrZutI/nHzernbW+J0hdqQysHiSnQ==}
emoji-regex@10.6.0:
resolution: {integrity: sha512-toUI84YS5YmxW219erniWD0CIVOo46xGKColeNQRgOzDorgBi1v4D71/OFzgD9GO2UGKIv1C3Sp8DAn0+j5w7A==}
@@ -1631,6 +1740,10 @@ packages:
resolution: {integrity: sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==}
engines: {node: '>=0.10.0'}
fast-check@3.23.2:
resolution: {integrity: sha512-h5+1OzzfCC3Ef7VbtKdcv7zsstUQwUDlYpUTvjeUsJAssPgLn7QzbboPtL5ro04Mq0rPOsMzl7q5hIbRs2wD1A==}
engines: {node: '>=8.0.0'}
fast-deep-equal@3.1.3:
resolution: {integrity: sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==}
@@ -1796,6 +1909,9 @@ packages:
resolution: {integrity: sha512-ekilCSN1jwRvIbgeg/57YFh8qQDNbwDb9xT/qu2DAHbFFZUicIl4ygVaAvzveMhMVr3LnpSKTNnwt8PoOfmKhQ==}
hasBin: true
joi@17.13.3:
resolution: {integrity: sha512-otDA4ldcIx+ZXsKHWmp0YizCweVRZG96J10b0FevjfuncLO1oX59THoAmHkNubYJ+9gWsYsp5k8v4ib6oDv1fA==}
jose@6.1.2:
resolution: {integrity: sha512-MpcPtHLE5EmztuFIqB0vzHAWJPpmN1E6L4oo+kze56LIs3MyXIj9ZHMDxqOvkP38gBR7K1v3jqd4WU2+nrfONQ==}
@@ -1806,6 +1922,10 @@ packages:
json-buffer@3.0.1:
resolution: {integrity: sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==}
json-schema-to-ts@3.1.1:
resolution: {integrity: sha512-+DWg8jCJG2TEnpy7kOm/7/AxaYoaRbjVB4LFZLySZlWn8exGs3A4OLJR966cVvU26N7X9TWxl+Jsw7dzAqKT6g==}
engines: {node: '>=16'}
json-schema-traverse@0.4.1:
resolution: {integrity: sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==}
@@ -1835,6 +1955,9 @@ packages:
engines: {node: '>=16'}
hasBin: true
libphonenumber-js@1.12.41:
resolution: {integrity: sha512-lsmMmGXBxXIK/VMLEj0kL6MtUs1kBGj1nTCzi6zgQoG1DEwqwt2DQyHxcLykceIxAnfE3hya7NuIh6PpC6S3fA==}
lightningcss-android-arm64@1.30.2:
resolution: {integrity: sha512-BH9sEdOCahSgmkVhBLeU7Hc9DWeZ1Eb6wNS6Da8igvUwAe0sqROHddIlvU06q3WyXVEOYDZ6ykBZQnjTbmo4+A==}
engines: {node: '>= 12.0.0'}
@@ -1870,24 +1993,28 @@ packages:
engines: {node: '>= 12.0.0'}
cpu: [arm64]
os: [linux]
libc: [glibc]
lightningcss-linux-arm64-musl@1.30.2:
resolution: {integrity: sha512-5Vh9dGeblpTxWHpOx8iauV02popZDsCYMPIgiuw97OJ5uaDsL86cnqSFs5LZkG3ghHoX5isLgWzMs+eD1YzrnA==}
engines: {node: '>= 12.0.0'}
cpu: [arm64]
os: [linux]
libc: [musl]
lightningcss-linux-x64-gnu@1.30.2:
resolution: {integrity: sha512-Cfd46gdmj1vQ+lR6VRTTadNHu6ALuw2pKR9lYq4FnhvgBc4zWY1EtZcAc6EffShbb1MFrIPfLDXD6Xprbnni4w==}
engines: {node: '>= 12.0.0'}
cpu: [x64]
os: [linux]
libc: [glibc]
lightningcss-linux-x64-musl@1.30.2:
resolution: {integrity: sha512-XJaLUUFXb6/QG2lGIW6aIk6jKdtjtcffUT0NKvIqhSBY3hh9Ch+1LCeH80dR9q9LBjG3ewbDjnumefsLsP6aiA==}
engines: {node: '>= 12.0.0'}
cpu: [x64]
os: [linux]
libc: [musl]
lightningcss-win32-arm64-msvc@1.30.2:
resolution: {integrity: sha512-FZn+vaj7zLv//D/192WFFVA0RgHawIcHqLX9xuWiQt7P0PtdFEVaxgF9rjM/IRYHQXNnk61/H/gb2Ei+kUQ4xQ==}
@@ -1944,6 +2071,9 @@ packages:
mdurl@2.0.0:
resolution: {integrity: sha512-Lf+9+2r+Tdp5wXDXC4PcIBjTDtq4UKjCPMQhKIuzpJNW0b96kVqSwW0bT7FhRSfmAiFYgP+SCRvdrDozfh0U5w==}
memoize-weak@1.0.2:
resolution: {integrity: sha512-gj39xkrjEw7nCn4nJ1M5ms6+MyMlyiGmttzsqAUsAKn6bYKwuTHh/AO3cKPF8IBrTIYTxb0wWXFs3E//Y8VoWQ==}
mini-svg-data-uri@1.4.4:
resolution: {integrity: sha512-r9deDe9p5FJUPZAk3A59wGH7Ii9YrjjWw0jmw/liSbHl2CHiyXj6FcDXDu2K3TjVAXqiJdaw3xxwlZZr9E6nHg==}
hasBin: true
@@ -1974,6 +2104,10 @@ packages:
natural-compare@1.4.0:
resolution: {integrity: sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==}
normalize-url@8.1.1:
resolution: {integrity: sha512-JYc0DPlpGWB40kH5g07gGTrYuMqV653k3uBKY6uITPWds3M0ov3GaWGp9lbE3Bzngx8+XkfzgvASb9vk9JDFXQ==}
engines: {node: '>=14.16'}
oauth4webapi@3.8.3:
resolution: {integrity: sha512-pQ5BsX3QRTgnt5HxgHwgunIRaDXBdkT23tf8dfzmtTIL2LTpdmxgbpbBm0VgFWAIDlezQvQCTgnVIUmHupXHxw==}
@@ -2076,6 +2210,9 @@ packages:
engines: {node: '>=14'}
hasBin: true
property-expr@2.0.6:
resolution: {integrity: sha512-SVtmxhRE/CGkn3eZY1T6pC8Nln6Fr/lu1mKSgRud0eC73whjGfoAogbn78LkD8aFL0zz3bAFerKSnOl7NlErBA==}
prosemirror-changeset@2.3.1:
resolution: {integrity: sha512-j0kORIBm8ayJNl3zQvD1TTPHJX3g042et6y/KQhZhnPrruO8exkTgG8X+NRpj7kIyMMEx74Xb3DyMIBtO0IKkQ==}
@@ -2142,6 +2279,9 @@ packages:
resolution: {integrity: sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==}
engines: {node: '>=6'}
pure-rand@6.1.0:
resolution: {integrity: sha512-bVWawvoZoBYpp6yIoQtQXHZjmz35RSVHnUOTefl8Vcjr8snTPY1wnpSPMWekcFwbxI6gtmT7rSYPFvz71ldiOA==}
readdirp@4.1.2:
resolution: {integrity: sha512-GDhwkLfywWL2s6vEjyhri+eXmfH6j1L7JE27WhqLeYzoh/A3DBaYGEj2H/HFZCn/kMfim73FXxEJTw06WtxQwg==}
engines: {node: '>= 14.18.0'}
@@ -2208,6 +2348,10 @@ packages:
resolution: {integrity: sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==}
engines: {node: '>=8'}
superstruct@2.0.2:
resolution: {integrity: sha512-uV+TFRZdXsqXTL2pRvujROjdZQ4RAlBUS5BTh9IGm+jTqQntYThciG/qu57Gs69yjnVUSqdxF9YLmSnpupBW9A==}
engines: {node: '>=14.0.0'}
supports-color@7.2.0:
resolution: {integrity: sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==}
engines: {node: '>=8'}
@@ -2237,6 +2381,12 @@ packages:
resolution: {integrity: sha512-pHeUrp1A5S6RGaXhJB7PtYjL1VVjbVrJ2EfuAoPu9/1LeoMaJa/pcdCsCSb0gS4eUHAHnhCbUDxORZyvGK6kOQ==}
engines: {node: '>=18'}
sveltekit-superforms@2.30.1:
resolution: {integrity: sha512-wBzyqsE0idvEJWuNJ+HCiAtdxa7Z55GZ8jmtlVHJfonrk9bRYC49MoPaloYyFoYuU3QPy6Omna/Qzn1kaIkgew==}
peerDependencies:
'@sveltejs/kit': 1.x || 2.x
svelte: 3.x || 4.x || >=5.0.0-next.51
tailwind-merge@3.4.0:
resolution: {integrity: sha512-uSaO4gnW+b3Y2aWoWfFpX62vn2sR3skfhbjsEnaBI81WD1wBLlHZe5sWf0AqjksNdYTbGBEd0UasQMT3SNV15g==}
@@ -2257,6 +2407,9 @@ packages:
resolution: {integrity: sha512-g9ljZiwki/LfxmQADO3dEY1CbpmXT5Hm2fJ+QaGKwSXUylMybePR7/67YW7jOrrvjEgL1Fmz5kzyAjWVWLlucg==}
engines: {node: '>=6'}
tiny-case@1.0.3:
resolution: {integrity: sha512-Eet/eeMhkO6TX8mnUteS9zgPbUMQa4I6Kkp5ORiBD5476/m+PIRiumP5tmh5ioJpH7k51Kehawy2UDfsnxxY8Q==}
tinyglobby@0.2.15:
resolution: {integrity: sha512-j2Zq4NyQYG5XMST4cbs02Ak8iJUdxRM0XI5QyxXuZOzKOINmWurp3smXu3y5wDcJrptwpSjgXHzIQxR0omXljQ==}
engines: {node: '>=12.0.0'}
@@ -2264,20 +2417,37 @@ packages:
tippy.js@6.3.7:
resolution: {integrity: sha512-E1d3oP2emgJ9dRQZdf3Kkn0qJgI6ZLpyS5z6ZkY1DF3kaQaBsGZsndEpHwx+eC+tYM41HaSNvNtLx8tU57FzTQ==}
toposort@2.0.2:
resolution: {integrity: sha512-0a5EOkAUp8D4moMi2W8ZF8jcga7BgZd91O/yabJCFY8az+XSzeGyTKs0Aoo897iV1Nj6guFq8orWDS96z91oGg==}
totalist@3.0.1:
resolution: {integrity: sha512-sf4i37nQ2LBx4m3wB74y+ubopq6W/dIzXg0FDGjsYnZHVa1Da8FH853wlL2gtUhg+xJXjfk3kUZS3BRoQeoQBQ==}
engines: {node: '>=6'}
ts-algebra@2.0.0:
resolution: {integrity: sha512-FPAhNPFMrkwz76P7cdjdmiShwMynZYN6SgOujD1urY4oNm80Ou9oMdmbR45LotcKOXoy7wSmHkRFE6Mxbrhefw==}
ts-api-utils@2.1.0:
resolution: {integrity: sha512-CUgTZL1irw8u29bzrOD/nH85jqyc74D6SshFgujOIA7osm2Rz7dYH77agkx7H4FBNxDq7Cjf+IjaX/8zwFW+ZQ==}
engines: {node: '>=18.12'}
peerDependencies:
typescript: '>=4.8.4'
ts-deepmerge@7.0.3:
resolution: {integrity: sha512-Du/ZW2RfwV/D4cmA5rXafYjBQVuvu4qGiEEla4EmEHVHgRdx68Gftx7i66jn2bzHPwSVZY36Ae6OuDn9el4ZKA==}
engines: {node: '>=14.13.1'}
type-check@0.4.0:
resolution: {integrity: sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==}
engines: {node: '>= 0.8.0'}
type-fest@2.19.0:
resolution: {integrity: sha512-RAH822pAdBgcNMAfWnCBU3CFZcfZ/i1eZjwFU/dsLKumyuuP3niueg2UAukXYF0E2AAoc82ZSSf9J0WQBinzHA==}
engines: {node: '>=12.20'}
typebox@1.1.14:
resolution: {integrity: sha512-R9qoa9IE8Yevoy06ixre1VkribJwOl1wj5fq60gUK6Qxkd2Cw+omHEaHnJh+uE4ewMjLWweR3RERKvhjEtLWsA==}
typescript-eslint@8.48.0:
resolution: {integrity: sha512-fcKOvQD9GUn3Xw63EgiDqhvWJ5jsyZUaekl3KVpGsDJnN46WJTe3jWxtQP9lMZm1LJNkFLlTaWAxK2vUQR+cqw==}
engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
@@ -2314,6 +2484,18 @@ packages:
typescript:
optional: true
valibot@1.3.1:
resolution: {integrity: sha512-sfdRir/QFM0JaF22hqTroPc5xy4DimuGQVKFrzF1YfGwaS1nJot3Y8VqMdLO2Lg27fMzat2yD3pY5PbAYO39Gg==}
peerDependencies:
typescript: '>=5'
peerDependenciesMeta:
typescript:
optional: true
validator@13.15.35:
resolution: {integrity: sha512-TQ5pAGhd5whStmqWvYF4OjQROlmv9SMFVt37qoCBdqRffuuklWYQlCNnEs2ZaIBD1kZRNnikiZOS1eqgkar0iw==}
engines: {node: '>= 0.10'}
vite@7.2.4:
resolution: {integrity: sha512-NL8jTlbo0Tn4dUEXEsUg8KeyG/Lkmc4Fnzb8JXN/Ykm9G4HNImjtABMJgkQoVjOBN/j2WAwDTRytdqJbZsah7w==}
engines: {node: ^20.19.0 || >=22.12.0}
@@ -2402,13 +2584,32 @@ packages:
resolution: {integrity: sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==}
engines: {node: '>=10'}
yup@1.7.1:
resolution: {integrity: sha512-GKHFX2nXul2/4Dtfxhozv701jLQHdf6J34YDh2cEkpqoo8le5Mg6/LrdseVLrFarmFygZTlfIhHx/QKfb/QWXw==}
zimmerframe@1.1.4:
resolution: {integrity: sha512-B58NGBEoc8Y9MWWCQGl/gq9xBCe4IiKM0a2x7GZdQKOW5Exr8S1W24J6OgM1njK8xCRGvAJIL/MxXHf6SkmQKQ==}
zod-v3-to-json-schema@4.0.0:
resolution: {integrity: sha512-KixLrhX/uPmRFnDgsZrzrk4x5SSJA+PmaE5adbfID9+3KPJcdxqRobaHU397EfWBqfQircrjKqvEqZ/mW5QH6w==}
peerDependencies:
zod: ^3.25 || ^4.0.14
zod@4.3.6:
resolution: {integrity: sha512-rftlrkhHZOcjDwkGlnUtZZkvaPHCsDATp4pGpuOOMDaTdDDXF91wuVDJoWoPsKX/3YPQ5fHuF3STjcYyKr+Qhg==}
snapshots:
'@alloc/quick-lru@5.2.0': {}
'@ark/schema@0.56.0':
dependencies:
'@ark/util': 0.56.0
optional: true
'@ark/util@0.56.0':
optional: true
'@auth/core@0.41.1':
dependencies:
'@panva/hkdf': 1.2.1
@@ -2432,6 +2633,9 @@ snapshots:
set-cookie-parser: 2.7.2
svelte: 5.43.14
'@babel/runtime@7.29.2':
optional: true
'@drizzle-team/brocli@0.10.2': {}
'@esbuild-kit/core-utils@3.3.2':
@@ -2640,6 +2844,9 @@ snapshots:
'@eslint/core': 0.17.0
levn: 0.4.1
'@exodus/schemasafe@1.3.0':
optional: true
'@floating-ui/core@1.7.3':
dependencies:
'@floating-ui/utils': 0.2.10
@@ -2723,6 +2930,14 @@ snapshots:
- highlight.js
- y-prosemirror
'@hapi/hoek@9.3.0':
optional: true
'@hapi/topo@5.1.0':
dependencies:
'@hapi/hoek': 9.3.0
optional: true
'@humanfs/core@0.19.1': {}
'@humanfs/node@0.16.7':
@@ -2759,6 +2974,9 @@ snapshots:
'@popperjs/core@2.11.8': {}
'@poppinss/macroable@1.1.2':
optional: true
'@remirror/core-constants@3.0.0': {}
'@rollup/plugin-commonjs@28.0.9(rollup@4.53.3)':
@@ -2873,8 +3091,22 @@ snapshots:
'@rollup/rollup-win32-x64-msvc@4.53.3':
optional: true
'@sideway/address@4.1.5':
dependencies:
'@hapi/hoek': 9.3.0
optional: true
'@sideway/formula@3.0.1':
optional: true
'@sideway/pinpoint@2.0.0':
optional: true
'@standard-schema/spec@1.0.0': {}
'@standard-schema/spec@1.1.0':
optional: true
'@sveltejs/acorn-typescript@1.0.7(acorn@8.15.0)':
dependencies:
acorn: 8.15.0
@@ -3374,6 +3606,23 @@ snapshots:
'@types/unist@3.0.3': {}
'@types/validator@13.15.10':
optional: true
'@typeschema/class-validator@0.3.0(@types/json-schema@7.0.15)(class-validator@0.14.4)':
dependencies:
'@typeschema/core': 0.14.0(@types/json-schema@7.0.15)
optionalDependencies:
class-validator: 0.14.4
transitivePeerDependencies:
- '@types/json-schema'
optional: true
'@typeschema/core@0.14.0(@types/json-schema@7.0.15)':
optionalDependencies:
'@types/json-schema': 7.0.15
optional: true
'@typescript-eslint/eslint-plugin@8.48.0(@typescript-eslint/parser@8.48.0(eslint@9.39.1(jiti@2.6.1))(typescript@5.9.3))(eslint@9.39.1(jiti@2.6.1))(typescript@5.9.3)':
dependencies:
'@eslint-community/regexpp': 4.12.2
@@ -3466,6 +3715,26 @@ snapshots:
'@typescript-eslint/types': 8.48.0
eslint-visitor-keys: 4.2.1
'@valibot/to-json-schema@1.6.0(valibot@1.3.1(typescript@5.9.3))':
dependencies:
valibot: 1.3.1(typescript@5.9.3)
optional: true
'@vinejs/compiler@3.0.0':
optional: true
'@vinejs/vine@3.0.1':
dependencies:
'@poppinss/macroable': 1.1.2
'@types/validator': 13.15.10
'@vinejs/compiler': 3.0.0
camelcase: 8.0.0
dayjs: 1.11.20
dlv: 1.1.3
normalize-url: 8.1.1
validator: 13.15.35
optional: true
'@yr/monotone-cubic-spline@1.0.3': {}
acorn-jsx@5.3.2(acorn@8.15.0):
@@ -3498,6 +3767,18 @@ snapshots:
aria-query@5.3.2: {}
arkregex@0.0.5:
dependencies:
'@ark/util': 0.56.0
optional: true
arktype@2.2.0:
dependencies:
'@ark/schema': 0.56.0
'@ark/util': 0.56.0
arkregex: 0.0.5
optional: true
axobject-query@4.1.0: {}
balanced-match@1.0.2: {}
@@ -3515,6 +3796,9 @@ snapshots:
callsites@3.1.0: {}
camelcase@8.0.0:
optional: true
chalk@4.1.2:
dependencies:
ansi-styles: 4.3.0
@@ -3524,6 +3808,13 @@ snapshots:
dependencies:
readdirp: 4.1.2
class-validator@0.14.4:
dependencies:
'@types/validator': 13.15.10
libphonenumber-js: 1.12.41
validator: 13.15.35
optional: true
clsx@2.1.1: {}
color-convert@2.0.1:
@@ -3552,6 +3843,9 @@ snapshots:
date-fns@4.1.0: {}
dayjs@1.11.20:
optional: true
debug@4.4.3:
dependencies:
ms: 2.1.3
@@ -3566,10 +3860,15 @@ snapshots:
devalue@5.5.0: {}
devalue@5.6.4: {}
devlop@1.1.0:
dependencies:
dequal: 2.0.3
dlv@1.1.3:
optional: true
dom-serializer@2.0.0:
dependencies:
domelementtype: 2.3.0
@@ -3601,6 +3900,12 @@ snapshots:
optionalDependencies:
postgres: 3.4.7
effect@3.21.0:
dependencies:
'@standard-schema/spec': 1.1.0
fast-check: 3.23.2
optional: true
emoji-regex@10.6.0: {}
emojibase-data@15.3.2(emojibase@17.0.0):
@@ -3773,6 +4078,11 @@ snapshots:
esutils@2.0.3: {}
fast-check@3.23.2:
dependencies:
pure-rand: 6.1.0
optional: true
fast-deep-equal@3.1.3: {}
fast-json-stable-stringify@2.1.0: {}
@@ -3947,6 +4257,15 @@ snapshots:
jiti@2.6.1: {}
joi@17.13.3:
dependencies:
'@hapi/hoek': 9.3.0
'@hapi/topo': 5.1.0
'@sideway/address': 4.1.5
'@sideway/formula': 3.0.1
'@sideway/pinpoint': 2.0.0
optional: true
jose@6.1.2: {}
js-yaml@4.1.1:
@@ -3955,6 +4274,12 @@ snapshots:
json-buffer@3.0.1: {}
json-schema-to-ts@3.1.1:
dependencies:
'@babel/runtime': 7.29.2
ts-algebra: 2.0.0
optional: true
json-schema-traverse@0.4.1: {}
json-stable-stringify-without-jsonify@1.0.1: {}
@@ -3980,6 +4305,9 @@ snapshots:
dependencies:
isomorphic.js: 0.2.5
libphonenumber-js@1.12.41:
optional: true
lightningcss-android-arm64@1.30.2:
optional: true
@@ -4070,6 +4398,8 @@ snapshots:
mdurl@2.0.0: {}
memoize-weak@1.0.2: {}
mini-svg-data-uri@1.4.4: {}
minimatch@3.1.2:
@@ -4090,6 +4420,9 @@ snapshots:
natural-compare@1.4.0: {}
normalize-url@8.1.1:
optional: true
oauth4webapi@3.8.3: {}
optionator@0.9.4:
@@ -4170,6 +4503,9 @@ snapshots:
prettier@3.6.2: {}
property-expr@2.0.6:
optional: true
prosemirror-changeset@2.3.1:
dependencies:
prosemirror-transform: 1.10.5
@@ -4277,6 +4613,9 @@ snapshots:
punycode@2.3.1: {}
pure-rand@6.1.0:
optional: true
readdirp@4.1.2: {}
resolve-from@4.0.0: {}
@@ -4359,6 +4698,9 @@ snapshots:
strip-json-comments@3.1.1: {}
superstruct@2.0.2:
optional: true
supports-color@7.2.0:
dependencies:
has-flag: 4.0.0
@@ -4405,6 +4747,34 @@ snapshots:
magic-string: 0.30.21
zimmerframe: 1.1.4
sveltekit-superforms@2.30.1(@sveltejs/kit@2.49.0(@sveltejs/vite-plugin-svelte@6.2.1(svelte@5.43.14)(vite@7.2.4(@types/node@20.19.25)(jiti@2.6.1)(lightningcss@1.30.2)))(svelte@5.43.14)(vite@7.2.4(@types/node@20.19.25)(jiti@2.6.1)(lightningcss@1.30.2)))(@types/json-schema@7.0.15)(svelte@5.43.14)(typescript@5.9.3):
dependencies:
'@sveltejs/kit': 2.49.0(@sveltejs/vite-plugin-svelte@6.2.1(svelte@5.43.14)(vite@7.2.4(@types/node@20.19.25)(jiti@2.6.1)(lightningcss@1.30.2)))(svelte@5.43.14)(vite@7.2.4(@types/node@20.19.25)(jiti@2.6.1)(lightningcss@1.30.2))
devalue: 5.6.4
memoize-weak: 1.0.2
svelte: 5.43.14
ts-deepmerge: 7.0.3
optionalDependencies:
'@exodus/schemasafe': 1.3.0
'@standard-schema/spec': 1.1.0
'@typeschema/class-validator': 0.3.0(@types/json-schema@7.0.15)(class-validator@0.14.4)
'@valibot/to-json-schema': 1.6.0(valibot@1.3.1(typescript@5.9.3))
'@vinejs/vine': 3.0.1
arktype: 2.2.0
class-validator: 0.14.4
effect: 3.21.0
joi: 17.13.3
json-schema-to-ts: 3.1.1
superstruct: 2.0.2
typebox: 1.1.14
valibot: 1.3.1(typescript@5.9.3)
yup: 1.7.1
zod: 4.3.6
zod-v3-to-json-schema: 4.0.0(zod@4.3.6)
transitivePeerDependencies:
- '@types/json-schema'
- typescript
tailwind-merge@3.4.0: {}
tailwind-variants@3.2.2(tailwind-merge@3.4.0)(tailwindcss@4.1.17):
@@ -4417,6 +4787,9 @@ snapshots:
tapable@2.3.0: {}
tiny-case@1.0.3:
optional: true
tinyglobby@0.2.15:
dependencies:
fdir: 6.5.0(picomatch@4.0.3)
@@ -4426,16 +4799,30 @@ snapshots:
dependencies:
'@popperjs/core': 2.11.8
toposort@2.0.2:
optional: true
totalist@3.0.1: {}
ts-algebra@2.0.0:
optional: true
ts-api-utils@2.1.0(typescript@5.9.3):
dependencies:
typescript: 5.9.3
ts-deepmerge@7.0.3: {}
type-check@0.4.0:
dependencies:
prelude-ls: 1.2.1
type-fest@2.19.0:
optional: true
typebox@1.1.14:
optional: true
typescript-eslint@8.48.0(eslint@9.39.1(jiti@2.6.1))(typescript@5.9.3):
dependencies:
'@typescript-eslint/eslint-plugin': 8.48.0(@typescript-eslint/parser@8.48.0(eslint@9.39.1(jiti@2.6.1))(typescript@5.9.3))(eslint@9.39.1(jiti@2.6.1))(typescript@5.9.3)
@@ -4465,6 +4852,14 @@ snapshots:
optionalDependencies:
typescript: 5.9.3
valibot@1.3.1(typescript@5.9.3):
optionalDependencies:
typescript: 5.9.3
optional: true
validator@13.15.35:
optional: true
vite@7.2.4(@types/node@20.19.25)(jiti@2.6.1)(lightningcss@1.30.2):
dependencies:
esbuild: 0.25.12
@@ -4513,4 +4908,20 @@ snapshots:
yocto-queue@0.1.0: {}
yup@1.7.1:
dependencies:
property-expr: 2.0.6
tiny-case: 1.0.3
toposort: 2.0.2
type-fest: 2.19.0
optional: true
zimmerframe@1.1.4: {}
zod-v3-to-json-schema@4.0.0(zod@4.3.6):
dependencies:
zod: 4.3.6
optional: true
zod@4.3.6:
optional: true
+17 -10
View File
@@ -1,26 +1,33 @@
<script lang="ts">
import { Button, Input, Label, Textarea } from 'flowbite-svelte';
import RichText from '../RichText.svelte';
interface Akti {
title: string;
summary: string;
body: string;
}
let { akti }: { akti: Akti } = $props();
import { superForm } from 'sveltekit-superforms';
let { data } = $props();
const { form, errors, enhance } = superForm(data);
</script>
<form method="POST" class="flex flex-col gap-5">
<form method="POST" use:enhance class="flex flex-col gap-5">
<div>
<Label>Titu</Label>
<Input value={akti.title} type="text" name="title" required minlength={5} />
<Input bind:value={$form.title} type="text" name="title" required minlength={5} />
{#if $errors.title}<span class="text-sm text-red-500">{$errors.title}</span>{/if}
</div>
<div>
<Label>Zämefassig</Label>
<Textarea value={akti.summary} name="summary" required minlength={5} class="w-full min-h-40" />
<Textarea
bind:value={$form.summary}
name="summary"
required
minlength={5}
class="w-full min-h-40"
/>
{#if $errors.summary}<span class="text-sm text-red-500">{$errors.summary}</span>{/if}
</div>
<div>
<Label>Inhaut</Label>
<RichText value={akti.body} name="body" required />
<RichText bind:value={$form.body} name="body" required />
{#if $errors.body}<span class="text-sm text-red-500">{$errors.body}</span>{/if}
</div>
<Button type="submit" class="grow-0 self-end">Spichere</Button>
</form>
@@ -1,27 +1,28 @@
<script lang="ts">
import { Button, Label, Textarea } from 'flowbite-svelte';
import RatingInput from './RatingInput.svelte';
interface Rating {
rating: number;
comment: string;
}
let { rating }: { rating: Rating } = $props();
import { superForm } from 'sveltekit-superforms';
let { data } = $props();
const { form, errors, enhance } = superForm(data);
</script>
<form method="POST" class="flex flex-col gap-5">
<form method="POST" use:enhance class="flex flex-col gap-5">
<div>
<Label>Komentar</Label>
<Textarea
value={rating.comment}
bind:value={$form.comment}
name="comment"
required
minlength={5}
class="w-full min-h-40"
/>
{#if $errors.comment}<span class="text-sm text-red-500">{$errors.comment}</span>{/if}
</div>
<div>
<Label>Bewärtig</Label>
<RatingInput value={rating.rating} name="rating" />
<RatingInput bind:value={$form.rating} name="rating" />
{#if $errors.rating}<span class="text-sm text-red-500">{$errors.rating}</span>{/if}
</div>
<Button type="submit" class="grow-0 self-end">Spichere</Button>
</form>
-62
View File
@@ -1,62 +0,0 @@
/*
* Code from: https://jovianmoon.io/posts/sveltekit-form-validation-with-valibot
*/
import { dev } from '$app/environment';
import * as v from 'valibot';
export const extractFormData = async <TInput = unknown, TOutput = TInput>(
request: Request,
schema: v.BaseSchema<TInput, TOutput, v.BaseIssue<unknown>>
): Promise<{
data: TOutput | undefined;
error: string | null;
}> => {
try {
const formData = await request.formData();
// eslint-disable-next-line @typescript-eslint/no-explicit-any
const result: Record<string, any> = {};
// Convert form data to an object with proper handling of multiple values
formData.forEach((value, key) => {
// Case 1: First time encountering this key
if (result[key] === undefined) {
result[key] = value;
}
// Case 2: Key exists and is already an array, add new value
else if (Array.isArray(result[key])) {
result[key].push(value);
}
// Case 3: Key exists but isn't an array yet, convert to array with both values
else {
result[key] = [result[key], value];
}
});
const validation = v.safeParse(schema, result);
if (!validation.success) {
if (dev) {
console.error('Validation errors:');
for (const error of validation.issues) {
console.error(`- ${error.message}`);
}
}
if (validation.issues && validation.issues.length > 0) {
return {
data: undefined,
error: validation.issues.map((issue) => issue.message).join(', ')
};
}
return {
data: undefined,
error: 'Error validating form submission, please check everything carefully.'
};
}
return { data: validation.output as TOutput, error: null };
} catch (error) {
if (dev) {
console.error(`Error extracting form data: ${error}`);
}
return { data: undefined, error: `Error extracting form data: ${error}` };
}
};
+18 -14
View File
@@ -1,32 +1,36 @@
import { redirect, type Actions } from '@sveltejs/kit';
import { redirect, type Actions, fail } from '@sveltejs/kit';
import type { PageServerLoad } from './$types';
import { extractFormData } from '$lib/extractFormData';
import { superValidate } from 'sveltekit-superforms';
import { valibot } from 'sveltekit-superforms/adapters';
import { resolve } from '$app/paths';
import * as v from 'valibot';
import { ensureAuth } from '$lib/auth';
import { db } from '$lib/server/db';
import { aktis } from '$lib/server/db/schema';
const schema = v.object({
title: v.pipe(v.string(), v.minLength(5)),
summary: v.pipe(v.string(), v.minLength(5)),
body: v.pipe(v.string(), v.minLength(5))
});
export const load: PageServerLoad = async (event) => {
await ensureAuth(event);
return {};
const form = await superValidate(valibot(schema));
return { form };
};
export const actions = {
default: async (event) => {
const user = await ensureAuth(event);
const akti = (
await extractFormData(
event.request,
v.object({
title: v.pipe(v.string(), v.minLength(5)),
summary: v.pipe(v.string(), v.minLength(5)),
body: v.pipe(v.string(), v.minLength(5))
})
)
).data;
const form = await superValidate(event, valibot(schema));
if (!form.valid) {
return fail(400, { form });
}
if (!akti) return {};
const akti = form.data;
const res = await db
.insert(aktis)
+2 -1
View File
@@ -1,5 +1,6 @@
<script lang="ts">
import AktiEditor from '$lib/components/akti/AktiEditor.svelte';
let { data } = $props();
</script>
<AktiEditor akti={{ title: '', summary: '', body: '' }} />
<AktiEditor data={data.form} />
+19 -14
View File
@@ -1,13 +1,20 @@
import { db } from '$lib/server/db';
import { aktis, ratings } from '$lib/server/db/schema';
import { error, redirect, type Actions } from '@sveltejs/kit';
import { error, redirect, type Actions, fail } from '@sveltejs/kit';
import { and, eq } from 'drizzle-orm';
import type { PageServerLoad } from './$types';
import { ensureAuth } from '$lib/auth';
import { extractFormData } from '$lib/extractFormData';
import { superValidate } from 'sveltekit-superforms';
import { valibot } from 'sveltekit-superforms/adapters';
import * as v from 'valibot';
import { resolve } from '$app/paths';
const schema = v.object({
title: v.pipe(v.string(), v.minLength(5)),
summary: v.pipe(v.string(), v.minLength(5)),
body: v.pipe(v.string(), v.minLength(5))
});
export const load: PageServerLoad = async (event) => {
const akti = await db.query.aktis.findFirst({
where: eq(aktis.id, event.params.aktiId),
@@ -23,11 +30,15 @@ export const load: PageServerLoad = async (event) => {
error(404, { message: 'Die Akti gits garnid, sorry...' });
}
const form = await superValidate(akti, valibot(schema));
return {
akti,
ratings: r
ratings: r,
form
};
};
export const actions = {
default: async (event) => {
const user = await ensureAuth(event);
@@ -43,18 +54,12 @@ export const actions = {
if (!akti || akti.length == 0) return error(404);
if (akti[0].author != user.id) return error(403);
const changeRequest = (
await extractFormData(
event.request,
v.object({
title: v.pipe(v.string(), v.minLength(5)),
summary: v.pipe(v.string(), v.minLength(5)),
body: v.pipe(v.string(), v.minLength(5))
})
)
).data;
const form = await superValidate(event, valibot(schema));
if (!form.valid) {
return fail(400, { form });
}
if (!changeRequest) return error(400);
const changeRequest = form.data;
await db
.update(aktis)
+1 -1
View File
@@ -36,7 +36,7 @@
</div>
{#if edit}
<AktiEditor akti={data.akti} />
<AktiEditor data={data.form} />
{:else}
<div class="p-5 my-5 bg-gray-200 rounded-md">
<h3 class="mb-2">Zämefassig</h3>
@@ -1,7 +1,8 @@
import type { PageServerLoad } from './$types';
import { ensureAuth } from '$lib/auth';
import { error, redirect, type Actions } from '@sveltejs/kit';
import { extractFormData } from '$lib/extractFormData';
import { error, redirect, type Actions, fail } from '@sveltejs/kit';
import { superValidate } from 'sveltekit-superforms';
import { valibot } from 'sveltekit-superforms/adapters';
import { aktis, ratings } from '$lib/server/db/schema';
import { eq } from 'drizzle-orm';
@@ -9,6 +10,11 @@ import * as v from 'valibot';
import { db } from '$lib/server/db';
import { resolve } from '$app/paths';
const schema = v.object({
comment: v.pipe(v.string(), v.minLength(5)),
rating: v.pipe(v.number(), v.minValue(0), v.maxValue(5))
});
export const load: PageServerLoad = async (event) => {
const user = await ensureAuth(event);
@@ -21,7 +27,8 @@ export const load: PageServerLoad = async (event) => {
if (res[0].authorId === user.id) return error(403);
return;
const form = await superValidate(valibot(schema));
return { form };
};
export const actions = {
@@ -39,25 +46,13 @@ export const actions = {
if (!akti || akti.length == 0) return error(404);
if (akti[0].author == user.id) return error(403);
const rating = (
await extractFormData(
event.request,
v.object({
comment: v.pipe(v.string(), v.minLength(5)),
rating: v.pipe(
v.string(),
v.transform((i) => Number.parseFloat(i)),
v.minValue(0),
v.maxValue(5)
)
})
)
).data;
if (!rating) return error(400);
const form = await superValidate(event, valibot(schema));
if (!form.valid) {
return fail(400, { form });
}
await db.insert(ratings).values({
...rating,
...form.data,
userId: user.id,
aktiId: event.params.aktiId,
aktiVersion: akti[0].version
@@ -1,10 +1,6 @@
<script lang="ts">
import RatingEditor from '$lib/components/rating/RatingEditor.svelte';
let { data } = $props();
</script>
<RatingEditor
rating={{
comment: '',
rating: 5
}}
/>
<RatingEditor data={data.form} />