From 54137a16104c116409d89ec6e9740e7aa4ca4493 Mon Sep 17 00:00:00 2001 From: kujo205 Date: Thu, 1 Feb 2024 00:28:30 +0200 Subject: [PATCH 01/45] feat: made form responsive --- src/app/contacts/_components/ContactMeForm.tsx | 4 ++-- src/app/contacts/page.tsx | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/src/app/contacts/_components/ContactMeForm.tsx b/src/app/contacts/_components/ContactMeForm.tsx index 61719e3..93b909d 100644 --- a/src/app/contacts/_components/ContactMeForm.tsx +++ b/src/app/contacts/_components/ContactMeForm.tsx @@ -42,11 +42,11 @@ const ContactMeForm = () => { return (

Or text directly

-
+
+

You can find me on these platforms: From 5d9724206db675d526476ab6a64042961ad9bab4 Mon Sep 17 00:00:00 2001 From: kujo205 Date: Thu, 1 Feb 2024 00:45:05 +0200 Subject: [PATCH 02/45] fix: error with not closing sheet on page select --- src/components/navagiation/mobile-header.tsx | 27 ++++++++++++-------- 1 file changed, 17 insertions(+), 10 deletions(-) diff --git a/src/components/navagiation/mobile-header.tsx b/src/components/navagiation/mobile-header.tsx index fcb9195..f853981 100644 --- a/src/components/navagiation/mobile-header.tsx +++ b/src/components/navagiation/mobile-header.tsx @@ -1,6 +1,11 @@ "use client"; import { usePathname } from "next/navigation"; -import { Sheet, SheetContent, SheetTrigger } from "@/components/ui/sheet"; +import { + Sheet, + SheetClose, + SheetContent, + SheetTrigger, +} from "@/components/ui/sheet"; import { Button, buttonVariants } from "@/components/ui/button"; import { Icons } from "@/components/icons"; import { header } from "@/config/general"; @@ -21,15 +26,17 @@ export const OpenMobileHeaderButtonAndMobileHeader = () => { From f4a838985c5d2a684fd81626d32c9d0cddf7c366 Mon Sep 17 00:00:00 2001 From: kujo205 Date: Thu, 1 Feb 2024 00:56:25 +0200 Subject: [PATCH 03/45] style(navbar): added gap between nav items --- src/components/navagiation/mobile-header.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/components/navagiation/mobile-header.tsx b/src/components/navagiation/mobile-header.tsx index f853981..736e786 100644 --- a/src/components/navagiation/mobile-header.tsx +++ b/src/components/navagiation/mobile-header.tsx @@ -24,7 +24,7 @@ export const OpenMobileHeaderButtonAndMobileHeader = () => { -

diff --git a/src/components/navagiation/mobile-header.tsx b/src/components/navagiation/mobile-header.tsx index 0afce9a..ba83bfd 100644 --- a/src/components/navagiation/mobile-header.tsx +++ b/src/components/navagiation/mobile-header.tsx @@ -8,12 +8,15 @@ import { } from "@/components/ui/sheet"; import { Button, buttonVariants } from "@/components/ui/button"; import { Icons } from "@/components/icons"; -import { header } from "@/config/general"; +import { getHeaderItems } from "@/config/general"; import Link from "next/link"; -// import { useSession } from "next-auth/react"; +import { type UserRole } from "@/server/db/schema"; -export const OpenMobileHeaderButtonAndMobileHeader = () => { - // const { data: session } = useSession(); +export const OpenMobileHeaderButtonAndMobileHeader = ({ + role, +}: { + role?: UserRole | null; +}) => { const pathname = usePathname(); return ( @@ -27,7 +30,7 @@ export const OpenMobileHeaderButtonAndMobileHeader = () => {
- + ); } From 58e4fc55dc29fa33554ba4232822af87866abd6f Mon Sep 17 00:00:00 2001 From: kujo205 Date: Mon, 5 Feb 2024 13:54:04 +0200 Subject: [PATCH 07/45] feat: updated schema file --- src/server/db/schema.ts | 63 +++++++++++++++++++++-------------------- 1 file changed, 33 insertions(+), 30 deletions(-) diff --git a/src/server/db/schema.ts b/src/server/db/schema.ts index f510a4e..2debbea 100644 --- a/src/server/db/schema.ts +++ b/src/server/db/schema.ts @@ -13,13 +13,23 @@ import { type AdapterAccount } from "next-auth/adapters"; export const mysqlTable = mysqlTableCreator((name) => `kujo205-blog_${name}`); -export const postTags = mysqlTable("postTag", { - id: bigint("id", { mode: "number" }).primaryKey().autoincrement(), +export const users = mysqlTable("user", { + id: varchar("id", { length: 255 }).notNull().primaryKey(), name: varchar("name", { length: 255 }), + email: varchar("email", { length: 255 }).notNull(), + emailVerified: timestamp("emailVerified", { + mode: "date", + fsp: 3, + }).defaultNow(), + image: varchar("image", { length: 255 }), + role: mysqlEnum("role", ["ADMIN", "COMMENTATOR"]).default("COMMENTATOR"), }); -export const blogPoTagsRelations = relations(postTags, ({ many }) => ({ - blogPost: many(blogPosts), +export const usersRelations = relations(users, ({ many }) => ({ + blogPosts: many(blogPosts), + comments: many(comments), + sessions: many(sessions), + verificationTokens: many(verificationTokens), })); export const blogPosts = mysqlTable("blogPost", { @@ -35,21 +45,33 @@ export const blogPosts = mysqlTable("blogPost", { }); export const blogPostsRelations = relations(blogPosts, ({ one, many }) => ({ - user: one(users), + user: many(users), comments: many(comments), - tags: many(postTags), + tags: many(blogPostTags), +})); + +export const blogPostTags = mysqlTable("postTag", { + id: bigint("id", { mode: "number" }).primaryKey().autoincrement(), + name: varchar("name", { length: 255 }), +}); + +export const blogPoTagsRelations = relations(blogPostTags, ({ many }) => ({ + blogPost: many(blogPosts), })); -export const blogPostsTags = mysqlTable("blogPostTag", { +export const tagsToBlogPosts = mysqlTable("tagsToBlogPosts", { id: bigint("id", { mode: "number" }).primaryKey().autoincrement(), blogPostId: bigint("blogPostId", { mode: "number" }).notNull(), tagId: bigint("tagId", { mode: "number" }).notNull(), }); -export const blogPostsTagsRelations = relations(blogPostsTags, ({ one }) => ({ - blogPost: one(blogPosts), - tag: one(blogPostsTags), -})); +export const tagsToBlogPostsRelations = relations( + tagsToBlogPosts, + ({ one }) => ({ + blogPost: one(blogPosts), + tag: one(blogPostTags), + }), +); export const comments = mysqlTable("comment", { id: bigint("id", { mode: "number" }).primaryKey().autoincrement(), @@ -62,25 +84,6 @@ export const commentsRelations = relations(comments, ({ one, many }) => ({ replyTo: one(comments), })); -export const users = mysqlTable("user", { - id: varchar("id", { length: 255 }).notNull().primaryKey(), - name: varchar("name", { length: 255 }), - email: varchar("email", { length: 255 }).notNull(), - emailVerified: timestamp("emailVerified", { - mode: "date", - fsp: 3, - }).defaultNow(), - image: varchar("image", { length: 255 }), - role: mysqlEnum("role", ["ADMIN", "COMMENTATOR"]).default("COMMENTATOR"), -}); - -export const usersRelations = relations(users, ({ many }) => ({ - blogPosts: many(blogPosts), - comments: many(comments), - sessions: many(sessions), - verificationTokens: many(verificationTokens), -})); - export const accounts = mysqlTable( "account", { From 35e502cb0f6634f5bccc6b325005f96ae3e85881 Mon Sep 17 00:00:00 2001 From: kujo205 Date: Mon, 5 Feb 2024 16:33:02 +0200 Subject: [PATCH 08/45] test: added testing route --- src/app/posts/page.tsx | 10 +++++++++- src/server/api/routers/post.ts | 15 +++++++++++++++ 2 files changed, 24 insertions(+), 1 deletion(-) diff --git a/src/app/posts/page.tsx b/src/app/posts/page.tsx index d70a9c2..6796c58 100644 --- a/src/app/posts/page.tsx +++ b/src/app/posts/page.tsx @@ -1,6 +1,14 @@ -export default function Page() { +import { api } from "@/trpc/server"; +export default async function Page() { + const resonse = await api.post.getPosts.query({ + page: 1, + pageSize: 10, + tagIds: [1, 2, 3], + }); + return (
+ {resonse.left}

Working on it cap

); diff --git a/src/server/api/routers/post.ts b/src/server/api/routers/post.ts index a69e818..e29beb9 100644 --- a/src/server/api/routers/post.ts +++ b/src/server/api/routers/post.ts @@ -8,6 +8,21 @@ import { // TODO: explore this code export const postRouter = createTRPCRouter({ + getPosts: publicProcedure + .input( + z.object({ + page: z.number(), + pageSize: z.number(), + tagIds: z.array(z.number()), + }), + ) + .query(({ input, ctx }) => { + return { + ...input, + posts: [], + left: 0, + }; + }), hello: publicProcedure .input(z.object({ text: z.string() })) .query(({ input }) => { From 9e21179b70284b3c229a864b904ba268fad7b6fb Mon Sep 17 00:00:00 2001 From: kujo205 Date: Fri, 16 Feb 2024 14:51:40 +0200 Subject: [PATCH 09/45] feat: added s3 bucket image saving route --- .env.example | 19 +- package.json | 3 + pnpm-lock.yaml | 1199 ++++++++++++++++++++++++++++++++ src/env.js | 8 + src/server/api/routers/post.ts | 17 +- src/server/api/s3.ts | 10 + src/server/api/trpc.ts | 2 + 7 files changed, 1253 insertions(+), 5 deletions(-) create mode 100644 src/server/api/s3.ts diff --git a/.env.example b/.env.example index e00c4fc..2b725b0 100644 --- a/.env.example +++ b/.env.example @@ -10,17 +10,28 @@ # should be updated accordingly. # Drizzle -# Get the Database URL from the "prisma" dropdown selector in PlanetScale. +# Get the Database URL from the "prisma" dropdown selector in PlanetScale. # Change the query params at the end of the URL to "?ssl={"rejectUnauthorized":true}" DATABASE_URL='mysql://YOUR_MYSQL_URL_HERE?ssl={"rejectUnauthorized":true}' +# DATABASE_URL='mysql://someurlYOUR_MYSQL_URL_HERE?ssl={"rejectUnauthorized":true}' # Next Auth # You can generate a new secret on the command line with: # openssl rand -base64 32 # https://next-auth.js.org/configuration/options#secret -# NEXTAUTH_SECRET="" +NEXTAUTH_SECRET== NEXTAUTH_URL="http://localhost:3000" # Next Auth Discord Provider -DISCORD_CLIENT_ID="" -DISCORD_CLIENT_SECRET="" +GOOGLE_CLIENT_SECRET= +GOOGLE_CLIENT_ID= + +# Telegram stuff +TELEGRAM_BOT_TOKEN= +MY_TELEGRAM_CHAT_ID= + +# S3 api stuff +S3_ACCESS_KEY= +S3_SECRET_ACCESS_KEY= +AWS_REGION= +BUCKET_NAME= diff --git a/package.json b/package.json index 4a25afb..c019a6e 100644 --- a/package.json +++ b/package.json @@ -14,6 +14,8 @@ }, "dependencies": { "@auth/drizzle-adapter": "^0.3.6", + "@aws-sdk/client-s3": "^3.515.0", + "@aws-sdk/s3-request-presigner": "^3.515.0", "@hookform/resolvers": "^3.3.4", "@planetscale/database": "^1.11.0", "@radix-ui/react-avatar": "^1.0.4", @@ -27,6 +29,7 @@ "@trpc/next": "^10.43.6", "@trpc/react-query": "^10.43.6", "@trpc/server": "^10.43.6", + "axios": "^1.6.7", "class-variance-authority": "^0.7.0", "clsx": "^2.1.0", "cmdk": "^0.2.0", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 34baa64..1a0b653 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -8,6 +8,12 @@ dependencies: '@auth/drizzle-adapter': specifier: ^0.3.6 version: 0.3.15 + '@aws-sdk/client-s3': + specifier: ^3.515.0 + version: 3.515.0 + '@aws-sdk/s3-request-presigner': + specifier: ^3.515.0 + version: 3.515.0 '@hookform/resolvers': specifier: ^3.3.4 version: 3.3.4(react-hook-form@7.49.3) @@ -47,6 +53,9 @@ dependencies: '@trpc/server': specifier: ^10.43.6 version: 10.45.0 + axios: + specifier: ^1.6.7 + version: 1.6.7 class-variance-authority: specifier: ^0.7.0 version: 0.7.0 @@ -194,6 +203,661 @@ packages: - nodemailer dev: false + /@aws-crypto/crc32@3.0.0: + resolution: {integrity: sha512-IzSgsrxUcsrejQbPVilIKy16kAT52EwB6zSaI+M3xxIhKh5+aldEyvI+z6erM7TCLB2BJsFrtHjp6/4/sr+3dA==} + dependencies: + '@aws-crypto/util': 3.0.0 + '@aws-sdk/types': 3.515.0 + tslib: 1.14.1 + dev: false + + /@aws-crypto/crc32c@3.0.0: + resolution: {integrity: sha512-ENNPPManmnVJ4BTXlOjAgD7URidbAznURqD0KvfREyc4o20DPYdEldU1f5cQ7Jbj0CJJSPaMIk/9ZshdB3210w==} + dependencies: + '@aws-crypto/util': 3.0.0 + '@aws-sdk/types': 3.515.0 + tslib: 1.14.1 + dev: false + + /@aws-crypto/ie11-detection@3.0.0: + resolution: {integrity: sha512-341lBBkiY1DfDNKai/wXM3aujNBkXR7tq1URPQDL9wi3AUbI80NR74uF1TXHMm7po1AcnFk8iu2S2IeU/+/A+Q==} + dependencies: + tslib: 1.14.1 + dev: false + + /@aws-crypto/sha1-browser@3.0.0: + resolution: {integrity: sha512-NJth5c997GLHs6nOYTzFKTbYdMNA6/1XlKVgnZoaZcQ7z7UJlOgj2JdbHE8tiYLS3fzXNCguct77SPGat2raSw==} + dependencies: + '@aws-crypto/ie11-detection': 3.0.0 + '@aws-crypto/supports-web-crypto': 3.0.0 + '@aws-crypto/util': 3.0.0 + '@aws-sdk/types': 3.515.0 + '@aws-sdk/util-locate-window': 3.495.0 + '@aws-sdk/util-utf8-browser': 3.259.0 + tslib: 1.14.1 + dev: false + + /@aws-crypto/sha256-browser@3.0.0: + resolution: {integrity: sha512-8VLmW2B+gjFbU5uMeqtQM6Nj0/F1bro80xQXCW6CQBWgosFWXTx77aeOF5CAIAmbOK64SdMBJdNr6J41yP5mvQ==} + dependencies: + '@aws-crypto/ie11-detection': 3.0.0 + '@aws-crypto/sha256-js': 3.0.0 + '@aws-crypto/supports-web-crypto': 3.0.0 + '@aws-crypto/util': 3.0.0 + '@aws-sdk/types': 3.515.0 + '@aws-sdk/util-locate-window': 3.495.0 + '@aws-sdk/util-utf8-browser': 3.259.0 + tslib: 1.14.1 + dev: false + + /@aws-crypto/sha256-js@3.0.0: + resolution: {integrity: sha512-PnNN7os0+yd1XvXAy23CFOmTbMaDxgxXtTKHybrJ39Y8kGzBATgBFibWJKH6BhytLI/Zyszs87xCOBNyBig6vQ==} + dependencies: + '@aws-crypto/util': 3.0.0 + '@aws-sdk/types': 3.515.0 + tslib: 1.14.1 + dev: false + + /@aws-crypto/supports-web-crypto@3.0.0: + resolution: {integrity: sha512-06hBdMwUAb2WFTuGG73LSC0wfPu93xWwo5vL2et9eymgmu3Id5vFAHBbajVWiGhPO37qcsdCap/FqXvJGJWPIg==} + dependencies: + tslib: 1.14.1 + dev: false + + /@aws-crypto/util@3.0.0: + resolution: {integrity: sha512-2OJlpeJpCR48CC8r+uKVChzs9Iungj9wkZrl8Z041DWEWvyIHILYKCPNzJghKsivj+S3mLo6BVc7mBNzdxA46w==} + dependencies: + '@aws-sdk/types': 3.515.0 + '@aws-sdk/util-utf8-browser': 3.259.0 + tslib: 1.14.1 + dev: false + + /@aws-sdk/client-s3@3.515.0: + resolution: {integrity: sha512-K527n83hrMUdosxOYTzL63wtlJtmN5SUJZnGY1sUR6UyOrnOr9lS6t3AB6BgHqLFRFZJqSqmhflv2cOD7P1UPg==} + engines: {node: '>=14.0.0'} + dependencies: + '@aws-crypto/sha1-browser': 3.0.0 + '@aws-crypto/sha256-browser': 3.0.0 + '@aws-crypto/sha256-js': 3.0.0 + '@aws-sdk/client-sts': 3.515.0(@aws-sdk/credential-provider-node@3.515.0) + '@aws-sdk/core': 3.513.0 + '@aws-sdk/credential-provider-node': 3.515.0 + '@aws-sdk/middleware-bucket-endpoint': 3.515.0 + '@aws-sdk/middleware-expect-continue': 3.515.0 + '@aws-sdk/middleware-flexible-checksums': 3.515.0 + '@aws-sdk/middleware-host-header': 3.515.0 + '@aws-sdk/middleware-location-constraint': 3.515.0 + '@aws-sdk/middleware-logger': 3.515.0 + '@aws-sdk/middleware-recursion-detection': 3.515.0 + '@aws-sdk/middleware-sdk-s3': 3.515.0 + '@aws-sdk/middleware-signing': 3.515.0 + '@aws-sdk/middleware-ssec': 3.515.0 + '@aws-sdk/middleware-user-agent': 3.515.0 + '@aws-sdk/region-config-resolver': 3.515.0 + '@aws-sdk/signature-v4-multi-region': 3.515.0 + '@aws-sdk/types': 3.515.0 + '@aws-sdk/util-endpoints': 3.515.0 + '@aws-sdk/util-user-agent-browser': 3.515.0 + '@aws-sdk/util-user-agent-node': 3.515.0 + '@aws-sdk/xml-builder': 3.496.0 + '@smithy/config-resolver': 2.1.1 + '@smithy/core': 1.3.2 + '@smithy/eventstream-serde-browser': 2.1.1 + '@smithy/eventstream-serde-config-resolver': 2.1.1 + '@smithy/eventstream-serde-node': 2.1.1 + '@smithy/fetch-http-handler': 2.4.1 + '@smithy/hash-blob-browser': 2.1.1 + '@smithy/hash-node': 2.1.1 + '@smithy/hash-stream-node': 2.1.1 + '@smithy/invalid-dependency': 2.1.1 + '@smithy/md5-js': 2.1.1 + '@smithy/middleware-content-length': 2.1.1 + '@smithy/middleware-endpoint': 2.4.1 + '@smithy/middleware-retry': 2.1.1 + '@smithy/middleware-serde': 2.1.1 + '@smithy/middleware-stack': 2.1.1 + '@smithy/node-config-provider': 2.2.1 + '@smithy/node-http-handler': 2.3.1 + '@smithy/protocol-http': 3.1.1 + '@smithy/smithy-client': 2.3.1 + '@smithy/types': 2.9.1 + '@smithy/url-parser': 2.1.1 + '@smithy/util-base64': 2.1.1 + '@smithy/util-body-length-browser': 2.1.1 + '@smithy/util-body-length-node': 2.2.1 + '@smithy/util-defaults-mode-browser': 2.1.1 + '@smithy/util-defaults-mode-node': 2.2.0 + '@smithy/util-endpoints': 1.1.1 + '@smithy/util-retry': 2.1.1 + '@smithy/util-stream': 2.1.1 + '@smithy/util-utf8': 2.1.1 + '@smithy/util-waiter': 2.1.1 + fast-xml-parser: 4.2.5 + tslib: 2.6.2 + transitivePeerDependencies: + - aws-crt + dev: false + + /@aws-sdk/client-sso-oidc@3.515.0(@aws-sdk/credential-provider-node@3.515.0): + resolution: {integrity: sha512-zACa8LNlPUdlNUBqQRf5a3MfouLNtcBfm84v2c8M976DwJrMGONPe1QjyLLsD38uESQiXiVQRruj/b000iMXNw==} + engines: {node: '>=14.0.0'} + peerDependencies: + '@aws-sdk/credential-provider-node': ^3.515.0 + dependencies: + '@aws-crypto/sha256-browser': 3.0.0 + '@aws-crypto/sha256-js': 3.0.0 + '@aws-sdk/client-sts': 3.515.0(@aws-sdk/credential-provider-node@3.515.0) + '@aws-sdk/core': 3.513.0 + '@aws-sdk/credential-provider-node': 3.515.0 + '@aws-sdk/middleware-host-header': 3.515.0 + '@aws-sdk/middleware-logger': 3.515.0 + '@aws-sdk/middleware-recursion-detection': 3.515.0 + '@aws-sdk/middleware-user-agent': 3.515.0 + '@aws-sdk/region-config-resolver': 3.515.0 + '@aws-sdk/types': 3.515.0 + '@aws-sdk/util-endpoints': 3.515.0 + '@aws-sdk/util-user-agent-browser': 3.515.0 + '@aws-sdk/util-user-agent-node': 3.515.0 + '@smithy/config-resolver': 2.1.1 + '@smithy/core': 1.3.2 + '@smithy/fetch-http-handler': 2.4.1 + '@smithy/hash-node': 2.1.1 + '@smithy/invalid-dependency': 2.1.1 + '@smithy/middleware-content-length': 2.1.1 + '@smithy/middleware-endpoint': 2.4.1 + '@smithy/middleware-retry': 2.1.1 + '@smithy/middleware-serde': 2.1.1 + '@smithy/middleware-stack': 2.1.1 + '@smithy/node-config-provider': 2.2.1 + '@smithy/node-http-handler': 2.3.1 + '@smithy/protocol-http': 3.1.1 + '@smithy/smithy-client': 2.3.1 + '@smithy/types': 2.9.1 + '@smithy/url-parser': 2.1.1 + '@smithy/util-base64': 2.1.1 + '@smithy/util-body-length-browser': 2.1.1 + '@smithy/util-body-length-node': 2.2.1 + '@smithy/util-defaults-mode-browser': 2.1.1 + '@smithy/util-defaults-mode-node': 2.2.0 + '@smithy/util-endpoints': 1.1.1 + '@smithy/util-middleware': 2.1.1 + '@smithy/util-retry': 2.1.1 + '@smithy/util-utf8': 2.1.1 + tslib: 2.6.2 + transitivePeerDependencies: + - aws-crt + dev: false + + /@aws-sdk/client-sso@3.515.0: + resolution: {integrity: sha512-4oGBLW476zmkdN98lAns3bObRNO+DLOfg4MDUSR6l6GYBV/zGAtoy2O/FhwYKgA2L5h2ZtElGopLlk/1Q0ePLw==} + engines: {node: '>=14.0.0'} + dependencies: + '@aws-crypto/sha256-browser': 3.0.0 + '@aws-crypto/sha256-js': 3.0.0 + '@aws-sdk/core': 3.513.0 + '@aws-sdk/middleware-host-header': 3.515.0 + '@aws-sdk/middleware-logger': 3.515.0 + '@aws-sdk/middleware-recursion-detection': 3.515.0 + '@aws-sdk/middleware-user-agent': 3.515.0 + '@aws-sdk/region-config-resolver': 3.515.0 + '@aws-sdk/types': 3.515.0 + '@aws-sdk/util-endpoints': 3.515.0 + '@aws-sdk/util-user-agent-browser': 3.515.0 + '@aws-sdk/util-user-agent-node': 3.515.0 + '@smithy/config-resolver': 2.1.1 + '@smithy/core': 1.3.2 + '@smithy/fetch-http-handler': 2.4.1 + '@smithy/hash-node': 2.1.1 + '@smithy/invalid-dependency': 2.1.1 + '@smithy/middleware-content-length': 2.1.1 + '@smithy/middleware-endpoint': 2.4.1 + '@smithy/middleware-retry': 2.1.1 + '@smithy/middleware-serde': 2.1.1 + '@smithy/middleware-stack': 2.1.1 + '@smithy/node-config-provider': 2.2.1 + '@smithy/node-http-handler': 2.3.1 + '@smithy/protocol-http': 3.1.1 + '@smithy/smithy-client': 2.3.1 + '@smithy/types': 2.9.1 + '@smithy/url-parser': 2.1.1 + '@smithy/util-base64': 2.1.1 + '@smithy/util-body-length-browser': 2.1.1 + '@smithy/util-body-length-node': 2.2.1 + '@smithy/util-defaults-mode-browser': 2.1.1 + '@smithy/util-defaults-mode-node': 2.2.0 + '@smithy/util-endpoints': 1.1.1 + '@smithy/util-middleware': 2.1.1 + '@smithy/util-retry': 2.1.1 + '@smithy/util-utf8': 2.1.1 + tslib: 2.6.2 + transitivePeerDependencies: + - aws-crt + dev: false + + /@aws-sdk/client-sts@3.515.0(@aws-sdk/credential-provider-node@3.515.0): + resolution: {integrity: sha512-ScYuvaIDgip3atOJIA1FU2n0gJkEdveu1KrrCPathoUCV5zpK8qQmO/n+Fj/7hKFxeKdFbB+4W4CsJWYH94nlg==} + engines: {node: '>=14.0.0'} + peerDependencies: + '@aws-sdk/credential-provider-node': ^3.515.0 + dependencies: + '@aws-crypto/sha256-browser': 3.0.0 + '@aws-crypto/sha256-js': 3.0.0 + '@aws-sdk/core': 3.513.0 + '@aws-sdk/credential-provider-node': 3.515.0 + '@aws-sdk/middleware-host-header': 3.515.0 + '@aws-sdk/middleware-logger': 3.515.0 + '@aws-sdk/middleware-recursion-detection': 3.515.0 + '@aws-sdk/middleware-user-agent': 3.515.0 + '@aws-sdk/region-config-resolver': 3.515.0 + '@aws-sdk/types': 3.515.0 + '@aws-sdk/util-endpoints': 3.515.0 + '@aws-sdk/util-user-agent-browser': 3.515.0 + '@aws-sdk/util-user-agent-node': 3.515.0 + '@smithy/config-resolver': 2.1.1 + '@smithy/core': 1.3.2 + '@smithy/fetch-http-handler': 2.4.1 + '@smithy/hash-node': 2.1.1 + '@smithy/invalid-dependency': 2.1.1 + '@smithy/middleware-content-length': 2.1.1 + '@smithy/middleware-endpoint': 2.4.1 + '@smithy/middleware-retry': 2.1.1 + '@smithy/middleware-serde': 2.1.1 + '@smithy/middleware-stack': 2.1.1 + '@smithy/node-config-provider': 2.2.1 + '@smithy/node-http-handler': 2.3.1 + '@smithy/protocol-http': 3.1.1 + '@smithy/smithy-client': 2.3.1 + '@smithy/types': 2.9.1 + '@smithy/url-parser': 2.1.1 + '@smithy/util-base64': 2.1.1 + '@smithy/util-body-length-browser': 2.1.1 + '@smithy/util-body-length-node': 2.2.1 + '@smithy/util-defaults-mode-browser': 2.1.1 + '@smithy/util-defaults-mode-node': 2.2.0 + '@smithy/util-endpoints': 1.1.1 + '@smithy/util-middleware': 2.1.1 + '@smithy/util-retry': 2.1.1 + '@smithy/util-utf8': 2.1.1 + fast-xml-parser: 4.2.5 + tslib: 2.6.2 + transitivePeerDependencies: + - aws-crt + dev: false + + /@aws-sdk/core@3.513.0: + resolution: {integrity: sha512-L+9DL4apWuqNKVOMJ8siAuWoRM9rZf9w1iPv8S2o83WO2jVK7E/m+rNW1dFo9HsA5V1ccDl2H2qLXx24HiHmOw==} + engines: {node: '>=14.0.0'} + dependencies: + '@smithy/core': 1.3.2 + '@smithy/protocol-http': 3.1.1 + '@smithy/signature-v4': 2.1.1 + '@smithy/smithy-client': 2.3.1 + '@smithy/types': 2.9.1 + tslib: 2.6.2 + dev: false + + /@aws-sdk/credential-provider-env@3.515.0: + resolution: {integrity: sha512-45vxdyqhTAaUMERYVWOziG3K8L2TV9G4ryQS/KZ84o7NAybE9GMdoZRVmGHAO7mJJ1wQiYCM/E+i5b3NW9JfNA==} + engines: {node: '>=14.0.0'} + dependencies: + '@aws-sdk/types': 3.515.0 + '@smithy/property-provider': 2.1.1 + '@smithy/types': 2.9.1 + tslib: 2.6.2 + dev: false + + /@aws-sdk/credential-provider-http@3.515.0: + resolution: {integrity: sha512-Ba6FXK77vU4WyheiamNjEuTFmir0eAXuJGPO27lBaA8g+V/seXGHScsbOG14aQGDOr2P02OPwKGZrWWA7BFpfQ==} + engines: {node: '>=14.0.0'} + dependencies: + '@aws-sdk/types': 3.515.0 + '@smithy/fetch-http-handler': 2.4.1 + '@smithy/node-http-handler': 2.3.1 + '@smithy/property-provider': 2.1.1 + '@smithy/protocol-http': 3.1.1 + '@smithy/smithy-client': 2.3.1 + '@smithy/types': 2.9.1 + '@smithy/util-stream': 2.1.1 + tslib: 2.6.2 + dev: false + + /@aws-sdk/credential-provider-ini@3.515.0(@aws-sdk/credential-provider-node@3.515.0): + resolution: {integrity: sha512-ouDlNZdv2TKeVEA/YZk2+XklTXyAAGdbWnl4IgN9ItaodWI+lZjdIoNC8BAooVH+atIV/cZgoGTGQL7j2TxJ9A==} + engines: {node: '>=14.0.0'} + dependencies: + '@aws-sdk/client-sts': 3.515.0(@aws-sdk/credential-provider-node@3.515.0) + '@aws-sdk/credential-provider-env': 3.515.0 + '@aws-sdk/credential-provider-process': 3.515.0 + '@aws-sdk/credential-provider-sso': 3.515.0(@aws-sdk/credential-provider-node@3.515.0) + '@aws-sdk/credential-provider-web-identity': 3.515.0(@aws-sdk/credential-provider-node@3.515.0) + '@aws-sdk/types': 3.515.0 + '@smithy/credential-provider-imds': 2.2.1 + '@smithy/property-provider': 2.1.1 + '@smithy/shared-ini-file-loader': 2.3.1 + '@smithy/types': 2.9.1 + tslib: 2.6.2 + transitivePeerDependencies: + - '@aws-sdk/credential-provider-node' + - aws-crt + dev: false + + /@aws-sdk/credential-provider-node@3.515.0: + resolution: {integrity: sha512-Y4kHSpbxksiCZZNcvsiKUd8Fb2XlyUuONEwqWFNL82ZH6TCCjBGS31wJQCSxBHqYcOL3tiORUEJkoO7uS30uQA==} + engines: {node: '>=14.0.0'} + dependencies: + '@aws-sdk/credential-provider-env': 3.515.0 + '@aws-sdk/credential-provider-http': 3.515.0 + '@aws-sdk/credential-provider-ini': 3.515.0(@aws-sdk/credential-provider-node@3.515.0) + '@aws-sdk/credential-provider-process': 3.515.0 + '@aws-sdk/credential-provider-sso': 3.515.0(@aws-sdk/credential-provider-node@3.515.0) + '@aws-sdk/credential-provider-web-identity': 3.515.0(@aws-sdk/credential-provider-node@3.515.0) + '@aws-sdk/types': 3.515.0 + '@smithy/credential-provider-imds': 2.2.1 + '@smithy/property-provider': 2.1.1 + '@smithy/shared-ini-file-loader': 2.3.1 + '@smithy/types': 2.9.1 + tslib: 2.6.2 + transitivePeerDependencies: + - aws-crt + dev: false + + /@aws-sdk/credential-provider-process@3.515.0: + resolution: {integrity: sha512-pSjiOA2FM63LHRKNDvEpBRp80FVGT0Mw/gzgbqFXP+sewk0WVonYbEcMDTJptH3VsLPGzqH/DQ1YL/aEIBuXFQ==} + engines: {node: '>=14.0.0'} + dependencies: + '@aws-sdk/types': 3.515.0 + '@smithy/property-provider': 2.1.1 + '@smithy/shared-ini-file-loader': 2.3.1 + '@smithy/types': 2.9.1 + tslib: 2.6.2 + dev: false + + /@aws-sdk/credential-provider-sso@3.515.0(@aws-sdk/credential-provider-node@3.515.0): + resolution: {integrity: sha512-j7vUkiSmuhpBvZYoPTRTI4ePnQbiZMFl6TNhg9b9DprC1zHkucsZnhRhqjOVlrw/H6J4jmcPGcHHTZ5WQNI5xQ==} + engines: {node: '>=14.0.0'} + dependencies: + '@aws-sdk/client-sso': 3.515.0 + '@aws-sdk/token-providers': 3.515.0(@aws-sdk/credential-provider-node@3.515.0) + '@aws-sdk/types': 3.515.0 + '@smithy/property-provider': 2.1.1 + '@smithy/shared-ini-file-loader': 2.3.1 + '@smithy/types': 2.9.1 + tslib: 2.6.2 + transitivePeerDependencies: + - '@aws-sdk/credential-provider-node' + - aws-crt + dev: false + + /@aws-sdk/credential-provider-web-identity@3.515.0(@aws-sdk/credential-provider-node@3.515.0): + resolution: {integrity: sha512-66+2g4z3fWwdoGReY8aUHvm6JrKZMTRxjuizljVmMyOBttKPeBYXvUTop/g3ZGUx1f8j+C5qsGK52viYBvtjuQ==} + engines: {node: '>=14.0.0'} + dependencies: + '@aws-sdk/client-sts': 3.515.0(@aws-sdk/credential-provider-node@3.515.0) + '@aws-sdk/types': 3.515.0 + '@smithy/property-provider': 2.1.1 + '@smithy/types': 2.9.1 + tslib: 2.6.2 + transitivePeerDependencies: + - '@aws-sdk/credential-provider-node' + - aws-crt + dev: false + + /@aws-sdk/middleware-bucket-endpoint@3.515.0: + resolution: {integrity: sha512-Vm423j3udFrhKPaKiXtie+6aF05efjX8lhAu5VOruIvbam7olvdWNdkH7sGWlz1ko3CVa7PwOYjGHiOOhxpEOA==} + engines: {node: '>=14.0.0'} + dependencies: + '@aws-sdk/types': 3.515.0 + '@aws-sdk/util-arn-parser': 3.495.0 + '@smithy/node-config-provider': 2.2.1 + '@smithy/protocol-http': 3.1.1 + '@smithy/types': 2.9.1 + '@smithy/util-config-provider': 2.2.1 + tslib: 2.6.2 + dev: false + + /@aws-sdk/middleware-expect-continue@3.515.0: + resolution: {integrity: sha512-TWCXulivab4reOMx/vxa/IwnPX78fLwI9NUoAxjsqB6W9qjmSnPD43BSVeGvbbl/YNmgk7XfMbZb6IgxW7RyzA==} + engines: {node: '>=14.0.0'} + dependencies: + '@aws-sdk/types': 3.515.0 + '@smithy/protocol-http': 3.1.1 + '@smithy/types': 2.9.1 + tslib: 2.6.2 + dev: false + + /@aws-sdk/middleware-flexible-checksums@3.515.0: + resolution: {integrity: sha512-ydGjnqNeYlJaAkmQeQnS4pZRAAvzefdm8c234Qh0Fg55xRwHTNLp7uYsdfkTjrdAlj6YIO3Zr6vK6VJ6MGCwug==} + engines: {node: '>=14.0.0'} + dependencies: + '@aws-crypto/crc32': 3.0.0 + '@aws-crypto/crc32c': 3.0.0 + '@aws-sdk/types': 3.515.0 + '@smithy/is-array-buffer': 2.1.1 + '@smithy/protocol-http': 3.1.1 + '@smithy/types': 2.9.1 + '@smithy/util-utf8': 2.1.1 + tslib: 2.6.2 + dev: false + + /@aws-sdk/middleware-host-header@3.515.0: + resolution: {integrity: sha512-I1MwWPzdRKM1luvdDdjdGsDjNVPhj9zaIytEchjTY40NcKOg+p2evLD2y69ozzg8pyXK63r8DdvDGOo9QPuh0A==} + engines: {node: '>=14.0.0'} + dependencies: + '@aws-sdk/types': 3.515.0 + '@smithy/protocol-http': 3.1.1 + '@smithy/types': 2.9.1 + tslib: 2.6.2 + dev: false + + /@aws-sdk/middleware-location-constraint@3.515.0: + resolution: {integrity: sha512-ORFC5oijjTJsHhUXy9o52/vl5Irf6e83bE/8tBp+sVVx81+E8zTTWZbysoa41c0B5Ycd0H3wCWutvjdXT16ydQ==} + engines: {node: '>=14.0.0'} + dependencies: + '@aws-sdk/types': 3.515.0 + '@smithy/types': 2.9.1 + tslib: 2.6.2 + dev: false + + /@aws-sdk/middleware-logger@3.515.0: + resolution: {integrity: sha512-qXomJzg2m/5seQOxHi/yOXOKfSjwrrJSmEmfwJKJyQgdMbBcjz3Cz0H/1LyC6c5hHm6a/SZgSTzDAbAoUmyL+Q==} + engines: {node: '>=14.0.0'} + dependencies: + '@aws-sdk/types': 3.515.0 + '@smithy/types': 2.9.1 + tslib: 2.6.2 + dev: false + + /@aws-sdk/middleware-recursion-detection@3.515.0: + resolution: {integrity: sha512-dokHLbTV3IHRIBrw9mGoxcNTnQsjlm7TpkJhPdGT9T4Mq399EyQo51u6IsVMm07RXLl2Zw7u+u9p+qWBFzmFRA==} + engines: {node: '>=14.0.0'} + dependencies: + '@aws-sdk/types': 3.515.0 + '@smithy/protocol-http': 3.1.1 + '@smithy/types': 2.9.1 + tslib: 2.6.2 + dev: false + + /@aws-sdk/middleware-sdk-s3@3.515.0: + resolution: {integrity: sha512-vB8JwiTEAqm1UT9xfugnCgl0H0dtBLUQQK99JwQEWjHPZmQ3HQuVkykmJRY3X0hzKMEgqXodz0hZOvf3Hq1mvQ==} + engines: {node: '>=14.0.0'} + dependencies: + '@aws-sdk/types': 3.515.0 + '@aws-sdk/util-arn-parser': 3.495.0 + '@smithy/node-config-provider': 2.2.1 + '@smithy/protocol-http': 3.1.1 + '@smithy/signature-v4': 2.1.1 + '@smithy/smithy-client': 2.3.1 + '@smithy/types': 2.9.1 + '@smithy/util-config-provider': 2.2.1 + tslib: 2.6.2 + dev: false + + /@aws-sdk/middleware-signing@3.515.0: + resolution: {integrity: sha512-SdjCyQCL702I07KhCiBFcoh6+NYtnruHJQIzWwMpBteuYHnCHW1k9uZ6pqacsS+Y6qpAKfTVNpQx2zP2s6QoHA==} + engines: {node: '>=14.0.0'} + dependencies: + '@aws-sdk/types': 3.515.0 + '@smithy/property-provider': 2.1.1 + '@smithy/protocol-http': 3.1.1 + '@smithy/signature-v4': 2.1.1 + '@smithy/types': 2.9.1 + '@smithy/util-middleware': 2.1.1 + tslib: 2.6.2 + dev: false + + /@aws-sdk/middleware-ssec@3.515.0: + resolution: {integrity: sha512-0qLjKiorosVBzzaV/o7MEyS9xqLLu02qGbP564Z/FZY74JUQEpBNedgveMUbb6lqr85RnOuwZ0GZ0cBRfH2brQ==} + engines: {node: '>=14.0.0'} + dependencies: + '@aws-sdk/types': 3.515.0 + '@smithy/types': 2.9.1 + tslib: 2.6.2 + dev: false + + /@aws-sdk/middleware-user-agent@3.515.0: + resolution: {integrity: sha512-nOqZjGA/GkjuJ5fUshec9Fv6HFd7ovOTxMJbw3MfAhqXuVZ6dKF41lpVJ4imNsgyFt3shUg9WDY8zGFjlYMB3g==} + engines: {node: '>=14.0.0'} + dependencies: + '@aws-sdk/types': 3.515.0 + '@aws-sdk/util-endpoints': 3.515.0 + '@smithy/protocol-http': 3.1.1 + '@smithy/types': 2.9.1 + tslib: 2.6.2 + dev: false + + /@aws-sdk/region-config-resolver@3.515.0: + resolution: {integrity: sha512-RIRx9loxMgEAc/r1wPfnfShOuzn4RBi8pPPv6/jhhITEeMnJe6enAh2k5y9DdiVDDgCWZgVFSv0YkAIfzAFsnQ==} + engines: {node: '>=14.0.0'} + dependencies: + '@aws-sdk/types': 3.515.0 + '@smithy/node-config-provider': 2.2.1 + '@smithy/types': 2.9.1 + '@smithy/util-config-provider': 2.2.1 + '@smithy/util-middleware': 2.1.1 + tslib: 2.6.2 + dev: false + + /@aws-sdk/s3-request-presigner@3.515.0: + resolution: {integrity: sha512-B6RcXWJTOHSqZDII/sYeM89MWc//AwA7iIcZk+oXyUSdVTl03z6raJMxWqY0dPx7KuBjLTnZPqUXKCCoQvnp/g==} + engines: {node: '>=14.0.0'} + dependencies: + '@aws-sdk/signature-v4-multi-region': 3.515.0 + '@aws-sdk/types': 3.515.0 + '@aws-sdk/util-format-url': 3.515.0 + '@smithy/middleware-endpoint': 2.4.1 + '@smithy/protocol-http': 3.1.1 + '@smithy/smithy-client': 2.3.1 + '@smithy/types': 2.9.1 + tslib: 2.6.2 + dev: false + + /@aws-sdk/signature-v4-multi-region@3.515.0: + resolution: {integrity: sha512-5lrCn4DSE0zL41k0L6moqcdExZhWdAnV0/oMEagrISzQYoia+aNTEeyVD3xqJhRbEW4gCj3Uoyis6c8muf7b9g==} + engines: {node: '>=14.0.0'} + dependencies: + '@aws-sdk/middleware-sdk-s3': 3.515.0 + '@aws-sdk/types': 3.515.0 + '@smithy/protocol-http': 3.1.1 + '@smithy/signature-v4': 2.1.1 + '@smithy/types': 2.9.1 + tslib: 2.6.2 + dev: false + + /@aws-sdk/token-providers@3.515.0(@aws-sdk/credential-provider-node@3.515.0): + resolution: {integrity: sha512-MQuf04rIcTXqwDzmyHSpFPF1fKEzRl64oXtCRUF3ddxTdK6wxXkePfK6wNCuL+GEbEcJAoCtIGIRpzGPJvQjHA==} + engines: {node: '>=14.0.0'} + dependencies: + '@aws-sdk/client-sso-oidc': 3.515.0(@aws-sdk/credential-provider-node@3.515.0) + '@aws-sdk/types': 3.515.0 + '@smithy/property-provider': 2.1.1 + '@smithy/shared-ini-file-loader': 2.3.1 + '@smithy/types': 2.9.1 + tslib: 2.6.2 + transitivePeerDependencies: + - '@aws-sdk/credential-provider-node' + - aws-crt + dev: false + + /@aws-sdk/types@3.515.0: + resolution: {integrity: sha512-B3gUpiMlpT6ERaLvZZ61D0RyrQPsFYDkCncLPVkZOKkCOoFU46zi1o6T5JcYiz8vkx1q9RGloQ5exh79s5pU/w==} + engines: {node: '>=14.0.0'} + dependencies: + '@smithy/types': 2.9.1 + tslib: 2.6.2 + dev: false + + /@aws-sdk/util-arn-parser@3.495.0: + resolution: {integrity: sha512-hwdA3XAippSEUxs7jpznwD63YYFR+LtQvlEcebPTgWR9oQgG9TfS+39PUfbnEeje1ICuOrN3lrFqFbmP9uzbMg==} + engines: {node: '>=14.0.0'} + dependencies: + tslib: 2.6.2 + dev: false + + /@aws-sdk/util-endpoints@3.515.0: + resolution: {integrity: sha512-UJi+jdwcGFV/F7d3+e2aQn5yZOVpDiAgfgNhPnEtgV0WozJ5/ZUeZBgWvSc/K415N4A4D/9cbBc7+I+35qzcDQ==} + engines: {node: '>=14.0.0'} + dependencies: + '@aws-sdk/types': 3.515.0 + '@smithy/types': 2.9.1 + '@smithy/util-endpoints': 1.1.1 + tslib: 2.6.2 + dev: false + + /@aws-sdk/util-format-url@3.515.0: + resolution: {integrity: sha512-7BgmUldmECebZU2qUAxOoEkHnji5NZX/j6TcgY4xgl1tUycw72BeKdcQYLUt4YoXQmIGZHiBL8L/TfO48W+FpA==} + engines: {node: '>=14.0.0'} + dependencies: + '@aws-sdk/types': 3.515.0 + '@smithy/querystring-builder': 2.1.1 + '@smithy/types': 2.9.1 + tslib: 2.6.2 + dev: false + + /@aws-sdk/util-locate-window@3.495.0: + resolution: {integrity: sha512-MfaPXT0kLX2tQaR90saBT9fWQq2DHqSSJRzW+MZWsmF+y5LGCOhO22ac/2o6TKSQm7h0HRc2GaADqYYYor62yg==} + engines: {node: '>=14.0.0'} + dependencies: + tslib: 2.6.2 + dev: false + + /@aws-sdk/util-user-agent-browser@3.515.0: + resolution: {integrity: sha512-pTWQb0JCafTmLHLDv3Qqs/nAAJghcPdGQIBpsCStb0YEzg3At/dOi2AIQ683yYnXmeOxLXJDzmlsovfVObJScw==} + dependencies: + '@aws-sdk/types': 3.515.0 + '@smithy/types': 2.9.1 + bowser: 2.11.0 + tslib: 2.6.2 + dev: false + + /@aws-sdk/util-user-agent-node@3.515.0: + resolution: {integrity: sha512-A/KJ+/HTohHyVXLH+t/bO0Z2mPrQgELbQO8tX+B2nElo8uklj70r5cT7F8ETsI9oOy+HDVpiL5/v45ZgpUOiPg==} + engines: {node: '>=14.0.0'} + peerDependencies: + aws-crt: '>=1.0.0' + peerDependenciesMeta: + aws-crt: + optional: true + dependencies: + '@aws-sdk/types': 3.515.0 + '@smithy/node-config-provider': 2.2.1 + '@smithy/types': 2.9.1 + tslib: 2.6.2 + dev: false + + /@aws-sdk/util-utf8-browser@3.259.0: + resolution: {integrity: sha512-UvFa/vR+e19XookZF8RzFZBrw2EUkQWxiBW0yYQAhvk3C+QVGl0H3ouca8LDBlBfQKXwmW3huo/59H8rwb1wJw==} + dependencies: + tslib: 2.6.2 + dev: false + + /@aws-sdk/xml-builder@3.496.0: + resolution: {integrity: sha512-GvEjh537IIeOw1ZkZuB37sV12u+ipS5Z1dwjEC/HAvhl5ac23ULtTr1/n+U1gLNN+BAKSWjKiQ2ksj8DiUzeyw==} + engines: {node: '>=14.0.0'} + dependencies: + '@smithy/types': 2.9.1 + tslib: 2.6.2 + dev: false + /@babel/runtime@7.23.8: resolution: {integrity: sha512-Y7KbAP984rn1VGMbGqKmBLio9V7y5Je9GvU4rQPCPinCyNfUcToxIXl06d59URp/F3LwinvODxab5N/G6qggkw==} engines: {node: '>=6.9.0'} @@ -1400,6 +2064,461 @@ packages: resolution: {integrity: sha512-Jh4t/593gxs0lJZ/z3NnasKlplXT2f+4y/LZYuaKZW5KAaiVFL/fThhs+17EbUd53jUVJ0QudYCBGbN/psvaqg==} dev: true + /@smithy/abort-controller@2.1.1: + resolution: {integrity: sha512-1+qdrUqLhaALYL0iOcN43EP6yAXXQ2wWZ6taf4S2pNGowmOc5gx+iMQv+E42JizNJjB0+gEadOXeV1Bf7JWL1Q==} + engines: {node: '>=14.0.0'} + dependencies: + '@smithy/types': 2.9.1 + tslib: 2.6.2 + dev: false + + /@smithy/chunked-blob-reader-native@2.1.1: + resolution: {integrity: sha512-zNW+43dltfNMUrBEYLMWgI8lQr0uhtTcUyxkgC9EP4j17WREzgSFMPUFVrVV6Rc2+QtWERYjb4tzZnQGa7R9fQ==} + dependencies: + '@smithy/util-base64': 2.1.1 + tslib: 2.6.2 + dev: false + + /@smithy/chunked-blob-reader@2.1.1: + resolution: {integrity: sha512-NjNFCKxC4jVvn+lUr3Yo4/PmUJj3tbyqH6GNHueyTGS5Q27vlEJ1MkNhUDV8QGxJI7Bodnc2pD18lU2zRfhHlQ==} + dependencies: + tslib: 2.6.2 + dev: false + + /@smithy/config-resolver@2.1.1: + resolution: {integrity: sha512-lxfLDpZm+AWAHPFZps5JfDoO9Ux1764fOgvRUBpHIO8HWHcSN1dkgsago1qLRVgm1BZ8RCm8cgv99QvtaOWIhw==} + engines: {node: '>=14.0.0'} + dependencies: + '@smithy/node-config-provider': 2.2.1 + '@smithy/types': 2.9.1 + '@smithy/util-config-provider': 2.2.1 + '@smithy/util-middleware': 2.1.1 + tslib: 2.6.2 + dev: false + + /@smithy/core@1.3.2: + resolution: {integrity: sha512-tYDmTp0f2TZVE18jAOH1PnmkngLQ+dOGUlMd1u67s87ieueNeyqhja6z/Z4MxhybEiXKOWFOmGjfTZWFxljwJw==} + engines: {node: '>=14.0.0'} + dependencies: + '@smithy/middleware-endpoint': 2.4.1 + '@smithy/middleware-retry': 2.1.1 + '@smithy/middleware-serde': 2.1.1 + '@smithy/protocol-http': 3.1.1 + '@smithy/smithy-client': 2.3.1 + '@smithy/types': 2.9.1 + '@smithy/util-middleware': 2.1.1 + tslib: 2.6.2 + dev: false + + /@smithy/credential-provider-imds@2.2.1: + resolution: {integrity: sha512-7XHjZUxmZYnONheVQL7j5zvZXga+EWNgwEAP6OPZTi7l8J4JTeNh9aIOfE5fKHZ/ee2IeNOh54ZrSna+Vc6TFA==} + engines: {node: '>=14.0.0'} + dependencies: + '@smithy/node-config-provider': 2.2.1 + '@smithy/property-provider': 2.1.1 + '@smithy/types': 2.9.1 + '@smithy/url-parser': 2.1.1 + tslib: 2.6.2 + dev: false + + /@smithy/eventstream-codec@2.1.1: + resolution: {integrity: sha512-E8KYBxBIuU4c+zrpR22VsVrOPoEDzk35bQR3E+xm4k6Pa6JqzkDOdMyf9Atac5GPNKHJBdVaQ4JtjdWX2rl/nw==} + dependencies: + '@aws-crypto/crc32': 3.0.0 + '@smithy/types': 2.9.1 + '@smithy/util-hex-encoding': 2.1.1 + tslib: 2.6.2 + dev: false + + /@smithy/eventstream-serde-browser@2.1.1: + resolution: {integrity: sha512-JvEdCmGlZUay5VtlT8/kdR6FlvqTDUiJecMjXsBb0+k1H/qc9ME5n2XKPo8q/MZwEIA1GmGgYMokKGjVvMiDow==} + engines: {node: '>=14.0.0'} + dependencies: + '@smithy/eventstream-serde-universal': 2.1.1 + '@smithy/types': 2.9.1 + tslib: 2.6.2 + dev: false + + /@smithy/eventstream-serde-config-resolver@2.1.1: + resolution: {integrity: sha512-EqNqXYp3+dk//NmW3NAgQr9bEQ7fsu/CcxQmTiq07JlaIcne/CBWpMZETyXm9w5LXkhduBsdXdlMscfDUDn2fA==} + engines: {node: '>=14.0.0'} + dependencies: + '@smithy/types': 2.9.1 + tslib: 2.6.2 + dev: false + + /@smithy/eventstream-serde-node@2.1.1: + resolution: {integrity: sha512-LF882q/aFidFNDX7uROAGxq3H0B7rjyPkV6QDn6/KDQ+CG7AFkRccjxRf1xqajq/Pe4bMGGr+VKAaoF6lELIQw==} + engines: {node: '>=14.0.0'} + dependencies: + '@smithy/eventstream-serde-universal': 2.1.1 + '@smithy/types': 2.9.1 + tslib: 2.6.2 + dev: false + + /@smithy/eventstream-serde-universal@2.1.1: + resolution: {integrity: sha512-LR0mMT+XIYTxk4k2fIxEA1BPtW3685QlqufUEUAX1AJcfFfxNDKEvuCRZbO8ntJb10DrIFVJR9vb0MhDCi0sAQ==} + engines: {node: '>=14.0.0'} + dependencies: + '@smithy/eventstream-codec': 2.1.1 + '@smithy/types': 2.9.1 + tslib: 2.6.2 + dev: false + + /@smithy/fetch-http-handler@2.4.1: + resolution: {integrity: sha512-VYGLinPsFqH68lxfRhjQaSkjXM7JysUOJDTNjHBuN/ykyRb2f1gyavN9+VhhPTWCy32L4yZ2fdhpCs/nStEicg==} + dependencies: + '@smithy/protocol-http': 3.1.1 + '@smithy/querystring-builder': 2.1.1 + '@smithy/types': 2.9.1 + '@smithy/util-base64': 2.1.1 + tslib: 2.6.2 + dev: false + + /@smithy/hash-blob-browser@2.1.1: + resolution: {integrity: sha512-jizu1+2PAUjiGIfRtlPEU8Yo6zn+d78ti/ZHDesdf1SUn2BuZW433JlPoCOLH3dBoEEvTgLvQ8tUGSoTTALA+A==} + dependencies: + '@smithy/chunked-blob-reader': 2.1.1 + '@smithy/chunked-blob-reader-native': 2.1.1 + '@smithy/types': 2.9.1 + tslib: 2.6.2 + dev: false + + /@smithy/hash-node@2.1.1: + resolution: {integrity: sha512-Qhoq0N8f2OtCnvUpCf+g1vSyhYQrZjhSwvJ9qvR8BUGOtTXiyv2x1OD2e6jVGmlpC4E4ax1USHoyGfV9JFsACg==} + engines: {node: '>=14.0.0'} + dependencies: + '@smithy/types': 2.9.1 + '@smithy/util-buffer-from': 2.1.1 + '@smithy/util-utf8': 2.1.1 + tslib: 2.6.2 + dev: false + + /@smithy/hash-stream-node@2.1.1: + resolution: {integrity: sha512-VgDaKcfCy0iHcmtAZgZ3Yw9g37Gkn2JsQiMtFQXUh8Wmo3GfNgDwLOtdhJ272pOT7DStzpe9cNr+eV5Au8KfQA==} + engines: {node: '>=14.0.0'} + dependencies: + '@smithy/types': 2.9.1 + '@smithy/util-utf8': 2.1.1 + tslib: 2.6.2 + dev: false + + /@smithy/invalid-dependency@2.1.1: + resolution: {integrity: sha512-7WTgnKw+VPg8fxu2v9AlNOQ5yaz6RA54zOVB4f6vQuR0xFKd+RzlCpt0WidYTsye7F+FYDIaS/RnJW4pxjNInw==} + dependencies: + '@smithy/types': 2.9.1 + tslib: 2.6.2 + dev: false + + /@smithy/is-array-buffer@2.1.1: + resolution: {integrity: sha512-xozSQrcUinPpNPNPds4S7z/FakDTh1MZWtRP/2vQtYB/u3HYrX2UXuZs+VhaKBd6Vc7g2XPr2ZtwGBNDN6fNKQ==} + engines: {node: '>=14.0.0'} + dependencies: + tslib: 2.6.2 + dev: false + + /@smithy/md5-js@2.1.1: + resolution: {integrity: sha512-L3MbIYBIdLlT+MWTYrdVSv/dow1+6iZ1Ad7xS0OHxTTs17d753ZcpOV4Ro7M7tRAVWML/sg2IAp/zzCb6aAttg==} + dependencies: + '@smithy/types': 2.9.1 + '@smithy/util-utf8': 2.1.1 + tslib: 2.6.2 + dev: false + + /@smithy/middleware-content-length@2.1.1: + resolution: {integrity: sha512-rSr9ezUl9qMgiJR0UVtVOGEZElMdGFyl8FzWEF5iEKTlcWxGr2wTqGfDwtH3LAB7h+FPkxqv4ZU4cpuCN9Kf/g==} + engines: {node: '>=14.0.0'} + dependencies: + '@smithy/protocol-http': 3.1.1 + '@smithy/types': 2.9.1 + tslib: 2.6.2 + dev: false + + /@smithy/middleware-endpoint@2.4.1: + resolution: {integrity: sha512-XPZTb1E2Oav60Ven3n2PFx+rX9EDsU/jSTA8VDamt7FXks67ekjPY/XrmmPDQaFJOTUHJNKjd8+kZxVO5Ael4Q==} + engines: {node: '>=14.0.0'} + dependencies: + '@smithy/middleware-serde': 2.1.1 + '@smithy/node-config-provider': 2.2.1 + '@smithy/shared-ini-file-loader': 2.3.1 + '@smithy/types': 2.9.1 + '@smithy/url-parser': 2.1.1 + '@smithy/util-middleware': 2.1.1 + tslib: 2.6.2 + dev: false + + /@smithy/middleware-retry@2.1.1: + resolution: {integrity: sha512-eMIHOBTXro6JZ+WWzZWd/8fS8ht5nS5KDQjzhNMHNRcG5FkNTqcKpYhw7TETMYzbLfhO5FYghHy1vqDWM4FLDA==} + engines: {node: '>=14.0.0'} + dependencies: + '@smithy/node-config-provider': 2.2.1 + '@smithy/protocol-http': 3.1.1 + '@smithy/service-error-classification': 2.1.1 + '@smithy/smithy-client': 2.3.1 + '@smithy/types': 2.9.1 + '@smithy/util-middleware': 2.1.1 + '@smithy/util-retry': 2.1.1 + tslib: 2.6.2 + uuid: 8.3.2 + dev: false + + /@smithy/middleware-serde@2.1.1: + resolution: {integrity: sha512-D8Gq0aQBeE1pxf3cjWVkRr2W54t+cdM2zx78tNrVhqrDykRA7asq8yVJij1u5NDtKzKqzBSPYh7iW0svUKg76g==} + engines: {node: '>=14.0.0'} + dependencies: + '@smithy/types': 2.9.1 + tslib: 2.6.2 + dev: false + + /@smithy/middleware-stack@2.1.1: + resolution: {integrity: sha512-KPJhRlhsl8CjgGXK/DoDcrFGfAqoqvuwlbxy+uOO4g2Azn1dhH+GVfC3RAp+6PoL5PWPb+vt6Z23FP+Mr6qeCw==} + engines: {node: '>=14.0.0'} + dependencies: + '@smithy/types': 2.9.1 + tslib: 2.6.2 + dev: false + + /@smithy/node-config-provider@2.2.1: + resolution: {integrity: sha512-epzK3x1xNxA9oJgHQ5nz+2j6DsJKdHfieb+YgJ7ATWxzNcB7Hc+Uya2TUck5MicOPhDV8HZImND7ZOecVr+OWg==} + engines: {node: '>=14.0.0'} + dependencies: + '@smithy/property-provider': 2.1.1 + '@smithy/shared-ini-file-loader': 2.3.1 + '@smithy/types': 2.9.1 + tslib: 2.6.2 + dev: false + + /@smithy/node-http-handler@2.3.1: + resolution: {integrity: sha512-gLA8qK2nL9J0Rk/WEZSvgin4AppvuCYRYg61dcUo/uKxvMZsMInL5I5ZdJTogOvdfVug3N2dgI5ffcUfS4S9PA==} + engines: {node: '>=14.0.0'} + dependencies: + '@smithy/abort-controller': 2.1.1 + '@smithy/protocol-http': 3.1.1 + '@smithy/querystring-builder': 2.1.1 + '@smithy/types': 2.9.1 + tslib: 2.6.2 + dev: false + + /@smithy/property-provider@2.1.1: + resolution: {integrity: sha512-FX7JhhD/o5HwSwg6GLK9zxrMUrGnb3PzNBrcthqHKBc3dH0UfgEAU24xnJ8F0uow5mj17UeBEOI6o3CF2k7Mhw==} + engines: {node: '>=14.0.0'} + dependencies: + '@smithy/types': 2.9.1 + tslib: 2.6.2 + dev: false + + /@smithy/protocol-http@3.1.1: + resolution: {integrity: sha512-6ZRTSsaXuSL9++qEwH851hJjUA0OgXdQFCs+VDw4tGH256jQ3TjYY/i34N4vd24RV3nrjNsgd1yhb57uMoKbzQ==} + engines: {node: '>=14.0.0'} + dependencies: + '@smithy/types': 2.9.1 + tslib: 2.6.2 + dev: false + + /@smithy/querystring-builder@2.1.1: + resolution: {integrity: sha512-C/ko/CeEa8jdYE4gt6nHO5XDrlSJ3vdCG0ZAc6nD5ZIE7LBp0jCx4qoqp7eoutBu7VrGMXERSRoPqwi1WjCPbg==} + engines: {node: '>=14.0.0'} + dependencies: + '@smithy/types': 2.9.1 + '@smithy/util-uri-escape': 2.1.1 + tslib: 2.6.2 + dev: false + + /@smithy/querystring-parser@2.1.1: + resolution: {integrity: sha512-H4+6jKGVhG1W4CIxfBaSsbm98lOO88tpDWmZLgkJpt8Zkk/+uG0FmmqMuCAc3HNM2ZDV+JbErxr0l5BcuIf/XQ==} + engines: {node: '>=14.0.0'} + dependencies: + '@smithy/types': 2.9.1 + tslib: 2.6.2 + dev: false + + /@smithy/service-error-classification@2.1.1: + resolution: {integrity: sha512-txEdZxPUgM1PwGvDvHzqhXisrc5LlRWYCf2yyHfvITWioAKat7srQvpjMAvgzf0t6t7j8yHrryXU9xt7RZqFpw==} + engines: {node: '>=14.0.0'} + dependencies: + '@smithy/types': 2.9.1 + dev: false + + /@smithy/shared-ini-file-loader@2.3.1: + resolution: {integrity: sha512-2E2kh24igmIznHLB6H05Na4OgIEilRu0oQpYXo3LCNRrawHAcfDKq9004zJs+sAMt2X5AbY87CUCJ7IpqpSgdw==} + engines: {node: '>=14.0.0'} + dependencies: + '@smithy/types': 2.9.1 + tslib: 2.6.2 + dev: false + + /@smithy/signature-v4@2.1.1: + resolution: {integrity: sha512-Hb7xub0NHuvvQD3YwDSdanBmYukoEkhqBjqoxo+bSdC0ryV9cTfgmNjuAQhTPYB6yeU7hTR+sPRiFMlxqv6kmg==} + engines: {node: '>=14.0.0'} + dependencies: + '@smithy/eventstream-codec': 2.1.1 + '@smithy/is-array-buffer': 2.1.1 + '@smithy/types': 2.9.1 + '@smithy/util-hex-encoding': 2.1.1 + '@smithy/util-middleware': 2.1.1 + '@smithy/util-uri-escape': 2.1.1 + '@smithy/util-utf8': 2.1.1 + tslib: 2.6.2 + dev: false + + /@smithy/smithy-client@2.3.1: + resolution: {integrity: sha512-YsTdU8xVD64r2pLEwmltrNvZV6XIAC50LN6ivDopdt+YiF/jGH6PY9zUOu0CXD/d8GMB8gbhnpPsdrjAXHS9QA==} + engines: {node: '>=14.0.0'} + dependencies: + '@smithy/middleware-endpoint': 2.4.1 + '@smithy/middleware-stack': 2.1.1 + '@smithy/protocol-http': 3.1.1 + '@smithy/types': 2.9.1 + '@smithy/util-stream': 2.1.1 + tslib: 2.6.2 + dev: false + + /@smithy/types@2.9.1: + resolution: {integrity: sha512-vjXlKNXyprDYDuJ7UW5iobdmyDm6g8dDG+BFUncAg/3XJaN45Gy5RWWWUVgrzIK7S4R1KWgIX5LeJcfvSI24bw==} + engines: {node: '>=14.0.0'} + dependencies: + tslib: 2.6.2 + dev: false + + /@smithy/url-parser@2.1.1: + resolution: {integrity: sha512-qC9Bv8f/vvFIEkHsiNrUKYNl8uKQnn4BdhXl7VzQRP774AwIjiSMMwkbT+L7Fk8W8rzYVifzJNYxv1HwvfBo3Q==} + dependencies: + '@smithy/querystring-parser': 2.1.1 + '@smithy/types': 2.9.1 + tslib: 2.6.2 + dev: false + + /@smithy/util-base64@2.1.1: + resolution: {integrity: sha512-UfHVpY7qfF/MrgndI5PexSKVTxSZIdz9InghTFa49QOvuu9I52zLPLUHXvHpNuMb1iD2vmc6R+zbv/bdMipR/g==} + engines: {node: '>=14.0.0'} + dependencies: + '@smithy/util-buffer-from': 2.1.1 + tslib: 2.6.2 + dev: false + + /@smithy/util-body-length-browser@2.1.1: + resolution: {integrity: sha512-ekOGBLvs1VS2d1zM2ER4JEeBWAvIOUKeaFch29UjjJsxmZ/f0L3K3x0dEETgh3Q9bkZNHgT+rkdl/J/VUqSRag==} + dependencies: + tslib: 2.6.2 + dev: false + + /@smithy/util-body-length-node@2.2.1: + resolution: {integrity: sha512-/ggJG+ta3IDtpNVq4ktmEUtOkH1LW64RHB5B0hcr5ZaWBmo96UX2cIOVbjCqqDickTXqBWZ4ZO0APuaPrD7Abg==} + engines: {node: '>=14.0.0'} + dependencies: + tslib: 2.6.2 + dev: false + + /@smithy/util-buffer-from@2.1.1: + resolution: {integrity: sha512-clhNjbyfqIv9Md2Mg6FffGVrJxw7bgK7s3Iax36xnfVj6cg0fUG7I4RH0XgXJF8bxi+saY5HR21g2UPKSxVCXg==} + engines: {node: '>=14.0.0'} + dependencies: + '@smithy/is-array-buffer': 2.1.1 + tslib: 2.6.2 + dev: false + + /@smithy/util-config-provider@2.2.1: + resolution: {integrity: sha512-50VL/tx9oYYcjJn/qKqNy7sCtpD0+s8XEBamIFo4mFFTclKMNp+rsnymD796uybjiIquB7VCB/DeafduL0y2kw==} + engines: {node: '>=14.0.0'} + dependencies: + tslib: 2.6.2 + dev: false + + /@smithy/util-defaults-mode-browser@2.1.1: + resolution: {integrity: sha512-lqLz/9aWRO6mosnXkArtRuQqqZBhNpgI65YDpww4rVQBuUT7qzKbDLG5AmnQTCiU4rOquaZO/Kt0J7q9Uic7MA==} + engines: {node: '>= 10.0.0'} + dependencies: + '@smithy/property-provider': 2.1.1 + '@smithy/smithy-client': 2.3.1 + '@smithy/types': 2.9.1 + bowser: 2.11.0 + tslib: 2.6.2 + dev: false + + /@smithy/util-defaults-mode-node@2.2.0: + resolution: {integrity: sha512-iFJp/N4EtkanFpBUtSrrIbtOIBf69KNuve03ic1afhJ9/korDxdM0c6cCH4Ehj/smI9pDCfVv+bqT3xZjF2WaA==} + engines: {node: '>= 10.0.0'} + dependencies: + '@smithy/config-resolver': 2.1.1 + '@smithy/credential-provider-imds': 2.2.1 + '@smithy/node-config-provider': 2.2.1 + '@smithy/property-provider': 2.1.1 + '@smithy/smithy-client': 2.3.1 + '@smithy/types': 2.9.1 + tslib: 2.6.2 + dev: false + + /@smithy/util-endpoints@1.1.1: + resolution: {integrity: sha512-sI4d9rjoaekSGEtq3xSb2nMjHMx8QXcz2cexnVyRWsy4yQ9z3kbDpX+7fN0jnbdOp0b3KSTZJZ2Yb92JWSanLw==} + engines: {node: '>= 14.0.0'} + dependencies: + '@smithy/node-config-provider': 2.2.1 + '@smithy/types': 2.9.1 + tslib: 2.6.2 + dev: false + + /@smithy/util-hex-encoding@2.1.1: + resolution: {integrity: sha512-3UNdP2pkYUUBGEXzQI9ODTDK+Tcu1BlCyDBaRHwyxhA+8xLP8agEKQq4MGmpjqb4VQAjq9TwlCQX0kP6XDKYLg==} + engines: {node: '>=14.0.0'} + dependencies: + tslib: 2.6.2 + dev: false + + /@smithy/util-middleware@2.1.1: + resolution: {integrity: sha512-mKNrk8oz5zqkNcbcgAAepeJbmfUW6ogrT2Z2gDbIUzVzNAHKJQTYmH9jcy0jbWb+m7ubrvXKb6uMjkSgAqqsFA==} + engines: {node: '>=14.0.0'} + dependencies: + '@smithy/types': 2.9.1 + tslib: 2.6.2 + dev: false + + /@smithy/util-retry@2.1.1: + resolution: {integrity: sha512-Mg+xxWPTeSPrthpC5WAamJ6PW4Kbo01Fm7lWM1jmGRvmrRdsd3192Gz2fBXAMURyXpaNxyZf6Hr/nQ4q70oVEA==} + engines: {node: '>= 14.0.0'} + dependencies: + '@smithy/service-error-classification': 2.1.1 + '@smithy/types': 2.9.1 + tslib: 2.6.2 + dev: false + + /@smithy/util-stream@2.1.1: + resolution: {integrity: sha512-J7SMIpUYvU4DQN55KmBtvaMc7NM3CZ2iWICdcgaovtLzseVhAqFRYqloT3mh0esrFw+3VEK6nQFteFsTqZSECQ==} + engines: {node: '>=14.0.0'} + dependencies: + '@smithy/fetch-http-handler': 2.4.1 + '@smithy/node-http-handler': 2.3.1 + '@smithy/types': 2.9.1 + '@smithy/util-base64': 2.1.1 + '@smithy/util-buffer-from': 2.1.1 + '@smithy/util-hex-encoding': 2.1.1 + '@smithy/util-utf8': 2.1.1 + tslib: 2.6.2 + dev: false + + /@smithy/util-uri-escape@2.1.1: + resolution: {integrity: sha512-saVzI1h6iRBUVSqtnlOnc9ssU09ypo7n+shdQ8hBTZno/9rZ3AuRYvoHInV57VF7Qn7B+pFJG7qTzFiHxWlWBw==} + engines: {node: '>=14.0.0'} + dependencies: + tslib: 2.6.2 + dev: false + + /@smithy/util-utf8@2.1.1: + resolution: {integrity: sha512-BqTpzYEcUMDwAKr7/mVRUtHDhs6ZoXDi9NypMvMfOr/+u1NW7JgqodPDECiiLboEm6bobcPcECxzjtQh865e9A==} + engines: {node: '>=14.0.0'} + dependencies: + '@smithy/util-buffer-from': 2.1.1 + tslib: 2.6.2 + dev: false + + /@smithy/util-waiter@2.1.1: + resolution: {integrity: sha512-kYy6BLJJNif+uqNENtJqWdXcpqo1LS+nj1AfXcDhOpqpSHJSAkVySLyZV9fkmuVO21lzGoxjvd1imGGJHph/IA==} + engines: {node: '>=14.0.0'} + dependencies: + '@smithy/abort-controller': 2.1.1 + '@smithy/types': 2.9.1 + tslib: 2.6.2 + dev: false + /@swc/helpers@0.5.2: resolution: {integrity: sha512-E4KcWTpoLHqwPHLxidpOqQbcrZVgi0rsmmZXUle1jXmJfuIf/UWpczUJ7MZZ5tlxytgJXyp0w4PGkkeLiuIdZw==} dependencies: @@ -1876,6 +2995,10 @@ packages: has-symbols: 1.0.3 dev: true + /asynckit@0.4.0: + resolution: {integrity: sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==} + dev: false + /autoprefixer@10.4.16(postcss@8.4.33): resolution: {integrity: sha512-7vd3UC6xKp0HLfua5IjZlcXvGAGy7cBAXTg2lyQ/8WpNhd6SiZ8Be+xm3FyBSYJx5GKcpRCzBh7RH4/0dnY+uQ==} engines: {node: ^10 || ^12 || >=14} @@ -1902,6 +3025,16 @@ packages: engines: {node: '>=4'} dev: true + /axios@1.6.7: + resolution: {integrity: sha512-/hDJGff6/c7u0hDkvkGxR/oy6CbCs8ziCsC7SqmhjfozqiJGc8Z11wrv9z9lYfY4K8l+H9TpjcMDX0xOZmx+RA==} + dependencies: + follow-redirects: 1.15.5 + form-data: 4.0.0 + proxy-from-env: 1.1.0 + transitivePeerDependencies: + - debug + dev: false + /axobject-query@3.2.1: resolution: {integrity: sha512-jsyHu61e6N4Vbz/v18DHwWYKK0bSWLqn47eeDSKPB7m8tqMHF9YJ+mhIk2lVteyZrY8tnSj/jHOv4YiTCuCJgg==} dependencies: @@ -1915,6 +3048,10 @@ packages: resolution: {integrity: sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==} engines: {node: '>=8'} + /bowser@2.11.0: + resolution: {integrity: sha512-AlcaJBi/pqqJBIQ8U9Mcpc9i8Aqxn88Skv5d+xBX006BY5u8N3mGLHa5Lgppa7L/HfwgwLgZ6NYs+Ag6uUmJRA==} + dev: false + /brace-expansion@1.1.11: resolution: {integrity: sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==} dependencies: @@ -2076,6 +3213,13 @@ packages: /color-name@1.1.4: resolution: {integrity: sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==} + /combined-stream@1.0.8: + resolution: {integrity: sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==} + engines: {node: '>= 0.8'} + dependencies: + delayed-stream: 1.0.0 + dev: false + /command-score@0.1.2: resolution: {integrity: sha512-VtDvQpIJBvBatnONUsPzXYFVKQQAhuf3XTNOAsdBxCNO/QCtUUd8LSgjn0GVarBkCad6aJCZfXgrjYbl/KRr7w==} dev: false @@ -2183,6 +3327,11 @@ packages: object-keys: 1.1.1 dev: true + /delayed-stream@1.0.0: + resolution: {integrity: sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==} + engines: {node: '>=0.4.0'} + dev: false + /denque@2.1.0: resolution: {integrity: sha512-HVQE3AAb/pxF8fQAoiqpvg9i3evqug3hoiwakOyZAwJm+6vZehbkYXZ0l4JxS+I3QxM97v5aaRNhj8v5oBhekw==} engines: {node: '>=0.10'} @@ -2911,6 +4060,13 @@ packages: resolution: {integrity: sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==} dev: true + /fast-xml-parser@4.2.5: + resolution: {integrity: sha512-B9/wizE4WngqQftFPmdaMYlXoJlJOYxGQOanC77fq9k8+Z0v5dDSVh+3glErdIROP//s/jgb7ZuxKfB8nVyo0g==} + hasBin: true + dependencies: + strnum: 1.0.5 + dev: false + /fastq@1.16.0: resolution: {integrity: sha512-ifCoaXsDrsdkWTtiNJX5uzHDsrck5TzfKKDcuFFTIrrc/BS076qgEIfoIy1VeZqViznfKiysPYTh/QeHtnIsYA==} dependencies: @@ -2950,6 +4106,16 @@ packages: resolution: {integrity: sha512-36yxDn5H7OFZQla0/jFJmbIKTdZAQHngCedGxiMmpNfEZM0sdEeT+WczLQrjK6D7o2aiyLYDnkw0R3JK0Qv1RQ==} dev: true + /follow-redirects@1.15.5: + resolution: {integrity: sha512-vSFWUON1B+yAw1VN4xMfxgn5fTUiaOzAJCKBwIIgT/+7CuGy9+r+5gITvP62j3RmaD5Ph65UaERdOSRGUzZtgw==} + engines: {node: '>=4.0'} + peerDependencies: + debug: '*' + peerDependenciesMeta: + debug: + optional: true + dev: false + /for-each@0.3.3: resolution: {integrity: sha512-jqYfLp7mo9vIyQf8ykW2v7A+2N4QjeCeI5+Dz9XraiO1ign81wjiH7Fb9vSOWvQfNtmSa4H2RoQTrrXivdUZmw==} dependencies: @@ -2963,6 +4129,15 @@ packages: cross-spawn: 7.0.3 signal-exit: 4.1.0 + /form-data@4.0.0: + resolution: {integrity: sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww==} + engines: {node: '>= 6'} + dependencies: + asynckit: 0.4.0 + combined-stream: 1.0.8 + mime-types: 2.1.35 + dev: false + /fraction.js@4.3.7: resolution: {integrity: sha512-ZsDfxO51wGAXREY55a7la9LScWpwv9RxIrYABrlvOFBlH/ShPnrtsXeuUIfXKKOVicNxQ+o8JTbJvjS4M89yew==} dev: true @@ -3601,6 +4776,18 @@ packages: braces: 3.0.2 picomatch: 2.3.1 + /mime-db@1.52.0: + resolution: {integrity: sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==} + engines: {node: '>= 0.6'} + dev: false + + /mime-types@2.1.35: + resolution: {integrity: sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==} + engines: {node: '>= 0.6'} + dependencies: + mime-db: 1.52.0 + dev: false + /minimatch@3.1.2: resolution: {integrity: sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==} dependencies: @@ -4135,6 +5322,10 @@ packages: react-is: 16.13.1 dev: true + /proxy-from-env@1.1.0: + resolution: {integrity: sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==} + dev: false + /punycode@2.3.1: resolution: {integrity: sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==} engines: {node: '>=6'} @@ -4533,6 +5724,10 @@ packages: engines: {node: '>=8'} dev: true + /strnum@1.0.5: + resolution: {integrity: sha512-J8bbNyKKXl5qYcR36TIO8W3mVGVHrmmxsd5PAItGkmyzwJvybiw2IVq5nqd0i4LSNSkB/sx9VHllbfFdr9k1JA==} + dev: false + /styled-jsx@5.1.1(react@18.2.0): resolution: {integrity: sha512-pW7uC1l4mBZ8ugbiZrcIsiIvVx1UmTfw7UkC3Um2tmfUq9Bhk8IiyEIPl6F8agHgjzku6j0xQEZbfA5uSgSaCw==} engines: {node: '>= 12.0.0'} @@ -4730,6 +5925,10 @@ packages: strip-bom: 3.0.0 dev: true + /tslib@1.14.1: + resolution: {integrity: sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==} + dev: false + /tslib@2.6.2: resolution: {integrity: sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q==} dev: false diff --git a/src/env.js b/src/env.js index 0f28bcd..bedc3e9 100644 --- a/src/env.js +++ b/src/env.js @@ -32,6 +32,10 @@ export const env = createEnv({ GOOGLE_CLIENT_SECRET: z.string(), TELEGRAM_BOT_TOKEN: z.string(), MY_TELEGRAM_CHAT_ID: z.string(), + S3_ACCESS_KEY: z.string(), + S3_SECRET_ACCESS_KEY: z.string(), + AWS_REGION: z.string(), + BUCKET_NAME: z.string(), }, /** @@ -56,6 +60,10 @@ export const env = createEnv({ GOOGLE_CLIENT_SECRET: process.env.GOOGLE_CLIENT_SECRET, TELEGRAM_BOT_TOKEN: process.env.TELEGRAM_BOT_TOKEN, MY_TELEGRAM_CHAT_ID: process.env.MY_TELEGRAM_CHAT_ID, + S3_ACCESS_KEY: process.env.S3_ACCESS_KEY, + S3_SECRET_ACCESS_KEY: process.env.S3_SECRET_ACCESS_KEY, + AWS_REGION: process.env.AWS_REGION, + BUCKET_NAME: process.env.BUCKET_NAME, }, /** * Run `build` or `dev` with `SKIP_ENV_VALIDATION` to skip env validation. This is especially diff --git a/src/server/api/routers/post.ts b/src/server/api/routers/post.ts index e29beb9..cd907af 100644 --- a/src/server/api/routers/post.ts +++ b/src/server/api/routers/post.ts @@ -1,10 +1,12 @@ import { z } from "zod"; - +import { env } from "@/env"; import { createTRPCRouter, protectedProcedure, publicProcedure, } from "@/server/api/trpc"; +import { getSignedUrl } from "@aws-sdk/s3-request-presigner"; +import { PutObjectCommand, UploadPartCommand } from "@aws-sdk/client-s3"; // TODO: explore this code export const postRouter = createTRPCRouter({ @@ -30,6 +32,19 @@ export const postRouter = createTRPCRouter({ greeting: `Hello ${input.text}`, }; }), + getStandardUploadPreassignedUrl: publicProcedure + .input(z.object({ key: z.string() })) + .mutation(async ({ ctx, input }) => { + const { key } = input; + const { s3 } = ctx; + + const putObjectCommand = new PutObjectCommand({ + Bucket: env.BUCKET_NAME, + Key: key, + }); + + return await getSignedUrl(s3, putObjectCommand); + }), // create: protectedProcedure // .input(z.object({ name: z.string().min(1) })) diff --git a/src/server/api/s3.ts b/src/server/api/s3.ts new file mode 100644 index 0000000..c214504 --- /dev/null +++ b/src/server/api/s3.ts @@ -0,0 +1,10 @@ +import { S3 } from "@aws-sdk/client-s3"; +import { env } from "@/env"; + +export const s3 = new S3({ + region: env.AWS_REGION, + credentials: { + accessKeyId: env.S3_ACCESS_KEY, + secretAccessKey: env.S3_SECRET_ACCESS_KEY, + }, +}); diff --git a/src/server/api/trpc.ts b/src/server/api/trpc.ts index 5fa80b6..b9482cf 100644 --- a/src/server/api/trpc.ts +++ b/src/server/api/trpc.ts @@ -13,6 +13,7 @@ import { ZodError } from "zod"; import { getServerAuthSession } from "@/server/auth"; import { db } from "@/server/db"; +import { s3 } from "@/server/api/s3"; /** * 1. CONTEXT @@ -30,6 +31,7 @@ export const createTRPCContext = async (opts: { headers: Headers }) => { const session = await getServerAuthSession(); return { + s3, db, session, ...opts, From 20b375f1acf78a7791bafed851e547fcdd1ff3bf Mon Sep 17 00:00:00 2001 From: kujo205 Date: Sat, 17 Feb 2024 16:18:48 +0200 Subject: [PATCH 10/45] feat: added markdown editor and image upload --- package.json | 2 + pnpm-lock.yaml | 22 +++++++ src/app/posts/create/page.tsx | 19 ++++++ src/components/mdEditor/index.tsx | 104 ++++++++++++++++++++++++++++++ src/server/api/routers/post.ts | 15 +++-- 5 files changed, 157 insertions(+), 5 deletions(-) create mode 100644 src/app/posts/create/page.tsx create mode 100644 src/components/mdEditor/index.tsx diff --git a/package.json b/package.json index c019a6e..f189022 100644 --- a/package.json +++ b/package.json @@ -41,6 +41,7 @@ "next-auth": "^4.24.5", "react": "18.2.0", "react-dom": "18.2.0", + "react-highlight": "^0.15.0", "react-hook-form": "^7.49.3", "server-only": "^0.0.1", "superjson": "^2.2.1", @@ -55,6 +56,7 @@ "@types/node": "^18.17.0", "@types/react": "^18.2.37", "@types/react-dom": "^18.2.15", + "@types/react-highlight": "^0.12.8", "@typescript-eslint/eslint-plugin": "^6.11.0", "@typescript-eslint/parser": "^6.11.0", "autoprefixer": "^10.4.14", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 1a0b653..7069032 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -89,6 +89,9 @@ dependencies: react-dom: specifier: 18.2.0 version: 18.2.0(react@18.2.0) + react-highlight: + specifier: ^0.15.0 + version: 0.15.0 react-hook-form: specifier: ^7.49.3 version: 7.49.3(react@18.2.0) @@ -127,6 +130,9 @@ devDependencies: '@types/react-dom': specifier: ^18.2.15 version: 18.2.18 + '@types/react-highlight': + specifier: ^0.12.8 + version: 0.12.8 '@typescript-eslint/eslint-plugin': specifier: ^6.11.0 version: 6.19.0(@typescript-eslint/parser@6.19.0)(eslint@8.56.0)(typescript@5.3.3) @@ -2674,6 +2680,12 @@ packages: dependencies: '@types/react': 18.2.48 + /@types/react-highlight@0.12.8: + resolution: {integrity: sha512-V7O7zwXUw8WSPd//YUO8sz489J/EeobJljASGhP0rClrvq+1Y1qWEpToGu+Pp7YuChxhAXSgkLkrOYpZX5A62g==} + dependencies: + '@types/react': 18.2.48 + dev: true + /@types/react@18.2.48: resolution: {integrity: sha512-qboRCl6Ie70DQQG9hhNREz81jqC1cs9EVNcjQ1AU+jH6NFfSAhVVbrrY/+nSF+Bsk4AOwm9Qa61InvMCyV+H3w==} dependencies: @@ -4351,6 +4363,10 @@ packages: resolution: {integrity: sha512-2bsegYkkHO+h/9MGbn6KWcE45cHZgPANo5LXF7EvWdT0yT2EguSVO1nDgU5c8+ZOPwp2vMNa7YFsJhVcDR9Sdg==} dev: true + /highlight.js@10.7.3: + resolution: {integrity: sha512-tzcUFauisWKNHaRkN4Wjl/ZA07gENAjFl3J/c480dprkGTg5EQstgaNFqBfUqCq54kZRIEcreTsAgF/m2quD7A==} + dev: false + /iconv-lite@0.6.3: resolution: {integrity: sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==} engines: {node: '>=0.10.0'} @@ -5344,6 +5360,12 @@ packages: scheduler: 0.23.0 dev: false + /react-highlight@0.15.0: + resolution: {integrity: sha512-5uV/b/N4Z421GSVVe05fz+OfTsJtFzx/fJBdafZyw4LS70XjIZwgEx3Lrkfc01W/RzZ2Dtfb0DApoaJFAIKBtA==} + dependencies: + highlight.js: 10.7.3 + dev: false + /react-hook-form@7.49.3(react@18.2.0): resolution: {integrity: sha512-foD6r3juidAT1cOZzpmD/gOKt7fRsDhXXZ0y28+Al1CHgX+AY1qIN9VSIIItXRq1dN68QrRwl1ORFlwjBaAqeQ==} engines: {node: '>=18', pnpm: '8'} diff --git a/src/app/posts/create/page.tsx b/src/app/posts/create/page.tsx new file mode 100644 index 0000000..3acf9da --- /dev/null +++ b/src/app/posts/create/page.tsx @@ -0,0 +1,19 @@ +"use client"; +import { useState } from "react"; +import { MdEditor } from "@/components/mdEditor"; + +export default function Page() { + const [editorValue, setEditorValue] = useState("adsadasdasdas"); + + return ( +
+ { + console.log(event.target.value); + }} + > +
+ ); +} diff --git a/src/components/mdEditor/index.tsx b/src/components/mdEditor/index.tsx new file mode 100644 index 0000000..f1c30a2 --- /dev/null +++ b/src/components/mdEditor/index.tsx @@ -0,0 +1,104 @@ +"use client"; +import { type TextareaProps } from "@/components/ui/textarea"; +import { useState, useRef, type Dispatch, type SetStateAction } from "react"; +import { api } from "@/trpc/react"; +import axios from "axios"; + +interface MdEditorProps extends Omit { + onChange: NonNullable; + value: string; + setEditorValue: Dispatch>; +} + +function MdEditor({ + onChange, + value, + setEditorValue, + ...other +}: MdEditorProps) { + const [lineCount, setLineCount] = useState(getLineCount(value)); + const textarea = useRef(null); + const { mutateAsync: getUrl } = + api.post.getStandardUploadPreassignedUrl.useMutation(); + + const handleAddImage: TextareaProps["onPaste"] = async (event) => { + const file = event.clipboardData.files[0]; + if (!file) return; + + const imageName = `${file.name}-${Date.now()}`; + setEditorValue((prev) => prev + ` [${imageName}](Loading...) `); + + const { presignedUrl, accessUrl } = await getUrl({ + imageName: imageName, + }); + + try { + const response = await axios.put(presignedUrl, file.slice(), { + headers: { + "Content-Type": file.type, + }, + }); + console.log("response", response); + } catch (err) { + console.error(err); + } + + setEditorValue((prev) => + prev.replace( + ` [${imageName}](Loading...) `, + ` [${imageName}](${accessUrl}) `, + ), + ); + }; + + return ( +
+ +