├── .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 | [![Deploy with Vercel](https://vercel.com/button)](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 | --------------------------------------------------------------------------------