├── .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 | 
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 |

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 |
93 | {resultIds.map((id) => {
94 | const movie = results.find((m) => m.id === id)!;
95 | const related = movie.data;
96 | return (
97 |
103 | );
104 | })}
105 |
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 |
13 | {data &&
14 | data.map((movie) => {
15 | const { data } = movie;
16 | return (
17 |
23 | );
24 | })}
25 |
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 |
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 |
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 |
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 |
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 |
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 |
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 |
--------------------------------------------------------------------------------