├── .gitignore
├── .npmrc
├── README.md
├── package.json
├── pnpm-lock.yaml
├── src
├── app.html
├── lib
│ └── index.js
└── routes
│ ├── +page.svelte
│ └── send
│ └── +server.js
├── static
└── favicon.png
├── svelte.config.js
└── vite.config.js
/.gitignore:
--------------------------------------------------------------------------------
1 | node_modules
2 |
3 | # Output
4 | .output
5 | .vercel
6 | /.svelte-kit
7 | /build
8 |
9 | # OS
10 | .DS_Store
11 | Thumbs.db
12 |
13 | # Env
14 | .env
15 | .env.*
16 | !.env.example
17 | !.env.test
18 |
19 | # Vite
20 | vite.config.js.timestamp-*
21 | vite.config.ts.timestamp-*
22 |
--------------------------------------------------------------------------------
/.npmrc:
--------------------------------------------------------------------------------
1 | engine-strict=true
2 |
--------------------------------------------------------------------------------
/README.md:
--------------------------------------------------------------------------------
1 | # Serverless Email API Powered by Sveltekit, Nodemailer and Gmail SMTP
2 |
3 | This repository contains a SvelteKit application deployed on Vercel, providing an API endpoint to send emails using Nodemailer and Gmail's SMTP server.
4 |
5 | > This repository does not work on Cloudflare due does not support Nodemailer, that's why we are using Vercel instead, but you can use Netlify or other hosting services compatible with Nodemailer. To use this repository in other hosting services, you need to change the `adapter` in `svelte.config.js` to the one that supports your hosting service.
6 |
7 | ## Features
8 |
9 | - **Send Emails**: Send emails by making a `POST` request to the `/send` endpoint.
10 | - **Authorization**: Secures the endpoint with a Bearer token.
11 | - **JSON Payload**: Accepts email details (`from`, `to`, `subject`, `html`) in JSON format.
12 |
13 | ## Prerequisites
14 |
15 | - **Node.js and npm**: [Install Node.js](https://nodejs.org/)
16 | - **Gmail Account**: A Gmail account with App Passwords enabled (if using two-factor authentication)
17 | - **Vercel Account**: [Sign up for Vercel](https://vercel.com/signup)
18 |
19 | ## Quick Setup
20 |
21 | ### 1. [Set Up Gmail App Password](#4-set-up-gmail-app-password)
22 |
23 | ### 2. Deploy to Vercel
24 |
25 | [](https://vercel.com/new/clone?repository-url=https%3A%2F%2Fgithub.com%2Fmanuelernestog%2Fserverless-email-sender-api&env=AUTH_TOKEN,SMTP_USERNAME,SMTP_PASSWORD&project-name=serverless-email-sender-api&repository-name=serverless-email-sender-api)
26 |
27 | #### Configure your env vars:
28 |
29 | ```ini
30 | AUTH_TOKEN=your_authorization_token // Set a random auth token for use it later on your requests
31 | SMTP_USERNAME=your_gmail_address@gmail.com
32 | SMTP_PASSWORD=your_gmail_app_password
33 | ```
34 |
35 | ### 3. [Send your first email!](#usage)
36 |
37 |
38 |
39 | ## Local Setup
40 |
41 | ### 1. Clone the Repository
42 |
43 | ```bash
44 | git clone https://github.com/your-username/your-repo.git
45 | cd your-repo
46 | ```
47 |
48 | ### 2. Install Dependencies
49 |
50 | ```bash
51 | npm install
52 | ```
53 |
54 | ### 3. Configure Environment Variables
55 |
56 | Create a `.env` file in the root directory:
57 |
58 | ```ini
59 | AUTH_TOKEN=your_authorization_token
60 | SMTP_USERNAME=your_gmail_address@gmail.com
61 | SMTP_PASSWORD=your_gmail_app_password
62 | ```
63 |
64 | **Note**: Do not commit the `.env` file to version control to keep your credentials secure.
65 |
66 | ### 4. Set Up Gmail App Password
67 |
68 | If you have two-factor authentication enabled on your Gmail account, you'll need to generate an App Password.
69 |
70 | #### How to Configure an App Password for Your Gmail Account
71 |
72 | 1. **Enable Two-Factor Authentication (if not already enabled)**:
73 | - Go to your Google Account security settings: [Google Account Security](https://myaccount.google.com/security)
74 | - Under "Signing in to Google," select **2-Step Verification** and follow the prompts to enable it.
75 |
76 | 2. **Generate an App Password**:
77 | - Return to the [Google Account Security](https://myaccount.google.com/security) page.
78 | - Under "Signing in to Google," select **App Passwords** or type in the search bar **App Passwords**
79 | - Follow the prompts to enable it
80 | - Google will generate a 16-character app password. Copy this password; you'll need it for the `SMTP_PASSWORD` environment variable.
81 |
82 | **Important**: Keep this app password secure and do not share it.
83 |
84 | ### 5. Run Locally
85 |
86 | ```bash
87 | npm run dev
88 | ```
89 |
90 | The application will be available at `http://localhost:5173`.
91 |
92 | ### 6. Test the API
93 |
94 | Make a `POST` request to `http://localhost:5173/send` with the appropriate headers and body.
95 |
96 | #### Example Request
97 |
98 | ```bash
99 | curl -X POST http://localhost:5173/send \
100 | -H "Authorization: Bearer your_authorization_token" \
101 | -H "Content-Type: application/json" \
102 | -d '{
103 | "from": "your_gmail_address@gmail.com",
104 | "to": "recipient@example.com",
105 | "subject": "Hello World",
106 | "html": "
It works! "
107 | }'
108 | ```
109 |
110 |
111 | ### 6 Deploy to Vercel
112 |
113 | #### Import Project into Vercel
114 |
115 | 1. **Log In to Vercel**: Go to [Vercel Dashboard](https://vercel.com/dashboard) and log in.
116 |
117 | 2. **Import Project**:
118 | - Click on **"New Project"**.
119 | - Select the Git repository containing your SvelteKit application.
120 |
121 | 3. **Configure Project Settings**:
122 | - **Framework Preset**: Vercel should auto-detect SvelteKit.
123 | - **Build Command**: `npm run build`
124 | - **Output Directory**: `build`
125 |
126 | #### Set Environment Variables
127 |
128 | In the **"Environment Variables"** section, add the following variables:
129 |
130 | - `AUTH_TOKEN`
131 | - `SMTP_USERNAME`
132 | - `SMTP_PASSWORD`
133 |
134 | **Note**: Vercel supports different environment variable configurations for development, preview, and production environments.
135 |
136 | #### Deploy the Project
137 |
138 | - Click **"Deploy"** to start the deployment process.
139 |
140 | ## Usage
141 |
142 | ### Endpoint
143 |
144 | - **URL**: `https://your-pages-domain/send`
145 | - **Method**: `POST`
146 | - **Headers**:
147 | - `Authorization: Bearer your_authorization_token`
148 | - `Content-Type: application/json`
149 | - **Body**:
150 |
151 | ```json
152 | {
153 | "from": "your_gmail_address@gmail.com",
154 | "to": "recipient@example.com",
155 | "subject": "Hello World",
156 | "html": "It works! "
157 | }
158 | ```
159 |
160 | ### Responses
161 |
162 | - **200 OK**: Email sent successfully.
163 | - **400 Bad Request**: Missing required fields or invalid JSON.
164 | - **401 Unauthorized**: Missing or malformed `Authorization` header.
165 | - **403 Forbidden**: Invalid authorization token.
166 | - **500 Internal Server Error**: An error occurred on the server.
167 |
168 | ## Notes
169 |
170 | - **Gmail SMTP**: Ensure that you have enabled [App Passwords](https://support.google.com/accounts/answer/185833) if you have two-factor authentication enabled.
171 | - **Security**: Never expose your SMTP credentials in the code or commit them to version control.
172 | - **Multiple Recipients**: The `to` field can be a single email address or an array of email addresses.
173 | - **Email Limits**: Gmail has sending limits; for higher volumes, consider using a professional email service.
174 |
175 | ## Troubleshooting
176 |
177 | - **Authentication Issues**: Verify your SMTP credentials and ensure App Passwords are used if necessary.
178 | - **Email Delivery Problems**: Check your Gmail account for any security alerts or issues.
179 | - **Environment Variables**: Ensure environment variables are correctly set both locally and in Vercel.
180 |
181 | ## Extra
182 |
183 | ### **Configure Custom Domain Alias in Gmail**
184 |
185 | #### **1. Access Gmail Settings**
186 |
187 | - Log in to your Gmail account.
188 | - Click on the **gear icon** ⚙️ in the top-right corner.
189 | - Select **"See all settings"** from the dropdown menu.
190 |
191 | #### **2. Navigate to the "Accounts and Import" Tab**
192 |
193 | - Click on the **"Accounts and Import"** tab at the top.
194 |
195 | #### **3. Add Your Custom Email Address**
196 |
197 | - In the **"Send mail as"** section, click on **"Add another email address"**.
198 |
199 | #### **4. Enter Your Custom Email Details**
200 |
201 | - **Name**: Enter the name you want recipients to see.
202 | - **Email address**: Enter your custom domain email (e.g., `you@yourdomain.com`).
203 | - **Treat as an alias**: Keep this checked if you want to receive replies in Gmail.
204 | - Click **"Next Step"**.
205 |
206 | #### **5. Choose the SMTP Server Option**
207 |
208 | ##### **Option A: Use Gmail's SMTP Servers**
209 |
210 | - **SMTP Server**: `smtp.gmail.com`
211 | - **Username**: Your full Gmail address (e.g., `yourgmail@gmail.com`).
212 | - **Password**: Your Gmail password or [App Password](https://support.google.com/accounts/answer/185833) if 2FA is enabled.
213 | - **Port**: `587` (TLS) or `465` (SSL)
214 | - **Secure Connection**: Select **"Secured connection using TLS"**.
215 | - Click **"Add Account"**.
216 |
217 | #### **6. Verify Your Email Address**
218 |
219 | - Gmail will send a verification email to your custom email address.
220 | - Access your custom email inbox (via webmail or email client).
221 | - Open the email from Gmail and click the verification link or enter the provided code in Gmail's settings.
222 |
223 | #### **7. Set Your Custom Email as Default (Optional)**
224 |
225 | - In Gmail settings under **"Send mail as"**, you can make your custom email the default address by clicking **"make default"** next to it.
226 |
227 |
228 | ## License
229 |
230 | This project is licensed under the MIT License.
231 |
232 | ## Contributing
233 |
234 | Contributions are welcome! Please open an issue or submit a pull request.
235 |
--------------------------------------------------------------------------------
/package.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "my-email-app",
3 | "version": "0.0.1",
4 | "private": true,
5 | "scripts": {
6 | "dev": "vite dev",
7 | "build": "vite build",
8 | "preview": "vite preview"
9 | },
10 | "devDependencies": {
11 | "@sveltejs/adapter-auto": "^3.0.0",
12 | "@sveltejs/adapter-vercel": "^5.4.4",
13 | "@sveltejs/kit": "^2.0.0",
14 | "@sveltejs/vite-plugin-svelte": "^3.0.0",
15 | "svelte": "^4.2.7",
16 | "vite": "^5.0.3"
17 | },
18 | "type": "module",
19 | "dependencies": {
20 | "dotenv": "^16.4.5",
21 | "nodemailer": "^6.9.15"
22 | }
23 | }
24 |
--------------------------------------------------------------------------------
/pnpm-lock.yaml:
--------------------------------------------------------------------------------
1 | lockfileVersion: '9.0'
2 |
3 | settings:
4 | autoInstallPeers: true
5 | excludeLinksFromLockfile: false
6 |
7 | importers:
8 |
9 | .:
10 | dependencies:
11 | dotenv:
12 | specifier: ^16.4.5
13 | version: 16.4.5
14 | nodemailer:
15 | specifier: ^6.9.15
16 | version: 6.9.15
17 | devDependencies:
18 | '@sveltejs/adapter-auto':
19 | specifier: ^3.0.0
20 | version: 3.2.4(@sveltejs/kit@2.5.27(@sveltejs/vite-plugin-svelte@3.1.2(svelte@4.2.19)(vite@5.4.5))(svelte@4.2.19)(vite@5.4.5))
21 | '@sveltejs/adapter-vercel':
22 | specifier: ^5.4.4
23 | version: 5.4.4(@sveltejs/kit@2.5.27(@sveltejs/vite-plugin-svelte@3.1.2(svelte@4.2.19)(vite@5.4.5))(svelte@4.2.19)(vite@5.4.5))
24 | '@sveltejs/kit':
25 | specifier: ^2.0.0
26 | version: 2.5.27(@sveltejs/vite-plugin-svelte@3.1.2(svelte@4.2.19)(vite@5.4.5))(svelte@4.2.19)(vite@5.4.5)
27 | '@sveltejs/vite-plugin-svelte':
28 | specifier: ^3.0.0
29 | version: 3.1.2(svelte@4.2.19)(vite@5.4.5)
30 | svelte:
31 | specifier: ^4.2.7
32 | version: 4.2.19
33 | vite:
34 | specifier: ^5.0.3
35 | version: 5.4.5
36 |
37 | packages:
38 |
39 | '@ampproject/remapping@2.3.0':
40 | resolution: {integrity: sha512-30iZtAPgz+LTIYoeivqYo853f02jBYSd5uGnGpkFV0M3xOt9aN73erkgYAmZU43x4VfqcnLxW9Kpg3R5LC4YYw==}
41 | engines: {node: '>=6.0.0'}
42 |
43 | '@esbuild/aix-ppc64@0.21.5':
44 | resolution: {integrity: sha512-1SDgH6ZSPTlggy1yI6+Dbkiz8xzpHJEVAlF/AM1tHPLsf5STom9rwtjE4hKAF20FfXXNTFqEYXyJNWh1GiZedQ==}
45 | engines: {node: '>=12'}
46 | cpu: [ppc64]
47 | os: [aix]
48 |
49 | '@esbuild/android-arm64@0.21.5':
50 | resolution: {integrity: sha512-c0uX9VAUBQ7dTDCjq+wdyGLowMdtR/GoC2U5IYk/7D1H1JYC0qseD7+11iMP2mRLN9RcCMRcjC4YMclCzGwS/A==}
51 | engines: {node: '>=12'}
52 | cpu: [arm64]
53 | os: [android]
54 |
55 | '@esbuild/android-arm@0.21.5':
56 | resolution: {integrity: sha512-vCPvzSjpPHEi1siZdlvAlsPxXl7WbOVUBBAowWug4rJHb68Ox8KualB+1ocNvT5fjv6wpkX6o/iEpbDrf68zcg==}
57 | engines: {node: '>=12'}
58 | cpu: [arm]
59 | os: [android]
60 |
61 | '@esbuild/android-x64@0.21.5':
62 | resolution: {integrity: sha512-D7aPRUUNHRBwHxzxRvp856rjUHRFW1SdQATKXH2hqA0kAZb1hKmi02OpYRacl0TxIGz/ZmXWlbZgjwWYaCakTA==}
63 | engines: {node: '>=12'}
64 | cpu: [x64]
65 | os: [android]
66 |
67 | '@esbuild/darwin-arm64@0.21.5':
68 | resolution: {integrity: sha512-DwqXqZyuk5AiWWf3UfLiRDJ5EDd49zg6O9wclZ7kUMv2WRFr4HKjXp/5t8JZ11QbQfUS6/cRCKGwYhtNAY88kQ==}
69 | engines: {node: '>=12'}
70 | cpu: [arm64]
71 | os: [darwin]
72 |
73 | '@esbuild/darwin-x64@0.21.5':
74 | resolution: {integrity: sha512-se/JjF8NlmKVG4kNIuyWMV/22ZaerB+qaSi5MdrXtd6R08kvs2qCN4C09miupktDitvh8jRFflwGFBQcxZRjbw==}
75 | engines: {node: '>=12'}
76 | cpu: [x64]
77 | os: [darwin]
78 |
79 | '@esbuild/freebsd-arm64@0.21.5':
80 | resolution: {integrity: sha512-5JcRxxRDUJLX8JXp/wcBCy3pENnCgBR9bN6JsY4OmhfUtIHe3ZW0mawA7+RDAcMLrMIZaf03NlQiX9DGyB8h4g==}
81 | engines: {node: '>=12'}
82 | cpu: [arm64]
83 | os: [freebsd]
84 |
85 | '@esbuild/freebsd-x64@0.21.5':
86 | resolution: {integrity: sha512-J95kNBj1zkbMXtHVH29bBriQygMXqoVQOQYA+ISs0/2l3T9/kj42ow2mpqerRBxDJnmkUDCaQT/dfNXWX/ZZCQ==}
87 | engines: {node: '>=12'}
88 | cpu: [x64]
89 | os: [freebsd]
90 |
91 | '@esbuild/linux-arm64@0.21.5':
92 | resolution: {integrity: sha512-ibKvmyYzKsBeX8d8I7MH/TMfWDXBF3db4qM6sy+7re0YXya+K1cem3on9XgdT2EQGMu4hQyZhan7TeQ8XkGp4Q==}
93 | engines: {node: '>=12'}
94 | cpu: [arm64]
95 | os: [linux]
96 |
97 | '@esbuild/linux-arm@0.21.5':
98 | resolution: {integrity: sha512-bPb5AHZtbeNGjCKVZ9UGqGwo8EUu4cLq68E95A53KlxAPRmUyYv2D6F0uUI65XisGOL1hBP5mTronbgo+0bFcA==}
99 | engines: {node: '>=12'}
100 | cpu: [arm]
101 | os: [linux]
102 |
103 | '@esbuild/linux-ia32@0.21.5':
104 | resolution: {integrity: sha512-YvjXDqLRqPDl2dvRODYmmhz4rPeVKYvppfGYKSNGdyZkA01046pLWyRKKI3ax8fbJoK5QbxblURkwK/MWY18Tg==}
105 | engines: {node: '>=12'}
106 | cpu: [ia32]
107 | os: [linux]
108 |
109 | '@esbuild/linux-loong64@0.21.5':
110 | resolution: {integrity: sha512-uHf1BmMG8qEvzdrzAqg2SIG/02+4/DHB6a9Kbya0XDvwDEKCoC8ZRWI5JJvNdUjtciBGFQ5PuBlpEOXQj+JQSg==}
111 | engines: {node: '>=12'}
112 | cpu: [loong64]
113 | os: [linux]
114 |
115 | '@esbuild/linux-mips64el@0.21.5':
116 | resolution: {integrity: sha512-IajOmO+KJK23bj52dFSNCMsz1QP1DqM6cwLUv3W1QwyxkyIWecfafnI555fvSGqEKwjMXVLokcV5ygHW5b3Jbg==}
117 | engines: {node: '>=12'}
118 | cpu: [mips64el]
119 | os: [linux]
120 |
121 | '@esbuild/linux-ppc64@0.21.5':
122 | resolution: {integrity: sha512-1hHV/Z4OEfMwpLO8rp7CvlhBDnjsC3CttJXIhBi+5Aj5r+MBvy4egg7wCbe//hSsT+RvDAG7s81tAvpL2XAE4w==}
123 | engines: {node: '>=12'}
124 | cpu: [ppc64]
125 | os: [linux]
126 |
127 | '@esbuild/linux-riscv64@0.21.5':
128 | resolution: {integrity: sha512-2HdXDMd9GMgTGrPWnJzP2ALSokE/0O5HhTUvWIbD3YdjME8JwvSCnNGBnTThKGEB91OZhzrJ4qIIxk/SBmyDDA==}
129 | engines: {node: '>=12'}
130 | cpu: [riscv64]
131 | os: [linux]
132 |
133 | '@esbuild/linux-s390x@0.21.5':
134 | resolution: {integrity: sha512-zus5sxzqBJD3eXxwvjN1yQkRepANgxE9lgOW2qLnmr8ikMTphkjgXu1HR01K4FJg8h1kEEDAqDcZQtbrRnB41A==}
135 | engines: {node: '>=12'}
136 | cpu: [s390x]
137 | os: [linux]
138 |
139 | '@esbuild/linux-x64@0.21.5':
140 | resolution: {integrity: sha512-1rYdTpyv03iycF1+BhzrzQJCdOuAOtaqHTWJZCWvijKD2N5Xu0TtVC8/+1faWqcP9iBCWOmjmhoH94dH82BxPQ==}
141 | engines: {node: '>=12'}
142 | cpu: [x64]
143 | os: [linux]
144 |
145 | '@esbuild/netbsd-x64@0.21.5':
146 | resolution: {integrity: sha512-Woi2MXzXjMULccIwMnLciyZH4nCIMpWQAs049KEeMvOcNADVxo0UBIQPfSmxB3CWKedngg7sWZdLvLczpe0tLg==}
147 | engines: {node: '>=12'}
148 | cpu: [x64]
149 | os: [netbsd]
150 |
151 | '@esbuild/openbsd-x64@0.21.5':
152 | resolution: {integrity: sha512-HLNNw99xsvx12lFBUwoT8EVCsSvRNDVxNpjZ7bPn947b8gJPzeHWyNVhFsaerc0n3TsbOINvRP2byTZ5LKezow==}
153 | engines: {node: '>=12'}
154 | cpu: [x64]
155 | os: [openbsd]
156 |
157 | '@esbuild/sunos-x64@0.21.5':
158 | resolution: {integrity: sha512-6+gjmFpfy0BHU5Tpptkuh8+uw3mnrvgs+dSPQXQOv3ekbordwnzTVEb4qnIvQcYXq6gzkyTnoZ9dZG+D4garKg==}
159 | engines: {node: '>=12'}
160 | cpu: [x64]
161 | os: [sunos]
162 |
163 | '@esbuild/win32-arm64@0.21.5':
164 | resolution: {integrity: sha512-Z0gOTd75VvXqyq7nsl93zwahcTROgqvuAcYDUr+vOv8uHhNSKROyU961kgtCD1e95IqPKSQKH7tBTslnS3tA8A==}
165 | engines: {node: '>=12'}
166 | cpu: [arm64]
167 | os: [win32]
168 |
169 | '@esbuild/win32-ia32@0.21.5':
170 | resolution: {integrity: sha512-SWXFF1CL2RVNMaVs+BBClwtfZSvDgtL//G/smwAc5oVK/UPu2Gu9tIaRgFmYFFKrmg3SyAjSrElf0TiJ1v8fYA==}
171 | engines: {node: '>=12'}
172 | cpu: [ia32]
173 | os: [win32]
174 |
175 | '@esbuild/win32-x64@0.21.5':
176 | resolution: {integrity: sha512-tQd/1efJuzPC6rCFwEvLtci/xNFcTZknmXs98FYDfGE4wP9ClFV98nyKrzJKVPMhdDnjzLhdUyMX4PsQAPjwIw==}
177 | engines: {node: '>=12'}
178 | cpu: [x64]
179 | os: [win32]
180 |
181 | '@jridgewell/gen-mapping@0.3.5':
182 | resolution: {integrity: sha512-IzL8ZoEDIBRWEzlCcRhOaCupYyN5gdIK+Q6fbFdPDg6HqX6jpkItn7DFIpW9LQzXG6Df9sA7+OKnq0qlz/GaQg==}
183 | engines: {node: '>=6.0.0'}
184 |
185 | '@jridgewell/resolve-uri@3.1.2':
186 | resolution: {integrity: sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==}
187 | engines: {node: '>=6.0.0'}
188 |
189 | '@jridgewell/set-array@1.2.1':
190 | resolution: {integrity: sha512-R8gLRTZeyp03ymzP/6Lil/28tGeGEzhx1q2k703KGWRAI1VdvPIXdG70VJc2pAMw3NA6JKL5hhFu1sJX0Mnn/A==}
191 | engines: {node: '>=6.0.0'}
192 |
193 | '@jridgewell/sourcemap-codec@1.5.0':
194 | resolution: {integrity: sha512-gv3ZRaISU3fjPAgNsriBRqGWQL6quFx04YMPW/zD8XMLsU32mhCCbfbO6KZFLjvYpCZ8zyDEgqsgf+PwPaM7GQ==}
195 |
196 | '@jridgewell/trace-mapping@0.3.25':
197 | resolution: {integrity: sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ==}
198 |
199 | '@mapbox/node-pre-gyp@1.0.11':
200 | resolution: {integrity: sha512-Yhlar6v9WQgUp/He7BdgzOz8lqMQ8sU+jkCq7Wx8Myc5YFJLbEe7lgui/V7G1qB1DJykHSGwreceSaD60Y0PUQ==}
201 | hasBin: true
202 |
203 | '@polka/url@1.0.0-next.25':
204 | resolution: {integrity: sha512-j7P6Rgr3mmtdkeDGTe0E/aYyWEWVtc5yFXtHCRHs28/jptDEWfaVOc5T7cblqy1XKPPfCxJc/8DwQ5YgLOZOVQ==}
205 |
206 | '@rollup/pluginutils@4.2.1':
207 | resolution: {integrity: sha512-iKnFXr7NkdZAIHiIWE+BX5ULi/ucVFYWD6TbAV+rZctiRTY2PL6tsIKhoIOaoskiWAkgu+VsbXgUVDNLHf+InQ==}
208 | engines: {node: '>= 8.0.0'}
209 |
210 | '@rollup/rollup-android-arm-eabi@4.21.3':
211 | resolution: {integrity: sha512-MmKSfaB9GX+zXl6E8z4koOr/xU63AMVleLEa64v7R0QF/ZloMs5vcD1sHgM64GXXS1csaJutG+ddtzcueI/BLg==}
212 | cpu: [arm]
213 | os: [android]
214 |
215 | '@rollup/rollup-android-arm64@4.21.3':
216 | resolution: {integrity: sha512-zrt8ecH07PE3sB4jPOggweBjJMzI1JG5xI2DIsUbkA+7K+Gkjys6eV7i9pOenNSDJH3eOr/jLb/PzqtmdwDq5g==}
217 | cpu: [arm64]
218 | os: [android]
219 |
220 | '@rollup/rollup-darwin-arm64@4.21.3':
221 | resolution: {integrity: sha512-P0UxIOrKNBFTQaXTxOH4RxuEBVCgEA5UTNV6Yz7z9QHnUJ7eLX9reOd/NYMO3+XZO2cco19mXTxDMXxit4R/eQ==}
222 | cpu: [arm64]
223 | os: [darwin]
224 |
225 | '@rollup/rollup-darwin-x64@4.21.3':
226 | resolution: {integrity: sha512-L1M0vKGO5ASKntqtsFEjTq/fD91vAqnzeaF6sfNAy55aD+Hi2pBI5DKwCO+UNDQHWsDViJLqshxOahXyLSh3EA==}
227 | cpu: [x64]
228 | os: [darwin]
229 |
230 | '@rollup/rollup-linux-arm-gnueabihf@4.21.3':
231 | resolution: {integrity: sha512-btVgIsCjuYFKUjopPoWiDqmoUXQDiW2A4C3Mtmp5vACm7/GnyuprqIDPNczeyR5W8rTXEbkmrJux7cJmD99D2g==}
232 | cpu: [arm]
233 | os: [linux]
234 |
235 | '@rollup/rollup-linux-arm-musleabihf@4.21.3':
236 | resolution: {integrity: sha512-zmjbSphplZlau6ZTkxd3+NMtE4UKVy7U4aVFMmHcgO5CUbw17ZP6QCgyxhzGaU/wFFdTfiojjbLG3/0p9HhAqA==}
237 | cpu: [arm]
238 | os: [linux]
239 |
240 | '@rollup/rollup-linux-arm64-gnu@4.21.3':
241 | resolution: {integrity: sha512-nSZfcZtAnQPRZmUkUQwZq2OjQciR6tEoJaZVFvLHsj0MF6QhNMg0fQ6mUOsiCUpTqxTx0/O6gX0V/nYc7LrgPw==}
242 | cpu: [arm64]
243 | os: [linux]
244 |
245 | '@rollup/rollup-linux-arm64-musl@4.21.3':
246 | resolution: {integrity: sha512-MnvSPGO8KJXIMGlQDYfvYS3IosFN2rKsvxRpPO2l2cum+Z3exiExLwVU+GExL96pn8IP+GdH8Tz70EpBhO0sIQ==}
247 | cpu: [arm64]
248 | os: [linux]
249 |
250 | '@rollup/rollup-linux-powerpc64le-gnu@4.21.3':
251 | resolution: {integrity: sha512-+W+p/9QNDr2vE2AXU0qIy0qQE75E8RTwTwgqS2G5CRQ11vzq0tbnfBd6brWhS9bCRjAjepJe2fvvkvS3dno+iw==}
252 | cpu: [ppc64]
253 | os: [linux]
254 |
255 | '@rollup/rollup-linux-riscv64-gnu@4.21.3':
256 | resolution: {integrity: sha512-yXH6K6KfqGXaxHrtr+Uoy+JpNlUlI46BKVyonGiaD74ravdnF9BUNC+vV+SIuB96hUMGShhKV693rF9QDfO6nQ==}
257 | cpu: [riscv64]
258 | os: [linux]
259 |
260 | '@rollup/rollup-linux-s390x-gnu@4.21.3':
261 | resolution: {integrity: sha512-R8cwY9wcnApN/KDYWTH4gV/ypvy9yZUHlbJvfaiXSB48JO3KpwSpjOGqO4jnGkLDSk1hgjYkTbTt6Q7uvPf8eg==}
262 | cpu: [s390x]
263 | os: [linux]
264 |
265 | '@rollup/rollup-linux-x64-gnu@4.21.3':
266 | resolution: {integrity: sha512-kZPbX/NOPh0vhS5sI+dR8L1bU2cSO9FgxwM8r7wHzGydzfSjLRCFAT87GR5U9scj2rhzN3JPYVC7NoBbl4FZ0g==}
267 | cpu: [x64]
268 | os: [linux]
269 |
270 | '@rollup/rollup-linux-x64-musl@4.21.3':
271 | resolution: {integrity: sha512-S0Yq+xA1VEH66uiMNhijsWAafffydd2X5b77eLHfRmfLsRSpbiAWiRHV6DEpz6aOToPsgid7TI9rGd6zB1rhbg==}
272 | cpu: [x64]
273 | os: [linux]
274 |
275 | '@rollup/rollup-win32-arm64-msvc@4.21.3':
276 | resolution: {integrity: sha512-9isNzeL34yquCPyerog+IMCNxKR8XYmGd0tHSV+OVx0TmE0aJOo9uw4fZfUuk2qxobP5sug6vNdZR6u7Mw7Q+Q==}
277 | cpu: [arm64]
278 | os: [win32]
279 |
280 | '@rollup/rollup-win32-ia32-msvc@4.21.3':
281 | resolution: {integrity: sha512-nMIdKnfZfzn1Vsk+RuOvl43ONTZXoAPUUxgcU0tXooqg4YrAqzfKzVenqqk2g5efWh46/D28cKFrOzDSW28gTA==}
282 | cpu: [ia32]
283 | os: [win32]
284 |
285 | '@rollup/rollup-win32-x64-msvc@4.21.3':
286 | resolution: {integrity: sha512-fOvu7PCQjAj4eWDEuD8Xz5gpzFqXzGlxHZozHP4b9Jxv9APtdxL6STqztDzMLuRXEc4UpXGGhx029Xgm91QBeA==}
287 | cpu: [x64]
288 | os: [win32]
289 |
290 | '@sveltejs/adapter-auto@3.2.4':
291 | resolution: {integrity: sha512-a64AKYbfTUrVwU0xslzv1Jf3M8bj0IwhptaXmhgIkjXspBXhD0od9JiItQHchijpLMGdEDcYBlvqySkEawv6mQ==}
292 | peerDependencies:
293 | '@sveltejs/kit': ^2.0.0
294 |
295 | '@sveltejs/adapter-vercel@5.4.4':
296 | resolution: {integrity: sha512-KORoxxqB2H5DrxpCHc9Yfijcgvmoaaz6G6eKHEg9fRlTsujJkxN26C0x4YlcgxqDU4dLIi1wfSLHpuZD0E4Irg==}
297 | peerDependencies:
298 | '@sveltejs/kit': ^2.4.0
299 |
300 | '@sveltejs/kit@2.5.27':
301 | resolution: {integrity: sha512-CcbRTzl+65oWljAASL6UlxM4x3NWwd0fjq5fQOfP243vs50myFQ8lil0fr3Im6HeeQqYUCtnv8HjO8REWVPjTw==}
302 | engines: {node: '>=18.13'}
303 | hasBin: true
304 | peerDependencies:
305 | '@sveltejs/vite-plugin-svelte': ^3.0.0 || ^4.0.0-next.1
306 | svelte: ^4.0.0 || ^5.0.0-next.0
307 | vite: ^5.0.3
308 |
309 | '@sveltejs/vite-plugin-svelte-inspector@2.1.0':
310 | resolution: {integrity: sha512-9QX28IymvBlSCqsCll5t0kQVxipsfhFFL+L2t3nTWfXnddYwxBuAEtTtlaVQpRz9c37BhJjltSeY4AJSC03SSg==}
311 | engines: {node: ^18.0.0 || >=20}
312 | peerDependencies:
313 | '@sveltejs/vite-plugin-svelte': ^3.0.0
314 | svelte: ^4.0.0 || ^5.0.0-next.0
315 | vite: ^5.0.0
316 |
317 | '@sveltejs/vite-plugin-svelte@3.1.2':
318 | resolution: {integrity: sha512-Txsm1tJvtiYeLUVRNqxZGKR/mI+CzuIQuc2gn+YCs9rMTowpNZ2Nqt53JdL8KF9bLhAf2ruR/dr9eZCwdTriRA==}
319 | engines: {node: ^18.0.0 || >=20}
320 | peerDependencies:
321 | svelte: ^4.0.0 || ^5.0.0-next.0
322 | vite: ^5.0.0
323 |
324 | '@types/cookie@0.6.0':
325 | resolution: {integrity: sha512-4Kh9a6B2bQciAhf7FSuMRRkUWecJgJu9nPnx3yzpsfXX/c50REIqpHY4C82bXP90qrLtXtkDxTZosYO3UpOwlA==}
326 |
327 | '@types/estree@1.0.5':
328 | resolution: {integrity: sha512-/kYRxGDLWzHOB7q+wtSUQlFrtcdUccpfy+X+9iMBpHK8QLLhx2wIPYuS5DYtR9Wa/YlZAbIovy7qVdB1Aq6Lyw==}
329 |
330 | '@vercel/nft@0.27.4':
331 | resolution: {integrity: sha512-Rioz3LJkEKicKCi9BSyc1RXZ5R6GmXosFMeBSThh6msWSOiArKhb7c75MiWwZEgPL7x0/l3TAfH/l0cxKNuUFA==}
332 | engines: {node: '>=16'}
333 | hasBin: true
334 |
335 | abbrev@1.1.1:
336 | resolution: {integrity: sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==}
337 |
338 | acorn-import-attributes@1.9.5:
339 | resolution: {integrity: sha512-n02Vykv5uA3eHGM/Z2dQrcD56kL8TyDb2p1+0P83PClMnC/nc+anbQRhIOWnSq4Ke/KvDPrY3C9hDtC/A3eHnQ==}
340 | peerDependencies:
341 | acorn: ^8
342 |
343 | acorn@8.12.1:
344 | resolution: {integrity: sha512-tcpGyI9zbizT9JbV6oYE477V6mTlXvvi0T0G3SNIYE2apm/G5huBa1+K89VGeovbg+jycCrfhl3ADxErOuO6Jg==}
345 | engines: {node: '>=0.4.0'}
346 | hasBin: true
347 |
348 | agent-base@6.0.2:
349 | resolution: {integrity: sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==}
350 | engines: {node: '>= 6.0.0'}
351 |
352 | ansi-regex@5.0.1:
353 | resolution: {integrity: sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==}
354 | engines: {node: '>=8'}
355 |
356 | aproba@2.0.0:
357 | resolution: {integrity: sha512-lYe4Gx7QT+MKGbDsA+Z+he/Wtef0BiwDOlK/XkBrdfsh9J/jPPXbX0tE9x9cl27Tmu5gg3QUbUrQYa/y+KOHPQ==}
358 |
359 | are-we-there-yet@2.0.0:
360 | resolution: {integrity: sha512-Ci/qENmwHnsYo9xKIcUJN5LeDKdJ6R1Z1j9V/J5wyq8nh/mYPEpIKJbBZXtZjG04HiK7zV/p6Vs9952MrMeUIw==}
361 | engines: {node: '>=10'}
362 | deprecated: This package is no longer supported.
363 |
364 | aria-query@5.3.1:
365 | resolution: {integrity: sha512-Z/ZeOgVl7bcSYZ/u/rh0fOpvEpq//LZmdbkXyc7syVzjPAhfOa9ebsdTSjEBDU4vs5nC98Kfduj1uFo0qyET3g==}
366 | engines: {node: '>= 0.4'}
367 |
368 | async-sema@3.1.1:
369 | resolution: {integrity: sha512-tLRNUXati5MFePdAk8dw7Qt7DpxPB60ofAgn8WRhW6a2rcimZnYBP9oxHiv0OHy+Wz7kPMG+t4LGdt31+4EmGg==}
370 |
371 | axobject-query@4.1.0:
372 | resolution: {integrity: sha512-qIj0G9wZbMGNLjLmg1PT6v2mE9AH2zlnADJD/2tC6E00hgmhUOfEB6greHPAfLRSufHqROIUTkw6E+M3lH0PTQ==}
373 | engines: {node: '>= 0.4'}
374 |
375 | balanced-match@1.0.2:
376 | resolution: {integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==}
377 |
378 | bindings@1.5.0:
379 | resolution: {integrity: sha512-p2q/t/mhvuOj/UeLlV6566GD/guowlr0hHxClI0W9m7MWYkL1F0hLo+0Aexs9HSPCtR1SXQ0TD3MMKrXZajbiQ==}
380 |
381 | brace-expansion@1.1.11:
382 | resolution: {integrity: sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==}
383 |
384 | braces@3.0.3:
385 | resolution: {integrity: sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==}
386 | engines: {node: '>=8'}
387 |
388 | chownr@2.0.0:
389 | resolution: {integrity: sha512-bIomtDF5KGpdogkLd9VspvFzk9KfpyyGlS8YFVZl7TGPBHL5snIOnxeshwVgPteQ9b4Eydl+pVbIyE1DcvCWgQ==}
390 | engines: {node: '>=10'}
391 |
392 | code-red@1.0.4:
393 | resolution: {integrity: sha512-7qJWqItLA8/VPVlKJlFXU+NBlo/qyfs39aJcuMT/2ere32ZqvF5OSxgdM5xOfJJ7O429gg2HM47y8v9P+9wrNw==}
394 |
395 | color-support@1.1.3:
396 | resolution: {integrity: sha512-qiBjkpbMLO/HL68y+lh4q0/O1MZFj2RX6X/KmMa3+gJD3z+WwI1ZzDHysvqHGS3mP6mznPckpXmw1nI9cJjyRg==}
397 | hasBin: true
398 |
399 | concat-map@0.0.1:
400 | resolution: {integrity: sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==}
401 |
402 | console-control-strings@1.1.0:
403 | resolution: {integrity: sha512-ty/fTekppD2fIwRvnZAVdeOiGd1c7YXEixbgJTNzqcxJWKQnjJ/V1bNEEE6hygpM3WjwHFUVK6HTjWSzV4a8sQ==}
404 |
405 | cookie@0.6.0:
406 | resolution: {integrity: sha512-U71cyTamuh1CRNCfpGY6to28lxvNwPG4Guz/EVjgf3Jmzv0vlDp1atT9eS5dDjMYHucpHbWns6Lwf3BKz6svdw==}
407 | engines: {node: '>= 0.6'}
408 |
409 | css-tree@2.3.1:
410 | resolution: {integrity: sha512-6Fv1DV/TYw//QF5IzQdqsNDjx/wc8TrMBZsqjL9eW01tWb7R7k/mq+/VXfJCl7SoD5emsJop9cOByJZfs8hYIw==}
411 | engines: {node: ^10 || ^12.20.0 || ^14.13.0 || >=15.0.0}
412 |
413 | debug@4.3.7:
414 | resolution: {integrity: sha512-Er2nc/H7RrMXZBFCEim6TCmMk02Z8vLC2Rbi1KEBggpo0fS6l0S1nnapwmIi3yW/+GOJap1Krg4w0Hg80oCqgQ==}
415 | engines: {node: '>=6.0'}
416 | peerDependencies:
417 | supports-color: '*'
418 | peerDependenciesMeta:
419 | supports-color:
420 | optional: true
421 |
422 | deepmerge@4.3.1:
423 | resolution: {integrity: sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A==}
424 | engines: {node: '>=0.10.0'}
425 |
426 | delegates@1.0.0:
427 | resolution: {integrity: sha512-bd2L678uiWATM6m5Z1VzNCErI3jiGzt6HGY8OVICs40JQq/HALfbyNJmp0UDakEY4pMMaN0Ly5om/B1VI/+xfQ==}
428 |
429 | detect-libc@2.0.3:
430 | resolution: {integrity: sha512-bwy0MGW55bG41VqxxypOsdSdGqLwXPI/focwgTYCFMbdUiBAxLg9CFzG08sz2aqzknwiX7Hkl0bQENjg8iLByw==}
431 | engines: {node: '>=8'}
432 |
433 | devalue@5.0.0:
434 | resolution: {integrity: sha512-gO+/OMXF7488D+u3ue+G7Y4AA3ZmUnB3eHJXmBTgNHvr4ZNzl36A0ZtG+XCRNYCkYx/bFmw4qtkoFLa+wSrwAA==}
435 |
436 | dotenv@16.4.5:
437 | resolution: {integrity: sha512-ZmdL2rui+eB2YwhsWzjInR8LldtZHGDoQ1ugH85ppHKwpUHL7j7rN0Ti9NCnGiQbhaZ11FpR+7ao1dNsmduNUg==}
438 | engines: {node: '>=12'}
439 |
440 | emoji-regex@8.0.0:
441 | resolution: {integrity: sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==}
442 |
443 | esbuild@0.21.5:
444 | resolution: {integrity: sha512-mg3OPMV4hXywwpoDxu3Qda5xCKQi+vCTZq8S9J/EpkhB2HzKXq4SNFZE3+NK93JYxc8VMSep+lOUSC/RVKaBqw==}
445 | engines: {node: '>=12'}
446 | hasBin: true
447 |
448 | esm-env@1.0.0:
449 | resolution: {integrity: sha512-Cf6VksWPsTuW01vU9Mk/3vRue91Zevka5SjyNf3nEpokFRuqt/KjUQoGAwq9qMmhpLTHmXzSIrFRw8zxWzmFBA==}
450 |
451 | estree-walker@2.0.2:
452 | resolution: {integrity: sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==}
453 |
454 | estree-walker@3.0.3:
455 | resolution: {integrity: sha512-7RUKfXgSMMkzt6ZuXmqapOurLGPPfgj6l9uRZ7lRGolvk0y2yocc35LdcxKC5PQZdn2DMqioAQ2NoWcrTKmm6g==}
456 |
457 | file-uri-to-path@1.0.0:
458 | resolution: {integrity: sha512-0Zt+s3L7Vf1biwWZ29aARiVYLx7iMGnEUl9x33fbB/j3jR81u/O2LbqK+Bm1CDSNDKVtJ/YjwY7TUd5SkeLQLw==}
459 |
460 | fill-range@7.1.1:
461 | resolution: {integrity: sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==}
462 | engines: {node: '>=8'}
463 |
464 | fs-minipass@2.1.0:
465 | resolution: {integrity: sha512-V/JgOLFCS+R6Vcq0slCuaeWEdNC3ouDlJMNIsacH2VtALiu9mV4LPrHc5cDl8k5aw6J8jwgWWpiTo5RYhmIzvg==}
466 | engines: {node: '>= 8'}
467 |
468 | fs.realpath@1.0.0:
469 | resolution: {integrity: sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==}
470 |
471 | fsevents@2.3.3:
472 | resolution: {integrity: sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==}
473 | engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0}
474 | os: [darwin]
475 |
476 | gauge@3.0.2:
477 | resolution: {integrity: sha512-+5J6MS/5XksCuXq++uFRsnUd7Ovu1XenbeuIuNRJxYWjgQbPuFhT14lAvsWfqfAmnwluf1OwMjz39HjfLPci0Q==}
478 | engines: {node: '>=10'}
479 | deprecated: This package is no longer supported.
480 |
481 | glob@7.2.3:
482 | resolution: {integrity: sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==}
483 | deprecated: Glob versions prior to v9 are no longer supported
484 |
485 | globalyzer@0.1.0:
486 | resolution: {integrity: sha512-40oNTM9UfG6aBmuKxk/giHn5nQ8RVz/SS4Ir6zgzOv9/qC3kKZ9v4etGTcJbEl/NyVQH7FGU7d+X1egr57Md2Q==}
487 |
488 | globrex@0.1.2:
489 | resolution: {integrity: sha512-uHJgbwAMwNFf5mLst7IWLNg14x1CkeqglJb/K3doi4dw6q2IvAAmM/Y81kevy83wP+Sst+nutFTYOGg3d1lsxg==}
490 |
491 | graceful-fs@4.2.11:
492 | resolution: {integrity: sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==}
493 |
494 | has-unicode@2.0.1:
495 | resolution: {integrity: sha512-8Rf9Y83NBReMnx0gFzA8JImQACstCYWUplepDa9xprwwtmgEZUF0h/i5xSA625zB/I37EtrswSST6OXxwaaIJQ==}
496 |
497 | https-proxy-agent@5.0.1:
498 | resolution: {integrity: sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA==}
499 | engines: {node: '>= 6'}
500 |
501 | import-meta-resolve@4.1.0:
502 | resolution: {integrity: sha512-I6fiaX09Xivtk+THaMfAwnA3MVA5Big1WHF1Dfx9hFuvNIWpXnorlkzhcQf6ehrqQiiZECRt1poOAkPmer3ruw==}
503 |
504 | inflight@1.0.6:
505 | resolution: {integrity: sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==}
506 | deprecated: This module is not supported, and leaks memory. Do not use it. Check out lru-cache if you want a good and tested way to coalesce async requests by a key value, which is much more comprehensive and powerful.
507 |
508 | inherits@2.0.4:
509 | resolution: {integrity: sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==}
510 |
511 | is-fullwidth-code-point@3.0.0:
512 | resolution: {integrity: sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==}
513 | engines: {node: '>=8'}
514 |
515 | is-number@7.0.0:
516 | resolution: {integrity: sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==}
517 | engines: {node: '>=0.12.0'}
518 |
519 | is-reference@3.0.2:
520 | resolution: {integrity: sha512-v3rht/LgVcsdZa3O2Nqs+NMowLOxeOm7Ay9+/ARQ2F+qEoANRcqrjAZKGN0v8ymUetZGgkp26LTnGT7H0Qo9Pg==}
521 |
522 | kleur@4.1.5:
523 | resolution: {integrity: sha512-o+NO+8WrRiQEE4/7nwRJhN1HWpVmJm511pBHUxPLtp0BUISzlBplORYSmTclCnJvQq2tKu/sgl3xVpkc7ZWuQQ==}
524 | engines: {node: '>=6'}
525 |
526 | locate-character@3.0.0:
527 | resolution: {integrity: sha512-SW13ws7BjaeJ6p7Q6CO2nchbYEc3X3J6WrmTTDto7yMPqVSZTUyY5Tjbid+Ab8gLnATtygYtiDIJGQRRn2ZOiA==}
528 |
529 | magic-string@0.30.11:
530 | resolution: {integrity: sha512-+Wri9p0QHMy+545hKww7YAu5NyzF8iomPL/RQazugQ9+Ez4Ic3mERMd8ZTX5rfK944j+560ZJi8iAwgak1Ac7A==}
531 |
532 | make-dir@3.1.0:
533 | resolution: {integrity: sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==}
534 | engines: {node: '>=8'}
535 |
536 | mdn-data@2.0.30:
537 | resolution: {integrity: sha512-GaqWWShW4kv/G9IEucWScBx9G1/vsFZZJUO+tD26M8J8z3Kw5RDQjaoZe03YAClgeS/SWPOcb4nkFBTEi5DUEA==}
538 |
539 | micromatch@4.0.8:
540 | resolution: {integrity: sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==}
541 | engines: {node: '>=8.6'}
542 |
543 | minimatch@3.1.2:
544 | resolution: {integrity: sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==}
545 |
546 | minipass@3.3.6:
547 | resolution: {integrity: sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==}
548 | engines: {node: '>=8'}
549 |
550 | minipass@5.0.0:
551 | resolution: {integrity: sha512-3FnjYuehv9k6ovOEbyOswadCDPX1piCfhV8ncmYtHOjuPwylVWsghTLo7rabjC3Rx5xD4HDx8Wm1xnMF7S5qFQ==}
552 | engines: {node: '>=8'}
553 |
554 | minizlib@2.1.2:
555 | resolution: {integrity: sha512-bAxsR8BVfj60DWXHE3u30oHzfl4G7khkSuPW+qvpd7jFRHm7dLxOjUk1EHACJ/hxLY8phGJ0YhYHZo7jil7Qdg==}
556 | engines: {node: '>= 8'}
557 |
558 | mkdirp@1.0.4:
559 | resolution: {integrity: sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==}
560 | engines: {node: '>=10'}
561 | hasBin: true
562 |
563 | mri@1.2.0:
564 | resolution: {integrity: sha512-tzzskb3bG8LvYGFF/mDTpq3jpI6Q9wc3LEmBaghu+DdCssd1FakN7Bc0hVNmEyGq1bq3RgfkCb3cmQLpNPOroA==}
565 | engines: {node: '>=4'}
566 |
567 | mrmime@2.0.0:
568 | resolution: {integrity: sha512-eu38+hdgojoyq63s+yTpN4XMBdt5l8HhMhc4VKLO9KM5caLIBvUm4thi7fFaxyTmCKeNnXZ5pAlBwCUnhA09uw==}
569 | engines: {node: '>=10'}
570 |
571 | ms@2.1.3:
572 | resolution: {integrity: sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==}
573 |
574 | nanoid@3.3.7:
575 | resolution: {integrity: sha512-eSRppjcPIatRIMC1U6UngP8XFcz8MQWGQdt1MTBQ7NaAmvXDfvNxbvWV3x2y6CdEUciCSsDHDQZbhYaB8QEo2g==}
576 | engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1}
577 | hasBin: true
578 |
579 | node-fetch@2.7.0:
580 | resolution: {integrity: sha512-c4FRfUm/dbcWZ7U+1Wq0AwCyFL+3nt2bEw05wfxSz+DWpWsitgmSgYmy2dQdWyKC1694ELPqMs/YzUSNozLt8A==}
581 | engines: {node: 4.x || >=6.0.0}
582 | peerDependencies:
583 | encoding: ^0.1.0
584 | peerDependenciesMeta:
585 | encoding:
586 | optional: true
587 |
588 | node-gyp-build@4.8.2:
589 | resolution: {integrity: sha512-IRUxE4BVsHWXkV/SFOut4qTlagw2aM8T5/vnTsmrHJvVoKueJHRc/JaFND7QDDc61kLYUJ6qlZM3sqTSyx2dTw==}
590 | hasBin: true
591 |
592 | nodemailer@6.9.15:
593 | resolution: {integrity: sha512-AHf04ySLC6CIfuRtRiEYtGEXgRfa6INgWGluDhnxTZhHSKvrBu7lc1VVchQ0d8nPc4cFaZoPq8vkyNoZr0TpGQ==}
594 | engines: {node: '>=6.0.0'}
595 |
596 | nopt@5.0.0:
597 | resolution: {integrity: sha512-Tbj67rffqceeLpcRXrT7vKAN8CwfPeIBgM7E6iBkmKLV7bEMwpGgYLGv0jACUsECaa/vuxP0IjEont6umdMgtQ==}
598 | engines: {node: '>=6'}
599 | hasBin: true
600 |
601 | npmlog@5.0.1:
602 | resolution: {integrity: sha512-AqZtDUWOMKs1G/8lwylVjrdYgqA4d9nu8hc+0gzRxlDb1I10+FHBGMXs6aiQHFdCUUlqH99MUMuLfzWDNDtfxw==}
603 | deprecated: This package is no longer supported.
604 |
605 | object-assign@4.1.1:
606 | resolution: {integrity: sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==}
607 | engines: {node: '>=0.10.0'}
608 |
609 | once@1.4.0:
610 | resolution: {integrity: sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==}
611 |
612 | path-is-absolute@1.0.1:
613 | resolution: {integrity: sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==}
614 | engines: {node: '>=0.10.0'}
615 |
616 | periscopic@3.1.0:
617 | resolution: {integrity: sha512-vKiQ8RRtkl9P+r/+oefh25C3fhybptkHKCZSPlcXiJux2tJF55GnEj3BVn4A5gKfq9NWWXXrxkHBwVPUfH0opw==}
618 |
619 | picocolors@1.1.0:
620 | resolution: {integrity: sha512-TQ92mBOW0l3LeMeyLV6mzy/kWr8lkd/hp3mTg7wYK7zJhuBStmGMBG0BdeDZS/dZx1IukaX6Bk11zcln25o1Aw==}
621 |
622 | picomatch@2.3.1:
623 | resolution: {integrity: sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==}
624 | engines: {node: '>=8.6'}
625 |
626 | postcss@8.4.45:
627 | resolution: {integrity: sha512-7KTLTdzdZZYscUc65XmjFiB73vBhBfbPztCYdUNvlaso9PrzjzcmjqBPR0lNGkcVlcO4BjiO5rK/qNz+XAen1Q==}
628 | engines: {node: ^10 || ^12 || >=14}
629 |
630 | readable-stream@3.6.2:
631 | resolution: {integrity: sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==}
632 | engines: {node: '>= 6'}
633 |
634 | resolve-from@5.0.0:
635 | resolution: {integrity: sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==}
636 | engines: {node: '>=8'}
637 |
638 | rimraf@3.0.2:
639 | resolution: {integrity: sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==}
640 | deprecated: Rimraf versions prior to v4 are no longer supported
641 | hasBin: true
642 |
643 | rollup@4.21.3:
644 | resolution: {integrity: sha512-7sqRtBNnEbcBtMeRVc6VRsJMmpI+JU1z9VTvW8D4gXIYQFz0aLcsE6rRkyghZkLfEgUZgVvOG7A5CVz/VW5GIA==}
645 | engines: {node: '>=18.0.0', npm: '>=8.0.0'}
646 | hasBin: true
647 |
648 | sade@1.8.1:
649 | resolution: {integrity: sha512-xal3CZX1Xlo/k4ApwCFrHVACi9fBqJ7V+mwhBsuf/1IOKbBy098Fex+Wa/5QMubw09pSZ/u8EY8PWgevJsXp1A==}
650 | engines: {node: '>=6'}
651 |
652 | safe-buffer@5.2.1:
653 | resolution: {integrity: sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==}
654 |
655 | semver@6.3.1:
656 | resolution: {integrity: sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==}
657 | hasBin: true
658 |
659 | semver@7.6.3:
660 | resolution: {integrity: sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A==}
661 | engines: {node: '>=10'}
662 | hasBin: true
663 |
664 | set-blocking@2.0.0:
665 | resolution: {integrity: sha512-KiKBS8AnWGEyLzofFfmvKwpdPzqiy16LvQfK3yv/fVH7Bj13/wl3JSR1J+rfgRE9q7xUJK4qvgS8raSOeLUehw==}
666 |
667 | set-cookie-parser@2.7.0:
668 | resolution: {integrity: sha512-lXLOiqpkUumhRdFF3k1osNXCy9akgx/dyPZ5p8qAg9seJzXr5ZrlqZuWIMuY6ejOsVLE6flJ5/h3lsn57fQ/PQ==}
669 |
670 | signal-exit@3.0.7:
671 | resolution: {integrity: sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==}
672 |
673 | sirv@2.0.4:
674 | resolution: {integrity: sha512-94Bdh3cC2PKrbgSOUqTiGPWVZeSiXfKOVZNJniWoqrWrRkB1CJzBU3NEbiTsPcYy1lDsANA/THzS+9WBiy5nfQ==}
675 | engines: {node: '>= 10'}
676 |
677 | source-map-js@1.2.1:
678 | resolution: {integrity: sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==}
679 | engines: {node: '>=0.10.0'}
680 |
681 | string-width@4.2.3:
682 | resolution: {integrity: sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==}
683 | engines: {node: '>=8'}
684 |
685 | string_decoder@1.3.0:
686 | resolution: {integrity: sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==}
687 |
688 | strip-ansi@6.0.1:
689 | resolution: {integrity: sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==}
690 | engines: {node: '>=8'}
691 |
692 | svelte-hmr@0.16.0:
693 | resolution: {integrity: sha512-Gyc7cOS3VJzLlfj7wKS0ZnzDVdv3Pn2IuVeJPk9m2skfhcu5bq3wtIZyQGggr7/Iim5rH5cncyQft/kRLupcnA==}
694 | engines: {node: ^12.20 || ^14.13.1 || >= 16}
695 | peerDependencies:
696 | svelte: ^3.19.0 || ^4.0.0
697 |
698 | svelte@4.2.19:
699 | resolution: {integrity: sha512-IY1rnGr6izd10B0A8LqsBfmlT5OILVuZ7XsI0vdGPEvuonFV7NYEUK4dAkm9Zg2q0Um92kYjTpS1CAP3Nh/KWw==}
700 | engines: {node: '>=16'}
701 |
702 | tar@6.2.1:
703 | resolution: {integrity: sha512-DZ4yORTwrbTj/7MZYq2w+/ZFdI6OZ/f9SFHR+71gIVUZhOQPHzVCLpvRnPgyaMpfWxxk/4ONva3GQSyNIKRv6A==}
704 | engines: {node: '>=10'}
705 |
706 | tiny-glob@0.2.9:
707 | resolution: {integrity: sha512-g/55ssRPUjShh+xkfx9UPDXqhckHEsHr4Vd9zX55oSdGZc/MD0m3sferOkwWtp98bv+kcVfEHtRJgBVJzelrzg==}
708 |
709 | to-regex-range@5.0.1:
710 | resolution: {integrity: sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==}
711 | engines: {node: '>=8.0'}
712 |
713 | totalist@3.0.1:
714 | resolution: {integrity: sha512-sf4i37nQ2LBx4m3wB74y+ubopq6W/dIzXg0FDGjsYnZHVa1Da8FH853wlL2gtUhg+xJXjfk3kUZS3BRoQeoQBQ==}
715 | engines: {node: '>=6'}
716 |
717 | tr46@0.0.3:
718 | resolution: {integrity: sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==}
719 |
720 | util-deprecate@1.0.2:
721 | resolution: {integrity: sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==}
722 |
723 | vite@5.4.5:
724 | resolution: {integrity: sha512-pXqR0qtb2bTwLkev4SE3r4abCNioP3GkjvIDLlzziPpXtHgiJIjuKl+1GN6ESOT3wMjG3JTeARopj2SwYaHTOA==}
725 | engines: {node: ^18.0.0 || >=20.0.0}
726 | hasBin: true
727 | peerDependencies:
728 | '@types/node': ^18.0.0 || >=20.0.0
729 | less: '*'
730 | lightningcss: ^1.21.0
731 | sass: '*'
732 | sass-embedded: '*'
733 | stylus: '*'
734 | sugarss: '*'
735 | terser: ^5.4.0
736 | peerDependenciesMeta:
737 | '@types/node':
738 | optional: true
739 | less:
740 | optional: true
741 | lightningcss:
742 | optional: true
743 | sass:
744 | optional: true
745 | sass-embedded:
746 | optional: true
747 | stylus:
748 | optional: true
749 | sugarss:
750 | optional: true
751 | terser:
752 | optional: true
753 |
754 | vitefu@0.2.5:
755 | resolution: {integrity: sha512-SgHtMLoqaeeGnd2evZ849ZbACbnwQCIwRH57t18FxcXoZop0uQu0uzlIhJBlF/eWVzuce0sHeqPcDo+evVcg8Q==}
756 | peerDependencies:
757 | vite: ^3.0.0 || ^4.0.0 || ^5.0.0
758 | peerDependenciesMeta:
759 | vite:
760 | optional: true
761 |
762 | webidl-conversions@3.0.1:
763 | resolution: {integrity: sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==}
764 |
765 | whatwg-url@5.0.0:
766 | resolution: {integrity: sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==}
767 |
768 | wide-align@1.1.5:
769 | resolution: {integrity: sha512-eDMORYaPNZ4sQIuuYPDHdQvf4gyCF9rEEV/yPxGfwPkRodwEgiMUUXTx/dex+Me0wxx53S+NgUHaP7y3MGlDmg==}
770 |
771 | wrappy@1.0.2:
772 | resolution: {integrity: sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==}
773 |
774 | yallist@4.0.0:
775 | resolution: {integrity: sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==}
776 |
777 | snapshots:
778 |
779 | '@ampproject/remapping@2.3.0':
780 | dependencies:
781 | '@jridgewell/gen-mapping': 0.3.5
782 | '@jridgewell/trace-mapping': 0.3.25
783 |
784 | '@esbuild/aix-ppc64@0.21.5':
785 | optional: true
786 |
787 | '@esbuild/android-arm64@0.21.5':
788 | optional: true
789 |
790 | '@esbuild/android-arm@0.21.5':
791 | optional: true
792 |
793 | '@esbuild/android-x64@0.21.5':
794 | optional: true
795 |
796 | '@esbuild/darwin-arm64@0.21.5':
797 | optional: true
798 |
799 | '@esbuild/darwin-x64@0.21.5':
800 | optional: true
801 |
802 | '@esbuild/freebsd-arm64@0.21.5':
803 | optional: true
804 |
805 | '@esbuild/freebsd-x64@0.21.5':
806 | optional: true
807 |
808 | '@esbuild/linux-arm64@0.21.5':
809 | optional: true
810 |
811 | '@esbuild/linux-arm@0.21.5':
812 | optional: true
813 |
814 | '@esbuild/linux-ia32@0.21.5':
815 | optional: true
816 |
817 | '@esbuild/linux-loong64@0.21.5':
818 | optional: true
819 |
820 | '@esbuild/linux-mips64el@0.21.5':
821 | optional: true
822 |
823 | '@esbuild/linux-ppc64@0.21.5':
824 | optional: true
825 |
826 | '@esbuild/linux-riscv64@0.21.5':
827 | optional: true
828 |
829 | '@esbuild/linux-s390x@0.21.5':
830 | optional: true
831 |
832 | '@esbuild/linux-x64@0.21.5':
833 | optional: true
834 |
835 | '@esbuild/netbsd-x64@0.21.5':
836 | optional: true
837 |
838 | '@esbuild/openbsd-x64@0.21.5':
839 | optional: true
840 |
841 | '@esbuild/sunos-x64@0.21.5':
842 | optional: true
843 |
844 | '@esbuild/win32-arm64@0.21.5':
845 | optional: true
846 |
847 | '@esbuild/win32-ia32@0.21.5':
848 | optional: true
849 |
850 | '@esbuild/win32-x64@0.21.5':
851 | optional: true
852 |
853 | '@jridgewell/gen-mapping@0.3.5':
854 | dependencies:
855 | '@jridgewell/set-array': 1.2.1
856 | '@jridgewell/sourcemap-codec': 1.5.0
857 | '@jridgewell/trace-mapping': 0.3.25
858 |
859 | '@jridgewell/resolve-uri@3.1.2': {}
860 |
861 | '@jridgewell/set-array@1.2.1': {}
862 |
863 | '@jridgewell/sourcemap-codec@1.5.0': {}
864 |
865 | '@jridgewell/trace-mapping@0.3.25':
866 | dependencies:
867 | '@jridgewell/resolve-uri': 3.1.2
868 | '@jridgewell/sourcemap-codec': 1.5.0
869 |
870 | '@mapbox/node-pre-gyp@1.0.11':
871 | dependencies:
872 | detect-libc: 2.0.3
873 | https-proxy-agent: 5.0.1
874 | make-dir: 3.1.0
875 | node-fetch: 2.7.0
876 | nopt: 5.0.0
877 | npmlog: 5.0.1
878 | rimraf: 3.0.2
879 | semver: 7.6.3
880 | tar: 6.2.1
881 | transitivePeerDependencies:
882 | - encoding
883 | - supports-color
884 |
885 | '@polka/url@1.0.0-next.25': {}
886 |
887 | '@rollup/pluginutils@4.2.1':
888 | dependencies:
889 | estree-walker: 2.0.2
890 | picomatch: 2.3.1
891 |
892 | '@rollup/rollup-android-arm-eabi@4.21.3':
893 | optional: true
894 |
895 | '@rollup/rollup-android-arm64@4.21.3':
896 | optional: true
897 |
898 | '@rollup/rollup-darwin-arm64@4.21.3':
899 | optional: true
900 |
901 | '@rollup/rollup-darwin-x64@4.21.3':
902 | optional: true
903 |
904 | '@rollup/rollup-linux-arm-gnueabihf@4.21.3':
905 | optional: true
906 |
907 | '@rollup/rollup-linux-arm-musleabihf@4.21.3':
908 | optional: true
909 |
910 | '@rollup/rollup-linux-arm64-gnu@4.21.3':
911 | optional: true
912 |
913 | '@rollup/rollup-linux-arm64-musl@4.21.3':
914 | optional: true
915 |
916 | '@rollup/rollup-linux-powerpc64le-gnu@4.21.3':
917 | optional: true
918 |
919 | '@rollup/rollup-linux-riscv64-gnu@4.21.3':
920 | optional: true
921 |
922 | '@rollup/rollup-linux-s390x-gnu@4.21.3':
923 | optional: true
924 |
925 | '@rollup/rollup-linux-x64-gnu@4.21.3':
926 | optional: true
927 |
928 | '@rollup/rollup-linux-x64-musl@4.21.3':
929 | optional: true
930 |
931 | '@rollup/rollup-win32-arm64-msvc@4.21.3':
932 | optional: true
933 |
934 | '@rollup/rollup-win32-ia32-msvc@4.21.3':
935 | optional: true
936 |
937 | '@rollup/rollup-win32-x64-msvc@4.21.3':
938 | optional: true
939 |
940 | '@sveltejs/adapter-auto@3.2.4(@sveltejs/kit@2.5.27(@sveltejs/vite-plugin-svelte@3.1.2(svelte@4.2.19)(vite@5.4.5))(svelte@4.2.19)(vite@5.4.5))':
941 | dependencies:
942 | '@sveltejs/kit': 2.5.27(@sveltejs/vite-plugin-svelte@3.1.2(svelte@4.2.19)(vite@5.4.5))(svelte@4.2.19)(vite@5.4.5)
943 | import-meta-resolve: 4.1.0
944 |
945 | '@sveltejs/adapter-vercel@5.4.4(@sveltejs/kit@2.5.27(@sveltejs/vite-plugin-svelte@3.1.2(svelte@4.2.19)(vite@5.4.5))(svelte@4.2.19)(vite@5.4.5))':
946 | dependencies:
947 | '@sveltejs/kit': 2.5.27(@sveltejs/vite-plugin-svelte@3.1.2(svelte@4.2.19)(vite@5.4.5))(svelte@4.2.19)(vite@5.4.5)
948 | '@vercel/nft': 0.27.4
949 | esbuild: 0.21.5
950 | transitivePeerDependencies:
951 | - encoding
952 | - supports-color
953 |
954 | '@sveltejs/kit@2.5.27(@sveltejs/vite-plugin-svelte@3.1.2(svelte@4.2.19)(vite@5.4.5))(svelte@4.2.19)(vite@5.4.5)':
955 | dependencies:
956 | '@sveltejs/vite-plugin-svelte': 3.1.2(svelte@4.2.19)(vite@5.4.5)
957 | '@types/cookie': 0.6.0
958 | cookie: 0.6.0
959 | devalue: 5.0.0
960 | esm-env: 1.0.0
961 | import-meta-resolve: 4.1.0
962 | kleur: 4.1.5
963 | magic-string: 0.30.11
964 | mrmime: 2.0.0
965 | sade: 1.8.1
966 | set-cookie-parser: 2.7.0
967 | sirv: 2.0.4
968 | svelte: 4.2.19
969 | tiny-glob: 0.2.9
970 | vite: 5.4.5
971 |
972 | '@sveltejs/vite-plugin-svelte-inspector@2.1.0(@sveltejs/vite-plugin-svelte@3.1.2(svelte@4.2.19)(vite@5.4.5))(svelte@4.2.19)(vite@5.4.5)':
973 | dependencies:
974 | '@sveltejs/vite-plugin-svelte': 3.1.2(svelte@4.2.19)(vite@5.4.5)
975 | debug: 4.3.7
976 | svelte: 4.2.19
977 | vite: 5.4.5
978 | transitivePeerDependencies:
979 | - supports-color
980 |
981 | '@sveltejs/vite-plugin-svelte@3.1.2(svelte@4.2.19)(vite@5.4.5)':
982 | dependencies:
983 | '@sveltejs/vite-plugin-svelte-inspector': 2.1.0(@sveltejs/vite-plugin-svelte@3.1.2(svelte@4.2.19)(vite@5.4.5))(svelte@4.2.19)(vite@5.4.5)
984 | debug: 4.3.7
985 | deepmerge: 4.3.1
986 | kleur: 4.1.5
987 | magic-string: 0.30.11
988 | svelte: 4.2.19
989 | svelte-hmr: 0.16.0(svelte@4.2.19)
990 | vite: 5.4.5
991 | vitefu: 0.2.5(vite@5.4.5)
992 | transitivePeerDependencies:
993 | - supports-color
994 |
995 | '@types/cookie@0.6.0': {}
996 |
997 | '@types/estree@1.0.5': {}
998 |
999 | '@vercel/nft@0.27.4':
1000 | dependencies:
1001 | '@mapbox/node-pre-gyp': 1.0.11
1002 | '@rollup/pluginutils': 4.2.1
1003 | acorn: 8.12.1
1004 | acorn-import-attributes: 1.9.5(acorn@8.12.1)
1005 | async-sema: 3.1.1
1006 | bindings: 1.5.0
1007 | estree-walker: 2.0.2
1008 | glob: 7.2.3
1009 | graceful-fs: 4.2.11
1010 | micromatch: 4.0.8
1011 | node-gyp-build: 4.8.2
1012 | resolve-from: 5.0.0
1013 | transitivePeerDependencies:
1014 | - encoding
1015 | - supports-color
1016 |
1017 | abbrev@1.1.1: {}
1018 |
1019 | acorn-import-attributes@1.9.5(acorn@8.12.1):
1020 | dependencies:
1021 | acorn: 8.12.1
1022 |
1023 | acorn@8.12.1: {}
1024 |
1025 | agent-base@6.0.2:
1026 | dependencies:
1027 | debug: 4.3.7
1028 | transitivePeerDependencies:
1029 | - supports-color
1030 |
1031 | ansi-regex@5.0.1: {}
1032 |
1033 | aproba@2.0.0: {}
1034 |
1035 | are-we-there-yet@2.0.0:
1036 | dependencies:
1037 | delegates: 1.0.0
1038 | readable-stream: 3.6.2
1039 |
1040 | aria-query@5.3.1: {}
1041 |
1042 | async-sema@3.1.1: {}
1043 |
1044 | axobject-query@4.1.0: {}
1045 |
1046 | balanced-match@1.0.2: {}
1047 |
1048 | bindings@1.5.0:
1049 | dependencies:
1050 | file-uri-to-path: 1.0.0
1051 |
1052 | brace-expansion@1.1.11:
1053 | dependencies:
1054 | balanced-match: 1.0.2
1055 | concat-map: 0.0.1
1056 |
1057 | braces@3.0.3:
1058 | dependencies:
1059 | fill-range: 7.1.1
1060 |
1061 | chownr@2.0.0: {}
1062 |
1063 | code-red@1.0.4:
1064 | dependencies:
1065 | '@jridgewell/sourcemap-codec': 1.5.0
1066 | '@types/estree': 1.0.5
1067 | acorn: 8.12.1
1068 | estree-walker: 3.0.3
1069 | periscopic: 3.1.0
1070 |
1071 | color-support@1.1.3: {}
1072 |
1073 | concat-map@0.0.1: {}
1074 |
1075 | console-control-strings@1.1.0: {}
1076 |
1077 | cookie@0.6.0: {}
1078 |
1079 | css-tree@2.3.1:
1080 | dependencies:
1081 | mdn-data: 2.0.30
1082 | source-map-js: 1.2.1
1083 |
1084 | debug@4.3.7:
1085 | dependencies:
1086 | ms: 2.1.3
1087 |
1088 | deepmerge@4.3.1: {}
1089 |
1090 | delegates@1.0.0: {}
1091 |
1092 | detect-libc@2.0.3: {}
1093 |
1094 | devalue@5.0.0: {}
1095 |
1096 | dotenv@16.4.5: {}
1097 |
1098 | emoji-regex@8.0.0: {}
1099 |
1100 | esbuild@0.21.5:
1101 | optionalDependencies:
1102 | '@esbuild/aix-ppc64': 0.21.5
1103 | '@esbuild/android-arm': 0.21.5
1104 | '@esbuild/android-arm64': 0.21.5
1105 | '@esbuild/android-x64': 0.21.5
1106 | '@esbuild/darwin-arm64': 0.21.5
1107 | '@esbuild/darwin-x64': 0.21.5
1108 | '@esbuild/freebsd-arm64': 0.21.5
1109 | '@esbuild/freebsd-x64': 0.21.5
1110 | '@esbuild/linux-arm': 0.21.5
1111 | '@esbuild/linux-arm64': 0.21.5
1112 | '@esbuild/linux-ia32': 0.21.5
1113 | '@esbuild/linux-loong64': 0.21.5
1114 | '@esbuild/linux-mips64el': 0.21.5
1115 | '@esbuild/linux-ppc64': 0.21.5
1116 | '@esbuild/linux-riscv64': 0.21.5
1117 | '@esbuild/linux-s390x': 0.21.5
1118 | '@esbuild/linux-x64': 0.21.5
1119 | '@esbuild/netbsd-x64': 0.21.5
1120 | '@esbuild/openbsd-x64': 0.21.5
1121 | '@esbuild/sunos-x64': 0.21.5
1122 | '@esbuild/win32-arm64': 0.21.5
1123 | '@esbuild/win32-ia32': 0.21.5
1124 | '@esbuild/win32-x64': 0.21.5
1125 |
1126 | esm-env@1.0.0: {}
1127 |
1128 | estree-walker@2.0.2: {}
1129 |
1130 | estree-walker@3.0.3:
1131 | dependencies:
1132 | '@types/estree': 1.0.5
1133 |
1134 | file-uri-to-path@1.0.0: {}
1135 |
1136 | fill-range@7.1.1:
1137 | dependencies:
1138 | to-regex-range: 5.0.1
1139 |
1140 | fs-minipass@2.1.0:
1141 | dependencies:
1142 | minipass: 3.3.6
1143 |
1144 | fs.realpath@1.0.0: {}
1145 |
1146 | fsevents@2.3.3:
1147 | optional: true
1148 |
1149 | gauge@3.0.2:
1150 | dependencies:
1151 | aproba: 2.0.0
1152 | color-support: 1.1.3
1153 | console-control-strings: 1.1.0
1154 | has-unicode: 2.0.1
1155 | object-assign: 4.1.1
1156 | signal-exit: 3.0.7
1157 | string-width: 4.2.3
1158 | strip-ansi: 6.0.1
1159 | wide-align: 1.1.5
1160 |
1161 | glob@7.2.3:
1162 | dependencies:
1163 | fs.realpath: 1.0.0
1164 | inflight: 1.0.6
1165 | inherits: 2.0.4
1166 | minimatch: 3.1.2
1167 | once: 1.4.0
1168 | path-is-absolute: 1.0.1
1169 |
1170 | globalyzer@0.1.0: {}
1171 |
1172 | globrex@0.1.2: {}
1173 |
1174 | graceful-fs@4.2.11: {}
1175 |
1176 | has-unicode@2.0.1: {}
1177 |
1178 | https-proxy-agent@5.0.1:
1179 | dependencies:
1180 | agent-base: 6.0.2
1181 | debug: 4.3.7
1182 | transitivePeerDependencies:
1183 | - supports-color
1184 |
1185 | import-meta-resolve@4.1.0: {}
1186 |
1187 | inflight@1.0.6:
1188 | dependencies:
1189 | once: 1.4.0
1190 | wrappy: 1.0.2
1191 |
1192 | inherits@2.0.4: {}
1193 |
1194 | is-fullwidth-code-point@3.0.0: {}
1195 |
1196 | is-number@7.0.0: {}
1197 |
1198 | is-reference@3.0.2:
1199 | dependencies:
1200 | '@types/estree': 1.0.5
1201 |
1202 | kleur@4.1.5: {}
1203 |
1204 | locate-character@3.0.0: {}
1205 |
1206 | magic-string@0.30.11:
1207 | dependencies:
1208 | '@jridgewell/sourcemap-codec': 1.5.0
1209 |
1210 | make-dir@3.1.0:
1211 | dependencies:
1212 | semver: 6.3.1
1213 |
1214 | mdn-data@2.0.30: {}
1215 |
1216 | micromatch@4.0.8:
1217 | dependencies:
1218 | braces: 3.0.3
1219 | picomatch: 2.3.1
1220 |
1221 | minimatch@3.1.2:
1222 | dependencies:
1223 | brace-expansion: 1.1.11
1224 |
1225 | minipass@3.3.6:
1226 | dependencies:
1227 | yallist: 4.0.0
1228 |
1229 | minipass@5.0.0: {}
1230 |
1231 | minizlib@2.1.2:
1232 | dependencies:
1233 | minipass: 3.3.6
1234 | yallist: 4.0.0
1235 |
1236 | mkdirp@1.0.4: {}
1237 |
1238 | mri@1.2.0: {}
1239 |
1240 | mrmime@2.0.0: {}
1241 |
1242 | ms@2.1.3: {}
1243 |
1244 | nanoid@3.3.7: {}
1245 |
1246 | node-fetch@2.7.0:
1247 | dependencies:
1248 | whatwg-url: 5.0.0
1249 |
1250 | node-gyp-build@4.8.2: {}
1251 |
1252 | nodemailer@6.9.15: {}
1253 |
1254 | nopt@5.0.0:
1255 | dependencies:
1256 | abbrev: 1.1.1
1257 |
1258 | npmlog@5.0.1:
1259 | dependencies:
1260 | are-we-there-yet: 2.0.0
1261 | console-control-strings: 1.1.0
1262 | gauge: 3.0.2
1263 | set-blocking: 2.0.0
1264 |
1265 | object-assign@4.1.1: {}
1266 |
1267 | once@1.4.0:
1268 | dependencies:
1269 | wrappy: 1.0.2
1270 |
1271 | path-is-absolute@1.0.1: {}
1272 |
1273 | periscopic@3.1.0:
1274 | dependencies:
1275 | '@types/estree': 1.0.5
1276 | estree-walker: 3.0.3
1277 | is-reference: 3.0.2
1278 |
1279 | picocolors@1.1.0: {}
1280 |
1281 | picomatch@2.3.1: {}
1282 |
1283 | postcss@8.4.45:
1284 | dependencies:
1285 | nanoid: 3.3.7
1286 | picocolors: 1.1.0
1287 | source-map-js: 1.2.1
1288 |
1289 | readable-stream@3.6.2:
1290 | dependencies:
1291 | inherits: 2.0.4
1292 | string_decoder: 1.3.0
1293 | util-deprecate: 1.0.2
1294 |
1295 | resolve-from@5.0.0: {}
1296 |
1297 | rimraf@3.0.2:
1298 | dependencies:
1299 | glob: 7.2.3
1300 |
1301 | rollup@4.21.3:
1302 | dependencies:
1303 | '@types/estree': 1.0.5
1304 | optionalDependencies:
1305 | '@rollup/rollup-android-arm-eabi': 4.21.3
1306 | '@rollup/rollup-android-arm64': 4.21.3
1307 | '@rollup/rollup-darwin-arm64': 4.21.3
1308 | '@rollup/rollup-darwin-x64': 4.21.3
1309 | '@rollup/rollup-linux-arm-gnueabihf': 4.21.3
1310 | '@rollup/rollup-linux-arm-musleabihf': 4.21.3
1311 | '@rollup/rollup-linux-arm64-gnu': 4.21.3
1312 | '@rollup/rollup-linux-arm64-musl': 4.21.3
1313 | '@rollup/rollup-linux-powerpc64le-gnu': 4.21.3
1314 | '@rollup/rollup-linux-riscv64-gnu': 4.21.3
1315 | '@rollup/rollup-linux-s390x-gnu': 4.21.3
1316 | '@rollup/rollup-linux-x64-gnu': 4.21.3
1317 | '@rollup/rollup-linux-x64-musl': 4.21.3
1318 | '@rollup/rollup-win32-arm64-msvc': 4.21.3
1319 | '@rollup/rollup-win32-ia32-msvc': 4.21.3
1320 | '@rollup/rollup-win32-x64-msvc': 4.21.3
1321 | fsevents: 2.3.3
1322 |
1323 | sade@1.8.1:
1324 | dependencies:
1325 | mri: 1.2.0
1326 |
1327 | safe-buffer@5.2.1: {}
1328 |
1329 | semver@6.3.1: {}
1330 |
1331 | semver@7.6.3: {}
1332 |
1333 | set-blocking@2.0.0: {}
1334 |
1335 | set-cookie-parser@2.7.0: {}
1336 |
1337 | signal-exit@3.0.7: {}
1338 |
1339 | sirv@2.0.4:
1340 | dependencies:
1341 | '@polka/url': 1.0.0-next.25
1342 | mrmime: 2.0.0
1343 | totalist: 3.0.1
1344 |
1345 | source-map-js@1.2.1: {}
1346 |
1347 | string-width@4.2.3:
1348 | dependencies:
1349 | emoji-regex: 8.0.0
1350 | is-fullwidth-code-point: 3.0.0
1351 | strip-ansi: 6.0.1
1352 |
1353 | string_decoder@1.3.0:
1354 | dependencies:
1355 | safe-buffer: 5.2.1
1356 |
1357 | strip-ansi@6.0.1:
1358 | dependencies:
1359 | ansi-regex: 5.0.1
1360 |
1361 | svelte-hmr@0.16.0(svelte@4.2.19):
1362 | dependencies:
1363 | svelte: 4.2.19
1364 |
1365 | svelte@4.2.19:
1366 | dependencies:
1367 | '@ampproject/remapping': 2.3.0
1368 | '@jridgewell/sourcemap-codec': 1.5.0
1369 | '@jridgewell/trace-mapping': 0.3.25
1370 | '@types/estree': 1.0.5
1371 | acorn: 8.12.1
1372 | aria-query: 5.3.1
1373 | axobject-query: 4.1.0
1374 | code-red: 1.0.4
1375 | css-tree: 2.3.1
1376 | estree-walker: 3.0.3
1377 | is-reference: 3.0.2
1378 | locate-character: 3.0.0
1379 | magic-string: 0.30.11
1380 | periscopic: 3.1.0
1381 |
1382 | tar@6.2.1:
1383 | dependencies:
1384 | chownr: 2.0.0
1385 | fs-minipass: 2.1.0
1386 | minipass: 5.0.0
1387 | minizlib: 2.1.2
1388 | mkdirp: 1.0.4
1389 | yallist: 4.0.0
1390 |
1391 | tiny-glob@0.2.9:
1392 | dependencies:
1393 | globalyzer: 0.1.0
1394 | globrex: 0.1.2
1395 |
1396 | to-regex-range@5.0.1:
1397 | dependencies:
1398 | is-number: 7.0.0
1399 |
1400 | totalist@3.0.1: {}
1401 |
1402 | tr46@0.0.3: {}
1403 |
1404 | util-deprecate@1.0.2: {}
1405 |
1406 | vite@5.4.5:
1407 | dependencies:
1408 | esbuild: 0.21.5
1409 | postcss: 8.4.45
1410 | rollup: 4.21.3
1411 | optionalDependencies:
1412 | fsevents: 2.3.3
1413 |
1414 | vitefu@0.2.5(vite@5.4.5):
1415 | optionalDependencies:
1416 | vite: 5.4.5
1417 |
1418 | webidl-conversions@3.0.1: {}
1419 |
1420 | whatwg-url@5.0.0:
1421 | dependencies:
1422 | tr46: 0.0.3
1423 | webidl-conversions: 3.0.1
1424 |
1425 | wide-align@1.1.5:
1426 | dependencies:
1427 | string-width: 4.2.3
1428 |
1429 | wrappy@1.0.2: {}
1430 |
1431 | yallist@4.0.0: {}
1432 |
--------------------------------------------------------------------------------
/src/app.html:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 | %sveltekit.head%
8 |
9 |
10 | %sveltekit.body%
11 |
12 |
13 |
--------------------------------------------------------------------------------
/src/lib/index.js:
--------------------------------------------------------------------------------
1 | // place files you want to import through the `$lib` alias in this folder.
2 |
--------------------------------------------------------------------------------
/src/routes/+page.svelte:
--------------------------------------------------------------------------------
1 | Serverless Email Sender API
2 | Visit github repo to read the documentation
3 |
--------------------------------------------------------------------------------
/src/routes/send/+server.js:
--------------------------------------------------------------------------------
1 | import { json } from "@sveltejs/kit";
2 | import nodemailer from "nodemailer";
3 |
4 | /** @type {import('./$types').RequestHandler} */
5 | export async function POST({ request }) {
6 | const env = {
7 | AUTH_TOKEN: process.env.AUTH_TOKEN,
8 | SMTP_USERNAME: process.env.SMTP_USERNAME,
9 | SMTP_PASSWORD: process.env.SMTP_PASSWORD,
10 | };
11 |
12 | const authHeader = request.headers.get("authorization");
13 | if (!authHeader || !authHeader.startsWith("Bearer ")) {
14 | return new Response("Unauthorized", { status: 401 });
15 | }
16 |
17 | const token = authHeader.slice("Bearer ".length).trim();
18 | console.log(process.env);
19 | if (token !== env.AUTH_TOKEN) {
20 | return new Response("Forbidden", { status: 403 });
21 | }
22 |
23 | let data;
24 | try {
25 | data = await request.json();
26 | } catch (e) {
27 | return new Response("Bad Request: Invalid JSON", { status: 400 });
28 | }
29 |
30 | const { from, to, subject, html } = data;
31 | if (!from || !to || !subject || !html) {
32 | return new Response("Bad Request: Missing required fields", { status: 400 });
33 | }
34 |
35 | try {
36 | await sendEmail(env, from, to, subject, html);
37 | return json({ message: "Email sent successfully" });
38 | } catch (e) {
39 | return new Response(`Internal Server Error: ${e.message}`, { status: 500 });
40 | }
41 | }
42 |
43 | async function sendEmail(env, from, to, subject, html) {
44 | let transporter = nodemailer.createTransport({
45 | service: "gmail",
46 | auth: {
47 | user: env.SMTP_USERNAME,
48 | pass: env.SMTP_PASSWORD,
49 | },
50 | });
51 |
52 | let mailOptions = {
53 | from: from,
54 | to: to,
55 | subject: subject,
56 | html: html,
57 | };
58 |
59 | await transporter.sendMail(mailOptions);
60 | }
61 |
--------------------------------------------------------------------------------
/static/favicon.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/manuelernestog/serverless-email-sender-api/2795513f2641bd2dfa59c69d4669850c3d71f87b/static/favicon.png
--------------------------------------------------------------------------------
/svelte.config.js:
--------------------------------------------------------------------------------
1 | import adapter from '@sveltejs/adapter-vercel';
2 |
3 | /** @type {import('@sveltejs/kit').Config} */
4 | const config = {
5 | kit: {
6 | // adapter-auto only supports some environments, see https://kit.svelte.dev/docs/adapter-auto for a list.
7 | // If your environment is not supported, or you settled on a specific environment, switch out the adapter.
8 | // See https://kit.svelte.dev/docs/adapters for more information about adapters.
9 | adapter: adapter()
10 | }
11 | };
12 |
13 | export default config;
14 |
--------------------------------------------------------------------------------
/vite.config.js:
--------------------------------------------------------------------------------
1 | import { sveltekit } from '@sveltejs/kit/vite';
2 | import { defineConfig } from 'vite';
3 | import dotenv from 'dotenv';
4 |
5 | dotenv.config();
6 |
7 | export default defineConfig({
8 | plugins: [sveltekit()],
9 | define: {
10 | 'process.env': process.env
11 | }
12 | });
13 |
--------------------------------------------------------------------------------