├── .eslintignore ├── .eslintrc.cjs ├── .github └── workflows │ └── production.yml ├── .gitignore ├── .npmrc ├── .prettierignore ├── .prettierrc ├── DatabaseDefinitions.ts ├── README.md ├── package.json ├── playwright.config.ts ├── pnpm-lock.yaml ├── postcss.config.cjs ├── src ├── app.d.ts ├── app.html ├── app.postcss ├── hooks.client.ts ├── hooks.server.ts ├── lib │ ├── components │ │ ├── Pricing.svelte │ │ ├── PricingCard.svelte │ │ ├── Spinner.svelte │ │ ├── common │ │ │ └── NavBar.svelte │ │ └── private │ │ │ └── QuickLinks.svelte │ ├── db.ts │ ├── stores.ts │ └── utils │ │ ├── groupBy.js │ │ ├── loader.js │ │ └── siteConfig.js └── routes │ ├── (app) │ ├── +layout.svelte │ ├── +layout.ts │ ├── dashboard │ │ ├── +page.svelte │ │ ├── settings │ │ │ ├── +page.server.ts │ │ │ ├── +page.svelte │ │ │ └── +page.ts │ │ └── subscriptions │ │ │ └── +page.server.ts │ ├── logout │ │ └── +page.server.ts │ └── payment │ │ └── stripe │ │ ├── +page.server.ts │ │ ├── cancelled │ │ └── +page.svelte │ │ └── success │ │ └── +page.svelte │ ├── (public) │ ├── +page.svelte │ ├── auth │ │ ├── +page.server.ts │ │ └── +page.svelte │ ├── pricing │ │ ├── +page.server.ts │ │ └── +page.svelte │ ├── privacy │ │ └── +page.svelte │ └── terms │ │ └── +page.svelte │ ├── +layout.server.ts │ └── +layout.svelte ├── static └── favicon.png ├── supabase ├── .env.example ├── .gitignore ├── config.toml ├── functions │ ├── create-stripe-customer │ │ └── index.ts │ └── stripe-sync │ │ └── index.ts └── migrations │ ├── 20220828143845_user_data.sql │ ├── 20220828193134_stripe_tables.sql │ └── 20220831120412_profiles.sql ├── svelte.config.js ├── tailwind.config.cjs ├── tests └── test.ts ├── tsconfig.json └── vite.config.ts /.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 | parser: '@typescript-eslint/parser', 4 | extends: ['eslint:recommended', 'plugin:@typescript-eslint/recommended', 'prettier'], 5 | plugins: ['svelte3', '@typescript-eslint'], 6 | ignorePatterns: ['*.cjs'], 7 | overrides: [{ files: ['*.svelte'], processor: 'svelte3/svelte3' }], 8 | settings: { 9 | 'svelte3/typescript': () => require('typescript') 10 | }, 11 | parserOptions: { 12 | sourceType: 'module', 13 | ecmaVersion: 2020 14 | }, 15 | env: { 16 | browser: true, 17 | es2017: true, 18 | node: true 19 | } 20 | }; 21 | -------------------------------------------------------------------------------- /.github/workflows/production.yml: -------------------------------------------------------------------------------- 1 | name: Release 2 | 3 | on: 4 | push: 5 | branches: 6 | - main 7 | workflow_dispatch: 8 | 9 | jobs: 10 | release: 11 | runs-on: ubuntu-latest 12 | 13 | env: 14 | SUPABASE_ACCESS_TOKEN: ${{ secrets.SUPABASE_ACCESS_TOKEN }} 15 | SUPABASE_DB_PASSWORD: ${{ secrets.PRODUCTION_DB_PASSWORD }} 16 | PROJECT_ID: jgcajpecsmkatlbzsstn 17 | 18 | steps: 19 | - uses: actions/checkout@v3 20 | 21 | - uses: supabase/setup-cli@v1 22 | with: 23 | version: 1.0.0 24 | 25 | - run: supabase link --project-ref $PROJECT_ID 26 | - run: supabase db push -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | .DS_Store 2 | node_modules 3 | /build 4 | /.svelte-kit 5 | /package 6 | .env 7 | .env.* 8 | !.env.example 9 | -------------------------------------------------------------------------------- /.npmrc: -------------------------------------------------------------------------------- 1 | engine-strict=true 2 | -------------------------------------------------------------------------------- /.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": true, 3 | "singleQuote": true, 4 | "trailingComma": "none", 5 | "printWidth": 100, 6 | "plugins": ["prettier-plugin-svelte"], 7 | "pluginSearchDirs": ["."], 8 | "overrides": [{ "files": "*.svelte", "options": { "parser": "svelte" } }] 9 | } 10 | -------------------------------------------------------------------------------- /DatabaseDefinitions.ts: -------------------------------------------------------------------------------- 1 | export type Json = 2 | | string 3 | | number 4 | | boolean 5 | | null 6 | | { [key: string]: Json } 7 | | Json[]; 8 | 9 | export interface Database { 10 | public: { 11 | Tables: { 12 | user_data: { 13 | Row: { 14 | id: string; 15 | email: string; 16 | stripe_customer_id: string | null; 17 | created_at: string | null; 18 | }; 19 | Insert: { 20 | id: string; 21 | email: string; 22 | stripe_customer_id?: string | null; 23 | created_at?: string | null; 24 | }; 25 | Update: { 26 | id?: string; 27 | email?: string; 28 | stripe_customer_id?: string | null; 29 | created_at?: string | null; 30 | }; 31 | }; 32 | profiles: { 33 | Row: { 34 | id: string; 35 | full_name: string | null; 36 | username: string | null; 37 | updated_at: string; 38 | }; 39 | Insert: { 40 | id: string; 41 | full_name?: string | null; 42 | username?: string | null; 43 | updated_at?: string; 44 | }; 45 | Update: { 46 | id?: string; 47 | full_name?: string | null; 48 | username?: string | null; 49 | updated_at?: string; 50 | }; 51 | }; 52 | }; 53 | Functions: {}; 54 | }; 55 | } 56 | 57 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | ## Features 2 | 3 | - [x] Landing Page 4 | - [x] Auto create Pricing Page using stripe Products 5 | - [x] Handle authentication 6 | - [x] Auto create Stripe customer and sync with database on user sign up 7 | - [x] Auto Sync database with stripe data 8 | - [x] Profile page for users to update their info 9 | - [x] Allow users to manage subscriptions and billing info via stripe customer portal 10 | 11 | ## Steps to Setup 12 | 13 | 1) Go to supabase dashboard > Database > Wehbooks and enable Webhhooks. 14 | 2) Open `supabase/migrations/20220828143845_user_data.sql` and replace the default supabase url abnd anon key with your project info. 15 | 16 | 3) Add the relevant data in `.env` and `supabase/.env` 17 | 4) Go to https://app.supabase.com/account/tokens and create a new acces token. 18 | 5) Login to supabase cli by running `supabase login` and paste the token increated in previous step. 19 | 20 | 6) Connect supabnase project by running `supabase link --project-ref YOUR_PROJECT_REF` and paste the database password. 21 | 7) Run `supabase db push` to push the migrations. 22 | 8) Go to Supabase > Settings > API and add `stripe` scheme in Exposed schema and Extra search path 23 | 24 | 9) Push the required env variables in supabse dashboard. 25 | 26 | ```bash 27 | supabase secrets set --env-file ./supabase/.env 28 | ``` 29 | 30 | 10) Deploy the supabase edge functions: 31 | 32 | ```bash 33 | supabase functions deploy create-stripe-customer 34 | supabase functions deploy stripe-sync --no-verify-jwt 35 | ``` -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "svelte-saas-kit", 3 | "version": "0.0.1", 4 | "private": true, 5 | "scripts": { 6 | "dev": "vite dev", 7 | "build": "vite build", 8 | "preview": "vite preview", 9 | "test": "playwright test", 10 | "check": "svelte-kit sync && svelte-check --tsconfig ./tsconfig.json", 11 | "check:watch": "svelte-kit sync && svelte-check --tsconfig ./tsconfig.json --watch", 12 | "lint": "prettier --plugin-search-dir . --check . && eslint .", 13 | "format": "prettier --plugin-search-dir . --write ." 14 | }, 15 | "devDependencies": { 16 | "@brainandbones/skeleton": "^0.67.5", 17 | "@playwright/test": "^1.25.0", 18 | "@supabase/auth-helpers-sveltekit": "^0.8.3", 19 | "@supabase/supabase-js": "^2.0.4", 20 | "@sveltejs/adapter-auto": "next", 21 | "@sveltejs/kit": "next", 22 | "@tailwindcss/forms": "^0.5.3", 23 | "@typescript-eslint/eslint-plugin": "^5.27.0", 24 | "@typescript-eslint/parser": "^5.27.0", 25 | "autoprefixer": "^10.4.7", 26 | "eslint": "^8.16.0", 27 | "eslint-config-prettier": "^8.3.0", 28 | "eslint-plugin-svelte3": "^4.0.0", 29 | "postcss": "^8.4.14", 30 | "postcss-load-config": "^4.0.1", 31 | "prettier": "^2.6.2", 32 | "prettier-plugin-svelte": "^2.7.0", 33 | "stripe": "^10.15.0", 34 | "svelte": "^3.44.0", 35 | "svelte-check": "^2.7.1", 36 | "svelte-loading-spinners": "^0.3.4", 37 | "svelte-preprocess": "^4.10.7", 38 | "tailwindcss": "^3.1.5", 39 | "tslib": "^2.3.1", 40 | "typescript": "^4.7.4", 41 | "vite": "^3.1.0" 42 | }, 43 | "type": "module" 44 | } 45 | -------------------------------------------------------------------------------- /playwright.config.ts: -------------------------------------------------------------------------------- 1 | import type { PlaywrightTestConfig } from '@playwright/test'; 2 | 3 | const config: PlaywrightTestConfig = { 4 | webServer: { 5 | command: 'npm run build && npm run preview', 6 | port: 4173 7 | } 8 | }; 9 | 10 | export default config; 11 | -------------------------------------------------------------------------------- /pnpm-lock.yaml: -------------------------------------------------------------------------------- 1 | lockfileVersion: 5.4 2 | 3 | specifiers: 4 | '@brainandbones/skeleton': ^0.67.5 5 | '@playwright/test': ^1.25.0 6 | '@supabase/auth-helpers-sveltekit': ^0.8.3 7 | '@supabase/supabase-js': ^2.0.4 8 | '@sveltejs/adapter-auto': next 9 | '@sveltejs/kit': next 10 | '@tailwindcss/forms': ^0.5.3 11 | '@typescript-eslint/eslint-plugin': ^5.27.0 12 | '@typescript-eslint/parser': ^5.27.0 13 | autoprefixer: ^10.4.7 14 | eslint: ^8.16.0 15 | eslint-config-prettier: ^8.3.0 16 | eslint-plugin-svelte3: ^4.0.0 17 | postcss: ^8.4.14 18 | postcss-load-config: ^4.0.1 19 | prettier: ^2.6.2 20 | prettier-plugin-svelte: ^2.7.0 21 | stripe: ^10.15.0 22 | svelte: ^3.44.0 23 | svelte-check: ^2.7.1 24 | svelte-loading-spinners: ^0.3.4 25 | svelte-preprocess: ^4.10.7 26 | tailwindcss: ^3.1.5 27 | tslib: ^2.3.1 28 | typescript: ^4.7.4 29 | vite: ^3.1.0 30 | 31 | devDependencies: 32 | '@brainandbones/skeleton': 0.67.5 33 | '@playwright/test': 1.27.1 34 | '@supabase/auth-helpers-sveltekit': 0.8.3_3hmmi5peetriqs3rb4qpz34hwi 35 | '@supabase/supabase-js': 2.0.4 36 | '@sveltejs/adapter-auto': 1.0.0-next.86 37 | '@sveltejs/kit': 1.0.0-next.531_svelte@3.52.0+vite@3.2.1 38 | '@tailwindcss/forms': 0.5.3_tailwindcss@3.2.1 39 | '@typescript-eslint/eslint-plugin': 5.41.0_huremdigmcnkianavgfk3x6iou 40 | '@typescript-eslint/parser': 5.41.0_wyqvi574yv7oiwfeinomdzmc3m 41 | autoprefixer: 10.4.13_postcss@8.4.18 42 | eslint: 8.26.0 43 | eslint-config-prettier: 8.5.0_eslint@8.26.0 44 | eslint-plugin-svelte3: 4.0.0_l6ppk7eerpslmlsqymzic46t24 45 | postcss: 8.4.18 46 | postcss-load-config: 4.0.1_postcss@8.4.18 47 | prettier: 2.7.1 48 | prettier-plugin-svelte: 2.8.0_lrllcp5xtrkmmdzifit4hd52ze 49 | stripe: 10.15.0 50 | svelte: 3.52.0 51 | svelte-check: 2.9.2_xyvwwpusdp7eiuesisaivc7wmm 52 | svelte-loading-spinners: 0.3.4 53 | svelte-preprocess: 4.10.7_4n3z2octtzg5pdokl7pjruqnki 54 | tailwindcss: 3.2.1_postcss@8.4.18 55 | tslib: 2.4.0 56 | typescript: 4.8.4 57 | vite: 3.2.1 58 | 59 | packages: 60 | 61 | /@brainandbones/skeleton/0.67.5: 62 | resolution: {integrity: sha512-p1XQWa13ukdt7rfdc6oxgUBtdIf5IoqJlWk24eBq3T5iN8LFGCfVP1d3zKpJTmiKkS/0ocxC/Fs4CQKKeSHnNA==} 63 | dev: true 64 | 65 | /@cloudflare/workers-types/3.18.0: 66 | resolution: {integrity: sha512-ehKOJVLMeR+tZkYhWEaLYQxl0TaIZu/kE86HF3/RidR8Xv5LuQxpbh+XXAoKVqsaphWLhIgBhgnlN5HGdheXSQ==} 67 | dev: true 68 | 69 | /@esbuild/android-arm/0.15.12: 70 | resolution: {integrity: sha512-IC7TqIqiyE0MmvAhWkl/8AEzpOtbhRNDo7aph47We1NbE5w2bt/Q+giAhe0YYeVpYnIhGMcuZY92qDK6dQauvA==} 71 | engines: {node: '>=12'} 72 | cpu: [arm] 73 | os: [android] 74 | requiresBuild: true 75 | dev: true 76 | optional: true 77 | 78 | /@esbuild/linux-loong64/0.15.12: 79 | resolution: {integrity: sha512-tZEowDjvU7O7I04GYvWQOS4yyP9E/7YlsB0jjw1Ycukgr2ycEzKyIk5tms5WnLBymaewc6VmRKnn5IJWgK4eFw==} 80 | engines: {node: '>=12'} 81 | cpu: [loong64] 82 | os: [linux] 83 | requiresBuild: true 84 | dev: true 85 | optional: true 86 | 87 | /@eslint/eslintrc/1.3.3: 88 | resolution: {integrity: sha512-uj3pT6Mg+3t39fvLrj8iuCIJ38zKO9FpGtJ4BBJebJhEwjoT+KLVNCcHT5QC9NGRIEi7fZ0ZR8YRb884auB4Lg==} 89 | engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} 90 | dependencies: 91 | ajv: 6.12.6 92 | debug: 4.3.4 93 | espree: 9.4.0 94 | globals: 13.17.0 95 | ignore: 5.2.0 96 | import-fresh: 3.3.0 97 | js-yaml: 4.1.0 98 | minimatch: 3.1.2 99 | strip-json-comments: 3.1.1 100 | transitivePeerDependencies: 101 | - supports-color 102 | dev: true 103 | 104 | /@humanwhocodes/config-array/0.11.7: 105 | resolution: {integrity: sha512-kBbPWzN8oVMLb0hOUYXhmxggL/1cJE6ydvjDIGi9EnAGUyA7cLVKQg+d/Dsm+KZwx2czGHrCmMVLiyg8s5JPKw==} 106 | engines: {node: '>=10.10.0'} 107 | dependencies: 108 | '@humanwhocodes/object-schema': 1.2.1 109 | debug: 4.3.4 110 | minimatch: 3.1.2 111 | transitivePeerDependencies: 112 | - supports-color 113 | dev: true 114 | 115 | /@humanwhocodes/module-importer/1.0.1: 116 | resolution: {integrity: sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==} 117 | engines: {node: '>=12.22'} 118 | dev: true 119 | 120 | /@humanwhocodes/object-schema/1.2.1: 121 | resolution: {integrity: sha512-ZnQMnLV4e7hDlUvw8H+U8ASL02SS2Gn6+9Ac3wGGLIe7+je2AeAOxPY+izIPJDfFDb7eDjev0Us8MO1iFRN8hA==} 122 | dev: true 123 | 124 | /@iarna/toml/2.2.5: 125 | resolution: {integrity: sha512-trnsAYxU3xnS1gPHPyU961coFyLkh4gAD/0zQ5mymY4yOZ+CYvsPqUbOFSw0aDM4y0tV7tiFxL/1XfXPNC6IPg==} 126 | dev: true 127 | 128 | /@jridgewell/resolve-uri/3.1.0: 129 | resolution: {integrity: sha512-F2msla3tad+Mfht5cJq7LSXcdudKTWCVYUgw6pLFOOHSTtZlj6SWNYAp+AhuqLmWdBO2X5hPrLcu8cVP8fy28w==} 130 | engines: {node: '>=6.0.0'} 131 | dev: true 132 | 133 | /@jridgewell/sourcemap-codec/1.4.14: 134 | resolution: {integrity: sha512-XPSJHWmi394fuUuzDnGz1wiKqWfo1yXecHQMRf2l6hztTO+nPru658AyDngaBe7isIxEkRsPR3FZh+s7iVa4Uw==} 135 | dev: true 136 | 137 | /@jridgewell/trace-mapping/0.3.17: 138 | resolution: {integrity: sha512-MCNzAp77qzKca9+W/+I0+sEpaUnZoeasnghNeVc41VZCEKaCH73Vq3BZZ/SzWIgrqE4H4ceI+p+b6C0mHf9T4g==} 139 | dependencies: 140 | '@jridgewell/resolve-uri': 3.1.0 141 | '@jridgewell/sourcemap-codec': 1.4.14 142 | dev: true 143 | 144 | /@mapbox/node-pre-gyp/1.0.10: 145 | resolution: {integrity: sha512-4ySo4CjzStuprMwk35H5pPbkymjv1SF3jGLj6rAHp/xT/RF7TL7bd9CTm1xDY49K2qF7jmR/g7k+SkLETP6opA==} 146 | hasBin: true 147 | dependencies: 148 | detect-libc: 2.0.1 149 | https-proxy-agent: 5.0.1 150 | make-dir: 3.1.0 151 | node-fetch: 2.6.7 152 | nopt: 5.0.0 153 | npmlog: 5.0.1 154 | rimraf: 3.0.2 155 | semver: 7.3.8 156 | tar: 6.1.12 157 | transitivePeerDependencies: 158 | - encoding 159 | - supports-color 160 | dev: true 161 | 162 | /@nodelib/fs.scandir/2.1.5: 163 | resolution: {integrity: sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==} 164 | engines: {node: '>= 8'} 165 | dependencies: 166 | '@nodelib/fs.stat': 2.0.5 167 | run-parallel: 1.2.0 168 | dev: true 169 | 170 | /@nodelib/fs.stat/2.0.5: 171 | resolution: {integrity: sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==} 172 | engines: {node: '>= 8'} 173 | dev: true 174 | 175 | /@nodelib/fs.walk/1.2.8: 176 | resolution: {integrity: sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==} 177 | engines: {node: '>= 8'} 178 | dependencies: 179 | '@nodelib/fs.scandir': 2.1.5 180 | fastq: 1.13.0 181 | dev: true 182 | 183 | /@playwright/test/1.27.1: 184 | resolution: {integrity: sha512-mrL2q0an/7tVqniQQF6RBL2saskjljXzqNcCOVMUjRIgE6Y38nCNaP+Dc2FBW06bcpD3tqIws/HT9qiMHbNU0A==} 185 | engines: {node: '>=14'} 186 | hasBin: true 187 | dependencies: 188 | '@types/node': 18.11.7 189 | playwright-core: 1.27.1 190 | dev: true 191 | 192 | /@polka/url/1.0.0-next.21: 193 | resolution: {integrity: sha512-a5Sab1C4/icpTZVzZc5Ghpz88yQtGOyNqYXcZgOssB2uuAr+wF/MvN6bgtW32q7HHrvBki+BsZ0OuNv6EV3K9g==} 194 | dev: true 195 | 196 | /@supabase/auth-helpers-shared/0.2.1_3hmmi5peetriqs3rb4qpz34hwi: 197 | resolution: {integrity: sha512-L54gCCD8xCV6mHta0vE7CLxJ7pisSlsd9KIWB1ENyfZ0baeU9H39AqNVyYcAoHBPrUaZYx877J4WYYoqwuyi+w==} 198 | peerDependencies: 199 | '@supabase/supabase-js': ^2.0.4 200 | dependencies: 201 | '@supabase/supabase-js': 2.0.4 202 | dev: true 203 | 204 | /@supabase/auth-helpers-sveltekit/0.8.3_3hmmi5peetriqs3rb4qpz34hwi: 205 | resolution: {integrity: sha512-31Mu4hoRPynuPwJtf08ldb6N886vzNKoG5nXkc/X4oiKduy6px+MbsWTrILNA3/oacrRF1FPc4KWuGMeulTNWg==} 206 | peerDependencies: 207 | '@supabase/supabase-js': ^2.0.4 208 | dependencies: 209 | '@supabase/auth-helpers-shared': 0.2.1_3hmmi5peetriqs3rb4qpz34hwi 210 | '@supabase/supabase-js': 2.0.4 211 | dev: true 212 | 213 | /@supabase/functions-js/2.0.0: 214 | resolution: {integrity: sha512-ozb7bds2yvf5k7NM2ZzUkxvsx4S4i2eRKFSJetdTADV91T65g4gCzEs9L3LUXSrghcGIkUaon03VPzOrFredqg==} 215 | dependencies: 216 | cross-fetch: 3.1.5 217 | transitivePeerDependencies: 218 | - encoding 219 | dev: true 220 | 221 | /@supabase/gotrue-js/2.2.1: 222 | resolution: {integrity: sha512-CgQaYAJmGbOLPSqan4mjRgGikzsrlkKdPq0UNG7WZQv5HlHJlAYW8HeyNw/SKfIbxQBm8s2dBCeUyX+NdfB2Rw==} 223 | dependencies: 224 | cross-fetch: 3.1.5 225 | transitivePeerDependencies: 226 | - encoding 227 | dev: true 228 | 229 | /@supabase/postgrest-js/1.1.0: 230 | resolution: {integrity: sha512-qkY8TqIu5sJuae8gjeDPjEqPrefzcTraW9PNSVJQHq4TEv98ZmwaXGwBGz0bVL63bqrGA5hqREbQHkANUTXrvA==} 231 | dependencies: 232 | cross-fetch: 3.1.5 233 | transitivePeerDependencies: 234 | - encoding 235 | dev: true 236 | 237 | /@supabase/realtime-js/2.1.0: 238 | resolution: {integrity: sha512-iplLCofTeYjnx9FIOsIwHLhMp0+7UVyiA4/sCeq40VdOgN9eTIhjEno9Tgh4dJARi4aaXoKfRX1DTxgZaOpPAw==} 239 | dependencies: 240 | '@types/phoenix': 1.5.4 241 | websocket: 1.0.34 242 | transitivePeerDependencies: 243 | - supports-color 244 | dev: true 245 | 246 | /@supabase/storage-js/2.0.0: 247 | resolution: {integrity: sha512-7kXThdRt/xqnOOvZZxBqNkeX1CFNUWc0hYBJtNN/Uvt8ok9hD14foYmroWrHn046wEYFqUrB9U35JYsfTrvltA==} 248 | dependencies: 249 | cross-fetch: 3.1.5 250 | transitivePeerDependencies: 251 | - encoding 252 | dev: true 253 | 254 | /@supabase/supabase-js/2.0.4: 255 | resolution: {integrity: sha512-Z5uLyJm9bz5LMFnt5d1I6ccxVTdvKbJa0RsYGgKlA+QiyGvBxRRvVh8pqlYP1571DlycGG7bWngNwdv7/pehrg==} 256 | dependencies: 257 | '@supabase/functions-js': 2.0.0 258 | '@supabase/gotrue-js': 2.2.1 259 | '@supabase/postgrest-js': 1.1.0 260 | '@supabase/realtime-js': 2.1.0 261 | '@supabase/storage-js': 2.0.0 262 | cross-fetch: 3.1.5 263 | transitivePeerDependencies: 264 | - encoding 265 | - supports-color 266 | dev: true 267 | 268 | /@sveltejs/adapter-auto/1.0.0-next.86: 269 | resolution: {integrity: sha512-IKW1SUiXPPZ+qumQu5v48VH4aGmYiSLS83qbDlwfNmoRQejgU54f1M5s+isVmnr9kIOwbMQ0CfYhmZWJ7sEv6Q==} 270 | dependencies: 271 | '@sveltejs/adapter-cloudflare': 1.0.0-next.40 272 | '@sveltejs/adapter-netlify': 1.0.0-next.83 273 | '@sveltejs/adapter-vercel': 1.0.0-next.81 274 | transitivePeerDependencies: 275 | - encoding 276 | - supports-color 277 | dev: true 278 | 279 | /@sveltejs/adapter-cloudflare/1.0.0-next.40: 280 | resolution: {integrity: sha512-KT4TK40T9pl24nPFWHgw1QwAv9AjOkUymjFpS07Ro2zeBHJVgga1Jl0OA1bsiyEiLNRivNRwaWHFySlZ2JJpxQ==} 281 | dependencies: 282 | '@cloudflare/workers-types': 3.18.0 283 | esbuild: 0.15.12 284 | worktop: 0.8.0-next.14 285 | dev: true 286 | 287 | /@sveltejs/adapter-netlify/1.0.0-next.83: 288 | resolution: {integrity: sha512-4hPKs7T1v81KatpMm8AgPEe4LSvoRNWiooxbSlLL8su/nnVe2FHPlpGgRcdSsE9VUmlkyd+4YIbVFG0ZcYO4LQ==} 289 | dependencies: 290 | '@iarna/toml': 2.2.5 291 | esbuild: 0.15.12 292 | set-cookie-parser: 2.5.1 293 | dev: true 294 | 295 | /@sveltejs/adapter-vercel/1.0.0-next.81: 296 | resolution: {integrity: sha512-cuNolQSqabSs97J2hn9bnRDOscihIO+VEYltsc+POLU/ecv7pbUm1qdRakeG3+ehK1mfZ9dub6vEVuLKhm+Qng==} 297 | dependencies: 298 | '@vercel/nft': 0.22.1 299 | esbuild: 0.15.12 300 | transitivePeerDependencies: 301 | - encoding 302 | - supports-color 303 | dev: true 304 | 305 | /@sveltejs/kit/1.0.0-next.531_svelte@3.52.0+vite@3.2.1: 306 | resolution: {integrity: sha512-8uBJF5BweIFoyw+Kqv0jsDSfndNw2mTF222qi8rDuptOy7gjoWXYFy2F0kd8orNeZUnjFrHE+g/qDNHq7zzEJg==} 307 | engines: {node: '>=16.14'} 308 | hasBin: true 309 | requiresBuild: true 310 | peerDependencies: 311 | svelte: ^3.44.0 312 | vite: ^3.1.0 313 | dependencies: 314 | '@sveltejs/vite-plugin-svelte': 1.1.0_svelte@3.52.0+vite@3.2.1 315 | '@types/cookie': 0.5.1 316 | cookie: 0.5.0 317 | devalue: 4.0.1 318 | kleur: 4.1.5 319 | magic-string: 0.26.7 320 | mime: 3.0.0 321 | sade: 1.8.1 322 | set-cookie-parser: 2.5.1 323 | sirv: 2.0.2 324 | svelte: 3.52.0 325 | tiny-glob: 0.2.9 326 | undici: 5.12.0 327 | vite: 3.2.1 328 | transitivePeerDependencies: 329 | - diff-match-patch 330 | - supports-color 331 | dev: true 332 | 333 | /@sveltejs/vite-plugin-svelte/1.1.0_svelte@3.52.0+vite@3.2.1: 334 | resolution: {integrity: sha512-cFRfEdztubtj1c/rYh7ArK7XCfFJn6wG6+J8/e9amFsKtEJILovoBrK0/mxt1AjPQg0vaX+fHPKvhx+q8mTPaQ==} 335 | engines: {node: ^14.18.0 || >= 16} 336 | peerDependencies: 337 | diff-match-patch: ^1.0.5 338 | svelte: ^3.44.0 339 | vite: ^3.0.0 340 | peerDependenciesMeta: 341 | diff-match-patch: 342 | optional: true 343 | dependencies: 344 | debug: 4.3.4 345 | deepmerge: 4.2.2 346 | kleur: 4.1.5 347 | magic-string: 0.26.7 348 | svelte: 3.52.0 349 | svelte-hmr: 0.15.0_svelte@3.52.0 350 | vite: 3.2.1 351 | transitivePeerDependencies: 352 | - supports-color 353 | dev: true 354 | 355 | /@tailwindcss/forms/0.5.3_tailwindcss@3.2.1: 356 | resolution: {integrity: sha512-y5mb86JUoiUgBjY/o6FJSFZSEttfb3Q5gllE4xoKjAAD+vBrnIhE4dViwUuow3va8mpH4s9jyUbUbrRGoRdc2Q==} 357 | peerDependencies: 358 | tailwindcss: '>=3.0.0 || >= 3.0.0-alpha.1' 359 | dependencies: 360 | mini-svg-data-uri: 1.4.4 361 | tailwindcss: 3.2.1_postcss@8.4.18 362 | dev: true 363 | 364 | /@types/cookie/0.5.1: 365 | resolution: {integrity: sha512-COUnqfB2+ckwXXSFInsFdOAWQzCCx+a5hq2ruyj+Vjund94RJQd4LG2u9hnvJrTgunKAaax7ancBYlDrNYxA0g==} 366 | dev: true 367 | 368 | /@types/json-schema/7.0.11: 369 | resolution: {integrity: sha512-wOuvG1SN4Us4rez+tylwwwCV1psiNVOkJeM3AUWUNWg/jDQY2+HE/444y5gc+jBmRqASOm2Oeh5c1axHobwRKQ==} 370 | dev: true 371 | 372 | /@types/node/18.11.7: 373 | resolution: {integrity: sha512-LhFTglglr63mNXUSRYD8A+ZAIu5sFqNJ4Y2fPuY7UlrySJH87rRRlhtVmMHplmfk5WkoJGmDjE9oiTfyX94CpQ==} 374 | dev: true 375 | 376 | /@types/phoenix/1.5.4: 377 | resolution: {integrity: sha512-L5eZmzw89eXBKkiqVBcJfU1QGx9y+wurRIEgt0cuLH0hwNtVUxtx+6cu0R2STwWj468sjXyBYPYDtGclUd1kjQ==} 378 | dev: true 379 | 380 | /@types/pug/2.0.6: 381 | resolution: {integrity: sha512-SnHmG9wN1UVmagJOnyo/qkk0Z7gejYxOYYmaAwr5u2yFYfsupN3sg10kyzN8Hep/2zbHxCnsumxOoRIRMBwKCg==} 382 | dev: true 383 | 384 | /@types/sass/1.43.1: 385 | resolution: {integrity: sha512-BPdoIt1lfJ6B7rw35ncdwBZrAssjcwzI5LByIrYs+tpXlj/CAkuVdRsgZDdP4lq5EjyWzwxZCqAoFyHKFwp32g==} 386 | dependencies: 387 | '@types/node': 18.11.7 388 | dev: true 389 | 390 | /@types/semver/7.3.13: 391 | resolution: {integrity: sha512-21cFJr9z3g5dW8B0CVI9g2O9beqaThGQ6ZFBqHfwhzLDKUxaqTIy3vnfah/UPkfOiF2pLq+tGz+W8RyCskuslw==} 392 | dev: true 393 | 394 | /@typescript-eslint/eslint-plugin/5.41.0_huremdigmcnkianavgfk3x6iou: 395 | resolution: {integrity: sha512-DXUS22Y57/LAFSg3x7Vi6RNAuLpTXwxB9S2nIA7msBb/Zt8p7XqMwdpdc1IU7CkOQUPgAqR5fWvxuKCbneKGmA==} 396 | engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} 397 | peerDependencies: 398 | '@typescript-eslint/parser': ^5.0.0 399 | eslint: ^6.0.0 || ^7.0.0 || ^8.0.0 400 | typescript: '*' 401 | peerDependenciesMeta: 402 | typescript: 403 | optional: true 404 | dependencies: 405 | '@typescript-eslint/parser': 5.41.0_wyqvi574yv7oiwfeinomdzmc3m 406 | '@typescript-eslint/scope-manager': 5.41.0 407 | '@typescript-eslint/type-utils': 5.41.0_wyqvi574yv7oiwfeinomdzmc3m 408 | '@typescript-eslint/utils': 5.41.0_wyqvi574yv7oiwfeinomdzmc3m 409 | debug: 4.3.4 410 | eslint: 8.26.0 411 | ignore: 5.2.0 412 | regexpp: 3.2.0 413 | semver: 7.3.8 414 | tsutils: 3.21.0_typescript@4.8.4 415 | typescript: 4.8.4 416 | transitivePeerDependencies: 417 | - supports-color 418 | dev: true 419 | 420 | /@typescript-eslint/parser/5.41.0_wyqvi574yv7oiwfeinomdzmc3m: 421 | resolution: {integrity: sha512-HQVfix4+RL5YRWZboMD1pUfFN8MpRH4laziWkkAzyO1fvNOY/uinZcvo3QiFJVS/siNHupV8E5+xSwQZrl6PZA==} 422 | engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} 423 | peerDependencies: 424 | eslint: ^6.0.0 || ^7.0.0 || ^8.0.0 425 | typescript: '*' 426 | peerDependenciesMeta: 427 | typescript: 428 | optional: true 429 | dependencies: 430 | '@typescript-eslint/scope-manager': 5.41.0 431 | '@typescript-eslint/types': 5.41.0 432 | '@typescript-eslint/typescript-estree': 5.41.0_typescript@4.8.4 433 | debug: 4.3.4 434 | eslint: 8.26.0 435 | typescript: 4.8.4 436 | transitivePeerDependencies: 437 | - supports-color 438 | dev: true 439 | 440 | /@typescript-eslint/scope-manager/5.41.0: 441 | resolution: {integrity: sha512-xOxPJCnuktUkY2xoEZBKXO5DBCugFzjrVndKdUnyQr3+9aDWZReKq9MhaoVnbL+maVwWJu/N0SEtrtEUNb62QQ==} 442 | engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} 443 | dependencies: 444 | '@typescript-eslint/types': 5.41.0 445 | '@typescript-eslint/visitor-keys': 5.41.0 446 | dev: true 447 | 448 | /@typescript-eslint/type-utils/5.41.0_wyqvi574yv7oiwfeinomdzmc3m: 449 | resolution: {integrity: sha512-L30HNvIG6A1Q0R58e4hu4h+fZqaO909UcnnPbwKiN6Rc3BUEx6ez2wgN7aC0cBfcAjZfwkzE+E2PQQ9nEuoqfA==} 450 | engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} 451 | peerDependencies: 452 | eslint: '*' 453 | typescript: '*' 454 | peerDependenciesMeta: 455 | typescript: 456 | optional: true 457 | dependencies: 458 | '@typescript-eslint/typescript-estree': 5.41.0_typescript@4.8.4 459 | '@typescript-eslint/utils': 5.41.0_wyqvi574yv7oiwfeinomdzmc3m 460 | debug: 4.3.4 461 | eslint: 8.26.0 462 | tsutils: 3.21.0_typescript@4.8.4 463 | typescript: 4.8.4 464 | transitivePeerDependencies: 465 | - supports-color 466 | dev: true 467 | 468 | /@typescript-eslint/types/5.41.0: 469 | resolution: {integrity: sha512-5BejraMXMC+2UjefDvrH0Fo/eLwZRV6859SXRg+FgbhA0R0l6lDqDGAQYhKbXhPN2ofk2kY5sgGyLNL907UXpA==} 470 | engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} 471 | dev: true 472 | 473 | /@typescript-eslint/typescript-estree/5.41.0_typescript@4.8.4: 474 | resolution: {integrity: sha512-SlzFYRwFSvswzDSQ/zPkIWcHv8O5y42YUskko9c4ki+fV6HATsTODUPbRbcGDFYP86gaJL5xohUEytvyNNcXWg==} 475 | engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} 476 | peerDependencies: 477 | typescript: '*' 478 | peerDependenciesMeta: 479 | typescript: 480 | optional: true 481 | dependencies: 482 | '@typescript-eslint/types': 5.41.0 483 | '@typescript-eslint/visitor-keys': 5.41.0 484 | debug: 4.3.4 485 | globby: 11.1.0 486 | is-glob: 4.0.3 487 | semver: 7.3.8 488 | tsutils: 3.21.0_typescript@4.8.4 489 | typescript: 4.8.4 490 | transitivePeerDependencies: 491 | - supports-color 492 | dev: true 493 | 494 | /@typescript-eslint/utils/5.41.0_wyqvi574yv7oiwfeinomdzmc3m: 495 | resolution: {integrity: sha512-QlvfwaN9jaMga9EBazQ+5DDx/4sAdqDkcs05AsQHMaopluVCUyu1bTRUVKzXbgjDlrRAQrYVoi/sXJ9fmG+KLQ==} 496 | engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} 497 | peerDependencies: 498 | eslint: ^6.0.0 || ^7.0.0 || ^8.0.0 499 | dependencies: 500 | '@types/json-schema': 7.0.11 501 | '@types/semver': 7.3.13 502 | '@typescript-eslint/scope-manager': 5.41.0 503 | '@typescript-eslint/types': 5.41.0 504 | '@typescript-eslint/typescript-estree': 5.41.0_typescript@4.8.4 505 | eslint: 8.26.0 506 | eslint-scope: 5.1.1 507 | eslint-utils: 3.0.0_eslint@8.26.0 508 | semver: 7.3.8 509 | transitivePeerDependencies: 510 | - supports-color 511 | - typescript 512 | dev: true 513 | 514 | /@typescript-eslint/visitor-keys/5.41.0: 515 | resolution: {integrity: sha512-vilqeHj267v8uzzakbm13HkPMl7cbYpKVjgFWZPIOHIJHZtinvypUhJ5xBXfWYg4eFKqztbMMpOgFpT9Gfx4fw==} 516 | engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} 517 | dependencies: 518 | '@typescript-eslint/types': 5.41.0 519 | eslint-visitor-keys: 3.3.0 520 | dev: true 521 | 522 | /@vercel/nft/0.22.1: 523 | resolution: {integrity: sha512-lYYZIoxRurqDOSoVIdBicGnpUIpfyaS5qVjdPq+EfI285WqtZK3NK/dyCkiyBul+X2U2OEhRyeMdXPCHGJbohw==} 524 | hasBin: true 525 | dependencies: 526 | '@mapbox/node-pre-gyp': 1.0.10 527 | acorn: 8.8.1 528 | async-sema: 3.1.1 529 | bindings: 1.5.0 530 | estree-walker: 2.0.2 531 | glob: 7.2.3 532 | graceful-fs: 4.2.10 533 | micromatch: 4.0.5 534 | node-gyp-build: 4.5.0 535 | resolve-from: 5.0.0 536 | rollup-pluginutils: 2.8.2 537 | transitivePeerDependencies: 538 | - encoding 539 | - supports-color 540 | dev: true 541 | 542 | /abbrev/1.1.1: 543 | resolution: {integrity: sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==} 544 | dev: true 545 | 546 | /acorn-jsx/5.3.2_acorn@8.8.1: 547 | resolution: {integrity: sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==} 548 | peerDependencies: 549 | acorn: ^6.0.0 || ^7.0.0 || ^8.0.0 550 | dependencies: 551 | acorn: 8.8.1 552 | dev: true 553 | 554 | /acorn-node/1.8.2: 555 | resolution: {integrity: sha512-8mt+fslDufLYntIoPAaIMUe/lrbrehIiwmR3t2k9LljIzoigEPF27eLk2hy8zSGzmR/ogr7zbRKINMo1u0yh5A==} 556 | dependencies: 557 | acorn: 7.4.1 558 | acorn-walk: 7.2.0 559 | xtend: 4.0.2 560 | dev: true 561 | 562 | /acorn-walk/7.2.0: 563 | resolution: {integrity: sha512-OPdCF6GsMIP+Az+aWfAAOEt2/+iVDKE7oy6lJ098aoe59oAmK76qV6Gw60SbZ8jHuG2wH058GF4pLFbYamYrVA==} 564 | engines: {node: '>=0.4.0'} 565 | dev: true 566 | 567 | /acorn/7.4.1: 568 | resolution: {integrity: sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A==} 569 | engines: {node: '>=0.4.0'} 570 | hasBin: true 571 | dev: true 572 | 573 | /acorn/8.8.1: 574 | resolution: {integrity: sha512-7zFpHzhnqYKrkYdUjF1HI1bzd0VygEGX8lFk4k5zVMqHEoES+P+7TKI+EvLO9WVMJ8eekdO0aDEK044xTXwPPA==} 575 | engines: {node: '>=0.4.0'} 576 | hasBin: true 577 | dev: true 578 | 579 | /agent-base/6.0.2: 580 | resolution: {integrity: sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==} 581 | engines: {node: '>= 6.0.0'} 582 | dependencies: 583 | debug: 4.3.4 584 | transitivePeerDependencies: 585 | - supports-color 586 | dev: true 587 | 588 | /ajv/6.12.6: 589 | resolution: {integrity: sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==} 590 | dependencies: 591 | fast-deep-equal: 3.1.3 592 | fast-json-stable-stringify: 2.1.0 593 | json-schema-traverse: 0.4.1 594 | uri-js: 4.4.1 595 | dev: true 596 | 597 | /ansi-regex/5.0.1: 598 | resolution: {integrity: sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==} 599 | engines: {node: '>=8'} 600 | dev: true 601 | 602 | /ansi-styles/4.3.0: 603 | resolution: {integrity: sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==} 604 | engines: {node: '>=8'} 605 | dependencies: 606 | color-convert: 2.0.1 607 | dev: true 608 | 609 | /anymatch/3.1.2: 610 | resolution: {integrity: sha512-P43ePfOAIupkguHUycrc4qJ9kz8ZiuOUijaETwX7THt0Y/GNK7v0aa8rY816xWjZ7rJdA5XdMcpVFTKMq+RvWg==} 611 | engines: {node: '>= 8'} 612 | dependencies: 613 | normalize-path: 3.0.0 614 | picomatch: 2.3.1 615 | dev: true 616 | 617 | /aproba/2.0.0: 618 | resolution: {integrity: sha512-lYe4Gx7QT+MKGbDsA+Z+he/Wtef0BiwDOlK/XkBrdfsh9J/jPPXbX0tE9x9cl27Tmu5gg3QUbUrQYa/y+KOHPQ==} 619 | dev: true 620 | 621 | /are-we-there-yet/2.0.0: 622 | resolution: {integrity: sha512-Ci/qENmwHnsYo9xKIcUJN5LeDKdJ6R1Z1j9V/J5wyq8nh/mYPEpIKJbBZXtZjG04HiK7zV/p6Vs9952MrMeUIw==} 623 | engines: {node: '>=10'} 624 | dependencies: 625 | delegates: 1.0.0 626 | readable-stream: 3.6.0 627 | dev: true 628 | 629 | /arg/5.0.2: 630 | resolution: {integrity: sha512-PYjyFOLKQ9y57JvQ6QLo8dAgNqswh8M1RMJYdQduT6xbWSgK36P/Z/v+p888pM69jMMfS8Xd8F6I1kQ/I9HUGg==} 631 | dev: true 632 | 633 | /argparse/2.0.1: 634 | resolution: {integrity: sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==} 635 | dev: true 636 | 637 | /array-union/2.1.0: 638 | resolution: {integrity: sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==} 639 | engines: {node: '>=8'} 640 | dev: true 641 | 642 | /async-sema/3.1.1: 643 | resolution: {integrity: sha512-tLRNUXati5MFePdAk8dw7Qt7DpxPB60ofAgn8WRhW6a2rcimZnYBP9oxHiv0OHy+Wz7kPMG+t4LGdt31+4EmGg==} 644 | dev: true 645 | 646 | /autoprefixer/10.4.13_postcss@8.4.18: 647 | resolution: {integrity: sha512-49vKpMqcZYsJjwotvt4+h/BCjJVnhGwcLpDt5xkcaOG3eLrG/HUYLagrihYsQ+qrIBgIzX1Rw7a6L8I/ZA1Atg==} 648 | engines: {node: ^10 || ^12 || >=14} 649 | hasBin: true 650 | peerDependencies: 651 | postcss: ^8.1.0 652 | dependencies: 653 | browserslist: 4.21.4 654 | caniuse-lite: 1.0.30001427 655 | fraction.js: 4.2.0 656 | normalize-range: 0.1.2 657 | picocolors: 1.0.0 658 | postcss: 8.4.18 659 | postcss-value-parser: 4.2.0 660 | dev: true 661 | 662 | /balanced-match/1.0.2: 663 | resolution: {integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==} 664 | dev: true 665 | 666 | /binary-extensions/2.2.0: 667 | resolution: {integrity: sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==} 668 | engines: {node: '>=8'} 669 | dev: true 670 | 671 | /bindings/1.5.0: 672 | resolution: {integrity: sha512-p2q/t/mhvuOj/UeLlV6566GD/guowlr0hHxClI0W9m7MWYkL1F0hLo+0Aexs9HSPCtR1SXQ0TD3MMKrXZajbiQ==} 673 | dependencies: 674 | file-uri-to-path: 1.0.0 675 | dev: true 676 | 677 | /brace-expansion/1.1.11: 678 | resolution: {integrity: sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==} 679 | dependencies: 680 | balanced-match: 1.0.2 681 | concat-map: 0.0.1 682 | dev: true 683 | 684 | /braces/3.0.2: 685 | resolution: {integrity: sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==} 686 | engines: {node: '>=8'} 687 | dependencies: 688 | fill-range: 7.0.1 689 | dev: true 690 | 691 | /browserslist/4.21.4: 692 | resolution: {integrity: sha512-CBHJJdDmgjl3daYjN5Cp5kbTf1mUhZoS+beLklHIvkOWscs83YAhLlF3Wsh/lciQYAcbBJgTOD44VtG31ZM4Hw==} 693 | engines: {node: ^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7} 694 | hasBin: true 695 | dependencies: 696 | caniuse-lite: 1.0.30001427 697 | electron-to-chromium: 1.4.284 698 | node-releases: 2.0.6 699 | update-browserslist-db: 1.0.10_browserslist@4.21.4 700 | dev: true 701 | 702 | /buffer-crc32/0.2.13: 703 | resolution: {integrity: sha512-VO9Ht/+p3SN7SKWqcrgEzjGbRSJYTx+Q1pTQC0wrWqHx0vpJraQ6GtHx8tvcg1rlK1byhU5gccxgOgj7B0TDkQ==} 704 | dev: true 705 | 706 | /bufferutil/4.0.7: 707 | resolution: {integrity: sha512-kukuqc39WOHtdxtw4UScxF/WVnMFVSQVKhtx3AjZJzhd0RGZZldcrfSEbVsWWe6KNH253574cq5F+wpv0G9pJw==} 708 | engines: {node: '>=6.14.2'} 709 | requiresBuild: true 710 | dependencies: 711 | node-gyp-build: 4.5.0 712 | dev: true 713 | 714 | /busboy/1.6.0: 715 | resolution: {integrity: sha512-8SFQbg/0hQ9xy3UNTB0YEnsNBbWfhf7RtnzpL7TkBiTBRfrQ9Fxcnz7VJsleJpyp6rVLvXiuORqjlHi5q+PYuA==} 716 | engines: {node: '>=10.16.0'} 717 | dependencies: 718 | streamsearch: 1.1.0 719 | dev: true 720 | 721 | /call-bind/1.0.2: 722 | resolution: {integrity: sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==} 723 | dependencies: 724 | function-bind: 1.1.1 725 | get-intrinsic: 1.1.3 726 | dev: true 727 | 728 | /callsites/3.1.0: 729 | resolution: {integrity: sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==} 730 | engines: {node: '>=6'} 731 | dev: true 732 | 733 | /camelcase-css/2.0.1: 734 | resolution: {integrity: sha512-QOSvevhslijgYwRx6Rv7zKdMF8lbRmx+uQGx2+vDc+KI/eBnsy9kit5aj23AgGu3pa4t9AgwbnXWqS+iOY+2aA==} 735 | engines: {node: '>= 6'} 736 | dev: true 737 | 738 | /caniuse-lite/1.0.30001427: 739 | resolution: {integrity: sha512-lfXQ73oB9c8DP5Suxaszm+Ta2sr/4tf8+381GkIm1MLj/YdLf+rEDyDSRCzeltuyTVGm+/s18gdZ0q+Wmp8VsQ==} 740 | dev: true 741 | 742 | /chalk/4.1.2: 743 | resolution: {integrity: sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==} 744 | engines: {node: '>=10'} 745 | dependencies: 746 | ansi-styles: 4.3.0 747 | supports-color: 7.2.0 748 | dev: true 749 | 750 | /chokidar/3.5.3: 751 | resolution: {integrity: sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==} 752 | engines: {node: '>= 8.10.0'} 753 | dependencies: 754 | anymatch: 3.1.2 755 | braces: 3.0.2 756 | glob-parent: 5.1.2 757 | is-binary-path: 2.1.0 758 | is-glob: 4.0.3 759 | normalize-path: 3.0.0 760 | readdirp: 3.6.0 761 | optionalDependencies: 762 | fsevents: 2.3.2 763 | dev: true 764 | 765 | /chownr/2.0.0: 766 | resolution: {integrity: sha512-bIomtDF5KGpdogkLd9VspvFzk9KfpyyGlS8YFVZl7TGPBHL5snIOnxeshwVgPteQ9b4Eydl+pVbIyE1DcvCWgQ==} 767 | engines: {node: '>=10'} 768 | dev: true 769 | 770 | /color-convert/2.0.1: 771 | resolution: {integrity: sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==} 772 | engines: {node: '>=7.0.0'} 773 | dependencies: 774 | color-name: 1.1.4 775 | dev: true 776 | 777 | /color-name/1.1.4: 778 | resolution: {integrity: sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==} 779 | dev: true 780 | 781 | /color-support/1.1.3: 782 | resolution: {integrity: sha512-qiBjkpbMLO/HL68y+lh4q0/O1MZFj2RX6X/KmMa3+gJD3z+WwI1ZzDHysvqHGS3mP6mznPckpXmw1nI9cJjyRg==} 783 | hasBin: true 784 | dev: true 785 | 786 | /concat-map/0.0.1: 787 | resolution: {integrity: sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==} 788 | dev: true 789 | 790 | /console-control-strings/1.1.0: 791 | resolution: {integrity: sha512-ty/fTekppD2fIwRvnZAVdeOiGd1c7YXEixbgJTNzqcxJWKQnjJ/V1bNEEE6hygpM3WjwHFUVK6HTjWSzV4a8sQ==} 792 | dev: true 793 | 794 | /cookie/0.5.0: 795 | resolution: {integrity: sha512-YZ3GUyn/o8gfKJlnlX7g7xq4gyO6OSuhGPKaaGssGB2qgDUS0gPgtTvoyZLTt9Ab6dC4hfc9dV5arkvc/OCmrw==} 796 | engines: {node: '>= 0.6'} 797 | dev: true 798 | 799 | /cross-fetch/3.1.5: 800 | resolution: {integrity: sha512-lvb1SBsI0Z7GDwmuid+mU3kWVBwTVUbe7S0H52yaaAdQOXq2YktTCZdlAcNKFzE6QtRz0snpw9bNiPeOIkkQvw==} 801 | dependencies: 802 | node-fetch: 2.6.7 803 | transitivePeerDependencies: 804 | - encoding 805 | dev: true 806 | 807 | /cross-spawn/7.0.3: 808 | resolution: {integrity: sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==} 809 | engines: {node: '>= 8'} 810 | dependencies: 811 | path-key: 3.1.1 812 | shebang-command: 2.0.0 813 | which: 2.0.2 814 | dev: true 815 | 816 | /cssesc/3.0.0: 817 | resolution: {integrity: sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==} 818 | engines: {node: '>=4'} 819 | hasBin: true 820 | dev: true 821 | 822 | /d/1.0.1: 823 | resolution: {integrity: sha512-m62ShEObQ39CfralilEQRjH6oAMtNCV1xJyEx5LpRYUVN+EviphDgUc/F3hnYbADmkiNs67Y+3ylmlG7Lnu+FA==} 824 | dependencies: 825 | es5-ext: 0.10.62 826 | type: 1.2.0 827 | dev: true 828 | 829 | /debug/2.6.9: 830 | resolution: {integrity: sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==} 831 | peerDependencies: 832 | supports-color: '*' 833 | peerDependenciesMeta: 834 | supports-color: 835 | optional: true 836 | dependencies: 837 | ms: 2.0.0 838 | dev: true 839 | 840 | /debug/4.3.4: 841 | resolution: {integrity: sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==} 842 | engines: {node: '>=6.0'} 843 | peerDependencies: 844 | supports-color: '*' 845 | peerDependenciesMeta: 846 | supports-color: 847 | optional: true 848 | dependencies: 849 | ms: 2.1.2 850 | dev: true 851 | 852 | /deep-is/0.1.4: 853 | resolution: {integrity: sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==} 854 | dev: true 855 | 856 | /deepmerge/4.2.2: 857 | resolution: {integrity: sha512-FJ3UgI4gIl+PHZm53knsuSFpE+nESMr7M4v9QcgB7S63Kj/6WqMiFQJpBBYz1Pt+66bZpP3Q7Lye0Oo9MPKEdg==} 858 | engines: {node: '>=0.10.0'} 859 | dev: true 860 | 861 | /defined/1.0.1: 862 | resolution: {integrity: sha512-hsBd2qSVCRE+5PmNdHt1uzyrFu5d3RwmFDKzyNZMFq/EwDNJF7Ee5+D5oEKF0hU6LhtoUF1macFvOe4AskQC1Q==} 863 | dev: true 864 | 865 | /delegates/1.0.0: 866 | resolution: {integrity: sha512-bd2L678uiWATM6m5Z1VzNCErI3jiGzt6HGY8OVICs40JQq/HALfbyNJmp0UDakEY4pMMaN0Ly5om/B1VI/+xfQ==} 867 | dev: true 868 | 869 | /detect-indent/6.1.0: 870 | resolution: {integrity: sha512-reYkTUJAZb9gUuZ2RvVCNhVHdg62RHnJ7WJl8ftMi4diZ6NWlciOzQN88pUhSELEwflJht4oQDv0F0BMlwaYtA==} 871 | engines: {node: '>=8'} 872 | dev: true 873 | 874 | /detect-libc/2.0.1: 875 | resolution: {integrity: sha512-463v3ZeIrcWtdgIg6vI6XUncguvr2TnGl4SzDXinkt9mSLpBJKXT3mW6xT3VQdDN11+WVs29pgvivTc4Lp8v+w==} 876 | engines: {node: '>=8'} 877 | dev: true 878 | 879 | /detective/5.2.1: 880 | resolution: {integrity: sha512-v9XE1zRnz1wRtgurGu0Bs8uHKFSTdteYZNbIPFVhUZ39L/S79ppMpdmVOZAnoz1jfEFodc48n6MX483Xo3t1yw==} 881 | engines: {node: '>=0.8.0'} 882 | hasBin: true 883 | dependencies: 884 | acorn-node: 1.8.2 885 | defined: 1.0.1 886 | minimist: 1.2.7 887 | dev: true 888 | 889 | /devalue/4.0.1: 890 | resolution: {integrity: sha512-Oksbel8g2rv5ivcCyImF1RXEU2FcS1OtCwVs4tJCCeVws/Dp9EE15fUbEsNr/xLD3ZxsQURBCDf56Lk1CgwCpg==} 891 | dev: true 892 | 893 | /didyoumean/1.2.2: 894 | resolution: {integrity: sha512-gxtyfqMg7GKyhQmb056K7M3xszy/myH8w+B4RT+QXBQsvAOdc3XymqDDPHx1BgPgsdAA5SIifona89YtRATDzw==} 895 | dev: true 896 | 897 | /dir-glob/3.0.1: 898 | resolution: {integrity: sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==} 899 | engines: {node: '>=8'} 900 | dependencies: 901 | path-type: 4.0.0 902 | dev: true 903 | 904 | /dlv/1.1.3: 905 | resolution: {integrity: sha512-+HlytyjlPKnIG8XuRG8WvmBP8xs8P71y+SKKS6ZXWoEgLuePxtDoUEiH7WkdePWrQ5JBpE6aoVqfZfJUQkjXwA==} 906 | dev: true 907 | 908 | /doctrine/3.0.0: 909 | resolution: {integrity: sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==} 910 | engines: {node: '>=6.0.0'} 911 | dependencies: 912 | esutils: 2.0.3 913 | dev: true 914 | 915 | /electron-to-chromium/1.4.284: 916 | resolution: {integrity: sha512-M8WEXFuKXMYMVr45fo8mq0wUrrJHheiKZf6BArTKk9ZBYCKJEOU5H8cdWgDT+qCVZf7Na4lVUaZsA+h6uA9+PA==} 917 | dev: true 918 | 919 | /emoji-regex/8.0.0: 920 | resolution: {integrity: sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==} 921 | dev: true 922 | 923 | /es5-ext/0.10.62: 924 | resolution: {integrity: sha512-BHLqn0klhEpnOKSrzn/Xsz2UIW8j+cGmo9JLzr8BiUapV8hPL9+FliFqjwr9ngW7jWdnxv6eO+/LqyhJVqgrjA==} 925 | engines: {node: '>=0.10'} 926 | requiresBuild: true 927 | dependencies: 928 | es6-iterator: 2.0.3 929 | es6-symbol: 3.1.3 930 | next-tick: 1.1.0 931 | dev: true 932 | 933 | /es6-iterator/2.0.3: 934 | resolution: {integrity: sha512-zw4SRzoUkd+cl+ZoE15A9o1oQd920Bb0iOJMQkQhl3jNc03YqVjAhG7scf9C5KWRU/R13Orf588uCC6525o02g==} 935 | dependencies: 936 | d: 1.0.1 937 | es5-ext: 0.10.62 938 | es6-symbol: 3.1.3 939 | dev: true 940 | 941 | /es6-promise/3.3.1: 942 | resolution: {integrity: sha512-SOp9Phqvqn7jtEUxPWdWfWoLmyt2VaJ6MpvP9Comy1MceMXqE6bxvaTu4iaxpYYPzhny28Lc+M87/c2cPK6lDg==} 943 | dev: true 944 | 945 | /es6-symbol/3.1.3: 946 | resolution: {integrity: sha512-NJ6Yn3FuDinBaBRWl/q5X/s4koRHBrgKAu+yGI6JCBeiu3qrcbJhwT2GeR/EXVfylRk8dpQVJoLEFhK+Mu31NA==} 947 | dependencies: 948 | d: 1.0.1 949 | ext: 1.7.0 950 | dev: true 951 | 952 | /esbuild-android-64/0.15.12: 953 | resolution: {integrity: sha512-MJKXwvPY9g0rGps0+U65HlTsM1wUs9lbjt5CU19RESqycGFDRijMDQsh68MtbzkqWSRdEtiKS1mtPzKneaAI0Q==} 954 | engines: {node: '>=12'} 955 | cpu: [x64] 956 | os: [android] 957 | requiresBuild: true 958 | dev: true 959 | optional: true 960 | 961 | /esbuild-android-arm64/0.15.12: 962 | resolution: {integrity: sha512-Hc9SEcZbIMhhLcvhr1DH+lrrec9SFTiRzfJ7EGSBZiiw994gfkVV6vG0sLWqQQ6DD7V4+OggB+Hn0IRUdDUqvA==} 963 | engines: {node: '>=12'} 964 | cpu: [arm64] 965 | os: [android] 966 | requiresBuild: true 967 | dev: true 968 | optional: true 969 | 970 | /esbuild-darwin-64/0.15.12: 971 | resolution: {integrity: sha512-qkmqrTVYPFiePt5qFjP8w/S+GIUMbt6k8qmiPraECUWfPptaPJUGkCKrWEfYFRWB7bY23FV95rhvPyh/KARP8Q==} 972 | engines: {node: '>=12'} 973 | cpu: [x64] 974 | os: [darwin] 975 | requiresBuild: true 976 | dev: true 977 | optional: true 978 | 979 | /esbuild-darwin-arm64/0.15.12: 980 | resolution: {integrity: sha512-z4zPX02tQ41kcXMyN3c/GfZpIjKoI/BzHrdKUwhC/Ki5BAhWv59A9M8H+iqaRbwpzYrYidTybBwiZAIWCLJAkw==} 981 | engines: {node: '>=12'} 982 | cpu: [arm64] 983 | os: [darwin] 984 | requiresBuild: true 985 | dev: true 986 | optional: true 987 | 988 | /esbuild-freebsd-64/0.15.12: 989 | resolution: {integrity: sha512-XFL7gKMCKXLDiAiBjhLG0XECliXaRLTZh6hsyzqUqPUf/PY4C6EJDTKIeqqPKXaVJ8+fzNek88285krSz1QECw==} 990 | engines: {node: '>=12'} 991 | cpu: [x64] 992 | os: [freebsd] 993 | requiresBuild: true 994 | dev: true 995 | optional: true 996 | 997 | /esbuild-freebsd-arm64/0.15.12: 998 | resolution: {integrity: sha512-jwEIu5UCUk6TjiG1X+KQnCGISI+ILnXzIzt9yDVrhjug2fkYzlLbl0K43q96Q3KB66v6N1UFF0r5Ks4Xo7i72g==} 999 | engines: {node: '>=12'} 1000 | cpu: [arm64] 1001 | os: [freebsd] 1002 | requiresBuild: true 1003 | dev: true 1004 | optional: true 1005 | 1006 | /esbuild-linux-32/0.15.12: 1007 | resolution: {integrity: sha512-uSQuSEyF1kVzGzuIr4XM+v7TPKxHjBnLcwv2yPyCz8riV8VUCnO/C4BF3w5dHiVpCd5Z1cebBtZJNlC4anWpwA==} 1008 | engines: {node: '>=12'} 1009 | cpu: [ia32] 1010 | os: [linux] 1011 | requiresBuild: true 1012 | dev: true 1013 | optional: true 1014 | 1015 | /esbuild-linux-64/0.15.12: 1016 | resolution: {integrity: sha512-QcgCKb7zfJxqT9o5z9ZUeGH1k8N6iX1Y7VNsEi5F9+HzN1OIx7ESxtQXDN9jbeUSPiRH1n9cw6gFT3H4qbdvcA==} 1017 | engines: {node: '>=12'} 1018 | cpu: [x64] 1019 | os: [linux] 1020 | requiresBuild: true 1021 | dev: true 1022 | optional: true 1023 | 1024 | /esbuild-linux-arm/0.15.12: 1025 | resolution: {integrity: sha512-Wf7T0aNylGcLu7hBnzMvsTfEXdEdJY/hY3u36Vla21aY66xR0MS5I1Hw8nVquXjTN0A6fk/vnr32tkC/C2lb0A==} 1026 | engines: {node: '>=12'} 1027 | cpu: [arm] 1028 | os: [linux] 1029 | requiresBuild: true 1030 | dev: true 1031 | optional: true 1032 | 1033 | /esbuild-linux-arm64/0.15.12: 1034 | resolution: {integrity: sha512-HtNq5xm8fUpZKwWKS2/YGwSfTF+339L4aIA8yphNKYJckd5hVdhfdl6GM2P3HwLSCORS++++7++//ApEwXEuAQ==} 1035 | engines: {node: '>=12'} 1036 | cpu: [arm64] 1037 | os: [linux] 1038 | requiresBuild: true 1039 | dev: true 1040 | optional: true 1041 | 1042 | /esbuild-linux-mips64le/0.15.12: 1043 | resolution: {integrity: sha512-Qol3+AvivngUZkTVFgLpb0H6DT+N5/zM3V1YgTkryPYFeUvuT5JFNDR3ZiS6LxhyF8EE+fiNtzwlPqMDqVcc6A==} 1044 | engines: {node: '>=12'} 1045 | cpu: [mips64el] 1046 | os: [linux] 1047 | requiresBuild: true 1048 | dev: true 1049 | optional: true 1050 | 1051 | /esbuild-linux-ppc64le/0.15.12: 1052 | resolution: {integrity: sha512-4D8qUCo+CFKaR0cGXtGyVsOI7w7k93Qxb3KFXWr75An0DHamYzq8lt7TNZKoOq/Gh8c40/aKaxvcZnTgQ0TJNg==} 1053 | engines: {node: '>=12'} 1054 | cpu: [ppc64] 1055 | os: [linux] 1056 | requiresBuild: true 1057 | dev: true 1058 | optional: true 1059 | 1060 | /esbuild-linux-riscv64/0.15.12: 1061 | resolution: {integrity: sha512-G9w6NcuuCI6TUUxe6ka0enjZHDnSVK8bO+1qDhMOCtl7Tr78CcZilJj8SGLN00zO5iIlwNRZKHjdMpfFgNn1VA==} 1062 | engines: {node: '>=12'} 1063 | cpu: [riscv64] 1064 | os: [linux] 1065 | requiresBuild: true 1066 | dev: true 1067 | optional: true 1068 | 1069 | /esbuild-linux-s390x/0.15.12: 1070 | resolution: {integrity: sha512-Lt6BDnuXbXeqSlVuuUM5z18GkJAZf3ERskGZbAWjrQoi9xbEIsj/hEzVnSAFLtkfLuy2DE4RwTcX02tZFunXww==} 1071 | engines: {node: '>=12'} 1072 | cpu: [s390x] 1073 | os: [linux] 1074 | requiresBuild: true 1075 | dev: true 1076 | optional: true 1077 | 1078 | /esbuild-netbsd-64/0.15.12: 1079 | resolution: {integrity: sha512-jlUxCiHO1dsqoURZDQts+HK100o0hXfi4t54MNRMCAqKGAV33JCVvMplLAa2FwviSojT/5ZG5HUfG3gstwAG8w==} 1080 | engines: {node: '>=12'} 1081 | cpu: [x64] 1082 | os: [netbsd] 1083 | requiresBuild: true 1084 | dev: true 1085 | optional: true 1086 | 1087 | /esbuild-openbsd-64/0.15.12: 1088 | resolution: {integrity: sha512-1o1uAfRTMIWNOmpf8v7iudND0L6zRBYSH45sofCZywrcf7NcZA+c7aFsS1YryU+yN7aRppTqdUK1PgbZVaB1Dw==} 1089 | engines: {node: '>=12'} 1090 | cpu: [x64] 1091 | os: [openbsd] 1092 | requiresBuild: true 1093 | dev: true 1094 | optional: true 1095 | 1096 | /esbuild-sunos-64/0.15.12: 1097 | resolution: {integrity: sha512-nkl251DpoWoBO9Eq9aFdoIt2yYmp4I3kvQjba3jFKlMXuqQ9A4q+JaqdkCouG3DHgAGnzshzaGu6xofGcXyPXg==} 1098 | engines: {node: '>=12'} 1099 | cpu: [x64] 1100 | os: [sunos] 1101 | requiresBuild: true 1102 | dev: true 1103 | optional: true 1104 | 1105 | /esbuild-windows-32/0.15.12: 1106 | resolution: {integrity: sha512-WlGeBZHgPC00O08luIp5B2SP4cNCp/PcS+3Pcg31kdcJPopHxLkdCXtadLU9J82LCfw4TVls21A6lilQ9mzHrw==} 1107 | engines: {node: '>=12'} 1108 | cpu: [ia32] 1109 | os: [win32] 1110 | requiresBuild: true 1111 | dev: true 1112 | optional: true 1113 | 1114 | /esbuild-windows-64/0.15.12: 1115 | resolution: {integrity: sha512-VActO3WnWZSN//xjSfbiGOSyC+wkZtI8I4KlgrTo5oHJM6z3MZZBCuFaZHd8hzf/W9KPhF0lY8OqlmWC9HO5AA==} 1116 | engines: {node: '>=12'} 1117 | cpu: [x64] 1118 | os: [win32] 1119 | requiresBuild: true 1120 | dev: true 1121 | optional: true 1122 | 1123 | /esbuild-windows-arm64/0.15.12: 1124 | resolution: {integrity: sha512-Of3MIacva1OK/m4zCNIvBfz8VVROBmQT+gRX6pFTLPngFYcj6TFH/12VveAqq1k9VB2l28EoVMNMUCcmsfwyuA==} 1125 | engines: {node: '>=12'} 1126 | cpu: [arm64] 1127 | os: [win32] 1128 | requiresBuild: true 1129 | dev: true 1130 | optional: true 1131 | 1132 | /esbuild/0.15.12: 1133 | resolution: {integrity: sha512-PcT+/wyDqJQsRVhaE9uX/Oq4XLrFh0ce/bs2TJh4CSaw9xuvI+xFrH2nAYOADbhQjUgAhNWC5LKoUsakm4dxng==} 1134 | engines: {node: '>=12'} 1135 | hasBin: true 1136 | requiresBuild: true 1137 | optionalDependencies: 1138 | '@esbuild/android-arm': 0.15.12 1139 | '@esbuild/linux-loong64': 0.15.12 1140 | esbuild-android-64: 0.15.12 1141 | esbuild-android-arm64: 0.15.12 1142 | esbuild-darwin-64: 0.15.12 1143 | esbuild-darwin-arm64: 0.15.12 1144 | esbuild-freebsd-64: 0.15.12 1145 | esbuild-freebsd-arm64: 0.15.12 1146 | esbuild-linux-32: 0.15.12 1147 | esbuild-linux-64: 0.15.12 1148 | esbuild-linux-arm: 0.15.12 1149 | esbuild-linux-arm64: 0.15.12 1150 | esbuild-linux-mips64le: 0.15.12 1151 | esbuild-linux-ppc64le: 0.15.12 1152 | esbuild-linux-riscv64: 0.15.12 1153 | esbuild-linux-s390x: 0.15.12 1154 | esbuild-netbsd-64: 0.15.12 1155 | esbuild-openbsd-64: 0.15.12 1156 | esbuild-sunos-64: 0.15.12 1157 | esbuild-windows-32: 0.15.12 1158 | esbuild-windows-64: 0.15.12 1159 | esbuild-windows-arm64: 0.15.12 1160 | dev: true 1161 | 1162 | /escalade/3.1.1: 1163 | resolution: {integrity: sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==} 1164 | engines: {node: '>=6'} 1165 | dev: true 1166 | 1167 | /escape-string-regexp/4.0.0: 1168 | resolution: {integrity: sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==} 1169 | engines: {node: '>=10'} 1170 | dev: true 1171 | 1172 | /eslint-config-prettier/8.5.0_eslint@8.26.0: 1173 | resolution: {integrity: sha512-obmWKLUNCnhtQRKc+tmnYuQl0pFU1ibYJQ5BGhTVB08bHe9wC8qUeG7c08dj9XX+AuPj1YSGSQIHl1pnDHZR0Q==} 1174 | hasBin: true 1175 | peerDependencies: 1176 | eslint: '>=7.0.0' 1177 | dependencies: 1178 | eslint: 8.26.0 1179 | dev: true 1180 | 1181 | /eslint-plugin-svelte3/4.0.0_l6ppk7eerpslmlsqymzic46t24: 1182 | resolution: {integrity: sha512-OIx9lgaNzD02+MDFNLw0GEUbuovNcglg+wnd/UY0fbZmlQSz7GlQiQ1f+yX0XvC07XPcDOnFcichqI3xCwp71g==} 1183 | peerDependencies: 1184 | eslint: '>=8.0.0' 1185 | svelte: ^3.2.0 1186 | dependencies: 1187 | eslint: 8.26.0 1188 | svelte: 3.52.0 1189 | dev: true 1190 | 1191 | /eslint-scope/5.1.1: 1192 | resolution: {integrity: sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==} 1193 | engines: {node: '>=8.0.0'} 1194 | dependencies: 1195 | esrecurse: 4.3.0 1196 | estraverse: 4.3.0 1197 | dev: true 1198 | 1199 | /eslint-scope/7.1.1: 1200 | resolution: {integrity: sha512-QKQM/UXpIiHcLqJ5AOyIW7XZmzjkzQXYE54n1++wb0u9V/abW3l9uQnxX8Z5Xd18xyKIMTUAyQ0k1e8pz6LUrw==} 1201 | engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} 1202 | dependencies: 1203 | esrecurse: 4.3.0 1204 | estraverse: 5.3.0 1205 | dev: true 1206 | 1207 | /eslint-utils/3.0.0_eslint@8.26.0: 1208 | resolution: {integrity: sha512-uuQC43IGctw68pJA1RgbQS8/NP7rch6Cwd4j3ZBtgo4/8Flj4eGE7ZYSZRN3iq5pVUv6GPdW5Z1RFleo84uLDA==} 1209 | engines: {node: ^10.0.0 || ^12.0.0 || >= 14.0.0} 1210 | peerDependencies: 1211 | eslint: '>=5' 1212 | dependencies: 1213 | eslint: 8.26.0 1214 | eslint-visitor-keys: 2.1.0 1215 | dev: true 1216 | 1217 | /eslint-visitor-keys/2.1.0: 1218 | resolution: {integrity: sha512-0rSmRBzXgDzIsD6mGdJgevzgezI534Cer5L/vyMX0kHzT/jiB43jRhd9YUlMGYLQy2zprNmoT8qasCGtY+QaKw==} 1219 | engines: {node: '>=10'} 1220 | dev: true 1221 | 1222 | /eslint-visitor-keys/3.3.0: 1223 | resolution: {integrity: sha512-mQ+suqKJVyeuwGYHAdjMFqjCyfl8+Ldnxuyp3ldiMBFKkvytrXUZWaiPCEav8qDHKty44bD+qV1IP4T+w+xXRA==} 1224 | engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} 1225 | dev: true 1226 | 1227 | /eslint/8.26.0: 1228 | resolution: {integrity: sha512-kzJkpaw1Bfwheq4VXUezFriD1GxszX6dUekM7Z3aC2o4hju+tsR/XyTC3RcoSD7jmy9VkPU3+N6YjVU2e96Oyg==} 1229 | engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} 1230 | hasBin: true 1231 | dependencies: 1232 | '@eslint/eslintrc': 1.3.3 1233 | '@humanwhocodes/config-array': 0.11.7 1234 | '@humanwhocodes/module-importer': 1.0.1 1235 | '@nodelib/fs.walk': 1.2.8 1236 | ajv: 6.12.6 1237 | chalk: 4.1.2 1238 | cross-spawn: 7.0.3 1239 | debug: 4.3.4 1240 | doctrine: 3.0.0 1241 | escape-string-regexp: 4.0.0 1242 | eslint-scope: 7.1.1 1243 | eslint-utils: 3.0.0_eslint@8.26.0 1244 | eslint-visitor-keys: 3.3.0 1245 | espree: 9.4.0 1246 | esquery: 1.4.0 1247 | esutils: 2.0.3 1248 | fast-deep-equal: 3.1.3 1249 | file-entry-cache: 6.0.1 1250 | find-up: 5.0.0 1251 | glob-parent: 6.0.2 1252 | globals: 13.17.0 1253 | grapheme-splitter: 1.0.4 1254 | ignore: 5.2.0 1255 | import-fresh: 3.3.0 1256 | imurmurhash: 0.1.4 1257 | is-glob: 4.0.3 1258 | is-path-inside: 3.0.3 1259 | js-sdsl: 4.1.5 1260 | js-yaml: 4.1.0 1261 | json-stable-stringify-without-jsonify: 1.0.1 1262 | levn: 0.4.1 1263 | lodash.merge: 4.6.2 1264 | minimatch: 3.1.2 1265 | natural-compare: 1.4.0 1266 | optionator: 0.9.1 1267 | regexpp: 3.2.0 1268 | strip-ansi: 6.0.1 1269 | strip-json-comments: 3.1.1 1270 | text-table: 0.2.0 1271 | transitivePeerDependencies: 1272 | - supports-color 1273 | dev: true 1274 | 1275 | /espree/9.4.0: 1276 | resolution: {integrity: sha512-DQmnRpLj7f6TgN/NYb0MTzJXL+vJF9h3pHy4JhCIs3zwcgez8xmGg3sXHcEO97BrmO2OSvCwMdfdlyl+E9KjOw==} 1277 | engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} 1278 | dependencies: 1279 | acorn: 8.8.1 1280 | acorn-jsx: 5.3.2_acorn@8.8.1 1281 | eslint-visitor-keys: 3.3.0 1282 | dev: true 1283 | 1284 | /esquery/1.4.0: 1285 | resolution: {integrity: sha512-cCDispWt5vHHtwMY2YrAQ4ibFkAL8RbH5YGBnZBc90MolvvfkkQcJro/aZiAQUlQ3qgrYS6D6v8Gc5G5CQsc9w==} 1286 | engines: {node: '>=0.10'} 1287 | dependencies: 1288 | estraverse: 5.3.0 1289 | dev: true 1290 | 1291 | /esrecurse/4.3.0: 1292 | resolution: {integrity: sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==} 1293 | engines: {node: '>=4.0'} 1294 | dependencies: 1295 | estraverse: 5.3.0 1296 | dev: true 1297 | 1298 | /estraverse/4.3.0: 1299 | resolution: {integrity: sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==} 1300 | engines: {node: '>=4.0'} 1301 | dev: true 1302 | 1303 | /estraverse/5.3.0: 1304 | resolution: {integrity: sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==} 1305 | engines: {node: '>=4.0'} 1306 | dev: true 1307 | 1308 | /estree-walker/0.6.1: 1309 | resolution: {integrity: sha512-SqmZANLWS0mnatqbSfRP5g8OXZC12Fgg1IwNtLsyHDzJizORW4khDfjPqJZsemPWBB2uqykUah5YpQ6epsqC/w==} 1310 | dev: true 1311 | 1312 | /estree-walker/2.0.2: 1313 | resolution: {integrity: sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==} 1314 | dev: true 1315 | 1316 | /esutils/2.0.3: 1317 | resolution: {integrity: sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==} 1318 | engines: {node: '>=0.10.0'} 1319 | dev: true 1320 | 1321 | /ext/1.7.0: 1322 | resolution: {integrity: sha512-6hxeJYaL110a9b5TEJSj0gojyHQAmA2ch5Os+ySCiA1QGdS697XWY1pzsrSjqA9LDEEgdB/KypIlR59RcLuHYw==} 1323 | dependencies: 1324 | type: 2.7.2 1325 | dev: true 1326 | 1327 | /fast-deep-equal/3.1.3: 1328 | resolution: {integrity: sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==} 1329 | dev: true 1330 | 1331 | /fast-glob/3.2.12: 1332 | resolution: {integrity: sha512-DVj4CQIYYow0BlaelwK1pHl5n5cRSJfM60UA0zK891sVInoPri2Ekj7+e1CT3/3qxXenpI+nBBmQAcJPJgaj4w==} 1333 | engines: {node: '>=8.6.0'} 1334 | dependencies: 1335 | '@nodelib/fs.stat': 2.0.5 1336 | '@nodelib/fs.walk': 1.2.8 1337 | glob-parent: 5.1.2 1338 | merge2: 1.4.1 1339 | micromatch: 4.0.5 1340 | dev: true 1341 | 1342 | /fast-json-stable-stringify/2.1.0: 1343 | resolution: {integrity: sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==} 1344 | dev: true 1345 | 1346 | /fast-levenshtein/2.0.6: 1347 | resolution: {integrity: sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==} 1348 | dev: true 1349 | 1350 | /fastq/1.13.0: 1351 | resolution: {integrity: sha512-YpkpUnK8od0o1hmeSc7UUs/eB/vIPWJYjKck2QKIzAf71Vm1AAQ3EbuZB3g2JIy+pg+ERD0vqI79KyZiB2e2Nw==} 1352 | dependencies: 1353 | reusify: 1.0.4 1354 | dev: true 1355 | 1356 | /file-entry-cache/6.0.1: 1357 | resolution: {integrity: sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==} 1358 | engines: {node: ^10.12.0 || >=12.0.0} 1359 | dependencies: 1360 | flat-cache: 3.0.4 1361 | dev: true 1362 | 1363 | /file-uri-to-path/1.0.0: 1364 | resolution: {integrity: sha512-0Zt+s3L7Vf1biwWZ29aARiVYLx7iMGnEUl9x33fbB/j3jR81u/O2LbqK+Bm1CDSNDKVtJ/YjwY7TUd5SkeLQLw==} 1365 | dev: true 1366 | 1367 | /fill-range/7.0.1: 1368 | resolution: {integrity: sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==} 1369 | engines: {node: '>=8'} 1370 | dependencies: 1371 | to-regex-range: 5.0.1 1372 | dev: true 1373 | 1374 | /find-up/5.0.0: 1375 | resolution: {integrity: sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==} 1376 | engines: {node: '>=10'} 1377 | dependencies: 1378 | locate-path: 6.0.0 1379 | path-exists: 4.0.0 1380 | dev: true 1381 | 1382 | /flat-cache/3.0.4: 1383 | resolution: {integrity: sha512-dm9s5Pw7Jc0GvMYbshN6zchCA9RgQlzzEZX3vylR9IqFfS8XciblUXOKfW6SiuJ0e13eDYZoZV5wdrev7P3Nwg==} 1384 | engines: {node: ^10.12.0 || >=12.0.0} 1385 | dependencies: 1386 | flatted: 3.2.7 1387 | rimraf: 3.0.2 1388 | dev: true 1389 | 1390 | /flatted/3.2.7: 1391 | resolution: {integrity: sha512-5nqDSxl8nn5BSNxyR3n4I6eDmbolI6WT+QqR547RwxQapgjQBmtktdP+HTBb/a/zLsbzERTONyUB5pefh5TtjQ==} 1392 | dev: true 1393 | 1394 | /fraction.js/4.2.0: 1395 | resolution: {integrity: sha512-MhLuK+2gUcnZe8ZHlaaINnQLl0xRIGRfcGk2yl8xoQAfHrSsL3rYu6FCmBdkdbhc9EPlwyGHewaRsvwRMJtAlA==} 1396 | dev: true 1397 | 1398 | /fs-minipass/2.1.0: 1399 | resolution: {integrity: sha512-V/JgOLFCS+R6Vcq0slCuaeWEdNC3ouDlJMNIsacH2VtALiu9mV4LPrHc5cDl8k5aw6J8jwgWWpiTo5RYhmIzvg==} 1400 | engines: {node: '>= 8'} 1401 | dependencies: 1402 | minipass: 3.3.4 1403 | dev: true 1404 | 1405 | /fs.realpath/1.0.0: 1406 | resolution: {integrity: sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==} 1407 | dev: true 1408 | 1409 | /fsevents/2.3.2: 1410 | resolution: {integrity: sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==} 1411 | engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0} 1412 | os: [darwin] 1413 | requiresBuild: true 1414 | dev: true 1415 | optional: true 1416 | 1417 | /function-bind/1.1.1: 1418 | resolution: {integrity: sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==} 1419 | dev: true 1420 | 1421 | /gauge/3.0.2: 1422 | resolution: {integrity: sha512-+5J6MS/5XksCuXq++uFRsnUd7Ovu1XenbeuIuNRJxYWjgQbPuFhT14lAvsWfqfAmnwluf1OwMjz39HjfLPci0Q==} 1423 | engines: {node: '>=10'} 1424 | dependencies: 1425 | aproba: 2.0.0 1426 | color-support: 1.1.3 1427 | console-control-strings: 1.1.0 1428 | has-unicode: 2.0.1 1429 | object-assign: 4.1.1 1430 | signal-exit: 3.0.7 1431 | string-width: 4.2.3 1432 | strip-ansi: 6.0.1 1433 | wide-align: 1.1.5 1434 | dev: true 1435 | 1436 | /get-intrinsic/1.1.3: 1437 | resolution: {integrity: sha512-QJVz1Tj7MS099PevUG5jvnt9tSkXN8K14dxQlikJuPt4uD9hHAHjLyLBiLR5zELelBdD9QNRAXZzsJx0WaDL9A==} 1438 | dependencies: 1439 | function-bind: 1.1.1 1440 | has: 1.0.3 1441 | has-symbols: 1.0.3 1442 | dev: true 1443 | 1444 | /glob-parent/5.1.2: 1445 | resolution: {integrity: sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==} 1446 | engines: {node: '>= 6'} 1447 | dependencies: 1448 | is-glob: 4.0.3 1449 | dev: true 1450 | 1451 | /glob-parent/6.0.2: 1452 | resolution: {integrity: sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==} 1453 | engines: {node: '>=10.13.0'} 1454 | dependencies: 1455 | is-glob: 4.0.3 1456 | dev: true 1457 | 1458 | /glob/7.2.3: 1459 | resolution: {integrity: sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==} 1460 | dependencies: 1461 | fs.realpath: 1.0.0 1462 | inflight: 1.0.6 1463 | inherits: 2.0.4 1464 | minimatch: 3.1.2 1465 | once: 1.4.0 1466 | path-is-absolute: 1.0.1 1467 | dev: true 1468 | 1469 | /globals/13.17.0: 1470 | resolution: {integrity: sha512-1C+6nQRb1GwGMKm2dH/E7enFAMxGTmGI7/dEdhy/DNelv85w9B72t3uc5frtMNXIbzrarJJ/lTCjcaZwbLJmyw==} 1471 | engines: {node: '>=8'} 1472 | dependencies: 1473 | type-fest: 0.20.2 1474 | dev: true 1475 | 1476 | /globalyzer/0.1.0: 1477 | resolution: {integrity: sha512-40oNTM9UfG6aBmuKxk/giHn5nQ8RVz/SS4Ir6zgzOv9/qC3kKZ9v4etGTcJbEl/NyVQH7FGU7d+X1egr57Md2Q==} 1478 | dev: true 1479 | 1480 | /globby/11.1.0: 1481 | resolution: {integrity: sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==} 1482 | engines: {node: '>=10'} 1483 | dependencies: 1484 | array-union: 2.1.0 1485 | dir-glob: 3.0.1 1486 | fast-glob: 3.2.12 1487 | ignore: 5.2.0 1488 | merge2: 1.4.1 1489 | slash: 3.0.0 1490 | dev: true 1491 | 1492 | /globrex/0.1.2: 1493 | resolution: {integrity: sha512-uHJgbwAMwNFf5mLst7IWLNg14x1CkeqglJb/K3doi4dw6q2IvAAmM/Y81kevy83wP+Sst+nutFTYOGg3d1lsxg==} 1494 | dev: true 1495 | 1496 | /graceful-fs/4.2.10: 1497 | resolution: {integrity: sha512-9ByhssR2fPVsNZj478qUUbKfmL0+t5BDVyjShtyZZLiK7ZDAArFFfopyOTj0M05wE2tJPisA4iTnnXl2YoPvOA==} 1498 | dev: true 1499 | 1500 | /grapheme-splitter/1.0.4: 1501 | resolution: {integrity: sha512-bzh50DW9kTPM00T8y4o8vQg89Di9oLJVLW/KaOGIXJWP/iqCN6WKYkbNOF04vFLJhwcpYUh9ydh/+5vpOqV4YQ==} 1502 | dev: true 1503 | 1504 | /has-flag/4.0.0: 1505 | resolution: {integrity: sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==} 1506 | engines: {node: '>=8'} 1507 | dev: true 1508 | 1509 | /has-symbols/1.0.3: 1510 | resolution: {integrity: sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==} 1511 | engines: {node: '>= 0.4'} 1512 | dev: true 1513 | 1514 | /has-unicode/2.0.1: 1515 | resolution: {integrity: sha512-8Rf9Y83NBReMnx0gFzA8JImQACstCYWUplepDa9xprwwtmgEZUF0h/i5xSA625zB/I37EtrswSST6OXxwaaIJQ==} 1516 | dev: true 1517 | 1518 | /has/1.0.3: 1519 | resolution: {integrity: sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==} 1520 | engines: {node: '>= 0.4.0'} 1521 | dependencies: 1522 | function-bind: 1.1.1 1523 | dev: true 1524 | 1525 | /https-proxy-agent/5.0.1: 1526 | resolution: {integrity: sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA==} 1527 | engines: {node: '>= 6'} 1528 | dependencies: 1529 | agent-base: 6.0.2 1530 | debug: 4.3.4 1531 | transitivePeerDependencies: 1532 | - supports-color 1533 | dev: true 1534 | 1535 | /ignore/5.2.0: 1536 | resolution: {integrity: sha512-CmxgYGiEPCLhfLnpPp1MoRmifwEIOgjcHXxOBjv7mY96c+eWScsOP9c112ZyLdWHi0FxHjI+4uVhKYp/gcdRmQ==} 1537 | engines: {node: '>= 4'} 1538 | dev: true 1539 | 1540 | /import-fresh/3.3.0: 1541 | resolution: {integrity: sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==} 1542 | engines: {node: '>=6'} 1543 | dependencies: 1544 | parent-module: 1.0.1 1545 | resolve-from: 4.0.0 1546 | dev: true 1547 | 1548 | /imurmurhash/0.1.4: 1549 | resolution: {integrity: sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==} 1550 | engines: {node: '>=0.8.19'} 1551 | dev: true 1552 | 1553 | /inflight/1.0.6: 1554 | resolution: {integrity: sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==} 1555 | dependencies: 1556 | once: 1.4.0 1557 | wrappy: 1.0.2 1558 | dev: true 1559 | 1560 | /inherits/2.0.4: 1561 | resolution: {integrity: sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==} 1562 | dev: true 1563 | 1564 | /is-binary-path/2.1.0: 1565 | resolution: {integrity: sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==} 1566 | engines: {node: '>=8'} 1567 | dependencies: 1568 | binary-extensions: 2.2.0 1569 | dev: true 1570 | 1571 | /is-core-module/2.11.0: 1572 | resolution: {integrity: sha512-RRjxlvLDkD1YJwDbroBHMb+cukurkDWNyHx7D3oNB5x9rb5ogcksMC5wHCadcXoo67gVr/+3GFySh3134zi6rw==} 1573 | dependencies: 1574 | has: 1.0.3 1575 | dev: true 1576 | 1577 | /is-extglob/2.1.1: 1578 | resolution: {integrity: sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==} 1579 | engines: {node: '>=0.10.0'} 1580 | dev: true 1581 | 1582 | /is-fullwidth-code-point/3.0.0: 1583 | resolution: {integrity: sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==} 1584 | engines: {node: '>=8'} 1585 | dev: true 1586 | 1587 | /is-glob/4.0.3: 1588 | resolution: {integrity: sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==} 1589 | engines: {node: '>=0.10.0'} 1590 | dependencies: 1591 | is-extglob: 2.1.1 1592 | dev: true 1593 | 1594 | /is-number/7.0.0: 1595 | resolution: {integrity: sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==} 1596 | engines: {node: '>=0.12.0'} 1597 | dev: true 1598 | 1599 | /is-path-inside/3.0.3: 1600 | resolution: {integrity: sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==} 1601 | engines: {node: '>=8'} 1602 | dev: true 1603 | 1604 | /is-typedarray/1.0.0: 1605 | resolution: {integrity: sha512-cyA56iCMHAh5CdzjJIa4aohJyeO1YbwLi3Jc35MmRU6poroFjIGZzUzupGiRPOjgHg9TLu43xbpwXk523fMxKA==} 1606 | dev: true 1607 | 1608 | /isexe/2.0.0: 1609 | resolution: {integrity: sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==} 1610 | dev: true 1611 | 1612 | /js-sdsl/4.1.5: 1613 | resolution: {integrity: sha512-08bOAKweV2NUC1wqTtf3qZlnpOX/R2DU9ikpjOHs0H+ibQv3zpncVQg6um4uYtRtrwIX8M4Nh3ytK4HGlYAq7Q==} 1614 | dev: true 1615 | 1616 | /js-yaml/4.1.0: 1617 | resolution: {integrity: sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==} 1618 | hasBin: true 1619 | dependencies: 1620 | argparse: 2.0.1 1621 | dev: true 1622 | 1623 | /json-schema-traverse/0.4.1: 1624 | resolution: {integrity: sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==} 1625 | dev: true 1626 | 1627 | /json-stable-stringify-without-jsonify/1.0.1: 1628 | resolution: {integrity: sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==} 1629 | dev: true 1630 | 1631 | /kleur/4.1.5: 1632 | resolution: {integrity: sha512-o+NO+8WrRiQEE4/7nwRJhN1HWpVmJm511pBHUxPLtp0BUISzlBplORYSmTclCnJvQq2tKu/sgl3xVpkc7ZWuQQ==} 1633 | engines: {node: '>=6'} 1634 | dev: true 1635 | 1636 | /levn/0.4.1: 1637 | resolution: {integrity: sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==} 1638 | engines: {node: '>= 0.8.0'} 1639 | dependencies: 1640 | prelude-ls: 1.2.1 1641 | type-check: 0.4.0 1642 | dev: true 1643 | 1644 | /lilconfig/2.0.6: 1645 | resolution: {integrity: sha512-9JROoBW7pobfsx+Sq2JsASvCo6Pfo6WWoUW79HuB1BCoBXD4PLWJPqDF6fNj67pqBYTbAHkE57M1kS/+L1neOg==} 1646 | engines: {node: '>=10'} 1647 | dev: true 1648 | 1649 | /locate-path/6.0.0: 1650 | resolution: {integrity: sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==} 1651 | engines: {node: '>=10'} 1652 | dependencies: 1653 | p-locate: 5.0.0 1654 | dev: true 1655 | 1656 | /lodash.merge/4.6.2: 1657 | resolution: {integrity: sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==} 1658 | dev: true 1659 | 1660 | /lru-cache/6.0.0: 1661 | resolution: {integrity: sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==} 1662 | engines: {node: '>=10'} 1663 | dependencies: 1664 | yallist: 4.0.0 1665 | dev: true 1666 | 1667 | /magic-string/0.25.9: 1668 | resolution: {integrity: sha512-RmF0AsMzgt25qzqqLc1+MbHmhdx0ojF2Fvs4XnOqz2ZOBXzzkEwc/dJQZCYHAn7v1jbVOjAZfK8msRn4BxO4VQ==} 1669 | dependencies: 1670 | sourcemap-codec: 1.4.8 1671 | dev: true 1672 | 1673 | /magic-string/0.26.7: 1674 | resolution: {integrity: sha512-hX9XH3ziStPoPhJxLq1syWuZMxbDvGNbVchfrdCtanC7D13888bMFow61x8axrx+GfHLtVeAx2kxL7tTGRl+Ow==} 1675 | engines: {node: '>=12'} 1676 | dependencies: 1677 | sourcemap-codec: 1.4.8 1678 | dev: true 1679 | 1680 | /make-dir/3.1.0: 1681 | resolution: {integrity: sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==} 1682 | engines: {node: '>=8'} 1683 | dependencies: 1684 | semver: 6.3.0 1685 | dev: true 1686 | 1687 | /merge2/1.4.1: 1688 | resolution: {integrity: sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==} 1689 | engines: {node: '>= 8'} 1690 | dev: true 1691 | 1692 | /micromatch/4.0.5: 1693 | resolution: {integrity: sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==} 1694 | engines: {node: '>=8.6'} 1695 | dependencies: 1696 | braces: 3.0.2 1697 | picomatch: 2.3.1 1698 | dev: true 1699 | 1700 | /mime/3.0.0: 1701 | resolution: {integrity: sha512-jSCU7/VB1loIWBZe14aEYHU/+1UMEHoaO7qxCOVJOw9GgH72VAWppxNcjU+x9a2k3GSIBXNKxXQFqRvvZ7vr3A==} 1702 | engines: {node: '>=10.0.0'} 1703 | hasBin: true 1704 | dev: true 1705 | 1706 | /min-indent/1.0.1: 1707 | resolution: {integrity: sha512-I9jwMn07Sy/IwOj3zVkVik2JTvgpaykDZEigL6Rx6N9LbMywwUSMtxET+7lVoDLLd3O3IXwJwvuuns8UB/HeAg==} 1708 | engines: {node: '>=4'} 1709 | dev: true 1710 | 1711 | /mini-svg-data-uri/1.4.4: 1712 | resolution: {integrity: sha512-r9deDe9p5FJUPZAk3A59wGH7Ii9YrjjWw0jmw/liSbHl2CHiyXj6FcDXDu2K3TjVAXqiJdaw3xxwlZZr9E6nHg==} 1713 | hasBin: true 1714 | dev: true 1715 | 1716 | /minimatch/3.1.2: 1717 | resolution: {integrity: sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==} 1718 | dependencies: 1719 | brace-expansion: 1.1.11 1720 | dev: true 1721 | 1722 | /minimist/1.2.7: 1723 | resolution: {integrity: sha512-bzfL1YUZsP41gmu/qjrEk0Q6i2ix/cVeAhbCbqH9u3zYutS1cLg00qhrD0M2MVdCcx4Sc0UpP2eBWo9rotpq6g==} 1724 | dev: true 1725 | 1726 | /minipass/3.3.4: 1727 | resolution: {integrity: sha512-I9WPbWHCGu8W+6k1ZiGpPu0GkoKBeorkfKNuAFBNS1HNFJvke82sxvI5bzcCNpWPorkOO5QQ+zomzzwRxejXiw==} 1728 | engines: {node: '>=8'} 1729 | dependencies: 1730 | yallist: 4.0.0 1731 | dev: true 1732 | 1733 | /minizlib/2.1.2: 1734 | resolution: {integrity: sha512-bAxsR8BVfj60DWXHE3u30oHzfl4G7khkSuPW+qvpd7jFRHm7dLxOjUk1EHACJ/hxLY8phGJ0YhYHZo7jil7Qdg==} 1735 | engines: {node: '>= 8'} 1736 | dependencies: 1737 | minipass: 3.3.4 1738 | yallist: 4.0.0 1739 | dev: true 1740 | 1741 | /mkdirp/0.5.6: 1742 | resolution: {integrity: sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw==} 1743 | hasBin: true 1744 | dependencies: 1745 | minimist: 1.2.7 1746 | dev: true 1747 | 1748 | /mkdirp/1.0.4: 1749 | resolution: {integrity: sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==} 1750 | engines: {node: '>=10'} 1751 | hasBin: true 1752 | dev: true 1753 | 1754 | /mri/1.2.0: 1755 | resolution: {integrity: sha512-tzzskb3bG8LvYGFF/mDTpq3jpI6Q9wc3LEmBaghu+DdCssd1FakN7Bc0hVNmEyGq1bq3RgfkCb3cmQLpNPOroA==} 1756 | engines: {node: '>=4'} 1757 | dev: true 1758 | 1759 | /mrmime/1.0.1: 1760 | resolution: {integrity: sha512-hzzEagAgDyoU1Q6yg5uI+AorQgdvMCur3FcKf7NhMKWsaYg+RnbTyHRa/9IlLF9rf455MOCtcqqrQQ83pPP7Uw==} 1761 | engines: {node: '>=10'} 1762 | dev: true 1763 | 1764 | /ms/2.0.0: 1765 | resolution: {integrity: sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==} 1766 | dev: true 1767 | 1768 | /ms/2.1.2: 1769 | resolution: {integrity: sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==} 1770 | dev: true 1771 | 1772 | /nanoid/3.3.4: 1773 | resolution: {integrity: sha512-MqBkQh/OHTS2egovRtLk45wEyNXwF+cokD+1YPf9u5VfJiRdAiRwB2froX5Co9Rh20xs4siNPm8naNotSD6RBw==} 1774 | engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1} 1775 | hasBin: true 1776 | dev: true 1777 | 1778 | /natural-compare/1.4.0: 1779 | resolution: {integrity: sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==} 1780 | dev: true 1781 | 1782 | /next-tick/1.1.0: 1783 | resolution: {integrity: sha512-CXdUiJembsNjuToQvxayPZF9Vqht7hewsvy2sOWafLvi2awflj9mOC6bHIg50orX8IJvWKY9wYQ/zB2kogPslQ==} 1784 | dev: true 1785 | 1786 | /node-fetch/2.6.7: 1787 | resolution: {integrity: sha512-ZjMPFEfVx5j+y2yF35Kzx5sF7kDzxuDj6ziH4FFbOp87zKDZNx8yExJIb05OGF4Nlt9IHFIMBkRl41VdvcNdbQ==} 1788 | engines: {node: 4.x || >=6.0.0} 1789 | peerDependencies: 1790 | encoding: ^0.1.0 1791 | peerDependenciesMeta: 1792 | encoding: 1793 | optional: true 1794 | dependencies: 1795 | whatwg-url: 5.0.0 1796 | dev: true 1797 | 1798 | /node-gyp-build/4.5.0: 1799 | resolution: {integrity: sha512-2iGbaQBV+ITgCz76ZEjmhUKAKVf7xfY1sRl4UiKQspfZMH2h06SyhNsnSVy50cwkFQDGLyif6m/6uFXHkOZ6rg==} 1800 | hasBin: true 1801 | dev: true 1802 | 1803 | /node-releases/2.0.6: 1804 | resolution: {integrity: sha512-PiVXnNuFm5+iYkLBNeq5211hvO38y63T0i2KKh2KnUs3RpzJ+JtODFjkD8yjLwnDkTYF1eKXheUwdssR+NRZdg==} 1805 | dev: true 1806 | 1807 | /nopt/5.0.0: 1808 | resolution: {integrity: sha512-Tbj67rffqceeLpcRXrT7vKAN8CwfPeIBgM7E6iBkmKLV7bEMwpGgYLGv0jACUsECaa/vuxP0IjEont6umdMgtQ==} 1809 | engines: {node: '>=6'} 1810 | hasBin: true 1811 | dependencies: 1812 | abbrev: 1.1.1 1813 | dev: true 1814 | 1815 | /normalize-path/3.0.0: 1816 | resolution: {integrity: sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==} 1817 | engines: {node: '>=0.10.0'} 1818 | dev: true 1819 | 1820 | /normalize-range/0.1.2: 1821 | resolution: {integrity: sha512-bdok/XvKII3nUpklnV6P2hxtMNrCboOjAcyBuQnWEhO665FwrSNRxU+AqpsyvO6LgGYPspN+lu5CLtw4jPRKNA==} 1822 | engines: {node: '>=0.10.0'} 1823 | dev: true 1824 | 1825 | /npmlog/5.0.1: 1826 | resolution: {integrity: sha512-AqZtDUWOMKs1G/8lwylVjrdYgqA4d9nu8hc+0gzRxlDb1I10+FHBGMXs6aiQHFdCUUlqH99MUMuLfzWDNDtfxw==} 1827 | dependencies: 1828 | are-we-there-yet: 2.0.0 1829 | console-control-strings: 1.1.0 1830 | gauge: 3.0.2 1831 | set-blocking: 2.0.0 1832 | dev: true 1833 | 1834 | /object-assign/4.1.1: 1835 | resolution: {integrity: sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==} 1836 | engines: {node: '>=0.10.0'} 1837 | dev: true 1838 | 1839 | /object-hash/3.0.0: 1840 | resolution: {integrity: sha512-RSn9F68PjH9HqtltsSnqYC1XXoWe9Bju5+213R98cNGttag9q9yAOTzdbsqvIa7aNm5WffBZFpWYr2aWrklWAw==} 1841 | engines: {node: '>= 6'} 1842 | dev: true 1843 | 1844 | /object-inspect/1.12.2: 1845 | resolution: {integrity: sha512-z+cPxW0QGUp0mcqcsgQyLVRDoXFQbXOwBaqyF7VIgI4TWNQsDHrBpUQslRmIfAoYWdYzs6UlKJtB2XJpTaNSpQ==} 1846 | dev: true 1847 | 1848 | /once/1.4.0: 1849 | resolution: {integrity: sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==} 1850 | dependencies: 1851 | wrappy: 1.0.2 1852 | dev: true 1853 | 1854 | /optionator/0.9.1: 1855 | resolution: {integrity: sha512-74RlY5FCnhq4jRxVUPKDaRwrVNXMqsGsiW6AJw4XK8hmtm10wC0ypZBLw5IIp85NZMr91+qd1RvvENwg7jjRFw==} 1856 | engines: {node: '>= 0.8.0'} 1857 | dependencies: 1858 | deep-is: 0.1.4 1859 | fast-levenshtein: 2.0.6 1860 | levn: 0.4.1 1861 | prelude-ls: 1.2.1 1862 | type-check: 0.4.0 1863 | word-wrap: 1.2.3 1864 | dev: true 1865 | 1866 | /p-limit/3.1.0: 1867 | resolution: {integrity: sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==} 1868 | engines: {node: '>=10'} 1869 | dependencies: 1870 | yocto-queue: 0.1.0 1871 | dev: true 1872 | 1873 | /p-locate/5.0.0: 1874 | resolution: {integrity: sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==} 1875 | engines: {node: '>=10'} 1876 | dependencies: 1877 | p-limit: 3.1.0 1878 | dev: true 1879 | 1880 | /parent-module/1.0.1: 1881 | resolution: {integrity: sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==} 1882 | engines: {node: '>=6'} 1883 | dependencies: 1884 | callsites: 3.1.0 1885 | dev: true 1886 | 1887 | /path-exists/4.0.0: 1888 | resolution: {integrity: sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==} 1889 | engines: {node: '>=8'} 1890 | dev: true 1891 | 1892 | /path-is-absolute/1.0.1: 1893 | resolution: {integrity: sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==} 1894 | engines: {node: '>=0.10.0'} 1895 | dev: true 1896 | 1897 | /path-key/3.1.1: 1898 | resolution: {integrity: sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==} 1899 | engines: {node: '>=8'} 1900 | dev: true 1901 | 1902 | /path-parse/1.0.7: 1903 | resolution: {integrity: sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==} 1904 | dev: true 1905 | 1906 | /path-type/4.0.0: 1907 | resolution: {integrity: sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==} 1908 | engines: {node: '>=8'} 1909 | dev: true 1910 | 1911 | /picocolors/1.0.0: 1912 | resolution: {integrity: sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==} 1913 | dev: true 1914 | 1915 | /picomatch/2.3.1: 1916 | resolution: {integrity: sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==} 1917 | engines: {node: '>=8.6'} 1918 | dev: true 1919 | 1920 | /pify/2.3.0: 1921 | resolution: {integrity: sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog==} 1922 | engines: {node: '>=0.10.0'} 1923 | dev: true 1924 | 1925 | /playwright-core/1.27.1: 1926 | resolution: {integrity: sha512-9EmeXDncC2Pmp/z+teoVYlvmPWUC6ejSSYZUln7YaP89Z6lpAaiaAnqroUt/BoLo8tn7WYShcfaCh+xofZa44Q==} 1927 | engines: {node: '>=14'} 1928 | hasBin: true 1929 | dev: true 1930 | 1931 | /postcss-import/14.1.0_postcss@8.4.18: 1932 | resolution: {integrity: sha512-flwI+Vgm4SElObFVPpTIT7SU7R3qk2L7PyduMcokiaVKuWv9d/U+Gm/QAd8NDLuykTWTkcrjOeD2Pp1rMeBTGw==} 1933 | engines: {node: '>=10.0.0'} 1934 | peerDependencies: 1935 | postcss: ^8.0.0 1936 | dependencies: 1937 | postcss: 8.4.18 1938 | postcss-value-parser: 4.2.0 1939 | read-cache: 1.0.0 1940 | resolve: 1.22.1 1941 | dev: true 1942 | 1943 | /postcss-js/4.0.0_postcss@8.4.18: 1944 | resolution: {integrity: sha512-77QESFBwgX4irogGVPgQ5s07vLvFqWr228qZY+w6lW599cRlK/HmnlivnnVUxkjHnCu4J16PDMHcH+e+2HbvTQ==} 1945 | engines: {node: ^12 || ^14 || >= 16} 1946 | peerDependencies: 1947 | postcss: ^8.3.3 1948 | dependencies: 1949 | camelcase-css: 2.0.1 1950 | postcss: 8.4.18 1951 | dev: true 1952 | 1953 | /postcss-load-config/3.1.4_postcss@8.4.18: 1954 | resolution: {integrity: sha512-6DiM4E7v4coTE4uzA8U//WhtPwyhiim3eyjEMFCnUpzbrkK9wJHgKDT2mR+HbtSrd/NubVaYTOpSpjUl8NQeRg==} 1955 | engines: {node: '>= 10'} 1956 | peerDependencies: 1957 | postcss: '>=8.0.9' 1958 | ts-node: '>=9.0.0' 1959 | peerDependenciesMeta: 1960 | postcss: 1961 | optional: true 1962 | ts-node: 1963 | optional: true 1964 | dependencies: 1965 | lilconfig: 2.0.6 1966 | postcss: 8.4.18 1967 | yaml: 1.10.2 1968 | dev: true 1969 | 1970 | /postcss-load-config/4.0.1_postcss@8.4.18: 1971 | resolution: {integrity: sha512-vEJIc8RdiBRu3oRAI0ymerOn+7rPuMvRXslTvZUKZonDHFIczxztIyJ1urxM1x9JXEikvpWWTUUqal5j/8QgvA==} 1972 | engines: {node: '>= 14'} 1973 | peerDependencies: 1974 | postcss: '>=8.0.9' 1975 | ts-node: '>=9.0.0' 1976 | peerDependenciesMeta: 1977 | postcss: 1978 | optional: true 1979 | ts-node: 1980 | optional: true 1981 | dependencies: 1982 | lilconfig: 2.0.6 1983 | postcss: 8.4.18 1984 | yaml: 2.1.3 1985 | dev: true 1986 | 1987 | /postcss-nested/6.0.0_postcss@8.4.18: 1988 | resolution: {integrity: sha512-0DkamqrPcmkBDsLn+vQDIrtkSbNkv5AD/M322ySo9kqFkCIYklym2xEmWkwo+Y3/qZo34tzEPNUw4y7yMCdv5w==} 1989 | engines: {node: '>=12.0'} 1990 | peerDependencies: 1991 | postcss: ^8.2.14 1992 | dependencies: 1993 | postcss: 8.4.18 1994 | postcss-selector-parser: 6.0.10 1995 | dev: true 1996 | 1997 | /postcss-selector-parser/6.0.10: 1998 | resolution: {integrity: sha512-IQ7TZdoaqbT+LCpShg46jnZVlhWD2w6iQYAcYXfHARZ7X1t/UGhhceQDs5X0cGqKvYlHNOuv7Oa1xmb0oQuA3w==} 1999 | engines: {node: '>=4'} 2000 | dependencies: 2001 | cssesc: 3.0.0 2002 | util-deprecate: 1.0.2 2003 | dev: true 2004 | 2005 | /postcss-value-parser/4.2.0: 2006 | resolution: {integrity: sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==} 2007 | dev: true 2008 | 2009 | /postcss/8.4.18: 2010 | resolution: {integrity: sha512-Wi8mWhncLJm11GATDaQKobXSNEYGUHeQLiQqDFG1qQ5UTDPTEvKw0Xt5NsTpktGTwLps3ByrWsBrG0rB8YQ9oA==} 2011 | engines: {node: ^10 || ^12 || >=14} 2012 | dependencies: 2013 | nanoid: 3.3.4 2014 | picocolors: 1.0.0 2015 | source-map-js: 1.0.2 2016 | dev: true 2017 | 2018 | /prelude-ls/1.2.1: 2019 | resolution: {integrity: sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==} 2020 | engines: {node: '>= 0.8.0'} 2021 | dev: true 2022 | 2023 | /prettier-plugin-svelte/2.8.0_lrllcp5xtrkmmdzifit4hd52ze: 2024 | resolution: {integrity: sha512-QlXv/U3bUszks3XYDPsk1fsaQC+fo2lshwKbcbO+lrSVdJ+40mB1BfL8OCAk1W9y4pJxpqO/4gqm6NtF3zNGCw==} 2025 | peerDependencies: 2026 | prettier: ^1.16.4 || ^2.0.0 2027 | svelte: ^3.2.0 2028 | dependencies: 2029 | prettier: 2.7.1 2030 | svelte: 3.52.0 2031 | dev: true 2032 | 2033 | /prettier/2.7.1: 2034 | resolution: {integrity: sha512-ujppO+MkdPqoVINuDFDRLClm7D78qbDt0/NR+wp5FqEZOoTNAjPHWj17QRhu7geIHJfcNhRk1XVQmF8Bp3ye+g==} 2035 | engines: {node: '>=10.13.0'} 2036 | hasBin: true 2037 | dev: true 2038 | 2039 | /punycode/2.1.1: 2040 | resolution: {integrity: sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==} 2041 | engines: {node: '>=6'} 2042 | dev: true 2043 | 2044 | /qs/6.11.0: 2045 | resolution: {integrity: sha512-MvjoMCJwEarSbUYk5O+nmoSzSutSsTwF85zcHPQ9OrlFoZOYIjaqBAJIqIXjptyD5vThxGq52Xu/MaJzRkIk4Q==} 2046 | engines: {node: '>=0.6'} 2047 | dependencies: 2048 | side-channel: 1.0.4 2049 | dev: true 2050 | 2051 | /queue-microtask/1.2.3: 2052 | resolution: {integrity: sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==} 2053 | dev: true 2054 | 2055 | /quick-lru/5.1.1: 2056 | resolution: {integrity: sha512-WuyALRjWPDGtt/wzJiadO5AXY+8hZ80hVpe6MyivgraREW751X3SbhRvG3eLKOYN+8VEvqLcf3wdnt44Z4S4SA==} 2057 | engines: {node: '>=10'} 2058 | dev: true 2059 | 2060 | /read-cache/1.0.0: 2061 | resolution: {integrity: sha512-Owdv/Ft7IjOgm/i0xvNDZ1LrRANRfew4b2prF3OWMQLxLfu3bS8FVhCsrSCMK4lR56Y9ya+AThoTpDCTxCmpRA==} 2062 | dependencies: 2063 | pify: 2.3.0 2064 | dev: true 2065 | 2066 | /readable-stream/3.6.0: 2067 | resolution: {integrity: sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==} 2068 | engines: {node: '>= 6'} 2069 | dependencies: 2070 | inherits: 2.0.4 2071 | string_decoder: 1.3.0 2072 | util-deprecate: 1.0.2 2073 | dev: true 2074 | 2075 | /readdirp/3.6.0: 2076 | resolution: {integrity: sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==} 2077 | engines: {node: '>=8.10.0'} 2078 | dependencies: 2079 | picomatch: 2.3.1 2080 | dev: true 2081 | 2082 | /regexparam/2.0.1: 2083 | resolution: {integrity: sha512-zRgSaYemnNYxUv+/5SeoHI0eJIgTL/A2pUtXUPLHQxUldagouJ9p+K6IbIZ/JiQuCEv2E2B1O11SjVQy3aMCkw==} 2084 | engines: {node: '>=8'} 2085 | dev: true 2086 | 2087 | /regexpp/3.2.0: 2088 | resolution: {integrity: sha512-pq2bWo9mVD43nbts2wGv17XLiNLya+GklZ8kaDLV2Z08gDCsGpnKn9BFMepvWuHCbyVvY7J5o5+BVvoQbmlJLg==} 2089 | engines: {node: '>=8'} 2090 | dev: true 2091 | 2092 | /resolve-from/4.0.0: 2093 | resolution: {integrity: sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==} 2094 | engines: {node: '>=4'} 2095 | dev: true 2096 | 2097 | /resolve-from/5.0.0: 2098 | resolution: {integrity: sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==} 2099 | engines: {node: '>=8'} 2100 | dev: true 2101 | 2102 | /resolve/1.22.1: 2103 | resolution: {integrity: sha512-nBpuuYuY5jFsli/JIs1oldw6fOQCBioohqWZg/2hiaOybXOft4lonv85uDOKXdf8rhyK159cxU5cDcK/NKk8zw==} 2104 | hasBin: true 2105 | dependencies: 2106 | is-core-module: 2.11.0 2107 | path-parse: 1.0.7 2108 | supports-preserve-symlinks-flag: 1.0.0 2109 | dev: true 2110 | 2111 | /reusify/1.0.4: 2112 | resolution: {integrity: sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==} 2113 | engines: {iojs: '>=1.0.0', node: '>=0.10.0'} 2114 | dev: true 2115 | 2116 | /rimraf/2.7.1: 2117 | resolution: {integrity: sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==} 2118 | hasBin: true 2119 | dependencies: 2120 | glob: 7.2.3 2121 | dev: true 2122 | 2123 | /rimraf/3.0.2: 2124 | resolution: {integrity: sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==} 2125 | hasBin: true 2126 | dependencies: 2127 | glob: 7.2.3 2128 | dev: true 2129 | 2130 | /rollup-pluginutils/2.8.2: 2131 | resolution: {integrity: sha512-EEp9NhnUkwY8aif6bxgovPHMoMoNr2FulJziTndpt5H9RdwC47GSGuII9XxpSdzVGM0GWrNPHV6ie1LTNJPaLQ==} 2132 | dependencies: 2133 | estree-walker: 0.6.1 2134 | dev: true 2135 | 2136 | /rollup/2.79.1: 2137 | resolution: {integrity: sha512-uKxbd0IhMZOhjAiD5oAFp7BqvkA4Dv47qpOCtaNvng4HBwdbWtdOh8f5nZNuk2rp51PMGk3bzfWu5oayNEuYnw==} 2138 | engines: {node: '>=10.0.0'} 2139 | hasBin: true 2140 | optionalDependencies: 2141 | fsevents: 2.3.2 2142 | dev: true 2143 | 2144 | /run-parallel/1.2.0: 2145 | resolution: {integrity: sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==} 2146 | dependencies: 2147 | queue-microtask: 1.2.3 2148 | dev: true 2149 | 2150 | /sade/1.8.1: 2151 | resolution: {integrity: sha512-xal3CZX1Xlo/k4ApwCFrHVACi9fBqJ7V+mwhBsuf/1IOKbBy098Fex+Wa/5QMubw09pSZ/u8EY8PWgevJsXp1A==} 2152 | engines: {node: '>=6'} 2153 | dependencies: 2154 | mri: 1.2.0 2155 | dev: true 2156 | 2157 | /safe-buffer/5.2.1: 2158 | resolution: {integrity: sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==} 2159 | dev: true 2160 | 2161 | /sander/0.5.1: 2162 | resolution: {integrity: sha512-3lVqBir7WuKDHGrKRDn/1Ye3kwpXaDOMsiRP1wd6wpZW56gJhsbp5RqQpA6JG/P+pkXizygnr1dKR8vzWaVsfA==} 2163 | dependencies: 2164 | es6-promise: 3.3.1 2165 | graceful-fs: 4.2.10 2166 | mkdirp: 0.5.6 2167 | rimraf: 2.7.1 2168 | dev: true 2169 | 2170 | /semver/6.3.0: 2171 | resolution: {integrity: sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==} 2172 | hasBin: true 2173 | dev: true 2174 | 2175 | /semver/7.3.8: 2176 | resolution: {integrity: sha512-NB1ctGL5rlHrPJtFDVIVzTyQylMLu9N9VICA6HSFJo8MCGVTMW6gfpicwKmmK/dAjTOrqu5l63JJOpDSrAis3A==} 2177 | engines: {node: '>=10'} 2178 | hasBin: true 2179 | dependencies: 2180 | lru-cache: 6.0.0 2181 | dev: true 2182 | 2183 | /set-blocking/2.0.0: 2184 | resolution: {integrity: sha512-KiKBS8AnWGEyLzofFfmvKwpdPzqiy16LvQfK3yv/fVH7Bj13/wl3JSR1J+rfgRE9q7xUJK4qvgS8raSOeLUehw==} 2185 | dev: true 2186 | 2187 | /set-cookie-parser/2.5.1: 2188 | resolution: {integrity: sha512-1jeBGaKNGdEq4FgIrORu/N570dwoPYio8lSoYLWmX7sQ//0JY08Xh9o5pBcgmHQ/MbsYp/aZnOe1s1lIsbLprQ==} 2189 | dev: true 2190 | 2191 | /shebang-command/2.0.0: 2192 | resolution: {integrity: sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==} 2193 | engines: {node: '>=8'} 2194 | dependencies: 2195 | shebang-regex: 3.0.0 2196 | dev: true 2197 | 2198 | /shebang-regex/3.0.0: 2199 | resolution: {integrity: sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==} 2200 | engines: {node: '>=8'} 2201 | dev: true 2202 | 2203 | /side-channel/1.0.4: 2204 | resolution: {integrity: sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw==} 2205 | dependencies: 2206 | call-bind: 1.0.2 2207 | get-intrinsic: 1.1.3 2208 | object-inspect: 1.12.2 2209 | dev: true 2210 | 2211 | /signal-exit/3.0.7: 2212 | resolution: {integrity: sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==} 2213 | dev: true 2214 | 2215 | /sirv/2.0.2: 2216 | resolution: {integrity: sha512-4Qog6aE29nIjAOKe/wowFTxOdmbEZKb+3tsLljaBRzJwtqto0BChD2zzH0LhgCSXiI+V7X+Y45v14wBZQ1TK3w==} 2217 | engines: {node: '>= 10'} 2218 | dependencies: 2219 | '@polka/url': 1.0.0-next.21 2220 | mrmime: 1.0.1 2221 | totalist: 3.0.0 2222 | dev: true 2223 | 2224 | /slash/3.0.0: 2225 | resolution: {integrity: sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==} 2226 | engines: {node: '>=8'} 2227 | dev: true 2228 | 2229 | /sorcery/0.10.0: 2230 | resolution: {integrity: sha512-R5ocFmKZQFfSTstfOtHjJuAwbpGyf9qjQa1egyhvXSbM7emjrtLXtGdZsDJDABC85YBfVvrOiGWKSYXPKdvP1g==} 2231 | hasBin: true 2232 | dependencies: 2233 | buffer-crc32: 0.2.13 2234 | minimist: 1.2.7 2235 | sander: 0.5.1 2236 | sourcemap-codec: 1.4.8 2237 | dev: true 2238 | 2239 | /source-map-js/1.0.2: 2240 | resolution: {integrity: sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw==} 2241 | engines: {node: '>=0.10.0'} 2242 | dev: true 2243 | 2244 | /sourcemap-codec/1.4.8: 2245 | resolution: {integrity: sha512-9NykojV5Uih4lgo5So5dtw+f0JgJX30KCNI8gwhz2J9A15wD0Ml6tjHKwf6fTSa6fAdVBdZeNOs9eJ71qCk8vA==} 2246 | dev: true 2247 | 2248 | /streamsearch/1.1.0: 2249 | resolution: {integrity: sha512-Mcc5wHehp9aXz1ax6bZUyY5afg9u2rv5cqQI3mRrYkGC8rW2hM02jWuwjtL++LS5qinSyhj2QfLyNsuc+VsExg==} 2250 | engines: {node: '>=10.0.0'} 2251 | dev: true 2252 | 2253 | /string-width/4.2.3: 2254 | resolution: {integrity: sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==} 2255 | engines: {node: '>=8'} 2256 | dependencies: 2257 | emoji-regex: 8.0.0 2258 | is-fullwidth-code-point: 3.0.0 2259 | strip-ansi: 6.0.1 2260 | dev: true 2261 | 2262 | /string_decoder/1.3.0: 2263 | resolution: {integrity: sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==} 2264 | dependencies: 2265 | safe-buffer: 5.2.1 2266 | dev: true 2267 | 2268 | /strip-ansi/6.0.1: 2269 | resolution: {integrity: sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==} 2270 | engines: {node: '>=8'} 2271 | dependencies: 2272 | ansi-regex: 5.0.1 2273 | dev: true 2274 | 2275 | /strip-indent/3.0.0: 2276 | resolution: {integrity: sha512-laJTa3Jb+VQpaC6DseHhF7dXVqHTfJPCRDaEbid/drOhgitgYku/letMUqOXFoWV0zIIUbjpdH2t+tYj4bQMRQ==} 2277 | engines: {node: '>=8'} 2278 | dependencies: 2279 | min-indent: 1.0.1 2280 | dev: true 2281 | 2282 | /strip-json-comments/3.1.1: 2283 | resolution: {integrity: sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==} 2284 | engines: {node: '>=8'} 2285 | dev: true 2286 | 2287 | /stripe/10.15.0: 2288 | resolution: {integrity: sha512-KXw7dozfIEQCxsshjKUwsNwlD55CkhcvVgwwxFtQNikVlRpNUPy6Ljz2mN9OXjinbbmLIcn26MAiPxfNp8Adtg==} 2289 | engines: {node: ^8.1 || >=10.*} 2290 | dependencies: 2291 | '@types/node': 18.11.7 2292 | qs: 6.11.0 2293 | dev: true 2294 | 2295 | /supports-color/7.2.0: 2296 | resolution: {integrity: sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==} 2297 | engines: {node: '>=8'} 2298 | dependencies: 2299 | has-flag: 4.0.0 2300 | dev: true 2301 | 2302 | /supports-preserve-symlinks-flag/1.0.0: 2303 | resolution: {integrity: sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==} 2304 | engines: {node: '>= 0.4'} 2305 | dev: true 2306 | 2307 | /svelte-check/2.9.2_xyvwwpusdp7eiuesisaivc7wmm: 2308 | resolution: {integrity: sha512-DRi8HhnCiqiGR2YF9ervPGvtoYrheE09cXieCTEqeTPOTJzfoa54Py8rovIBv4bH4n5HgZYIyTQ3DDLHQLl2uQ==} 2309 | hasBin: true 2310 | peerDependencies: 2311 | svelte: ^3.24.0 2312 | dependencies: 2313 | '@jridgewell/trace-mapping': 0.3.17 2314 | chokidar: 3.5.3 2315 | fast-glob: 3.2.12 2316 | import-fresh: 3.3.0 2317 | picocolors: 1.0.0 2318 | sade: 1.8.1 2319 | svelte: 3.52.0 2320 | svelte-preprocess: 4.10.7_4n3z2octtzg5pdokl7pjruqnki 2321 | typescript: 4.8.4 2322 | transitivePeerDependencies: 2323 | - '@babel/core' 2324 | - coffeescript 2325 | - less 2326 | - node-sass 2327 | - postcss 2328 | - postcss-load-config 2329 | - pug 2330 | - sass 2331 | - stylus 2332 | - sugarss 2333 | dev: true 2334 | 2335 | /svelte-hmr/0.15.0_svelte@3.52.0: 2336 | resolution: {integrity: sha512-Aw21SsyoohyVn4yiKXWPNCSW2DQNH/76kvUnE9kpt4h9hcg9tfyQc6xshx9hzgMfGF0kVx0EGD8oBMWSnATeOg==} 2337 | engines: {node: ^12.20 || ^14.13.1 || >= 16} 2338 | peerDependencies: 2339 | svelte: '>=3.19.0' 2340 | dependencies: 2341 | svelte: 3.52.0 2342 | dev: true 2343 | 2344 | /svelte-loading-spinners/0.3.4: 2345 | resolution: {integrity: sha512-vKaW71QMCBcTNijAGc0mUl8k3DQ66iYmp6MB8BMGCXyWk82bTrcLy8FOnSm9fE+8q6TwzD6PLUoYFHt0II93Xw==} 2346 | dev: true 2347 | 2348 | /svelte-preprocess/4.10.7_4n3z2octtzg5pdokl7pjruqnki: 2349 | resolution: {integrity: sha512-sNPBnqYD6FnmdBrUmBCaqS00RyCsCpj2BG58A1JBswNF7b0OKviwxqVrOL/CKyJrLSClrSeqQv5BXNg2RUbPOw==} 2350 | engines: {node: '>= 9.11.2'} 2351 | requiresBuild: true 2352 | peerDependencies: 2353 | '@babel/core': ^7.10.2 2354 | coffeescript: ^2.5.1 2355 | less: ^3.11.3 || ^4.0.0 2356 | node-sass: '*' 2357 | postcss: ^7 || ^8 2358 | postcss-load-config: ^2.1.0 || ^3.0.0 || ^4.0.0 2359 | pug: ^3.0.0 2360 | sass: ^1.26.8 2361 | stylus: ^0.55.0 2362 | sugarss: ^2.0.0 2363 | svelte: ^3.23.0 2364 | typescript: ^3.9.5 || ^4.0.0 2365 | peerDependenciesMeta: 2366 | '@babel/core': 2367 | optional: true 2368 | coffeescript: 2369 | optional: true 2370 | less: 2371 | optional: true 2372 | node-sass: 2373 | optional: true 2374 | postcss: 2375 | optional: true 2376 | postcss-load-config: 2377 | optional: true 2378 | pug: 2379 | optional: true 2380 | sass: 2381 | optional: true 2382 | stylus: 2383 | optional: true 2384 | sugarss: 2385 | optional: true 2386 | typescript: 2387 | optional: true 2388 | dependencies: 2389 | '@types/pug': 2.0.6 2390 | '@types/sass': 1.43.1 2391 | detect-indent: 6.1.0 2392 | magic-string: 0.25.9 2393 | postcss: 8.4.18 2394 | postcss-load-config: 4.0.1_postcss@8.4.18 2395 | sorcery: 0.10.0 2396 | strip-indent: 3.0.0 2397 | svelte: 3.52.0 2398 | typescript: 4.8.4 2399 | dev: true 2400 | 2401 | /svelte/3.52.0: 2402 | resolution: {integrity: sha512-FxcnEUOAVfr10vDU5dVgJN19IvqeHQCS1zfe8vayTfis9A2t5Fhx+JDe5uv/C3j//bB1umpLJ6quhgs9xyUbCQ==} 2403 | engines: {node: '>= 8'} 2404 | dev: true 2405 | 2406 | /tailwindcss/3.2.1_postcss@8.4.18: 2407 | resolution: {integrity: sha512-Uw+GVSxp5CM48krnjHObqoOwlCt5Qo6nw1jlCRwfGy68dSYb/LwS9ZFidYGRiM+w6rMawkZiu1mEMAsHYAfoLg==} 2408 | engines: {node: '>=12.13.0'} 2409 | hasBin: true 2410 | peerDependencies: 2411 | postcss: ^8.0.9 2412 | dependencies: 2413 | arg: 5.0.2 2414 | chokidar: 3.5.3 2415 | color-name: 1.1.4 2416 | detective: 5.2.1 2417 | didyoumean: 1.2.2 2418 | dlv: 1.1.3 2419 | fast-glob: 3.2.12 2420 | glob-parent: 6.0.2 2421 | is-glob: 4.0.3 2422 | lilconfig: 2.0.6 2423 | micromatch: 4.0.5 2424 | normalize-path: 3.0.0 2425 | object-hash: 3.0.0 2426 | picocolors: 1.0.0 2427 | postcss: 8.4.18 2428 | postcss-import: 14.1.0_postcss@8.4.18 2429 | postcss-js: 4.0.0_postcss@8.4.18 2430 | postcss-load-config: 3.1.4_postcss@8.4.18 2431 | postcss-nested: 6.0.0_postcss@8.4.18 2432 | postcss-selector-parser: 6.0.10 2433 | postcss-value-parser: 4.2.0 2434 | quick-lru: 5.1.1 2435 | resolve: 1.22.1 2436 | transitivePeerDependencies: 2437 | - ts-node 2438 | dev: true 2439 | 2440 | /tar/6.1.12: 2441 | resolution: {integrity: sha512-jU4TdemS31uABHd+Lt5WEYJuzn+TJTCBLljvIAHZOz6M9Os5pJ4dD+vRFLxPa/n3T0iEFzpi+0x1UfuDZYbRMw==} 2442 | engines: {node: '>=10'} 2443 | dependencies: 2444 | chownr: 2.0.0 2445 | fs-minipass: 2.1.0 2446 | minipass: 3.3.4 2447 | minizlib: 2.1.2 2448 | mkdirp: 1.0.4 2449 | yallist: 4.0.0 2450 | dev: true 2451 | 2452 | /text-table/0.2.0: 2453 | resolution: {integrity: sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==} 2454 | dev: true 2455 | 2456 | /tiny-glob/0.2.9: 2457 | resolution: {integrity: sha512-g/55ssRPUjShh+xkfx9UPDXqhckHEsHr4Vd9zX55oSdGZc/MD0m3sferOkwWtp98bv+kcVfEHtRJgBVJzelrzg==} 2458 | dependencies: 2459 | globalyzer: 0.1.0 2460 | globrex: 0.1.2 2461 | dev: true 2462 | 2463 | /to-regex-range/5.0.1: 2464 | resolution: {integrity: sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==} 2465 | engines: {node: '>=8.0'} 2466 | dependencies: 2467 | is-number: 7.0.0 2468 | dev: true 2469 | 2470 | /totalist/3.0.0: 2471 | resolution: {integrity: sha512-eM+pCBxXO/njtF7vdFsHuqb+ElbxqtI4r5EAvk6grfAFyJ6IvWlSkfZ5T9ozC6xWw3Fj1fGoSmrl0gUs46JVIw==} 2472 | engines: {node: '>=6'} 2473 | dev: true 2474 | 2475 | /tr46/0.0.3: 2476 | resolution: {integrity: sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==} 2477 | dev: true 2478 | 2479 | /tslib/1.14.1: 2480 | resolution: {integrity: sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==} 2481 | dev: true 2482 | 2483 | /tslib/2.4.0: 2484 | resolution: {integrity: sha512-d6xOpEDfsi2CZVlPQzGeux8XMwLT9hssAsaPYExaQMuYskwb+x1x7J371tWlbBdWHroy99KnVB6qIkUbs5X3UQ==} 2485 | dev: true 2486 | 2487 | /tsutils/3.21.0_typescript@4.8.4: 2488 | resolution: {integrity: sha512-mHKK3iUXL+3UF6xL5k0PEhKRUBKPBCv/+RkEOpjRWxxx27KKRBmmA60A9pgOUvMi8GKhRMPEmjBRPzs2W7O1OA==} 2489 | engines: {node: '>= 6'} 2490 | peerDependencies: 2491 | typescript: '>=2.8.0 || >= 3.2.0-dev || >= 3.3.0-dev || >= 3.4.0-dev || >= 3.5.0-dev || >= 3.6.0-dev || >= 3.6.0-beta || >= 3.7.0-dev || >= 3.7.0-beta' 2492 | dependencies: 2493 | tslib: 1.14.1 2494 | typescript: 4.8.4 2495 | dev: true 2496 | 2497 | /type-check/0.4.0: 2498 | resolution: {integrity: sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==} 2499 | engines: {node: '>= 0.8.0'} 2500 | dependencies: 2501 | prelude-ls: 1.2.1 2502 | dev: true 2503 | 2504 | /type-fest/0.20.2: 2505 | resolution: {integrity: sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==} 2506 | engines: {node: '>=10'} 2507 | dev: true 2508 | 2509 | /type/1.2.0: 2510 | resolution: {integrity: sha512-+5nt5AAniqsCnu2cEQQdpzCAh33kVx8n0VoFidKpB1dVVLAN/F+bgVOqOJqOnEnrhp222clB5p3vUlD+1QAnfg==} 2511 | dev: true 2512 | 2513 | /type/2.7.2: 2514 | resolution: {integrity: sha512-dzlvlNlt6AXU7EBSfpAscydQ7gXB+pPGsPnfJnZpiNJBDj7IaJzQlBZYGdEi4R9HmPdBv2XmWJ6YUtoTa7lmCw==} 2515 | dev: true 2516 | 2517 | /typedarray-to-buffer/3.1.5: 2518 | resolution: {integrity: sha512-zdu8XMNEDepKKR+XYOXAVPtWui0ly0NtohUscw+UmaHiAWT8hrV1rr//H6V+0DvJ3OQ19S979M0laLfX8rm82Q==} 2519 | dependencies: 2520 | is-typedarray: 1.0.0 2521 | dev: true 2522 | 2523 | /typescript/4.8.4: 2524 | resolution: {integrity: sha512-QCh+85mCy+h0IGff8r5XWzOVSbBO+KfeYrMQh7NJ58QujwcE22u+NUSmUxqF+un70P9GXKxa2HCNiTTMJknyjQ==} 2525 | engines: {node: '>=4.2.0'} 2526 | hasBin: true 2527 | dev: true 2528 | 2529 | /undici/5.12.0: 2530 | resolution: {integrity: sha512-zMLamCG62PGjd9HHMpo05bSLvvwWOZgGeiWlN/vlqu3+lRo3elxktVGEyLMX+IO7c2eflLjcW74AlkhEZm15mg==} 2531 | engines: {node: '>=12.18'} 2532 | dependencies: 2533 | busboy: 1.6.0 2534 | dev: true 2535 | 2536 | /update-browserslist-db/1.0.10_browserslist@4.21.4: 2537 | resolution: {integrity: sha512-OztqDenkfFkbSG+tRxBeAnCVPckDBcvibKd35yDONx6OU8N7sqgwc7rCbkJ/WcYtVRZ4ba68d6byhC21GFh7sQ==} 2538 | hasBin: true 2539 | peerDependencies: 2540 | browserslist: '>= 4.21.0' 2541 | dependencies: 2542 | browserslist: 4.21.4 2543 | escalade: 3.1.1 2544 | picocolors: 1.0.0 2545 | dev: true 2546 | 2547 | /uri-js/4.4.1: 2548 | resolution: {integrity: sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==} 2549 | dependencies: 2550 | punycode: 2.1.1 2551 | dev: true 2552 | 2553 | /utf-8-validate/5.0.10: 2554 | resolution: {integrity: sha512-Z6czzLq4u8fPOyx7TU6X3dvUZVvoJmxSQ+IcrlmagKhilxlhZgxPK6C5Jqbkw1IDUmFTM+cz9QDnnLTwDz/2gQ==} 2555 | engines: {node: '>=6.14.2'} 2556 | requiresBuild: true 2557 | dependencies: 2558 | node-gyp-build: 4.5.0 2559 | dev: true 2560 | 2561 | /util-deprecate/1.0.2: 2562 | resolution: {integrity: sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==} 2563 | dev: true 2564 | 2565 | /vite/3.2.1: 2566 | resolution: {integrity: sha512-ADtMkfHuWq4tskJsri2n2FZkORO8ZyhI+zIz7zTrDAgDEtct1jdxOg3YsZBfHhKjmMoWLOSCr+64qrEDGo/DbQ==} 2567 | engines: {node: ^14.18.0 || >=16.0.0} 2568 | hasBin: true 2569 | peerDependencies: 2570 | less: '*' 2571 | sass: '*' 2572 | stylus: '*' 2573 | sugarss: '*' 2574 | terser: ^5.4.0 2575 | peerDependenciesMeta: 2576 | less: 2577 | optional: true 2578 | sass: 2579 | optional: true 2580 | stylus: 2581 | optional: true 2582 | sugarss: 2583 | optional: true 2584 | terser: 2585 | optional: true 2586 | dependencies: 2587 | esbuild: 0.15.12 2588 | postcss: 8.4.18 2589 | resolve: 1.22.1 2590 | rollup: 2.79.1 2591 | optionalDependencies: 2592 | fsevents: 2.3.2 2593 | dev: true 2594 | 2595 | /webidl-conversions/3.0.1: 2596 | resolution: {integrity: sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==} 2597 | dev: true 2598 | 2599 | /websocket/1.0.34: 2600 | resolution: {integrity: sha512-PRDso2sGwF6kM75QykIesBijKSVceR6jL2G8NGYyq2XrItNC2P5/qL5XeR056GhA+Ly7JMFvJb9I312mJfmqnQ==} 2601 | engines: {node: '>=4.0.0'} 2602 | dependencies: 2603 | bufferutil: 4.0.7 2604 | debug: 2.6.9 2605 | es5-ext: 0.10.62 2606 | typedarray-to-buffer: 3.1.5 2607 | utf-8-validate: 5.0.10 2608 | yaeti: 0.0.6 2609 | transitivePeerDependencies: 2610 | - supports-color 2611 | dev: true 2612 | 2613 | /whatwg-url/5.0.0: 2614 | resolution: {integrity: sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==} 2615 | dependencies: 2616 | tr46: 0.0.3 2617 | webidl-conversions: 3.0.1 2618 | dev: true 2619 | 2620 | /which/2.0.2: 2621 | resolution: {integrity: sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==} 2622 | engines: {node: '>= 8'} 2623 | hasBin: true 2624 | dependencies: 2625 | isexe: 2.0.0 2626 | dev: true 2627 | 2628 | /wide-align/1.1.5: 2629 | resolution: {integrity: sha512-eDMORYaPNZ4sQIuuYPDHdQvf4gyCF9rEEV/yPxGfwPkRodwEgiMUUXTx/dex+Me0wxx53S+NgUHaP7y3MGlDmg==} 2630 | dependencies: 2631 | string-width: 4.2.3 2632 | dev: true 2633 | 2634 | /word-wrap/1.2.3: 2635 | resolution: {integrity: sha512-Hz/mrNwitNRh/HUAtM/VT/5VH+ygD6DV7mYKZAtHOrbs8U7lvPS6xf7EJKMF0uW1KJCl0H701g3ZGus+muE5vQ==} 2636 | engines: {node: '>=0.10.0'} 2637 | dev: true 2638 | 2639 | /worktop/0.8.0-next.14: 2640 | resolution: {integrity: sha512-RZgqHu1w/JcUdWOE/BUEAzarrUUHh39eWkLdX8XpA6MfgLJF6X5Vl26CV7/wcm4O/UpZvHMGJUtB9eYTqDjc9g==} 2641 | engines: {node: '>=12'} 2642 | dependencies: 2643 | mrmime: 1.0.1 2644 | regexparam: 2.0.1 2645 | dev: true 2646 | 2647 | /wrappy/1.0.2: 2648 | resolution: {integrity: sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==} 2649 | dev: true 2650 | 2651 | /xtend/4.0.2: 2652 | resolution: {integrity: sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==} 2653 | engines: {node: '>=0.4'} 2654 | dev: true 2655 | 2656 | /yaeti/0.0.6: 2657 | resolution: {integrity: sha512-MvQa//+KcZCUkBTIC9blM+CU9J2GzuTytsOUwf2lidtvkx/6gnEp1QvJv34t9vdjhFmha/mUiNDbN0D0mJWdug==} 2658 | engines: {node: '>=0.10.32'} 2659 | dev: true 2660 | 2661 | /yallist/4.0.0: 2662 | resolution: {integrity: sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==} 2663 | dev: true 2664 | 2665 | /yaml/1.10.2: 2666 | resolution: {integrity: sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg==} 2667 | engines: {node: '>= 6'} 2668 | dev: true 2669 | 2670 | /yaml/2.1.3: 2671 | resolution: {integrity: sha512-AacA8nRULjKMX2DvWvOAdBZMOfQlypSFkjcOcu9FalllIDJ1kvlREzcdIZmidQUqqeMv7jorHjq2HlLv/+c2lg==} 2672 | engines: {node: '>= 14'} 2673 | dev: true 2674 | 2675 | /yocto-queue/0.1.0: 2676 | resolution: {integrity: sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==} 2677 | engines: {node: '>=10'} 2678 | dev: true 2679 | -------------------------------------------------------------------------------- /postcss.config.cjs: -------------------------------------------------------------------------------- 1 | const tailwindcss = require('tailwindcss'); 2 | const autoprefixer = require('autoprefixer'); 3 | 4 | const config = { 5 | plugins: [ 6 | //Some plugins, like tailwindcss/nesting, need to run before Tailwind, 7 | tailwindcss(), 8 | //But others, like autoprefixer, need to run after, 9 | autoprefixer 10 | ] 11 | }; 12 | 13 | module.exports = config; 14 | -------------------------------------------------------------------------------- /src/app.d.ts: -------------------------------------------------------------------------------- 1 | // See https://kit.svelte.dev/docs/types#app 2 | // for information about these interfaces 3 | // and what to do when importing types 4 | declare namespace App { 5 | interface Supabase { 6 | Database: import('./DatabaseDefinitions').Database; 7 | SchemaName: 'public'; 8 | } 9 | 10 | // interface Locals {} 11 | interface PageData { 12 | session: import('@supabase/supabase-js').Session | null; 13 | } 14 | } 15 | -------------------------------------------------------------------------------- /src/app.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | %sveltekit.head% 8 | 9 | 10 |
%sveltekit.body%
11 | 12 | 13 | -------------------------------------------------------------------------------- /src/app.postcss: -------------------------------------------------------------------------------- 1 | @tailwind base; 2 | @tailwind components; 3 | @tailwind utilities; 4 | 5 | .glass { 6 | @apply bg-opacity-60 dark:bg-opacity-60 backdrop-filter backdrop-blur-lg 7 | } 8 | html, 9 | body { 10 | @apply h-full overflow-hidden; 11 | } 12 | 13 | .card { 14 | @apply bg-white p-5 rounded-xl glass; 15 | /* @apply bg-[conic-gradient(at_bottom_left,_var(--tw-gradient-stops))] from-primary-100 via-surface-400 to-blue-200; */ 16 | } 17 | h1 { 18 | @apply text-3xl m-2 text-center 19 | } 20 | 21 | .btn, 22 | .btn-icon { 23 | @apply font-bold rounded-xl ; 24 | } 25 | .btn-filled-primary, 26 | .btn-filled-accent, 27 | .btn-filled-warning, 28 | .btn-filled-surface { 29 | @apply text-white; 30 | } 31 | -------------------------------------------------------------------------------- /src/hooks.client.ts: -------------------------------------------------------------------------------- 1 | import '$lib/db'; 2 | 3 | -------------------------------------------------------------------------------- /src/hooks.server.ts: -------------------------------------------------------------------------------- 1 | import '$lib/db'; 2 | 3 | -------------------------------------------------------------------------------- /src/lib/components/Pricing.svelte: -------------------------------------------------------------------------------- 1 | 13 | 14 | 15 |
16 | 17 | {#each Object.entries(products) as [interval, prices]} 18 | 19 | {intervals[interval]} 20 | 21 | {/each} 22 | 23 |
24 | {#each Object.entries(products) as [interval, prices]} 25 | {#if $storeTab === interval} 26 | {#each prices.sort((a, b) => a.unit_amount - b.unit_amount) as price} 27 | 28 | {/each} 29 | {/if} 30 | {/each} 31 |
32 |
33 | 34 | -------------------------------------------------------------------------------- /src/lib/components/PricingCard.svelte: -------------------------------------------------------------------------------- 1 | 26 | 27 |
28 |

{price.product.name}

29 |

{price?.product.description}

30 |
31 | {currencies[price.currency]}{price.unit_amount/100} 32 | /{price.recurring.interval} 33 |
34 | 35 | 43 |
44 | 45 | 46 |
47 |
48 | -------------------------------------------------------------------------------- /src/lib/components/Spinner.svelte: -------------------------------------------------------------------------------- 1 | 5 | 6 |
7 | Loading data... 8 | 9 |
10 | -------------------------------------------------------------------------------- /src/lib/components/common/NavBar.svelte: -------------------------------------------------------------------------------- 1 | 23 | 24 | 25 | 26 | 27 | 28 | {SITE_NAME} 29 | 30 | 31 | 32 | {#if !$page.url.pathname.startsWith('/dashboard')} 33 | 36 | 37 | {/if} 38 | 39 |
40 | 41 | 42 | {#if $page.data.session?.user && $page.url.pathname.startsWith('/dashboard')} 43 | 50 | {#if $page.data.session} 51 |
52 | 53 |
54 | {/if} 55 | {:else} 56 | 57 | 58 | 59 | 60 | 61 | 62 | {/if} 63 |
64 |
65 |
66 | {#if $page.data.session?.user && $page.url.pathname.startsWith('/dashboard')} 67 | 68 | {/if} -------------------------------------------------------------------------------- /src/lib/components/private/QuickLinks.svelte: -------------------------------------------------------------------------------- 1 |
2 | Home 3 | Profile 4 | Subscriptions 5 |
6 | -------------------------------------------------------------------------------- /src/lib/db.ts: -------------------------------------------------------------------------------- 1 | import { createClient } from '@supabase/auth-helpers-sveltekit'; 2 | import { PUBLIC_SUPABASE_URL, PUBLIC_SUPABASE_ANON_KEY } from '$env/static/public'; 3 | import type { Database } from '../..DatabaseDefinitions' 4 | 5 | export const supabaseClient = createClient( 6 | PUBLIC_SUPABASE_URL, 7 | PUBLIC_SUPABASE_ANON_KEY 8 | ); -------------------------------------------------------------------------------- /src/lib/stores.ts: -------------------------------------------------------------------------------- 1 | import { writable } from "svelte/store"; 2 | import type { Writable } from "svelte/store"; 3 | 4 | export let loading: Writable = writable(false) 5 | export let priceStore = writable({}); 6 | -------------------------------------------------------------------------------- /src/lib/utils/groupBy.js: -------------------------------------------------------------------------------- 1 | export const groupPricesByProducts = function (prices) { 2 | return prices 3 | .filter((e) => e.product.active) 4 | .reduce(function (product, price) { 5 | (product[price['product']['id']] = product[price['product']['id']] || []).push(price); 6 | return product; 7 | }, {}); 8 | }; 9 | 10 | export const groupProductsByInterval = function (prices) { 11 | return prices.reduce(function (product, price) { 12 | (product[price['recurring']['interval']] = product[price['recurring']['interval']] || []).push( 13 | price 14 | ); 15 | return product; 16 | }, {}); 17 | }; 18 | -------------------------------------------------------------------------------- /src/lib/utils/loader.js: -------------------------------------------------------------------------------- 1 | import Spinner from '../components/Spinner.svelte'; 2 | 3 | export const loader = (node, loading) => { 4 | let Spin; 5 | const unsubscribe = loading.subscribe((loading) => { 6 | if (loading) { 7 | Spin = new Spinner({ 8 | target: node, 9 | intro: true 10 | }); 11 | } else { 12 | if (Spin) { 13 | Spin?.$destroy?.(); 14 | Spin = undefined; 15 | } 16 | } 17 | }); 18 | }; 19 | -------------------------------------------------------------------------------- /src/lib/utils/siteConfig.js: -------------------------------------------------------------------------------- 1 | export const SITE_NAME = 'Svelte Saas Kit'; 2 | export const SITE_TAG_LINE = 'The fastest way to build sveltekit SaaS apps.'; 3 | export const SITE_DESCRIPTION = 4 | 'SvelteKit SaaS starter is a template for building SaaS apps with SvelteKit using Stripe for payments, Supabase for database and auth.'; 5 | export const SITE_PRIMARY_NAV = { 6 | Dashboard: { path: '/dashboard' }, 7 | Pricing: { path: '/pricing' } 8 | }; 9 | 10 | export const PRICING_TAGLINE = 'Designed for business teams like yours'; 11 | export const PRICING_DESCRIPTION = 'Choose the plan that best suits your needs.'; 12 | -------------------------------------------------------------------------------- /src/routes/(app)/+layout.svelte: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /src/routes/(app)/+layout.ts: -------------------------------------------------------------------------------- 1 | import type { LayoutLoad, LayoutLoadEvent } from './$types'; 2 | import { getSupabase } from '@supabase/auth-helpers-sveltekit'; 3 | // @ts-ignore 4 | import { redirect } from '@sveltejs/kit'; 5 | 6 | export const load: LayoutLoad = async (event: LayoutLoadEvent) => { 7 | const { session } = await getSupabase(event); 8 | if (!session) { 9 | throw redirect(303, '/auth'); 10 | } 11 | return { 12 | user: session.user, 13 | }; 14 | }; 15 | -------------------------------------------------------------------------------- /src/routes/(app)/dashboard/+page.svelte: -------------------------------------------------------------------------------- 1 | 7 | 8 |
9 |
Protected content for {user.email}
10 |

server-side fetched data with RLS:

11 |
12 |
13 |

user:

14 |
{JSON.stringify(user, null, 2)}
15 |
-------------------------------------------------------------------------------- /src/routes/(app)/dashboard/settings/+page.server.ts: -------------------------------------------------------------------------------- 1 | import { getServerSession, getSupabase } from '@supabase/auth-helpers-sveltekit'; 2 | import type { Actions } from './$types'; 3 | 4 | export const actions: Actions = { 5 | default: async (event) => { 6 | const session = await getServerSession(event) 7 | const formData = await event.request.formData(); 8 | const full_name = formData.get('full_name'); 9 | const username = formData.get('username'); 10 | const { supabaseClient } = await getSupabase(event); 11 | const {data, error} = await supabaseClient 12 | .from('profiles') 13 | .update({full_name: full_name, username: username}) 14 | .eq('id', session?.user.id) 15 | return { success: true }; 16 | } 17 | }; -------------------------------------------------------------------------------- /src/routes/(app)/dashboard/settings/+page.svelte: -------------------------------------------------------------------------------- 1 | 7 | 8 |
9 | {JSON.stringify(profile)} 10 |
11 | 12 |
13 |
14 |
15 | 16 |

17 | 25 |

26 |
27 |
28 | 29 |

30 | 38 |

39 |
40 |
41 | 42 |
43 |
44 |
45 | -------------------------------------------------------------------------------- /src/routes/(app)/dashboard/settings/+page.ts: -------------------------------------------------------------------------------- 1 | import type { PageLoad, PageLoadEvent } from './$types'; 2 | import { getSupabase } from '@supabase/auth-helpers-sveltekit'; 3 | 4 | export const load: PageLoad = async (event: PageLoadEvent) => { 5 | const { user } = await event.parent(); 6 | const { supabaseClient } = await getSupabase(event); 7 | const {data, error} = await supabaseClient 8 | .from('profiles') 9 | .select('*') 10 | .eq('id', user.id) 11 | .single(); 12 | return { 13 | user, 14 | profile: data 15 | }; 16 | }; 17 | -------------------------------------------------------------------------------- /src/routes/(app)/dashboard/subscriptions/+page.server.ts: -------------------------------------------------------------------------------- 1 | import { getSupabase } from '@supabase/auth-helpers-sveltekit'; 2 | import { redirect } from '@sveltejs/kit'; 3 | import Stripe from 'stripe'; 4 | import { env } from '$env/dynamic/private'; 5 | import type { PageServerLoad, PageServerLoadEvent } from './$types'; 6 | 7 | const stripe = new Stripe(env.STRIPE_SECRET_KEY as string, { 8 | apiVersion: '2022-08-01' 9 | }); 10 | 11 | export const load: PageServerLoad = async (event: PageServerLoadEvent) => { 12 | const { session } = await event.parent(); 13 | const { supabaseClient } = await getSupabase(event); 14 | const { 15 | data: { stripe_customer_id }, 16 | } = await supabaseClient 17 | .from("user_data") 18 | .select("stripe_customer_id") 19 | .match({ id: session.user.id }) 20 | .single(); 21 | 22 | const stripeSession = await stripe.billingPortal.sessions.create({ 23 | customer: stripe_customer_id, 24 | return_url: `${event.url.origin}/dashboard`, 25 | }); 26 | throw redirect(301, stripeSession.url); 27 | } 28 | -------------------------------------------------------------------------------- /src/routes/(app)/logout/+page.server.ts: -------------------------------------------------------------------------------- 1 | import { getSupabase } from '@supabase/auth-helpers-sveltekit'; 2 | import type { Actions, RequestEvent } from './$types'; 3 | // @ts-ignore 4 | import { redirect } from '@sveltejs/kit'; 5 | 6 | export const actions: Actions = { 7 | async default(event: RequestEvent) { 8 | const { supabaseClient } = await getSupabase(event); 9 | await supabaseClient.auth.signOut(); 10 | throw redirect(303, '/'); 11 | } 12 | }; -------------------------------------------------------------------------------- /src/routes/(app)/payment/stripe/+page.server.ts: -------------------------------------------------------------------------------- 1 | import { STRIPE_SECRET_KEY } from '$env/static/private'; 2 | import { redirect } from '@sveltejs/kit'; 3 | import { Stripe } from 'stripe'; 4 | import type { RequestEvent } from '@sveltejs/kit'; 5 | import { getSupabase } from '@supabase/auth-helpers-sveltekit'; 6 | import type { Actions } from './$types'; 7 | 8 | export const actions: Actions = { 9 | default: async (event: RequestEvent) => { 10 | const { request } = event; 11 | const formData = await request.formData(); 12 | 13 | const { session, supabaseClient } = await getSupabase(event); 14 | if (!session) { 15 | throw redirect(303, '/'); 16 | } 17 | const priceId = formData.get('priceId') as string; 18 | const user = session.user; 19 | const { 20 | data: { stripe_customer_id } 21 | } = await supabaseClient 22 | .from('user_data') 23 | .select('stripe_customer_id') 24 | .eq('id', user.id) 25 | .single(); 26 | const stripe = new Stripe(STRIPE_SECRET_KEY, { 27 | apiVersion: '2022-08-01' 28 | }); 29 | 30 | const checkoutSession = await stripe.checkout.sessions.create({ 31 | customer: stripe_customer_id, 32 | mode: 'subscription', 33 | payment_method_types: ['card'], 34 | line_items: [ 35 | { 36 | price: priceId, 37 | quantity: 1 38 | } 39 | ], 40 | success_url: `${request.url.origin}/payment/stripe/success`, 41 | cancel_url: `${request.url.origin}/payment/stripe/cancelled` 42 | }); 43 | throw redirect(303, checkoutSession.url); 44 | } 45 | }; 46 | -------------------------------------------------------------------------------- /src/routes/(app)/payment/stripe/cancelled/+page.svelte: -------------------------------------------------------------------------------- 1 |

Payment cancelled. You have not been charged!

-------------------------------------------------------------------------------- /src/routes/(app)/payment/stripe/success/+page.svelte: -------------------------------------------------------------------------------- 1 |

Payment successful

-------------------------------------------------------------------------------- /src/routes/(public)/+page.svelte: -------------------------------------------------------------------------------- 1 | 4 | 5 |
6 | 7 |
8 |
9 |

10 | {SITE_NAME} 11 |

12 |

{SITE_TAG_LINE}

13 |

{SITE_DESCRIPTION}

14 | 19 |
20 |
21 |
22 | -------------------------------------------------------------------------------- /src/routes/(public)/auth/+page.server.ts: -------------------------------------------------------------------------------- 1 | import { getSupabase } from '@supabase/auth-helpers-sveltekit'; 2 | import { AuthApiError } from '@supabase/supabase-js'; 3 | import type { Actions, RequestEvent } from './$types'; 4 | // @ts-ignore 5 | import { invalid, redirect, type ValidationError } from '@sveltejs/kit'; 6 | 7 | export const actions: Actions = { 8 | async login(event: RequestEvent): Promise> { 9 | const { request } = event; 10 | const { supabaseClient } = await getSupabase(event); 11 | const formData = await request.formData(); 12 | 13 | const email = formData.get('email') as string; 14 | const password = formData.get('password') as string; 15 | 16 | if (!email) { 17 | return invalid(400, { 18 | error: 'Please enter your email' 19 | }); 20 | } 21 | if (!password) { 22 | return invalid(400, { 23 | error: 'Please enter your password', 24 | values: { 25 | email 26 | } 27 | }); 28 | } 29 | 30 | const { error } = await supabaseClient.auth.signInWithPassword({ email, password }); 31 | if (error) { 32 | if (error instanceof AuthApiError && error.status === 400) { 33 | return invalid(400, { 34 | error: 'Invalid credentials.', 35 | values: { 36 | email 37 | } 38 | }); 39 | } 40 | return invalid(500, { 41 | error: 'Server error. Try again later.', 42 | values: { 43 | email 44 | } 45 | }); 46 | }; 47 | throw redirect(303, '/dashboard'); 48 | }, 49 | 50 | async signup( 51 | event: RequestEvent 52 | ): Promise | { message: string }> { 53 | const { request, url } = event; 54 | const { supabaseClient } = await getSupabase(event); 55 | 56 | const formData = await request.formData(); 57 | 58 | const email = formData.get('email') as string; 59 | const password = formData.get('password') as string; 60 | const full_name = formData.get('full_name') as string; 61 | 62 | if (!email) { 63 | return invalid(400, { 64 | error: 'Please enter your email' 65 | }); 66 | } 67 | if (!password) { 68 | return invalid(400, { 69 | error: 'Please enter a password', 70 | values: { 71 | email, 72 | full_name 73 | } 74 | }); 75 | } 76 | 77 | const { error } = await supabaseClient.auth.signUp({ 78 | email, 79 | password, 80 | options: { 81 | emailRedirectTo: url.origin, 82 | data: {full_name: full_name} 83 | } 84 | }); 85 | 86 | if (error) { 87 | if (error instanceof AuthApiError && error.status === 400) { 88 | return invalid(400, { 89 | error: 'Invalid credentials.', 90 | values: { 91 | email, 92 | full_name 93 | } 94 | }); 95 | } 96 | 97 | return invalid(500, { 98 | error: 'Server error. Try again later.', 99 | values: { 100 | email, 101 | full_name 102 | } 103 | }); 104 | } 105 | 106 | return { 107 | message: 'Please check your email for a magic link to log into the website.' 108 | }; 109 | } 110 | }; 111 | -------------------------------------------------------------------------------- /src/routes/(public)/auth/+page.svelte: -------------------------------------------------------------------------------- 1 | 18 | 19 |
20 |
21 |

{isRegister ? 'Sign up' : 'Log In'}

22 | {#if form?.error} 23 |
{form.error}
24 | {/if} 25 | {#if form?.message} 26 |
{form.message}
27 | {/if} 28 |
29 | {#if isRegister} 30 |
31 | 32 |

33 | 42 |

43 |
44 | {/if} 45 |
46 | 47 |

48 | 57 |

58 |
59 |
60 | 61 |

62 | 70 |

71 |
72 |
73 | 74 |
75 |
76 | 77 |
78 |

79 | {#if isRegister} 80 | Already have an account? Login 81 | {:else} 82 | Don't have an account? Sign up 83 | {/if} 84 |

85 |
86 |
87 |
-------------------------------------------------------------------------------- /src/routes/(public)/pricing/+page.server.ts: -------------------------------------------------------------------------------- 1 | import { env } from '$env/dynamic/private'; 2 | import { env as publicEnv } from '$env/dynamic/public'; 3 | import Stripe from 'stripe'; 4 | import type { PageServerLoad } from './$types'; 5 | 6 | const stripe = new Stripe(env.STRIPE_SECRET_KEY as string, { 7 | apiVersion: '2022-08-01' 8 | }); 9 | 10 | export const load: PageServerLoad = async () => { 11 | let prices: Array = [] 12 | if (!publicEnv.PUBLIC_STRIPE_PRICING_TABLE_ID) { 13 | let resp = await stripe.prices.list({ 14 | expand: ['data.product'], 15 | active: true 16 | }); 17 | prices = resp.data 18 | } 19 | return { 20 | prices 21 | }; 22 | } 23 | -------------------------------------------------------------------------------- /src/routes/(public)/pricing/+page.svelte: -------------------------------------------------------------------------------- 1 | 11 | 12 | 13 | {#if env.PUBLIC_STRIPE_PRICING_TABLE_ID } 14 | 15 | {/if} 16 | 17 | 18 |
19 |
20 |
21 |

{PRICING_TAGLINE}

22 |

{PRICING_DESCRIPTION}

23 |
24 | {#if env.PUBLIC_STRIPE_PRICING_TABLE_ID} 25 | 27 | 28 | {:else} 29 | 30 | {/if} 31 |
32 |
33 | 34 | 35 | -------------------------------------------------------------------------------- /src/routes/(public)/privacy/+page.svelte: -------------------------------------------------------------------------------- 1 |
2 |

Privacy Policy for CompanyName

3 | 4 |

At WebsiteName, accessible from https://sveltekit-saas-starter.vercel.app/, one of our main priorities is the privacy of our visitors. This Privacy Policy document contains types of information that is collected and recorded by WebsiteName and how we use it.

5 | 6 |

If you have additional questions or require more information about our Privacy Policy, do not hesitate to contact us.

7 | 8 |

This Privacy Policy applies only to our online activities and is valid for visitors to our website with regards to the information that they shared and/or collect in WebsiteName. This policy is not applicable to any information collected offline or via channels other than this website.

9 | 10 |

Consent

11 | 12 |

By using our website, you hereby consent to our Privacy Policy and agree to its terms.

13 | 14 |

Information we collect

15 | 16 |

The personal information that you are asked to provide, and the reasons why you are asked to provide it, will be made clear to you at the point we ask you to provide your personal information.

17 |

If you contact us directly, we may receive additional information about you such as your name, email address, phone number, the contents of the message and/or attachments you may send us, and any other information you may choose to provide.

18 |

When you register for an Account, we may ask for your contact information, including items such as name, company name, address, email address, and telephone number.

19 | 20 |

How we use your information

21 | 22 |

We use the information we collect in various ways, including to:

23 | 24 |
    25 |
  • Provide, operate, and maintain our website
  • 26 |
  • Improve, personalize, and expand our website
  • 27 |
  • Understand and analyze how you use our website
  • 28 |
  • Develop new products, services, features, and functionality
  • 29 |
  • Communicate with you, either directly or through one of our partners, including for customer service, to provide you with updates and other information relating to the website, and for marketing and promotional purposes
  • 30 |
  • Send you emails
  • 31 |
  • Find and prevent fraud
  • 32 |
33 | 34 |

Log Files

35 | 36 |

WebsiteName follows a standard procedure of using log files. These files log visitors when they visit websites. All hosting companies do this and a part of hosting services' analytics. The information collected by log files include internet protocol (IP) addresses, browser type, Internet Service Provider (ISP), date and time stamp, referring/exit pages, and possibly the number of clicks. These are not linked to any information that is personally identifiable. The purpose of the information is for analyzing trends, administering the site, tracking users' movement on the website, and gathering demographic information.

37 | 38 |

Cookies and Web Beacons

39 | 40 |

Like any other website, WebsiteName uses 'cookies'. These cookies are used to store information including visitors' preferences, and the pages on the website that the visitor accessed or visited. The information is used to optimize the users' experience by customizing our web page content based on visitors' browser type and/or other information.

41 | 42 | 43 | 44 |

Advertising Partners Privacy Policies

45 | 46 |

You may consult this list to find the Privacy Policy for each of the advertising partners of WebsiteName.

47 | 48 |

Third-party ad servers or ad networks uses technologies like cookies, JavaScript, or Web Beacons that are used in their respective advertisements and links that appear on WebsiteName, which are sent directly to users' browser. They automatically receive your IP address when this occurs. These technologies are used to measure the effectiveness of their advertising campaigns and/or to personalize the advertising content that you see on websites that you visit.

49 | 50 |

Note that WebsiteName has no access to or control over these cookies that are used by third-party advertisers.

51 | 52 |

Third Party Privacy Policies

53 | 54 |

WebsiteName's Privacy Policy does not apply to other advertisers or websites. Thus, we are advising you to consult the respective Privacy Policies of these third-party ad servers for more detailed information. It may include their practices and instructions about how to opt-out of certain options.

55 | 56 |

You can choose to disable cookies through your individual browser options. To know more detailed information about cookie management with specific web browsers, it can be found at the browsers' respective websites.

57 | 58 |

CCPA Privacy Rights (Do Not Sell My Personal Information)

59 | 60 |

Under the CCPA, among other rights, California consumers have the right to:

61 |

Request that a business that collects a consumer's personal data disclose the categories and specific pieces of personal data that a business has collected about consumers.

62 |

Request that a business delete any personal data about the consumer that a business has collected.

63 |

Request that a business that sells a consumer's personal data, not sell the consumer's personal data.

64 |

If you make a request, we have one month to respond to you. If you would like to exercise any of these rights, please contact us.

65 | 66 |

GDPR Data Protection Rights

67 | 68 |

We would like to make sure you are fully aware of all of your data protection rights. Every user is entitled to the following:

69 |

The right to access – You have the right to request copies of your personal data. We may charge you a small fee for this service.

70 |

The right to rectification – You have the right to request that we correct any information you believe is inaccurate. You also have the right to request that we complete the information you believe is incomplete.

71 |

The right to erasure – You have the right to request that we erase your personal data, under certain conditions.

72 |

The right to restrict processing – You have the right to request that we restrict the processing of your personal data, under certain conditions.

73 |

The right to object to processing – You have the right to object to our processing of your personal data, under certain conditions.

74 |

The right to data portability – You have the right to request that we transfer the data that we have collected to another organization, or directly to you, under certain conditions.

75 |

If you make a request, we have one month to respond to you. If you would like to exercise any of these rights, please contact us.

76 | 77 |

Children's Information

78 | 79 |

Another part of our priority is adding protection for children while using the internet. We encourage parents and guardians to observe, participate in, and/or monitor and guide their online activity.

80 | 81 |

WebsiteName does not knowingly collect any Personal Identifiable Information from children under the age of 13. If you think that your child provided this kind of information on our website, we strongly encourage you to contact us immediately and we will do our best efforts to promptly remove such information from our records.

82 |
83 | -------------------------------------------------------------------------------- /src/routes/(public)/terms/+page.svelte: -------------------------------------------------------------------------------- 1 |
2 |

Terms and Conditions

3 | 4 |

Welcome to WebsiteName!

5 | 6 |

These terms and conditions outline the rules and regulations for the use of CompanyName's Website, located at https://sveltekit-saas-starter.vercel.app/.

7 | 8 |

By accessing this website we assume you accept these terms and conditions. Do not continue to use WebsiteName if you do not agree to take all of the terms and conditions stated on this page.

9 | 10 |

The following terminology applies to these Terms and Conditions, Privacy Statement and Disclaimer Notice and all Agreements: "Client", "You" and "Your" refers to you, the person log on this website and compliant to the Company’s terms and conditions. "The Company", "Ourselves", "We", "Our" and "Us", refers to our Company. "Party", "Parties", or "Us", refers to both the Client and ourselves. All terms refer to the offer, acceptance and consideration of payment necessary to undertake the process of our assistance to the Client in the most appropriate manner for the express purpose of meeting the Client’s needs in respect of provision of the Company’s stated services, in accordance with and subject to, prevailing law of Netherlands. Any use of the above terminology or other words in the singular, plural, capitalization and/or he/she or they, are taken as interchangeable and therefore as referring to same.

11 | 12 |

Cookies

13 | 14 |

We employ the use of cookies. By accessing WebsiteName, you agreed to use cookies in agreement with the CompanyName's Privacy Policy.

15 | 16 |

Most interactive websites use cookies to let us retrieve the user’s details for each visit. Cookies are used by our website to enable the functionality of certain areas to make it easier for people visiting our website. Some of our affiliate/advertising partners may also use cookies.

17 | 18 |

License

19 | 20 |

Unless otherwise stated, CompanyName and/or its licensors own the intellectual property rights for all material on WebsiteName. All intellectual property rights are reserved. You may access this from WebsiteName for your own personal use subjected to restrictions set in these terms and conditions.

21 | 22 |

You must not:

23 |
    24 |
  • Republish material from WebsiteName
  • 25 |
  • Sell, rent or sub-license material from WebsiteName
  • 26 |
  • Reproduce, duplicate or copy material from WebsiteName
  • 27 |
  • Redistribute content from WebsiteName
  • 28 |
29 | 30 |

This Agreement shall begin on the date hereof.

31 | 32 |

Parts of this website offer an opportunity for users to post and exchange opinions and information in certain areas of the website. CompanyName does not filter, edit, publish or review Comments prior to their presence on the website. Comments do not reflect the views and opinions of CompanyName,its agents and/or affiliates. Comments reflect the views and opinions of the person who post their views and opinions. To the extent permitted by applicable laws, CompanyName shall not be liable for the Comments or for any liability, damages or expenses caused and/or suffered as a result of any use of and/or posting of and/or appearance of the Comments on this website.

33 | 34 |

CompanyName reserves the right to monitor all Comments and to remove any Comments which can be considered inappropriate, offensive or causes breach of these Terms and Conditions.

35 | 36 |

You warrant and represent that:

37 | 38 |
    39 |
  • You are entitled to post the Comments on our website and have all necessary licenses and consents to do so;
  • 40 |
  • The Comments do not invade any intellectual property right, including without limitation copyright, patent or trademark of any third party;
  • 41 |
  • The Comments do not contain any defamatory, libelous, offensive, indecent or otherwise unlawful material which is an invasion of privacy
  • 42 |
  • The Comments will not be used to solicit or promote business or custom or present commercial activities or unlawful activity.
  • 43 |
44 | 45 |

You hereby grant CompanyName a non-exclusive license to use, reproduce, edit and authorize others to use, reproduce and edit any of your Comments in any and all forms, formats or media.

46 | 47 |

Hyperlinking to our Content

48 | 49 |

The following organizations may link to our Website without prior written approval:

50 | 51 |
    52 |
  • Government agencies;
  • 53 |
  • Search engines;
  • 54 |
  • News organizations;
  • 55 |
  • Online directory distributors may link to our Website in the same manner as they hyperlink to the Websites of other listed businesses; and
  • 56 |
  • System wide Accredited Businesses except soliciting non-profit organizations, charity shopping malls, and charity fundraising groups which may not hyperlink to our Web site.
  • 57 |
58 | 59 |

These organizations may link to our home page, to publications or to other Website information so long as the link: (a) is not in any way deceptive; (b) does not falsely imply sponsorship, endorsement or approval of the linking party and its products and/or services; and (c) fits within the context of the linking party’s site.

60 | 61 |

We may consider and approve other link requests from the following types of organizations:

62 | 63 |
    64 |
  • commonly-known consumer and/or business information sources;
  • 65 |
  • dot.com community sites;
  • 66 |
  • associations or other groups representing charities;
  • 67 |
  • online directory distributors;
  • 68 |
  • internet portals;
  • 69 |
  • accounting, law and consulting firms; and
  • 70 |
  • educational institutions and trade associations.
  • 71 |
72 | 73 |

We will approve link requests from these organizations if we decide that: (a) the link would not make us look unfavorably to ourselves or to our accredited businesses; (b) the organization does not have any negative records with us; (c) the benefit to us from the visibility of the hyperlink compensates the absence of CompanyName; and (d) the link is in the context of general resource information.

74 | 75 |

These organizations may link to our home page so long as the link: (a) is not in any way deceptive; (b) does not falsely imply sponsorship, endorsement or approval of the linking party and its products or services; and (c) fits within the context of the linking party’s site.

76 | 77 |

If you are one of the organizations listed in paragraph 2 above and are interested in linking to our website, you must inform us by sending an e-mail to CompanyName. Please include your name, your organization name, contact information as well as the URL of your site, a list of any URLs from which you intend to link to our Website, and a list of the URLs on our site to which you would like to link. Wait 2-3 weeks for a response.

78 | 79 |

Approved organizations may hyperlink to our Website as follows:

80 | 81 |
    82 |
  • By use of our corporate name; or
  • 83 |
  • By use of the uniform resource locator being linked to; or
  • 84 |
  • By use of any other description of our Website being linked to that makes sense within the context and format of content on the linking party’s site.
  • 85 |
86 | 87 |

No use of CompanyName's logo or other artwork will be allowed for linking absent a trademark license agreement.

88 | 89 |

iFrames

90 | 91 |

Without prior approval and written permission, you may not create frames around our Webpages that alter in any way the visual presentation or appearance of our Website.

92 | 93 |

Content Liability

94 | 95 |

We shall not be hold responsible for any content that appears on your Website. You agree to protect and defend us against all claims that is rising on your Website. No link(s) should appear on any Website that may be interpreted as libelous, obscene or criminal, or which infringes, otherwise violates, or advocates the infringement or other violation of, any third party rights.

96 | 97 |

Your Privacy

98 | 99 |

Please read Privacy Policy

100 | 101 |

Reservation of Rights

102 | 103 |

We reserve the right to request that you remove all links or any particular link to our Website. You approve to immediately remove all links to our Website upon request. We also reserve the right to amen these terms and conditions and it’s linking policy at any time. By continuously linking to our Website, you agree to be bound to and follow these linking terms and conditions.

104 | 105 |

Removal of links from our website

106 | 107 |

If you find any link on our Website that is offensive for any reason, you are free to contact and inform us any moment. We will consider requests to remove links but we are not obligated to or so or to respond to you directly.

108 | 109 |

We do not ensure that the information on this website is correct, we do not warrant its completeness or accuracy; nor do we promise to ensure that the website remains available or that the material on the website is kept up to date.

110 | 111 |

Disclaimer

112 | 113 |

To the maximum extent permitted by applicable law, we exclude all representations, warranties and conditions relating to our website and the use of this website. Nothing in this disclaimer will:

114 | 115 |
    116 |
  • limit or exclude our or your liability for death or personal injury;
  • 117 |
  • limit or exclude our or your liability for fraud or fraudulent misrepresentation;
  • 118 |
  • limit any of our or your liabilities in any way that is not permitted under applicable law; or
  • 119 |
  • exclude any of our or your liabilities that may not be excluded under applicable law.
  • 120 |
121 | 122 |

The limitations and prohibitions of liability set in this Section and elsewhere in this disclaimer: (a) are subject to the preceding paragraph; and (b) govern all liabilities arising under the disclaimer, including liabilities arising in contract, in tort and for breach of statutory duty.

123 | 124 |

As long as the website and the information and services on the website are provided free of charge, we will not be liable for any loss or damage of any nature.

125 |
126 | -------------------------------------------------------------------------------- /src/routes/+layout.server.ts: -------------------------------------------------------------------------------- 1 | import type { LayoutServerLoad, LayoutServerLoadEvent } from './$types'; 2 | import { getServerSession } from '@supabase/auth-helpers-sveltekit'; 3 | 4 | export const load: LayoutServerLoad = async (event: LayoutServerLoadEvent) => { 5 | return { 6 | session: await getServerSession(event) 7 | }; 8 | }; -------------------------------------------------------------------------------- /src/routes/+layout.svelte: -------------------------------------------------------------------------------- 1 | 30 | 31 |
32 | 33 | 34 | 35 | 36 |
37 | 38 |
39 | 40 |
41 | Privacy 42 | Terms and Conditions 43 |
44 |
45 |
46 |
47 | -------------------------------------------------------------------------------- /static/favicon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ak4zh/sveltekit-saas-starter/2cac61aadbdfc68eb57aeed749c63c429fab8d0a/static/favicon.png -------------------------------------------------------------------------------- /supabase/.env.example: -------------------------------------------------------------------------------- 1 | STRIPE_SECRET_KEY=sk_test_... 2 | STRIPE_WEBHOOK_SECRET=whsec_... -------------------------------------------------------------------------------- /supabase/.gitignore: -------------------------------------------------------------------------------- 1 | # Supabase 2 | .branches 3 | .temp 4 | -------------------------------------------------------------------------------- /supabase/config.toml: -------------------------------------------------------------------------------- 1 | # A string used to distinguish different Supabase projects on the same host. Defaults to the working 2 | # directory name when running `supabase init`. 3 | project_id = "sveltekit-saas-starter" 4 | 5 | [api] 6 | # Port to use for the API URL. 7 | port = 54321 8 | # Schemas to expose in your API. Tables, views and stored procedures in this schema will get API 9 | # endpoints. public and storage are always included. 10 | schemas = [] 11 | # Extra schemas to add to the search_path of every request. 12 | extra_search_path = ["extensions"] 13 | # The maximum number of rows returns from a view, table, or stored procedure. Limits payload size 14 | # for accidental or malicious requests. 15 | max_rows = 1000 16 | 17 | [db] 18 | # Port to use for the local database URL. 19 | port = 54322 20 | # The database major version to use. This has to be the same as your remote database's. Run `SHOW 21 | # server_version;` on the remote database to check. 22 | major_version = 14 23 | 24 | [studio] 25 | # Port to use for Supabase Studio. 26 | port = 54323 27 | 28 | # Email testing server. Emails sent with the local dev setup are not actually sent - rather, they 29 | # are monitored, and you can view the emails that would have been sent from the web interface. 30 | [inbucket] 31 | # Port to use for the email testing server web interface. 32 | port = 54324 33 | smtp_port = 54325 34 | pop3_port = 54326 35 | 36 | [auth] 37 | # The base URL of your website. Used as an allow-list for redirects and for constructing URLs used 38 | # in emails. 39 | site_url = "http://localhost:3000" 40 | # A list of *exact* URLs that auth providers are permitted to redirect to post authentication. 41 | additional_redirect_urls = ["https://localhost:3000"] 42 | # How long tokens are valid for, in seconds. Defaults to 3600 (1 hour), maximum 604,800 seconds (one 43 | # week). 44 | jwt_expiry = 3600 45 | # Allow/disallow new user signups to your project. 46 | enable_signup = true 47 | 48 | [auth.email] 49 | # Allow/disallow new user signups via email to your project. 50 | enable_signup = true 51 | # If enabled, a user will be required to confirm any email change on both the old, and new email 52 | # addresses. If disabled, only the new email is required to confirm. 53 | double_confirm_changes = true 54 | # If enabled, users need to confirm their email address before signing in. 55 | enable_confirmations = false 56 | 57 | # Use an external OAuth provider. The full list of providers are: `apple`, `azure`, `bitbucket`, 58 | # `discord`, `facebook`, `github`, `gitlab`, `google`, `twitch`, `twitter`, `slack`, `spotify`. 59 | [auth.external.apple] 60 | enabled = false 61 | client_id = "" 62 | secret = "" 63 | -------------------------------------------------------------------------------- /supabase/functions/create-stripe-customer/index.ts: -------------------------------------------------------------------------------- 1 | import { serve } from 'https://deno.land/std@0.131.0/http/server.ts'; 2 | import Stripe from 'https://esm.sh/stripe?target=deno'; 3 | import { createClient } from 'https://esm.sh/@supabase/supabase-js@1.35.5'; 4 | 5 | const stripe = Stripe(Deno.env.get('STRIPE_SECRET_KEY')!, { 6 | httpClient: Stripe.createFetchHttpClient() 7 | }); 8 | 9 | const supabase = createClient( 10 | Deno.env.get('SUPABASE_URL')!, 11 | Deno.env.get('SUPABASE_SERVICE_ROLE_KEY')! 12 | ); 13 | 14 | serve(async (req) => { 15 | const { record } = await req.json(); 16 | 17 | const customer = await stripe.customers.create({ 18 | // stripe customer name is mandadoty for few countries for exports 19 | name: record?.raw_user_meta_data?.full_name?.split('@')[0] || record.email, 20 | email: record.email, 21 | metadata: { 22 | supabase_id: record.id 23 | } 24 | }); 25 | 26 | const { data, error } = await supabase 27 | .from('user_data') 28 | .update({ 29 | stripe_customer_id: customer.id 30 | }) 31 | .match({ id: record.id }); 32 | 33 | return new Response(JSON.stringify({ customer_stripe_id: customer.id }), { 34 | headers: { 'Content-Type': 'application/json' } 35 | }); 36 | }); 37 | -------------------------------------------------------------------------------- /supabase/functions/stripe-sync/index.ts: -------------------------------------------------------------------------------- 1 | import { serve } from "https://deno.land/std@0.131.0/http/server.ts"; 2 | import { createClient } from "https://esm.sh/@supabase/supabase-js@2.1.0"; 3 | import { createDenoHandler } from "https://esm.sh/stripe-sync@0.1.3/adapters/deno"; 4 | import { createSupabaseAdapter } from "https://esm.sh/stripe-sync@0.1.3/databaseAdapters/supabase"; 5 | import Stripe from "https://esm.sh/stripe@10.17.0?target=deno&no-check"; 6 | import invariant from "https://esm.sh/tiny-invariant@1.3.1"; 7 | const stripe = Stripe(Deno.env.get("STRIPE_API_KEY"), { 8 | httpClient: Stripe.createFetchHttpClient(), 9 | apiVersion: "2022-08-01", 10 | }); 11 | const cryptoProvider = Stripe.createSubtleCryptoProvider(); 12 | 13 | const supabaseUrl = Deno.env.get("SUPABASE_URL"); 14 | const supabaseServiceKey = Deno.env.get("SUPABASE_SERVICE_ROLE_KEY"); 15 | { 16 | invariant(typeof supabaseUrl === "string", "SUPABASE_URL is required"); 17 | invariant( 18 | typeof supabaseServiceKey === "string", 19 | "SUPABASE_SERVICE_ROLE_KEY is required" 20 | ); 21 | } 22 | export const supabaseClient = createClient(supabaseUrl, supabaseServiceKey, { 23 | db: { 24 | schema: "stripe", 25 | }, 26 | }); 27 | 28 | const handler = createDenoHandler({ 29 | databaseAdapter: createSupabaseAdapter({ 30 | supabase: supabaseClient 31 | }), 32 | stripe, 33 | cryptoProvider, 34 | stripeEndpointSecret: Deno.env.get('STRIPE_WEBHOOK_SECRET') ?? '', 35 | stripeSecretKey: Deno.env.get('STRIPE_SECRET_KEY') ?? '' 36 | }); 37 | 38 | serve(handler); 39 | -------------------------------------------------------------------------------- /supabase/migrations/20220828143845_user_data.sql: -------------------------------------------------------------------------------- 1 | create table "public"."user_data" ( 2 | "id" uuid not null, 3 | "created_at" timestamp with time zone default now(), 4 | "email" text not null, 5 | "stripe_customer_id" text 6 | ); 7 | 8 | alter table "public"."user_data" enable row level security; 9 | 10 | CREATE UNIQUE INDEX user_data_pkey ON public.user_data USING btree (id); 11 | 12 | alter table "public"."user_data" add constraint "user_data_pkey" PRIMARY KEY using index "user_data_pkey"; 13 | 14 | alter table "public"."user_data" add constraint "user_data_id_fkey" FOREIGN KEY (id) REFERENCES auth.users(id) not valid; 15 | 16 | alter table "public"."user_data" validate constraint "user_data_id_fkey"; 17 | 18 | create policy "user_data.allow_select_own_user_data" on user_data 19 | for select using (auth.uid() = id); 20 | 21 | create function public.handle_new_user() 22 | returns trigger 23 | language plpgsql 24 | security definer 25 | as $$ 26 | begin 27 | insert into public.user_data (id, email) 28 | values (new.id, new.email); 29 | return new; 30 | end; 31 | $$; 32 | 33 | -- trigger the function every time a user is inserted 34 | create trigger on_auth_user_inserted 35 | after insert on auth.users 36 | for each row execute procedure public.handle_new_user(); 37 | 38 | -- trigger the function every time a row is inserted in user_data 39 | -- I am aware I commited the anon key and project ref id 40 | CREATE TRIGGER on_user_data_insert_create_stripe_customer 41 | AFTER INSERT ON public.user_data 42 | FOR EACH ROW 43 | EXECUTE FUNCTION supabase_functions.http_request( 44 | 'https://xsbznfavbzjwhooewyyg.functions.supabase.co/create-stripe-customer', 'POST', 45 | '{"Content-type":"application/json","Authorization":"Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJzdXBhYmFzZSIsInJlZiI6InhzYnpuZmF2Ynpqd2hvb2V3eXlnIiwicm9sZSI6ImFub24iLCJpYXQiOjE2NjgyMjk4NzYsImV4cCI6MTk4MzgwNTg3Nn0.k19SvRSvtpKGIWWBPLFwsL4QdfcBPJ_d6OpyNnC7IWc"}' 46 | ); -------------------------------------------------------------------------------- /supabase/migrations/20220828193134_stripe_tables.sql: -------------------------------------------------------------------------------- 1 | CREATE SCHEMA stripe; 2 | CREATE TABLE stripe.application ( 3 | "id" text not null, 4 | "name" text, 5 | "object" text not null 6 | ); 7 | CREATE TABLE stripe.account ( 8 | "business_profile" jsonb, 9 | "business_type" text, 10 | "capabilities" jsonb, 11 | "charges_enabled" boolean, 12 | "company" jsonb, 13 | "controller" jsonb, 14 | "country" text, 15 | "created" integer, 16 | "default_currency" text, 17 | "details_submitted" boolean, 18 | "email" text, 19 | "external_accounts" jsonb, 20 | "future_requirements" jsonb, 21 | "id" text not null, 22 | "individual" jsonb, 23 | "metadata" jsonb, 24 | "object" text not null, 25 | "payouts_enabled" boolean, 26 | "requirements" jsonb, 27 | "settings" jsonb, 28 | "tos_acceptance" jsonb, 29 | "type" text 30 | ); 31 | CREATE TABLE stripe.application_fee ( 32 | "account" jsonb not null, 33 | "amount" integer not null, 34 | "amount_refunded" integer not null, 35 | "application" jsonb not null, 36 | "balance_transaction" jsonb, 37 | "charge" jsonb not null, 38 | "created" integer, 39 | "currency" text not null, 40 | "id" text not null, 41 | "livemode" boolean, 42 | "object" text not null, 43 | "originating_transaction" jsonb, 44 | "refunded" boolean not null, 45 | "refunds" jsonb not null 46 | ); 47 | CREATE TABLE stripe.refund ( 48 | "amount" integer not null, 49 | "balance_transaction" jsonb, 50 | "charge" jsonb, 51 | "created" integer, 52 | "currency" text not null, 53 | "description" text, 54 | "failure_balance_transaction" jsonb, 55 | "failure_reason" text, 56 | "id" text not null, 57 | "instructions_email" text, 58 | "metadata" jsonb, 59 | "next_action" jsonb, 60 | "object" text not null, 61 | "payment_intent" jsonb, 62 | "reason" text, 63 | "receipt_number" text, 64 | "source_transfer_reversal" jsonb, 65 | "status" text, 66 | "transfer_reversal" jsonb 67 | ); 68 | CREATE TABLE stripe.balance ( 69 | "available" jsonb not null, 70 | "connect_reserved" jsonb, 71 | "instant_available" jsonb, 72 | "issuing" jsonb, 73 | "livemode" boolean, 74 | "object" text not null, 75 | "pending" jsonb not null 76 | ); 77 | CREATE TABLE stripe.configuration ( 78 | "active" boolean not null, 79 | "application" jsonb, 80 | "business_profile" jsonb not null, 81 | "created" integer, 82 | "default_return_url" text, 83 | "features" jsonb not null, 84 | "id" text not null, 85 | "is_default" boolean not null, 86 | "livemode" boolean, 87 | "metadata" jsonb, 88 | "object" text not null, 89 | "updated" integer not null 90 | ); 91 | CREATE TABLE stripe.session ( 92 | "configuration" jsonb, 93 | "created" integer, 94 | "customer" text not null, 95 | "id" text not null, 96 | "livemode" boolean, 97 | "locale" text, 98 | "object" text not null, 99 | "on_behalf_of" text, 100 | "return_url" text, 101 | "url" text not null 102 | ); 103 | CREATE TABLE stripe.capability ( 104 | "account" jsonb not null, 105 | "future_requirements" jsonb, 106 | "id" text not null, 107 | "object" text not null, 108 | "requested" boolean not null, 109 | "requested_at" integer, 110 | "requirements" jsonb, 111 | "status" text 112 | ); 113 | CREATE TABLE stripe.cash_balance ( 114 | "available" jsonb, 115 | "customer" text not null, 116 | "livemode" boolean, 117 | "object" text not null, 118 | "settings" jsonb not null 119 | ); 120 | CREATE TABLE stripe.charge ( 121 | "amount" integer not null, 122 | "amount_captured" integer not null, 123 | "amount_refunded" integer not null, 124 | "application" jsonb, 125 | "application_fee" jsonb, 126 | "application_fee_amount" integer, 127 | "balance_transaction" jsonb, 128 | "billing_details" jsonb not null, 129 | "calculated_statement_descriptor" text, 130 | "captured" boolean not null, 131 | "created" integer, 132 | "currency" text not null, 133 | "customer" jsonb, 134 | "description" text, 135 | "disputed" boolean not null, 136 | "failure_balance_transaction" jsonb, 137 | "failure_code" text, 138 | "failure_message" text, 139 | "fraud_details" jsonb, 140 | "id" text not null, 141 | "invoice" jsonb, 142 | "livemode" boolean, 143 | "metadata" jsonb not null, 144 | "object" text not null, 145 | "on_behalf_of" jsonb, 146 | "outcome" jsonb, 147 | "paid" boolean not null, 148 | "payment_intent" jsonb, 149 | "payment_method" text, 150 | "payment_method_details" jsonb, 151 | "radar_options" jsonb, 152 | "receipt_email" text, 153 | "receipt_number" text, 154 | "receipt_url" text, 155 | "refunded" boolean not null, 156 | "refunds" jsonb not null, 157 | "review" jsonb, 158 | "shipping" jsonb, 159 | "source_transfer" jsonb, 160 | "statement_descriptor" text, 161 | "statement_descriptor_suffix" text, 162 | "status" text, 163 | "transfer" jsonb, 164 | "transfer_data" jsonb, 165 | "transfer_group" text 166 | ); 167 | CREATE TABLE stripe.dispute ( 168 | "amount" integer not null, 169 | "balance_transactions" jsonb not null, 170 | "charge" jsonb not null, 171 | "created" integer, 172 | "currency" text not null, 173 | "evidence" jsonb not null, 174 | "evidence_details" jsonb not null, 175 | "id" text not null, 176 | "is_charge_refundable" boolean not null, 177 | "livemode" boolean, 178 | "metadata" jsonb not null, 179 | "object" text not null, 180 | "payment_intent" jsonb, 181 | "reason" text not null, 182 | "status" text 183 | ); 184 | CREATE TABLE stripe.checkout_session ( 185 | "after_expiration" jsonb, 186 | "allow_promotion_codes" boolean, 187 | "amount_subtotal" integer, 188 | "amount_total" integer, 189 | "automatic_tax" jsonb not null, 190 | "billing_address_collection" text, 191 | "cancel_url" text not null, 192 | "client_reference_id" text, 193 | "consent" jsonb, 194 | "consent_collection" jsonb, 195 | "currency" text, 196 | "customer" jsonb, 197 | "customer_creation" text, 198 | "customer_details" jsonb, 199 | "customer_email" text, 200 | "expires_at" integer not null, 201 | "id" text not null, 202 | "line_items" jsonb, 203 | "livemode" boolean, 204 | "locale" text, 205 | "metadata" jsonb, 206 | "mode" text not null, 207 | "object" text not null, 208 | "payment_intent" jsonb, 209 | "payment_link" jsonb, 210 | "payment_method_collection" text, 211 | "payment_method_options" jsonb, 212 | "payment_method_types" jsonb not null, 213 | "payment_status" text not null, 214 | "phone_number_collection" jsonb, 215 | "recovered_from" text, 216 | "setup_intent" jsonb, 217 | "shipping_address_collection" jsonb, 218 | "shipping_cost" jsonb, 219 | "shipping_details" jsonb, 220 | "shipping_options" jsonb not null, 221 | "status" text, 222 | "submit_type" text, 223 | "subscription" jsonb, 224 | "success_url" text not null, 225 | "tax_id_collection" jsonb, 226 | "total_details" jsonb, 227 | "url" text 228 | ); 229 | CREATE TABLE stripe.coupon ( 230 | "amount_off" integer, 231 | "applies_to" jsonb, 232 | "created" integer, 233 | "currency" text, 234 | "currency_options" jsonb, 235 | "duration" text not null, 236 | "duration_in_months" integer, 237 | "id" text not null, 238 | "livemode" boolean, 239 | "max_redemptions" integer, 240 | "metadata" jsonb, 241 | "name" text, 242 | "object" text not null, 243 | "percent_off" integer, 244 | "redeem_by" integer, 245 | "times_redeemed" integer not null, 246 | "valid" boolean not null 247 | ); 248 | CREATE TABLE stripe.credit_note ( 249 | "amount" integer not null, 250 | "created" integer, 251 | "currency" text not null, 252 | "customer" jsonb not null, 253 | "customer_balance_transaction" jsonb, 254 | "discount_amount" integer not null, 255 | "discount_amounts" jsonb not null, 256 | "id" text not null, 257 | "invoice" jsonb not null, 258 | "lines" jsonb not null, 259 | "livemode" boolean, 260 | "memo" text, 261 | "metadata" jsonb, 262 | "number" text not null, 263 | "object" text not null, 264 | "out_of_band_amount" integer, 265 | "pdf" text not null, 266 | "reason" text, 267 | "refund" jsonb, 268 | "status" text, 269 | "subtotal" integer not null, 270 | "subtotal_excluding_tax" integer, 271 | "tax_amounts" jsonb not null, 272 | "total" integer not null, 273 | "total_excluding_tax" integer, 274 | "type" text not null, 275 | "voided_at" integer 276 | ); 277 | CREATE TABLE stripe.customer ( 278 | "address" jsonb, 279 | "balance" integer, 280 | "cash_balance" jsonb, 281 | "created" integer, 282 | "currency" text, 283 | "default_source" jsonb, 284 | "delinquent" boolean, 285 | "description" text, 286 | "discount" jsonb, 287 | "email" text, 288 | "id" text not null, 289 | "invoice_credit_balance" jsonb, 290 | "invoice_prefix" text, 291 | "invoice_settings" jsonb, 292 | "livemode" boolean, 293 | "metadata" jsonb, 294 | "name" text, 295 | "next_invoice_sequence" integer, 296 | "object" text not null, 297 | "phone" text, 298 | "preferred_locales" jsonb, 299 | "shipping" jsonb, 300 | "sources" jsonb, 301 | "subscriptions" jsonb, 302 | "tax" jsonb, 303 | "tax_exempt" text, 304 | "tax_ids" jsonb, 305 | "test_clock" jsonb 306 | ); 307 | CREATE TABLE stripe.discount ( 308 | "checkout_session" text, 309 | "coupon" jsonb not null, 310 | "customer" jsonb, 311 | "end" integer, 312 | "id" text not null, 313 | "invoice" text, 314 | "invoice_item" text, 315 | "object" text not null, 316 | "promotion_code" jsonb, 317 | "start" integer not null, 318 | "subscription" text 319 | ); 320 | CREATE TABLE stripe.source ( 321 | "ach_credit_transfer" jsonb, 322 | "ach_debit" jsonb, 323 | "acss_debit" jsonb, 324 | "alipay" jsonb, 325 | "amount" integer, 326 | "au_becs_debit" jsonb, 327 | "bancontact" jsonb, 328 | "card" jsonb, 329 | "card_present" jsonb, 330 | "client_secret" text, 331 | "code_verification" jsonb, 332 | "created" integer, 333 | "currency" text, 334 | "customer" text, 335 | "eps" jsonb, 336 | "flow" text, 337 | "giropay" jsonb, 338 | "id" text not null, 339 | "ideal" jsonb, 340 | "klarna" jsonb, 341 | "livemode" boolean, 342 | "metadata" jsonb, 343 | "multibanco" jsonb, 344 | "object" text not null, 345 | "owner" jsonb, 346 | "p24" jsonb, 347 | "receiver" jsonb, 348 | "redirect" jsonb, 349 | "sepa_debit" jsonb, 350 | "sofort" jsonb, 351 | "source_order" jsonb, 352 | "statement_descriptor" text, 353 | "status" text, 354 | "three_d_secure" jsonb, 355 | "type" text, 356 | "usage" text, 357 | "wechat" jsonb 358 | ); 359 | CREATE TABLE stripe.subscription ( 360 | "application" jsonb, 361 | "application_fee_percent" integer, 362 | "automatic_tax" jsonb not null, 363 | "billing_cycle_anchor" integer not null, 364 | "billing_thresholds" jsonb, 365 | "cancel_at" integer, 366 | "cancel_at_period_end" boolean not null, 367 | "canceled_at" integer, 368 | "collection_method" text not null, 369 | "created" integer, 370 | "currency" text not null, 371 | "current_period_end" integer not null, 372 | "current_period_start" integer not null, 373 | "customer" jsonb not null, 374 | "days_until_due" integer, 375 | "default_payment_method" jsonb, 376 | "default_source" jsonb, 377 | "default_tax_rates" jsonb, 378 | "description" text, 379 | "discount" jsonb, 380 | "ended_at" integer, 381 | "id" text not null, 382 | "items" jsonb not null, 383 | "latest_invoice" jsonb, 384 | "livemode" boolean, 385 | "metadata" jsonb not null, 386 | "next_pending_invoice_item_invoice" integer, 387 | "object" text not null, 388 | "pause_collection" jsonb, 389 | "payment_settings" jsonb, 390 | "pending_invoice_item_interval" jsonb, 391 | "pending_setup_intent" jsonb, 392 | "pending_update" jsonb, 393 | "schedule" jsonb, 394 | "start_date" integer not null, 395 | "status" text, 396 | "test_clock" jsonb, 397 | "transfer_data" jsonb, 398 | "trial_end" integer, 399 | "trial_start" integer 400 | ); 401 | CREATE TABLE stripe.tax_id ( 402 | "country" text, 403 | "created" integer, 404 | "customer" jsonb, 405 | "id" text not null, 406 | "livemode" boolean, 407 | "object" text not null, 408 | "type" text not null, 409 | "value" text not null, 410 | "verification" jsonb 411 | ); 412 | CREATE TABLE stripe.customer_cash_balance_transaction ( 413 | "applied_to_payment" jsonb, 414 | "created" integer, 415 | "currency" text not null, 416 | "customer" jsonb not null, 417 | "ending_balance" integer not null, 418 | "funded" jsonb, 419 | "id" text not null, 420 | "livemode" boolean, 421 | "net_amount" integer not null, 422 | "object" text not null, 423 | "refunded_from_payment" jsonb, 424 | "type" text not null, 425 | "unapplied_from_payment" jsonb 426 | ); 427 | CREATE TABLE stripe.file ( 428 | "created" integer, 429 | "expires_at" integer, 430 | "filename" text, 431 | "id" text not null, 432 | "links" jsonb, 433 | "object" text not null, 434 | "purpose" text, 435 | "size" integer not null, 436 | "title" text, 437 | "type" text, 438 | "url" text 439 | ); 440 | CREATE TABLE stripe.verification_session ( 441 | "client_secret" text, 442 | "created" integer, 443 | "id" text not null, 444 | "last_error" jsonb, 445 | "last_verification_report" jsonb, 446 | "livemode" boolean, 447 | "metadata" jsonb not null, 448 | "object" text not null, 449 | "options" jsonb not null, 450 | "redaction" jsonb, 451 | "status" text, 452 | "type" text, 453 | "url" text, 454 | "verified_outputs" jsonb 455 | ); 456 | CREATE TABLE stripe.invoice ( 457 | "account_country" text, 458 | "account_name" text, 459 | "account_tax_ids" jsonb, 460 | "amount_due" integer not null, 461 | "amount_paid" integer not null, 462 | "amount_remaining" integer not null, 463 | "application" jsonb, 464 | "application_fee_amount" integer, 465 | "attempt_count" integer not null, 466 | "attempted" boolean not null, 467 | "auto_advance" boolean, 468 | "automatic_tax" jsonb not null, 469 | "billing_reason" text, 470 | "charge" jsonb, 471 | "collection_method" text not null, 472 | "created" integer, 473 | "currency" text not null, 474 | "custom_fields" jsonb, 475 | "customer" jsonb, 476 | "customer_address" jsonb, 477 | "customer_email" text, 478 | "customer_name" text, 479 | "customer_phone" text, 480 | "customer_shipping" jsonb, 481 | "customer_tax_exempt" text, 482 | "customer_tax_ids" jsonb, 483 | "default_payment_method" jsonb, 484 | "default_source" jsonb, 485 | "default_tax_rates" jsonb not null, 486 | "description" text, 487 | "discount" jsonb, 488 | "discounts" jsonb, 489 | "due_date" integer, 490 | "ending_balance" integer, 491 | "footer" text, 492 | "hosted_invoice_url" text, 493 | "id" text, 494 | "invoice_pdf" text, 495 | "last_finalization_error" jsonb, 496 | "lines" jsonb not null, 497 | "livemode" boolean, 498 | "metadata" jsonb, 499 | "next_payment_attempt" integer, 500 | "number" text, 501 | "object" text not null, 502 | "on_behalf_of" jsonb, 503 | "paid" boolean not null, 504 | "paid_out_of_band" boolean not null, 505 | "payment_intent" jsonb, 506 | "payment_settings" jsonb not null, 507 | "period_end" integer not null, 508 | "period_start" integer not null, 509 | "post_payment_credit_notes_amount" integer not null, 510 | "pre_payment_credit_notes_amount" integer not null, 511 | "quote" jsonb, 512 | "receipt_number" text, 513 | "rendering_options" jsonb, 514 | "starting_balance" integer not null, 515 | "statement_descriptor" text, 516 | "status" text, 517 | "status_transitions" jsonb not null, 518 | "subscription" jsonb, 519 | "subscription_proration_date" integer, 520 | "subtotal" integer not null, 521 | "subtotal_excluding_tax" integer, 522 | "tax" integer, 523 | "test_clock" jsonb, 524 | "threshold_reason" jsonb, 525 | "total" integer not null, 526 | "total_discount_amounts" jsonb, 527 | "total_excluding_tax" integer, 528 | "total_tax_amounts" jsonb not null, 529 | "transfer_data" jsonb, 530 | "webhooks_delivered_at" integer 531 | ); 532 | CREATE TABLE stripe.invoiceitem ( 533 | "amount" integer not null, 534 | "currency" text not null, 535 | "customer" jsonb not null, 536 | "date" integer not null, 537 | "description" text, 538 | "discountable" boolean not null, 539 | "discounts" jsonb, 540 | "id" text not null, 541 | "invoice" jsonb, 542 | "livemode" boolean, 543 | "metadata" jsonb, 544 | "object" text not null, 545 | "period" jsonb not null, 546 | "price" jsonb, 547 | "proration" boolean not null, 548 | "quantity" integer not null, 549 | "subscription" jsonb, 550 | "subscription_item" text, 551 | "tax_rates" jsonb, 552 | "test_clock" jsonb, 553 | "unit_amount" integer, 554 | "unit_amount_decimal" text 555 | ); 556 | CREATE TABLE stripe.issuing_authorization ( 557 | "amount" integer not null, 558 | "amount_details" jsonb, 559 | "approved" boolean not null, 560 | "authorization_method" text not null, 561 | "balance_transactions" jsonb not null, 562 | "card" jsonb not null, 563 | "cardholder" jsonb, 564 | "created" integer, 565 | "currency" text not null, 566 | "id" text not null, 567 | "livemode" boolean, 568 | "merchant_amount" integer not null, 569 | "merchant_currency" text not null, 570 | "merchant_data" jsonb not null, 571 | "metadata" jsonb not null, 572 | "object" text not null, 573 | "pending_request" jsonb, 574 | "request_history" jsonb not null, 575 | "status" text, 576 | "transactions" jsonb not null, 577 | "treasury" jsonb, 578 | "verification_data" jsonb not null, 579 | "wallet" text 580 | ); 581 | CREATE TABLE stripe.issuing_card ( 582 | "brand" text not null, 583 | "cancellation_reason" text, 584 | "cardholder" jsonb not null, 585 | "created" integer, 586 | "currency" text not null, 587 | "cvc" text, 588 | "exp_month" integer not null, 589 | "exp_year" integer not null, 590 | "financial_account" text, 591 | "id" text not null, 592 | "last4" text not null, 593 | "livemode" boolean, 594 | "metadata" jsonb not null, 595 | "number" text, 596 | "object" text not null, 597 | "replaced_by" jsonb, 598 | "replacement_for" jsonb, 599 | "replacement_reason" text, 600 | "shipping" jsonb, 601 | "spending_controls" jsonb not null, 602 | "status" text, 603 | "type" text not null, 604 | "wallets" jsonb 605 | ); 606 | CREATE TABLE stripe.issuing_cardholder ( 607 | "billing" jsonb not null, 608 | "company" jsonb, 609 | "created" integer, 610 | "email" text, 611 | "id" text not null, 612 | "individual" jsonb, 613 | "livemode" boolean, 614 | "metadata" jsonb not null, 615 | "name" text not null, 616 | "object" text not null, 617 | "phone_number" text, 618 | "requirements" jsonb not null, 619 | "spending_controls" jsonb, 620 | "status" text, 621 | "type" text 622 | ); 623 | CREATE TABLE stripe.issuing_dispute ( 624 | "amount" integer not null, 625 | "balance_transactions" jsonb, 626 | "created" integer, 627 | "currency" text not null, 628 | "evidence" jsonb not null, 629 | "id" text not null, 630 | "livemode" boolean, 631 | "metadata" jsonb not null, 632 | "object" text not null, 633 | "status" text, 634 | "transaction" jsonb not null, 635 | "treasury" jsonb 636 | ); 637 | CREATE TABLE stripe.issuing_transaction ( 638 | "amount" integer not null, 639 | "amount_details" jsonb, 640 | "authorization" jsonb, 641 | "balance_transaction" jsonb, 642 | "card" jsonb not null, 643 | "cardholder" jsonb, 644 | "created" integer, 645 | "currency" text not null, 646 | "dispute" jsonb, 647 | "id" text not null, 648 | "livemode" boolean, 649 | "merchant_amount" integer not null, 650 | "merchant_currency" text not null, 651 | "merchant_data" jsonb not null, 652 | "metadata" jsonb not null, 653 | "object" text not null, 654 | "purchase_details" jsonb, 655 | "treasury" jsonb, 656 | "type" text, 657 | "wallet" text 658 | ); 659 | CREATE TABLE stripe.mandate ( 660 | "customer_acceptance" jsonb not null, 661 | "id" text not null, 662 | "livemode" boolean, 663 | "multi_use" jsonb, 664 | "object" text not null, 665 | "payment_method" jsonb not null, 666 | "payment_method_details" jsonb not null, 667 | "single_use" jsonb, 668 | "status" text, 669 | "type" text not null 670 | ); 671 | CREATE TABLE stripe.order ( 672 | "amount_subtotal" integer not null, 673 | "amount_total" integer not null, 674 | "application" jsonb, 675 | "automatic_tax" jsonb, 676 | "billing_details" jsonb, 677 | "client_secret" text, 678 | "created" integer, 679 | "currency" text not null, 680 | "customer" jsonb, 681 | "description" text, 682 | "discounts" jsonb, 683 | "id" text not null, 684 | "ip_address" text, 685 | "line_items" jsonb, 686 | "livemode" boolean, 687 | "metadata" jsonb, 688 | "object" text not null, 689 | "payment" jsonb not null, 690 | "shipping_cost" jsonb, 691 | "shipping_details" jsonb, 692 | "status" text, 693 | "tax_details" jsonb, 694 | "total_details" jsonb not null 695 | ); 696 | CREATE TABLE stripe.payment_intent ( 697 | "amount" integer not null, 698 | "amount_capturable" integer, 699 | "amount_details" jsonb, 700 | "amount_received" integer, 701 | "application" jsonb, 702 | "application_fee_amount" integer, 703 | "automatic_payment_methods" jsonb, 704 | "canceled_at" integer, 705 | "cancellation_reason" text, 706 | "capture_method" text not null, 707 | "charges" jsonb, 708 | "client_secret" text, 709 | "confirmation_method" text not null, 710 | "created" integer, 711 | "currency" text not null, 712 | "customer" jsonb, 713 | "description" text, 714 | "id" text not null, 715 | "invoice" jsonb, 716 | "last_payment_error" jsonb, 717 | "livemode" boolean, 718 | "metadata" jsonb, 719 | "next_action" jsonb, 720 | "object" text not null, 721 | "on_behalf_of" jsonb, 722 | "payment_method" jsonb, 723 | "payment_method_options" jsonb, 724 | "payment_method_types" jsonb not null, 725 | "processing" jsonb, 726 | "receipt_email" text, 727 | "review" jsonb, 728 | "setup_future_usage" text, 729 | "shipping" jsonb, 730 | "statement_descriptor" text, 731 | "statement_descriptor_suffix" text, 732 | "status" text, 733 | "transfer_data" jsonb, 734 | "transfer_group" text 735 | ); 736 | CREATE TABLE stripe.payment_link ( 737 | "active" boolean not null, 738 | "after_completion" jsonb not null, 739 | "allow_promotion_codes" boolean not null, 740 | "application_fee_amount" integer, 741 | "application_fee_percent" integer, 742 | "automatic_tax" jsonb not null, 743 | "billing_address_collection" text not null, 744 | "consent_collection" jsonb, 745 | "currency" text not null, 746 | "customer_creation" text not null, 747 | "id" text not null, 748 | "line_items" jsonb, 749 | "livemode" boolean, 750 | "metadata" jsonb not null, 751 | "object" text not null, 752 | "on_behalf_of" jsonb, 753 | "payment_intent_data" jsonb, 754 | "payment_method_collection" text not null, 755 | "payment_method_types" jsonb, 756 | "phone_number_collection" jsonb not null, 757 | "shipping_address_collection" jsonb, 758 | "shipping_options" jsonb not null, 759 | "submit_type" text not null, 760 | "subscription_data" jsonb, 761 | "tax_id_collection" jsonb not null, 762 | "transfer_data" jsonb, 763 | "url" text not null 764 | ); 765 | CREATE TABLE stripe.payment_method ( 766 | "acss_debit" jsonb, 767 | "affirm" jsonb, 768 | "afterpay_clearpay" jsonb, 769 | "alipay" jsonb, 770 | "au_becs_debit" jsonb, 771 | "bacs_debit" jsonb, 772 | "bancontact" jsonb, 773 | "billing_details" jsonb not null, 774 | "blik" jsonb, 775 | "boleto" jsonb, 776 | "card" jsonb, 777 | "card_present" jsonb, 778 | "created" integer, 779 | "customer" jsonb, 780 | "customer_balance" jsonb, 781 | "eps" jsonb, 782 | "fpx" jsonb, 783 | "giropay" jsonb, 784 | "grabpay" jsonb, 785 | "id" text not null, 786 | "ideal" jsonb, 787 | "interac_present" jsonb, 788 | "klarna" jsonb, 789 | "konbini" jsonb, 790 | "link" jsonb, 791 | "livemode" boolean, 792 | "metadata" jsonb, 793 | "object" text not null, 794 | "oxxo" jsonb, 795 | "p24" jsonb, 796 | "paynow" jsonb, 797 | "promptpay" jsonb, 798 | "radar_options" jsonb, 799 | "sepa_debit" jsonb, 800 | "sofort" jsonb, 801 | "type" text, 802 | "us_bank_account" jsonb, 803 | "wechat_pay" jsonb 804 | ); 805 | CREATE TABLE stripe.payout ( 806 | "amount" integer not null, 807 | "arrival_date" integer not null, 808 | "automatic" boolean not null, 809 | "balance_transaction" jsonb, 810 | "created" integer, 811 | "currency" text not null, 812 | "description" text, 813 | "destination" jsonb, 814 | "failure_balance_transaction" jsonb, 815 | "failure_code" text, 816 | "failure_message" text, 817 | "id" text not null, 818 | "livemode" boolean, 819 | "metadata" jsonb, 820 | "method" text not null, 821 | "object" text not null, 822 | "original_payout" jsonb, 823 | "reversed_by" jsonb, 824 | "source_type" text not null, 825 | "statement_descriptor" text, 826 | "status" text, 827 | "type" text 828 | ); 829 | CREATE TABLE stripe.person ( 830 | "account" text not null, 831 | "address" jsonb, 832 | "address_kana" jsonb, 833 | "address_kanji" jsonb, 834 | "created" integer, 835 | "dob" jsonb, 836 | "email" text, 837 | "first_name" text, 838 | "first_name_kana" text, 839 | "first_name_kanji" text, 840 | "full_name_aliases" jsonb, 841 | "future_requirements" jsonb, 842 | "gender" text, 843 | "id" text not null, 844 | "id_number_provided" boolean, 845 | "id_number_secondary_provided" boolean, 846 | "last_name" text, 847 | "last_name_kana" text, 848 | "last_name_kanji" text, 849 | "maiden_name" text, 850 | "metadata" jsonb, 851 | "nationality" text, 852 | "object" text not null, 853 | "phone" text, 854 | "political_exposure" text, 855 | "registered_address" jsonb, 856 | "relationship" jsonb, 857 | "requirements" jsonb, 858 | "ssn_last_4_provided" boolean, 859 | "verification" jsonb 860 | ); 861 | CREATE TABLE stripe.plan ( 862 | "active" boolean not null, 863 | "aggregate_usage" text, 864 | "amount" integer, 865 | "amount_decimal" text, 866 | "billing_scheme" text not null, 867 | "created" integer, 868 | "currency" text not null, 869 | "id" text not null, 870 | "interval" text not null, 871 | "interval_count" integer not null, 872 | "livemode" boolean, 873 | "metadata" jsonb, 874 | "nickname" text, 875 | "object" text not null, 876 | "product" jsonb, 877 | "tiers" jsonb, 878 | "tiers_mode" text, 879 | "transform_usage" jsonb, 880 | "trial_period_days" integer, 881 | "usage_type" text not null 882 | ); 883 | CREATE TABLE stripe.price ( 884 | "active" boolean not null, 885 | "billing_scheme" text not null, 886 | "created" integer, 887 | "currency" text not null, 888 | "currency_options" jsonb, 889 | "custom_unit_amount" jsonb, 890 | "id" text not null, 891 | "livemode" boolean, 892 | "lookup_key" text, 893 | "metadata" jsonb not null, 894 | "nickname" text, 895 | "object" text not null, 896 | "product" jsonb not null, 897 | "recurring" jsonb, 898 | "tax_behavior" text, 899 | "tiers" jsonb, 900 | "tiers_mode" text, 901 | "transform_quantity" jsonb, 902 | "type" text not null, 903 | "unit_amount" integer, 904 | "unit_amount_decimal" text 905 | ); 906 | CREATE TABLE stripe.product ( 907 | "active" boolean not null, 908 | "created" integer, 909 | "default_price" jsonb, 910 | "description" text, 911 | "id" text not null, 912 | "images" jsonb not null, 913 | "livemode" boolean, 914 | "metadata" jsonb not null, 915 | "name" text not null, 916 | "object" text not null, 917 | "package_dimensions" jsonb, 918 | "shippable" boolean, 919 | "statement_descriptor" text, 920 | "tax_code" jsonb, 921 | "unit_label" text, 922 | "updated" integer not null, 923 | "url" text 924 | ); 925 | CREATE TABLE stripe.promotion_code ( 926 | "active" boolean not null, 927 | "code" text not null, 928 | "coupon" jsonb not null, 929 | "created" integer, 930 | "customer" jsonb, 931 | "expires_at" integer, 932 | "id" text not null, 933 | "livemode" boolean, 934 | "max_redemptions" integer, 935 | "metadata" jsonb, 936 | "object" text not null, 937 | "restrictions" jsonb not null, 938 | "times_redeemed" integer not null 939 | ); 940 | CREATE TABLE stripe.quote ( 941 | "amount_subtotal" integer not null, 942 | "amount_total" integer not null, 943 | "application" jsonb, 944 | "application_fee_amount" integer, 945 | "application_fee_percent" integer, 946 | "automatic_tax" jsonb not null, 947 | "collection_method" text not null, 948 | "computed" jsonb not null, 949 | "created" integer, 950 | "currency" text, 951 | "customer" jsonb, 952 | "default_tax_rates" jsonb, 953 | "description" text, 954 | "discounts" jsonb not null, 955 | "expires_at" integer not null, 956 | "footer" text, 957 | "from_quote" jsonb, 958 | "header" text, 959 | "id" text not null, 960 | "invoice" jsonb, 961 | "invoice_settings" jsonb, 962 | "line_items" jsonb, 963 | "livemode" boolean, 964 | "metadata" jsonb not null, 965 | "number" text, 966 | "object" text not null, 967 | "on_behalf_of" jsonb, 968 | "status" text, 969 | "status_transitions" jsonb not null, 970 | "subscription" jsonb, 971 | "subscription_data" jsonb not null, 972 | "subscription_schedule" jsonb, 973 | "test_clock" jsonb, 974 | "total_details" jsonb not null, 975 | "transfer_data" jsonb 976 | ); 977 | CREATE TABLE stripe.early_fraud_warning ( 978 | "actionable" boolean not null, 979 | "charge" jsonb not null, 980 | "created" integer, 981 | "fraud_type" text not null, 982 | "id" text not null, 983 | "livemode" boolean, 984 | "object" text not null, 985 | "payment_intent" jsonb 986 | ); 987 | CREATE TABLE stripe.recipient ( 988 | "active_account" jsonb, 989 | "cards" jsonb, 990 | "created" integer, 991 | "default_card" jsonb, 992 | "description" text, 993 | "email" text, 994 | "id" text not null, 995 | "livemode" boolean, 996 | "metadata" jsonb not null, 997 | "migrated_to" jsonb, 998 | "name" text, 999 | "object" text not null, 1000 | "rolled_back_from" jsonb, 1001 | "type" text not null 1002 | ); 1003 | CREATE TABLE stripe.report_run ( 1004 | "created" integer, 1005 | "error" text, 1006 | "id" text not null, 1007 | "livemode" boolean, 1008 | "object" text not null, 1009 | "parameters" jsonb not null, 1010 | "report_type" text not null, 1011 | "result" jsonb, 1012 | "status" text, 1013 | "succeeded_at" integer 1014 | ); 1015 | CREATE TABLE stripe.report_type ( 1016 | "data_available_end" integer not null, 1017 | "data_available_start" integer not null, 1018 | "default_columns" jsonb, 1019 | "id" text not null, 1020 | "livemode" boolean, 1021 | "name" text not null, 1022 | "object" text not null, 1023 | "updated" integer not null, 1024 | "version" integer not null 1025 | ); 1026 | CREATE TABLE stripe.review ( 1027 | "billing_zip" text, 1028 | "charge" jsonb, 1029 | "closed_reason" text, 1030 | "created" integer, 1031 | "id" text not null, 1032 | "ip_address" text, 1033 | "ip_address_location" jsonb, 1034 | "livemode" boolean, 1035 | "object" text not null, 1036 | "open" boolean not null, 1037 | "opened_reason" text not null, 1038 | "payment_intent" jsonb, 1039 | "reason" text not null, 1040 | "session" jsonb 1041 | ); 1042 | CREATE TABLE stripe.setup_intent ( 1043 | "application" jsonb, 1044 | "attach_to_self" boolean, 1045 | "cancellation_reason" text, 1046 | "client_secret" text, 1047 | "created" integer, 1048 | "customer" jsonb, 1049 | "description" text, 1050 | "flow_directions" jsonb, 1051 | "id" text not null, 1052 | "last_setup_error" jsonb, 1053 | "latest_attempt" jsonb, 1054 | "livemode" boolean, 1055 | "mandate" jsonb, 1056 | "metadata" jsonb, 1057 | "next_action" jsonb, 1058 | "object" text not null, 1059 | "on_behalf_of" jsonb, 1060 | "payment_method" jsonb, 1061 | "payment_method_options" jsonb, 1062 | "payment_method_types" jsonb not null, 1063 | "single_use_mandate" jsonb, 1064 | "status" text, 1065 | "usage" text not null 1066 | ); 1067 | CREATE TABLE stripe.scheduled_query_run ( 1068 | "created" integer, 1069 | "data_load_time" integer not null, 1070 | "error" jsonb, 1071 | "file" jsonb, 1072 | "id" text not null, 1073 | "livemode" boolean, 1074 | "object" text not null, 1075 | "result_available_until" integer not null, 1076 | "sql" text not null, 1077 | "status" text, 1078 | "title" text not null 1079 | ); 1080 | CREATE TABLE stripe.sku ( 1081 | "active" boolean not null, 1082 | "attributes" jsonb not null, 1083 | "created" integer, 1084 | "currency" text not null, 1085 | "id" text not null, 1086 | "image" text, 1087 | "inventory" jsonb not null, 1088 | "livemode" boolean, 1089 | "metadata" jsonb not null, 1090 | "object" text not null, 1091 | "package_dimensions" jsonb, 1092 | "price" integer not null, 1093 | "product" jsonb not null, 1094 | "updated" integer not null 1095 | ); 1096 | CREATE TABLE stripe.transaction ( 1097 | "ach_credit_transfer" jsonb, 1098 | "amount" integer not null, 1099 | "chf_credit_transfer" jsonb, 1100 | "created" integer, 1101 | "currency" text not null, 1102 | "gbp_credit_transfer" jsonb, 1103 | "id" text not null, 1104 | "livemode" boolean, 1105 | "object" text not null, 1106 | "paper_check" jsonb, 1107 | "sepa_credit_transfer" jsonb, 1108 | "source" text not null, 1109 | "status" text, 1110 | "type" text not null 1111 | ); 1112 | CREATE TABLE stripe.subscription_schedule ( 1113 | "application" jsonb, 1114 | "canceled_at" integer, 1115 | "completed_at" integer, 1116 | "created" integer, 1117 | "current_phase" jsonb, 1118 | "customer" jsonb not null, 1119 | "default_settings" jsonb not null, 1120 | "end_behavior" text not null, 1121 | "id" text not null, 1122 | "livemode" boolean, 1123 | "metadata" jsonb, 1124 | "object" text not null, 1125 | "phases" jsonb not null, 1126 | "released_at" integer, 1127 | "released_subscription" text, 1128 | "status" text, 1129 | "subscription" jsonb, 1130 | "test_clock" jsonb 1131 | ); 1132 | CREATE TABLE stripe.tax_rate ( 1133 | "active" boolean not null, 1134 | "country" text, 1135 | "created" integer, 1136 | "description" text, 1137 | "display_name" text not null, 1138 | "id" text not null, 1139 | "inclusive" boolean not null, 1140 | "jurisdiction" text, 1141 | "livemode" boolean, 1142 | "metadata" jsonb, 1143 | "object" text not null, 1144 | "percentage" integer not null, 1145 | "state" text, 1146 | "tax_type" text 1147 | ); 1148 | CREATE TABLE stripe.reader ( 1149 | "action" jsonb, 1150 | "device_sw_version" text, 1151 | "device_type" text not null, 1152 | "id" text not null, 1153 | "ip_address" text, 1154 | "label" text not null, 1155 | "livemode" boolean, 1156 | "location" jsonb, 1157 | "metadata" jsonb not null, 1158 | "object" text not null, 1159 | "serial_number" text not null, 1160 | "status" text 1161 | ); 1162 | CREATE TABLE stripe.test_clock ( 1163 | "created" integer, 1164 | "deletes_after" integer not null, 1165 | "frozen_time" integer not null, 1166 | "id" text not null, 1167 | "livemode" boolean, 1168 | "name" text, 1169 | "object" text not null, 1170 | "status" text 1171 | ); 1172 | CREATE TABLE stripe.topup ( 1173 | "amount" integer not null, 1174 | "balance_transaction" jsonb, 1175 | "created" integer, 1176 | "currency" text not null, 1177 | "description" text, 1178 | "expected_availability_date" integer, 1179 | "failure_code" text, 1180 | "failure_message" text, 1181 | "id" text not null, 1182 | "livemode" boolean, 1183 | "metadata" jsonb not null, 1184 | "object" text not null, 1185 | "source" jsonb, 1186 | "statement_descriptor" text, 1187 | "status" text, 1188 | "transfer_group" text 1189 | ); 1190 | CREATE TABLE stripe.transfer ( 1191 | "amount" integer not null, 1192 | "amount_reversed" integer not null, 1193 | "balance_transaction" jsonb, 1194 | "created" integer, 1195 | "currency" text not null, 1196 | "description" text, 1197 | "destination" jsonb, 1198 | "destination_payment" jsonb, 1199 | "id" text not null, 1200 | "livemode" boolean, 1201 | "metadata" jsonb not null, 1202 | "object" text not null, 1203 | "reversals" jsonb not null, 1204 | "reversed" boolean not null, 1205 | "source_transaction" jsonb, 1206 | "source_type" text, 1207 | "transfer_group" text 1208 | ); 1209 | CREATE TABLE stripe.credit_reversal ( 1210 | "amount" integer not null, 1211 | "currency" text not null, 1212 | "financial_account" text not null, 1213 | "hosted_regulatory_receipt_url" text, 1214 | "id" text not null, 1215 | "livemode" boolean, 1216 | "metadata" jsonb not null, 1217 | "network" text not null, 1218 | "object" text not null, 1219 | "received_credit" text not null, 1220 | "status" text, 1221 | "status_transitions" jsonb not null, 1222 | "transaction" jsonb 1223 | ); 1224 | CREATE TABLE stripe.debit_reversal ( 1225 | "amount" integer not null, 1226 | "currency" text not null, 1227 | "financial_account" text, 1228 | "hosted_regulatory_receipt_url" text, 1229 | "id" text not null, 1230 | "linked_flows" jsonb, 1231 | "livemode" boolean, 1232 | "metadata" jsonb not null, 1233 | "network" text not null, 1234 | "object" text not null, 1235 | "received_debit" text not null, 1236 | "status" text, 1237 | "status_transitions" jsonb not null, 1238 | "transaction" jsonb 1239 | ); 1240 | CREATE TABLE stripe.financial_account ( 1241 | "active_features" jsonb not null, 1242 | "balance" jsonb not null, 1243 | "country" text not null, 1244 | "created" integer, 1245 | "features" jsonb, 1246 | "financial_addresses" jsonb not null, 1247 | "id" text not null, 1248 | "livemode" boolean, 1249 | "metadata" jsonb, 1250 | "object" text not null, 1251 | "pending_features" jsonb not null, 1252 | "platform_restrictions" jsonb, 1253 | "restricted_features" jsonb not null, 1254 | "status" text, 1255 | "status_details" jsonb not null, 1256 | "supported_currencies" jsonb not null 1257 | ); 1258 | CREATE TABLE stripe.inbound_transfer ( 1259 | "amount" integer not null, 1260 | "cancelable" boolean not null, 1261 | "created" integer, 1262 | "currency" text not null, 1263 | "description" text, 1264 | "failure_details" jsonb, 1265 | "financial_account" text not null, 1266 | "hosted_regulatory_receipt_url" text, 1267 | "id" text not null, 1268 | "linked_flows" jsonb not null, 1269 | "livemode" boolean, 1270 | "metadata" jsonb not null, 1271 | "object" text not null, 1272 | "origin_payment_method" text not null, 1273 | "origin_payment_method_details" jsonb, 1274 | "returned" boolean, 1275 | "statement_descriptor" text not null, 1276 | "status" text, 1277 | "status_transitions" jsonb not null, 1278 | "transaction" jsonb 1279 | ); 1280 | CREATE TABLE stripe.outbound_payment ( 1281 | "amount" integer not null, 1282 | "cancelable" boolean not null, 1283 | "created" integer, 1284 | "currency" text not null, 1285 | "customer" text, 1286 | "description" text, 1287 | "destination_payment_method" text, 1288 | "destination_payment_method_details" jsonb, 1289 | "end_user_details" jsonb, 1290 | "expected_arrival_date" integer not null, 1291 | "financial_account" text not null, 1292 | "hosted_regulatory_receipt_url" text, 1293 | "id" text not null, 1294 | "livemode" boolean, 1295 | "metadata" jsonb not null, 1296 | "object" text not null, 1297 | "returned_details" jsonb, 1298 | "statement_descriptor" text not null, 1299 | "status" text, 1300 | "status_transitions" jsonb not null, 1301 | "transaction" jsonb not null 1302 | ); 1303 | CREATE TABLE stripe.outbound_transfer ( 1304 | "amount" integer not null, 1305 | "cancelable" boolean not null, 1306 | "created" integer, 1307 | "currency" text not null, 1308 | "description" text, 1309 | "destination_payment_method" text not null, 1310 | "destination_payment_method_details" jsonb not null, 1311 | "expected_arrival_date" integer not null, 1312 | "financial_account" text not null, 1313 | "hosted_regulatory_receipt_url" text, 1314 | "id" text not null, 1315 | "livemode" boolean, 1316 | "metadata" jsonb not null, 1317 | "object" text not null, 1318 | "returned_details" jsonb, 1319 | "statement_descriptor" text not null, 1320 | "status" text, 1321 | "status_transitions" jsonb not null, 1322 | "transaction" jsonb not null 1323 | ); 1324 | CREATE TABLE stripe.received_credit ( 1325 | "amount" integer not null, 1326 | "created" integer, 1327 | "currency" text not null, 1328 | "description" text not null, 1329 | "failure_code" text, 1330 | "financial_account" text, 1331 | "hosted_regulatory_receipt_url" text, 1332 | "id" text not null, 1333 | "initiating_payment_method_details" jsonb not null, 1334 | "linked_flows" jsonb not null, 1335 | "livemode" boolean, 1336 | "network" text, 1337 | "object" text not null, 1338 | "reversal_details" jsonb, 1339 | "status" text, 1340 | "transaction" jsonb 1341 | ); 1342 | CREATE TABLE stripe.received_debit ( 1343 | "amount" integer not null, 1344 | "created" integer, 1345 | "currency" text not null, 1346 | "description" text not null, 1347 | "failure_code" text, 1348 | "financial_account" text, 1349 | "hosted_regulatory_receipt_url" text, 1350 | "id" text not null, 1351 | "initiating_payment_method_details" jsonb, 1352 | "linked_flows" jsonb not null, 1353 | "livemode" boolean, 1354 | "network" text, 1355 | "object" text not null, 1356 | "reversal_details" jsonb, 1357 | "status" text, 1358 | "transaction" jsonb 1359 | ); 1360 | 1361 | grant usage on schema stripe to service_role; 1362 | grant all privileges on all tables in schema stripe to service_role; -------------------------------------------------------------------------------- /supabase/migrations/20220831120412_profiles.sql: -------------------------------------------------------------------------------- 1 | create table "public"."profiles" ( 2 | "id" uuid not null, 3 | "updated_at" timestamp with time zone not null default now(), 4 | "full_name" text, 5 | "username" text 6 | ); 7 | 8 | 9 | alter table "public"."profiles" enable row level security; 10 | 11 | CREATE UNIQUE INDEX profiles_pkey ON public.profiles USING btree (id); 12 | 13 | CREATE UNIQUE INDEX profiles_username_key ON public.profiles USING btree (username); 14 | 15 | alter table "public"."profiles" add constraint "profiles_pkey" PRIMARY KEY using index "profiles_pkey"; 16 | 17 | alter table "public"."profiles" add constraint "profiles_id_fkey" FOREIGN KEY (id) REFERENCES auth.users(id) not valid; 18 | 19 | alter table "public"."profiles" validate constraint "profiles_id_fkey"; 20 | 21 | alter table "public"."profiles" add constraint "profiles_username_key" UNIQUE using index "profiles_username_key"; 22 | 23 | 24 | create policy "profiles.allow_select_own_profile" on profiles 25 | for select using (auth.uid() = id); 26 | 27 | create policy "profiles.allow_update_own_profile" on profiles 28 | for update using (auth.uid() = id); 29 | 30 | 31 | create function public.create_user_profile() 32 | returns trigger 33 | language plpgsql 34 | security definer 35 | as $$ 36 | begin 37 | insert into public.profiles (id) 38 | values (new.id); 39 | return new; 40 | end; 41 | $$; 42 | 43 | -- trigger the function every time a user is inserted 44 | create trigger on_auth_user_inserted_create_profile 45 | after insert on auth.users 46 | for each row execute procedure public.create_user_profile(); 47 | -------------------------------------------------------------------------------- /svelte.config.js: -------------------------------------------------------------------------------- 1 | import adapter from '@sveltejs/adapter-auto'; 2 | import preprocess from 'svelte-preprocess'; 3 | 4 | /** @type {import('@sveltejs/kit').Config} */ 5 | const config = { 6 | // Consult https://github.com/sveltejs/svelte-preprocess 7 | // for more information about preprocessors 8 | preprocess: [ 9 | preprocess({ 10 | postcss: true 11 | }) 12 | ], 13 | 14 | kit: { 15 | adapter: adapter() 16 | } 17 | }; 18 | 19 | export default config; 20 | -------------------------------------------------------------------------------- /tailwind.config.cjs: -------------------------------------------------------------------------------- 1 | const config = { 2 | content: [ 3 | './src/**/*.{html,js,svelte,ts}', 4 | "./node_modules/@brainandbones/skeleton/**/*.{html,js,svelte,ts}" 5 | ], 6 | darkMode: 'class', 7 | theme: { 8 | extend: {} 9 | }, 10 | 11 | plugins: [ 12 | require('@tailwindcss/forms'), 13 | require("@brainandbones/skeleton/tailwind/theme.cjs") 14 | 15 | ] 16 | }; 17 | 18 | module.exports = config; 19 | -------------------------------------------------------------------------------- /tests/test.ts: -------------------------------------------------------------------------------- 1 | import { expect, test } from '@playwright/test'; 2 | 3 | test('index page has expected h1', async ({ page }) => { 4 | await page.goto('/'); 5 | expect(await page.textContent('h1')).toBe('Welcome to SvelteKit'); 6 | }); 7 | -------------------------------------------------------------------------------- /tsconfig.json: -------------------------------------------------------------------------------- 1 | { 2 | "extends": "./.svelte-kit/tsconfig.json", 3 | "compilerOptions": { 4 | "allowJs": true, 5 | "checkJs": true, 6 | "esModuleInterop": true, 7 | "forceConsistentCasingInFileNames": true, 8 | "resolveJsonModule": true, 9 | "skipLibCheck": true, 10 | "sourceMap": true, 11 | "strict": true 12 | } 13 | // Path aliases are handled by https://kit.svelte.dev/docs/configuration#alias 14 | // 15 | // If you want to overwrite includes/excludes, make sure to copy over the relevant includes/excludes 16 | // from the referenced tsconfig.json - TypeScript does not merge them in 17 | } 18 | -------------------------------------------------------------------------------- /vite.config.ts: -------------------------------------------------------------------------------- 1 | import { sveltekit } from '@sveltejs/kit/vite'; 2 | import type { UserConfig } from 'vite'; 3 | 4 | const config: UserConfig = { 5 | plugins: [sveltekit()] 6 | }; 7 | 8 | export default config; 9 | --------------------------------------------------------------------------------