M1 (partial): tRPC API layer, storage, and three real fixes

Stands up packages/api so the swipe path stops trusting its caller, and
puts the auth library behind an interface we own.

- packages/api: tRPC v11 with a Session type WE define, not one
  re-exported from an auth library. Swapping providers means rewriting
  one SessionResolver, not touching a router.
- Procedure layers: public / protected / client / pro / verifiedPro /
  admin. Admin routes 404 rather than 403 so they cannot be probed.
- deck router replaces the untrusted server action. Ownership is checked
  on every operation and returns NOT_FOUND, never FORBIDDEN, so job ids
  cannot be enumerated. 23 tests, mostly authorization.
- packages/storage: presigned direct-to-R2 uploads. The server picks the
  key, so a caller can only write under their own user id. 14 tests.

Three defects found and fixed:
- The lazy db Proxy failed drizzle's is(db, PgDatabase) because it did
  not trap getPrototypeOf. Auth adapters dispatch on exactly that check,
  so this would have failed at runtime inside third-party code. Fixed
  and pinned with a regression test.
- The open-request cap was a read-then-write race: concurrent swipes
  could both read 4 and both insert. Now one transaction with the job
  row locked. The cap is checked before the tombstone is written, so a
  rejected swipe leaves no trace and the card stays on the deck.
- superjson was configured in two of the three required places. Without
  the QueryClient dehydrate/hydrate pair, RSC-prefetched data arrives as
  a raw envelope with no type error to warn you.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
This commit is contained in:
serfowi
2026-08-20 14:11:07 -04:00
co-authored by Claude Opus 5
parent 19623bcccb
commit 66dd4ac942
27 changed files with 2255 additions and 3 deletions
+454
View File
@@ -23,12 +23,30 @@ importers:
apps/web:
dependencies:
'@linkder/api':
specifier: workspace:*
version: link:../../packages/api
'@linkder/db':
specifier: workspace:*
version: link:../../packages/db
'@linkder/shared':
specifier: workspace:*
version: link:../../packages/shared
'@linkder/storage':
specifier: workspace:*
version: link:../../packages/storage
'@tanstack/react-query':
specifier: ^5.62.0
version: 5.101.4(react@19.2.8)
'@trpc/client':
specifier: ^11.18.0
version: 11.18.0(@trpc/server@11.18.0(typescript@5.9.3))(typescript@5.9.3)
'@trpc/react-query':
specifier: ^11.18.0
version: 11.18.0(@tanstack/react-query@5.101.4(react@19.2.8))(@trpc/client@11.18.0(@trpc/server@11.18.0(typescript@5.9.3))(typescript@5.9.3))(@trpc/server@11.18.0(typescript@5.9.3))(react@19.2.8)(typescript@5.9.3)
'@trpc/server':
specifier: ^11.18.0
version: 11.18.0(typescript@5.9.3)
class-variance-authority:
specifier: ^0.7.1
version: 0.7.1
@@ -53,6 +71,9 @@ importers:
react-dom:
specifier: ^19.0.0
version: 19.2.8(react@19.2.8)
superjson:
specifier: ^2.2.6
version: 2.2.6
tailwind-merge:
specifier: ^2.6.0
version: 2.6.1
@@ -85,6 +106,40 @@ importers:
specifier: ^5.7.3
version: 5.9.3
packages/api:
dependencies:
'@linkder/db':
specifier: workspace:*
version: link:../db
'@linkder/shared':
specifier: workspace:*
version: link:../shared
'@linkder/storage':
specifier: workspace:*
version: link:../storage
'@trpc/server':
specifier: ^11.18.0
version: 11.18.0(typescript@5.9.3)
drizzle-orm:
specifier: 0.38.4
version: 0.38.4(@types/react@19.2.18)(postgres@3.4.9)(react@19.2.8)
superjson:
specifier: ^2.2.6
version: 2.2.6
zod:
specifier: ^3.24.1
version: 3.25.76
devDependencies:
dotenv:
specifier: 16.4.7
version: 16.4.7
typescript:
specifier: ^5.7.3
version: 5.9.3
vitest:
specifier: ^2.1.8
version: 2.1.9(@types/node@22.20.1)(lightningcss@1.32.0)
packages/db:
dependencies:
'@linkder/shared':
@@ -126,12 +181,107 @@ importers:
specifier: ^2.1.8
version: 2.1.9(@types/node@22.20.1)(lightningcss@1.32.0)
packages/storage:
dependencies:
'@aws-sdk/client-s3':
specifier: ^3.717.0
version: 3.1114.0
'@aws-sdk/s3-request-presigner':
specifier: ^3.717.0
version: 3.1114.0
zod:
specifier: ^3.24.1
version: 3.25.76
devDependencies:
typescript:
specifier: ^5.7.3
version: 5.9.3
vitest:
specifier: ^2.1.8
version: 2.1.9(@types/node@22.20.1)(lightningcss@1.32.0)
packages:
'@alloc/quick-lru@5.2.0':
resolution: {integrity: sha512-UrcABB+4bUrFABwbluTIBErXwvbsU/V7TZWfmbgJfbkwiBuziS9gxdODUyuiecfdGQ85jglMW6juS3+z5TsKLw==}
engines: {node: '>=10'}
'@aws-sdk/checksums@3.1000.28':
resolution: {integrity: sha512-VCpnmyHQ1IH49ni3LXnQj7DPr7rmcJmzYeiCkYdCcfgNtkvOj38cdcL9lapBWoItZWFACJPFJlymqC7/gem3Gw==}
engines: {node: '>=20.0.0'}
'@aws-sdk/client-s3@3.1114.0':
resolution: {integrity: sha512-ZeAgOtB+CXFaWXph98U7a/XrBlVx1lQ2rCJRWLxLmAaQ9k5lht6DWfwnEcVjdzduK/ySao1tCjq0fBAScGqjAg==}
engines: {node: '>=20.0.0'}
'@aws-sdk/core@3.977.8':
resolution: {integrity: sha512-7+Kcrkvrk9lM/m7jRhHpT4jCdvzGHsuaSRbF8TdzzkY1mRzp/Ogwf9c7H29k4gGhey0BBWhCWr16+t0J61gwmg==}
engines: {node: '>=20.0.0'}
'@aws-sdk/credential-provider-env@3.972.69':
resolution: {integrity: sha512-AreCFzcB4kH2HF9031Ot0jSJr3KXvRg6e8uDeub20JEVdZU3Bv0sTq1plc7VsT3KiqutlzH7l0j50UcCWHUioA==}
engines: {node: '>=20.0.0'}
'@aws-sdk/credential-provider-http@3.972.71':
resolution: {integrity: sha512-A8ObcqVmDMnk4F9NozZ7JwmUu9Q4xyBJkmyq1C5U+wNM9ht9J7+EuuyabsLWXZnOoTqFaJuYBYTKf5CTipkEjA==}
engines: {node: '>=20.0.0'}
'@aws-sdk/credential-provider-ini@3.973.14':
resolution: {integrity: sha512-7c+Wti2LsERNWMfm7ySz3/6RPopFW3Nmn7s63Xpcq6R/tRuY5hpvkHA2xVgi5ukJbvok9l0IDtVEvqTtg+X7dw==}
engines: {node: '>=20.0.0'}
'@aws-sdk/credential-provider-login@3.972.76':
resolution: {integrity: sha512-LVixwOnEJfrrfKHeZjBA8pIMTZjNDq8ak8VpcoWUuCJDrSnBNU8POJksULMgvN089P0MXtQYH2Zs627/MK1K0g==}
engines: {node: '>=20.0.0'}
'@aws-sdk/credential-provider-node@3.972.80':
resolution: {integrity: sha512-bE2qh8ww4iClO1jHsBXdOE8FUgzDbdxbyorNjSCoPSkQd51k3jODItuPZfuwcLHZqDXsH+bI4AMHhqtuyR7mSg==}
engines: {node: '>=20.0.0'}
'@aws-sdk/credential-provider-process@3.972.69':
resolution: {integrity: sha512-9kpTNdZTrcqXTfhxM7fgl9Z68ek3Fu5oe3Yf+A/pJGibEqpgZxz2tSY7SinmyCIU2PJ+ygY4FPoBBnLpocMtrQ==}
engines: {node: '>=20.0.0'}
'@aws-sdk/credential-provider-sso@3.973.13':
resolution: {integrity: sha512-Oc81qauMPzUoTnAS2YKpNwY6sY/LUyQTEeaf6yP197WMxkEBQfcKLR1MFpD7+pNTubXnfkH6gwpji+Gc7iyD2Q==}
engines: {node: '>=20.0.0'}
'@aws-sdk/credential-provider-web-identity@3.972.75':
resolution: {integrity: sha512-YPN6uoGDgjjjeVFZrcOeCJqmB6zpXoeeNgIjqe+DexJaWqdjVfCCe+VAZwli9Z2h8KhFW8oxkO39emQ1tyz/Mw==}
engines: {node: '>=20.0.0'}
'@aws-sdk/middleware-sdk-s3@3.972.74':
resolution: {integrity: sha512-2lzoV2z2QO5KJZYGOCnIZ1WVQgzMECvwuzr1xb034a++8QW4U4eGrmC2u4yg1xvNv4TLL/Uv5DLyuAiw0b9z7Q==}
engines: {node: '>=20.0.0'}
'@aws-sdk/nested-clients@3.997.43':
resolution: {integrity: sha512-bit+VpqWNyi3wHxFoTsTliNXimCSL2r2OeDTm7ZrG+YsTZ2D7ofDJ6r/t9PVBn80i6/v0X2h9Tgw6QP2MAKfPw==}
engines: {node: '>=20.0.0'}
'@aws-sdk/s3-request-presigner@3.1114.0':
resolution: {integrity: sha512-z1HQYonZxSJQj6JxWGTyNzOore/46bQ8ZFNAlZJlVs1Ot5oi4bB9AR409mJJrMH7YNjKaEP7bOx+wDoN/RheNQ==}
engines: {node: '>=20.0.0'}
'@aws-sdk/signature-v4-multi-region@3.996.45':
resolution: {integrity: sha512-bBuyztukzXq6plzFGHAWiQt0QXo+HL8b8lX5cFTzkez/74PtS1c0qPFCIVuHkyoT+miH2qOjAcm1/yoro2ESPA==}
engines: {node: '>=20.0.0'}
'@aws-sdk/token-providers@3.1111.0':
resolution: {integrity: sha512-JfljgoVtl+s3Qy21n9a7Z48uCQaOXcN74KJ3TEQfPoB293GrXFSt6HSQJF1sTZ8c/5QedEvd3NjJQMO4u9qa5A==}
engines: {node: '>=20.0.0'}
'@aws-sdk/types@3.974.4':
resolution: {integrity: sha512-dSFDNG00MEz0/xl5gxL62giLd1iYyJsTxZ1I1DOj6lC+bbgLB4TRsYClJg3b62dhXT1uATzsTNXPnC+33EJV3A==}
engines: {node: '>=20.0.0'}
'@aws-sdk/xml-builder@3.972.39':
resolution: {integrity: sha512-FTti8DS5MMWXNUWiRwXAJeYS+0GHHiMy0+7XOhcwk63ILHmfS2UFy2z/HNpZCSOJJ3P3dnWY6hfYNW3DF0nXUA==}
engines: {node: '>=20.0.0'}
'@aws/lambda-invoke-store@0.3.0':
resolution: {integrity: sha512-sl4Bm6yiMNYrZKkqqDFWN0UfnWhlS8ivKxrYl+6t0gCLrqr8y3B2IqZZbFRkfaVVp7C/baApyh71P+LeE1A2sQ==}
engines: {node: '>=18.0.0'}
'@drizzle-team/brocli@0.10.2':
resolution: {integrity: sha512-z33Il7l5dKjUgGULTqBsQBQwckHh5AbIuxhdsIxDDiZAzBOrZO6q9ogcWC65kU382AfynTfgNumVcNIjuIua6w==}
@@ -1151,6 +1301,30 @@ packages:
'@rushstack/eslint-patch@1.16.1':
resolution: {integrity: sha512-TvZbIpeKqGQQ7X0zSCvPH9riMSFQFSggnfBjFZ1mEoILW+UuXCKwOoPcgjMwiUtRqFZ8jWhPJc4um14vC6I4ag==}
'@smithy/core@3.33.3':
resolution: {integrity: sha512-CsOeKq/9kA3y6VJHt+/+VTCtBaxJ4OTFpgrjIUhPpDIKxBci1k2bJaQASF2h/ELWrulGp+t97DZ0mevfAD8idg==}
engines: {node: '>=18.0.0'}
'@smithy/credential-provider-imds@4.5.2':
resolution: {integrity: sha512-A9uSdn72ozbRUSit0eib0TW7nXuNPlaeM0zcGkJ+nE6tFcSDbnmtwoxbTCFBukVQcszDAyvsd7+rTduPTXpygg==}
engines: {node: '>=18.0.0'}
'@smithy/fetch-http-handler@5.7.2':
resolution: {integrity: sha512-nZyWTmSpJEXl6VtWVMBJve/7x12DZu6sIX1z1a+ZMaHlQQRs9Zpu6NbTe/gmxYXVRpkjxyDYpZ5gx2IM6f/Wkw==}
engines: {node: '>=18.0.0'}
'@smithy/node-http-handler@4.11.3':
resolution: {integrity: sha512-2jY1tSpERfPfWqyBV2pH+iGFaghVsIJszJNsT7hxtQYhVJpWDyc0LqOWI+nXOxOAHaEfZ4PXXtp1wW1TGpHhkA==}
engines: {node: '>=18.0.0'}
'@smithy/signature-v4@5.7.3':
resolution: {integrity: sha512-7ImGm+FkHRLcBaRttIAMZ6bzJZWb2cJGoYjq46F2UjycujWzrL9GEN9h4w7eQyXJYnltrUhxbbieBAIRrdqpow==}
engines: {node: '>=18.0.0'}
'@smithy/types@4.17.2':
resolution: {integrity: sha512-FOKpVZob9MPTn2znRzGrnsMHv7BOsKVw3XiP/cOyYLDVZ9qKp4nifIiSCuUU/fIj5Vu0UOAxCFr+qRAtG0NUkA==}
engines: {node: '>=18.0.0'}
'@swc/helpers@0.5.15':
resolution: {integrity: sha512-JQ5TuMi45Owi4/BIMAJBoSQoOJu12oOk/gADqlcUL9JEdHB8vyjUSsxqeNXnmXHjYKMi2WcYtezGEEhqUI/E2g==}
@@ -1242,6 +1416,36 @@ packages:
'@tailwindcss/postcss@4.3.3':
resolution: {integrity: sha512-JTSZZGQi1AyKirbLN3azmjVzef92tcX7h+iSqPdaeStyFpGpDlKvvpxeOE8njhbUanbRwr3z8DyzhICWnMtQeg==}
'@tanstack/query-core@5.101.4':
resolution: {integrity: sha512-gNwcvOJcRbLWPOLG/2OBm+zM+Yv+MKsXKEOWC57USuZDEsI71hEErQsiEGx5wX9rzWWkfwM0fVSPoiIFSsxfiw==}
'@tanstack/react-query@5.101.4':
resolution: {integrity: sha512-yRg2pfOCxIs4ZJW3XYYHU/WgtD04FHSnfHlpRT7h7pR77hwkdRG4wxbKe4aq6P0RvXUTBSQpQeadS1SUYUe+KA==}
peerDependencies:
react: ^18 || ^19
'@trpc/client@11.18.0':
resolution: {integrity: sha512-wOqeg3Fvl25V1ZisQhUD3K8G60ZJDlSGJNSyeXrLH24xAo5w6GSR2Kzb1cSNY9Y+IQ2YZvYGZstBU+V/ulo/ow==}
hasBin: true
peerDependencies:
'@trpc/server': 11.18.0
typescript: '>=5.7.2'
'@trpc/react-query@11.18.0':
resolution: {integrity: sha512-C1+Wwm2pCeUJucI+bnFpxGYjNuvV+ko1BC1T9tUxBVdrhHRCdn9ubxdevdLSAa49XRJRJiZnSuzl3Ys/yvs1vg==}
peerDependencies:
'@tanstack/react-query': ^5.80.3
'@trpc/client': 11.18.0
'@trpc/server': 11.18.0
react: '>=18.2.0'
typescript: '>=5.7.2'
'@trpc/server@11.18.0':
resolution: {integrity: sha512-JAvXOuNTxgXjIDfQaOvDq1j66LMNfDJUH1IU7Slfn8EvRv2EkH6ehu3A7zpYhjO0syHHiYg77v2lG2JFJgvw7Q==}
hasBin: true
peerDependencies:
typescript: '>=5.7.2'
'@turbo/darwin-64@2.10.11':
resolution: {integrity: sha512-v3R+1R/Ysozyo+p7Ri8MCIbndOvYt3DgPFrGLhrhQHfvyvbxyH3WyJj+A/2JTNmNleuAlh3JUyCV0iSVHIONTA==}
cpu: [x64]
@@ -1579,6 +1783,9 @@ packages:
resolution: {integrity: sha512-BLrgEcRTwX2o6gGxGOCNyMvGSp35YofuYzw9h1IMTRmKqttAZZVU67bdb9Pr2vUHA8+j3i2tJfjO6C6+4myGTA==}
engines: {node: 18 || 20 || >=22}
bowser@2.14.1:
resolution: {integrity: sha512-tzPjzCxygAKWFOJP011oxFHs57HzIhOEracIgAePE4pqB3LikALKnSzUyU4MGs9/iCEUuHlAJTjTc5M+u7YEGg==}
brace-expansion@1.1.18:
resolution: {integrity: sha512-Edep/X9fGqVNmzKBVsDYIOtD+z1tuezV70LBjdCst9Tqu76lsnvRiZ6oTic1n+/BIwX6QDGAO94PN4N2SADvtw==}
@@ -1648,6 +1855,10 @@ packages:
concat-map@0.0.1:
resolution: {integrity: sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==}
copy-anything@4.1.0:
resolution: {integrity: sha512-ufbM3smX/Jbnpk5wcQjzd1MgBpzmqfNETUAyZNrGwU9foRlyHoGzMMBBCRzEhQLBjZfFDE1W2ufPXX2vdWkV8Q==}
engines: {node: '>=18'}
cross-spawn@7.0.6:
resolution: {integrity: sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==}
engines: {node: '>= 8'}
@@ -2832,6 +3043,10 @@ packages:
babel-plugin-macros:
optional: true
superjson@2.2.6:
resolution: {integrity: sha512-H+ue8Zo4vJmV2nRjpx86P35lzwDT3nItnIsocgumgr0hHMQ+ZGq5vrERg9kJBo5AWGmxZDhzDo+WVIJqkB0cGA==}
engines: {node: '>=16'}
supports-color@7.2.0:
resolution: {integrity: sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==}
engines: {node: '>=8'}
@@ -3042,6 +3257,180 @@ snapshots:
'@alloc/quick-lru@5.2.0': {}
'@aws-sdk/checksums@3.1000.28':
dependencies:
'@aws-sdk/core': 3.977.8
'@aws-sdk/types': 3.974.4
'@smithy/core': 3.33.3
'@smithy/types': 4.17.2
tslib: 2.8.1
'@aws-sdk/client-s3@3.1114.0':
dependencies:
'@aws-sdk/checksums': 3.1000.28
'@aws-sdk/core': 3.977.8
'@aws-sdk/credential-provider-node': 3.972.80
'@aws-sdk/middleware-sdk-s3': 3.972.74
'@aws-sdk/signature-v4-multi-region': 3.996.45
'@aws-sdk/types': 3.974.4
'@smithy/core': 3.33.3
'@smithy/fetch-http-handler': 5.7.2
'@smithy/node-http-handler': 4.11.3
'@smithy/types': 4.17.2
tslib: 2.8.1
'@aws-sdk/core@3.977.8':
dependencies:
'@aws-sdk/types': 3.974.4
'@aws-sdk/xml-builder': 3.972.39
'@aws/lambda-invoke-store': 0.3.0
'@smithy/core': 3.33.3
'@smithy/signature-v4': 5.7.3
'@smithy/types': 4.17.2
bowser: 2.14.1
tslib: 2.8.1
'@aws-sdk/credential-provider-env@3.972.69':
dependencies:
'@aws-sdk/core': 3.977.8
'@aws-sdk/types': 3.974.4
'@smithy/core': 3.33.3
'@smithy/types': 4.17.2
tslib: 2.8.1
'@aws-sdk/credential-provider-http@3.972.71':
dependencies:
'@aws-sdk/core': 3.977.8
'@aws-sdk/types': 3.974.4
'@smithy/core': 3.33.3
'@smithy/fetch-http-handler': 5.7.2
'@smithy/node-http-handler': 4.11.3
'@smithy/types': 4.17.2
tslib: 2.8.1
'@aws-sdk/credential-provider-ini@3.973.14':
dependencies:
'@aws-sdk/core': 3.977.8
'@aws-sdk/credential-provider-env': 3.972.69
'@aws-sdk/credential-provider-http': 3.972.71
'@aws-sdk/credential-provider-login': 3.972.76
'@aws-sdk/credential-provider-process': 3.972.69
'@aws-sdk/credential-provider-sso': 3.973.13
'@aws-sdk/credential-provider-web-identity': 3.972.75
'@aws-sdk/nested-clients': 3.997.43
'@aws-sdk/types': 3.974.4
'@smithy/core': 3.33.3
'@smithy/credential-provider-imds': 4.5.2
'@smithy/types': 4.17.2
tslib: 2.8.1
'@aws-sdk/credential-provider-login@3.972.76':
dependencies:
'@aws-sdk/core': 3.977.8
'@aws-sdk/nested-clients': 3.997.43
'@aws-sdk/types': 3.974.4
'@smithy/core': 3.33.3
'@smithy/types': 4.17.2
tslib: 2.8.1
'@aws-sdk/credential-provider-node@3.972.80':
dependencies:
'@aws-sdk/credential-provider-env': 3.972.69
'@aws-sdk/credential-provider-http': 3.972.71
'@aws-sdk/credential-provider-ini': 3.973.14
'@aws-sdk/credential-provider-process': 3.972.69
'@aws-sdk/credential-provider-sso': 3.973.13
'@aws-sdk/credential-provider-web-identity': 3.972.75
'@aws-sdk/types': 3.974.4
'@smithy/core': 3.33.3
'@smithy/credential-provider-imds': 4.5.2
'@smithy/types': 4.17.2
tslib: 2.8.1
'@aws-sdk/credential-provider-process@3.972.69':
dependencies:
'@aws-sdk/core': 3.977.8
'@aws-sdk/types': 3.974.4
'@smithy/core': 3.33.3
'@smithy/types': 4.17.2
tslib: 2.8.1
'@aws-sdk/credential-provider-sso@3.973.13':
dependencies:
'@aws-sdk/core': 3.977.8
'@aws-sdk/nested-clients': 3.997.43
'@aws-sdk/token-providers': 3.1111.0
'@aws-sdk/types': 3.974.4
'@smithy/core': 3.33.3
'@smithy/types': 4.17.2
tslib: 2.8.1
'@aws-sdk/credential-provider-web-identity@3.972.75':
dependencies:
'@aws-sdk/core': 3.977.8
'@aws-sdk/nested-clients': 3.997.43
'@aws-sdk/types': 3.974.4
'@smithy/core': 3.33.3
'@smithy/types': 4.17.2
tslib: 2.8.1
'@aws-sdk/middleware-sdk-s3@3.972.74':
dependencies:
'@aws-sdk/core': 3.977.8
'@aws-sdk/signature-v4-multi-region': 3.996.45
'@aws-sdk/types': 3.974.4
'@smithy/core': 3.33.3
'@smithy/types': 4.17.2
tslib: 2.8.1
'@aws-sdk/nested-clients@3.997.43':
dependencies:
'@aws-sdk/core': 3.977.8
'@aws-sdk/signature-v4-multi-region': 3.996.45
'@aws-sdk/types': 3.974.4
'@smithy/core': 3.33.3
'@smithy/fetch-http-handler': 5.7.2
'@smithy/node-http-handler': 4.11.3
'@smithy/types': 4.17.2
tslib: 2.8.1
'@aws-sdk/s3-request-presigner@3.1114.0':
dependencies:
'@aws-sdk/core': 3.977.8
'@aws-sdk/signature-v4-multi-region': 3.996.45
'@aws-sdk/types': 3.974.4
'@smithy/core': 3.33.3
'@smithy/types': 4.17.2
tslib: 2.8.1
'@aws-sdk/signature-v4-multi-region@3.996.45':
dependencies:
'@aws-sdk/types': 3.974.4
'@smithy/signature-v4': 5.7.3
'@smithy/types': 4.17.2
tslib: 2.8.1
'@aws-sdk/token-providers@3.1111.0':
dependencies:
'@aws-sdk/core': 3.977.8
'@aws-sdk/nested-clients': 3.997.43
'@aws-sdk/types': 3.974.4
'@smithy/core': 3.33.3
'@smithy/types': 4.17.2
tslib: 2.8.1
'@aws-sdk/types@3.974.4':
dependencies:
'@smithy/types': 4.17.2
tslib: 2.8.1
'@aws-sdk/xml-builder@3.972.39':
dependencies:
'@smithy/types': 4.17.2
tslib: 2.8.1
'@aws/lambda-invoke-store@0.3.0': {}
'@drizzle-team/brocli@0.10.2': {}
'@emnapi/core@1.10.0':
@@ -3684,6 +4073,39 @@ snapshots:
'@rushstack/eslint-patch@1.16.1': {}
'@smithy/core@3.33.3':
dependencies:
'@smithy/types': 4.17.2
tslib: 2.8.1
'@smithy/credential-provider-imds@4.5.2':
dependencies:
'@smithy/core': 3.33.3
'@smithy/types': 4.17.2
tslib: 2.8.1
'@smithy/fetch-http-handler@5.7.2':
dependencies:
'@smithy/core': 3.33.3
'@smithy/types': 4.17.2
tslib: 2.8.1
'@smithy/node-http-handler@4.11.3':
dependencies:
'@smithy/core': 3.33.3
'@smithy/types': 4.17.2
tslib: 2.8.1
'@smithy/signature-v4@5.7.3':
dependencies:
'@smithy/core': 3.33.3
'@smithy/types': 4.17.2
tslib: 2.8.1
'@smithy/types@4.17.2':
dependencies:
tslib: 2.8.1
'@swc/helpers@0.5.15':
dependencies:
tslib: 2.8.1
@@ -3757,6 +4179,30 @@ snapshots:
postcss: 8.5.26
tailwindcss: 4.3.3
'@tanstack/query-core@5.101.4': {}
'@tanstack/react-query@5.101.4(react@19.2.8)':
dependencies:
'@tanstack/query-core': 5.101.4
react: 19.2.8
'@trpc/client@11.18.0(@trpc/server@11.18.0(typescript@5.9.3))(typescript@5.9.3)':
dependencies:
'@trpc/server': 11.18.0(typescript@5.9.3)
typescript: 5.9.3
'@trpc/react-query@11.18.0(@tanstack/react-query@5.101.4(react@19.2.8))(@trpc/client@11.18.0(@trpc/server@11.18.0(typescript@5.9.3))(typescript@5.9.3))(@trpc/server@11.18.0(typescript@5.9.3))(react@19.2.8)(typescript@5.9.3)':
dependencies:
'@tanstack/react-query': 5.101.4(react@19.2.8)
'@trpc/client': 11.18.0(@trpc/server@11.18.0(typescript@5.9.3))(typescript@5.9.3)
'@trpc/server': 11.18.0(typescript@5.9.3)
react: 19.2.8
typescript: 5.9.3
'@trpc/server@11.18.0(typescript@5.9.3)':
dependencies:
typescript: 5.9.3
'@turbo/darwin-64@2.10.11':
optional: true
@@ -4105,6 +4551,8 @@ snapshots:
balanced-match@4.0.4: {}
bowser@2.14.1: {}
brace-expansion@1.1.18:
dependencies:
balanced-match: 1.0.2
@@ -4174,6 +4622,8 @@ snapshots:
concat-map@0.0.1: {}
copy-anything@4.1.0: {}
cross-spawn@7.0.6:
dependencies:
path-key: 3.1.1
@@ -5576,6 +6026,10 @@ snapshots:
client-only: 0.0.1
react: 19.2.8
superjson@2.2.6:
dependencies:
copy-anything: 4.1.0
supports-color@7.2.0:
dependencies:
has-flag: 4.0.0