├── .gitignore ├── LICENSE ├── README.md ├── app ├── globals.css ├── layout.module.css ├── layout.tsx ├── movie │ └── [id] │ │ ├── movie.module.css │ │ └── page.tsx ├── not-found.module.css ├── not-found.tsx ├── page.module.css ├── page.tsx ├── search │ ├── page.tsx │ └── search.module.css └── tag │ └── [name] │ ├── page.module.css │ └── page.tsx ├── components ├── header.module.css ├── header.tsx ├── modal.module.css ├── modal.tsx ├── movie-card.module.css ├── movie-card.tsx ├── pulse.module.css ├── pulse.tsx ├── search.module.css ├── search.tsx ├── tag.module.css └── tag.tsx ├── config.ts ├── data ├── All_quiet_on_the_western_front_(2022_film).jpg ├── Avatar_The_Way_of_Water_poster.jpg ├── Elvis_2022_poster.jpg ├── The_Banshees_of_Inisherin.jpg ├── Top_Gun_Maverick_Poster.jpg └── movies.data.ts ├── lib ├── dynamo.ts ├── queue.ts └── rank.ts ├── load.ts ├── next.config.js ├── package-lock.json ├── package.json ├── pnpm-lock.yaml ├── public ├── apple-touch-icon.png ├── favicon.ico ├── icon.png └── opengraph-image.png ├── screenshot.png ├── sst-env.d.ts ├── sst.config.ts └── tsconfig.json /.gitignore: -------------------------------------------------------------------------------- 1 | # See https://help.github.com/articles/ignoring-files/ for more about ignoring files. 2 | 3 | # dependencies 4 | /node_modules 5 | /.pnp 6 | .pnp.js 7 | .yarn/install-state.gz 8 | 9 | # testing 10 | /coverage 11 | 12 | # next.js 13 | /.next/ 14 | /out/ 15 | 16 | # production 17 | /build 18 | 19 | # misc 20 | .DS_Store 21 | *.pem 22 | 23 | # debug 24 | npm-debug.log* 25 | yarn-debug.log* 26 | yarn-error.log* 27 | 28 | # local env files 29 | .env*.local 30 | 31 | # vercel 32 | .vercel 33 | 34 | # typescript 35 | *.tsbuildinfo 36 | next-env.d.ts 37 | 38 | /.open-next 39 | /.sst 40 | /.vim 41 | .env 42 | data/imdb 43 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) 2024 SST 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. 22 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # ❍ Movies Demo 2 | 3 | A sample movies app built with [❍ Ion](https://github.com/sst/ion) to demo how to **use AI in your apps using your data** — [movies.sst.dev](https://movies.sst.dev) 4 | 5 | ![Movies App](screenshot.png) 6 | 7 | The movie database in this app contains around 700 popular movies. You can search through them, check out related movies, and some of the movies are also tagged. 8 | 9 | ## About 10 | 11 | Most of the AI demos to date include some form of chat. While this is useful, it doesn't apply to majority of the apps out there. It also involves storing your data outside your infrastructure. 12 | 13 | This demo shows how you can use AI related features in your infrastructure in a way that makes sense to your users. 14 | 15 | ## AI 16 | 17 | The following AI features are powered by our new Vector component. 18 | 19 | 1. **Tags** — Classify data based on text that's more descriptive and carries more context 20 | 2. **Related** — Find semantically similar data in your database 21 | 3. **Search** — Deep search your data and images using natural language 22 | 4. **Search Images** — Do a deep search through your data, including your images 23 | 24 | ### Vector Component 25 | 26 | The Vector component is based on Amazon Bedrock and it exposes a couple of functions that makes it easy to use AI with your data. 27 | 28 | - `ingest`: This takes some text, generates an embedding with a given model, and stores it in a Vector database powered by RDS. Also takes some metadata to tag the data. 29 | - `retrieve`: Takes a prompt and optionally the metadata to filter on. Returns matching results with a score 0 - 1. 30 | 31 | ### Models 32 | 33 | Currently the embeddings can be generated using the `titan-embed-text-v1`, `titan-embed-image-v1`, and `text-embedding-ada-002`. 34 | 35 | ### Ion 36 | 37 | [❍ Ion](https://github.com/sst/ion) is an experimental new engine for [SST](https://sst.dev) that has some unique advantages over our previous CDK based engine. Here are a couple that you can see in action in this repo: 38 | 39 | 1. It's a lot faster to deploy, 10x faster 40 | 2. There are [no stacks](sst.config.ts#L15) or stack limits 41 | 3. No cyclical dependency issues in your resources 42 | 4. Access linked resources in Next.js doesn't need top-level await 43 | 5. Next.js 14 with linked resources are deployed in order and don't need a _double deploy_ 44 | 6. Next.js apps have access to linked resources without the need for [`sst bind next build`](package.json#L7) 45 | 46 | ## How it Works 47 | 48 | This demo works by ingesting movie data from IMDB, generating embeddings, and storing it in a Vector database. The Next.js app then retrieves the data from the Vector database. 49 | 50 | The sample app is made up of **4 simple components** defined in the [`sst.config.ts`](sst.config.ts): 51 | 52 | 1. A DynamoDB table to store the movies 53 | 2. An S3 bucket to store the posters 54 | 3. A Vector database to store the embeddings 55 | 4. A Next.js app 56 | 57 | --- 58 | 59 | Join the SST community over on [Discord](https://discord.gg/sst) and follow us on [Twitter](https://twitter.com/SST_dev). 60 | -------------------------------------------------------------------------------- /app/globals.css: -------------------------------------------------------------------------------- 1 | :root { 2 | --color-accent: 58, 124, 227; 3 | --color-text-rgb: 0, 26, 51; 4 | --color-background-rgb: 232, 234, 236; 5 | --color-background-modal-rgb: 210, 213, 218; 6 | 7 | --opacity-text-secondary: 0.6; 8 | --opacity-text-dimmed: 0.2; 9 | 10 | --shadow-sm: 0 1px 1px rgba(0,0,0,0.05), 11 | 0 2px 2px rgba(0,0,0,0.05), 12 | 0 3px 3px rgba(0,0,0,0.05), 13 | 0 4px 4px rgba(0,0,0,0.05); 14 | --shadow-md: 0 1px 1px rgba(0,0,0,0.11), 15 | 0 2px 2px rgba(0,0,0,0.11), 16 | 0 4px 4px rgba(0,0,0,0.11), 17 | 0 6px 8px rgba(0,0,0,0.11), 18 | 0 8px 16px rgba(0,0,0,0.11); 19 | --shadow-lg: 0 1px 1px rgba(0,0,0,0.11), 20 | 0 2px 2px rgba(0,0,0,0.11), 21 | 0 4px 6px rgba(0,0,0,0.11), 22 | 0 8px 10px rgba(0,0,0,0.11), 23 | 0 16px 18px rgba(0,0,0,0.11); 24 | --shadow-modal: 0 1px 1px rgba(0,0,0,0.06), 25 | 0 2px 2px rgba(0,0,0,0.06), 26 | 0 4px 6px rgba(0,0,0,0.06), 27 | 0 8px 10px rgba(0,0,0,0.06), 28 | 0 16px 18px rgba(0,0,0,0.06); 29 | } 30 | :root { 31 | --app-width: 64rem; 32 | --app-padding: 3rem; 33 | --footer-height: 5rem; 34 | 35 | --line-height: 1.65; 36 | --border-radius: 0.25rem; 37 | --opacity-icon: 0.85; 38 | 39 | --color-text: var(--color-text-rgb), 1; 40 | --color-text-secondary: var(--color-text-rgb), var(--opacity-text-secondary); 41 | --color-text-dimmed: var(--color-text-rgb), var(--opacity-text-dimmed); 42 | 43 | --color-background: var(--color-background-rgb), 1; 44 | --color-background-surface: var(--color-text-rgb), 0.06; 45 | --color-background-modal: var(--color-background-modal-rgb), 0.95; 46 | } 47 | 48 | @media (prefers-color-scheme: dark) { 49 | :root { 50 | --color-accent: 70, 133, 232; 51 | --color-text-rgb: 244, 246, 247; 52 | --color-background-rgb: 0, 26, 51; 53 | --color-background-modal-rgb: 55, 68, 88; 54 | 55 | --opacity-text-secondary: 0.65; 56 | --opacity-text-dimmed: 0.2; 57 | 58 | --shadow-sm: 0 1px 1px rgba(0,0,0,0.3), 59 | 0 2px 2px rgba(0,0,0,0.3), 60 | 0 3px 3px rgba(0,0,0,0.3), 61 | 0 4px 4px rgba(0,0,0,0.3); 62 | --shadow-md: 0 1px 1px rgba(0,0,0,0.3), 63 | 0 2px 2px rgba(0,0,0,0.3), 64 | 0 4px 4px rgba(0,0,0,0.3), 65 | 0 6px 8px rgba(0,0,0,0.3), 66 | 0 8px 16px rgba(0,0,0,0.3); 67 | --shadow-lg: 0 1px 1px rgba(0,0,0,0.4), 68 | 0 2px 2px rgba(0,0,0,0.4), 69 | 0 4px 6px rgba(0,0,0,0.4), 70 | 0 8px 10px rgba(0,0,0,0.4), 71 | 0 16px 18px rgba(0,0,0,0.4); 72 | --shadow-modal: 0 1px 1px rgba(0,0,0,0.1), 73 | 0 2px 2px rgba(0,0,0,0.1), 74 | 0 4px 6px rgba(0,0,0,0.1), 75 | 0 8px 10px rgba(0,0,0,0.1), 76 | 0 16px 18px rgba(0,0,0,0.1); 77 | } 78 | } 79 | 80 | * { 81 | box-sizing: border-box; 82 | padding: 0; 83 | margin: 0; 84 | } 85 | 86 | @media (prefers-color-scheme: dark) { 87 | html { 88 | color-scheme: dark; 89 | } 90 | } 91 | 92 | html, 93 | body { 94 | } 95 | 96 | body { 97 | color: rgb(var(--color-text)); 98 | background: rgb(var(--color-background)); 99 | } 100 | 101 | h1 { 102 | font-size: 2rem; 103 | } 104 | h1, h2, h3 { 105 | font-weight: 600; 106 | letter-spacing: 0.5px; 107 | } 108 | 109 | a { 110 | color: inherit; 111 | text-decoration: none; 112 | } 113 | 114 | button, 115 | input { 116 | font-family: inherit; 117 | } 118 | 119 | @media (max-width: 30rem) { 120 | :root { 121 | --app-padding: 1.5rem; 122 | } 123 | h1 { 124 | font-size: 1.5rem; 125 | } 126 | h2 { 127 | font-size: 1.125rem; 128 | } 129 | } 130 | -------------------------------------------------------------------------------- /app/layout.module.css: -------------------------------------------------------------------------------- 1 | .body { 2 | display: flex; 3 | flex-direction: column; 4 | min-height: 100vh; 5 | gap: var(--app-padding); 6 | padding: 0 var(--app-padding); 7 | } 8 | .content { 9 | flex: 1; 10 | width: 100%; 11 | margin: 0 auto; 12 | max-width: var(--app-width); 13 | } 14 | .footer { 15 | border-top: 1px solid rgba(var(--color-background-surface)); 16 | width: 100%; 17 | height: var(--footer-height); 18 | margin: 0 auto; 19 | max-width: var(--app-width); 20 | display: flex; 21 | align-items: center; 22 | justify-content: space-between; 23 | font-size: 0.875rem; 24 | color: rgba(var(--color-text-secondary)); 25 | } 26 | -------------------------------------------------------------------------------- /app/layout.tsx: -------------------------------------------------------------------------------- 1 | import config from "@/config"; 2 | import type { Metadata } from "next"; 3 | import styles from "./layout.module.css"; 4 | import { Raleway } from "next/font/google"; 5 | import "./globals.css"; 6 | 7 | const font = Raleway({ subsets: ["latin"] }); 8 | 9 | export const metadata: Metadata = { 10 | metadataBase: new URL("https://d2yfvixyyw0ix7.cloudfront.net"), 11 | title: { 12 | template: "%s | ❍ Movies", 13 | default: "❍ Movies", 14 | }, 15 | openGraph: { 16 | images: ["/opengraph-image.png"], 17 | }, 18 | description: "An AI demo built with SST ❍ Ion", 19 | }; 20 | 21 | export default function RootLayout({ 22 | children, 23 | }: { 24 | children: React.ReactNode; 25 | }) { 26 | return ( 27 | 28 | 29 |
{children}
30 | 38 | 39 | 40 | ); 41 | } 42 | -------------------------------------------------------------------------------- /app/movie/[id]/movie.module.css: -------------------------------------------------------------------------------- 1 | .section { 2 | display: flex; 3 | gap: 1.5rem; 4 | align-items: center; 5 | } 6 | @media (max-width: 30rem) { 7 | .section { 8 | flex-direction: column; 9 | gap: 1.5rem; 10 | } 11 | } 12 | 13 | .hero { 14 | flex: 0 0 auto; 15 | width: 250px; 16 | height: 375px; 17 | overflow: hidden; 18 | box-shadow: var(--shadow-lg); 19 | border-radius: var(--border-radius); 20 | } 21 | .heroImage { 22 | width: 100%; 23 | height: 100%; 24 | object-fit: cover; 25 | } 26 | 27 | .info { 28 | display: flex; 29 | gap: 1.125rem; 30 | flex-direction: column; 31 | } 32 | @media (max-width: 30rem) { 33 | .info { 34 | gap: 0.5rem; 35 | } 36 | } 37 | .headline { 38 | display: flex; 39 | gap: 0.375rem; 40 | flex-direction: column; 41 | } 42 | .year { 43 | font-size: 1.125rem; 44 | font-weight: 600; 45 | color: rgba(var(--color-text-secondary)); 46 | } 47 | .title { 48 | font-weight: 600; 49 | } 50 | .about { 51 | color: rgba(var(--color-text-secondary)); 52 | line-height: var(--line-height); 53 | } 54 | .tags { 55 | display: flex; 56 | gap: 0.75rem; 57 | position: relative; 58 | } 59 | .pulseTags { 60 | position: absolute; 61 | left: 0; 62 | top: 0.5rem; 63 | transform: translateY(-50%) translateX(-50%); 64 | } 65 | 66 | .relatedTitle { 67 | margin-top: 3rem; 68 | margin-bottom: 1rem; 69 | position: relative; 70 | } 71 | @media (max-width: 30rem) { 72 | .relatedTitle { 73 | margin-top: 1.5rem; 74 | margin-bottom: 0.75rem; 75 | } 76 | } 77 | .pulseRelated { 78 | position: absolute; 79 | left: 0; 80 | top: -0.125rem; 81 | transform: translateY(-50%) translateX(-50%); 82 | } 83 | .relatedTitle > h3 { 84 | font-size: 1.5rem; 85 | font-weight: 600; 86 | } 87 | @media (max-width: 30rem) { 88 | .relatedTitle > h3 { 89 | font-size: 1.25rem; 90 | } 91 | } 92 | 93 | .related { 94 | padding: 0; 95 | list-style: none; 96 | gap: calc(var(--app-padding) - 0.5rem); 97 | display: grid; 98 | grid-template-columns: repeat(auto-fill, minmax(150px, 1fr)); 99 | } 100 | 101 | .card { 102 | width: 100%; 103 | overflow: hidden; 104 | box-shadow: var(--shadow-md); 105 | border-radius: var(--border-radius); 106 | transition: transform 0.25s ease-in-out, box-shadow 0.25s ease-in-out; 107 | } 108 | .card:hover { 109 | transform: translateY(-4px); 110 | box-shadow: var(--shadow-lg); 111 | } 112 | .cardImage { 113 | width: 100%; 114 | height: 100%; 115 | object-fit: cover; 116 | } 117 | -------------------------------------------------------------------------------- /app/movie/[id]/page.tsx: -------------------------------------------------------------------------------- 1 | import config from "@/config"; 2 | import { VectorClient } from "sst"; 3 | import Tag from "@/components/tag"; 4 | import Pulse from "@/components/pulse"; 5 | import styles from "./movie.module.css"; 6 | import Header from "@/components/header"; 7 | import MovieCard from "@/components/movie-card"; 8 | import { getById, batchGet } from "@/lib/dynamo"; 9 | import { rankMovies } from "@/lib/rank"; 10 | 11 | const vector = VectorClient("Vector"); 12 | 13 | export async function generateMetadata({ params }: { params: { id: string } }) { 14 | const item = await getById(params.id); 15 | return { 16 | title: item.data.title, 17 | }; 18 | } 19 | 20 | export const dynamic = "force-static"; 21 | export const revalidate = 60; 22 | 23 | export default async function Page({ params }: { params: { id: string } }) { 24 | const item = await getById(params.id); 25 | const data = item.data; 26 | 27 | const ret = await vector.retrieve({ 28 | text: `# Title ${data.title} # Plot ${data.synopsis 29 | .join("\n") 30 | .substring(0, 32_000)}`, 31 | include: { type: "movie" }, 32 | exclude: { id: params.id }, 33 | count: 50, 34 | }); 35 | const resultIds = rankMovies( 36 | ret.results.filter((r: any) => r.metadata.id !== params.id) 37 | ).slice(0, 5); 38 | const results = await batchGet(resultIds); 39 | 40 | return ( 41 | <> 42 |
43 |
44 |
45 | {data.title} 50 |
51 |
52 |
53 |
{data.year}
54 |

{data.title}

55 |
56 |

{data.about}

57 | {data.tags.length > 0 && ( 58 |
59 | {data.tags.map((tag: string) => ( 60 | 61 | ))} 62 | 63 | Classify your data based on text that's more descriptive and 64 | carries more context.{" "} 65 | 69 | View source 70 | 71 | . 72 | 73 |
74 | )} 75 |
76 |
77 | {resultIds.length > 0 && ( 78 | <> 79 |
80 |

Related

81 | 82 | Find semantically similar data in your database.{" "} 83 | 87 | View source 88 | 89 | . 90 | 91 |
92 | 106 | 107 | )} 108 | 109 | ); 110 | } 111 | -------------------------------------------------------------------------------- /app/not-found.module.css: -------------------------------------------------------------------------------- 1 | .section { 2 | display: flex; 3 | flex-direction: column; 4 | gap: 1.5rem; 5 | align-items: flex-start; 6 | justify-content: center; 7 | height: calc(100vh - var(--footer-height) - var(--app-padding)); 8 | } 9 | .link { 10 | text-decoration: underline; 11 | text-underline-offset: 0.25rem; 12 | } 13 | -------------------------------------------------------------------------------- /app/not-found.tsx: -------------------------------------------------------------------------------- 1 | import Link from "next/link"; 2 | import styles from "./not-found.module.css"; 3 | 4 | export default function NotFound() { 5 | return ( 6 |
7 |

Not Found

8 |

9 | We couldn't find the page you were looking for,{" "} 10 | 11 | go back home 12 | 13 | . 14 |

15 |
16 | ); 17 | } 18 | -------------------------------------------------------------------------------- /app/page.module.css: -------------------------------------------------------------------------------- 1 | .grid { 2 | padding: 0; 3 | list-style: none; 4 | display: grid; 5 | gap: calc(var(--app-padding) - 0.5rem); 6 | grid-template-columns: repeat(auto-fill, minmax(150px, 1fr)); 7 | } 8 | -------------------------------------------------------------------------------- /app/page.tsx: -------------------------------------------------------------------------------- 1 | import { get } from "@/lib/dynamo"; 2 | import styles from "./page.module.css"; 3 | import Header from "@/components/header"; 4 | import MovieCard from "@/components/movie-card"; 5 | 6 | export default async function Home() { 7 | const data = await get(); 8 | 9 | return ( 10 | <> 11 |
12 | 26 | 27 | ); 28 | } 29 | -------------------------------------------------------------------------------- /app/search/page.tsx: -------------------------------------------------------------------------------- 1 | import config from "@/config"; 2 | import { Suspense } from "react"; 3 | import { VectorClient } from "sst"; 4 | import type { Metadata } from "next"; 5 | import Pulse from "@/components/pulse"; 6 | import { batchGet } from "@/lib/dynamo"; 7 | import Header from "@/components/header"; 8 | import Search from "@/components/search"; 9 | import styles from "./search.module.css"; 10 | import MovieCard from "@/components/movie-card"; 11 | import { MagnifyingGlassIcon } from "@heroicons/react/24/solid"; 12 | import { rankMovies } from "@/lib/rank"; 13 | 14 | const vector = VectorClient("Vector"); 15 | 16 | export const metadata: Metadata = { 17 | title: "Search", 18 | }; 19 | 20 | export default async function Page({ 21 | searchParams, 22 | }: { 23 | searchParams?: { 24 | query?: string; 25 | }; 26 | }) { 27 | const query = searchParams?.query || ""; 28 | 29 | return ( 30 | <> 31 |
32 |
33 | 34 |
35 | {query === "" && ( 36 |
37 |

Sample Searches

38 | 74 |
75 | )} 76 | {query && ( 77 | Loading...} 80 | > 81 | 82 | 83 | )} 84 | 85 | ); 86 | } 87 | 88 | async function Results({ query }: { query: string }) { 89 | const ret = await vector.retrieve({ 90 | text: query, 91 | include: { type: "movie" }, 92 | count: 25, 93 | }); 94 | const resultIds = rankMovies(ret.results); 95 | const results = await batchGet(resultIds); 96 | 97 | return results.length === 0 ? ( 98 |
No results. Needs more GPU.
99 | ) : ( 100 |
    101 | {resultIds.slice(0, 5).map((item) => { 102 | const movie = results.find((m) => m.id === item)!; 103 | const data = movie.data; 104 | return ( 105 | 111 | ); 112 | })} 113 |
114 | ); 115 | } 116 | -------------------------------------------------------------------------------- /app/search/search.module.css: -------------------------------------------------------------------------------- 1 | .samples { 2 | margin-top: 2rem; 3 | padding: 1rem; 4 | display: flex; 5 | gap: 1.25rem; 6 | flex-direction: column; 7 | border-radius: var(--border-radius); 8 | background: rgba(var(--color-background-surface)); 9 | } 10 | @media (max-width: 30rem) { 11 | .samples { 12 | margin-top: 1rem; 13 | padding: 0.75rem; 14 | } 15 | } 16 | .samplesTitle { 17 | font-size: 0.75rem; 18 | font-weight: 700; 19 | text-transform: uppercase; 20 | color: rgba(var(--color-text-dimmed)); 21 | letter-spacing: 1px; 22 | } 23 | .samplesList { 24 | list-style: none; 25 | padding: 0; 26 | } 27 | .samplesItem { 28 | border-bottom: 1px solid rgba(var(--color-background-surface)); 29 | font-size: 0.875rem; 30 | color: rgba(var(--color-text-secondary)); 31 | position: relative; 32 | } 33 | .samplesItem > a { 34 | display: block; 35 | padding-block: 0.875rem; 36 | display: flex; 37 | align-items: center; 38 | gap: 0.5rem; 39 | } 40 | .samplesItem > a > svg { 41 | width: 0.875rem; 42 | height: 0.875rem; 43 | opacity: var(--opacity-icon); 44 | } 45 | .samplesItem:first-child > a { 46 | padding-block-start: 0; 47 | } 48 | .samplesItem:last-child { 49 | border-bottom: none; 50 | } 51 | .samplesItem:last-child > a { 52 | padding-block-end: 0; 53 | } 54 | .pulseSearch { 55 | position: absolute; 56 | left: -1.5rem; 57 | top: 0.5rem; 58 | transform: translateY(-50%); 59 | } 60 | 61 | .empty { 62 | margin-top: 2rem; 63 | font-size: 1.5rem; 64 | color: rgba(var(--color-text-secondary)); 65 | } 66 | 67 | .grid { 68 | margin-top: 2rem; 69 | padding: 0; 70 | list-style: none; 71 | gap: calc(var(--app-padding) - 0.5rem); 72 | display: grid; 73 | grid-template-columns: repeat(auto-fill, minmax(150px, 1fr)); 74 | } 75 | @media (max-width: 30rem) { 76 | .grid { 77 | margin-top: 1rem; 78 | } 79 | } 80 | -------------------------------------------------------------------------------- /app/tag/[name]/page.module.css: -------------------------------------------------------------------------------- 1 | .grid { 2 | padding: 0; 3 | list-style: none; 4 | gap: calc(var(--app-padding) - 0.5rem); 5 | display: grid; 6 | grid-template-columns: repeat(auto-fill, minmax(150px, 1fr)); 7 | } 8 | 9 | -------------------------------------------------------------------------------- /app/tag/[name]/page.tsx: -------------------------------------------------------------------------------- 1 | import { get } from "@/lib/dynamo"; 2 | import styles from "./page.module.css"; 3 | import Header from "@/components/header"; 4 | import MovieCard from "@/components/movie-card"; 5 | 6 | export async function generateMetadata({ 7 | params, 8 | }: { 9 | params: { name: string }; 10 | }) { 11 | return { 12 | title: `Tag: ${params.name}`, 13 | }; 14 | } 15 | 16 | export default async function Page({ params }: { params: { name: string } }) { 17 | const data = await get(); 18 | 19 | return ( 20 | <> 21 |
22 |
    23 | {data && 24 | data 25 | .filter((movie) => movie.data.tags.includes(params.name)) 26 | .map((movie) => ( 27 | 33 | ))} 34 |
35 | 36 | ); 37 | } 38 | -------------------------------------------------------------------------------- /components/header.module.css: -------------------------------------------------------------------------------- 1 | .header { 2 | --search-width: 200px; 3 | --breadcrumb-font-size: 1.25rem; 4 | 5 | margin-top: var(--app-padding); 6 | margin-bottom: 2rem; 7 | height: 3rem; 8 | display: flex; 9 | align-items: center; 10 | gap: 3rem; 11 | justify-content: space-between; 12 | } 13 | @media (max-width: 30rem) { 14 | .header { 15 | --breadcrumb-font-size: 1.125rem; 16 | 17 | margin-bottom: 1.5rem; 18 | align-items: flex-start; 19 | flex-direction: column; 20 | gap: 0.75rem; 21 | height: auto; 22 | } 23 | } 24 | 25 | .leftCol { 26 | display: flex; 27 | align-items: baseline; 28 | gap: 0.5rem; 29 | } 30 | @media (max-width: 30rem) { 31 | .leftCol { 32 | gap: 0.25rem; 33 | flex-direction: column; 34 | } 35 | } 36 | .breadcrumb { 37 | display: flex; 38 | gap: 0.5rem; 39 | align-items: baseline; 40 | } 41 | .breadcrumbSeparator { 42 | color: rgba(var(--color-text-dimmed)); 43 | font-size: var(--breadcrumb-font-size); 44 | font-weight: 500; 45 | } 46 | .breadcrumb { 47 | color: rgba(var(--color-text-secondary)); 48 | font-size: var(--breadcrumb-font-size); 49 | font-weight: 600; 50 | } 51 | 52 | .rightCol { 53 | display: flex; 54 | align-items: center; 55 | gap: 1.5rem; 56 | } 57 | @media (max-width: 30rem) { 58 | .rightCol { 59 | gap: 0; 60 | flex-direction: column; 61 | align-items: stretch; 62 | width: 100%; 63 | } 64 | } 65 | .pulseTags { 66 | position: absolute; 67 | left: 0; 68 | top: 0.5rem; 69 | transform: translateY(-50%) translateX(-50%); 70 | } 71 | .tags { 72 | position: relative; 73 | display: flex; 74 | gap: 0.75rem; 75 | } 76 | @media (max-width: 30rem) { 77 | .tags { 78 | overflow-x: auto; 79 | overflow-y: hidden; 80 | padding-bottom: 0.5rem; 81 | } 82 | .pulseTags { 83 | left: 1rem; 84 | top: 0.75rem; 85 | } 86 | } 87 | 88 | .search { 89 | position: relative; 90 | } 91 | .search > a { 92 | border: 1px solid rgba(var(--color-text-dimmed)); 93 | border-radius: var(--border-radius); 94 | width: var(--search-width); 95 | height: 40px; 96 | background: transparent; 97 | padding-left: 0.625rem; 98 | display: flex; 99 | align-items: center; 100 | gap: 0.5rem; 101 | font-size: 0.875rem; 102 | font-weight: 500; 103 | color: rgba(var(--color-text-dimmed)); 104 | } 105 | @media (max-width: 30rem) { 106 | .search > a { 107 | width: 100%; 108 | } 109 | } 110 | .pulseSearch { 111 | position: absolute; 112 | right: -1.5rem; 113 | top: 0.5rem; 114 | transform: translateY(-50%) translateX(-50%); 115 | } 116 | 117 | .search > a > svg { 118 | width: 1rem; 119 | height: 1rem; 120 | opacity: var(--opacity-icon); 121 | } 122 | -------------------------------------------------------------------------------- /components/header.tsx: -------------------------------------------------------------------------------- 1 | import Tag from "./tag"; 2 | import Pulse from "./pulse"; 3 | import Link from "next/link"; 4 | import config from "@/config"; 5 | import data from "@/data/movies.data"; 6 | import styles from "./header.module.css"; 7 | import { MagnifyingGlassIcon } from "@heroicons/react/24/solid"; 8 | 9 | interface HeaderProps { 10 | controls?: boolean; 11 | breadcrumb?: string; 12 | } 13 | 14 | export default function Header({ controls, breadcrumb }: HeaderProps) { 15 | return ( 16 |
17 |
18 |

19 | ❍ Movies 20 |

21 | {breadcrumb && ( 22 |
23 | / 24 |

{breadcrumb}

25 |
26 | )} 27 |
28 | {controls && ( 29 |
30 |
31 | {data.tags.map((tag) => ( 32 | 33 | ))} 34 | 35 | Classify your data based on text that's more descriptive and 36 | carries more context.{" "} 37 | 41 | View source 42 | 43 | . 44 | 45 |
46 |
47 | 48 | 49 | Search for a movie... 50 | 51 | 52 | Deep search your data using natural language.{" "} 53 | 57 | View source 58 | 59 | . 60 | 61 |
62 |
63 | )} 64 |
65 | ); 66 | } 67 | -------------------------------------------------------------------------------- /components/modal.module.css: -------------------------------------------------------------------------------- 1 | @keyframes entrance { 2 | 0% { 3 | opacity: 0; 4 | transform: scale(0.8); 5 | } 6 | 50% { 7 | opacity: 1; 8 | transform: scale(1.02); 9 | } 10 | 100% { 11 | opacity: 1; 12 | transform: scale(1); 13 | } 14 | } 15 | 16 | @keyframes entranceBackdrop { 17 | 0% { 18 | opacity: 0; 19 | } 20 | 21 | 100% { 22 | opacity: 1; 23 | } 24 | } 25 | 26 | .dialog::backdrop { 27 | backdrop-filter: blur(3px); 28 | background: rgba(0, 0, 0, 0.2); 29 | animation: entranceBackdrop 250ms ease-in-out; 30 | } 31 | 32 | .dialog { 33 | position: fixed; 34 | top: 0; 35 | left: 0; 36 | right: 0; 37 | bottom: 0; 38 | margin: auto; 39 | 40 | border-radius: 0.625rem; 41 | border: none; 42 | text-align: left; 43 | padding: 1rem; 44 | animation: entrance 250ms ease-in-out; 45 | animation-fill-mode: forwards; 46 | box-shadow: var(--shadow-modal); 47 | background: rgba(var(--color-background-modal)); 48 | backdrop-filter: blur(8px); 49 | width: 34rem; 50 | } 51 | 52 | @media (max-width: 30rem) { 53 | .dialog { 54 | width: calc(100% - 3rem); 55 | } 56 | } 57 | 58 | 59 | .content { 60 | display: flex; 61 | flex-direction: column; 62 | gap: 0.75rem; 63 | } 64 | 65 | .title { 66 | display: flex; 67 | align-items: center; 68 | gap: 1rem; 69 | justify-content: space-between; 70 | border-bottom: 1px solid rgba(var(--color-background-surface)); 71 | padding-bottom: 0.625rem; 72 | } 73 | .title > h6 { 74 | font-size: 0.875rem; 75 | font-weight: 700; 76 | text-transform: uppercase; 77 | color: rgba(var(--color-text-secondary)); 78 | letter-spacing: 0.5px; 79 | line-height: 1; 80 | } 81 | .close { 82 | border: none; 83 | background: none; 84 | cursor: pointer; 85 | color: rgba(var(--color-text-secondary)); 86 | outline: none; 87 | padding: 0; 88 | } 89 | .close > svg { 90 | width: 1.25rem; 91 | height: 1.25rem; 92 | } 93 | 94 | .copy{ 95 | line-height: var(--line-height); 96 | font-size: 1rem; 97 | } 98 | 99 | .copy > a { 100 | text-decoration: underline; 101 | text-underline-offset: 0.25rem; 102 | } 103 | -------------------------------------------------------------------------------- /components/modal.tsx: -------------------------------------------------------------------------------- 1 | "use client"; 2 | 3 | import styles from "./modal.module.css"; 4 | import { XMarkIcon } from "@heroicons/react/24/outline"; 5 | import { 6 | useRef, 7 | forwardRef, 8 | ReactNode, 9 | MutableRefObject, 10 | ComponentPropsWithRef, 11 | } from "react"; 12 | 13 | type ModalProps = ComponentPropsWithRef<"dialog"> & { 14 | title?: string; 15 | children: ReactNode; 16 | }; 17 | 18 | const Modal = forwardRef( 19 | ({ children, ...resProps }, ref) => { 20 | const dialogRef = ref as MutableRefObject; 21 | return ( 22 | 23 |
24 |
25 |
{resProps.title}
26 | 32 |
33 |
{children}
34 |
35 |
36 | ); 37 | } 38 | ); 39 | 40 | export default Modal; 41 | 42 | export function useModal() { 43 | const ref = useRef(null); 44 | const onOpen = () => ref.current?.showModal(); 45 | 46 | return { ref, onOpen }; 47 | } 48 | -------------------------------------------------------------------------------- /components/movie-card.module.css: -------------------------------------------------------------------------------- 1 | .card { 2 | width: 100%; 3 | overflow: hidden; 4 | box-shadow: var(--shadow-md); 5 | border-radius: var(--border-radius); 6 | transition: transform 0.25s ease-in-out, box-shadow 0.25s ease-in-out; 7 | } 8 | .card:hover { 9 | transform: translateY(-4px); 10 | box-shadow: var(--shadow-lg); 11 | } 12 | .cardImage { 13 | width: 100%; 14 | height: 100%; 15 | object-fit: cover; 16 | } 17 | 18 | -------------------------------------------------------------------------------- /components/movie-card.tsx: -------------------------------------------------------------------------------- 1 | import Link from "next/link"; 2 | import Image from "next/image"; 3 | import styles from "./movie-card.module.css"; 4 | 5 | interface MovieCardProps { 6 | id: string; 7 | title: string; 8 | poster: string; 9 | hint?: string; 10 | } 11 | export default function MovieCard(props: MovieCardProps) { 12 | return ( 13 | 19 | {props.title} 27 | 28 | ); 29 | } 30 | -------------------------------------------------------------------------------- /components/pulse.module.css: -------------------------------------------------------------------------------- 1 | .pulse { 2 | --size: 0.75rem; 3 | 4 | z-index: 1; 5 | cursor: pointer; 6 | position: absolute; 7 | width: calc(3 * var(--size)); 8 | height: calc(3 * var(--size)); 9 | } 10 | .circle { 11 | position: absolute; 12 | left: var(--size); 13 | top: var(--size); 14 | width: var(--size); 15 | height: var(--size); 16 | } 17 | .circle:before { 18 | content: ''; 19 | position: relative; 20 | display: block; 21 | width: 300%; 22 | height: 300%; 23 | box-sizing: border-box; 24 | margin-left: -100%; 25 | margin-top: -100%; 26 | border-radius: 45px; 27 | background-color: rgb(var(--color-accent)); 28 | animation: pulse-ring 1.25s cubic-bezier(0.215, 0.61, 0.355, 1) infinite; 29 | } 30 | 31 | .circle:after { 32 | content: ''; 33 | position: absolute; 34 | left: 0; 35 | top: 0; 36 | display: block; 37 | width: 100%; 38 | height: 100%; 39 | border-radius: 15px; 40 | background-color: rgb(var(--color-accent)); 41 | box-shadow: 0 0 8px rgba(0, 0, 0, 0.2); 42 | animation: pulse-dot 1.25s cubic-bezier(0.455, 0.03, 0.515, 0.955) -0.4s infinite; 43 | } 44 | 45 | @keyframes pulse-ring { 46 | 0% { 47 | transform: scale(.33); 48 | } 49 | 80%, 100% { 50 | opacity: 0; 51 | } 52 | } 53 | 54 | @keyframes pulse-dot { 55 | 0% { 56 | transform: scale(.8); 57 | } 58 | 50% { 59 | transform: scale(1); 60 | } 61 | 100% { 62 | transform: scale(.8); 63 | } 64 | } 65 | -------------------------------------------------------------------------------- /components/pulse.tsx: -------------------------------------------------------------------------------- 1 | "use client"; 2 | 3 | import { ReactNode } from "react"; 4 | import styles from "./pulse.module.css"; 5 | import Modal, { useModal } from "./modal"; 6 | 7 | interface PulseProps { 8 | title?: string; 9 | className?: string; 10 | children: ReactNode; 11 | } 12 | export default function Pulse(props: PulseProps) { 13 | const { ref, onOpen } = useModal(); 14 | return ( 15 | <> 16 |
17 |
18 |
19 | 20 | {props.children} 21 | 22 | 23 | ); 24 | } 25 | -------------------------------------------------------------------------------- /components/search.module.css: -------------------------------------------------------------------------------- 1 | .searchBar { 2 | position: relative; 3 | } 4 | 5 | .searchIcon { 6 | position: absolute; 7 | opacity: var(--opacity-icon); 8 | width: 1.5rem; 9 | height: 1.5rem; 10 | top: 50%; 11 | left: 1rem; 12 | margin-top: -0.75rem; 13 | color: rgba(var(--color-text-dimmed)); 14 | } 15 | 16 | .search { 17 | display: block; 18 | width: 100%; 19 | height: 4rem; 20 | font-size: 1.125rem; 21 | padding: 0 1rem 0 3rem; 22 | background: transparent; 23 | appearance: none; 24 | border: 2px solid rgba(var(--color-text-dimmed)); 25 | border-radius: var(--border-radius); 26 | outline: none; 27 | transition: border-color 0.25s ease-in-out; 28 | } 29 | @media (max-width: 30rem) { 30 | .searchIcon { 31 | width: 1rem; 32 | height: 1rem; 33 | margin-top: -0.5rem; 34 | left: 0.75rem; 35 | } 36 | .search { 37 | height: 3rem; 38 | font-size: 1rem; 39 | border-width: 1px; 40 | padding-left: 2rem; 41 | } 42 | } 43 | 44 | .search::placeholder { 45 | color: rgba(var(--color-text-dimmed)); 46 | } 47 | .search:focus { 48 | border-color: rgba(var(--color-text-secondary)); 49 | box-shadow: var(--shadow-sm); 50 | } 51 | 52 | -------------------------------------------------------------------------------- /components/search.tsx: -------------------------------------------------------------------------------- 1 | "use client"; 2 | 3 | import styles from "./search.module.css"; 4 | import { useState } from "react"; 5 | import { MagnifyingGlassIcon } from "@heroicons/react/24/solid"; 6 | import { useRouter, usePathname, useSearchParams } from "next/navigation"; 7 | 8 | export default function Search() { 9 | const searchParams = useSearchParams(); 10 | const pathname = usePathname(); 11 | const { replace } = useRouter(); 12 | 13 | const [term, setTerm] = useState(""); 14 | 15 | function handleChange(ev: React.ChangeEvent) { 16 | setTerm(ev.target.value); 17 | } 18 | 19 | function handleSubmit(ev: React.FormEvent) { 20 | ev.preventDefault(); 21 | 22 | const params = new URLSearchParams(searchParams); 23 | 24 | if (term) { 25 | params.set("query", term); 26 | } else { 27 | params.delete("query"); 28 | } 29 | replace(`${pathname}?${params.toString()}`); 30 | } 31 | 32 | return ( 33 |
34 | 35 | 43 | 44 | ); 45 | } 46 | -------------------------------------------------------------------------------- /components/tag.module.css: -------------------------------------------------------------------------------- 1 | .tagLink { 2 | --shape-size: 13px; 3 | 4 | padding-right: var(--shape-size); 5 | } 6 | .tag { 7 | font-size: 0.75rem; 8 | text-transform: uppercase; 9 | background: rgba(var(--color-background-surface)); 10 | border-radius: var(--border-radius) 0 0 var(--border-radius); 11 | font-weight: 700; 12 | letter-spacing: 0.5px; 13 | color: rgba(var(--color-text-secondary)); 14 | padding: 0.375rem 0.3125rem 0.375rem 0.625rem; 15 | display: inline-flex; 16 | gap: 0.375rem; 17 | align-items: center; 18 | position: relative; 19 | white-space: nowrap; 20 | } 21 | .tag::after { 22 | content: ''; 23 | position: absolute; 24 | right: calc(-1 * var(--shape-size)); 25 | top: 50%; 26 | border-width: var(--shape-size) 0 var(--shape-size) var(--shape-size); 27 | border-style: solid; 28 | border-color: transparent transparent transparent rgba(var(--color-background-surface)); 29 | transform: translateY(-50%); 30 | } 31 | .tag > svg { 32 | width: 0.875rem; 33 | height: 0.875rem; 34 | opacity: var(--opacity-icon); 35 | } 36 | -------------------------------------------------------------------------------- /components/tag.tsx: -------------------------------------------------------------------------------- 1 | import Link from "next/link"; 2 | import styles from "./tag.module.css"; 3 | 4 | interface TagProps { 5 | name: string; 6 | } 7 | export default function Tag({ name }: TagProps) { 8 | return ( 9 | 10 | 11 | 12 | ); 13 | } 14 | -------------------------------------------------------------------------------- /config.ts: -------------------------------------------------------------------------------- 1 | export default { 2 | region: "us-east-1", 3 | repo: "https://github.com/sst/demo-ai-app", 4 | }; 5 | -------------------------------------------------------------------------------- /data/All_quiet_on_the_western_front_(2022_film).jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sst/demo-ai-app/94b4dfdea1a135274bd2b9ae7ac051e274eef5b2/data/All_quiet_on_the_western_front_(2022_film).jpg -------------------------------------------------------------------------------- /data/Avatar_The_Way_of_Water_poster.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sst/demo-ai-app/94b4dfdea1a135274bd2b9ae7ac051e274eef5b2/data/Avatar_The_Way_of_Water_poster.jpg -------------------------------------------------------------------------------- /data/Elvis_2022_poster.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sst/demo-ai-app/94b4dfdea1a135274bd2b9ae7ac051e274eef5b2/data/Elvis_2022_poster.jpg -------------------------------------------------------------------------------- /data/The_Banshees_of_Inisherin.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sst/demo-ai-app/94b4dfdea1a135274bd2b9ae7ac051e274eef5b2/data/The_Banshees_of_Inisherin.jpg -------------------------------------------------------------------------------- /data/Top_Gun_Maverick_Poster.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sst/demo-ai-app/94b4dfdea1a135274bd2b9ae7ac051e274eef5b2/data/Top_Gun_Maverick_Poster.jpg -------------------------------------------------------------------------------- /data/movies.data.ts: -------------------------------------------------------------------------------- 1 | export default { 2 | tags: [ 3 | { 4 | id: "post-apocalyptic", 5 | text: "post-apocalyptic", 6 | }, 7 | { 8 | id: "heist", 9 | text: "heist", 10 | }, 11 | { 12 | id: "superhero", 13 | text: "superhero", 14 | }, 15 | ], 16 | }; 17 | -------------------------------------------------------------------------------- /lib/dynamo.ts: -------------------------------------------------------------------------------- 1 | import { Resource } from "sst"; 2 | import { 3 | AttributeValue, 4 | DynamoDBClient, 5 | ScanCommand, 6 | } from "@aws-sdk/client-dynamodb"; 7 | import { 8 | BatchGetCommand, 9 | DynamoDBDocumentClient, 10 | GetCommand, 11 | } from "@aws-sdk/lib-dynamodb"; 12 | console.log(process.env); 13 | const dynamoClient = new DynamoDBClient({}); 14 | const docClient = DynamoDBDocumentClient.from(dynamoClient); 15 | 16 | export async function get() { 17 | let last: Record | undefined; 18 | const results = []; 19 | while (true) { 20 | console.log(last); 21 | const response = await docClient.send( 22 | new ScanCommand({ 23 | TableName: Resource.Movies.tableName, 24 | ExclusiveStartKey: last, 25 | }), 26 | ); 27 | if (!response.LastEvaluatedKey) { 28 | break; 29 | } 30 | results.push(...response.Items!); 31 | last = response.LastEvaluatedKey; 32 | } 33 | return results.map((item) => ({ 34 | id: item.id.S!, 35 | data: JSON.parse(item.data.S!), 36 | })); 37 | } 38 | 39 | export async function getById(id: string) { 40 | const result = await docClient.send( 41 | new GetCommand({ 42 | TableName: Resource.Movies.tableName, 43 | Key: { 44 | id, 45 | }, 46 | }), 47 | ); 48 | console.log(result.Item?.data); 49 | return { 50 | id: result.Item?.id! as string, 51 | data: JSON.parse(result.Item?.data!), 52 | }; 53 | } 54 | 55 | export async function batchGet(ids: string[]) { 56 | return ids.length === 0 57 | ? [] 58 | : await docClient 59 | .send( 60 | new BatchGetCommand({ 61 | RequestItems: { 62 | [Resource.Movies.tableName]: { 63 | Keys: ids.map((id) => ({ id: id })), 64 | }, 65 | }, 66 | }), 67 | ) 68 | .then((response) => 69 | response.Responses![Resource.Movies.tableName].map((item) => ({ 70 | id: item.id! as string, 71 | data: JSON.parse(item.data!), 72 | })), 73 | ); 74 | } 75 | -------------------------------------------------------------------------------- /lib/queue.ts: -------------------------------------------------------------------------------- 1 | export async function queue( 2 | concurrency: number, 3 | items: T[], 4 | processItem: (item: T) => Promise, 5 | ) { 6 | const workers = [...new Array(concurrency)]; 7 | await Promise.all( 8 | workers.map(async (_, index) => { 9 | let count = 0; 10 | while (true) { 11 | const item = items.pop(); 12 | if (!item) { 13 | break; 14 | } 15 | await processItem(item); 16 | count++; 17 | } 18 | }), 19 | ); 20 | } 21 | -------------------------------------------------------------------------------- /lib/rank.ts: -------------------------------------------------------------------------------- 1 | interface Result { 2 | score: number; 3 | metadata: { 4 | id: string; 5 | }; 6 | } 7 | export function rankMovies(input: Result[]) { 8 | const results = {} as Record; 9 | for (const result of input) { 10 | if (result.score < 0.79) continue; 11 | const existing = results[result.metadata.id] || 0; 12 | results[result.metadata.id] = existing + result.score; 13 | } 14 | return Object.keys(results).sort((a, b) => results[b] - results[a]); 15 | } 16 | -------------------------------------------------------------------------------- /load.ts: -------------------------------------------------------------------------------- 1 | import fs from "fs/promises"; 2 | import data from "./data/movies.data"; 3 | import { DynamoDBClient } from "@aws-sdk/client-dynamodb"; 4 | import { PutObjectCommand, S3Client } from "@aws-sdk/client-s3"; 5 | import { DynamoDBDocumentClient, PutCommand } from "@aws-sdk/lib-dynamodb"; 6 | 7 | import { Resource, VectorClient } from "sst"; 8 | import * as Cheerio from "cheerio"; 9 | import { queue } from "./lib/queue"; 10 | 11 | const s3 = new S3Client({}); 12 | const dynamoClient = new DynamoDBClient({}); 13 | const docClient = DynamoDBDocumentClient.from(dynamoClient); 14 | 15 | const vector = VectorClient("Vector"); 16 | 17 | async function load() { 18 | const ids = [ 19 | "tt0111161", 20 | "tt0468569", 21 | "tt1375666", 22 | "tt0137523", 23 | "tt0109830", 24 | "tt0110912", 25 | "tt0816692", 26 | "tt0133093", 27 | "tt0068646", 28 | "tt0120737", 29 | "tt0167260", 30 | "tt1345836", 31 | "tt0114369", 32 | "tt0167261", 33 | "tt1853728", 34 | "tt0172495", 35 | "tt0372784", 36 | "tt0361748", 37 | "tt0993846", 38 | "tt0102926", 39 | "tt0120815", 40 | "tt0848228", 41 | "tt7286456", 42 | "tt0076759", 43 | "tt0108052", 44 | "tt1130884", 45 | "tt0482571", 46 | "tt0407887", 47 | "tt0120689", 48 | "tt0499549", 49 | "tt0080684", 50 | "tt0071562", 51 | "tt0209144", 52 | "tt0088763", 53 | "tt0120338", 54 | "tt2015381", 55 | "tt4154796", 56 | "tt0099685", 57 | "tt0110413", 58 | "tt0169547", 59 | "tt0325980", 60 | "tt0910970", 61 | "tt4154756", 62 | "tt0266697", 63 | "tt0120586", 64 | "tt0120382", 65 | "tt0434409", 66 | "tt0103064", 67 | "tt0114814", 68 | "tt0110357", 69 | "tt0371746", 70 | "tt1049413", 71 | "tt0086190", 72 | "tt1431045", 73 | "tt0266543", 74 | "tt0081505", 75 | "tt0112573", 76 | "tt0105236", 77 | "tt0264464", 78 | "tt1392190", 79 | "tt0338013", 80 | "tt0073486", 81 | "tt0114709", 82 | "tt0107290", 83 | "tt2267998", 84 | "tt0119217", 85 | "tt0477348", 86 | "tt0167404", 87 | "tt0082971", 88 | "tt1392170", 89 | "tt0268978", 90 | "tt2488496", 91 | "tt0198781", 92 | "tt2582802", 93 | "tt0078748", 94 | "tt0095016", 95 | "tt1201607", 96 | "tt6751668", 97 | "tt1675434", 98 | "tt0088247", 99 | "tt2395427", 100 | "tt3659388", 101 | "tt0075314", 102 | "tt0086250", 103 | "tt0208092", 104 | "tt0253474", 105 | "tt0800369", 106 | "tt1300854", 107 | "tt1843866", 108 | "tt0180093", 109 | "tt0458339", 110 | "tt0435761", 111 | "tt2278388", 112 | "tt0066921", 113 | "tt1010048", 114 | "tt0145487", 115 | "tt0903624", 116 | "tt1663202", 117 | "tt1228705", 118 | "tt10872600", 119 | "tt0416449", 120 | "tt1454468", 121 | "tt0118715", 122 | "tt0050083", 123 | "tt0120915", 124 | "tt0241527", 125 | "tt0246578", 126 | "tt3498820", 127 | "tt0121766", 128 | "tt1119646", 129 | "tt0245429", 130 | "tt1825683", 131 | "tt7131622", 132 | "tt3315342", 133 | "tt2084970", 134 | "tt0947798", 135 | "tt0083658", 136 | "tt1205489", 137 | "tt0382932", 138 | "tt0770828", 139 | "tt3501632", 140 | "tt0480249", 141 | "tt0097576", 142 | "tt0060196", 143 | "tt0317705", 144 | "tt0378194", 145 | "tt1211837", 146 | "tt0317248", 147 | "tt1392214", 148 | "tt0401792", 149 | "tt0892769", 150 | "tt0211915", 151 | "tt0093058", 152 | "tt2096673", 153 | "tt1877830", 154 | "tt0383574", 155 | "tt8946378", 156 | "tt0090605", 157 | "tt2543164", 158 | "tt0121765", 159 | "tt1285016", 160 | "tt3896198", 161 | "tt2975590", 162 | "tt1160419", 163 | "tt1877832", 164 | "tt1045658", 165 | "tt2024544", 166 | "tt0118799", 167 | "tt2911666", 168 | "tt5013056", 169 | "tt1631867", 170 | "tt1074638", 171 | "tt0126029", 172 | "tt0117951", 173 | "tt1981115", 174 | "tt1270798", 175 | "tt1386697", 176 | "tt0116282", 177 | "tt0405159", 178 | "tt0478970", 179 | "tt1951264", 180 | "tt1136608", 181 | "tt0054215", 182 | "tt0062622", 183 | "tt0816711", 184 | "tt2250912", 185 | "tt0113277", 186 | "tt2802144", 187 | "tt1504320", 188 | "tt0078788", 189 | "tt1670345", 190 | "tt0144084", 191 | "tt0316654", 192 | "tt1170358", 193 | "tt0457430", 194 | "tt0780504", 195 | "tt0948470", 196 | "tt0451279", 197 | "tt0381061", 198 | "tt0421715", 199 | "tt0449088", 200 | "tt0295297", 201 | "tt0304141", 202 | "tt5052448", 203 | "tt3748528", 204 | "tt0107048", 205 | "tt0369610", 206 | "tt0330373", 207 | "tt0418279", 208 | "tt2527336", 209 | "tt1745960", 210 | "tt0988045", 211 | "tt0454876", 212 | "tt2562232", 213 | "tt8579674", 214 | "tt1798709", 215 | "tt2294629", 216 | "tt0440963", 217 | "tt4633694", 218 | "tt3783958", 219 | "tt0758758", 220 | "tt0073195", 221 | "tt3460252", 222 | "tt1637725", 223 | "tt0099785", 224 | "tt1856101", 225 | "tt0114746", 226 | "tt0120903", 227 | "tt1446714", 228 | "tt1024648", 229 | "tt0469494", 230 | "tt5463162", 231 | "tt0162222", 232 | "tt0413300", 233 | "tt0936501", 234 | "tt0373889", 235 | "tt0364569", 236 | "tt0234215", 237 | "tt0829482", 238 | "tt0075148", 239 | "tt0796366", 240 | "tt1156398", 241 | "tt0120363", 242 | "tt0119488", 243 | "tt0240772", 244 | "tt0120735", 245 | "tt0332280", 246 | "tt1219289", 247 | "tt0119654", 248 | "tt4154664", 249 | "tt15398776", 250 | "tt0116629", 251 | "tt0034583", 252 | "tt1276104", 253 | "tt3890160", 254 | "tt1396484", 255 | "tt2872718", 256 | "tt1232829", 257 | "tt0926084", 258 | "tt1250777", 259 | "tt0443706", 260 | "tt0365748", 261 | "tt1343092", 262 | "tt0417741", 263 | "tt11286314", 264 | "tt2119532", 265 | "tt1727824", 266 | "tt0450259", 267 | "tt0181689", 268 | "tt0470752", 269 | "tt0409459", 270 | "tt1323594", 271 | "tt6723592", 272 | "tt2380307", 273 | "tt6644200", 274 | "tt10811166", 275 | "tt0290334", 276 | "tt0258463", 277 | "tt0343818", 278 | "tt0096874", 279 | "tt0071853", 280 | "tt2310332", 281 | "tt0332452", 282 | "tt1298650", 283 | "tt0112641", 284 | "tt1570728", 285 | "tt1318514", 286 | "tt0454921", 287 | "tt6966692", 288 | "tt1022603", 289 | "tt1483013", 290 | "tt1457767", 291 | "tt5027774", 292 | "tt6320628", 293 | "tt0467406", 294 | "tt0945513", 295 | "tt1659337", 296 | "tt4972582", 297 | "tt0095953", 298 | "tt0242653", 299 | "tt2948356", 300 | "tt0376994", 301 | "tt2713180", 302 | "tt0097165", 303 | "tt0356910", 304 | "tt1872181", 305 | "tt0425112", 306 | "tt0087469", 307 | "tt1270797", 308 | "tt1411697", 309 | "tt2872732", 310 | "tt0314331", 311 | "tt0458525", 312 | "tt1663662", 313 | "tt0206634", 314 | "tt1229238", 315 | "tt2179136", 316 | "tt0367594", 317 | "tt0800080", 318 | "tt0099487", 319 | "tt0047396", 320 | "tt0289879", 321 | "tt0790636", 322 | "tt0057012", 323 | "tt1477834", 324 | "tt0268380", 325 | "tt0449059", 326 | "tt0441773", 327 | "tt0448157", 328 | "tt1979320", 329 | "tt6710474", 330 | "tt4425200", 331 | "tt3183660", 332 | "tt1790864", 333 | "tt0119116", 334 | "tt0298148", 335 | "tt1800241", 336 | "tt1895587", 337 | "tt1951265", 338 | "tt1408101", 339 | "tt0092099", 340 | "tt2245084", 341 | "tt0038650", 342 | "tt1291584", 343 | "tt0362227", 344 | "tt1568346", 345 | "tt0367882", 346 | "tt1430132", 347 | "tt1535109", 348 | "tt0398286", 349 | "tt1454029", 350 | "tt2527338", 351 | "tt1840309", 352 | "tt0372183", 353 | "tt1099212", 354 | "tt0335266", 355 | "tt1723121", 356 | "tt0327056", 357 | "tt1630029", 358 | "tt2980516", 359 | "tt1515091", 360 | "tt0101414", 361 | "tt0099088", 362 | "tt1596363", 363 | "tt0974015", 364 | "tt1677720", 365 | "tt0319262", 366 | "tt0407304", 367 | "tt0887912", 368 | "tt0217505", 369 | "tt0830515", 370 | "tt9419884", 371 | "tt1535108", 372 | "tt1499658", 373 | "tt0139654", 374 | "tt1517268", 375 | "tt0325710", 376 | "tt3397884", 377 | "tt0117060", 378 | "tt2103281", 379 | "tt2379713", 380 | "tt0033467", 381 | "tt0405422", 382 | "tt0387564", 383 | "tt0446029", 384 | "tt0317219", 385 | "tt0084787", 386 | "tt0103639", 387 | "tt1210166", 388 | "tt0780536", 389 | "tt3385516", 390 | "tt0319061", 391 | "tt0120616", 392 | "tt0382625", 393 | "tt0458352", 394 | "tt1950186", 395 | "tt1772341", 396 | "tt0070047", 397 | "tt0765429", 398 | "tt0093773", 399 | "tt0375679", 400 | "tt0093779", 401 | "tt0120591", 402 | "tt1605783", 403 | "tt1259521", 404 | "tt3170832", 405 | "tt5095030", 406 | "tt5580390", 407 | "tt0942385", 408 | "tt0360717", 409 | "tt1637688", 410 | "tt0087332", 411 | "tt0119567", 412 | "tt1355644", 413 | "tt0289043", 414 | "tt2382320", 415 | "tt0347149", 416 | "tt0217869", 417 | "tt1217209", 418 | "tt1014759", 419 | "tt0443453", 420 | "tt0092005", 421 | "tt0831387", 422 | "tt0091763", 423 | "tt0083866", 424 | "tt12361974", 425 | "tt2584384", 426 | "tt0105695", 427 | "tt1245492", 428 | "tt0351283", 429 | "tt0088847", 430 | "tt0163651", 431 | "tt1399103", 432 | "tt0369339", 433 | "tt0315327", 434 | "tt1187043", 435 | "tt11564570", 436 | "tt9376612", 437 | "tt0119698", 438 | "tt1055369", 439 | "tt1302006", 440 | "tt0032138", 441 | "tt0119174", 442 | "tt0377092", 443 | "tt0363771", 444 | "tt0086879", 445 | "tt0052357", 446 | "tt1690953", 447 | "tt0099674", 448 | "tt0079470", 449 | "tt0265086", 450 | "tt0337978", 451 | "tt3480822", 452 | "tt6146586", 453 | "tt1060277", 454 | "tt0181852", 455 | "tt2283362", 456 | "tt6264654", 457 | "tt0232500", 458 | "tt0110475", 459 | "tt1905041", 460 | "tt1517451", 461 | "tt1282140", 462 | "tt0361862", 463 | "tt0455944", 464 | "tt0840361", 465 | "tt2820852", 466 | "tt0349903", 467 | "tt0109686", 468 | "tt0405094", 469 | "tt2381249", 470 | "tt12593682", 471 | "tt0493464", 472 | "tt0112864", 473 | "tt1596343", 474 | "tt2294449", 475 | "tt0096895", 476 | "tt6334354", 477 | "tt0120912", 478 | "tt0104431", 479 | "tt2582846", 480 | "tt1542344", 481 | "tt0118971", 482 | "tt0119094", 483 | "tt1587310", 484 | "tt1190080", 485 | "tt0454848", 486 | "tt10648342", 487 | "tt1632708", 488 | "tt0230600", 489 | "tt8772262", 490 | "tt0443543", 491 | "tt0111257", 492 | "tt0317919", 493 | "tt0964517", 494 | "tt0317740", 495 | "tt0328107", 496 | "tt1453405", 497 | "tt1706620", 498 | "tt0408236", 499 | "tt1490017", 500 | "tt0117571", 501 | "tt1409024", 502 | "tt0286106", 503 | "tt0091042", 504 | "tt0478311", 505 | "tt8367814", 506 | "tt0338751", 507 | "tt0162661", 508 | "tt0099423", 509 | "tt2194499", 510 | "tt0448115", 511 | "tt1068680", 512 | "tt2737304", 513 | "tt0166924", 514 | "tt9032400", 515 | "tt0388795", 516 | "tt0343660", 517 | "tt0147800", 518 | "tt0357413", 519 | "tt0081398", 520 | "tt0438488", 521 | "tt3778644", 522 | "tt1182345", 523 | "tt0120755", 524 | "tt0087843", 525 | "tt1907668", 526 | "tt9764362", 527 | "tt0477347", 528 | "tt0396269", 529 | "tt4912910", 530 | "tt1371111", 531 | "tt0107688", 532 | "tt0096283", 533 | "tt0113497", 534 | "tt0363163", 535 | "tt0298130", 536 | "tt3521164", 537 | "tt2948372", 538 | "tt0120663", 539 | "tt0395169", 540 | "tt0360486", 541 | "tt0119396", 542 | "tt7784604", 543 | "tt1951266", 544 | "tt1650062", 545 | "tt1065073", 546 | "tt3799694", 547 | "tt1748122", 548 | "tt0496806", 549 | "tt6791350", 550 | "tt0047478", 551 | "tt1320253", 552 | "tt0790724", 553 | "tt1646971", 554 | "tt0077416", 555 | "tt2106476", 556 | "tt4649466", 557 | "tt0878804", 558 | "tt1231583", 559 | "tt2798920", 560 | "tt0910936", 561 | "tt0117500", 562 | "tt1403865", 563 | "tt0100405", 564 | "tt1104001", 565 | "tt0389860", 566 | "tt1041829", 567 | "tt0822854", 568 | "tt0212338", 569 | "tt0368891", 570 | "tt0433035", 571 | "tt0120601", 572 | "tt2788710", 573 | "tt1179933", 574 | "tt0100802", 575 | "tt0887883", 576 | "tt0213149", 577 | "tt1193138", 578 | "tt0462538", 579 | "tt0167190", 580 | "tt0064116", 581 | "tt0071315", 582 | "tt0238380", 583 | "tt0110148", 584 | "tt1707386", 585 | "tt0053125", 586 | "tt0209163", 587 | "tt3731562", 588 | "tt0120667", 589 | "tt1306980", 590 | "tt7653254", 591 | "tt1790809", 592 | "tt4881806", 593 | "tt0163025", 594 | "tt0359950", 595 | "tt0125439", 596 | "tt0116367", 597 | "tt1037705", 598 | "tt1591095", 599 | "tt0884328", 600 | "tt0970179", 601 | "tt6857112", 602 | "tt9362722", 603 | "tt0112471", 604 | "tt0399295", 605 | "tt0094721", 606 | "tt2322441", 607 | "tt0386588", 608 | "tt1951261", 609 | "tt0031381", 610 | "tt2771200", 611 | "tt1645170", 612 | "tt0056592", 613 | "tt0119528", 614 | "tt2109248", 615 | "tt1638355", 616 | "tt0413267", 617 | "tt0119008", 618 | "tt0381849", 619 | "tt0944835", 620 | "tt0472043", 621 | "tt0190590", 622 | "tt4975722", 623 | "tt0094226", 624 | "tt1981677", 625 | "tt2004420", 626 | "tt0129387", 627 | "tt0332379", 628 | "tt0175880", 629 | "tt0399201", 630 | "tt3682448", 631 | "tt3606756", 632 | "tt0453467", 633 | "tt0414387", 634 | "tt0103776", 635 | "tt0425210", 636 | "tt0105323", 637 | "tt1245526", 638 | "tt0109040", 639 | "tt4925292", 640 | "tt0489099", 641 | "tt0212720", 642 | "tt1764651", 643 | "tt1397280", 644 | "tt0119177", 645 | "tt0457939", 646 | "tt10366206", 647 | "tt0293662", 648 | "tt1125849", 649 | "tt7888964", 650 | "tt1152836", 651 | "tt0103644", 652 | "tt1790885", 653 | "tt3110958", 654 | "tt0298203", 655 | "tt0118880", 656 | "tt0119822", 657 | "tt0449467", 658 | "tt1197624", 659 | "tt0838283", 660 | "tt2140479", 661 | "tt0278504", 662 | "tt0120201", 663 | "tt0106977", 664 | "tt1598778", 665 | "tt1194173", 666 | "tt1253863", 667 | "tt0814314", 668 | "tt5727208", 669 | "tt0120762", 670 | "tt1302011", 671 | "tt0112384", 672 | "tt7991608", 673 | "tt0120623", 674 | "tt0265666", 675 | "tt1028528", 676 | "tt5311514", 677 | "tt0056172", 678 | "tt0320661", 679 | "tt0319343", 680 | "tt1013752", 681 | "tt0808151", 682 | "tt3076658", 683 | "tt4034228", 684 | "tt1478338", 685 | "tt1028532", 686 | "tt5726616", 687 | "tt1485796", 688 | "tt4123430", 689 | "tt0379786", 690 | "tt1091191", 691 | "tt0077651", 692 | "tt0095327", 693 | "tt0473075", 694 | "tt2397535", 695 | "tt4550098", 696 | "tt1735898", 697 | "tt2316204", 698 | "tt0800039", 699 | "tt0120669", 700 | "tt2277860", 701 | "tt1259571", 702 | "tt9114286", 703 | "tt0203009", 704 | "tt0077631", 705 | "tt7349950", 706 | "tt0783233", 707 | "tt4160708", 708 | "tt3065204", 709 | "tt1213663", 710 | "tt0121164", 711 | "tt0463985", 712 | "tt0120611", 713 | "tt0089218", 714 | "tt1133985", 715 | "tt4263482", 716 | "tt3263904", 717 | "tt0322259", 718 | "tt0258000", 719 | ]; 720 | 721 | for (const id of ids) { 722 | const path = `./data/imdb/${id}.html`; 723 | const exists = await fs 724 | .stat(path) 725 | .then(() => true) 726 | .catch(() => false); 727 | if (exists) continue; 728 | console.log("downloading", id); 729 | const body = await fetch(`https://www.imdb.com/title/${id}/plotsummary/`, { 730 | headers: { 731 | "User-Agent": 732 | "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.36", 733 | "Accept-Language": "en-US,en;q=0.9", 734 | }, 735 | }).then((res) => { 736 | if (res.status !== 200) throw new Error("Failed to download"); 737 | return res.text(); 738 | }); 739 | await fs.writeFile(path, body); 740 | } 741 | 742 | await vector.remove({ 743 | include: { 744 | type: "tag", 745 | }, 746 | }); 747 | 748 | for (const tag of data.tags) { 749 | console.log(`Adding tag ${tag.id}...`); 750 | 751 | await vector.ingest({ 752 | text: tag.text, 753 | metadata: { type: "tag", id: tag.id }, 754 | }); 755 | } 756 | 757 | let index = 0; 758 | await queue(25, ids, async (id) => { 759 | const path = `./data/imdb/${id}.html`; 760 | const body = await fs.readFile(path); 761 | const $ = Cheerio.load(body); 762 | const year = parseInt( 763 | $("title") 764 | .text() 765 | .match(/\((\d+)\)/)?.[1] || "0", 766 | ); 767 | const title = $("[data-testid=subtitle]").text().trim(); 768 | const summary = $("[data-testid=sub-section-summaries] li:first-child") 769 | .text() 770 | .trim(); 771 | console.log("processing", id, title); 772 | const poster = $("meta[property='og:image']").attr("content")!; 773 | 774 | $("[data-testid=sub-section-synopsis] br").replaceWith("\n"); 775 | const synopsis = $("[data-testid=sub-section-synopsis]") 776 | .text() 777 | .split("\n") 778 | .filter(Boolean); 779 | 780 | await s3.send( 781 | new PutObjectCommand({ 782 | Bucket: Resource.Assets.bucketName, 783 | Key: "posters/" + id + ".jpg", 784 | ContentType: "image/jpeg", 785 | Body: await fetch(poster).then((res) => res.arrayBuffer() as any), 786 | }), 787 | ); 788 | 789 | await vector.remove({ 790 | include: { 791 | type: "movie", 792 | id, 793 | }, 794 | }); 795 | for (let i = 0; i < synopsis.length; i++) { 796 | await vector.ingest({ 797 | text: synopsis[i], 798 | metadata: { type: "movie", id, source: "synopsis", chunk: i }, 799 | }); 800 | } 801 | 802 | const tags = [] as any[]; 803 | for (const tag of data.tags) { 804 | const ret = await vector.retrieve({ 805 | text: tag.text, 806 | include: { type: "movie", id }, 807 | }); 808 | 809 | if ( 810 | ret.results.length > 0 && 811 | ret.results.filter((s: any) => s.score >= 0.79).length > 2 812 | ) { 813 | tags.push(tag.id); 814 | } 815 | } 816 | console.log(title, tags, Resource.Movies.tableName); 817 | 818 | await docClient.send( 819 | new PutCommand({ 820 | TableName: Resource.Movies.tableName, 821 | Item: { 822 | id, 823 | data: JSON.stringify({ 824 | title, 825 | about: summary, 826 | synopsis, 827 | poster: `https://${Resource.Assets.bucketName}.s3.amazonaws.com/posters/${id}.jpg`, 828 | id, 829 | tags, 830 | year, 831 | }), 832 | }, 833 | }), 834 | ); 835 | console.log("Finished", ++index); 836 | }); 837 | return; 838 | } 839 | 840 | load() 841 | .then(() => { 842 | console.log("Done"); 843 | }) 844 | .catch((err) => { 845 | console.error(err); 846 | }); 847 | -------------------------------------------------------------------------------- /next.config.js: -------------------------------------------------------------------------------- 1 | /** @type {import('next').NextConfig} */ 2 | const nextConfig = { 3 | images: { 4 | remotePatterns: [ 5 | { 6 | protocol: "https", 7 | hostname: "*.amazonaws.com", 8 | }, 9 | ], 10 | }, 11 | }; 12 | 13 | module.exports = nextConfig; 14 | -------------------------------------------------------------------------------- /package-lock.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "my-ion-app", 3 | "version": "0.1.0", 4 | "lockfileVersion": 3, 5 | "requires": true, 6 | "packages": { 7 | "": { 8 | "name": "my-ion-app", 9 | "version": "0.1.0", 10 | "dependencies": { 11 | "@heroicons/react": "^2.1.1", 12 | "aws-sdk": "^2.1532.0", 13 | "file-type": "^19.0.0", 14 | "next": "14.0.4", 15 | "react": "^18", 16 | "react-dom": "^18", 17 | "sst": "^3.0.1-11", 18 | "tsx": "^4.7.0" 19 | }, 20 | "devDependencies": { 21 | "@types/node": "^20", 22 | "@types/react": "^18", 23 | "@types/react-dom": "^18", 24 | "typescript": "^5" 25 | } 26 | }, 27 | "node_modules/@aws-crypto/crc32": { 28 | "version": "3.0.0", 29 | "resolved": "https://registry.npmjs.org/@aws-crypto/crc32/-/crc32-3.0.0.tgz", 30 | "integrity": "sha512-IzSgsrxUcsrejQbPVilIKy16kAT52EwB6zSaI+M3xxIhKh5+aldEyvI+z6erM7TCLB2BJsFrtHjp6/4/sr+3dA==", 31 | "dependencies": { 32 | "@aws-crypto/util": "^3.0.0", 33 | "@aws-sdk/types": "^3.222.0", 34 | "tslib": "^1.11.1" 35 | } 36 | }, 37 | "node_modules/@aws-crypto/crc32/node_modules/tslib": { 38 | "version": "1.14.1", 39 | "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", 40 | "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==" 41 | }, 42 | "node_modules/@aws-crypto/ie11-detection": { 43 | "version": "3.0.0", 44 | "resolved": "https://registry.npmjs.org/@aws-crypto/ie11-detection/-/ie11-detection-3.0.0.tgz", 45 | "integrity": "sha512-341lBBkiY1DfDNKai/wXM3aujNBkXR7tq1URPQDL9wi3AUbI80NR74uF1TXHMm7po1AcnFk8iu2S2IeU/+/A+Q==", 46 | "dependencies": { 47 | "tslib": "^1.11.1" 48 | } 49 | }, 50 | "node_modules/@aws-crypto/ie11-detection/node_modules/tslib": { 51 | "version": "1.14.1", 52 | "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", 53 | "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==" 54 | }, 55 | "node_modules/@aws-crypto/sha256-browser": { 56 | "version": "3.0.0", 57 | "resolved": "https://registry.npmjs.org/@aws-crypto/sha256-browser/-/sha256-browser-3.0.0.tgz", 58 | "integrity": "sha512-8VLmW2B+gjFbU5uMeqtQM6Nj0/F1bro80xQXCW6CQBWgosFWXTx77aeOF5CAIAmbOK64SdMBJdNr6J41yP5mvQ==", 59 | "dependencies": { 60 | "@aws-crypto/ie11-detection": "^3.0.0", 61 | "@aws-crypto/sha256-js": "^3.0.0", 62 | "@aws-crypto/supports-web-crypto": "^3.0.0", 63 | "@aws-crypto/util": "^3.0.0", 64 | "@aws-sdk/types": "^3.222.0", 65 | "@aws-sdk/util-locate-window": "^3.0.0", 66 | "@aws-sdk/util-utf8-browser": "^3.0.0", 67 | "tslib": "^1.11.1" 68 | } 69 | }, 70 | "node_modules/@aws-crypto/sha256-browser/node_modules/tslib": { 71 | "version": "1.14.1", 72 | "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", 73 | "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==" 74 | }, 75 | "node_modules/@aws-crypto/sha256-js": { 76 | "version": "3.0.0", 77 | "resolved": "https://registry.npmjs.org/@aws-crypto/sha256-js/-/sha256-js-3.0.0.tgz", 78 | "integrity": "sha512-PnNN7os0+yd1XvXAy23CFOmTbMaDxgxXtTKHybrJ39Y8kGzBATgBFibWJKH6BhytLI/Zyszs87xCOBNyBig6vQ==", 79 | "dependencies": { 80 | "@aws-crypto/util": "^3.0.0", 81 | "@aws-sdk/types": "^3.222.0", 82 | "tslib": "^1.11.1" 83 | } 84 | }, 85 | "node_modules/@aws-crypto/sha256-js/node_modules/tslib": { 86 | "version": "1.14.1", 87 | "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", 88 | "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==" 89 | }, 90 | "node_modules/@aws-crypto/supports-web-crypto": { 91 | "version": "3.0.0", 92 | "resolved": "https://registry.npmjs.org/@aws-crypto/supports-web-crypto/-/supports-web-crypto-3.0.0.tgz", 93 | "integrity": "sha512-06hBdMwUAb2WFTuGG73LSC0wfPu93xWwo5vL2et9eymgmu3Id5vFAHBbajVWiGhPO37qcsdCap/FqXvJGJWPIg==", 94 | "dependencies": { 95 | "tslib": "^1.11.1" 96 | } 97 | }, 98 | "node_modules/@aws-crypto/supports-web-crypto/node_modules/tslib": { 99 | "version": "1.14.1", 100 | "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", 101 | "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==" 102 | }, 103 | "node_modules/@aws-crypto/util": { 104 | "version": "3.0.0", 105 | "resolved": "https://registry.npmjs.org/@aws-crypto/util/-/util-3.0.0.tgz", 106 | "integrity": "sha512-2OJlpeJpCR48CC8r+uKVChzs9Iungj9wkZrl8Z041DWEWvyIHILYKCPNzJghKsivj+S3mLo6BVc7mBNzdxA46w==", 107 | "dependencies": { 108 | "@aws-sdk/types": "^3.222.0", 109 | "@aws-sdk/util-utf8-browser": "^3.0.0", 110 | "tslib": "^1.11.1" 111 | } 112 | }, 113 | "node_modules/@aws-crypto/util/node_modules/tslib": { 114 | "version": "1.14.1", 115 | "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", 116 | "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==" 117 | }, 118 | "node_modules/@aws-sdk/client-lambda": { 119 | "version": "3.478.0", 120 | "resolved": "https://registry.npmjs.org/@aws-sdk/client-lambda/-/client-lambda-3.478.0.tgz", 121 | "integrity": "sha512-7+PEE1aV3qVeuswL6cUBfHeljxC/WaXFj+214/W3q71uRdLbX5Z7ZOD15sJbjSu+4VZN9ugMaxEcp+oLiqWl+A==", 122 | "dependencies": { 123 | "@aws-crypto/sha256-browser": "3.0.0", 124 | "@aws-crypto/sha256-js": "3.0.0", 125 | "@aws-sdk/client-sts": "3.478.0", 126 | "@aws-sdk/core": "3.477.0", 127 | "@aws-sdk/credential-provider-node": "3.478.0", 128 | "@aws-sdk/middleware-host-header": "3.468.0", 129 | "@aws-sdk/middleware-logger": "3.468.0", 130 | "@aws-sdk/middleware-recursion-detection": "3.468.0", 131 | "@aws-sdk/middleware-signing": "3.468.0", 132 | "@aws-sdk/middleware-user-agent": "3.478.0", 133 | "@aws-sdk/region-config-resolver": "3.470.0", 134 | "@aws-sdk/types": "3.468.0", 135 | "@aws-sdk/util-endpoints": "3.478.0", 136 | "@aws-sdk/util-user-agent-browser": "3.468.0", 137 | "@aws-sdk/util-user-agent-node": "3.470.0", 138 | "@smithy/config-resolver": "^2.0.21", 139 | "@smithy/core": "^1.2.0", 140 | "@smithy/eventstream-serde-browser": "^2.0.15", 141 | "@smithy/eventstream-serde-config-resolver": "^2.0.15", 142 | "@smithy/eventstream-serde-node": "^2.0.15", 143 | "@smithy/fetch-http-handler": "^2.3.1", 144 | "@smithy/hash-node": "^2.0.17", 145 | "@smithy/invalid-dependency": "^2.0.15", 146 | "@smithy/middleware-content-length": "^2.0.17", 147 | "@smithy/middleware-endpoint": "^2.2.3", 148 | "@smithy/middleware-retry": "^2.0.24", 149 | "@smithy/middleware-serde": "^2.0.15", 150 | "@smithy/middleware-stack": "^2.0.9", 151 | "@smithy/node-config-provider": "^2.1.8", 152 | "@smithy/node-http-handler": "^2.2.1", 153 | "@smithy/protocol-http": "^3.0.11", 154 | "@smithy/smithy-client": "^2.1.18", 155 | "@smithy/types": "^2.7.0", 156 | "@smithy/url-parser": "^2.0.15", 157 | "@smithy/util-base64": "^2.0.1", 158 | "@smithy/util-body-length-browser": "^2.0.1", 159 | "@smithy/util-body-length-node": "^2.1.0", 160 | "@smithy/util-defaults-mode-browser": "^2.0.22", 161 | "@smithy/util-defaults-mode-node": "^2.0.29", 162 | "@smithy/util-endpoints": "^1.0.7", 163 | "@smithy/util-retry": "^2.0.8", 164 | "@smithy/util-stream": "^2.0.23", 165 | "@smithy/util-utf8": "^2.0.2", 166 | "@smithy/util-waiter": "^2.0.15", 167 | "tslib": "^2.5.0" 168 | }, 169 | "engines": { 170 | "node": ">=14.0.0" 171 | } 172 | }, 173 | "node_modules/@aws-sdk/client-sso": { 174 | "version": "3.478.0", 175 | "resolved": "https://registry.npmjs.org/@aws-sdk/client-sso/-/client-sso-3.478.0.tgz", 176 | "integrity": "sha512-Jxy9cE1JMkPR0PklCpq3cORHnZq/Z4klhSTNGgZNeBWovMa+plor52kyh8iUNHKl3XEJvTbHM7V+dvrr/x0P1g==", 177 | "dependencies": { 178 | "@aws-crypto/sha256-browser": "3.0.0", 179 | "@aws-crypto/sha256-js": "3.0.0", 180 | "@aws-sdk/core": "3.477.0", 181 | "@aws-sdk/middleware-host-header": "3.468.0", 182 | "@aws-sdk/middleware-logger": "3.468.0", 183 | "@aws-sdk/middleware-recursion-detection": "3.468.0", 184 | "@aws-sdk/middleware-user-agent": "3.478.0", 185 | "@aws-sdk/region-config-resolver": "3.470.0", 186 | "@aws-sdk/types": "3.468.0", 187 | "@aws-sdk/util-endpoints": "3.478.0", 188 | "@aws-sdk/util-user-agent-browser": "3.468.0", 189 | "@aws-sdk/util-user-agent-node": "3.470.0", 190 | "@smithy/config-resolver": "^2.0.21", 191 | "@smithy/core": "^1.2.0", 192 | "@smithy/fetch-http-handler": "^2.3.1", 193 | "@smithy/hash-node": "^2.0.17", 194 | "@smithy/invalid-dependency": "^2.0.15", 195 | "@smithy/middleware-content-length": "^2.0.17", 196 | "@smithy/middleware-endpoint": "^2.2.3", 197 | "@smithy/middleware-retry": "^2.0.24", 198 | "@smithy/middleware-serde": "^2.0.15", 199 | "@smithy/middleware-stack": "^2.0.9", 200 | "@smithy/node-config-provider": "^2.1.8", 201 | "@smithy/node-http-handler": "^2.2.1", 202 | "@smithy/protocol-http": "^3.0.11", 203 | "@smithy/smithy-client": "^2.1.18", 204 | "@smithy/types": "^2.7.0", 205 | "@smithy/url-parser": "^2.0.15", 206 | "@smithy/util-base64": "^2.0.1", 207 | "@smithy/util-body-length-browser": "^2.0.1", 208 | "@smithy/util-body-length-node": "^2.1.0", 209 | "@smithy/util-defaults-mode-browser": "^2.0.22", 210 | "@smithy/util-defaults-mode-node": "^2.0.29", 211 | "@smithy/util-endpoints": "^1.0.7", 212 | "@smithy/util-retry": "^2.0.8", 213 | "@smithy/util-utf8": "^2.0.2", 214 | "tslib": "^2.5.0" 215 | }, 216 | "engines": { 217 | "node": ">=14.0.0" 218 | } 219 | }, 220 | "node_modules/@aws-sdk/client-sts": { 221 | "version": "3.478.0", 222 | "resolved": "https://registry.npmjs.org/@aws-sdk/client-sts/-/client-sts-3.478.0.tgz", 223 | "integrity": "sha512-D+QID0dYzmn9dcxgKP3/nMndUqiQbDLsqI0Zf2pG4MW5gPhVNKlDGIV3Ztz8SkMjzGJExNOLW2L569o8jshJVw==", 224 | "dependencies": { 225 | "@aws-crypto/sha256-browser": "3.0.0", 226 | "@aws-crypto/sha256-js": "3.0.0", 227 | "@aws-sdk/core": "3.477.0", 228 | "@aws-sdk/credential-provider-node": "3.478.0", 229 | "@aws-sdk/middleware-host-header": "3.468.0", 230 | "@aws-sdk/middleware-logger": "3.468.0", 231 | "@aws-sdk/middleware-recursion-detection": "3.468.0", 232 | "@aws-sdk/middleware-user-agent": "3.478.0", 233 | "@aws-sdk/region-config-resolver": "3.470.0", 234 | "@aws-sdk/types": "3.468.0", 235 | "@aws-sdk/util-endpoints": "3.478.0", 236 | "@aws-sdk/util-user-agent-browser": "3.468.0", 237 | "@aws-sdk/util-user-agent-node": "3.470.0", 238 | "@smithy/config-resolver": "^2.0.21", 239 | "@smithy/core": "^1.2.0", 240 | "@smithy/fetch-http-handler": "^2.3.1", 241 | "@smithy/hash-node": "^2.0.17", 242 | "@smithy/invalid-dependency": "^2.0.15", 243 | "@smithy/middleware-content-length": "^2.0.17", 244 | "@smithy/middleware-endpoint": "^2.2.3", 245 | "@smithy/middleware-retry": "^2.0.24", 246 | "@smithy/middleware-serde": "^2.0.15", 247 | "@smithy/middleware-stack": "^2.0.9", 248 | "@smithy/node-config-provider": "^2.1.8", 249 | "@smithy/node-http-handler": "^2.2.1", 250 | "@smithy/protocol-http": "^3.0.11", 251 | "@smithy/smithy-client": "^2.1.18", 252 | "@smithy/types": "^2.7.0", 253 | "@smithy/url-parser": "^2.0.15", 254 | "@smithy/util-base64": "^2.0.1", 255 | "@smithy/util-body-length-browser": "^2.0.1", 256 | "@smithy/util-body-length-node": "^2.1.0", 257 | "@smithy/util-defaults-mode-browser": "^2.0.22", 258 | "@smithy/util-defaults-mode-node": "^2.0.29", 259 | "@smithy/util-endpoints": "^1.0.7", 260 | "@smithy/util-middleware": "^2.0.8", 261 | "@smithy/util-retry": "^2.0.8", 262 | "@smithy/util-utf8": "^2.0.2", 263 | "fast-xml-parser": "4.2.5", 264 | "tslib": "^2.5.0" 265 | }, 266 | "engines": { 267 | "node": ">=14.0.0" 268 | } 269 | }, 270 | "node_modules/@aws-sdk/core": { 271 | "version": "3.477.0", 272 | "resolved": "https://registry.npmjs.org/@aws-sdk/core/-/core-3.477.0.tgz", 273 | "integrity": "sha512-o0434EH+d1BxHZvgG7z8vph2SYefciQ5RnJw2MgvETGnthgqsnI4nnNJLSw0FVeqCeS18n6vRtzqlGYR2YPCNg==", 274 | "dependencies": { 275 | "@smithy/core": "^1.2.0", 276 | "@smithy/protocol-http": "^3.0.11", 277 | "@smithy/signature-v4": "^2.0.0", 278 | "@smithy/smithy-client": "^2.1.18", 279 | "@smithy/types": "^2.7.0", 280 | "tslib": "^2.5.0" 281 | }, 282 | "engines": { 283 | "node": ">=14.0.0" 284 | } 285 | }, 286 | "node_modules/@aws-sdk/credential-provider-env": { 287 | "version": "3.468.0", 288 | "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-env/-/credential-provider-env-3.468.0.tgz", 289 | "integrity": "sha512-k/1WHd3KZn0EQYjadooj53FC0z24/e4dUZhbSKTULgmxyO62pwh9v3Brvw4WRa/8o2wTffU/jo54tf4vGuP/ZA==", 290 | "dependencies": { 291 | "@aws-sdk/types": "3.468.0", 292 | "@smithy/property-provider": "^2.0.0", 293 | "@smithy/types": "^2.7.0", 294 | "tslib": "^2.5.0" 295 | }, 296 | "engines": { 297 | "node": ">=14.0.0" 298 | } 299 | }, 300 | "node_modules/@aws-sdk/credential-provider-ini": { 301 | "version": "3.478.0", 302 | "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-ini/-/credential-provider-ini-3.478.0.tgz", 303 | "integrity": "sha512-SsrYEYUvTG9ZoPC+zB19AnVoOKID+QIEHJDIi1GCZXW5kTVyr1saTVm4orG2TjYvbHQMddsWtHOvGYXZWAYMbw==", 304 | "dependencies": { 305 | "@aws-sdk/credential-provider-env": "3.468.0", 306 | "@aws-sdk/credential-provider-process": "3.468.0", 307 | "@aws-sdk/credential-provider-sso": "3.478.0", 308 | "@aws-sdk/credential-provider-web-identity": "3.468.0", 309 | "@aws-sdk/types": "3.468.0", 310 | "@smithy/credential-provider-imds": "^2.0.0", 311 | "@smithy/property-provider": "^2.0.0", 312 | "@smithy/shared-ini-file-loader": "^2.0.6", 313 | "@smithy/types": "^2.7.0", 314 | "tslib": "^2.5.0" 315 | }, 316 | "engines": { 317 | "node": ">=14.0.0" 318 | } 319 | }, 320 | "node_modules/@aws-sdk/credential-provider-node": { 321 | "version": "3.478.0", 322 | "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-node/-/credential-provider-node-3.478.0.tgz", 323 | "integrity": "sha512-nwDutJYeHiIZCQDgKIUrsgwAWTil0mNe+cbd+j8fi+wwxkWUzip+F0+z02molJ8WrUUKNRhqB1V5aVx7IranuA==", 324 | "dependencies": { 325 | "@aws-sdk/credential-provider-env": "3.468.0", 326 | "@aws-sdk/credential-provider-ini": "3.478.0", 327 | "@aws-sdk/credential-provider-process": "3.468.0", 328 | "@aws-sdk/credential-provider-sso": "3.478.0", 329 | "@aws-sdk/credential-provider-web-identity": "3.468.0", 330 | "@aws-sdk/types": "3.468.0", 331 | "@smithy/credential-provider-imds": "^2.0.0", 332 | "@smithy/property-provider": "^2.0.0", 333 | "@smithy/shared-ini-file-loader": "^2.0.6", 334 | "@smithy/types": "^2.7.0", 335 | "tslib": "^2.5.0" 336 | }, 337 | "engines": { 338 | "node": ">=14.0.0" 339 | } 340 | }, 341 | "node_modules/@aws-sdk/credential-provider-process": { 342 | "version": "3.468.0", 343 | "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-process/-/credential-provider-process-3.468.0.tgz", 344 | "integrity": "sha512-OYSn1A/UsyPJ7Z8Q2cNhTf55O36shPmSsvOfND04nSfu1nPaR+VUvvsP7v+brhGpwC/GAKTIdGAo4blH31BS6A==", 345 | "dependencies": { 346 | "@aws-sdk/types": "3.468.0", 347 | "@smithy/property-provider": "^2.0.0", 348 | "@smithy/shared-ini-file-loader": "^2.0.6", 349 | "@smithy/types": "^2.7.0", 350 | "tslib": "^2.5.0" 351 | }, 352 | "engines": { 353 | "node": ">=14.0.0" 354 | } 355 | }, 356 | "node_modules/@aws-sdk/credential-provider-sso": { 357 | "version": "3.478.0", 358 | "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-sso/-/credential-provider-sso-3.478.0.tgz", 359 | "integrity": "sha512-LsDShG51X/q+s5ZFN7kHVqrd8ZHdyEyHqdhoocmRvvw2Dif50M0AqQfvCrW1ndj5CNzXO4x/eH8EK5ZOVlS6Sg==", 360 | "dependencies": { 361 | "@aws-sdk/client-sso": "3.478.0", 362 | "@aws-sdk/token-providers": "3.478.0", 363 | "@aws-sdk/types": "3.468.0", 364 | "@smithy/property-provider": "^2.0.0", 365 | "@smithy/shared-ini-file-loader": "^2.0.6", 366 | "@smithy/types": "^2.7.0", 367 | "tslib": "^2.5.0" 368 | }, 369 | "engines": { 370 | "node": ">=14.0.0" 371 | } 372 | }, 373 | "node_modules/@aws-sdk/credential-provider-web-identity": { 374 | "version": "3.468.0", 375 | "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-web-identity/-/credential-provider-web-identity-3.468.0.tgz", 376 | "integrity": "sha512-rexymPmXjtkwCPfhnUq3EjO1rSkf39R4Jz9CqiM7OsqK2qlT5Y/V3gnMKn0ZMXsYaQOMfM3cT5xly5R+OKDHlw==", 377 | "dependencies": { 378 | "@aws-sdk/types": "3.468.0", 379 | "@smithy/property-provider": "^2.0.0", 380 | "@smithy/types": "^2.7.0", 381 | "tslib": "^2.5.0" 382 | }, 383 | "engines": { 384 | "node": ">=14.0.0" 385 | } 386 | }, 387 | "node_modules/@aws-sdk/middleware-host-header": { 388 | "version": "3.468.0", 389 | "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-host-header/-/middleware-host-header-3.468.0.tgz", 390 | "integrity": "sha512-gwQ+/QhX+lhof304r6zbZ/V5l5cjhGRxLL3CjH1uJPMcOAbw9wUlMdl+ibr8UwBZ5elfKFGiB1cdW/0uMchw0w==", 391 | "dependencies": { 392 | "@aws-sdk/types": "3.468.0", 393 | "@smithy/protocol-http": "^3.0.11", 394 | "@smithy/types": "^2.7.0", 395 | "tslib": "^2.5.0" 396 | }, 397 | "engines": { 398 | "node": ">=14.0.0" 399 | } 400 | }, 401 | "node_modules/@aws-sdk/middleware-logger": { 402 | "version": "3.468.0", 403 | "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-logger/-/middleware-logger-3.468.0.tgz", 404 | "integrity": "sha512-X5XHKV7DHRXI3f29SAhJPe/OxWRFgDWDMMCALfzhmJfCi6Jfh0M14cJKoC+nl+dk9lB+36+jKjhjETZaL2bPlA==", 405 | "dependencies": { 406 | "@aws-sdk/types": "3.468.0", 407 | "@smithy/types": "^2.7.0", 408 | "tslib": "^2.5.0" 409 | }, 410 | "engines": { 411 | "node": ">=14.0.0" 412 | } 413 | }, 414 | "node_modules/@aws-sdk/middleware-recursion-detection": { 415 | "version": "3.468.0", 416 | "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-recursion-detection/-/middleware-recursion-detection-3.468.0.tgz", 417 | "integrity": "sha512-vch9IQib2Ng9ucSyRW2eKNQXHUPb5jUPCLA5otTW/8nGjcOU37LxQG4WrxO7uaJ9Oe8hjHO+hViE3P0KISUhtA==", 418 | "dependencies": { 419 | "@aws-sdk/types": "3.468.0", 420 | "@smithy/protocol-http": "^3.0.11", 421 | "@smithy/types": "^2.7.0", 422 | "tslib": "^2.5.0" 423 | }, 424 | "engines": { 425 | "node": ">=14.0.0" 426 | } 427 | }, 428 | "node_modules/@aws-sdk/middleware-signing": { 429 | "version": "3.468.0", 430 | "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-signing/-/middleware-signing-3.468.0.tgz", 431 | "integrity": "sha512-s+7fSB1gdnnTj5O0aCCarX3z5Vppop8kazbNSZADdkfHIDWCN80IH4ZNjY3OWqaAz0HmR4LNNrovdR304ojb4Q==", 432 | "dependencies": { 433 | "@aws-sdk/types": "3.468.0", 434 | "@smithy/property-provider": "^2.0.0", 435 | "@smithy/protocol-http": "^3.0.11", 436 | "@smithy/signature-v4": "^2.0.0", 437 | "@smithy/types": "^2.7.0", 438 | "@smithy/util-middleware": "^2.0.8", 439 | "tslib": "^2.5.0" 440 | }, 441 | "engines": { 442 | "node": ">=14.0.0" 443 | } 444 | }, 445 | "node_modules/@aws-sdk/middleware-user-agent": { 446 | "version": "3.478.0", 447 | "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-user-agent/-/middleware-user-agent-3.478.0.tgz", 448 | "integrity": "sha512-Rec+nAPIzzwxgHPW+xqY6tooJGFOytpYg/xSRv8/IXl3xKGhmpMGs6gDWzmMBv/qy5nKTvLph/csNWJ98GWXCw==", 449 | "dependencies": { 450 | "@aws-sdk/types": "3.468.0", 451 | "@aws-sdk/util-endpoints": "3.478.0", 452 | "@smithy/protocol-http": "^3.0.11", 453 | "@smithy/types": "^2.7.0", 454 | "tslib": "^2.5.0" 455 | }, 456 | "engines": { 457 | "node": ">=14.0.0" 458 | } 459 | }, 460 | "node_modules/@aws-sdk/region-config-resolver": { 461 | "version": "3.470.0", 462 | "resolved": "https://registry.npmjs.org/@aws-sdk/region-config-resolver/-/region-config-resolver-3.470.0.tgz", 463 | "integrity": "sha512-C1o1J06iIw8cyAAOvHqT4Bbqf+PgQ/RDlSyjt2gFfP2OovDpc2o2S90dE8f8iZdSGpg70N5MikT1DBhW9NbhtQ==", 464 | "dependencies": { 465 | "@smithy/node-config-provider": "^2.1.8", 466 | "@smithy/types": "^2.7.0", 467 | "@smithy/util-config-provider": "^2.0.0", 468 | "@smithy/util-middleware": "^2.0.8", 469 | "tslib": "^2.5.0" 470 | }, 471 | "engines": { 472 | "node": ">=14.0.0" 473 | } 474 | }, 475 | "node_modules/@aws-sdk/token-providers": { 476 | "version": "3.478.0", 477 | "resolved": "https://registry.npmjs.org/@aws-sdk/token-providers/-/token-providers-3.478.0.tgz", 478 | "integrity": "sha512-7b5tj1y/wGHZIZ+ckjOUKgKrMuCJMF/G1UKZKIqqdekeEsjcThbvoxAMeY0FEowu2ODVk/ggOmpBFxcu0iYd6A==", 479 | "dependencies": { 480 | "@aws-crypto/sha256-browser": "3.0.0", 481 | "@aws-crypto/sha256-js": "3.0.0", 482 | "@aws-sdk/middleware-host-header": "3.468.0", 483 | "@aws-sdk/middleware-logger": "3.468.0", 484 | "@aws-sdk/middleware-recursion-detection": "3.468.0", 485 | "@aws-sdk/middleware-user-agent": "3.478.0", 486 | "@aws-sdk/region-config-resolver": "3.470.0", 487 | "@aws-sdk/types": "3.468.0", 488 | "@aws-sdk/util-endpoints": "3.478.0", 489 | "@aws-sdk/util-user-agent-browser": "3.468.0", 490 | "@aws-sdk/util-user-agent-node": "3.470.0", 491 | "@smithy/config-resolver": "^2.0.21", 492 | "@smithy/fetch-http-handler": "^2.3.1", 493 | "@smithy/hash-node": "^2.0.17", 494 | "@smithy/invalid-dependency": "^2.0.15", 495 | "@smithy/middleware-content-length": "^2.0.17", 496 | "@smithy/middleware-endpoint": "^2.2.3", 497 | "@smithy/middleware-retry": "^2.0.24", 498 | "@smithy/middleware-serde": "^2.0.15", 499 | "@smithy/middleware-stack": "^2.0.9", 500 | "@smithy/node-config-provider": "^2.1.8", 501 | "@smithy/node-http-handler": "^2.2.1", 502 | "@smithy/property-provider": "^2.0.0", 503 | "@smithy/protocol-http": "^3.0.11", 504 | "@smithy/shared-ini-file-loader": "^2.0.6", 505 | "@smithy/smithy-client": "^2.1.18", 506 | "@smithy/types": "^2.7.0", 507 | "@smithy/url-parser": "^2.0.15", 508 | "@smithy/util-base64": "^2.0.1", 509 | "@smithy/util-body-length-browser": "^2.0.1", 510 | "@smithy/util-body-length-node": "^2.1.0", 511 | "@smithy/util-defaults-mode-browser": "^2.0.22", 512 | "@smithy/util-defaults-mode-node": "^2.0.29", 513 | "@smithy/util-endpoints": "^1.0.7", 514 | "@smithy/util-retry": "^2.0.8", 515 | "@smithy/util-utf8": "^2.0.2", 516 | "tslib": "^2.5.0" 517 | }, 518 | "engines": { 519 | "node": ">=14.0.0" 520 | } 521 | }, 522 | "node_modules/@aws-sdk/types": { 523 | "version": "3.468.0", 524 | "resolved": "https://registry.npmjs.org/@aws-sdk/types/-/types-3.468.0.tgz", 525 | "integrity": "sha512-rx/9uHI4inRbp2tw3Y4Ih4PNZkVj32h7WneSg3MVgVjAoVD5Zti9KhS5hkvsBxfgmQmg0AQbE+b1sy5WGAgntA==", 526 | "dependencies": { 527 | "@smithy/types": "^2.7.0", 528 | "tslib": "^2.5.0" 529 | }, 530 | "engines": { 531 | "node": ">=14.0.0" 532 | } 533 | }, 534 | "node_modules/@aws-sdk/util-endpoints": { 535 | "version": "3.478.0", 536 | "resolved": "https://registry.npmjs.org/@aws-sdk/util-endpoints/-/util-endpoints-3.478.0.tgz", 537 | "integrity": "sha512-u9Mcg3euGJGs5clPt9mBuhBjHiEKiD0PnfvArhfq9i+dcY5mbCq/i1Dezp3iv1fZH9xxQt7hPXDfSpt1yUSM6g==", 538 | "dependencies": { 539 | "@aws-sdk/types": "3.468.0", 540 | "@smithy/util-endpoints": "^1.0.7", 541 | "tslib": "^2.5.0" 542 | }, 543 | "engines": { 544 | "node": ">=14.0.0" 545 | } 546 | }, 547 | "node_modules/@aws-sdk/util-locate-window": { 548 | "version": "3.465.0", 549 | "resolved": "https://registry.npmjs.org/@aws-sdk/util-locate-window/-/util-locate-window-3.465.0.tgz", 550 | "integrity": "sha512-f+QNcWGswredzC1ExNAB/QzODlxwaTdXkNT5cvke2RLX8SFU5pYk6h4uCtWC0vWPELzOfMfloBrJefBzlarhsw==", 551 | "dependencies": { 552 | "tslib": "^2.5.0" 553 | }, 554 | "engines": { 555 | "node": ">=14.0.0" 556 | } 557 | }, 558 | "node_modules/@aws-sdk/util-user-agent-browser": { 559 | "version": "3.468.0", 560 | "resolved": "https://registry.npmjs.org/@aws-sdk/util-user-agent-browser/-/util-user-agent-browser-3.468.0.tgz", 561 | "integrity": "sha512-OJyhWWsDEizR3L+dCgMXSUmaCywkiZ7HSbnQytbeKGwokIhD69HTiJcibF/sgcM5gk4k3Mq3puUhGnEZ46GIig==", 562 | "dependencies": { 563 | "@aws-sdk/types": "3.468.0", 564 | "@smithy/types": "^2.7.0", 565 | "bowser": "^2.11.0", 566 | "tslib": "^2.5.0" 567 | } 568 | }, 569 | "node_modules/@aws-sdk/util-user-agent-node": { 570 | "version": "3.470.0", 571 | "resolved": "https://registry.npmjs.org/@aws-sdk/util-user-agent-node/-/util-user-agent-node-3.470.0.tgz", 572 | "integrity": "sha512-QxsZ9iVHcBB/XRdYvwfM5AMvNp58HfqkIrH88mY0cmxuvtlIGDfWjczdDrZMJk9y0vIq+cuoCHsGXHu7PyiEAQ==", 573 | "dependencies": { 574 | "@aws-sdk/types": "3.468.0", 575 | "@smithy/node-config-provider": "^2.1.8", 576 | "@smithy/types": "^2.7.0", 577 | "tslib": "^2.5.0" 578 | }, 579 | "engines": { 580 | "node": ">=14.0.0" 581 | }, 582 | "peerDependencies": { 583 | "aws-crt": ">=1.0.0" 584 | }, 585 | "peerDependenciesMeta": { 586 | "aws-crt": { 587 | "optional": true 588 | } 589 | } 590 | }, 591 | "node_modules/@aws-sdk/util-utf8-browser": { 592 | "version": "3.259.0", 593 | "resolved": "https://registry.npmjs.org/@aws-sdk/util-utf8-browser/-/util-utf8-browser-3.259.0.tgz", 594 | "integrity": "sha512-UvFa/vR+e19XookZF8RzFZBrw2EUkQWxiBW0yYQAhvk3C+QVGl0H3ouca8LDBlBfQKXwmW3huo/59H8rwb1wJw==", 595 | "dependencies": { 596 | "tslib": "^2.3.1" 597 | } 598 | }, 599 | "node_modules/@esbuild/aix-ppc64": { 600 | "version": "0.19.11", 601 | "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.19.11.tgz", 602 | "integrity": "sha512-FnzU0LyE3ySQk7UntJO4+qIiQgI7KoODnZg5xzXIrFJlKd2P2gwHsHY4927xj9y5PJmJSzULiUCWmv7iWnNa7g==", 603 | "cpu": [ 604 | "ppc64" 605 | ], 606 | "optional": true, 607 | "os": [ 608 | "aix" 609 | ], 610 | "engines": { 611 | "node": ">=12" 612 | } 613 | }, 614 | "node_modules/@esbuild/android-arm": { 615 | "version": "0.19.11", 616 | "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.19.11.tgz", 617 | "integrity": "sha512-5OVapq0ClabvKvQ58Bws8+wkLCV+Rxg7tUVbo9xu034Nm536QTII4YzhaFriQ7rMrorfnFKUsArD2lqKbFY4vw==", 618 | "cpu": [ 619 | "arm" 620 | ], 621 | "optional": true, 622 | "os": [ 623 | "android" 624 | ], 625 | "engines": { 626 | "node": ">=12" 627 | } 628 | }, 629 | "node_modules/@esbuild/android-arm64": { 630 | "version": "0.19.11", 631 | "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.19.11.tgz", 632 | "integrity": "sha512-aiu7K/5JnLj//KOnOfEZ0D90obUkRzDMyqd/wNAUQ34m4YUPVhRZpnqKV9uqDGxT7cToSDnIHsGooyIczu9T+Q==", 633 | "cpu": [ 634 | "arm64" 635 | ], 636 | "optional": true, 637 | "os": [ 638 | "android" 639 | ], 640 | "engines": { 641 | "node": ">=12" 642 | } 643 | }, 644 | "node_modules/@esbuild/android-x64": { 645 | "version": "0.19.11", 646 | "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.19.11.tgz", 647 | "integrity": "sha512-eccxjlfGw43WYoY9QgB82SgGgDbibcqyDTlk3l3C0jOVHKxrjdc9CTwDUQd0vkvYg5um0OH+GpxYvp39r+IPOg==", 648 | "cpu": [ 649 | "x64" 650 | ], 651 | "optional": true, 652 | "os": [ 653 | "android" 654 | ], 655 | "engines": { 656 | "node": ">=12" 657 | } 658 | }, 659 | "node_modules/@esbuild/darwin-arm64": { 660 | "version": "0.19.11", 661 | "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.19.11.tgz", 662 | "integrity": "sha512-ETp87DRWuSt9KdDVkqSoKoLFHYTrkyz2+65fj9nfXsaV3bMhTCjtQfw3y+um88vGRKRiF7erPrh/ZuIdLUIVxQ==", 663 | "cpu": [ 664 | "arm64" 665 | ], 666 | "optional": true, 667 | "os": [ 668 | "darwin" 669 | ], 670 | "engines": { 671 | "node": ">=12" 672 | } 673 | }, 674 | "node_modules/@esbuild/darwin-x64": { 675 | "version": "0.19.11", 676 | "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.19.11.tgz", 677 | "integrity": "sha512-fkFUiS6IUK9WYUO/+22omwetaSNl5/A8giXvQlcinLIjVkxwTLSktbF5f/kJMftM2MJp9+fXqZ5ezS7+SALp4g==", 678 | "cpu": [ 679 | "x64" 680 | ], 681 | "optional": true, 682 | "os": [ 683 | "darwin" 684 | ], 685 | "engines": { 686 | "node": ">=12" 687 | } 688 | }, 689 | "node_modules/@esbuild/freebsd-arm64": { 690 | "version": "0.19.11", 691 | "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.19.11.tgz", 692 | "integrity": "sha512-lhoSp5K6bxKRNdXUtHoNc5HhbXVCS8V0iZmDvyWvYq9S5WSfTIHU2UGjcGt7UeS6iEYp9eeymIl5mJBn0yiuxA==", 693 | "cpu": [ 694 | "arm64" 695 | ], 696 | "optional": true, 697 | "os": [ 698 | "freebsd" 699 | ], 700 | "engines": { 701 | "node": ">=12" 702 | } 703 | }, 704 | "node_modules/@esbuild/freebsd-x64": { 705 | "version": "0.19.11", 706 | "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.19.11.tgz", 707 | "integrity": "sha512-JkUqn44AffGXitVI6/AbQdoYAq0TEullFdqcMY/PCUZ36xJ9ZJRtQabzMA+Vi7r78+25ZIBosLTOKnUXBSi1Kw==", 708 | "cpu": [ 709 | "x64" 710 | ], 711 | "optional": true, 712 | "os": [ 713 | "freebsd" 714 | ], 715 | "engines": { 716 | "node": ">=12" 717 | } 718 | }, 719 | "node_modules/@esbuild/linux-arm": { 720 | "version": "0.19.11", 721 | "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.19.11.tgz", 722 | "integrity": "sha512-3CRkr9+vCV2XJbjwgzjPtO8T0SZUmRZla+UL1jw+XqHZPkPgZiyWvbDvl9rqAN8Zl7qJF0O/9ycMtjU67HN9/Q==", 723 | "cpu": [ 724 | "arm" 725 | ], 726 | "optional": true, 727 | "os": [ 728 | "linux" 729 | ], 730 | "engines": { 731 | "node": ">=12" 732 | } 733 | }, 734 | "node_modules/@esbuild/linux-arm64": { 735 | "version": "0.19.11", 736 | "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.19.11.tgz", 737 | "integrity": "sha512-LneLg3ypEeveBSMuoa0kwMpCGmpu8XQUh+mL8XXwoYZ6Be2qBnVtcDI5azSvh7vioMDhoJFZzp9GWp9IWpYoUg==", 738 | "cpu": [ 739 | "arm64" 740 | ], 741 | "optional": true, 742 | "os": [ 743 | "linux" 744 | ], 745 | "engines": { 746 | "node": ">=12" 747 | } 748 | }, 749 | "node_modules/@esbuild/linux-ia32": { 750 | "version": "0.19.11", 751 | "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.19.11.tgz", 752 | "integrity": "sha512-caHy++CsD8Bgq2V5CodbJjFPEiDPq8JJmBdeyZ8GWVQMjRD0sU548nNdwPNvKjVpamYYVL40AORekgfIubwHoA==", 753 | "cpu": [ 754 | "ia32" 755 | ], 756 | "optional": true, 757 | "os": [ 758 | "linux" 759 | ], 760 | "engines": { 761 | "node": ">=12" 762 | } 763 | }, 764 | "node_modules/@esbuild/linux-loong64": { 765 | "version": "0.19.11", 766 | "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.19.11.tgz", 767 | "integrity": "sha512-ppZSSLVpPrwHccvC6nQVZaSHlFsvCQyjnvirnVjbKSHuE5N24Yl8F3UwYUUR1UEPaFObGD2tSvVKbvR+uT1Nrg==", 768 | "cpu": [ 769 | "loong64" 770 | ], 771 | "optional": true, 772 | "os": [ 773 | "linux" 774 | ], 775 | "engines": { 776 | "node": ">=12" 777 | } 778 | }, 779 | "node_modules/@esbuild/linux-mips64el": { 780 | "version": "0.19.11", 781 | "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.19.11.tgz", 782 | "integrity": "sha512-B5x9j0OgjG+v1dF2DkH34lr+7Gmv0kzX6/V0afF41FkPMMqaQ77pH7CrhWeR22aEeHKaeZVtZ6yFwlxOKPVFyg==", 783 | "cpu": [ 784 | "mips64el" 785 | ], 786 | "optional": true, 787 | "os": [ 788 | "linux" 789 | ], 790 | "engines": { 791 | "node": ">=12" 792 | } 793 | }, 794 | "node_modules/@esbuild/linux-ppc64": { 795 | "version": "0.19.11", 796 | "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.19.11.tgz", 797 | "integrity": "sha512-MHrZYLeCG8vXblMetWyttkdVRjQlQUb/oMgBNurVEnhj4YWOr4G5lmBfZjHYQHHN0g6yDmCAQRR8MUHldvvRDA==", 798 | "cpu": [ 799 | "ppc64" 800 | ], 801 | "optional": true, 802 | "os": [ 803 | "linux" 804 | ], 805 | "engines": { 806 | "node": ">=12" 807 | } 808 | }, 809 | "node_modules/@esbuild/linux-riscv64": { 810 | "version": "0.19.11", 811 | "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.19.11.tgz", 812 | "integrity": "sha512-f3DY++t94uVg141dozDu4CCUkYW+09rWtaWfnb3bqe4w5NqmZd6nPVBm+qbz7WaHZCoqXqHz5p6CM6qv3qnSSQ==", 813 | "cpu": [ 814 | "riscv64" 815 | ], 816 | "optional": true, 817 | "os": [ 818 | "linux" 819 | ], 820 | "engines": { 821 | "node": ">=12" 822 | } 823 | }, 824 | "node_modules/@esbuild/linux-s390x": { 825 | "version": "0.19.11", 826 | "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.19.11.tgz", 827 | "integrity": "sha512-A5xdUoyWJHMMlcSMcPGVLzYzpcY8QP1RtYzX5/bS4dvjBGVxdhuiYyFwp7z74ocV7WDc0n1harxmpq2ePOjI0Q==", 828 | "cpu": [ 829 | "s390x" 830 | ], 831 | "optional": true, 832 | "os": [ 833 | "linux" 834 | ], 835 | "engines": { 836 | "node": ">=12" 837 | } 838 | }, 839 | "node_modules/@esbuild/linux-x64": { 840 | "version": "0.19.11", 841 | "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.19.11.tgz", 842 | "integrity": "sha512-grbyMlVCvJSfxFQUndw5mCtWs5LO1gUlwP4CDi4iJBbVpZcqLVT29FxgGuBJGSzyOxotFG4LoO5X+M1350zmPA==", 843 | "cpu": [ 844 | "x64" 845 | ], 846 | "optional": true, 847 | "os": [ 848 | "linux" 849 | ], 850 | "engines": { 851 | "node": ">=12" 852 | } 853 | }, 854 | "node_modules/@esbuild/netbsd-x64": { 855 | "version": "0.19.11", 856 | "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.19.11.tgz", 857 | "integrity": "sha512-13jvrQZJc3P230OhU8xgwUnDeuC/9egsjTkXN49b3GcS5BKvJqZn86aGM8W9pd14Kd+u7HuFBMVtrNGhh6fHEQ==", 858 | "cpu": [ 859 | "x64" 860 | ], 861 | "optional": true, 862 | "os": [ 863 | "netbsd" 864 | ], 865 | "engines": { 866 | "node": ">=12" 867 | } 868 | }, 869 | "node_modules/@esbuild/openbsd-x64": { 870 | "version": "0.19.11", 871 | "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.19.11.tgz", 872 | "integrity": "sha512-ysyOGZuTp6SNKPE11INDUeFVVQFrhcNDVUgSQVDzqsqX38DjhPEPATpid04LCoUr2WXhQTEZ8ct/EgJCUDpyNw==", 873 | "cpu": [ 874 | "x64" 875 | ], 876 | "optional": true, 877 | "os": [ 878 | "openbsd" 879 | ], 880 | "engines": { 881 | "node": ">=12" 882 | } 883 | }, 884 | "node_modules/@esbuild/sunos-x64": { 885 | "version": "0.19.11", 886 | "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.19.11.tgz", 887 | "integrity": "sha512-Hf+Sad9nVwvtxy4DXCZQqLpgmRTQqyFyhT3bZ4F2XlJCjxGmRFF0Shwn9rzhOYRB61w9VMXUkxlBy56dk9JJiQ==", 888 | "cpu": [ 889 | "x64" 890 | ], 891 | "optional": true, 892 | "os": [ 893 | "sunos" 894 | ], 895 | "engines": { 896 | "node": ">=12" 897 | } 898 | }, 899 | "node_modules/@esbuild/win32-arm64": { 900 | "version": "0.19.11", 901 | "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.19.11.tgz", 902 | "integrity": "sha512-0P58Sbi0LctOMOQbpEOvOL44Ne0sqbS0XWHMvvrg6NE5jQ1xguCSSw9jQeUk2lfrXYsKDdOe6K+oZiwKPilYPQ==", 903 | "cpu": [ 904 | "arm64" 905 | ], 906 | "optional": true, 907 | "os": [ 908 | "win32" 909 | ], 910 | "engines": { 911 | "node": ">=12" 912 | } 913 | }, 914 | "node_modules/@esbuild/win32-ia32": { 915 | "version": "0.19.11", 916 | "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.19.11.tgz", 917 | "integrity": "sha512-6YOrWS+sDJDmshdBIQU+Uoyh7pQKrdykdefC1avn76ss5c+RN6gut3LZA4E2cH5xUEp5/cA0+YxRaVtRAb0xBg==", 918 | "cpu": [ 919 | "ia32" 920 | ], 921 | "optional": true, 922 | "os": [ 923 | "win32" 924 | ], 925 | "engines": { 926 | "node": ">=12" 927 | } 928 | }, 929 | "node_modules/@esbuild/win32-x64": { 930 | "version": "0.19.11", 931 | "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.19.11.tgz", 932 | "integrity": "sha512-vfkhltrjCAb603XaFhqhAF4LGDi2M4OrCRrFusyQ+iTLQ/o60QQXxc9cZC/FFpihBI9N1Grn6SMKVJ4KP7Fuiw==", 933 | "cpu": [ 934 | "x64" 935 | ], 936 | "optional": true, 937 | "os": [ 938 | "win32" 939 | ], 940 | "engines": { 941 | "node": ">=12" 942 | } 943 | }, 944 | "node_modules/@heroicons/react": { 945 | "version": "2.1.1", 946 | "resolved": "https://registry.npmjs.org/@heroicons/react/-/react-2.1.1.tgz", 947 | "integrity": "sha512-JyyN9Lo66kirbCMuMMRPtJxtKJoIsXKS569ebHGGRKbl8s4CtUfLnyKJxteA+vIKySocO4s1SkTkGS4xtG/yEA==", 948 | "peerDependencies": { 949 | "react": ">= 16" 950 | } 951 | }, 952 | "node_modules/@next/env": { 953 | "version": "14.0.4", 954 | "resolved": "https://registry.npmjs.org/@next/env/-/env-14.0.4.tgz", 955 | "integrity": "sha512-irQnbMLbUNQpP1wcE5NstJtbuA/69kRfzBrpAD7Gsn8zm/CY6YQYc3HQBz8QPxwISG26tIm5afvvVbu508oBeQ==" 956 | }, 957 | "node_modules/@next/swc-darwin-arm64": { 958 | "version": "14.0.4", 959 | "resolved": "https://registry.npmjs.org/@next/swc-darwin-arm64/-/swc-darwin-arm64-14.0.4.tgz", 960 | "integrity": "sha512-mF05E/5uPthWzyYDyptcwHptucf/jj09i2SXBPwNzbgBNc+XnwzrL0U6BmPjQeOL+FiB+iG1gwBeq7mlDjSRPg==", 961 | "cpu": [ 962 | "arm64" 963 | ], 964 | "optional": true, 965 | "os": [ 966 | "darwin" 967 | ], 968 | "engines": { 969 | "node": ">= 10" 970 | } 971 | }, 972 | "node_modules/@next/swc-darwin-x64": { 973 | "version": "14.0.4", 974 | "resolved": "https://registry.npmjs.org/@next/swc-darwin-x64/-/swc-darwin-x64-14.0.4.tgz", 975 | "integrity": "sha512-IZQ3C7Bx0k2rYtrZZxKKiusMTM9WWcK5ajyhOZkYYTCc8xytmwSzR1skU7qLgVT/EY9xtXDG0WhY6fyujnI3rw==", 976 | "cpu": [ 977 | "x64" 978 | ], 979 | "optional": true, 980 | "os": [ 981 | "darwin" 982 | ], 983 | "engines": { 984 | "node": ">= 10" 985 | } 986 | }, 987 | "node_modules/@next/swc-linux-arm64-gnu": { 988 | "version": "14.0.4", 989 | "resolved": "https://registry.npmjs.org/@next/swc-linux-arm64-gnu/-/swc-linux-arm64-gnu-14.0.4.tgz", 990 | "integrity": "sha512-VwwZKrBQo/MGb1VOrxJ6LrKvbpo7UbROuyMRvQKTFKhNaXjUmKTu7wxVkIuCARAfiI8JpaWAnKR+D6tzpCcM4w==", 991 | "cpu": [ 992 | "arm64" 993 | ], 994 | "optional": true, 995 | "os": [ 996 | "linux" 997 | ], 998 | "engines": { 999 | "node": ">= 10" 1000 | } 1001 | }, 1002 | "node_modules/@next/swc-linux-arm64-musl": { 1003 | "version": "14.0.4", 1004 | "resolved": "https://registry.npmjs.org/@next/swc-linux-arm64-musl/-/swc-linux-arm64-musl-14.0.4.tgz", 1005 | "integrity": "sha512-8QftwPEW37XxXoAwsn+nXlodKWHfpMaSvt81W43Wh8dv0gkheD+30ezWMcFGHLI71KiWmHK5PSQbTQGUiidvLQ==", 1006 | "cpu": [ 1007 | "arm64" 1008 | ], 1009 | "optional": true, 1010 | "os": [ 1011 | "linux" 1012 | ], 1013 | "engines": { 1014 | "node": ">= 10" 1015 | } 1016 | }, 1017 | "node_modules/@next/swc-linux-x64-gnu": { 1018 | "version": "14.0.4", 1019 | "resolved": "https://registry.npmjs.org/@next/swc-linux-x64-gnu/-/swc-linux-x64-gnu-14.0.4.tgz", 1020 | "integrity": "sha512-/s/Pme3VKfZAfISlYVq2hzFS8AcAIOTnoKupc/j4WlvF6GQ0VouS2Q2KEgPuO1eMBwakWPB1aYFIA4VNVh667A==", 1021 | "cpu": [ 1022 | "x64" 1023 | ], 1024 | "optional": true, 1025 | "os": [ 1026 | "linux" 1027 | ], 1028 | "engines": { 1029 | "node": ">= 10" 1030 | } 1031 | }, 1032 | "node_modules/@next/swc-linux-x64-musl": { 1033 | "version": "14.0.4", 1034 | "resolved": "https://registry.npmjs.org/@next/swc-linux-x64-musl/-/swc-linux-x64-musl-14.0.4.tgz", 1035 | "integrity": "sha512-m8z/6Fyal4L9Bnlxde5g2Mfa1Z7dasMQyhEhskDATpqr+Y0mjOBZcXQ7G5U+vgL22cI4T7MfvgtrM2jdopqWaw==", 1036 | "cpu": [ 1037 | "x64" 1038 | ], 1039 | "optional": true, 1040 | "os": [ 1041 | "linux" 1042 | ], 1043 | "engines": { 1044 | "node": ">= 10" 1045 | } 1046 | }, 1047 | "node_modules/@next/swc-win32-arm64-msvc": { 1048 | "version": "14.0.4", 1049 | "resolved": "https://registry.npmjs.org/@next/swc-win32-arm64-msvc/-/swc-win32-arm64-msvc-14.0.4.tgz", 1050 | "integrity": "sha512-7Wv4PRiWIAWbm5XrGz3D8HUkCVDMMz9igffZG4NB1p4u1KoItwx9qjATHz88kwCEal/HXmbShucaslXCQXUM5w==", 1051 | "cpu": [ 1052 | "arm64" 1053 | ], 1054 | "optional": true, 1055 | "os": [ 1056 | "win32" 1057 | ], 1058 | "engines": { 1059 | "node": ">= 10" 1060 | } 1061 | }, 1062 | "node_modules/@next/swc-win32-ia32-msvc": { 1063 | "version": "14.0.4", 1064 | "resolved": "https://registry.npmjs.org/@next/swc-win32-ia32-msvc/-/swc-win32-ia32-msvc-14.0.4.tgz", 1065 | "integrity": "sha512-zLeNEAPULsl0phfGb4kdzF/cAVIfaC7hY+kt0/d+y9mzcZHsMS3hAS829WbJ31DkSlVKQeHEjZHIdhN+Pg7Gyg==", 1066 | "cpu": [ 1067 | "ia32" 1068 | ], 1069 | "optional": true, 1070 | "os": [ 1071 | "win32" 1072 | ], 1073 | "engines": { 1074 | "node": ">= 10" 1075 | } 1076 | }, 1077 | "node_modules/@next/swc-win32-x64-msvc": { 1078 | "version": "14.0.4", 1079 | "resolved": "https://registry.npmjs.org/@next/swc-win32-x64-msvc/-/swc-win32-x64-msvc-14.0.4.tgz", 1080 | "integrity": "sha512-yEh2+R8qDlDCjxVpzOTEpBLQTEFAcP2A8fUFLaWNap9GitYKkKv1//y2S6XY6zsR4rCOPRpU7plYDR+az2n30A==", 1081 | "cpu": [ 1082 | "x64" 1083 | ], 1084 | "optional": true, 1085 | "os": [ 1086 | "win32" 1087 | ], 1088 | "engines": { 1089 | "node": ">= 10" 1090 | } 1091 | }, 1092 | "node_modules/@smithy/abort-controller": { 1093 | "version": "2.0.16", 1094 | "resolved": "https://registry.npmjs.org/@smithy/abort-controller/-/abort-controller-2.0.16.tgz", 1095 | "integrity": "sha512-4foO7738k8kM9flMHu3VLabqu7nPgvIj8TB909S0CnKx0YZz/dcDH3pZ/4JHdatfxlZdKF1JWOYCw9+v3HVVsw==", 1096 | "dependencies": { 1097 | "@smithy/types": "^2.8.0", 1098 | "tslib": "^2.5.0" 1099 | }, 1100 | "engines": { 1101 | "node": ">=14.0.0" 1102 | } 1103 | }, 1104 | "node_modules/@smithy/config-resolver": { 1105 | "version": "2.0.23", 1106 | "resolved": "https://registry.npmjs.org/@smithy/config-resolver/-/config-resolver-2.0.23.tgz", 1107 | "integrity": "sha512-XakUqgtP2YY8Mi+Nlif5BiqJgWdvfxJafSpOSQeCOMizu+PUhE4fBQSy6xFcR+eInrwVadaABNxoJyGUMn15ew==", 1108 | "dependencies": { 1109 | "@smithy/node-config-provider": "^2.1.9", 1110 | "@smithy/types": "^2.8.0", 1111 | "@smithy/util-config-provider": "^2.1.0", 1112 | "@smithy/util-middleware": "^2.0.9", 1113 | "tslib": "^2.5.0" 1114 | }, 1115 | "engines": { 1116 | "node": ">=14.0.0" 1117 | } 1118 | }, 1119 | "node_modules/@smithy/core": { 1120 | "version": "1.2.2", 1121 | "resolved": "https://registry.npmjs.org/@smithy/core/-/core-1.2.2.tgz", 1122 | "integrity": "sha512-uLjrskLT+mWb0emTR5QaiAIxVEU7ndpptDaVDrTwwhD+RjvHhjIiGQ3YL5jKk1a5VSDQUA2RGkXvJ6XKRcz6Dg==", 1123 | "dependencies": { 1124 | "@smithy/middleware-endpoint": "^2.3.0", 1125 | "@smithy/middleware-retry": "^2.0.26", 1126 | "@smithy/middleware-serde": "^2.0.16", 1127 | "@smithy/protocol-http": "^3.0.12", 1128 | "@smithy/smithy-client": "^2.2.1", 1129 | "@smithy/types": "^2.8.0", 1130 | "@smithy/util-middleware": "^2.0.9", 1131 | "tslib": "^2.5.0" 1132 | }, 1133 | "engines": { 1134 | "node": ">=14.0.0" 1135 | } 1136 | }, 1137 | "node_modules/@smithy/credential-provider-imds": { 1138 | "version": "2.1.5", 1139 | "resolved": "https://registry.npmjs.org/@smithy/credential-provider-imds/-/credential-provider-imds-2.1.5.tgz", 1140 | "integrity": "sha512-VfvE6Wg1MUWwpTZFBnUD7zxvPhLY8jlHCzu6bCjlIYoWgXCDzZAML76IlZUEf45nib3rjehnFgg0s1rgsuN/bg==", 1141 | "dependencies": { 1142 | "@smithy/node-config-provider": "^2.1.9", 1143 | "@smithy/property-provider": "^2.0.17", 1144 | "@smithy/types": "^2.8.0", 1145 | "@smithy/url-parser": "^2.0.16", 1146 | "tslib": "^2.5.0" 1147 | }, 1148 | "engines": { 1149 | "node": ">=14.0.0" 1150 | } 1151 | }, 1152 | "node_modules/@smithy/eventstream-codec": { 1153 | "version": "2.0.16", 1154 | "resolved": "https://registry.npmjs.org/@smithy/eventstream-codec/-/eventstream-codec-2.0.16.tgz", 1155 | "integrity": "sha512-umYh5pdCE9GHgiMAH49zu9wXWZKNHHdKPm/lK22WYISTjqu29SepmpWNmPiBLy/yUu4HFEGJHIFrDWhbDlApaw==", 1156 | "dependencies": { 1157 | "@aws-crypto/crc32": "3.0.0", 1158 | "@smithy/types": "^2.8.0", 1159 | "@smithy/util-hex-encoding": "^2.0.0", 1160 | "tslib": "^2.5.0" 1161 | } 1162 | }, 1163 | "node_modules/@smithy/eventstream-serde-browser": { 1164 | "version": "2.0.16", 1165 | "resolved": "https://registry.npmjs.org/@smithy/eventstream-serde-browser/-/eventstream-serde-browser-2.0.16.tgz", 1166 | "integrity": "sha512-W+BdiN728R57KuZOcG0GczpIOEFf8S5RP/OdVH7T3FMCy8HU2bBU0vB5xZZR5c00VRdoeWrohNv3XlHoZuGRoA==", 1167 | "dependencies": { 1168 | "@smithy/eventstream-serde-universal": "^2.0.16", 1169 | "@smithy/types": "^2.8.0", 1170 | "tslib": "^2.5.0" 1171 | }, 1172 | "engines": { 1173 | "node": ">=14.0.0" 1174 | } 1175 | }, 1176 | "node_modules/@smithy/eventstream-serde-config-resolver": { 1177 | "version": "2.0.16", 1178 | "resolved": "https://registry.npmjs.org/@smithy/eventstream-serde-config-resolver/-/eventstream-serde-config-resolver-2.0.16.tgz", 1179 | "integrity": "sha512-8qrE4nh+Tg6m1SMFK8vlzoK+8bUFTlIhXidmmQfASMninXW3Iu0T0bI4YcIk4nLznHZdybQ0qGydIanvVZxzVg==", 1180 | "dependencies": { 1181 | "@smithy/types": "^2.8.0", 1182 | "tslib": "^2.5.0" 1183 | }, 1184 | "engines": { 1185 | "node": ">=14.0.0" 1186 | } 1187 | }, 1188 | "node_modules/@smithy/eventstream-serde-node": { 1189 | "version": "2.0.16", 1190 | "resolved": "https://registry.npmjs.org/@smithy/eventstream-serde-node/-/eventstream-serde-node-2.0.16.tgz", 1191 | "integrity": "sha512-NRNQuOa6mQdFSkqzY0IV37swHWx0SEoKxFtUfdZvfv0AVQPlSw4N7E3kcRSCpnHBr1kCuWWirdDlWcjWuD81MA==", 1192 | "dependencies": { 1193 | "@smithy/eventstream-serde-universal": "^2.0.16", 1194 | "@smithy/types": "^2.8.0", 1195 | "tslib": "^2.5.0" 1196 | }, 1197 | "engines": { 1198 | "node": ">=14.0.0" 1199 | } 1200 | }, 1201 | "node_modules/@smithy/eventstream-serde-universal": { 1202 | "version": "2.0.16", 1203 | "resolved": "https://registry.npmjs.org/@smithy/eventstream-serde-universal/-/eventstream-serde-universal-2.0.16.tgz", 1204 | "integrity": "sha512-ZyLnGaYQMLc75j9kKEVMJ3X6bdBE9qWxhZdTXM5RIltuytxJC3FaOhawBxjE+IL1enmWSIohHGZCm/pLwEliQA==", 1205 | "dependencies": { 1206 | "@smithy/eventstream-codec": "^2.0.16", 1207 | "@smithy/types": "^2.8.0", 1208 | "tslib": "^2.5.0" 1209 | }, 1210 | "engines": { 1211 | "node": ">=14.0.0" 1212 | } 1213 | }, 1214 | "node_modules/@smithy/fetch-http-handler": { 1215 | "version": "2.3.2", 1216 | "resolved": "https://registry.npmjs.org/@smithy/fetch-http-handler/-/fetch-http-handler-2.3.2.tgz", 1217 | "integrity": "sha512-O9R/OlnAOTsnysuSDjt0v2q6DcSvCz5cCFC/CFAWWcLyBwJDeFyGTCTszgpQTb19+Fi8uRwZE5/3ziAQBFeDMQ==", 1218 | "dependencies": { 1219 | "@smithy/protocol-http": "^3.0.12", 1220 | "@smithy/querystring-builder": "^2.0.16", 1221 | "@smithy/types": "^2.8.0", 1222 | "@smithy/util-base64": "^2.0.1", 1223 | "tslib": "^2.5.0" 1224 | } 1225 | }, 1226 | "node_modules/@smithy/hash-node": { 1227 | "version": "2.0.18", 1228 | "resolved": "https://registry.npmjs.org/@smithy/hash-node/-/hash-node-2.0.18.tgz", 1229 | "integrity": "sha512-gN2JFvAgnZCyDN9rJgcejfpK0uPPJrSortVVVVWsru9whS7eQey6+gj2eM5ln2i6rHNntIXzal1Fm9XOPuoaKA==", 1230 | "dependencies": { 1231 | "@smithy/types": "^2.8.0", 1232 | "@smithy/util-buffer-from": "^2.0.0", 1233 | "@smithy/util-utf8": "^2.0.2", 1234 | "tslib": "^2.5.0" 1235 | }, 1236 | "engines": { 1237 | "node": ">=14.0.0" 1238 | } 1239 | }, 1240 | "node_modules/@smithy/invalid-dependency": { 1241 | "version": "2.0.16", 1242 | "resolved": "https://registry.npmjs.org/@smithy/invalid-dependency/-/invalid-dependency-2.0.16.tgz", 1243 | "integrity": "sha512-apEHakT/kmpNo1VFHP4W/cjfeP9U0x5qvfsLJubgp7UM/gq4qYp0GbqdE7QhsjUaYvEnrftRqs7+YrtWreV0wA==", 1244 | "dependencies": { 1245 | "@smithy/types": "^2.8.0", 1246 | "tslib": "^2.5.0" 1247 | } 1248 | }, 1249 | "node_modules/@smithy/is-array-buffer": { 1250 | "version": "2.0.0", 1251 | "resolved": "https://registry.npmjs.org/@smithy/is-array-buffer/-/is-array-buffer-2.0.0.tgz", 1252 | "integrity": "sha512-z3PjFjMyZNI98JFRJi/U0nGoLWMSJlDjAW4QUX2WNZLas5C0CmVV6LJ01JI0k90l7FvpmixjWxPFmENSClQ7ug==", 1253 | "dependencies": { 1254 | "tslib": "^2.5.0" 1255 | }, 1256 | "engines": { 1257 | "node": ">=14.0.0" 1258 | } 1259 | }, 1260 | "node_modules/@smithy/middleware-content-length": { 1261 | "version": "2.0.18", 1262 | "resolved": "https://registry.npmjs.org/@smithy/middleware-content-length/-/middleware-content-length-2.0.18.tgz", 1263 | "integrity": "sha512-ZJ9uKPTfxYheTKSKYB+GCvcj+izw9WGzRLhjn8n254q0jWLojUzn7Vw0l4R/Gq7Wdpf/qmk/ptD+6CCXHNVCaw==", 1264 | "dependencies": { 1265 | "@smithy/protocol-http": "^3.0.12", 1266 | "@smithy/types": "^2.8.0", 1267 | "tslib": "^2.5.0" 1268 | }, 1269 | "engines": { 1270 | "node": ">=14.0.0" 1271 | } 1272 | }, 1273 | "node_modules/@smithy/middleware-endpoint": { 1274 | "version": "2.3.0", 1275 | "resolved": "https://registry.npmjs.org/@smithy/middleware-endpoint/-/middleware-endpoint-2.3.0.tgz", 1276 | "integrity": "sha512-VsOAG2YQ8ykjSmKO+CIXdJBIWFo6AAvG6Iw95BakBTqk66/4BI7XyqLevoNSq/lZ6NgZv24sLmrcIN+fLDWBCg==", 1277 | "dependencies": { 1278 | "@smithy/middleware-serde": "^2.0.16", 1279 | "@smithy/node-config-provider": "^2.1.9", 1280 | "@smithy/shared-ini-file-loader": "^2.2.8", 1281 | "@smithy/types": "^2.8.0", 1282 | "@smithy/url-parser": "^2.0.16", 1283 | "@smithy/util-middleware": "^2.0.9", 1284 | "tslib": "^2.5.0" 1285 | }, 1286 | "engines": { 1287 | "node": ">=14.0.0" 1288 | } 1289 | }, 1290 | "node_modules/@smithy/middleware-retry": { 1291 | "version": "2.0.26", 1292 | "resolved": "https://registry.npmjs.org/@smithy/middleware-retry/-/middleware-retry-2.0.26.tgz", 1293 | "integrity": "sha512-Qzpxo0U5jfNiq9iD38U3e2bheXwvTEX4eue9xruIvEgh+UKq6dKuGqcB66oBDV7TD/mfoJi9Q/VmaiqwWbEp7A==", 1294 | "dependencies": { 1295 | "@smithy/node-config-provider": "^2.1.9", 1296 | "@smithy/protocol-http": "^3.0.12", 1297 | "@smithy/service-error-classification": "^2.0.9", 1298 | "@smithy/smithy-client": "^2.2.1", 1299 | "@smithy/types": "^2.8.0", 1300 | "@smithy/util-middleware": "^2.0.9", 1301 | "@smithy/util-retry": "^2.0.9", 1302 | "tslib": "^2.5.0", 1303 | "uuid": "^8.3.2" 1304 | }, 1305 | "engines": { 1306 | "node": ">=14.0.0" 1307 | } 1308 | }, 1309 | "node_modules/@smithy/middleware-retry/node_modules/uuid": { 1310 | "version": "8.3.2", 1311 | "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz", 1312 | "integrity": "sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==", 1313 | "bin": { 1314 | "uuid": "dist/bin/uuid" 1315 | } 1316 | }, 1317 | "node_modules/@smithy/middleware-serde": { 1318 | "version": "2.0.16", 1319 | "resolved": "https://registry.npmjs.org/@smithy/middleware-serde/-/middleware-serde-2.0.16.tgz", 1320 | "integrity": "sha512-5EAd4t30pcc4M8TSSGq7q/x5IKrxfXR5+SrU4bgxNy7RPHQo2PSWBUco9C+D9Tfqp/JZvprRpK42dnupZafk2g==", 1321 | "dependencies": { 1322 | "@smithy/types": "^2.8.0", 1323 | "tslib": "^2.5.0" 1324 | }, 1325 | "engines": { 1326 | "node": ">=14.0.0" 1327 | } 1328 | }, 1329 | "node_modules/@smithy/middleware-stack": { 1330 | "version": "2.0.10", 1331 | "resolved": "https://registry.npmjs.org/@smithy/middleware-stack/-/middleware-stack-2.0.10.tgz", 1332 | "integrity": "sha512-I2rbxctNq9FAPPEcuA1ntZxkTKOPQFy7YBPOaD/MLg1zCvzv21CoNxR0py6J8ZVC35l4qE4nhxB0f7TF5/+Ldw==", 1333 | "dependencies": { 1334 | "@smithy/types": "^2.8.0", 1335 | "tslib": "^2.5.0" 1336 | }, 1337 | "engines": { 1338 | "node": ">=14.0.0" 1339 | } 1340 | }, 1341 | "node_modules/@smithy/node-config-provider": { 1342 | "version": "2.1.9", 1343 | "resolved": "https://registry.npmjs.org/@smithy/node-config-provider/-/node-config-provider-2.1.9.tgz", 1344 | "integrity": "sha512-tUyW/9xrRy+s7RXkmQhgYkAPMpTIF8izK4orhHjNFEKR3QZiOCbWB546Y8iB/Fpbm3O9+q0Af9rpywLKJOwtaQ==", 1345 | "dependencies": { 1346 | "@smithy/property-provider": "^2.0.17", 1347 | "@smithy/shared-ini-file-loader": "^2.2.8", 1348 | "@smithy/types": "^2.8.0", 1349 | "tslib": "^2.5.0" 1350 | }, 1351 | "engines": { 1352 | "node": ">=14.0.0" 1353 | } 1354 | }, 1355 | "node_modules/@smithy/node-http-handler": { 1356 | "version": "2.2.2", 1357 | "resolved": "https://registry.npmjs.org/@smithy/node-http-handler/-/node-http-handler-2.2.2.tgz", 1358 | "integrity": "sha512-XO58TO/Eul/IBQKFKaaBtXJi0ItEQQCT+NI4IiKHCY/4KtqaUT6y/wC1EvDqlA9cP7Dyjdj7FdPs4DyynH3u7g==", 1359 | "dependencies": { 1360 | "@smithy/abort-controller": "^2.0.16", 1361 | "@smithy/protocol-http": "^3.0.12", 1362 | "@smithy/querystring-builder": "^2.0.16", 1363 | "@smithy/types": "^2.8.0", 1364 | "tslib": "^2.5.0" 1365 | }, 1366 | "engines": { 1367 | "node": ">=14.0.0" 1368 | } 1369 | }, 1370 | "node_modules/@smithy/property-provider": { 1371 | "version": "2.0.17", 1372 | "resolved": "https://registry.npmjs.org/@smithy/property-provider/-/property-provider-2.0.17.tgz", 1373 | "integrity": "sha512-+VkeZbVu7qtQ2DjI48Qwaf9fPOr3gZIwxQpuLJgRRSkWsdSvmaTCxI3gzRFKePB63Ts9r4yjn4HkxSCSkdWmcQ==", 1374 | "dependencies": { 1375 | "@smithy/types": "^2.8.0", 1376 | "tslib": "^2.5.0" 1377 | }, 1378 | "engines": { 1379 | "node": ">=14.0.0" 1380 | } 1381 | }, 1382 | "node_modules/@smithy/protocol-http": { 1383 | "version": "3.0.12", 1384 | "resolved": "https://registry.npmjs.org/@smithy/protocol-http/-/protocol-http-3.0.12.tgz", 1385 | "integrity": "sha512-Xz4iaqLiaBfbQpB9Hgi3VcZYbP7xRDXYhd8XWChh4v94uw7qwmvlxdU5yxzfm6ACJM66phHrTbS5TVvj5uQ72w==", 1386 | "dependencies": { 1387 | "@smithy/types": "^2.8.0", 1388 | "tslib": "^2.5.0" 1389 | }, 1390 | "engines": { 1391 | "node": ">=14.0.0" 1392 | } 1393 | }, 1394 | "node_modules/@smithy/querystring-builder": { 1395 | "version": "2.0.16", 1396 | "resolved": "https://registry.npmjs.org/@smithy/querystring-builder/-/querystring-builder-2.0.16.tgz", 1397 | "integrity": "sha512-Q/GsJT0C0mijXMRs7YhZLLCP5FcuC4797lYjKQkME5CZohnLC4bEhylAd2QcD3gbMKNjCw8+T2I27WKiV/wToA==", 1398 | "dependencies": { 1399 | "@smithy/types": "^2.8.0", 1400 | "@smithy/util-uri-escape": "^2.0.0", 1401 | "tslib": "^2.5.0" 1402 | }, 1403 | "engines": { 1404 | "node": ">=14.0.0" 1405 | } 1406 | }, 1407 | "node_modules/@smithy/querystring-parser": { 1408 | "version": "2.0.16", 1409 | "resolved": "https://registry.npmjs.org/@smithy/querystring-parser/-/querystring-parser-2.0.16.tgz", 1410 | "integrity": "sha512-c4ueAuL6BDYKWpkubjrQthZKoC3L5kql5O++ovekNxiexRXTlLIVlCR4q3KziOktLIw66EU9SQljPXd/oN6Okg==", 1411 | "dependencies": { 1412 | "@smithy/types": "^2.8.0", 1413 | "tslib": "^2.5.0" 1414 | }, 1415 | "engines": { 1416 | "node": ">=14.0.0" 1417 | } 1418 | }, 1419 | "node_modules/@smithy/service-error-classification": { 1420 | "version": "2.0.9", 1421 | "resolved": "https://registry.npmjs.org/@smithy/service-error-classification/-/service-error-classification-2.0.9.tgz", 1422 | "integrity": "sha512-0K+8GvtwI7VkGmmInPydM2XZyBfIqLIbfR7mDQ+oPiz8mIinuHbV6sxOLdvX1Jv/myk7XTK9orgt3tuEpBu/zg==", 1423 | "dependencies": { 1424 | "@smithy/types": "^2.8.0" 1425 | }, 1426 | "engines": { 1427 | "node": ">=14.0.0" 1428 | } 1429 | }, 1430 | "node_modules/@smithy/shared-ini-file-loader": { 1431 | "version": "2.2.8", 1432 | "resolved": "https://registry.npmjs.org/@smithy/shared-ini-file-loader/-/shared-ini-file-loader-2.2.8.tgz", 1433 | "integrity": "sha512-E62byatbwSWrtq9RJ7xN40tqrRKDGrEL4EluyNpaIDvfvet06a/QC58oHw2FgVaEgkj0tXZPjZaKrhPfpoU0qw==", 1434 | "dependencies": { 1435 | "@smithy/types": "^2.8.0", 1436 | "tslib": "^2.5.0" 1437 | }, 1438 | "engines": { 1439 | "node": ">=14.0.0" 1440 | } 1441 | }, 1442 | "node_modules/@smithy/signature-v4": { 1443 | "version": "2.0.19", 1444 | "resolved": "https://registry.npmjs.org/@smithy/signature-v4/-/signature-v4-2.0.19.tgz", 1445 | "integrity": "sha512-nwc3JihdM+kcJjtORv/n7qRHN2Kfh7S2RJI2qr8pz9UcY5TD8rSCRGQ0g81HgyS3jZ5X9U/L4p014P3FonBPhg==", 1446 | "dependencies": { 1447 | "@smithy/eventstream-codec": "^2.0.16", 1448 | "@smithy/is-array-buffer": "^2.0.0", 1449 | "@smithy/types": "^2.8.0", 1450 | "@smithy/util-hex-encoding": "^2.0.0", 1451 | "@smithy/util-middleware": "^2.0.9", 1452 | "@smithy/util-uri-escape": "^2.0.0", 1453 | "@smithy/util-utf8": "^2.0.2", 1454 | "tslib": "^2.5.0" 1455 | }, 1456 | "engines": { 1457 | "node": ">=14.0.0" 1458 | } 1459 | }, 1460 | "node_modules/@smithy/smithy-client": { 1461 | "version": "2.2.1", 1462 | "resolved": "https://registry.npmjs.org/@smithy/smithy-client/-/smithy-client-2.2.1.tgz", 1463 | "integrity": "sha512-SpD7FLK92XV2fon2hMotaNDa2w5VAy5/uVjP9WFmjGSgWM8pTPVkHcDl1yFs5Z8LYbij0FSz+DbCBK6i+uXXUA==", 1464 | "dependencies": { 1465 | "@smithy/middleware-endpoint": "^2.3.0", 1466 | "@smithy/middleware-stack": "^2.0.10", 1467 | "@smithy/protocol-http": "^3.0.12", 1468 | "@smithy/types": "^2.8.0", 1469 | "@smithy/util-stream": "^2.0.24", 1470 | "tslib": "^2.5.0" 1471 | }, 1472 | "engines": { 1473 | "node": ">=14.0.0" 1474 | } 1475 | }, 1476 | "node_modules/@smithy/types": { 1477 | "version": "2.8.0", 1478 | "resolved": "https://registry.npmjs.org/@smithy/types/-/types-2.8.0.tgz", 1479 | "integrity": "sha512-h9sz24cFgt/W1Re22OlhQKmUZkNh244ApgRsUDYinqF8R+QgcsBIX344u2j61TPshsTz3CvL6HYU1DnQdsSrHA==", 1480 | "dependencies": { 1481 | "tslib": "^2.5.0" 1482 | }, 1483 | "engines": { 1484 | "node": ">=14.0.0" 1485 | } 1486 | }, 1487 | "node_modules/@smithy/url-parser": { 1488 | "version": "2.0.16", 1489 | "resolved": "https://registry.npmjs.org/@smithy/url-parser/-/url-parser-2.0.16.tgz", 1490 | "integrity": "sha512-Wfz5WqAoRT91TjRy1JeLR0fXtkIXHGsMbgzKFTx7E68SrZ55TB8xoG+vm11Ru4gheFTMXjAjwAxv1jQdC+pAQA==", 1491 | "dependencies": { 1492 | "@smithy/querystring-parser": "^2.0.16", 1493 | "@smithy/types": "^2.8.0", 1494 | "tslib": "^2.5.0" 1495 | } 1496 | }, 1497 | "node_modules/@smithy/util-base64": { 1498 | "version": "2.0.1", 1499 | "resolved": "https://registry.npmjs.org/@smithy/util-base64/-/util-base64-2.0.1.tgz", 1500 | "integrity": "sha512-DlI6XFYDMsIVN+GH9JtcRp3j02JEVuWIn/QOZisVzpIAprdsxGveFed0bjbMRCqmIFe8uetn5rxzNrBtIGrPIQ==", 1501 | "dependencies": { 1502 | "@smithy/util-buffer-from": "^2.0.0", 1503 | "tslib": "^2.5.0" 1504 | }, 1505 | "engines": { 1506 | "node": ">=14.0.0" 1507 | } 1508 | }, 1509 | "node_modules/@smithy/util-body-length-browser": { 1510 | "version": "2.0.1", 1511 | "resolved": "https://registry.npmjs.org/@smithy/util-body-length-browser/-/util-body-length-browser-2.0.1.tgz", 1512 | "integrity": "sha512-NXYp3ttgUlwkaug4bjBzJ5+yIbUbUx8VsSLuHZROQpoik+gRkIBeEG9MPVYfvPNpuXb/puqodeeUXcKFe7BLOQ==", 1513 | "dependencies": { 1514 | "tslib": "^2.5.0" 1515 | } 1516 | }, 1517 | "node_modules/@smithy/util-body-length-node": { 1518 | "version": "2.1.0", 1519 | "resolved": "https://registry.npmjs.org/@smithy/util-body-length-node/-/util-body-length-node-2.1.0.tgz", 1520 | "integrity": "sha512-/li0/kj/y3fQ3vyzn36NTLGmUwAICb7Jbe/CsWCktW363gh1MOcpEcSO3mJ344Gv2dqz8YJCLQpb6hju/0qOWw==", 1521 | "dependencies": { 1522 | "tslib": "^2.5.0" 1523 | }, 1524 | "engines": { 1525 | "node": ">=14.0.0" 1526 | } 1527 | }, 1528 | "node_modules/@smithy/util-buffer-from": { 1529 | "version": "2.0.0", 1530 | "resolved": "https://registry.npmjs.org/@smithy/util-buffer-from/-/util-buffer-from-2.0.0.tgz", 1531 | "integrity": "sha512-/YNnLoHsR+4W4Vf2wL5lGv0ksg8Bmk3GEGxn2vEQt52AQaPSCuaO5PM5VM7lP1K9qHRKHwrPGktqVoAHKWHxzw==", 1532 | "dependencies": { 1533 | "@smithy/is-array-buffer": "^2.0.0", 1534 | "tslib": "^2.5.0" 1535 | }, 1536 | "engines": { 1537 | "node": ">=14.0.0" 1538 | } 1539 | }, 1540 | "node_modules/@smithy/util-config-provider": { 1541 | "version": "2.1.0", 1542 | "resolved": "https://registry.npmjs.org/@smithy/util-config-provider/-/util-config-provider-2.1.0.tgz", 1543 | "integrity": "sha512-S6V0JvvhQgFSGLcJeT1CBsaTR03MM8qTuxMH9WPCCddlSo2W0V5jIHimHtIQALMLEDPGQ0ROSRr/dU0O+mxiQg==", 1544 | "dependencies": { 1545 | "tslib": "^2.5.0" 1546 | }, 1547 | "engines": { 1548 | "node": ">=14.0.0" 1549 | } 1550 | }, 1551 | "node_modules/@smithy/util-defaults-mode-browser": { 1552 | "version": "2.0.24", 1553 | "resolved": "https://registry.npmjs.org/@smithy/util-defaults-mode-browser/-/util-defaults-mode-browser-2.0.24.tgz", 1554 | "integrity": "sha512-TsP5mBuLgO2C21+laNG2nHYZEyUdkbGURv2tHvSuQQxLz952MegX95uwdxOY2jR2H4GoKuVRfdJq7w4eIjGYeg==", 1555 | "dependencies": { 1556 | "@smithy/property-provider": "^2.0.17", 1557 | "@smithy/smithy-client": "^2.2.1", 1558 | "@smithy/types": "^2.8.0", 1559 | "bowser": "^2.11.0", 1560 | "tslib": "^2.5.0" 1561 | }, 1562 | "engines": { 1563 | "node": ">= 10.0.0" 1564 | } 1565 | }, 1566 | "node_modules/@smithy/util-defaults-mode-node": { 1567 | "version": "2.0.32", 1568 | "resolved": "https://registry.npmjs.org/@smithy/util-defaults-mode-node/-/util-defaults-mode-node-2.0.32.tgz", 1569 | "integrity": "sha512-d0S33dXA2cq1NyorVMroMrEtqKMr3MlyLITcfTBf9pXiigYiPMOtbSI7czHIfDbuVuM89Cg0urAgpt73QV9mPQ==", 1570 | "dependencies": { 1571 | "@smithy/config-resolver": "^2.0.23", 1572 | "@smithy/credential-provider-imds": "^2.1.5", 1573 | "@smithy/node-config-provider": "^2.1.9", 1574 | "@smithy/property-provider": "^2.0.17", 1575 | "@smithy/smithy-client": "^2.2.1", 1576 | "@smithy/types": "^2.8.0", 1577 | "tslib": "^2.5.0" 1578 | }, 1579 | "engines": { 1580 | "node": ">= 10.0.0" 1581 | } 1582 | }, 1583 | "node_modules/@smithy/util-endpoints": { 1584 | "version": "1.0.8", 1585 | "resolved": "https://registry.npmjs.org/@smithy/util-endpoints/-/util-endpoints-1.0.8.tgz", 1586 | "integrity": "sha512-l8zVuyZZ61IzZBYp5NWvsAhbaAjYkt0xg9R4xUASkg5SEeTT2meHOJwJHctKMFUXe4QZbn9fR2MaBYjP2119+w==", 1587 | "dependencies": { 1588 | "@smithy/node-config-provider": "^2.1.9", 1589 | "@smithy/types": "^2.8.0", 1590 | "tslib": "^2.5.0" 1591 | }, 1592 | "engines": { 1593 | "node": ">= 14.0.0" 1594 | } 1595 | }, 1596 | "node_modules/@smithy/util-hex-encoding": { 1597 | "version": "2.0.0", 1598 | "resolved": "https://registry.npmjs.org/@smithy/util-hex-encoding/-/util-hex-encoding-2.0.0.tgz", 1599 | "integrity": "sha512-c5xY+NUnFqG6d7HFh1IFfrm3mGl29lC+vF+geHv4ToiuJCBmIfzx6IeHLg+OgRdPFKDXIw6pvi+p3CsscaMcMA==", 1600 | "dependencies": { 1601 | "tslib": "^2.5.0" 1602 | }, 1603 | "engines": { 1604 | "node": ">=14.0.0" 1605 | } 1606 | }, 1607 | "node_modules/@smithy/util-middleware": { 1608 | "version": "2.0.9", 1609 | "resolved": "https://registry.npmjs.org/@smithy/util-middleware/-/util-middleware-2.0.9.tgz", 1610 | "integrity": "sha512-PnCnBJ07noMX1lMDTEefmxSlusWJUiLfrme++MfK5TD0xz8NYmakgoXy5zkF/16zKGmiwOeKAztWT/Vjk1KRIQ==", 1611 | "dependencies": { 1612 | "@smithy/types": "^2.8.0", 1613 | "tslib": "^2.5.0" 1614 | }, 1615 | "engines": { 1616 | "node": ">=14.0.0" 1617 | } 1618 | }, 1619 | "node_modules/@smithy/util-retry": { 1620 | "version": "2.0.9", 1621 | "resolved": "https://registry.npmjs.org/@smithy/util-retry/-/util-retry-2.0.9.tgz", 1622 | "integrity": "sha512-46BFWe9RqB6g7f4mxm3W3HlqknqQQmWHKlhoqSFZuGNuiDU5KqmpebMbvC3tjTlUkqn4xa2Z7s3Hwb0HNs5scw==", 1623 | "dependencies": { 1624 | "@smithy/service-error-classification": "^2.0.9", 1625 | "@smithy/types": "^2.8.0", 1626 | "tslib": "^2.5.0" 1627 | }, 1628 | "engines": { 1629 | "node": ">= 14.0.0" 1630 | } 1631 | }, 1632 | "node_modules/@smithy/util-stream": { 1633 | "version": "2.0.24", 1634 | "resolved": "https://registry.npmjs.org/@smithy/util-stream/-/util-stream-2.0.24.tgz", 1635 | "integrity": "sha512-hRpbcRrOxDriMVmbya+Mv77VZVupxRAsfxVDKS54XuiURhdiwCUXJP0X1iJhHinuUf6n8pBF0MkG9C8VooMnWw==", 1636 | "dependencies": { 1637 | "@smithy/fetch-http-handler": "^2.3.2", 1638 | "@smithy/node-http-handler": "^2.2.2", 1639 | "@smithy/types": "^2.8.0", 1640 | "@smithy/util-base64": "^2.0.1", 1641 | "@smithy/util-buffer-from": "^2.0.0", 1642 | "@smithy/util-hex-encoding": "^2.0.0", 1643 | "@smithy/util-utf8": "^2.0.2", 1644 | "tslib": "^2.5.0" 1645 | }, 1646 | "engines": { 1647 | "node": ">=14.0.0" 1648 | } 1649 | }, 1650 | "node_modules/@smithy/util-uri-escape": { 1651 | "version": "2.0.0", 1652 | "resolved": "https://registry.npmjs.org/@smithy/util-uri-escape/-/util-uri-escape-2.0.0.tgz", 1653 | "integrity": "sha512-ebkxsqinSdEooQduuk9CbKcI+wheijxEb3utGXkCoYQkJnwTnLbH1JXGimJtUkQwNQbsbuYwG2+aFVyZf5TLaw==", 1654 | "dependencies": { 1655 | "tslib": "^2.5.0" 1656 | }, 1657 | "engines": { 1658 | "node": ">=14.0.0" 1659 | } 1660 | }, 1661 | "node_modules/@smithy/util-utf8": { 1662 | "version": "2.0.2", 1663 | "resolved": "https://registry.npmjs.org/@smithy/util-utf8/-/util-utf8-2.0.2.tgz", 1664 | "integrity": "sha512-qOiVORSPm6Ce4/Yu6hbSgNHABLP2VMv8QOC3tTDNHHlWY19pPyc++fBTbZPtx6egPXi4HQxKDnMxVxpbtX2GoA==", 1665 | "dependencies": { 1666 | "@smithy/util-buffer-from": "^2.0.0", 1667 | "tslib": "^2.5.0" 1668 | }, 1669 | "engines": { 1670 | "node": ">=14.0.0" 1671 | } 1672 | }, 1673 | "node_modules/@smithy/util-waiter": { 1674 | "version": "2.0.16", 1675 | "resolved": "https://registry.npmjs.org/@smithy/util-waiter/-/util-waiter-2.0.16.tgz", 1676 | "integrity": "sha512-5i4YONHQ6HoUWDd+X0frpxTXxSXgJhUFl+z0iMy/zpUmVeCQY2or3Vss6DzHKKMMQL4pmVHpQm9WayHDorFdZg==", 1677 | "dependencies": { 1678 | "@smithy/abort-controller": "^2.0.16", 1679 | "@smithy/types": "^2.8.0", 1680 | "tslib": "^2.5.0" 1681 | }, 1682 | "engines": { 1683 | "node": ">=14.0.0" 1684 | } 1685 | }, 1686 | "node_modules/@swc/helpers": { 1687 | "version": "0.5.2", 1688 | "resolved": "https://registry.npmjs.org/@swc/helpers/-/helpers-0.5.2.tgz", 1689 | "integrity": "sha512-E4KcWTpoLHqwPHLxidpOqQbcrZVgi0rsmmZXUle1jXmJfuIf/UWpczUJ7MZZ5tlxytgJXyp0w4PGkkeLiuIdZw==", 1690 | "dependencies": { 1691 | "tslib": "^2.4.0" 1692 | } 1693 | }, 1694 | "node_modules/@tokenizer/token": { 1695 | "version": "0.3.0", 1696 | "resolved": "https://registry.npmjs.org/@tokenizer/token/-/token-0.3.0.tgz", 1697 | "integrity": "sha512-OvjF+z51L3ov0OyAU0duzsYuvO01PH7x4t6DJx+guahgTnBHkhJdG7soQeTSFLWN3efnHyibZ4Z8l2EuWwJN3A==" 1698 | }, 1699 | "node_modules/@types/node": { 1700 | "version": "20.10.5", 1701 | "resolved": "https://registry.npmjs.org/@types/node/-/node-20.10.5.tgz", 1702 | "integrity": "sha512-nNPsNE65wjMxEKI93yOP+NPGGBJz/PoN3kZsVLee0XMiJolxSekEVD8wRwBUBqkwc7UWop0edW50yrCQW4CyRw==", 1703 | "dev": true, 1704 | "dependencies": { 1705 | "undici-types": "~5.26.4" 1706 | } 1707 | }, 1708 | "node_modules/@types/prop-types": { 1709 | "version": "15.7.11", 1710 | "resolved": "https://registry.npmjs.org/@types/prop-types/-/prop-types-15.7.11.tgz", 1711 | "integrity": "sha512-ga8y9v9uyeiLdpKddhxYQkxNDrfvuPrlFb0N1qnZZByvcElJaXthF1UhvCh9TLWJBEHeNtdnbysW7Y6Uq8CVng==", 1712 | "dev": true 1713 | }, 1714 | "node_modules/@types/react": { 1715 | "version": "18.2.45", 1716 | "resolved": "https://registry.npmjs.org/@types/react/-/react-18.2.45.tgz", 1717 | "integrity": "sha512-TtAxCNrlrBp8GoeEp1npd5g+d/OejJHFxS3OWmrPBMFaVQMSN0OFySozJio5BHxTuTeug00AVXVAjfDSfk+lUg==", 1718 | "dev": true, 1719 | "dependencies": { 1720 | "@types/prop-types": "*", 1721 | "@types/scheduler": "*", 1722 | "csstype": "^3.0.2" 1723 | } 1724 | }, 1725 | "node_modules/@types/react-dom": { 1726 | "version": "18.2.18", 1727 | "resolved": "https://registry.npmjs.org/@types/react-dom/-/react-dom-18.2.18.tgz", 1728 | "integrity": "sha512-TJxDm6OfAX2KJWJdMEVTwWke5Sc/E/RlnPGvGfS0W7+6ocy2xhDVQVh/KvC2Uf7kACs+gDytdusDSdWfWkaNzw==", 1729 | "dev": true, 1730 | "dependencies": { 1731 | "@types/react": "*" 1732 | } 1733 | }, 1734 | "node_modules/@types/scheduler": { 1735 | "version": "0.16.8", 1736 | "resolved": "https://registry.npmjs.org/@types/scheduler/-/scheduler-0.16.8.tgz", 1737 | "integrity": "sha512-WZLiwShhwLRmeV6zH+GkbOFT6Z6VklCItrDioxUnv+u4Ll+8vKeFySoFyK/0ctcRpOmwAicELfmys1sDc/Rw+A==", 1738 | "dev": true 1739 | }, 1740 | "node_modules/available-typed-arrays": { 1741 | "version": "1.0.5", 1742 | "resolved": "https://registry.npmjs.org/available-typed-arrays/-/available-typed-arrays-1.0.5.tgz", 1743 | "integrity": "sha512-DMD0KiN46eipeziST1LPP/STfDU0sufISXmjSgvVsoU2tqxctQeASejWcfNtxYKqETM1UxQ8sp2OrSBWpHY6sw==", 1744 | "engines": { 1745 | "node": ">= 0.4" 1746 | }, 1747 | "funding": { 1748 | "url": "https://github.com/sponsors/ljharb" 1749 | } 1750 | }, 1751 | "node_modules/aws-sdk": { 1752 | "version": "2.1532.0", 1753 | "resolved": "https://registry.npmjs.org/aws-sdk/-/aws-sdk-2.1532.0.tgz", 1754 | "integrity": "sha512-4QVQs01LEAxo7UpSHlq/HaO+SJ1WrYF8W1otO2WhKpVRYXkSxXIgZgfYaK+sQ762XTtB6tSuD2ZS2HGsKNXVLw==", 1755 | "dependencies": { 1756 | "buffer": "4.9.2", 1757 | "events": "1.1.1", 1758 | "ieee754": "1.1.13", 1759 | "jmespath": "0.16.0", 1760 | "querystring": "0.2.0", 1761 | "sax": "1.2.1", 1762 | "url": "0.10.3", 1763 | "util": "^0.12.4", 1764 | "uuid": "8.0.0", 1765 | "xml2js": "0.5.0" 1766 | }, 1767 | "engines": { 1768 | "node": ">= 10.0.0" 1769 | } 1770 | }, 1771 | "node_modules/base64-js": { 1772 | "version": "1.5.1", 1773 | "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz", 1774 | "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==", 1775 | "funding": [ 1776 | { 1777 | "type": "github", 1778 | "url": "https://github.com/sponsors/feross" 1779 | }, 1780 | { 1781 | "type": "patreon", 1782 | "url": "https://www.patreon.com/feross" 1783 | }, 1784 | { 1785 | "type": "consulting", 1786 | "url": "https://feross.org/support" 1787 | } 1788 | ] 1789 | }, 1790 | "node_modules/bowser": { 1791 | "version": "2.11.0", 1792 | "resolved": "https://registry.npmjs.org/bowser/-/bowser-2.11.0.tgz", 1793 | "integrity": "sha512-AlcaJBi/pqqJBIQ8U9Mcpc9i8Aqxn88Skv5d+xBX006BY5u8N3mGLHa5Lgppa7L/HfwgwLgZ6NYs+Ag6uUmJRA==" 1794 | }, 1795 | "node_modules/buffer": { 1796 | "version": "4.9.2", 1797 | "resolved": "https://registry.npmjs.org/buffer/-/buffer-4.9.2.tgz", 1798 | "integrity": "sha512-xq+q3SRMOxGivLhBNaUdC64hDTQwejJ+H0T/NB1XMtTVEwNTrfFF3gAxiyW0Bu/xWEGhjVKgUcMhCrUy2+uCWg==", 1799 | "dependencies": { 1800 | "base64-js": "^1.0.2", 1801 | "ieee754": "^1.1.4", 1802 | "isarray": "^1.0.0" 1803 | } 1804 | }, 1805 | "node_modules/busboy": { 1806 | "version": "1.6.0", 1807 | "resolved": "https://registry.npmjs.org/busboy/-/busboy-1.6.0.tgz", 1808 | "integrity": "sha512-8SFQbg/0hQ9xy3UNTB0YEnsNBbWfhf7RtnzpL7TkBiTBRfrQ9Fxcnz7VJsleJpyp6rVLvXiuORqjlHi5q+PYuA==", 1809 | "dependencies": { 1810 | "streamsearch": "^1.1.0" 1811 | }, 1812 | "engines": { 1813 | "node": ">=10.16.0" 1814 | } 1815 | }, 1816 | "node_modules/call-bind": { 1817 | "version": "1.0.5", 1818 | "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.5.tgz", 1819 | "integrity": "sha512-C3nQxfFZxFRVoJoGKKI8y3MOEo129NQ+FgQ08iye+Mk4zNZZGdjfs06bVTr+DBSlA66Q2VEcMki/cUCP4SercQ==", 1820 | "dependencies": { 1821 | "function-bind": "^1.1.2", 1822 | "get-intrinsic": "^1.2.1", 1823 | "set-function-length": "^1.1.1" 1824 | }, 1825 | "funding": { 1826 | "url": "https://github.com/sponsors/ljharb" 1827 | } 1828 | }, 1829 | "node_modules/caniuse-lite": { 1830 | "version": "1.0.30001571", 1831 | "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001571.tgz", 1832 | "integrity": "sha512-tYq/6MoXhdezDLFZuCO/TKboTzuQ/xR5cFdgXPfDtM7/kchBO3b4VWghE/OAi/DV7tTdhmLjZiZBZi1fA/GheQ==", 1833 | "funding": [ 1834 | { 1835 | "type": "opencollective", 1836 | "url": "https://opencollective.com/browserslist" 1837 | }, 1838 | { 1839 | "type": "tidelift", 1840 | "url": "https://tidelift.com/funding/github/npm/caniuse-lite" 1841 | }, 1842 | { 1843 | "type": "github", 1844 | "url": "https://github.com/sponsors/ai" 1845 | } 1846 | ] 1847 | }, 1848 | "node_modules/client-only": { 1849 | "version": "0.0.1", 1850 | "resolved": "https://registry.npmjs.org/client-only/-/client-only-0.0.1.tgz", 1851 | "integrity": "sha512-IV3Ou0jSMzZrd3pZ48nLkT9DA7Ag1pnPzaiQhpW7c3RbcqqzvzzVu+L8gfqMp/8IM2MQtSiqaCxrrcfu8I8rMA==" 1852 | }, 1853 | "node_modules/csstype": { 1854 | "version": "3.1.3", 1855 | "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.1.3.tgz", 1856 | "integrity": "sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw==", 1857 | "dev": true 1858 | }, 1859 | "node_modules/define-data-property": { 1860 | "version": "1.1.1", 1861 | "resolved": "https://registry.npmjs.org/define-data-property/-/define-data-property-1.1.1.tgz", 1862 | "integrity": "sha512-E7uGkTzkk1d0ByLeSc6ZsFS79Axg+m1P/VsgYsxHgiuc3tFSj+MjMIwe90FC4lOAZzNBdY7kkO2P2wKdsQ1vgQ==", 1863 | "dependencies": { 1864 | "get-intrinsic": "^1.2.1", 1865 | "gopd": "^1.0.1", 1866 | "has-property-descriptors": "^1.0.0" 1867 | }, 1868 | "engines": { 1869 | "node": ">= 0.4" 1870 | } 1871 | }, 1872 | "node_modules/esbuild": { 1873 | "version": "0.19.11", 1874 | "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.19.11.tgz", 1875 | "integrity": "sha512-HJ96Hev2hX/6i5cDVwcqiJBBtuo9+FeIJOtZ9W1kA5M6AMJRHUZlpYZ1/SbEwtO0ioNAW8rUooVpC/WehY2SfA==", 1876 | "hasInstallScript": true, 1877 | "bin": { 1878 | "esbuild": "bin/esbuild" 1879 | }, 1880 | "engines": { 1881 | "node": ">=12" 1882 | }, 1883 | "optionalDependencies": { 1884 | "@esbuild/aix-ppc64": "0.19.11", 1885 | "@esbuild/android-arm": "0.19.11", 1886 | "@esbuild/android-arm64": "0.19.11", 1887 | "@esbuild/android-x64": "0.19.11", 1888 | "@esbuild/darwin-arm64": "0.19.11", 1889 | "@esbuild/darwin-x64": "0.19.11", 1890 | "@esbuild/freebsd-arm64": "0.19.11", 1891 | "@esbuild/freebsd-x64": "0.19.11", 1892 | "@esbuild/linux-arm": "0.19.11", 1893 | "@esbuild/linux-arm64": "0.19.11", 1894 | "@esbuild/linux-ia32": "0.19.11", 1895 | "@esbuild/linux-loong64": "0.19.11", 1896 | "@esbuild/linux-mips64el": "0.19.11", 1897 | "@esbuild/linux-ppc64": "0.19.11", 1898 | "@esbuild/linux-riscv64": "0.19.11", 1899 | "@esbuild/linux-s390x": "0.19.11", 1900 | "@esbuild/linux-x64": "0.19.11", 1901 | "@esbuild/netbsd-x64": "0.19.11", 1902 | "@esbuild/openbsd-x64": "0.19.11", 1903 | "@esbuild/sunos-x64": "0.19.11", 1904 | "@esbuild/win32-arm64": "0.19.11", 1905 | "@esbuild/win32-ia32": "0.19.11", 1906 | "@esbuild/win32-x64": "0.19.11" 1907 | } 1908 | }, 1909 | "node_modules/events": { 1910 | "version": "1.1.1", 1911 | "resolved": "https://registry.npmjs.org/events/-/events-1.1.1.tgz", 1912 | "integrity": "sha512-kEcvvCBByWXGnZy6JUlgAp2gBIUjfCAV6P6TgT1/aaQKcmuAEC4OZTV1I4EWQLz2gxZw76atuVyvHhTxvi0Flw==", 1913 | "engines": { 1914 | "node": ">=0.4.x" 1915 | } 1916 | }, 1917 | "node_modules/fast-xml-parser": { 1918 | "version": "4.2.5", 1919 | "resolved": "https://registry.npmjs.org/fast-xml-parser/-/fast-xml-parser-4.2.5.tgz", 1920 | "integrity": "sha512-B9/wizE4WngqQftFPmdaMYlXoJlJOYxGQOanC77fq9k8+Z0v5dDSVh+3glErdIROP//s/jgb7ZuxKfB8nVyo0g==", 1921 | "funding": [ 1922 | { 1923 | "type": "paypal", 1924 | "url": "https://paypal.me/naturalintelligence" 1925 | }, 1926 | { 1927 | "type": "github", 1928 | "url": "https://github.com/sponsors/NaturalIntelligence" 1929 | } 1930 | ], 1931 | "dependencies": { 1932 | "strnum": "^1.0.5" 1933 | }, 1934 | "bin": { 1935 | "fxparser": "src/cli/cli.js" 1936 | } 1937 | }, 1938 | "node_modules/file-type": { 1939 | "version": "19.0.0", 1940 | "resolved": "https://registry.npmjs.org/file-type/-/file-type-19.0.0.tgz", 1941 | "integrity": "sha512-s7cxa7/leUWLiXO78DVVfBVse+milos9FitauDLG1pI7lNaJ2+5lzPnr2N24ym+84HVwJL6hVuGfgVE+ALvU8Q==", 1942 | "dependencies": { 1943 | "readable-web-to-node-stream": "^3.0.2", 1944 | "strtok3": "^7.0.0", 1945 | "token-types": "^5.0.1" 1946 | }, 1947 | "engines": { 1948 | "node": ">=18" 1949 | }, 1950 | "funding": { 1951 | "url": "https://github.com/sindresorhus/file-type?sponsor=1" 1952 | } 1953 | }, 1954 | "node_modules/for-each": { 1955 | "version": "0.3.3", 1956 | "resolved": "https://registry.npmjs.org/for-each/-/for-each-0.3.3.tgz", 1957 | "integrity": "sha512-jqYfLp7mo9vIyQf8ykW2v7A+2N4QjeCeI5+Dz9XraiO1ign81wjiH7Fb9vSOWvQfNtmSa4H2RoQTrrXivdUZmw==", 1958 | "dependencies": { 1959 | "is-callable": "^1.1.3" 1960 | } 1961 | }, 1962 | "node_modules/fsevents": { 1963 | "version": "2.3.3", 1964 | "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", 1965 | "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", 1966 | "hasInstallScript": true, 1967 | "optional": true, 1968 | "os": [ 1969 | "darwin" 1970 | ], 1971 | "engines": { 1972 | "node": "^8.16.0 || ^10.6.0 || >=11.0.0" 1973 | } 1974 | }, 1975 | "node_modules/function-bind": { 1976 | "version": "1.1.2", 1977 | "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz", 1978 | "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==", 1979 | "funding": { 1980 | "url": "https://github.com/sponsors/ljharb" 1981 | } 1982 | }, 1983 | "node_modules/get-intrinsic": { 1984 | "version": "1.2.2", 1985 | "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.2.tgz", 1986 | "integrity": "sha512-0gSo4ml/0j98Y3lngkFEot/zhiCeWsbYIlZ+uZOVgzLyLaUw7wxUL+nCTP0XJvJg1AXulJRI3UJi8GsbDuxdGA==", 1987 | "dependencies": { 1988 | "function-bind": "^1.1.2", 1989 | "has-proto": "^1.0.1", 1990 | "has-symbols": "^1.0.3", 1991 | "hasown": "^2.0.0" 1992 | }, 1993 | "funding": { 1994 | "url": "https://github.com/sponsors/ljharb" 1995 | } 1996 | }, 1997 | "node_modules/get-tsconfig": { 1998 | "version": "4.7.2", 1999 | "resolved": "https://registry.npmjs.org/get-tsconfig/-/get-tsconfig-4.7.2.tgz", 2000 | "integrity": "sha512-wuMsz4leaj5hbGgg4IvDU0bqJagpftG5l5cXIAvo8uZrqn0NJqwtfupTN00VnkQJPcIRrxYrm1Ue24btpCha2A==", 2001 | "dependencies": { 2002 | "resolve-pkg-maps": "^1.0.0" 2003 | }, 2004 | "funding": { 2005 | "url": "https://github.com/privatenumber/get-tsconfig?sponsor=1" 2006 | } 2007 | }, 2008 | "node_modules/glob-to-regexp": { 2009 | "version": "0.4.1", 2010 | "resolved": "https://registry.npmjs.org/glob-to-regexp/-/glob-to-regexp-0.4.1.tgz", 2011 | "integrity": "sha512-lkX1HJXwyMcprw/5YUZc2s7DrpAiHB21/V+E1rHUrVNokkvB6bqMzT0VfV6/86ZNabt1k14YOIaT7nDvOX3Iiw==" 2012 | }, 2013 | "node_modules/gopd": { 2014 | "version": "1.0.1", 2015 | "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.0.1.tgz", 2016 | "integrity": "sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA==", 2017 | "dependencies": { 2018 | "get-intrinsic": "^1.1.3" 2019 | }, 2020 | "funding": { 2021 | "url": "https://github.com/sponsors/ljharb" 2022 | } 2023 | }, 2024 | "node_modules/graceful-fs": { 2025 | "version": "4.2.11", 2026 | "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz", 2027 | "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==" 2028 | }, 2029 | "node_modules/has-property-descriptors": { 2030 | "version": "1.0.1", 2031 | "resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.1.tgz", 2032 | "integrity": "sha512-VsX8eaIewvas0xnvinAe9bw4WfIeODpGYikiWYLH+dma0Jw6KHYqWiWfhQlgOVK8D6PvjubK5Uc4P0iIhIcNVg==", 2033 | "dependencies": { 2034 | "get-intrinsic": "^1.2.2" 2035 | }, 2036 | "funding": { 2037 | "url": "https://github.com/sponsors/ljharb" 2038 | } 2039 | }, 2040 | "node_modules/has-proto": { 2041 | "version": "1.0.1", 2042 | "resolved": "https://registry.npmjs.org/has-proto/-/has-proto-1.0.1.tgz", 2043 | "integrity": "sha512-7qE+iP+O+bgF9clE5+UoBFzE65mlBiVj3tKCrlNQ0Ogwm0BjpT/gK4SlLYDMybDh5I3TCTKnPPa0oMG7JDYrhg==", 2044 | "engines": { 2045 | "node": ">= 0.4" 2046 | }, 2047 | "funding": { 2048 | "url": "https://github.com/sponsors/ljharb" 2049 | } 2050 | }, 2051 | "node_modules/has-symbols": { 2052 | "version": "1.0.3", 2053 | "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz", 2054 | "integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==", 2055 | "engines": { 2056 | "node": ">= 0.4" 2057 | }, 2058 | "funding": { 2059 | "url": "https://github.com/sponsors/ljharb" 2060 | } 2061 | }, 2062 | "node_modules/has-tostringtag": { 2063 | "version": "1.0.0", 2064 | "resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.0.tgz", 2065 | "integrity": "sha512-kFjcSNhnlGV1kyoGk7OXKSawH5JOb/LzUc5w9B02hOTO0dfFRjbHQKvg1d6cf3HbeUmtU9VbbV3qzZ2Teh97WQ==", 2066 | "dependencies": { 2067 | "has-symbols": "^1.0.2" 2068 | }, 2069 | "engines": { 2070 | "node": ">= 0.4" 2071 | }, 2072 | "funding": { 2073 | "url": "https://github.com/sponsors/ljharb" 2074 | } 2075 | }, 2076 | "node_modules/hasown": { 2077 | "version": "2.0.0", 2078 | "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.0.tgz", 2079 | "integrity": "sha512-vUptKVTpIJhcczKBbgnS+RtcuYMB8+oNzPK2/Hp3hanz8JmpATdmmgLgSaadVREkDm+e2giHwY3ZRkyjSIDDFA==", 2080 | "dependencies": { 2081 | "function-bind": "^1.1.2" 2082 | }, 2083 | "engines": { 2084 | "node": ">= 0.4" 2085 | } 2086 | }, 2087 | "node_modules/ieee754": { 2088 | "version": "1.1.13", 2089 | "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.1.13.tgz", 2090 | "integrity": "sha512-4vf7I2LYV/HaWerSo3XmlMkp5eZ83i+/CDluXi/IGTs/O1sejBNhTtnxzmRZfvOUqj7lZjqHkeTvpgSFDlWZTg==" 2091 | }, 2092 | "node_modules/inherits": { 2093 | "version": "2.0.4", 2094 | "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", 2095 | "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" 2096 | }, 2097 | "node_modules/is-arguments": { 2098 | "version": "1.1.1", 2099 | "resolved": "https://registry.npmjs.org/is-arguments/-/is-arguments-1.1.1.tgz", 2100 | "integrity": "sha512-8Q7EARjzEnKpt/PCD7e1cgUS0a6X8u5tdSiMqXhojOdoV9TsMsiO+9VLC5vAmO8N7/GmXn7yjR8qnA6bVAEzfA==", 2101 | "dependencies": { 2102 | "call-bind": "^1.0.2", 2103 | "has-tostringtag": "^1.0.0" 2104 | }, 2105 | "engines": { 2106 | "node": ">= 0.4" 2107 | }, 2108 | "funding": { 2109 | "url": "https://github.com/sponsors/ljharb" 2110 | } 2111 | }, 2112 | "node_modules/is-callable": { 2113 | "version": "1.2.7", 2114 | "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.7.tgz", 2115 | "integrity": "sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA==", 2116 | "engines": { 2117 | "node": ">= 0.4" 2118 | }, 2119 | "funding": { 2120 | "url": "https://github.com/sponsors/ljharb" 2121 | } 2122 | }, 2123 | "node_modules/is-generator-function": { 2124 | "version": "1.0.10", 2125 | "resolved": "https://registry.npmjs.org/is-generator-function/-/is-generator-function-1.0.10.tgz", 2126 | "integrity": "sha512-jsEjy9l3yiXEQ+PsXdmBwEPcOxaXWLspKdplFUVI9vq1iZgIekeC0L167qeu86czQaxed3q/Uzuw0swL0irL8A==", 2127 | "dependencies": { 2128 | "has-tostringtag": "^1.0.0" 2129 | }, 2130 | "engines": { 2131 | "node": ">= 0.4" 2132 | }, 2133 | "funding": { 2134 | "url": "https://github.com/sponsors/ljharb" 2135 | } 2136 | }, 2137 | "node_modules/is-typed-array": { 2138 | "version": "1.1.12", 2139 | "resolved": "https://registry.npmjs.org/is-typed-array/-/is-typed-array-1.1.12.tgz", 2140 | "integrity": "sha512-Z14TF2JNG8Lss5/HMqt0//T9JeHXttXy5pH/DBU4vi98ozO2btxzq9MwYDZYnKwU8nRsz/+GVFVRDq3DkVuSPg==", 2141 | "dependencies": { 2142 | "which-typed-array": "^1.1.11" 2143 | }, 2144 | "engines": { 2145 | "node": ">= 0.4" 2146 | }, 2147 | "funding": { 2148 | "url": "https://github.com/sponsors/ljharb" 2149 | } 2150 | }, 2151 | "node_modules/isarray": { 2152 | "version": "1.0.0", 2153 | "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", 2154 | "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==" 2155 | }, 2156 | "node_modules/jmespath": { 2157 | "version": "0.16.0", 2158 | "resolved": "https://registry.npmjs.org/jmespath/-/jmespath-0.16.0.tgz", 2159 | "integrity": "sha512-9FzQjJ7MATs1tSpnco1K6ayiYE3figslrXA72G2HQ/n76RzvYlofyi5QM+iX4YRs/pu3yzxlVQSST23+dMDknw==", 2160 | "engines": { 2161 | "node": ">= 0.6.0" 2162 | } 2163 | }, 2164 | "node_modules/js-tokens": { 2165 | "version": "4.0.0", 2166 | "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", 2167 | "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==" 2168 | }, 2169 | "node_modules/loose-envify": { 2170 | "version": "1.4.0", 2171 | "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz", 2172 | "integrity": "sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==", 2173 | "dependencies": { 2174 | "js-tokens": "^3.0.0 || ^4.0.0" 2175 | }, 2176 | "bin": { 2177 | "loose-envify": "cli.js" 2178 | } 2179 | }, 2180 | "node_modules/nanoid": { 2181 | "version": "3.3.7", 2182 | "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.7.tgz", 2183 | "integrity": "sha512-eSRppjcPIatRIMC1U6UngP8XFcz8MQWGQdt1MTBQ7NaAmvXDfvNxbvWV3x2y6CdEUciCSsDHDQZbhYaB8QEo2g==", 2184 | "funding": [ 2185 | { 2186 | "type": "github", 2187 | "url": "https://github.com/sponsors/ai" 2188 | } 2189 | ], 2190 | "bin": { 2191 | "nanoid": "bin/nanoid.cjs" 2192 | }, 2193 | "engines": { 2194 | "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" 2195 | } 2196 | }, 2197 | "node_modules/next": { 2198 | "version": "14.0.4", 2199 | "resolved": "https://registry.npmjs.org/next/-/next-14.0.4.tgz", 2200 | "integrity": "sha512-qbwypnM7327SadwFtxXnQdGiKpkuhaRLE2uq62/nRul9cj9KhQ5LhHmlziTNqUidZotw/Q1I9OjirBROdUJNgA==", 2201 | "dependencies": { 2202 | "@next/env": "14.0.4", 2203 | "@swc/helpers": "0.5.2", 2204 | "busboy": "1.6.0", 2205 | "caniuse-lite": "^1.0.30001406", 2206 | "graceful-fs": "^4.2.11", 2207 | "postcss": "8.4.31", 2208 | "styled-jsx": "5.1.1", 2209 | "watchpack": "2.4.0" 2210 | }, 2211 | "bin": { 2212 | "next": "dist/bin/next" 2213 | }, 2214 | "engines": { 2215 | "node": ">=18.17.0" 2216 | }, 2217 | "optionalDependencies": { 2218 | "@next/swc-darwin-arm64": "14.0.4", 2219 | "@next/swc-darwin-x64": "14.0.4", 2220 | "@next/swc-linux-arm64-gnu": "14.0.4", 2221 | "@next/swc-linux-arm64-musl": "14.0.4", 2222 | "@next/swc-linux-x64-gnu": "14.0.4", 2223 | "@next/swc-linux-x64-musl": "14.0.4", 2224 | "@next/swc-win32-arm64-msvc": "14.0.4", 2225 | "@next/swc-win32-ia32-msvc": "14.0.4", 2226 | "@next/swc-win32-x64-msvc": "14.0.4" 2227 | }, 2228 | "peerDependencies": { 2229 | "@opentelemetry/api": "^1.1.0", 2230 | "react": "^18.2.0", 2231 | "react-dom": "^18.2.0", 2232 | "sass": "^1.3.0" 2233 | }, 2234 | "peerDependenciesMeta": { 2235 | "@opentelemetry/api": { 2236 | "optional": true 2237 | }, 2238 | "sass": { 2239 | "optional": true 2240 | } 2241 | } 2242 | }, 2243 | "node_modules/peek-readable": { 2244 | "version": "5.0.0", 2245 | "resolved": "https://registry.npmjs.org/peek-readable/-/peek-readable-5.0.0.tgz", 2246 | "integrity": "sha512-YtCKvLUOvwtMGmrniQPdO7MwPjgkFBtFIrmfSbYmYuq3tKDV/mcfAhBth1+C3ru7uXIZasc/pHnb+YDYNkkj4A==", 2247 | "engines": { 2248 | "node": ">=14.16" 2249 | }, 2250 | "funding": { 2251 | "type": "github", 2252 | "url": "https://github.com/sponsors/Borewit" 2253 | } 2254 | }, 2255 | "node_modules/picocolors": { 2256 | "version": "1.0.0", 2257 | "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz", 2258 | "integrity": "sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==" 2259 | }, 2260 | "node_modules/postcss": { 2261 | "version": "8.4.31", 2262 | "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.31.tgz", 2263 | "integrity": "sha512-PS08Iboia9mts/2ygV3eLpY5ghnUcfLV/EXTOW1E2qYxJKGGBUtNjN76FYHnMs36RmARn41bC0AZmn+rR0OVpQ==", 2264 | "funding": [ 2265 | { 2266 | "type": "opencollective", 2267 | "url": "https://opencollective.com/postcss/" 2268 | }, 2269 | { 2270 | "type": "tidelift", 2271 | "url": "https://tidelift.com/funding/github/npm/postcss" 2272 | }, 2273 | { 2274 | "type": "github", 2275 | "url": "https://github.com/sponsors/ai" 2276 | } 2277 | ], 2278 | "dependencies": { 2279 | "nanoid": "^3.3.6", 2280 | "picocolors": "^1.0.0", 2281 | "source-map-js": "^1.0.2" 2282 | }, 2283 | "engines": { 2284 | "node": "^10 || ^12 || >=14" 2285 | } 2286 | }, 2287 | "node_modules/punycode": { 2288 | "version": "1.3.2", 2289 | "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.3.2.tgz", 2290 | "integrity": "sha512-RofWgt/7fL5wP1Y7fxE7/EmTLzQVnB0ycyibJ0OOHIlJqTNzglYFxVwETOcIoJqJmpDXJ9xImDv+Fq34F/d4Dw==" 2291 | }, 2292 | "node_modules/querystring": { 2293 | "version": "0.2.0", 2294 | "resolved": "https://registry.npmjs.org/querystring/-/querystring-0.2.0.tgz", 2295 | "integrity": "sha512-X/xY82scca2tau62i9mDyU9K+I+djTMUsvwf7xnUX5GLvVzgJybOJf4Y6o9Zx3oJK/LSXg5tTZBjwzqVPaPO2g==", 2296 | "deprecated": "The querystring API is considered Legacy. new code should use the URLSearchParams API instead.", 2297 | "engines": { 2298 | "node": ">=0.4.x" 2299 | } 2300 | }, 2301 | "node_modules/react": { 2302 | "version": "18.2.0", 2303 | "resolved": "https://registry.npmjs.org/react/-/react-18.2.0.tgz", 2304 | "integrity": "sha512-/3IjMdb2L9QbBdWiW5e3P2/npwMBaU9mHCSCUzNln0ZCYbcfTsGbTJrU/kGemdH2IWmB2ioZ+zkxtmq6g09fGQ==", 2305 | "dependencies": { 2306 | "loose-envify": "^1.1.0" 2307 | }, 2308 | "engines": { 2309 | "node": ">=0.10.0" 2310 | } 2311 | }, 2312 | "node_modules/react-dom": { 2313 | "version": "18.2.0", 2314 | "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-18.2.0.tgz", 2315 | "integrity": "sha512-6IMTriUmvsjHUjNtEDudZfuDQUoWXVxKHhlEGSk81n4YFS+r/Kl99wXiwlVXtPBtJenozv2P+hxDsw9eA7Xo6g==", 2316 | "dependencies": { 2317 | "loose-envify": "^1.1.0", 2318 | "scheduler": "^0.23.0" 2319 | }, 2320 | "peerDependencies": { 2321 | "react": "^18.2.0" 2322 | } 2323 | }, 2324 | "node_modules/readable-stream": { 2325 | "version": "3.6.2", 2326 | "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", 2327 | "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==", 2328 | "dependencies": { 2329 | "inherits": "^2.0.3", 2330 | "string_decoder": "^1.1.1", 2331 | "util-deprecate": "^1.0.1" 2332 | }, 2333 | "engines": { 2334 | "node": ">= 6" 2335 | } 2336 | }, 2337 | "node_modules/readable-web-to-node-stream": { 2338 | "version": "3.0.2", 2339 | "resolved": "https://registry.npmjs.org/readable-web-to-node-stream/-/readable-web-to-node-stream-3.0.2.tgz", 2340 | "integrity": "sha512-ePeK6cc1EcKLEhJFt/AebMCLL+GgSKhuygrZ/GLaKZYEecIgIECf4UaUuaByiGtzckwR4ain9VzUh95T1exYGw==", 2341 | "dependencies": { 2342 | "readable-stream": "^3.6.0" 2343 | }, 2344 | "engines": { 2345 | "node": ">=8" 2346 | }, 2347 | "funding": { 2348 | "type": "github", 2349 | "url": "https://github.com/sponsors/Borewit" 2350 | } 2351 | }, 2352 | "node_modules/resolve-pkg-maps": { 2353 | "version": "1.0.0", 2354 | "resolved": "https://registry.npmjs.org/resolve-pkg-maps/-/resolve-pkg-maps-1.0.0.tgz", 2355 | "integrity": "sha512-seS2Tj26TBVOC2NIc2rOe2y2ZO7efxITtLZcGSOnHHNOQ7CkiUBfw0Iw2ck6xkIhPwLhKNLS8BO+hEpngQlqzw==", 2356 | "funding": { 2357 | "url": "https://github.com/privatenumber/resolve-pkg-maps?sponsor=1" 2358 | } 2359 | }, 2360 | "node_modules/safe-buffer": { 2361 | "version": "5.2.1", 2362 | "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", 2363 | "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", 2364 | "funding": [ 2365 | { 2366 | "type": "github", 2367 | "url": "https://github.com/sponsors/feross" 2368 | }, 2369 | { 2370 | "type": "patreon", 2371 | "url": "https://www.patreon.com/feross" 2372 | }, 2373 | { 2374 | "type": "consulting", 2375 | "url": "https://feross.org/support" 2376 | } 2377 | ] 2378 | }, 2379 | "node_modules/sax": { 2380 | "version": "1.2.1", 2381 | "resolved": "https://registry.npmjs.org/sax/-/sax-1.2.1.tgz", 2382 | "integrity": "sha512-8I2a3LovHTOpm7NV5yOyO8IHqgVsfK4+UuySrXU8YXkSRX7k6hCV9b3HrkKCr3nMpgj+0bmocaJJWpvp1oc7ZA==" 2383 | }, 2384 | "node_modules/scheduler": { 2385 | "version": "0.23.0", 2386 | "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.23.0.tgz", 2387 | "integrity": "sha512-CtuThmgHNg7zIZWAXi3AsyIzA3n4xx7aNyjwC2VJldO2LMVDhFK+63xGqq6CsJH4rTAt6/M+N4GhZiDYPx9eUw==", 2388 | "dependencies": { 2389 | "loose-envify": "^1.1.0" 2390 | } 2391 | }, 2392 | "node_modules/set-function-length": { 2393 | "version": "1.1.1", 2394 | "resolved": "https://registry.npmjs.org/set-function-length/-/set-function-length-1.1.1.tgz", 2395 | "integrity": "sha512-VoaqjbBJKiWtg4yRcKBQ7g7wnGnLV3M8oLvVWwOk2PdYY6PEFegR1vezXR0tw6fZGF9csVakIRjrJiy2veSBFQ==", 2396 | "dependencies": { 2397 | "define-data-property": "^1.1.1", 2398 | "get-intrinsic": "^1.2.1", 2399 | "gopd": "^1.0.1", 2400 | "has-property-descriptors": "^1.0.0" 2401 | }, 2402 | "engines": { 2403 | "node": ">= 0.4" 2404 | } 2405 | }, 2406 | "node_modules/source-map-js": { 2407 | "version": "1.0.2", 2408 | "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.0.2.tgz", 2409 | "integrity": "sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw==", 2410 | "engines": { 2411 | "node": ">=0.10.0" 2412 | } 2413 | }, 2414 | "node_modules/sst": { 2415 | "version": "3.0.1-11", 2416 | "resolved": "https://registry.npmjs.org/sst/-/sst-3.0.1-11.tgz", 2417 | "integrity": "sha512-+hUQOnplSBodnErzEdwpItsaIp0YxikNRyGuxlLlPP/wpTO6fcS15C82QDKC3MS/fRysz1fBXf5SHXApzQw0VQ==", 2418 | "dependencies": { 2419 | "@aws-sdk/client-lambda": "3.478.0" 2420 | } 2421 | }, 2422 | "node_modules/streamsearch": { 2423 | "version": "1.1.0", 2424 | "resolved": "https://registry.npmjs.org/streamsearch/-/streamsearch-1.1.0.tgz", 2425 | "integrity": "sha512-Mcc5wHehp9aXz1ax6bZUyY5afg9u2rv5cqQI3mRrYkGC8rW2hM02jWuwjtL++LS5qinSyhj2QfLyNsuc+VsExg==", 2426 | "engines": { 2427 | "node": ">=10.0.0" 2428 | } 2429 | }, 2430 | "node_modules/string_decoder": { 2431 | "version": "1.3.0", 2432 | "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz", 2433 | "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==", 2434 | "dependencies": { 2435 | "safe-buffer": "~5.2.0" 2436 | } 2437 | }, 2438 | "node_modules/strnum": { 2439 | "version": "1.0.5", 2440 | "resolved": "https://registry.npmjs.org/strnum/-/strnum-1.0.5.tgz", 2441 | "integrity": "sha512-J8bbNyKKXl5qYcR36TIO8W3mVGVHrmmxsd5PAItGkmyzwJvybiw2IVq5nqd0i4LSNSkB/sx9VHllbfFdr9k1JA==" 2442 | }, 2443 | "node_modules/strtok3": { 2444 | "version": "7.0.0", 2445 | "resolved": "https://registry.npmjs.org/strtok3/-/strtok3-7.0.0.tgz", 2446 | "integrity": "sha512-pQ+V+nYQdC5H3Q7qBZAz/MO6lwGhoC2gOAjuouGf/VO0m7vQRh8QNMl2Uf6SwAtzZ9bOw3UIeBukEGNJl5dtXQ==", 2447 | "dependencies": { 2448 | "@tokenizer/token": "^0.3.0", 2449 | "peek-readable": "^5.0.0" 2450 | }, 2451 | "engines": { 2452 | "node": ">=14.16" 2453 | }, 2454 | "funding": { 2455 | "type": "github", 2456 | "url": "https://github.com/sponsors/Borewit" 2457 | } 2458 | }, 2459 | "node_modules/styled-jsx": { 2460 | "version": "5.1.1", 2461 | "resolved": "https://registry.npmjs.org/styled-jsx/-/styled-jsx-5.1.1.tgz", 2462 | "integrity": "sha512-pW7uC1l4mBZ8ugbiZrcIsiIvVx1UmTfw7UkC3Um2tmfUq9Bhk8IiyEIPl6F8agHgjzku6j0xQEZbfA5uSgSaCw==", 2463 | "dependencies": { 2464 | "client-only": "0.0.1" 2465 | }, 2466 | "engines": { 2467 | "node": ">= 12.0.0" 2468 | }, 2469 | "peerDependencies": { 2470 | "react": ">= 16.8.0 || 17.x.x || ^18.0.0-0" 2471 | }, 2472 | "peerDependenciesMeta": { 2473 | "@babel/core": { 2474 | "optional": true 2475 | }, 2476 | "babel-plugin-macros": { 2477 | "optional": true 2478 | } 2479 | } 2480 | }, 2481 | "node_modules/token-types": { 2482 | "version": "5.0.1", 2483 | "resolved": "https://registry.npmjs.org/token-types/-/token-types-5.0.1.tgz", 2484 | "integrity": "sha512-Y2fmSnZjQdDb9W4w4r1tswlMHylzWIeOKpx0aZH9BgGtACHhrk3OkT52AzwcuqTRBZtvvnTjDBh8eynMulu8Vg==", 2485 | "dependencies": { 2486 | "@tokenizer/token": "^0.3.0", 2487 | "ieee754": "^1.2.1" 2488 | }, 2489 | "engines": { 2490 | "node": ">=14.16" 2491 | }, 2492 | "funding": { 2493 | "type": "github", 2494 | "url": "https://github.com/sponsors/Borewit" 2495 | } 2496 | }, 2497 | "node_modules/token-types/node_modules/ieee754": { 2498 | "version": "1.2.1", 2499 | "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz", 2500 | "integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==", 2501 | "funding": [ 2502 | { 2503 | "type": "github", 2504 | "url": "https://github.com/sponsors/feross" 2505 | }, 2506 | { 2507 | "type": "patreon", 2508 | "url": "https://www.patreon.com/feross" 2509 | }, 2510 | { 2511 | "type": "consulting", 2512 | "url": "https://feross.org/support" 2513 | } 2514 | ] 2515 | }, 2516 | "node_modules/tslib": { 2517 | "version": "2.6.2", 2518 | "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.2.tgz", 2519 | "integrity": "sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q==" 2520 | }, 2521 | "node_modules/tsx": { 2522 | "version": "4.7.0", 2523 | "resolved": "https://registry.npmjs.org/tsx/-/tsx-4.7.0.tgz", 2524 | "integrity": "sha512-I+t79RYPlEYlHn9a+KzwrvEwhJg35h/1zHsLC2JXvhC2mdynMv6Zxzvhv5EMV6VF5qJlLlkSnMVvdZV3PSIGcg==", 2525 | "dependencies": { 2526 | "esbuild": "~0.19.10", 2527 | "get-tsconfig": "^4.7.2" 2528 | }, 2529 | "bin": { 2530 | "tsx": "dist/cli.mjs" 2531 | }, 2532 | "engines": { 2533 | "node": ">=18.0.0" 2534 | }, 2535 | "optionalDependencies": { 2536 | "fsevents": "~2.3.3" 2537 | } 2538 | }, 2539 | "node_modules/typescript": { 2540 | "version": "5.3.3", 2541 | "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.3.3.tgz", 2542 | "integrity": "sha512-pXWcraxM0uxAS+tN0AG/BF2TyqmHO014Z070UsJ+pFvYuRSq8KH8DmWpnbXe0pEPDHXZV3FcAbJkijJ5oNEnWw==", 2543 | "dev": true, 2544 | "bin": { 2545 | "tsc": "bin/tsc", 2546 | "tsserver": "bin/tsserver" 2547 | }, 2548 | "engines": { 2549 | "node": ">=14.17" 2550 | } 2551 | }, 2552 | "node_modules/undici-types": { 2553 | "version": "5.26.5", 2554 | "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-5.26.5.tgz", 2555 | "integrity": "sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA==", 2556 | "dev": true 2557 | }, 2558 | "node_modules/url": { 2559 | "version": "0.10.3", 2560 | "resolved": "https://registry.npmjs.org/url/-/url-0.10.3.tgz", 2561 | "integrity": "sha512-hzSUW2q06EqL1gKM/a+obYHLIO6ct2hwPuviqTTOcfFVc61UbfJ2Q32+uGL/HCPxKqrdGB5QUwIe7UqlDgwsOQ==", 2562 | "dependencies": { 2563 | "punycode": "1.3.2", 2564 | "querystring": "0.2.0" 2565 | } 2566 | }, 2567 | "node_modules/util": { 2568 | "version": "0.12.5", 2569 | "resolved": "https://registry.npmjs.org/util/-/util-0.12.5.tgz", 2570 | "integrity": "sha512-kZf/K6hEIrWHI6XqOFUiiMa+79wE/D8Q+NCNAWclkyg3b4d2k7s0QGepNjiABc+aR3N1PAyHL7p6UcLY6LmrnA==", 2571 | "dependencies": { 2572 | "inherits": "^2.0.3", 2573 | "is-arguments": "^1.0.4", 2574 | "is-generator-function": "^1.0.7", 2575 | "is-typed-array": "^1.1.3", 2576 | "which-typed-array": "^1.1.2" 2577 | } 2578 | }, 2579 | "node_modules/util-deprecate": { 2580 | "version": "1.0.2", 2581 | "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", 2582 | "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==" 2583 | }, 2584 | "node_modules/uuid": { 2585 | "version": "8.0.0", 2586 | "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.0.0.tgz", 2587 | "integrity": "sha512-jOXGuXZAWdsTH7eZLtyXMqUb9EcWMGZNbL9YcGBJl4MH4nrxHmZJhEHvyLFrkxo+28uLb/NYRcStH48fnD0Vzw==", 2588 | "bin": { 2589 | "uuid": "dist/bin/uuid" 2590 | } 2591 | }, 2592 | "node_modules/watchpack": { 2593 | "version": "2.4.0", 2594 | "resolved": "https://registry.npmjs.org/watchpack/-/watchpack-2.4.0.tgz", 2595 | "integrity": "sha512-Lcvm7MGST/4fup+ifyKi2hjyIAwcdI4HRgtvTpIUxBRhB+RFtUh8XtDOxUfctVCnhVi+QQj49i91OyvzkJl6cg==", 2596 | "dependencies": { 2597 | "glob-to-regexp": "^0.4.1", 2598 | "graceful-fs": "^4.1.2" 2599 | }, 2600 | "engines": { 2601 | "node": ">=10.13.0" 2602 | } 2603 | }, 2604 | "node_modules/which-typed-array": { 2605 | "version": "1.1.13", 2606 | "resolved": "https://registry.npmjs.org/which-typed-array/-/which-typed-array-1.1.13.tgz", 2607 | "integrity": "sha512-P5Nra0qjSncduVPEAr7xhoF5guty49ArDTwzJ/yNuPIbZppyRxFQsRCWrocxIY+CnMVG+qfbU2FmDKyvSGClow==", 2608 | "dependencies": { 2609 | "available-typed-arrays": "^1.0.5", 2610 | "call-bind": "^1.0.4", 2611 | "for-each": "^0.3.3", 2612 | "gopd": "^1.0.1", 2613 | "has-tostringtag": "^1.0.0" 2614 | }, 2615 | "engines": { 2616 | "node": ">= 0.4" 2617 | }, 2618 | "funding": { 2619 | "url": "https://github.com/sponsors/ljharb" 2620 | } 2621 | }, 2622 | "node_modules/xml2js": { 2623 | "version": "0.5.0", 2624 | "resolved": "https://registry.npmjs.org/xml2js/-/xml2js-0.5.0.tgz", 2625 | "integrity": "sha512-drPFnkQJik/O+uPKpqSgr22mpuFHqKdbS835iAQrUC73L2F5WkboIRd63ai/2Yg6I1jzifPFKH2NTK+cfglkIA==", 2626 | "dependencies": { 2627 | "sax": ">=0.6.0", 2628 | "xmlbuilder": "~11.0.0" 2629 | }, 2630 | "engines": { 2631 | "node": ">=4.0.0" 2632 | } 2633 | }, 2634 | "node_modules/xmlbuilder": { 2635 | "version": "11.0.1", 2636 | "resolved": "https://registry.npmjs.org/xmlbuilder/-/xmlbuilder-11.0.1.tgz", 2637 | "integrity": "sha512-fDlsI/kFEx7gLvbecc0/ohLG50fugQp8ryHzMTuW9vSa1GJ0XYWKnhsUx7oie3G98+r56aTQIUB4kht42R3JvA==", 2638 | "engines": { 2639 | "node": ">=4.0" 2640 | } 2641 | } 2642 | } 2643 | } 2644 | -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "my-ion-app", 3 | "version": "0.1.0", 4 | "private": true, 5 | "scripts": { 6 | "load": "sst link tsx load.ts", 7 | "build": "next build", 8 | "dev": "sst link next dev", 9 | "lint": "next lint" 10 | }, 11 | "dependencies": { 12 | "@aws-sdk/client-dynamodb": "^3.494.0", 13 | "@aws-sdk/client-s3": "^3.495.0", 14 | "@aws-sdk/lib-dynamodb": "^3.494.0", 15 | "@heroicons/react": "^2.1.1", 16 | "aws-sdk": "^2.1532.0", 17 | "cheerio": "1.0.0-rc.12", 18 | "file-type": "^19.0.0", 19 | "next": "14.0.4", 20 | "react": "^18", 21 | "react-dom": "^18", 22 | "sst": "3.0.1-13", 23 | "tsx": "^4.7.0" 24 | }, 25 | "devDependencies": { 26 | "@types/node": "^20", 27 | "@types/react": "^18", 28 | "@types/react-dom": "^18", 29 | "typescript": "^5" 30 | } 31 | } 32 | -------------------------------------------------------------------------------- /public/apple-touch-icon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sst/demo-ai-app/94b4dfdea1a135274bd2b9ae7ac051e274eef5b2/public/apple-touch-icon.png -------------------------------------------------------------------------------- /public/favicon.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sst/demo-ai-app/94b4dfdea1a135274bd2b9ae7ac051e274eef5b2/public/favicon.ico -------------------------------------------------------------------------------- /public/icon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sst/demo-ai-app/94b4dfdea1a135274bd2b9ae7ac051e274eef5b2/public/icon.png -------------------------------------------------------------------------------- /public/opengraph-image.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sst/demo-ai-app/94b4dfdea1a135274bd2b9ae7ac051e274eef5b2/public/opengraph-image.png -------------------------------------------------------------------------------- /screenshot.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sst/demo-ai-app/94b4dfdea1a135274bd2b9ae7ac051e274eef5b2/screenshot.png -------------------------------------------------------------------------------- /sst-env.d.ts: -------------------------------------------------------------------------------- 1 | /// 2 | 3 | -------------------------------------------------------------------------------- /sst.config.ts: -------------------------------------------------------------------------------- 1 | /// 2 | 3 | export default $config({ 4 | app(input) { 5 | return { 6 | name: "movies", 7 | removalPolicy: input?.stage === "production" ? "retain" : "remove", 8 | providers: { 9 | aws: { 10 | profile: input?.stage === "production" ? "sst-production" : undefined, 11 | }, 12 | }, 13 | }; 14 | }, 15 | async run() { 16 | const db = new aws.dynamodb.Table("Movies", { 17 | hashKey: "id", 18 | billingMode: "PAY_PER_REQUEST", 19 | attributes: [{ name: "id", type: "S" }], 20 | }); 21 | 22 | const bucket = new sst.Bucket("Assets", { 23 | public: true, 24 | }); 25 | 26 | const vector = new sst.Vector("Vector", { 27 | model: "text-embedding-ada-002", 28 | openAiApiKey: new sst.Secret("OpenAiApiKey").value, 29 | }); 30 | 31 | const site = new sst.Nextjs("Web", { 32 | link: [db, bucket, vector], 33 | domain: $app.stage === "production" ? "movies.sst.dev" : undefined, 34 | }); 35 | 36 | return { 37 | Table: db.name, 38 | Bucket: bucket.name, 39 | }; 40 | }, 41 | }); 42 | -------------------------------------------------------------------------------- /tsconfig.json: -------------------------------------------------------------------------------- 1 | { 2 | "compilerOptions": { 3 | "target": "es5", 4 | "lib": ["dom", "dom.iterable", "esnext"], 5 | "allowJs": true, 6 | "skipLibCheck": true, 7 | "downlevelIteration": true, 8 | "strict": true, 9 | "noEmit": true, 10 | "esModuleInterop": true, 11 | "module": "esnext", 12 | "moduleResolution": "bundler", 13 | "resolveJsonModule": true, 14 | "isolatedModules": true, 15 | "jsx": "preserve", 16 | "incremental": true, 17 | "plugins": [ 18 | { 19 | "name": "next" 20 | } 21 | ], 22 | "paths": { 23 | "@/*": ["./*"] 24 | } 25 | }, 26 | "include": ["next-env.d.ts", "**/*.ts", "**/*.tsx", ".next/types/**/*.ts"], 27 | "exclude": ["node_modules", "sst.config.ts"] 28 | } 29 | --------------------------------------------------------------------------------