├── .env.example ├── .eslintignore ├── .eslintrc.cjs ├── .gitignore ├── .npmrc ├── .prettierignore ├── .prettierrc ├── README.md ├── package.json ├── pnpm-lock.yaml ├── src ├── app.html ├── lib │ └── stripe.js └── routes │ ├── +page.svelte │ ├── checkout │ ├── +page.server.js │ ├── +page.svelte │ ├── complete │ │ ├── +page.server.js │ │ └── +page.svelte │ └── payment │ │ ├── +page.server.js │ │ └── +page.svelte │ └── stripe │ └── webhooks │ └── +server.js ├── static └── favicon.png ├── svelte.config.js └── vite.config.js /.env.example: -------------------------------------------------------------------------------- 1 | SECRET_STRIPE_KEY=sk_... 2 | PUBLIC_STRIPE_KEY=pk_... 3 | STRIPE_PRICE_ID=price_... 4 | DOMAIN=http://localhost:5173 5 | -------------------------------------------------------------------------------- /.eslintignore: -------------------------------------------------------------------------------- 1 | .DS_Store 2 | node_modules 3 | /build 4 | /.svelte-kit 5 | /package 6 | .env 7 | .env.* 8 | !.env.example 9 | 10 | # Ignore files for PNPM, NPM and YARN 11 | pnpm-lock.yaml 12 | package-lock.json 13 | yarn.lock 14 | -------------------------------------------------------------------------------- /.eslintrc.cjs: -------------------------------------------------------------------------------- 1 | module.exports = { 2 | root: true, 3 | extends: ['eslint:recommended', 'plugin:svelte/recommended', 'prettier'], 4 | parserOptions: { 5 | sourceType: 'module', 6 | ecmaVersion: 2020, 7 | extraFileExtensions: ['.svelte'] 8 | }, 9 | env: { 10 | browser: true, 11 | es2017: true, 12 | node: true 13 | } 14 | } 15 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | .DS_Store 2 | node_modules 3 | /build 4 | /.svelte-kit 5 | /package 6 | .env 7 | .env.* 8 | !.env.example 9 | vite.config.js.timestamp-* 10 | vite.config.ts.timestamp-* 11 | -------------------------------------------------------------------------------- /.npmrc: -------------------------------------------------------------------------------- 1 | engine-strict=true 2 | resolution-mode=highest 3 | -------------------------------------------------------------------------------- /.prettierignore: -------------------------------------------------------------------------------- 1 | .DS_Store 2 | node_modules 3 | /build 4 | /.svelte-kit 5 | /package 6 | .env 7 | .env.* 8 | !.env.example 9 | 10 | # Ignore files for PNPM, NPM and YARN 11 | pnpm-lock.yaml 12 | package-lock.json 13 | yarn.lock 14 | -------------------------------------------------------------------------------- /.prettierrc: -------------------------------------------------------------------------------- 1 | { 2 | "useTabs": false, 3 | "semi": false, 4 | "singleQuote": true, 5 | "trailingComma": "none", 6 | "printWidth": 100, 7 | "plugins": ["prettier-plugin-svelte"], 8 | "pluginSearchDirs": ["."], 9 | "overrides": [{ "files": "*.svelte", "options": { "parser": "svelte" } }] 10 | } 11 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # SvelteKit + Stripe Subscriptions 2 | 3 | Example of using Stripe [Subscriptions](https://stripe.com/docs/api/subscriptions) & [PaymentElement](https://stripe.com/docs/payments/payment-element) with [SvelteKit](https://kit.svelte.dev). 4 | 5 | **Note**: [Stripe Checkout](https://stripe.com/payments/checkout) is an alternative approach if you want to use pre-built payment forms. [Need help choosing?](https://dev.to/stripe/making-sense-of-stripe-checkout-payment-links-and-the-payment-element-23o5) 6 | 7 | ## Payment Flow 8 | 9 | To complete a subscription payment: 10 | 11 | 1. The User enters their e-mail address and name. [View code](https://github.com/joshnuss/sveltekit-stripe-subscriptions/blob/main/src/routes/checkout/%2Bpage.svelte) 12 | 2. A Stripe Customer record is created and `customer.id` is stored in a cookie. [View code](https://github.com/joshnuss/sveltekit-stripe-subscriptions/blob/main/src/routes/checkout/%2Bpage.server.js) 13 | 3. A Stripe Subscription record is created based on a `priceId`. Then the Payment Intent's secret is returned. [View code](https://github.com/joshnuss/sveltekit-stripe-subscriptions/blob/main/src/routes/checkout/payment/%2Bpage.server.js) 14 | 4. The User is presented with the `` to enter their payment info. [View code](https://github.com/joshnuss/sveltekit-stripe-subscriptions/blob/91f4ba230d9aff634cf9ddd88e55804bd97a6e04/src/routes/checkout/payment/%2Bpage.svelte#L40-L42) 15 | 5. The User submits the form, and `stripe.confirmPayment()` is called. [View code](https://github.com/joshnuss/sveltekit-stripe-subscriptions/blob/91f4ba230d9aff634cf9ddd88e55804bd97a6e04/src/routes/checkout/payment/%2Bpage.svelte#L21-L27) 16 | 6. Stripe redirects the User to the thank you page. [View code](https://github.com/joshnuss/sveltekit-stripe-subscriptions/blob/main/src/routes/checkout/complete/%2Bpage.server.js) 17 | 7. Stripe sends webhook `customer.subscription.created`. [View code](https://github.com/joshnuss/sveltekit-stripe-subscriptions/blob/main/src/routes/stripe/webhooks/%2Bserver.js) 18 | 19 | **Note**: Steps 6 and 7 may happen in reverse order. Make sure to provision the subscription from the thank you page **and** the webhook handler. 20 | 21 | ## Setup 22 | 23 | Clone the repo: 24 | 25 | ```sh 26 | gh repo clone joshnuss/sveltekit-stripe-subscriptions 27 | ``` 28 | 29 | Configure environment variables in `.env`: 30 | 31 | ```sh 32 | cp .env.example .env 33 | ``` 34 | 35 | - `PUBLIC_STRIPE_KEY`: Your public Stripe key. 36 | - `SECRET_STRIPE_KEY`: Your private Stripe key. 37 | - `SECRET_STRIPE_WEBHOOK_KEY`: Stripe's secret used to sign webhooks. 38 | - `STRIPE_PRICE_ID`: The `priceId` for the subscription product. You might want to store this in your database. 39 | - `DOMAIN`: The site's domain. Used for creating redirect URLs. Default is `http://localhost:5173` 40 | 41 | Install dependecies: 42 | 43 | ```sh 44 | pnpm install 45 | ``` 46 | 47 | ## Usage 48 | 49 | Tunnel Stripe events: 50 | 51 | ```sh 52 | stripe listen --forward-to localhost:5173/stripe/webhooks 53 | ``` 54 | 55 | Run the dev server: 56 | 57 | ```sh 58 | SECRET_STRIPE_WEBHOOK_KEY=whsec_.... pnpm dev 59 | ``` 60 | 61 | ## License 62 | 63 | MIT 64 | -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "sveltekit-stripe-subscriptions", 3 | "version": "0.0.1", 4 | "private": true, 5 | "scripts": { 6 | "dev": "vite dev", 7 | "build": "vite build", 8 | "preview": "vite preview", 9 | "lint": "prettier --plugin-search-dir . --check . && eslint .", 10 | "format": "prettier --plugin-search-dir . --write ." 11 | }, 12 | "devDependencies": { 13 | "@stripe/stripe-js": "^1.54.0", 14 | "@sveltejs/adapter-auto": "^2.0.0", 15 | "@sveltejs/kit": "^1.5.0", 16 | "eslint": "^8.28.0", 17 | "eslint-config-prettier": "^8.5.0", 18 | "eslint-plugin-svelte": "^2.26.0", 19 | "prettier": "^2.8.0", 20 | "prettier-plugin-svelte": "^2.8.1", 21 | "stripe": "^12.8.0", 22 | "svelte": "^3.54.0", 23 | "svelte-stripe": "^0.0.22", 24 | "vite": "^4.3.0" 25 | }, 26 | "type": "module" 27 | } 28 | -------------------------------------------------------------------------------- /pnpm-lock.yaml: -------------------------------------------------------------------------------- 1 | lockfileVersion: '6.0' 2 | 3 | devDependencies: 4 | '@stripe/stripe-js': 5 | specifier: ^1.54.0 6 | version: 1.54.0 7 | '@sveltejs/adapter-auto': 8 | specifier: ^2.0.0 9 | version: 2.1.0(@sveltejs/kit@1.20.0) 10 | '@sveltejs/kit': 11 | specifier: ^1.5.0 12 | version: 1.20.0(svelte@3.59.1)(vite@4.3.9) 13 | eslint: 14 | specifier: ^8.28.0 15 | version: 8.41.0 16 | eslint-config-prettier: 17 | specifier: ^8.5.0 18 | version: 8.8.0(eslint@8.41.0) 19 | eslint-plugin-svelte: 20 | specifier: ^2.26.0 21 | version: 2.30.0(eslint@8.41.0)(svelte@3.59.1) 22 | prettier: 23 | specifier: ^2.8.0 24 | version: 2.8.8 25 | prettier-plugin-svelte: 26 | specifier: ^2.8.1 27 | version: 2.10.1(prettier@2.8.8)(svelte@3.59.1) 28 | stripe: 29 | specifier: ^12.8.0 30 | version: 12.8.0 31 | svelte: 32 | specifier: ^3.54.0 33 | version: 3.59.1 34 | svelte-stripe: 35 | specifier: ^0.0.22 36 | version: 0.0.22 37 | vite: 38 | specifier: ^4.3.0 39 | version: 4.3.9 40 | 41 | packages: 42 | 43 | /@esbuild/android-arm64@0.17.19: 44 | resolution: {integrity: sha512-KBMWvEZooR7+kzY0BtbTQn0OAYY7CsiydT63pVEaPtVYF0hXbUaOyZog37DKxK7NF3XacBJOpYT4adIJh+avxA==} 45 | engines: {node: '>=12'} 46 | cpu: [arm64] 47 | os: [android] 48 | requiresBuild: true 49 | dev: true 50 | optional: true 51 | 52 | /@esbuild/android-arm@0.17.19: 53 | resolution: {integrity: sha512-rIKddzqhmav7MSmoFCmDIb6e2W57geRsM94gV2l38fzhXMwq7hZoClug9USI2pFRGL06f4IOPHHpFNOkWieR8A==} 54 | engines: {node: '>=12'} 55 | cpu: [arm] 56 | os: [android] 57 | requiresBuild: true 58 | dev: true 59 | optional: true 60 | 61 | /@esbuild/android-x64@0.17.19: 62 | resolution: {integrity: sha512-uUTTc4xGNDT7YSArp/zbtmbhO0uEEK9/ETW29Wk1thYUJBz3IVnvgEiEwEa9IeLyvnpKrWK64Utw2bgUmDveww==} 63 | engines: {node: '>=12'} 64 | cpu: [x64] 65 | os: [android] 66 | requiresBuild: true 67 | dev: true 68 | optional: true 69 | 70 | /@esbuild/darwin-arm64@0.17.19: 71 | resolution: {integrity: sha512-80wEoCfF/hFKM6WE1FyBHc9SfUblloAWx6FJkFWTWiCoht9Mc0ARGEM47e67W9rI09YoUxJL68WHfDRYEAvOhg==} 72 | engines: {node: '>=12'} 73 | cpu: [arm64] 74 | os: [darwin] 75 | requiresBuild: true 76 | dev: true 77 | optional: true 78 | 79 | /@esbuild/darwin-x64@0.17.19: 80 | resolution: {integrity: sha512-IJM4JJsLhRYr9xdtLytPLSH9k/oxR3boaUIYiHkAawtwNOXKE8KoU8tMvryogdcT8AU+Bflmh81Xn6Q0vTZbQw==} 81 | engines: {node: '>=12'} 82 | cpu: [x64] 83 | os: [darwin] 84 | requiresBuild: true 85 | dev: true 86 | optional: true 87 | 88 | /@esbuild/freebsd-arm64@0.17.19: 89 | resolution: {integrity: sha512-pBwbc7DufluUeGdjSU5Si+P3SoMF5DQ/F/UmTSb8HXO80ZEAJmrykPyzo1IfNbAoaqw48YRpv8shwd1NoI0jcQ==} 90 | engines: {node: '>=12'} 91 | cpu: [arm64] 92 | os: [freebsd] 93 | requiresBuild: true 94 | dev: true 95 | optional: true 96 | 97 | /@esbuild/freebsd-x64@0.17.19: 98 | resolution: {integrity: sha512-4lu+n8Wk0XlajEhbEffdy2xy53dpR06SlzvhGByyg36qJw6Kpfk7cp45DR/62aPH9mtJRmIyrXAS5UWBrJT6TQ==} 99 | engines: {node: '>=12'} 100 | cpu: [x64] 101 | os: [freebsd] 102 | requiresBuild: true 103 | dev: true 104 | optional: true 105 | 106 | /@esbuild/linux-arm64@0.17.19: 107 | resolution: {integrity: sha512-ct1Tg3WGwd3P+oZYqic+YZF4snNl2bsnMKRkb3ozHmnM0dGWuxcPTTntAF6bOP0Sp4x0PjSF+4uHQ1xvxfRKqg==} 108 | engines: {node: '>=12'} 109 | cpu: [arm64] 110 | os: [linux] 111 | requiresBuild: true 112 | dev: true 113 | optional: true 114 | 115 | /@esbuild/linux-arm@0.17.19: 116 | resolution: {integrity: sha512-cdmT3KxjlOQ/gZ2cjfrQOtmhG4HJs6hhvm3mWSRDPtZ/lP5oe8FWceS10JaSJC13GBd4eH/haHnqf7hhGNLerA==} 117 | engines: {node: '>=12'} 118 | cpu: [arm] 119 | os: [linux] 120 | requiresBuild: true 121 | dev: true 122 | optional: true 123 | 124 | /@esbuild/linux-ia32@0.17.19: 125 | resolution: {integrity: sha512-w4IRhSy1VbsNxHRQpeGCHEmibqdTUx61Vc38APcsRbuVgK0OPEnQ0YD39Brymn96mOx48Y2laBQGqgZ0j9w6SQ==} 126 | engines: {node: '>=12'} 127 | cpu: [ia32] 128 | os: [linux] 129 | requiresBuild: true 130 | dev: true 131 | optional: true 132 | 133 | /@esbuild/linux-loong64@0.17.19: 134 | resolution: {integrity: sha512-2iAngUbBPMq439a+z//gE+9WBldoMp1s5GWsUSgqHLzLJ9WoZLZhpwWuym0u0u/4XmZ3gpHmzV84PonE+9IIdQ==} 135 | engines: {node: '>=12'} 136 | cpu: [loong64] 137 | os: [linux] 138 | requiresBuild: true 139 | dev: true 140 | optional: true 141 | 142 | /@esbuild/linux-mips64el@0.17.19: 143 | resolution: {integrity: sha512-LKJltc4LVdMKHsrFe4MGNPp0hqDFA1Wpt3jE1gEyM3nKUvOiO//9PheZZHfYRfYl6AwdTH4aTcXSqBerX0ml4A==} 144 | engines: {node: '>=12'} 145 | cpu: [mips64el] 146 | os: [linux] 147 | requiresBuild: true 148 | dev: true 149 | optional: true 150 | 151 | /@esbuild/linux-ppc64@0.17.19: 152 | resolution: {integrity: sha512-/c/DGybs95WXNS8y3Ti/ytqETiW7EU44MEKuCAcpPto3YjQbyK3IQVKfF6nbghD7EcLUGl0NbiL5Rt5DMhn5tg==} 153 | engines: {node: '>=12'} 154 | cpu: [ppc64] 155 | os: [linux] 156 | requiresBuild: true 157 | dev: true 158 | optional: true 159 | 160 | /@esbuild/linux-riscv64@0.17.19: 161 | resolution: {integrity: sha512-FC3nUAWhvFoutlhAkgHf8f5HwFWUL6bYdvLc/TTuxKlvLi3+pPzdZiFKSWz/PF30TB1K19SuCxDTI5KcqASJqA==} 162 | engines: {node: '>=12'} 163 | cpu: [riscv64] 164 | os: [linux] 165 | requiresBuild: true 166 | dev: true 167 | optional: true 168 | 169 | /@esbuild/linux-s390x@0.17.19: 170 | resolution: {integrity: sha512-IbFsFbxMWLuKEbH+7sTkKzL6NJmG2vRyy6K7JJo55w+8xDk7RElYn6xvXtDW8HCfoKBFK69f3pgBJSUSQPr+4Q==} 171 | engines: {node: '>=12'} 172 | cpu: [s390x] 173 | os: [linux] 174 | requiresBuild: true 175 | dev: true 176 | optional: true 177 | 178 | /@esbuild/linux-x64@0.17.19: 179 | resolution: {integrity: sha512-68ngA9lg2H6zkZcyp22tsVt38mlhWde8l3eJLWkyLrp4HwMUr3c1s/M2t7+kHIhvMjglIBrFpncX1SzMckomGw==} 180 | engines: {node: '>=12'} 181 | cpu: [x64] 182 | os: [linux] 183 | requiresBuild: true 184 | dev: true 185 | optional: true 186 | 187 | /@esbuild/netbsd-x64@0.17.19: 188 | resolution: {integrity: sha512-CwFq42rXCR8TYIjIfpXCbRX0rp1jo6cPIUPSaWwzbVI4aOfX96OXY8M6KNmtPcg7QjYeDmN+DD0Wp3LaBOLf4Q==} 189 | engines: {node: '>=12'} 190 | cpu: [x64] 191 | os: [netbsd] 192 | requiresBuild: true 193 | dev: true 194 | optional: true 195 | 196 | /@esbuild/openbsd-x64@0.17.19: 197 | resolution: {integrity: sha512-cnq5brJYrSZ2CF6c35eCmviIN3k3RczmHz8eYaVlNasVqsNY+JKohZU5MKmaOI+KkllCdzOKKdPs762VCPC20g==} 198 | engines: {node: '>=12'} 199 | cpu: [x64] 200 | os: [openbsd] 201 | requiresBuild: true 202 | dev: true 203 | optional: true 204 | 205 | /@esbuild/sunos-x64@0.17.19: 206 | resolution: {integrity: sha512-vCRT7yP3zX+bKWFeP/zdS6SqdWB8OIpaRq/mbXQxTGHnIxspRtigpkUcDMlSCOejlHowLqII7K2JKevwyRP2rg==} 207 | engines: {node: '>=12'} 208 | cpu: [x64] 209 | os: [sunos] 210 | requiresBuild: true 211 | dev: true 212 | optional: true 213 | 214 | /@esbuild/win32-arm64@0.17.19: 215 | resolution: {integrity: sha512-yYx+8jwowUstVdorcMdNlzklLYhPxjniHWFKgRqH7IFlUEa0Umu3KuYplf1HUZZ422e3NU9F4LGb+4O0Kdcaag==} 216 | engines: {node: '>=12'} 217 | cpu: [arm64] 218 | os: [win32] 219 | requiresBuild: true 220 | dev: true 221 | optional: true 222 | 223 | /@esbuild/win32-ia32@0.17.19: 224 | resolution: {integrity: sha512-eggDKanJszUtCdlVs0RB+h35wNlb5v4TWEkq4vZcmVt5u/HiDZrTXe2bWFQUez3RgNHwx/x4sk5++4NSSicKkw==} 225 | engines: {node: '>=12'} 226 | cpu: [ia32] 227 | os: [win32] 228 | requiresBuild: true 229 | dev: true 230 | optional: true 231 | 232 | /@esbuild/win32-x64@0.17.19: 233 | resolution: {integrity: sha512-lAhycmKnVOuRYNtRtatQR1LPQf2oYCkRGkSFnseDAKPl8lu5SOsK/e1sXe5a0Pc5kHIHe6P2I/ilntNv2xf3cA==} 234 | engines: {node: '>=12'} 235 | cpu: [x64] 236 | os: [win32] 237 | requiresBuild: true 238 | dev: true 239 | optional: true 240 | 241 | /@eslint-community/eslint-utils@4.4.0(eslint@8.41.0): 242 | resolution: {integrity: sha512-1/sA4dwrzBAyeUoQ6oxahHKmrZvsnLCg4RfxW3ZFGGmQkSNQPFNLV9CUEFQP1x9EYXHTo5p6xdhZM1Ne9p/AfA==} 243 | engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} 244 | peerDependencies: 245 | eslint: ^6.0.0 || ^7.0.0 || >=8.0.0 246 | dependencies: 247 | eslint: 8.41.0 248 | eslint-visitor-keys: 3.4.1 249 | dev: true 250 | 251 | /@eslint-community/regexpp@4.5.1: 252 | resolution: {integrity: sha512-Z5ba73P98O1KUYCCJTUeVpja9RcGoMdncZ6T49FCUl2lN38JtCJ+3WgIDBv0AuY4WChU5PmtJmOCTlN6FZTFKQ==} 253 | engines: {node: ^12.0.0 || ^14.0.0 || >=16.0.0} 254 | dev: true 255 | 256 | /@eslint/eslintrc@2.0.3: 257 | resolution: {integrity: sha512-+5gy6OQfk+xx3q0d6jGZZC3f3KzAkXc/IanVxd1is/VIIziRqqt3ongQz0FiTUXqTk0c7aDB3OaFuKnuSoJicQ==} 258 | engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} 259 | dependencies: 260 | ajv: 6.12.6 261 | debug: 4.3.4 262 | espree: 9.5.2 263 | globals: 13.20.0 264 | ignore: 5.2.4 265 | import-fresh: 3.3.0 266 | js-yaml: 4.1.0 267 | minimatch: 3.1.2 268 | strip-json-comments: 3.1.1 269 | transitivePeerDependencies: 270 | - supports-color 271 | dev: true 272 | 273 | /@eslint/js@8.41.0: 274 | resolution: {integrity: sha512-LxcyMGxwmTh2lY9FwHPGWOHmYFCZvbrFCBZL4FzSSsxsRPuhrYUg/49/0KDfW8tnIEaEHtfmn6+NPN+1DqaNmA==} 275 | engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} 276 | dev: true 277 | 278 | /@humanwhocodes/config-array@0.11.10: 279 | resolution: {integrity: sha512-KVVjQmNUepDVGXNuoRRdmmEjruj0KfiGSbS8LVc12LMsWDQzRXJ0qdhN8L8uUigKpfEHRhlaQFY0ib1tnUbNeQ==} 280 | engines: {node: '>=10.10.0'} 281 | dependencies: 282 | '@humanwhocodes/object-schema': 1.2.1 283 | debug: 4.3.4 284 | minimatch: 3.1.2 285 | transitivePeerDependencies: 286 | - supports-color 287 | dev: true 288 | 289 | /@humanwhocodes/module-importer@1.0.1: 290 | resolution: {integrity: sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==} 291 | engines: {node: '>=12.22'} 292 | dev: true 293 | 294 | /@humanwhocodes/object-schema@1.2.1: 295 | resolution: {integrity: sha512-ZnQMnLV4e7hDlUvw8H+U8ASL02SS2Gn6+9Ac3wGGLIe7+je2AeAOxPY+izIPJDfFDb7eDjev0Us8MO1iFRN8hA==} 296 | dev: true 297 | 298 | /@jridgewell/sourcemap-codec@1.4.15: 299 | resolution: {integrity: sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg==} 300 | dev: true 301 | 302 | /@nodelib/fs.scandir@2.1.5: 303 | resolution: {integrity: sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==} 304 | engines: {node: '>= 8'} 305 | dependencies: 306 | '@nodelib/fs.stat': 2.0.5 307 | run-parallel: 1.2.0 308 | dev: true 309 | 310 | /@nodelib/fs.stat@2.0.5: 311 | resolution: {integrity: sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==} 312 | engines: {node: '>= 8'} 313 | dev: true 314 | 315 | /@nodelib/fs.walk@1.2.8: 316 | resolution: {integrity: sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==} 317 | engines: {node: '>= 8'} 318 | dependencies: 319 | '@nodelib/fs.scandir': 2.1.5 320 | fastq: 1.15.0 321 | dev: true 322 | 323 | /@polka/url@1.0.0-next.21: 324 | resolution: {integrity: sha512-a5Sab1C4/icpTZVzZc5Ghpz88yQtGOyNqYXcZgOssB2uuAr+wF/MvN6bgtW32q7HHrvBki+BsZ0OuNv6EV3K9g==} 325 | dev: true 326 | 327 | /@stripe/stripe-js@1.54.0: 328 | resolution: {integrity: sha512-nElTXkS+nMfDNMkWfLmyeqHQfMGJ1JjrjAVMibV61Oc/rYdUv0cKRYCi1l4ivZ5SySB3vQLcLolxbKBkbNznZA==} 329 | dev: true 330 | 331 | /@sveltejs/adapter-auto@2.1.0(@sveltejs/kit@1.20.0): 332 | resolution: {integrity: sha512-o2pZCfATFtA/Gw/BB0Xm7k4EYaekXxaPGER3xGSY3FvzFJGTlJlZjBseaXwYSM94lZ0HniOjTokN3cWaLX6fow==} 333 | peerDependencies: 334 | '@sveltejs/kit': ^1.0.0 335 | dependencies: 336 | '@sveltejs/kit': 1.20.0(svelte@3.59.1)(vite@4.3.9) 337 | import-meta-resolve: 3.0.0 338 | dev: true 339 | 340 | /@sveltejs/kit@1.20.0(svelte@3.59.1)(vite@4.3.9): 341 | resolution: {integrity: sha512-2ZW14afgcCQBk3BN8+FWUUCIZg+TKeDFuOMUpDNllTa6sKZ+YQNpxhsrt9abaZohPGsGGOYmk5fzy8D8MHVNBw==} 342 | engines: {node: ^16.14 || >=18} 343 | hasBin: true 344 | requiresBuild: true 345 | peerDependencies: 346 | svelte: ^3.54.0 || ^4.0.0-next.0 347 | vite: ^4.0.0 348 | dependencies: 349 | '@sveltejs/vite-plugin-svelte': 2.4.1(svelte@3.59.1)(vite@4.3.9) 350 | '@types/cookie': 0.5.1 351 | cookie: 0.5.0 352 | devalue: 4.3.2 353 | esm-env: 1.0.0 354 | kleur: 4.1.5 355 | magic-string: 0.30.0 356 | mime: 3.0.0 357 | sade: 1.8.1 358 | set-cookie-parser: 2.6.0 359 | sirv: 2.0.3 360 | svelte: 3.59.1 361 | tiny-glob: 0.2.9 362 | undici: 5.22.1 363 | vite: 4.3.9 364 | transitivePeerDependencies: 365 | - supports-color 366 | dev: true 367 | 368 | /@sveltejs/vite-plugin-svelte-inspector@1.0.2(@sveltejs/vite-plugin-svelte@2.4.1)(svelte@3.59.1)(vite@4.3.9): 369 | resolution: {integrity: sha512-Cy1dUMcYCnDVV/hPLXa43YZJ2jGKVW5rA0xuNL9dlmYhT0yoS1g7+FOFSRlgk0BXKk/Oc7grs+8BVA5Iz2fr8A==} 370 | engines: {node: ^14.18.0 || >= 16} 371 | peerDependencies: 372 | '@sveltejs/vite-plugin-svelte': ^2.2.0 373 | svelte: ^3.54.0 || ^4.0.0-next.0 374 | vite: ^4.0.0 375 | dependencies: 376 | '@sveltejs/vite-plugin-svelte': 2.4.1(svelte@3.59.1)(vite@4.3.9) 377 | debug: 4.3.4 378 | svelte: 3.59.1 379 | vite: 4.3.9 380 | transitivePeerDependencies: 381 | - supports-color 382 | dev: true 383 | 384 | /@sveltejs/vite-plugin-svelte@2.4.1(svelte@3.59.1)(vite@4.3.9): 385 | resolution: {integrity: sha512-bNNKvoRY89ptY7udeBSCmTdCVwkjmMcZ0j/z9J5MuedT8jPjq0zrknAo/jF1sToAza4NVaAgR9AkZoD9oJJmnA==} 386 | engines: {node: ^14.18.0 || >= 16} 387 | peerDependencies: 388 | svelte: ^3.54.0 || ^4.0.0-next.0 389 | vite: ^4.0.0 390 | dependencies: 391 | '@sveltejs/vite-plugin-svelte-inspector': 1.0.2(@sveltejs/vite-plugin-svelte@2.4.1)(svelte@3.59.1)(vite@4.3.9) 392 | debug: 4.3.4 393 | deepmerge: 4.3.1 394 | kleur: 4.1.5 395 | magic-string: 0.30.0 396 | svelte: 3.59.1 397 | svelte-hmr: 0.15.2(svelte@3.59.1) 398 | vite: 4.3.9 399 | vitefu: 0.2.4(vite@4.3.9) 400 | transitivePeerDependencies: 401 | - supports-color 402 | dev: true 403 | 404 | /@types/cookie@0.5.1: 405 | resolution: {integrity: sha512-COUnqfB2+ckwXXSFInsFdOAWQzCCx+a5hq2ruyj+Vjund94RJQd4LG2u9hnvJrTgunKAaax7ancBYlDrNYxA0g==} 406 | dev: true 407 | 408 | /@types/node@20.2.5: 409 | resolution: {integrity: sha512-JJulVEQXmiY9Px5axXHeYGLSjhkZEnD+MDPDGbCbIAbMslkKwmygtZFy1X6s/075Yo94sf8GuSlFfPzysQrWZQ==} 410 | dev: true 411 | 412 | /acorn-jsx@5.3.2(acorn@8.8.2): 413 | resolution: {integrity: sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==} 414 | peerDependencies: 415 | acorn: ^6.0.0 || ^7.0.0 || ^8.0.0 416 | dependencies: 417 | acorn: 8.8.2 418 | dev: true 419 | 420 | /acorn@8.8.2: 421 | resolution: {integrity: sha512-xjIYgE8HBrkpd/sJqOGNspf8uHG+NOHGOw6a/Urj8taM2EXfdNAH2oFcPeIFfsv3+kz/mJrS5VuMqbNLjCa2vw==} 422 | engines: {node: '>=0.4.0'} 423 | hasBin: true 424 | dev: true 425 | 426 | /ajv@6.12.6: 427 | resolution: {integrity: sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==} 428 | dependencies: 429 | fast-deep-equal: 3.1.3 430 | fast-json-stable-stringify: 2.1.0 431 | json-schema-traverse: 0.4.1 432 | uri-js: 4.4.1 433 | dev: true 434 | 435 | /ansi-regex@5.0.1: 436 | resolution: {integrity: sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==} 437 | engines: {node: '>=8'} 438 | dev: true 439 | 440 | /ansi-styles@4.3.0: 441 | resolution: {integrity: sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==} 442 | engines: {node: '>=8'} 443 | dependencies: 444 | color-convert: 2.0.1 445 | dev: true 446 | 447 | /argparse@2.0.1: 448 | resolution: {integrity: sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==} 449 | dev: true 450 | 451 | /balanced-match@1.0.2: 452 | resolution: {integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==} 453 | dev: true 454 | 455 | /brace-expansion@1.1.11: 456 | resolution: {integrity: sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==} 457 | dependencies: 458 | balanced-match: 1.0.2 459 | concat-map: 0.0.1 460 | dev: true 461 | 462 | /busboy@1.6.0: 463 | resolution: {integrity: sha512-8SFQbg/0hQ9xy3UNTB0YEnsNBbWfhf7RtnzpL7TkBiTBRfrQ9Fxcnz7VJsleJpyp6rVLvXiuORqjlHi5q+PYuA==} 464 | engines: {node: '>=10.16.0'} 465 | dependencies: 466 | streamsearch: 1.1.0 467 | dev: true 468 | 469 | /call-bind@1.0.2: 470 | resolution: {integrity: sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==} 471 | dependencies: 472 | function-bind: 1.1.1 473 | get-intrinsic: 1.2.1 474 | dev: true 475 | 476 | /callsites@3.1.0: 477 | resolution: {integrity: sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==} 478 | engines: {node: '>=6'} 479 | dev: true 480 | 481 | /chalk@4.1.2: 482 | resolution: {integrity: sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==} 483 | engines: {node: '>=10'} 484 | dependencies: 485 | ansi-styles: 4.3.0 486 | supports-color: 7.2.0 487 | dev: true 488 | 489 | /color-convert@2.0.1: 490 | resolution: {integrity: sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==} 491 | engines: {node: '>=7.0.0'} 492 | dependencies: 493 | color-name: 1.1.4 494 | dev: true 495 | 496 | /color-name@1.1.4: 497 | resolution: {integrity: sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==} 498 | dev: true 499 | 500 | /concat-map@0.0.1: 501 | resolution: {integrity: sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==} 502 | dev: true 503 | 504 | /cookie@0.5.0: 505 | resolution: {integrity: sha512-YZ3GUyn/o8gfKJlnlX7g7xq4gyO6OSuhGPKaaGssGB2qgDUS0gPgtTvoyZLTt9Ab6dC4hfc9dV5arkvc/OCmrw==} 506 | engines: {node: '>= 0.6'} 507 | dev: true 508 | 509 | /cross-spawn@7.0.3: 510 | resolution: {integrity: sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==} 511 | engines: {node: '>= 8'} 512 | dependencies: 513 | path-key: 3.1.1 514 | shebang-command: 2.0.0 515 | which: 2.0.2 516 | dev: true 517 | 518 | /debug@4.3.4: 519 | resolution: {integrity: sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==} 520 | engines: {node: '>=6.0'} 521 | peerDependencies: 522 | supports-color: '*' 523 | peerDependenciesMeta: 524 | supports-color: 525 | optional: true 526 | dependencies: 527 | ms: 2.1.2 528 | dev: true 529 | 530 | /deep-is@0.1.4: 531 | resolution: {integrity: sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==} 532 | dev: true 533 | 534 | /deepmerge@4.3.1: 535 | resolution: {integrity: sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A==} 536 | engines: {node: '>=0.10.0'} 537 | dev: true 538 | 539 | /devalue@4.3.2: 540 | resolution: {integrity: sha512-KqFl6pOgOW+Y6wJgu80rHpo2/3H07vr8ntR9rkkFIRETewbf5GaYYcakYfiKz89K+sLsuPkQIZaXDMjUObZwWg==} 541 | dev: true 542 | 543 | /doctrine@3.0.0: 544 | resolution: {integrity: sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==} 545 | engines: {node: '>=6.0.0'} 546 | dependencies: 547 | esutils: 2.0.3 548 | dev: true 549 | 550 | /esbuild@0.17.19: 551 | resolution: {integrity: sha512-XQ0jAPFkK/u3LcVRcvVHQcTIqD6E2H1fvZMA5dQPSOWb3suUbWbfbRf94pjc0bNzRYLfIrDRQXr7X+LHIm5oHw==} 552 | engines: {node: '>=12'} 553 | hasBin: true 554 | requiresBuild: true 555 | optionalDependencies: 556 | '@esbuild/android-arm': 0.17.19 557 | '@esbuild/android-arm64': 0.17.19 558 | '@esbuild/android-x64': 0.17.19 559 | '@esbuild/darwin-arm64': 0.17.19 560 | '@esbuild/darwin-x64': 0.17.19 561 | '@esbuild/freebsd-arm64': 0.17.19 562 | '@esbuild/freebsd-x64': 0.17.19 563 | '@esbuild/linux-arm': 0.17.19 564 | '@esbuild/linux-arm64': 0.17.19 565 | '@esbuild/linux-ia32': 0.17.19 566 | '@esbuild/linux-loong64': 0.17.19 567 | '@esbuild/linux-mips64el': 0.17.19 568 | '@esbuild/linux-ppc64': 0.17.19 569 | '@esbuild/linux-riscv64': 0.17.19 570 | '@esbuild/linux-s390x': 0.17.19 571 | '@esbuild/linux-x64': 0.17.19 572 | '@esbuild/netbsd-x64': 0.17.19 573 | '@esbuild/openbsd-x64': 0.17.19 574 | '@esbuild/sunos-x64': 0.17.19 575 | '@esbuild/win32-arm64': 0.17.19 576 | '@esbuild/win32-ia32': 0.17.19 577 | '@esbuild/win32-x64': 0.17.19 578 | dev: true 579 | 580 | /escape-string-regexp@4.0.0: 581 | resolution: {integrity: sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==} 582 | engines: {node: '>=10'} 583 | dev: true 584 | 585 | /eslint-config-prettier@8.8.0(eslint@8.41.0): 586 | resolution: {integrity: sha512-wLbQiFre3tdGgpDv67NQKnJuTlcUVYHas3k+DZCc2U2BadthoEY4B7hLPvAxaqdyOGCzuLfii2fqGph10va7oA==} 587 | hasBin: true 588 | peerDependencies: 589 | eslint: '>=7.0.0' 590 | dependencies: 591 | eslint: 8.41.0 592 | dev: true 593 | 594 | /eslint-plugin-svelte@2.30.0(eslint@8.41.0)(svelte@3.59.1): 595 | resolution: {integrity: sha512-2/qj0BJsfM0U2j4EjGb7iC/0nbUvXx1Gn78CdtyuXpi/rSomLPCPwnsZsloXMzlt6Xwe8LBlpRvZObSKEHLP5A==} 596 | engines: {node: ^14.17.0 || >=16.0.0} 597 | peerDependencies: 598 | eslint: ^7.0.0 || ^8.0.0-0 599 | svelte: ^3.37.0 || ^4.0.0-0 600 | peerDependenciesMeta: 601 | svelte: 602 | optional: true 603 | dependencies: 604 | '@eslint-community/eslint-utils': 4.4.0(eslint@8.41.0) 605 | '@jridgewell/sourcemap-codec': 1.4.15 606 | debug: 4.3.4 607 | eslint: 8.41.0 608 | esutils: 2.0.3 609 | known-css-properties: 0.27.0 610 | postcss: 8.4.24 611 | postcss-load-config: 3.1.4(postcss@8.4.24) 612 | postcss-safe-parser: 6.0.0(postcss@8.4.24) 613 | svelte: 3.59.1 614 | svelte-eslint-parser: 0.30.0(svelte@3.59.1) 615 | transitivePeerDependencies: 616 | - supports-color 617 | - ts-node 618 | dev: true 619 | 620 | /eslint-scope@7.2.0: 621 | resolution: {integrity: sha512-DYj5deGlHBfMt15J7rdtyKNq/Nqlv5KfU4iodrQ019XESsRnwXH9KAE0y3cwtUHDo2ob7CypAnCqefh6vioWRw==} 622 | engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} 623 | dependencies: 624 | esrecurse: 4.3.0 625 | estraverse: 5.3.0 626 | dev: true 627 | 628 | /eslint-visitor-keys@3.4.1: 629 | resolution: {integrity: sha512-pZnmmLwYzf+kWaM/Qgrvpen51upAktaaiI01nsJD/Yr3lMOdNtq0cxkrrg16w64VtisN6okbs7Q8AfGqj4c9fA==} 630 | engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} 631 | dev: true 632 | 633 | /eslint@8.41.0: 634 | resolution: {integrity: sha512-WQDQpzGBOP5IrXPo4Hc0814r4/v2rrIsB0rhT7jtunIalgg6gYXWhRMOejVO8yH21T/FGaxjmFjBMNqcIlmH1Q==} 635 | engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} 636 | hasBin: true 637 | dependencies: 638 | '@eslint-community/eslint-utils': 4.4.0(eslint@8.41.0) 639 | '@eslint-community/regexpp': 4.5.1 640 | '@eslint/eslintrc': 2.0.3 641 | '@eslint/js': 8.41.0 642 | '@humanwhocodes/config-array': 0.11.10 643 | '@humanwhocodes/module-importer': 1.0.1 644 | '@nodelib/fs.walk': 1.2.8 645 | ajv: 6.12.6 646 | chalk: 4.1.2 647 | cross-spawn: 7.0.3 648 | debug: 4.3.4 649 | doctrine: 3.0.0 650 | escape-string-regexp: 4.0.0 651 | eslint-scope: 7.2.0 652 | eslint-visitor-keys: 3.4.1 653 | espree: 9.5.2 654 | esquery: 1.5.0 655 | esutils: 2.0.3 656 | fast-deep-equal: 3.1.3 657 | file-entry-cache: 6.0.1 658 | find-up: 5.0.0 659 | glob-parent: 6.0.2 660 | globals: 13.20.0 661 | graphemer: 1.4.0 662 | ignore: 5.2.4 663 | import-fresh: 3.3.0 664 | imurmurhash: 0.1.4 665 | is-glob: 4.0.3 666 | is-path-inside: 3.0.3 667 | js-yaml: 4.1.0 668 | json-stable-stringify-without-jsonify: 1.0.1 669 | levn: 0.4.1 670 | lodash.merge: 4.6.2 671 | minimatch: 3.1.2 672 | natural-compare: 1.4.0 673 | optionator: 0.9.1 674 | strip-ansi: 6.0.1 675 | strip-json-comments: 3.1.1 676 | text-table: 0.2.0 677 | transitivePeerDependencies: 678 | - supports-color 679 | dev: true 680 | 681 | /esm-env@1.0.0: 682 | resolution: {integrity: sha512-Cf6VksWPsTuW01vU9Mk/3vRue91Zevka5SjyNf3nEpokFRuqt/KjUQoGAwq9qMmhpLTHmXzSIrFRw8zxWzmFBA==} 683 | dev: true 684 | 685 | /espree@9.5.2: 686 | resolution: {integrity: sha512-7OASN1Wma5fum5SrNhFMAMJxOUAbhyfQ8dQ//PJaJbNw0URTPWqIghHWt1MmAANKhHZIYOHruW4Kw4ruUWOdGw==} 687 | engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} 688 | dependencies: 689 | acorn: 8.8.2 690 | acorn-jsx: 5.3.2(acorn@8.8.2) 691 | eslint-visitor-keys: 3.4.1 692 | dev: true 693 | 694 | /esquery@1.5.0: 695 | resolution: {integrity: sha512-YQLXUplAwJgCydQ78IMJywZCceoqk1oH01OERdSAJc/7U2AylwjhSCLDEtqwg811idIS/9fIU5GjG73IgjKMVg==} 696 | engines: {node: '>=0.10'} 697 | dependencies: 698 | estraverse: 5.3.0 699 | dev: true 700 | 701 | /esrecurse@4.3.0: 702 | resolution: {integrity: sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==} 703 | engines: {node: '>=4.0'} 704 | dependencies: 705 | estraverse: 5.3.0 706 | dev: true 707 | 708 | /estraverse@5.3.0: 709 | resolution: {integrity: sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==} 710 | engines: {node: '>=4.0'} 711 | dev: true 712 | 713 | /esutils@2.0.3: 714 | resolution: {integrity: sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==} 715 | engines: {node: '>=0.10.0'} 716 | dev: true 717 | 718 | /fast-deep-equal@3.1.3: 719 | resolution: {integrity: sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==} 720 | dev: true 721 | 722 | /fast-json-stable-stringify@2.1.0: 723 | resolution: {integrity: sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==} 724 | dev: true 725 | 726 | /fast-levenshtein@2.0.6: 727 | resolution: {integrity: sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==} 728 | dev: true 729 | 730 | /fastq@1.15.0: 731 | resolution: {integrity: sha512-wBrocU2LCXXa+lWBt8RoIRD89Fi8OdABODa/kEnyeyjS5aZO5/GNvI5sEINADqP/h8M29UHTHUb53sUu5Ihqdw==} 732 | dependencies: 733 | reusify: 1.0.4 734 | dev: true 735 | 736 | /file-entry-cache@6.0.1: 737 | resolution: {integrity: sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==} 738 | engines: {node: ^10.12.0 || >=12.0.0} 739 | dependencies: 740 | flat-cache: 3.0.4 741 | dev: true 742 | 743 | /find-up@5.0.0: 744 | resolution: {integrity: sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==} 745 | engines: {node: '>=10'} 746 | dependencies: 747 | locate-path: 6.0.0 748 | path-exists: 4.0.0 749 | dev: true 750 | 751 | /flat-cache@3.0.4: 752 | resolution: {integrity: sha512-dm9s5Pw7Jc0GvMYbshN6zchCA9RgQlzzEZX3vylR9IqFfS8XciblUXOKfW6SiuJ0e13eDYZoZV5wdrev7P3Nwg==} 753 | engines: {node: ^10.12.0 || >=12.0.0} 754 | dependencies: 755 | flatted: 3.2.7 756 | rimraf: 3.0.2 757 | dev: true 758 | 759 | /flatted@3.2.7: 760 | resolution: {integrity: sha512-5nqDSxl8nn5BSNxyR3n4I6eDmbolI6WT+QqR547RwxQapgjQBmtktdP+HTBb/a/zLsbzERTONyUB5pefh5TtjQ==} 761 | dev: true 762 | 763 | /fs.realpath@1.0.0: 764 | resolution: {integrity: sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==} 765 | dev: true 766 | 767 | /fsevents@2.3.2: 768 | resolution: {integrity: sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==} 769 | engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0} 770 | os: [darwin] 771 | requiresBuild: true 772 | dev: true 773 | optional: true 774 | 775 | /function-bind@1.1.1: 776 | resolution: {integrity: sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==} 777 | dev: true 778 | 779 | /get-intrinsic@1.2.1: 780 | resolution: {integrity: sha512-2DcsyfABl+gVHEfCOaTrWgyt+tb6MSEGmKq+kI5HwLbIYgjgmMcV8KQ41uaKz1xxUcn9tJtgFbQUEVcEbd0FYw==} 781 | dependencies: 782 | function-bind: 1.1.1 783 | has: 1.0.3 784 | has-proto: 1.0.1 785 | has-symbols: 1.0.3 786 | dev: true 787 | 788 | /glob-parent@6.0.2: 789 | resolution: {integrity: sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==} 790 | engines: {node: '>=10.13.0'} 791 | dependencies: 792 | is-glob: 4.0.3 793 | dev: true 794 | 795 | /glob@7.2.3: 796 | resolution: {integrity: sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==} 797 | dependencies: 798 | fs.realpath: 1.0.0 799 | inflight: 1.0.6 800 | inherits: 2.0.4 801 | minimatch: 3.1.2 802 | once: 1.4.0 803 | path-is-absolute: 1.0.1 804 | dev: true 805 | 806 | /globals@13.20.0: 807 | resolution: {integrity: sha512-Qg5QtVkCy/kv3FUSlu4ukeZDVf9ee0iXLAUYX13gbR17bnejFTzr4iS9bY7kwCf1NztRNm1t91fjOiyx4CSwPQ==} 808 | engines: {node: '>=8'} 809 | dependencies: 810 | type-fest: 0.20.2 811 | dev: true 812 | 813 | /globalyzer@0.1.0: 814 | resolution: {integrity: sha512-40oNTM9UfG6aBmuKxk/giHn5nQ8RVz/SS4Ir6zgzOv9/qC3kKZ9v4etGTcJbEl/NyVQH7FGU7d+X1egr57Md2Q==} 815 | dev: true 816 | 817 | /globrex@0.1.2: 818 | resolution: {integrity: sha512-uHJgbwAMwNFf5mLst7IWLNg14x1CkeqglJb/K3doi4dw6q2IvAAmM/Y81kevy83wP+Sst+nutFTYOGg3d1lsxg==} 819 | dev: true 820 | 821 | /graphemer@1.4.0: 822 | resolution: {integrity: sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==} 823 | dev: true 824 | 825 | /has-flag@4.0.0: 826 | resolution: {integrity: sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==} 827 | engines: {node: '>=8'} 828 | dev: true 829 | 830 | /has-proto@1.0.1: 831 | resolution: {integrity: sha512-7qE+iP+O+bgF9clE5+UoBFzE65mlBiVj3tKCrlNQ0Ogwm0BjpT/gK4SlLYDMybDh5I3TCTKnPPa0oMG7JDYrhg==} 832 | engines: {node: '>= 0.4'} 833 | dev: true 834 | 835 | /has-symbols@1.0.3: 836 | resolution: {integrity: sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==} 837 | engines: {node: '>= 0.4'} 838 | dev: true 839 | 840 | /has@1.0.3: 841 | resolution: {integrity: sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==} 842 | engines: {node: '>= 0.4.0'} 843 | dependencies: 844 | function-bind: 1.1.1 845 | dev: true 846 | 847 | /ignore@5.2.4: 848 | resolution: {integrity: sha512-MAb38BcSbH0eHNBxn7ql2NH/kX33OkB3lZ1BNdh7ENeRChHTYsTvWrMubiIAMNS2llXEEgZ1MUOBtXChP3kaFQ==} 849 | engines: {node: '>= 4'} 850 | dev: true 851 | 852 | /import-fresh@3.3.0: 853 | resolution: {integrity: sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==} 854 | engines: {node: '>=6'} 855 | dependencies: 856 | parent-module: 1.0.1 857 | resolve-from: 4.0.0 858 | dev: true 859 | 860 | /import-meta-resolve@3.0.0: 861 | resolution: {integrity: sha512-4IwhLhNNA8yy445rPjD/lWh++7hMDOml2eHtd58eG7h+qK3EryMuuRbsHGPikCoAgIkkDnckKfWSk2iDla/ejg==} 862 | dev: true 863 | 864 | /imurmurhash@0.1.4: 865 | resolution: {integrity: sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==} 866 | engines: {node: '>=0.8.19'} 867 | dev: true 868 | 869 | /inflight@1.0.6: 870 | resolution: {integrity: sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==} 871 | dependencies: 872 | once: 1.4.0 873 | wrappy: 1.0.2 874 | dev: true 875 | 876 | /inherits@2.0.4: 877 | resolution: {integrity: sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==} 878 | dev: true 879 | 880 | /is-extglob@2.1.1: 881 | resolution: {integrity: sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==} 882 | engines: {node: '>=0.10.0'} 883 | dev: true 884 | 885 | /is-glob@4.0.3: 886 | resolution: {integrity: sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==} 887 | engines: {node: '>=0.10.0'} 888 | dependencies: 889 | is-extglob: 2.1.1 890 | dev: true 891 | 892 | /is-path-inside@3.0.3: 893 | resolution: {integrity: sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==} 894 | engines: {node: '>=8'} 895 | dev: true 896 | 897 | /isexe@2.0.0: 898 | resolution: {integrity: sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==} 899 | dev: true 900 | 901 | /js-yaml@4.1.0: 902 | resolution: {integrity: sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==} 903 | hasBin: true 904 | dependencies: 905 | argparse: 2.0.1 906 | dev: true 907 | 908 | /json-schema-traverse@0.4.1: 909 | resolution: {integrity: sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==} 910 | dev: true 911 | 912 | /json-stable-stringify-without-jsonify@1.0.1: 913 | resolution: {integrity: sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==} 914 | dev: true 915 | 916 | /kleur@4.1.5: 917 | resolution: {integrity: sha512-o+NO+8WrRiQEE4/7nwRJhN1HWpVmJm511pBHUxPLtp0BUISzlBplORYSmTclCnJvQq2tKu/sgl3xVpkc7ZWuQQ==} 918 | engines: {node: '>=6'} 919 | dev: true 920 | 921 | /known-css-properties@0.27.0: 922 | resolution: {integrity: sha512-uMCj6+hZYDoffuvAJjFAPz56E9uoowFHmTkqRtRq5WyC5Q6Cu/fTZKNQpX/RbzChBYLLl3lo8CjFZBAZXq9qFg==} 923 | dev: true 924 | 925 | /levn@0.4.1: 926 | resolution: {integrity: sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==} 927 | engines: {node: '>= 0.8.0'} 928 | dependencies: 929 | prelude-ls: 1.2.1 930 | type-check: 0.4.0 931 | dev: true 932 | 933 | /lilconfig@2.1.0: 934 | resolution: {integrity: sha512-utWOt/GHzuUxnLKxB6dk81RoOeoNeHgbrXiuGk4yyF5qlRz+iIVWu56E2fqGHFrXz0QNUhLB/8nKqvRH66JKGQ==} 935 | engines: {node: '>=10'} 936 | dev: true 937 | 938 | /locate-path@6.0.0: 939 | resolution: {integrity: sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==} 940 | engines: {node: '>=10'} 941 | dependencies: 942 | p-locate: 5.0.0 943 | dev: true 944 | 945 | /lodash.merge@4.6.2: 946 | resolution: {integrity: sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==} 947 | dev: true 948 | 949 | /magic-string@0.30.0: 950 | resolution: {integrity: sha512-LA+31JYDJLs82r2ScLrlz1GjSgu66ZV518eyWT+S8VhyQn/JL0u9MeBOvQMGYiPk1DBiSN9DDMOcXvigJZaViQ==} 951 | engines: {node: '>=12'} 952 | dependencies: 953 | '@jridgewell/sourcemap-codec': 1.4.15 954 | dev: true 955 | 956 | /mime@3.0.0: 957 | resolution: {integrity: sha512-jSCU7/VB1loIWBZe14aEYHU/+1UMEHoaO7qxCOVJOw9GgH72VAWppxNcjU+x9a2k3GSIBXNKxXQFqRvvZ7vr3A==} 958 | engines: {node: '>=10.0.0'} 959 | hasBin: true 960 | dev: true 961 | 962 | /minimatch@3.1.2: 963 | resolution: {integrity: sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==} 964 | dependencies: 965 | brace-expansion: 1.1.11 966 | dev: true 967 | 968 | /mri@1.2.0: 969 | resolution: {integrity: sha512-tzzskb3bG8LvYGFF/mDTpq3jpI6Q9wc3LEmBaghu+DdCssd1FakN7Bc0hVNmEyGq1bq3RgfkCb3cmQLpNPOroA==} 970 | engines: {node: '>=4'} 971 | dev: true 972 | 973 | /mrmime@1.0.1: 974 | resolution: {integrity: sha512-hzzEagAgDyoU1Q6yg5uI+AorQgdvMCur3FcKf7NhMKWsaYg+RnbTyHRa/9IlLF9rf455MOCtcqqrQQ83pPP7Uw==} 975 | engines: {node: '>=10'} 976 | dev: true 977 | 978 | /ms@2.1.2: 979 | resolution: {integrity: sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==} 980 | dev: true 981 | 982 | /nanoid@3.3.6: 983 | resolution: {integrity: sha512-BGcqMMJuToF7i1rt+2PWSNVnWIkGCU78jBG3RxO/bZlnZPK2Cmi2QaffxGO/2RvWi9sL+FAiRiXMgsyxQ1DIDA==} 984 | engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1} 985 | hasBin: true 986 | dev: true 987 | 988 | /natural-compare@1.4.0: 989 | resolution: {integrity: sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==} 990 | dev: true 991 | 992 | /object-inspect@1.12.3: 993 | resolution: {integrity: sha512-geUvdk7c+eizMNUDkRpW1wJwgfOiOeHbxBR/hLXK1aT6zmVSO0jsQcs7fj6MGw89jC/cjGfLcNOrtMYtGqm81g==} 994 | dev: true 995 | 996 | /once@1.4.0: 997 | resolution: {integrity: sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==} 998 | dependencies: 999 | wrappy: 1.0.2 1000 | dev: true 1001 | 1002 | /optionator@0.9.1: 1003 | resolution: {integrity: sha512-74RlY5FCnhq4jRxVUPKDaRwrVNXMqsGsiW6AJw4XK8hmtm10wC0ypZBLw5IIp85NZMr91+qd1RvvENwg7jjRFw==} 1004 | engines: {node: '>= 0.8.0'} 1005 | dependencies: 1006 | deep-is: 0.1.4 1007 | fast-levenshtein: 2.0.6 1008 | levn: 0.4.1 1009 | prelude-ls: 1.2.1 1010 | type-check: 0.4.0 1011 | word-wrap: 1.2.3 1012 | dev: true 1013 | 1014 | /p-limit@3.1.0: 1015 | resolution: {integrity: sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==} 1016 | engines: {node: '>=10'} 1017 | dependencies: 1018 | yocto-queue: 0.1.0 1019 | dev: true 1020 | 1021 | /p-locate@5.0.0: 1022 | resolution: {integrity: sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==} 1023 | engines: {node: '>=10'} 1024 | dependencies: 1025 | p-limit: 3.1.0 1026 | dev: true 1027 | 1028 | /parent-module@1.0.1: 1029 | resolution: {integrity: sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==} 1030 | engines: {node: '>=6'} 1031 | dependencies: 1032 | callsites: 3.1.0 1033 | dev: true 1034 | 1035 | /path-exists@4.0.0: 1036 | resolution: {integrity: sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==} 1037 | engines: {node: '>=8'} 1038 | dev: true 1039 | 1040 | /path-is-absolute@1.0.1: 1041 | resolution: {integrity: sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==} 1042 | engines: {node: '>=0.10.0'} 1043 | dev: true 1044 | 1045 | /path-key@3.1.1: 1046 | resolution: {integrity: sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==} 1047 | engines: {node: '>=8'} 1048 | dev: true 1049 | 1050 | /picocolors@1.0.0: 1051 | resolution: {integrity: sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==} 1052 | dev: true 1053 | 1054 | /postcss-load-config@3.1.4(postcss@8.4.24): 1055 | resolution: {integrity: sha512-6DiM4E7v4coTE4uzA8U//WhtPwyhiim3eyjEMFCnUpzbrkK9wJHgKDT2mR+HbtSrd/NubVaYTOpSpjUl8NQeRg==} 1056 | engines: {node: '>= 10'} 1057 | peerDependencies: 1058 | postcss: '>=8.0.9' 1059 | ts-node: '>=9.0.0' 1060 | peerDependenciesMeta: 1061 | postcss: 1062 | optional: true 1063 | ts-node: 1064 | optional: true 1065 | dependencies: 1066 | lilconfig: 2.1.0 1067 | postcss: 8.4.24 1068 | yaml: 1.10.2 1069 | dev: true 1070 | 1071 | /postcss-safe-parser@6.0.0(postcss@8.4.24): 1072 | resolution: {integrity: sha512-FARHN8pwH+WiS2OPCxJI8FuRJpTVnn6ZNFiqAM2aeW2LwTHWWmWgIyKC6cUo0L8aeKiF/14MNvnpls6R2PBeMQ==} 1073 | engines: {node: '>=12.0'} 1074 | peerDependencies: 1075 | postcss: ^8.3.3 1076 | dependencies: 1077 | postcss: 8.4.24 1078 | dev: true 1079 | 1080 | /postcss@8.4.24: 1081 | resolution: {integrity: sha512-M0RzbcI0sO/XJNucsGjvWU9ERWxb/ytp1w6dKtxTKgixdtQDq4rmx/g8W1hnaheq9jgwL/oyEdH5Bc4WwJKMqg==} 1082 | engines: {node: ^10 || ^12 || >=14} 1083 | dependencies: 1084 | nanoid: 3.3.6 1085 | picocolors: 1.0.0 1086 | source-map-js: 1.0.2 1087 | dev: true 1088 | 1089 | /prelude-ls@1.2.1: 1090 | resolution: {integrity: sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==} 1091 | engines: {node: '>= 0.8.0'} 1092 | dev: true 1093 | 1094 | /prettier-plugin-svelte@2.10.1(prettier@2.8.8)(svelte@3.59.1): 1095 | resolution: {integrity: sha512-Wlq7Z5v2ueCubWo0TZzKc9XHcm7TDxqcuzRuGd0gcENfzfT4JZ9yDlCbEgxWgiPmLHkBjfOtpAWkcT28MCDpUQ==} 1096 | peerDependencies: 1097 | prettier: ^1.16.4 || ^2.0.0 1098 | svelte: ^3.2.0 || ^4.0.0-next.0 1099 | dependencies: 1100 | prettier: 2.8.8 1101 | svelte: 3.59.1 1102 | dev: true 1103 | 1104 | /prettier@2.8.8: 1105 | resolution: {integrity: sha512-tdN8qQGvNjw4CHbY+XXk0JgCXn9QiF21a55rBe5LJAU+kDyC4WQn4+awm2Xfk2lQMk5fKup9XgzTZtGkjBdP9Q==} 1106 | engines: {node: '>=10.13.0'} 1107 | hasBin: true 1108 | dev: true 1109 | 1110 | /punycode@2.3.0: 1111 | resolution: {integrity: sha512-rRV+zQD8tVFys26lAGR9WUuS4iUAngJScM+ZRSKtvl5tKeZ2t5bvdNFdNHBW9FWR4guGHlgmsZ1G7BSm2wTbuA==} 1112 | engines: {node: '>=6'} 1113 | dev: true 1114 | 1115 | /qs@6.11.2: 1116 | resolution: {integrity: sha512-tDNIz22aBzCDxLtVH++VnTfzxlfeK5CbqohpSqpJgj1Wg/cQbStNAz3NuqCs5vV+pjBsK4x4pN9HlVh7rcYRiA==} 1117 | engines: {node: '>=0.6'} 1118 | dependencies: 1119 | side-channel: 1.0.4 1120 | dev: true 1121 | 1122 | /queue-microtask@1.2.3: 1123 | resolution: {integrity: sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==} 1124 | dev: true 1125 | 1126 | /resolve-from@4.0.0: 1127 | resolution: {integrity: sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==} 1128 | engines: {node: '>=4'} 1129 | dev: true 1130 | 1131 | /reusify@1.0.4: 1132 | resolution: {integrity: sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==} 1133 | engines: {iojs: '>=1.0.0', node: '>=0.10.0'} 1134 | dev: true 1135 | 1136 | /rimraf@3.0.2: 1137 | resolution: {integrity: sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==} 1138 | hasBin: true 1139 | dependencies: 1140 | glob: 7.2.3 1141 | dev: true 1142 | 1143 | /rollup@3.23.0: 1144 | resolution: {integrity: sha512-h31UlwEi7FHihLe1zbk+3Q7z1k/84rb9BSwmBSr/XjOCEaBJ2YyedQDuM0t/kfOS0IxM+vk1/zI9XxYj9V+NJQ==} 1145 | engines: {node: '>=14.18.0', npm: '>=8.0.0'} 1146 | hasBin: true 1147 | optionalDependencies: 1148 | fsevents: 2.3.2 1149 | dev: true 1150 | 1151 | /run-parallel@1.2.0: 1152 | resolution: {integrity: sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==} 1153 | dependencies: 1154 | queue-microtask: 1.2.3 1155 | dev: true 1156 | 1157 | /sade@1.8.1: 1158 | resolution: {integrity: sha512-xal3CZX1Xlo/k4ApwCFrHVACi9fBqJ7V+mwhBsuf/1IOKbBy098Fex+Wa/5QMubw09pSZ/u8EY8PWgevJsXp1A==} 1159 | engines: {node: '>=6'} 1160 | dependencies: 1161 | mri: 1.2.0 1162 | dev: true 1163 | 1164 | /set-cookie-parser@2.6.0: 1165 | resolution: {integrity: sha512-RVnVQxTXuerk653XfuliOxBP81Sf0+qfQE73LIYKcyMYHG94AuH0kgrQpRDuTZnSmjpysHmzxJXKNfa6PjFhyQ==} 1166 | dev: true 1167 | 1168 | /shebang-command@2.0.0: 1169 | resolution: {integrity: sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==} 1170 | engines: {node: '>=8'} 1171 | dependencies: 1172 | shebang-regex: 3.0.0 1173 | dev: true 1174 | 1175 | /shebang-regex@3.0.0: 1176 | resolution: {integrity: sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==} 1177 | engines: {node: '>=8'} 1178 | dev: true 1179 | 1180 | /side-channel@1.0.4: 1181 | resolution: {integrity: sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw==} 1182 | dependencies: 1183 | call-bind: 1.0.2 1184 | get-intrinsic: 1.2.1 1185 | object-inspect: 1.12.3 1186 | dev: true 1187 | 1188 | /sirv@2.0.3: 1189 | resolution: {integrity: sha512-O9jm9BsID1P+0HOi81VpXPoDxYP374pkOLzACAoyUQ/3OUVndNpsz6wMnY2z+yOxzbllCKZrM+9QrWsv4THnyA==} 1190 | engines: {node: '>= 10'} 1191 | dependencies: 1192 | '@polka/url': 1.0.0-next.21 1193 | mrmime: 1.0.1 1194 | totalist: 3.0.1 1195 | dev: true 1196 | 1197 | /source-map-js@1.0.2: 1198 | resolution: {integrity: sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw==} 1199 | engines: {node: '>=0.10.0'} 1200 | dev: true 1201 | 1202 | /streamsearch@1.1.0: 1203 | resolution: {integrity: sha512-Mcc5wHehp9aXz1ax6bZUyY5afg9u2rv5cqQI3mRrYkGC8rW2hM02jWuwjtL++LS5qinSyhj2QfLyNsuc+VsExg==} 1204 | engines: {node: '>=10.0.0'} 1205 | dev: true 1206 | 1207 | /strip-ansi@6.0.1: 1208 | resolution: {integrity: sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==} 1209 | engines: {node: '>=8'} 1210 | dependencies: 1211 | ansi-regex: 5.0.1 1212 | dev: true 1213 | 1214 | /strip-json-comments@3.1.1: 1215 | resolution: {integrity: sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==} 1216 | engines: {node: '>=8'} 1217 | dev: true 1218 | 1219 | /stripe@12.8.0: 1220 | resolution: {integrity: sha512-LVn981F20uR/0osbGq5n6j49LBh2W3gLoO96d8GPcUX0UYWzIOYXCG3aImIxNuiUPlgtziTHs+e33On2JgCScg==} 1221 | engines: {node: '>=12.*'} 1222 | dependencies: 1223 | '@types/node': 20.2.5 1224 | qs: 6.11.2 1225 | dev: true 1226 | 1227 | /supports-color@7.2.0: 1228 | resolution: {integrity: sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==} 1229 | engines: {node: '>=8'} 1230 | dependencies: 1231 | has-flag: 4.0.0 1232 | dev: true 1233 | 1234 | /svelte-eslint-parser@0.30.0(svelte@3.59.1): 1235 | resolution: {integrity: sha512-H0Cn2TKr70DU9p/Gb04CfwtS7eK28MYumrHYPaDNkIFbfwGDLADpbERBn7u8G1Rcm2RMr2/mL6mq0J2e8iKFlA==} 1236 | engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} 1237 | peerDependencies: 1238 | svelte: ^3.37.0 || ^4.0.0-0 1239 | peerDependenciesMeta: 1240 | svelte: 1241 | optional: true 1242 | dependencies: 1243 | eslint-scope: 7.2.0 1244 | eslint-visitor-keys: 3.4.1 1245 | espree: 9.5.2 1246 | svelte: 3.59.1 1247 | dev: true 1248 | 1249 | /svelte-hmr@0.15.2(svelte@3.59.1): 1250 | resolution: {integrity: sha512-q/bAruCvFLwvNbeE1x3n37TYFb3mTBJ6TrCq6p2CoFbSTNhDE9oAtEfpy+wmc9So8AG0Tja+X0/mJzX9tSfvIg==} 1251 | engines: {node: ^12.20 || ^14.13.1 || >= 16} 1252 | peerDependencies: 1253 | svelte: ^3.19.0 || ^4.0.0-next.0 1254 | dependencies: 1255 | svelte: 3.59.1 1256 | dev: true 1257 | 1258 | /svelte-stripe@0.0.22: 1259 | resolution: {integrity: sha512-ZLt55XNWrytsMfaMUUxEknLjphYWqhRkRNcHmmkp7gbENKSB8rp6o6hZP5zWEoUGwYNiPGqpM/DgbXy27BdVIQ==} 1260 | dependencies: 1261 | '@stripe/stripe-js': 1.54.0 1262 | dev: true 1263 | 1264 | /svelte@3.59.1: 1265 | resolution: {integrity: sha512-pKj8fEBmqf6mq3/NfrB9SLtcJcUvjYSWyePlfCqN9gujLB25RitWK8PvFzlwim6hD/We35KbPlRteuA6rnPGcQ==} 1266 | engines: {node: '>= 8'} 1267 | dev: true 1268 | 1269 | /text-table@0.2.0: 1270 | resolution: {integrity: sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==} 1271 | dev: true 1272 | 1273 | /tiny-glob@0.2.9: 1274 | resolution: {integrity: sha512-g/55ssRPUjShh+xkfx9UPDXqhckHEsHr4Vd9zX55oSdGZc/MD0m3sferOkwWtp98bv+kcVfEHtRJgBVJzelrzg==} 1275 | dependencies: 1276 | globalyzer: 0.1.0 1277 | globrex: 0.1.2 1278 | dev: true 1279 | 1280 | /totalist@3.0.1: 1281 | resolution: {integrity: sha512-sf4i37nQ2LBx4m3wB74y+ubopq6W/dIzXg0FDGjsYnZHVa1Da8FH853wlL2gtUhg+xJXjfk3kUZS3BRoQeoQBQ==} 1282 | engines: {node: '>=6'} 1283 | dev: true 1284 | 1285 | /type-check@0.4.0: 1286 | resolution: {integrity: sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==} 1287 | engines: {node: '>= 0.8.0'} 1288 | dependencies: 1289 | prelude-ls: 1.2.1 1290 | dev: true 1291 | 1292 | /type-fest@0.20.2: 1293 | resolution: {integrity: sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==} 1294 | engines: {node: '>=10'} 1295 | dev: true 1296 | 1297 | /undici@5.22.1: 1298 | resolution: {integrity: sha512-Ji2IJhFXZY0x/0tVBXeQwgPlLWw13GVzpsWPQ3rV50IFMMof2I55PZZxtm4P6iNq+L5znYN9nSTAq0ZyE6lSJw==} 1299 | engines: {node: '>=14.0'} 1300 | dependencies: 1301 | busboy: 1.6.0 1302 | dev: true 1303 | 1304 | /uri-js@4.4.1: 1305 | resolution: {integrity: sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==} 1306 | dependencies: 1307 | punycode: 2.3.0 1308 | dev: true 1309 | 1310 | /vite@4.3.9: 1311 | resolution: {integrity: sha512-qsTNZjO9NoJNW7KnOrgYwczm0WctJ8m/yqYAMAK9Lxt4SoySUfS5S8ia9K7JHpa3KEeMfyF8LoJ3c5NeBJy6pg==} 1312 | engines: {node: ^14.18.0 || >=16.0.0} 1313 | hasBin: true 1314 | peerDependencies: 1315 | '@types/node': '>= 14' 1316 | less: '*' 1317 | sass: '*' 1318 | stylus: '*' 1319 | sugarss: '*' 1320 | terser: ^5.4.0 1321 | peerDependenciesMeta: 1322 | '@types/node': 1323 | optional: true 1324 | less: 1325 | optional: true 1326 | sass: 1327 | optional: true 1328 | stylus: 1329 | optional: true 1330 | sugarss: 1331 | optional: true 1332 | terser: 1333 | optional: true 1334 | dependencies: 1335 | esbuild: 0.17.19 1336 | postcss: 8.4.24 1337 | rollup: 3.23.0 1338 | optionalDependencies: 1339 | fsevents: 2.3.2 1340 | dev: true 1341 | 1342 | /vitefu@0.2.4(vite@4.3.9): 1343 | resolution: {integrity: sha512-fanAXjSaf9xXtOOeno8wZXIhgia+CZury481LsDaV++lSvcU2R9Ch2bPh3PYFyoHW+w9LqAeYRISVQjUIew14g==} 1344 | peerDependencies: 1345 | vite: ^3.0.0 || ^4.0.0 1346 | peerDependenciesMeta: 1347 | vite: 1348 | optional: true 1349 | dependencies: 1350 | vite: 4.3.9 1351 | dev: true 1352 | 1353 | /which@2.0.2: 1354 | resolution: {integrity: sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==} 1355 | engines: {node: '>= 8'} 1356 | hasBin: true 1357 | dependencies: 1358 | isexe: 2.0.0 1359 | dev: true 1360 | 1361 | /word-wrap@1.2.3: 1362 | resolution: {integrity: sha512-Hz/mrNwitNRh/HUAtM/VT/5VH+ygD6DV7mYKZAtHOrbs8U7lvPS6xf7EJKMF0uW1KJCl0H701g3ZGus+muE5vQ==} 1363 | engines: {node: '>=0.10.0'} 1364 | dev: true 1365 | 1366 | /wrappy@1.0.2: 1367 | resolution: {integrity: sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==} 1368 | dev: true 1369 | 1370 | /yaml@1.10.2: 1371 | resolution: {integrity: sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg==} 1372 | engines: {node: '>= 6'} 1373 | dev: true 1374 | 1375 | /yocto-queue@0.1.0: 1376 | resolution: {integrity: sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==} 1377 | engines: {node: '>=10'} 1378 | dev: true 1379 | -------------------------------------------------------------------------------- /src/app.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | %sveltekit.head% 8 | 9 | 10 |
%sveltekit.body%
11 | 12 | 13 | -------------------------------------------------------------------------------- /src/lib/stripe.js: -------------------------------------------------------------------------------- 1 | import Stripe from 'stripe' 2 | import { env } from '$env/dynamic/private' 3 | 4 | export const stripe = Stripe(env.SECRET_STRIPE_KEY, { 5 | apiVersion: '2022-11-15' 6 | }) 7 | -------------------------------------------------------------------------------- /src/routes/+page.svelte: -------------------------------------------------------------------------------- 1 |

Welcome to SvelteKit

2 | 3 | Sign up 4 | -------------------------------------------------------------------------------- /src/routes/checkout/+page.server.js: -------------------------------------------------------------------------------- 1 | import { stripe } from '$lib/stripe' 2 | import { redirect } from '@sveltejs/kit' 3 | 4 | export const actions = { 5 | // default form action 6 | default: async ({ request, cookies }) => { 7 | // get the form 8 | const form = await request.formData() 9 | 10 | /* Create the customer 11 | * 12 | * https://stripe.com/docs/api/customers/create 13 | */ 14 | const customer = await stripe.customers.create({ 15 | email: form.get('email'), 16 | name: form.get('name') 17 | }) 18 | 19 | // set the cookie 20 | cookies.set('customerId', customer.id) 21 | 22 | // redirect to collect payment 23 | throw redirect(303, '/checkout/payment') 24 | } 25 | } 26 | -------------------------------------------------------------------------------- /src/routes/checkout/+page.svelte: -------------------------------------------------------------------------------- 1 |

Checkout

2 | 3 | 4 |
5 | 6 | 7 | 8 | 9 |
10 | -------------------------------------------------------------------------------- /src/routes/checkout/complete/+page.server.js: -------------------------------------------------------------------------------- 1 | import { stripe } from '$lib/stripe' 2 | import { redirect } from '@sveltejs/kit' 3 | 4 | export async function load({ url }) { 5 | // paymentIntent's id is passed in the URL 6 | const id = url.searchParams.get('payment_intent') 7 | 8 | // ask Stripe for latest info about this paymentIntent 9 | const paymentIntent = await stripe.paymentIntents.retrieve(id) 10 | 11 | /* Inspect the PaymentIntent `status` to indicate the status of the payment 12 | * to your customer. 13 | * 14 | * Some payment methods will [immediately succeed or fail][0] upon 15 | * confirmation, while others will first enter a `processing` state. 16 | * 17 | * [0] https://stripe.com/docs/payments/payment-methods#payment-notification 18 | */ 19 | let message 20 | 21 | switch (paymentIntent.status) { 22 | case 'succeeded': 23 | message = 'Success! Payment received.' 24 | 25 | // TODO: provision account here 26 | 27 | break 28 | 29 | case 'processing': 30 | message = "Payment processing. We'll update you when payment is received." 31 | break 32 | 33 | case 'requires_payment_method': 34 | // Redirect your user back to your payment page to attempt collecting 35 | // payment again 36 | throw redirect(303, '/checkout/payment') 37 | 38 | default: 39 | message = 'Something went wrong.' 40 | break 41 | } 42 | 43 | return { 44 | message 45 | } 46 | } 47 | -------------------------------------------------------------------------------- /src/routes/checkout/complete/+page.svelte: -------------------------------------------------------------------------------- 1 | 4 | 5 |

Checkout complete

6 | 7 |

{data.message}

8 | -------------------------------------------------------------------------------- /src/routes/checkout/payment/+page.server.js: -------------------------------------------------------------------------------- 1 | import { stripe } from '$lib/stripe' 2 | import { env } from '$env/dynamic/private' 3 | 4 | export async function load({ cookies }) { 5 | // pull customerId from cookie 6 | const customerId = cookies.get('customerId') 7 | // pull priceId from `.env` (probably better to use a database or config file for this) 8 | const priceId = env.STRIPE_PRICE_ID 9 | 10 | /* Create the subscription 11 | * 12 | * `status` will be `incomplete` until paid 13 | * 14 | * https://stripe.com/docs/api/subscriptions/create 15 | */ 16 | const subscription = await stripe.subscriptions.create({ 17 | customer: customerId, 18 | items: [ 19 | { 20 | price: priceId 21 | } 22 | ], 23 | payment_behavior: 'default_incomplete', 24 | payment_settings: { save_default_payment_method: 'on_subscription' }, 25 | expand: ['latest_invoice.payment_intent'] 26 | }) 27 | 28 | return { 29 | clientSecret: subscription.latest_invoice.payment_intent.client_secret, 30 | returnUrl: new URL('/checkout/complete', env.DOMAIN).toString() 31 | } 32 | } 33 | -------------------------------------------------------------------------------- /src/routes/checkout/payment/+page.svelte: -------------------------------------------------------------------------------- 1 | 35 | 36 |

Payment

37 | 38 | {#if stripe} 39 |
40 | 41 | 42 | 43 | 44 | 45 |
46 | {:else} 47 | Loading Stripe... 48 | {/if} 49 | -------------------------------------------------------------------------------- /src/routes/stripe/webhooks/+server.js: -------------------------------------------------------------------------------- 1 | import { stripe } from '$lib/stripe' 2 | import { error, json } from '@sveltejs/kit' 3 | import { env } from '$env/dynamic/private' 4 | 5 | // endpoint to handle incoming webhooks 6 | export async function POST({ request }) { 7 | // extract body 8 | const body = await request.text() 9 | 10 | // get the signature from the header 11 | const signature = request.headers.get('stripe-signature') 12 | 13 | // var to hold event data 14 | let event 15 | 16 | // verify it 17 | try { 18 | event = stripe.webhooks.constructEvent(body, signature, env.SECRET_STRIPE_WEBHOOK_KEY) 19 | } catch (err) { 20 | // signature is invalid! 21 | console.warn('⚠️ Webhook signature verification failed.', err.message) 22 | 23 | // return, because it's a bad request 24 | throw error(400, 'Invalid request') 25 | } 26 | 27 | /* Signature has been verified, so we can process events 28 | * 29 | * Review important events for Billing webhooks: 30 | * https://stripe.com/docs/billing/webhooks 31 | */ 32 | switch (event.type) { 33 | case 'customer.subscription.created': 34 | // Subscription was created 35 | break 36 | case 'customer.subscription.updated': 37 | // Subscription has been changed 38 | break 39 | case 'invoice.paid': 40 | // Used to provision services after the trial has ended. 41 | // The status of the invoice will show up as paid. Store the status in your 42 | // database to reference when a user accesses your service to avoid hitting rate limits. 43 | break 44 | case 'invoice.payment_failed': 45 | // If the payment fails or the customer does not have a valid payment method, 46 | // an invoice.payment_failed event is sent, the subscription becomes past_due. 47 | // Use this webhook to notify your user that their payment has 48 | // failed and to retrieve new card details. 49 | break 50 | case 'customer.subscription.deleted': 51 | if (event.request != null) { 52 | // handle a subscription canceled by your request 53 | // from above. 54 | } else { 55 | // handle subscription canceled automatically based 56 | // upon your subscription settings. 57 | } 58 | break 59 | default: 60 | // Unexpected event type 61 | } 62 | 63 | // return a 200 with an empty JSON response 64 | return json() 65 | } 66 | -------------------------------------------------------------------------------- /static/favicon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/joshnuss/sveltekit-stripe-subscriptions/121ee13b55d54a830393ffc4594cb77617fddaae/static/favicon.png -------------------------------------------------------------------------------- /svelte.config.js: -------------------------------------------------------------------------------- 1 | import adapter from '@sveltejs/adapter-auto' 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 | 4 | export default defineConfig({ 5 | plugins: [sveltekit()] 6 | }) 7 | --------------------------------------------------------------------------------