├── .dockerignore ├── .editorconfig ├── .gitignore ├── Makefile ├── README.md ├── docker-compose.dev.yml ├── frontend ├── .dockerignore ├── .gitignore ├── .npmrc ├── .prettierignore ├── .prettierrc ├── Dockerfile ├── Dockerfile.dev ├── README.md ├── jsconfig.json ├── package.json ├── pnpm-lock.yaml ├── postcss.config.cjs ├── src │ ├── app.html │ ├── app.postcss │ ├── global.d.ts │ ├── lib │ │ └── variables.js │ └── routes │ │ ├── __layout.svelte │ │ └── index.svelte ├── static │ └── favicon.png ├── svelte.config.js └── tailwind.config.cjs ├── piccolo-fastapi ├── Dockerfile ├── app.py ├── config.py ├── dependencies.py ├── entrypoint.sh ├── main.py ├── piccolo_conf.py ├── poetry.lock ├── product │ ├── __init__.py │ ├── models.py │ ├── piccolo_app.py │ ├── piccolo_migrations │ │ ├── 2021-06-22T00-35-24.py │ │ └── __init__.py │ ├── routers.py │ └── tables.py ├── pyproject.toml └── requirements.txt └── sample.env /.dockerignore: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/heliumbrain/fastapi-piccolo/895f55790d05782a1bd7d042b305fd8343c47d62/.dockerignore -------------------------------------------------------------------------------- /.editorconfig: -------------------------------------------------------------------------------- 1 | root = true 2 | 3 | [*] 4 | end_of_line = lf 5 | insert_final_newline = false 6 | charset = utf-8 7 | 8 | 9 | [*.{svelte,js,yml}] 10 | indent_style = space 11 | indent_size = 2 12 | 13 | [*.py] 14 | indent_style = space 15 | indent_size = 4 16 | 17 | [*.json] 18 | indent_style = tab 19 | indent_size = 4 -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | .venv 2 | __pycache__ 3 | .env 4 | .DS_Store 5 | .vscode 6 | waypoint.hcl -------------------------------------------------------------------------------- /Makefile: -------------------------------------------------------------------------------- 1 | .PHONY: build 2 | build: 3 | docker-compose -f docker-compose.dev.yml build 4 | .PHONY: up 5 | up: 6 | docker-compose --env-file=sample.env -f docker-compose.dev.yml up 7 | 8 | .PHONY: down 9 | down: 10 | docker-compose -f docker-compose.dev.yml down -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # WORK IN PROGRESS! 2 | ## FastAPI + Piccolo ORM + SvelteKit 3 | This is a practical example project showing how to use FastAPI together with the Piccolo ORM. Also includes a very simple frontend built with SvelteKit to prove that it works :) 4 | 5 | ## Stuff used 6 | * FastAPI 7 | * Piccolo ORM 8 | * Postgres 9 | * SvelteKit 10 | 11 | ### How to run 12 | 1. Clone the repo 13 | 2. Run `make build && make up` in your terminal 14 | 15 | To shut the docker containers down simply run `make down` in your terminal. Please note that any data attached to the Docker containers will be lost. 16 | 17 | ### Good to know 18 | There's a `sample.env` file included to set the needed environment variables for the different parts of the app to run. Please note that if you want to change this you will also have to change the `Makefile` to use the correct `.env` file for the `make up` command. 19 | -------------------------------------------------------------------------------- /docker-compose.dev.yml: -------------------------------------------------------------------------------- 1 | version: "3.9" 2 | 3 | services: 4 | frontend: 5 | container_name: frontend 6 | build: 7 | context: ./frontend 8 | dockerfile: Dockerfile.dev 9 | volumes: 10 | - ./frontend:/usr/src/app 11 | ports: 12 | - "3000:3000" 13 | environment: 14 | VITE_API_BASE_PATH: $VITE_API_BASE_PATH 15 | depends_on: 16 | - postgres 17 | - fastapi 18 | 19 | fastapi: 20 | container_name: backend 21 | build: ./piccolo-fastapi 22 | command: uvicorn app:app --reload --workers 1 --host 0.0.0.0 --port 8000 23 | volumes: 24 | - ./piccolo-fastapi:/usr/src/app 25 | ports: 26 | - 8000:8000 27 | environment: 28 | POSTGRES_DB: $POSTGRES_DB 29 | POSTGRES_USER: $POSTGRES_USER 30 | POSTGRES_PASSWORD: $POSTGRES_PASSWORD 31 | POSTGRES_PORT: $POSTGRES_PORT 32 | POSTGRES_HOST: $POSTGRES_HOST 33 | depends_on: 34 | - postgres 35 | 36 | postgres: 37 | container_name: db 38 | image: postgres 39 | environment: 40 | POSTGRES_DB: $POSTGRES_DB 41 | POSTGRES_USER: $POSTGRES_USER 42 | POSTGRES_PASSWORD: $POSTGRES_PASSWORD 43 | ports: 44 | - "5432:5432" 45 | volumes: 46 | - fastapi-piccolo-db:/var/lib/postgresql/data 47 | 48 | volumes: 49 | fastapi-piccolo-db: 50 | 51 | networks: 52 | default: 53 | name: fastapi-piccolo 54 | -------------------------------------------------------------------------------- /frontend/.dockerignore: -------------------------------------------------------------------------------- 1 | node_modules 2 | npm-debug.log 3 | /.svelte-kit 4 | build 5 | .svelte-kit -------------------------------------------------------------------------------- /frontend/.gitignore: -------------------------------------------------------------------------------- 1 | .DS_Store 2 | node_modules 3 | /.svelte-kit 4 | /package 5 | build -------------------------------------------------------------------------------- /frontend/.npmrc: -------------------------------------------------------------------------------- 1 | engine-strict=true 2 | -------------------------------------------------------------------------------- /frontend/.prettierignore: -------------------------------------------------------------------------------- 1 | .svelte-kit/** 2 | static/** 3 | build/** 4 | node_modules/** 5 | -------------------------------------------------------------------------------- /frontend/.prettierrc: -------------------------------------------------------------------------------- 1 | { 2 | "useTabs": true, 3 | "singleQuote": true, 4 | "trailingComma": "none", 5 | "printWidth": 100 6 | } 7 | -------------------------------------------------------------------------------- /frontend/Dockerfile: -------------------------------------------------------------------------------- 1 | FROM mhart/alpine-node:16 2 | 3 | # install dependencies 4 | WORKDIR /app 5 | COPY package.json pnpm-lock.yaml ./ 6 | RUN npm install -g pnpm 7 | RUN pnpm install 8 | 9 | # Copy all local files into the image. 10 | COPY . . 11 | 12 | RUN pnpm build 13 | 14 | ### 15 | # Only copy over the Node pieces we need 16 | # ~> Saves 35MB 17 | ### 18 | FROM mhart/alpine-node:slim-16 19 | 20 | WORKDIR /app 21 | COPY --from=0 /app . 22 | COPY . . 23 | 24 | EXPOSE 3000 25 | CMD ["node", "./build"] -------------------------------------------------------------------------------- /frontend/Dockerfile.dev: -------------------------------------------------------------------------------- 1 | FROM node:16 2 | 3 | # install dependencies 4 | WORKDIR /usr/src/app 5 | COPY package.json pnpm-lock.yaml ./ 6 | RUN npm install -g pnpm 7 | RUN pnpm install 8 | 9 | # Copy all local files into the image. 10 | COPY . . 11 | 12 | CMD pnpm dev -------------------------------------------------------------------------------- /frontend/README.md: -------------------------------------------------------------------------------- 1 | # create-svelte 2 | 3 | Everything you need to build a Svelte project, powered by [`create-svelte`](https://github.com/sveltejs/kit/tree/master/packages/create-svelte); 4 | 5 | ## Creating a project 6 | 7 | If you're seeing this, you've probably already done this step. Congrats! 8 | 9 | ```bash 10 | # create a new project in the current directory 11 | npm init svelte@next 12 | 13 | # create a new project in my-app 14 | npm init svelte@next my-app 15 | ``` 16 | 17 | > Note: the `@next` is temporary 18 | 19 | ## Developing 20 | 21 | Once you've created a project and installed dependencies with `npm install` (or `pnpm install` or `yarn`), start a development server: 22 | 23 | ```bash 24 | npm run dev 25 | 26 | # or start the server and open the app in a new browser tab 27 | npm run dev -- --open 28 | ``` 29 | 30 | ## Building 31 | 32 | Before creating a production version of your app, install an [adapter](https://kit.svelte.dev/docs#adapters) for your target environment. Then: 33 | 34 | ```bash 35 | npm run build 36 | ``` 37 | 38 | > You can preview the built app with `npm run preview`, regardless of whether you installed an adapter. This should _not_ be used to serve your app in production. 39 | -------------------------------------------------------------------------------- /frontend/jsconfig.json: -------------------------------------------------------------------------------- 1 | { 2 | "compilerOptions": { 3 | "baseUrl": ".", 4 | "paths": { 5 | "$lib/*": ["src/lib/*"] 6 | } 7 | }, 8 | "include": ["src/**/*.d.ts", "src/**/*.js", "src/**/*.svelte"] 9 | } 10 | -------------------------------------------------------------------------------- /frontend/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "FastAPI & Piccolo - Frontend", 3 | "version": "0.0.1", 4 | "scripts": { 5 | "dev": "svelte-kit dev --host", 6 | "build": "svelte-kit build", 7 | "preview": "svelte-kit preview", 8 | "lint": "prettier --check --plugin-search-dir=. .", 9 | "format": "prettier --write --plugin-search-dir=. ." 10 | }, 11 | "devDependencies": { 12 | "@sveltejs/adapter-node": "^1.0.0-next.27", 13 | "@sveltejs/kit": "next", 14 | "autoprefixer": "^10.2.6", 15 | "cssnano": "^5.0.6", 16 | "postcss": "^8.3.5", 17 | "postcss-load-config": "^3.1.0", 18 | "prettier": "~2.2.1", 19 | "prettier-plugin-svelte": "^2.3.1", 20 | "svelte": "^3.38.3", 21 | "svelte-preprocess": "^4.7.3", 22 | "tailwindcss": "^2.2.2" 23 | }, 24 | "type": "module" 25 | } -------------------------------------------------------------------------------- /frontend/pnpm-lock.yaml: -------------------------------------------------------------------------------- 1 | lockfileVersion: 5.3 2 | 3 | specifiers: 4 | '@sveltejs/adapter-node': ^1.0.0-next.27 5 | '@sveltejs/kit': next 6 | autoprefixer: ^10.2.6 7 | cssnano: ^5.0.6 8 | postcss: ^8.3.5 9 | postcss-load-config: ^3.1.0 10 | prettier: ~2.2.1 11 | prettier-plugin-svelte: ^2.3.1 12 | svelte: ^3.38.3 13 | svelte-preprocess: ^4.7.3 14 | tailwindcss: ^2.2.2 15 | 16 | devDependencies: 17 | '@sveltejs/adapter-node': 1.0.0-next.27 18 | '@sveltejs/kit': 1.0.0-next.116_svelte@3.38.3 19 | autoprefixer: 10.2.6_postcss@8.3.5 20 | cssnano: 5.0.6_postcss@8.3.5 21 | postcss: 8.3.5 22 | postcss-load-config: 3.1.0 23 | prettier: 2.2.1 24 | prettier-plugin-svelte: 2.3.1_prettier@2.2.1+svelte@3.38.3 25 | svelte: 3.38.3 26 | svelte-preprocess: 4.7.3_7d4d22e7287a4965435cb62392efd75a 27 | tailwindcss: 2.2.2_72be89de93206f86f2d67dd5290ec14d 28 | 29 | packages: 30 | 31 | /@babel/code-frame/7.14.5: 32 | resolution: {integrity: sha512-9pzDqyc6OLDaqe+zbACgFkb6fKMNG6CObKpnYXChRsvYGyEdc7CA2BaqeOM+vOtCS5ndmJicPJhKAwYRI6UfFw==} 33 | engines: {node: '>=6.9.0'} 34 | dependencies: 35 | '@babel/highlight': 7.14.5 36 | dev: true 37 | 38 | /@babel/helper-validator-identifier/7.14.5: 39 | resolution: {integrity: sha512-5lsetuxCLilmVGyiLEfoHBRX8UCFD+1m2x3Rj97WrW3V7H3u4RWRXA4evMjImCsin2J2YT0QaVDGf+z8ondbAg==} 40 | engines: {node: '>=6.9.0'} 41 | dev: true 42 | 43 | /@babel/highlight/7.14.5: 44 | resolution: {integrity: sha512-qf9u2WFWVV0MppaL877j2dBtQIDgmidgjGk5VIMw3OadXvYaXn66U1BFlH2t4+t3i+8PhedppRv+i40ABzd+gg==} 45 | engines: {node: '>=6.9.0'} 46 | dependencies: 47 | '@babel/helper-validator-identifier': 7.14.5 48 | chalk: 2.4.2 49 | js-tokens: 4.0.0 50 | dev: true 51 | 52 | /@fullhuman/postcss-purgecss/4.0.3_postcss@8.3.5: 53 | resolution: {integrity: sha512-/EnQ9UDWGGqHkn1UKAwSgh+gJHPKmD+Z+5dQ4gWT4qq2NUyez3zqAfZNwFH3eSgmgO+wjTXfhlLchx2M9/K+7Q==} 54 | peerDependencies: 55 | postcss: ^8.0.0 56 | dependencies: 57 | postcss: 8.3.5 58 | purgecss: 4.0.3 59 | dev: true 60 | 61 | /@nodelib/fs.scandir/2.1.5: 62 | resolution: {integrity: sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==} 63 | engines: {node: '>= 8'} 64 | dependencies: 65 | '@nodelib/fs.stat': 2.0.5 66 | run-parallel: 1.2.0 67 | dev: true 68 | 69 | /@nodelib/fs.stat/2.0.5: 70 | resolution: {integrity: sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==} 71 | engines: {node: '>= 8'} 72 | dev: true 73 | 74 | /@nodelib/fs.walk/1.2.7: 75 | resolution: {integrity: sha512-BTIhocbPBSrRmHxOAJFtR18oLhxTtAFDAvL8hY1S3iU8k+E60W/YFs4jrixGzQjMpF4qPXxIQHcjVD9dz1C2QA==} 76 | engines: {node: '>= 8'} 77 | dependencies: 78 | '@nodelib/fs.scandir': 2.1.5 79 | fastq: 1.11.0 80 | dev: true 81 | 82 | /@rollup/pluginutils/4.1.0: 83 | resolution: {integrity: sha512-TrBhfJkFxA+ER+ew2U2/fHbebhLT/l/2pRk0hfj9KusXUuRXd2v0R58AfaZK9VXDQ4TogOSEmICVrQAA3zFnHQ==} 84 | engines: {node: '>= 8.0.0'} 85 | peerDependencies: 86 | rollup: ^1.20.0||^2.0.0 87 | dependencies: 88 | estree-walker: 2.0.2 89 | picomatch: 2.3.0 90 | dev: true 91 | 92 | /@sveltejs/adapter-node/1.0.0-next.27: 93 | resolution: {integrity: sha512-Ia1GyJ39dZBFRkX20P31pzASOJDtR0DCVV0wvN+znn06H/1P3EW9wbCVvuxHK8zgs3CCyO8NArL3Glcx/R1tgQ==} 94 | dependencies: 95 | esbuild: 0.12.9 96 | tiny-glob: 0.2.9 97 | dev: true 98 | 99 | /@sveltejs/kit/1.0.0-next.116_svelte@3.38.3: 100 | resolution: {integrity: sha512-BpqiZMgCjxZUpDYnRZ3Z2H0PQtj7ak+EHOTJYOCUzDUK4iT4Jd36ljlzTEQgEJKrBTKZJgs0yFH1Zc9AAdftoA==} 101 | engines: {node: ^12.20 || >=14.13} 102 | hasBin: true 103 | peerDependencies: 104 | svelte: ^3.38.2 105 | dependencies: 106 | '@sveltejs/vite-plugin-svelte': 1.0.0-next.11_svelte@3.38.3+vite@2.3.8 107 | cheap-watch: 1.0.3 108 | sade: 1.7.4 109 | svelte: 3.38.3 110 | vite: 2.3.8 111 | transitivePeerDependencies: 112 | - rollup 113 | - supports-color 114 | dev: true 115 | 116 | /@sveltejs/vite-plugin-svelte/1.0.0-next.11_svelte@3.38.3+vite@2.3.8: 117 | resolution: {integrity: sha512-EYR1I145k5rflVqhPwk3442m3bkYimTKSHM9uO5KdomXzt+GS9ZSBJQE3/wy1Di9V8OnGa3oKpckI3OZsHkTIA==} 118 | engines: {node: ^12.20 || ^14.13.1 || >= 16} 119 | peerDependencies: 120 | svelte: ^3.38.2 121 | vite: ^2.3.7 122 | dependencies: 123 | '@rollup/pluginutils': 4.1.0 124 | chalk: 4.1.1 125 | debug: 4.3.2 126 | require-relative: 0.8.7 127 | svelte: 3.38.3 128 | svelte-hmr: 0.14.4_svelte@3.38.3 129 | vite: 2.3.8 130 | transitivePeerDependencies: 131 | - rollup 132 | - supports-color 133 | dev: true 134 | 135 | /@trysound/sax/0.1.1: 136 | resolution: {integrity: sha512-Z6DoceYb/1xSg5+e+ZlPZ9v0N16ZvZ+wYMraFue4HYrE4ttONKtsvruIRf6t9TBR0YvSOfi1hUU0fJfBLCDYow==} 137 | engines: {node: '>=10.13.0'} 138 | dev: true 139 | 140 | /@types/node/15.12.4: 141 | resolution: {integrity: sha512-zrNj1+yqYF4WskCMOHwN+w9iuD12+dGm0rQ35HLl9/Ouuq52cEtd0CH9qMgrdNmi5ejC1/V7vKEXYubB+65DkA==} 142 | dev: true 143 | 144 | /@types/parse-json/4.0.0: 145 | resolution: {integrity: sha512-//oorEZjL6sbPcKUaCdIGlIUeH26mgzimjBB77G6XRgnDl/L5wOnpyBGRe/Mmf5CVW3PwEBE1NjiMZ/ssFh4wA==} 146 | dev: true 147 | 148 | /@types/pug/2.0.4: 149 | resolution: {integrity: sha1-h3L80EGOPNLMFxVV1zAHQVBR9LI=} 150 | dev: true 151 | 152 | /@types/sass/1.16.0: 153 | resolution: {integrity: sha512-2XZovu4NwcqmtZtsBR5XYLw18T8cBCnU2USFHTnYLLHz9fkhnoEMoDsqShJIOFsFhn5aJHjweiUUdTrDGujegA==} 154 | dependencies: 155 | '@types/node': 15.12.4 156 | dev: true 157 | 158 | /acorn-node/1.8.2: 159 | resolution: {integrity: sha512-8mt+fslDufLYntIoPAaIMUe/lrbrehIiwmR3t2k9LljIzoigEPF27eLk2hy8zSGzmR/ogr7zbRKINMo1u0yh5A==} 160 | dependencies: 161 | acorn: 7.4.1 162 | acorn-walk: 7.2.0 163 | xtend: 4.0.2 164 | dev: true 165 | 166 | /acorn-walk/7.2.0: 167 | resolution: {integrity: sha512-OPdCF6GsMIP+Az+aWfAAOEt2/+iVDKE7oy6lJ098aoe59oAmK76qV6Gw60SbZ8jHuG2wH058GF4pLFbYamYrVA==} 168 | engines: {node: '>=0.4.0'} 169 | dev: true 170 | 171 | /acorn/7.4.1: 172 | resolution: {integrity: sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A==} 173 | engines: {node: '>=0.4.0'} 174 | hasBin: true 175 | dev: true 176 | 177 | /alphanum-sort/1.0.2: 178 | resolution: {integrity: sha1-l6ERlkmyEa0zaR2fn0hqjsn74KM=} 179 | dev: true 180 | 181 | /ansi-styles/3.2.1: 182 | resolution: {integrity: sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==} 183 | engines: {node: '>=4'} 184 | dependencies: 185 | color-convert: 1.9.3 186 | dev: true 187 | 188 | /ansi-styles/4.3.0: 189 | resolution: {integrity: sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==} 190 | engines: {node: '>=8'} 191 | dependencies: 192 | color-convert: 2.0.1 193 | dev: true 194 | 195 | /anymatch/3.1.2: 196 | resolution: {integrity: sha512-P43ePfOAIupkguHUycrc4qJ9kz8ZiuOUijaETwX7THt0Y/GNK7v0aa8rY816xWjZ7rJdA5XdMcpVFTKMq+RvWg==} 197 | engines: {node: '>= 8'} 198 | dependencies: 199 | normalize-path: 3.0.0 200 | picomatch: 2.3.0 201 | dev: true 202 | 203 | /arg/5.0.0: 204 | resolution: {integrity: sha512-4P8Zm2H+BRS+c/xX1LrHw0qKpEhdlZjLCgWy+d78T9vqa2Z2SiD2wMrYuWIAFy5IZUD7nnNXroRttz+0RzlrzQ==} 205 | dev: true 206 | 207 | /autoprefixer/10.2.6_postcss@8.3.5: 208 | resolution: {integrity: sha512-8lChSmdU6dCNMCQopIf4Pe5kipkAGj/fvTMslCsih0uHpOrXOPUEVOmYMMqmw3cekQkSD7EhIeuYl5y0BLdKqg==} 209 | engines: {node: ^10 || ^12 || >=14} 210 | hasBin: true 211 | peerDependencies: 212 | postcss: ^8.1.0 213 | dependencies: 214 | browserslist: 4.16.6 215 | caniuse-lite: 1.0.30001239 216 | colorette: 1.2.2 217 | fraction.js: 4.1.1 218 | normalize-range: 0.1.2 219 | postcss: 8.3.5 220 | postcss-value-parser: 4.1.0 221 | dev: true 222 | 223 | /balanced-match/1.0.2: 224 | resolution: {integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==} 225 | dev: true 226 | 227 | /binary-extensions/2.2.0: 228 | resolution: {integrity: sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==} 229 | engines: {node: '>=8'} 230 | dev: true 231 | 232 | /boolbase/1.0.0: 233 | resolution: {integrity: sha1-aN/1++YMUes3cl6p4+0xDcwed24=} 234 | dev: true 235 | 236 | /brace-expansion/1.1.11: 237 | resolution: {integrity: sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==} 238 | dependencies: 239 | balanced-match: 1.0.2 240 | concat-map: 0.0.1 241 | dev: true 242 | 243 | /braces/3.0.2: 244 | resolution: {integrity: sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==} 245 | engines: {node: '>=8'} 246 | dependencies: 247 | fill-range: 7.0.1 248 | dev: true 249 | 250 | /browserslist/4.16.6: 251 | resolution: {integrity: sha512-Wspk/PqO+4W9qp5iUTJsa1B/QrYn1keNCcEP5OvP7WBwT4KaDly0uONYmC6Xa3Z5IqnUgS0KcgLYu1l74x0ZXQ==} 252 | engines: {node: ^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7} 253 | hasBin: true 254 | dependencies: 255 | caniuse-lite: 1.0.30001239 256 | colorette: 1.2.2 257 | electron-to-chromium: 1.3.754 258 | escalade: 3.1.1 259 | node-releases: 1.1.73 260 | dev: true 261 | 262 | /bytes/3.1.0: 263 | resolution: {integrity: sha512-zauLjrfCG+xvoyaqLoV8bLVXXNGC4JqlxFCutSDWA6fJrTo2ZuvLYTqZ7aHBLZSMOopbzwv8f+wZcVzfVTI2Dg==} 264 | engines: {node: '>= 0.8'} 265 | dev: true 266 | 267 | /callsites/3.1.0: 268 | resolution: {integrity: sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==} 269 | engines: {node: '>=6'} 270 | dev: true 271 | 272 | /camelcase-css/2.0.1: 273 | resolution: {integrity: sha512-QOSvevhslijgYwRx6Rv7zKdMF8lbRmx+uQGx2+vDc+KI/eBnsy9kit5aj23AgGu3pa4t9AgwbnXWqS+iOY+2aA==} 274 | engines: {node: '>= 6'} 275 | dev: true 276 | 277 | /caniuse-api/3.0.0: 278 | resolution: {integrity: sha512-bsTwuIg/BZZK/vreVTYYbSWoe2F+71P7K5QGEX+pT250DZbfU1MQ5prOKpPR+LL6uWKK3KMwMCAS74QB3Um1uw==} 279 | dependencies: 280 | browserslist: 4.16.6 281 | caniuse-lite: 1.0.30001239 282 | lodash.memoize: 4.1.2 283 | lodash.uniq: 4.5.0 284 | dev: true 285 | 286 | /caniuse-lite/1.0.30001239: 287 | resolution: {integrity: sha512-cyBkXJDMeI4wthy8xJ2FvDU6+0dtcZSJW3voUF8+e9f1bBeuvyZfc3PNbkOETyhbR+dGCPzn9E7MA3iwzusOhQ==} 288 | dev: true 289 | 290 | /chalk/2.4.2: 291 | resolution: {integrity: sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==} 292 | engines: {node: '>=4'} 293 | dependencies: 294 | ansi-styles: 3.2.1 295 | escape-string-regexp: 1.0.5 296 | supports-color: 5.5.0 297 | dev: true 298 | 299 | /chalk/4.1.1: 300 | resolution: {integrity: sha512-diHzdDKxcU+bAsUboHLPEDQiw0qEe0qd7SYUn3HgcFlWgbDcfLGswOHYeGrHKzG9z6UYf01d9VFMfZxPM1xZSg==} 301 | engines: {node: '>=10'} 302 | dependencies: 303 | ansi-styles: 4.3.0 304 | supports-color: 7.2.0 305 | dev: true 306 | 307 | /cheap-watch/1.0.3: 308 | resolution: {integrity: sha512-xC5CruMhLzjPwJ5ecUxGu1uGmwJQykUhqd2QrCrYbwvsFYdRyviu6jG9+pccwDXJR/OpmOTOJ9yLFunVgQu9wg==} 309 | engines: {node: '>=8'} 310 | dev: true 311 | 312 | /chokidar/3.5.2: 313 | resolution: {integrity: sha512-ekGhOnNVPgT77r4K/U3GDhu+FQ2S8TnK/s2KbIGXi0SZWuwkZ2QNyfWdZW+TVfn84DpEP7rLeCt2UI6bJ8GwbQ==} 314 | engines: {node: '>= 8.10.0'} 315 | dependencies: 316 | anymatch: 3.1.2 317 | braces: 3.0.2 318 | glob-parent: 5.1.2 319 | is-binary-path: 2.1.0 320 | is-glob: 4.0.1 321 | normalize-path: 3.0.0 322 | readdirp: 3.6.0 323 | optionalDependencies: 324 | fsevents: 2.3.2 325 | dev: true 326 | 327 | /color-convert/1.9.3: 328 | resolution: {integrity: sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==} 329 | dependencies: 330 | color-name: 1.1.3 331 | dev: true 332 | 333 | /color-convert/2.0.1: 334 | resolution: {integrity: sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==} 335 | engines: {node: '>=7.0.0'} 336 | dependencies: 337 | color-name: 1.1.4 338 | dev: true 339 | 340 | /color-name/1.1.3: 341 | resolution: {integrity: sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=} 342 | dev: true 343 | 344 | /color-name/1.1.4: 345 | resolution: {integrity: sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==} 346 | dev: true 347 | 348 | /color-string/1.5.5: 349 | resolution: {integrity: sha512-jgIoum0OfQfq9Whcfc2z/VhCNcmQjWbey6qBX0vqt7YICflUmBCh9E9CiQD5GSJ+Uehixm3NUwHVhqUAWRivZg==} 350 | dependencies: 351 | color-name: 1.1.4 352 | simple-swizzle: 0.2.2 353 | dev: true 354 | 355 | /color/3.1.3: 356 | resolution: {integrity: sha512-xgXAcTHa2HeFCGLE9Xs/R82hujGtu9Jd9x4NW3T34+OMs7VoPsjwzRczKHvTAHeJwWFwX5j15+MgAppE8ztObQ==} 357 | dependencies: 358 | color-convert: 1.9.3 359 | color-string: 1.5.5 360 | dev: true 361 | 362 | /colord/2.0.1: 363 | resolution: {integrity: sha512-vm5YpaWamD0Ov6TSG0GGmUIwstrWcfKQV/h2CmbR7PbNu41+qdB5PW9lpzhjedrpm08uuYvcXi0Oel1RLZIJuA==} 364 | dev: true 365 | 366 | /colorette/1.2.2: 367 | resolution: {integrity: sha512-MKGMzyfeuutC/ZJ1cba9NqcNpfeqMUcYmyF1ZFY6/Cn7CNSAKx6a+s48sqLqyAiZuaP2TcqMhoo+dlwFnVxT9w==} 368 | dev: true 369 | 370 | /commander/6.2.1: 371 | resolution: {integrity: sha512-U7VdrJFnJgo4xjrHpTzu0yrHPGImdsmD95ZlgYSEajAn2JKzDhDTPG9kBTefmObL2w/ngeZnilk+OV9CG3d7UA==} 372 | engines: {node: '>= 6'} 373 | dev: true 374 | 375 | /commander/7.2.0: 376 | resolution: {integrity: sha512-QrWXB+ZQSVPmIWIhtEO9H+gwHaMGYiF5ChvoJ+K9ZGHG/sVsa6yiesAD1GC/x46sET00Xlwo1u49RVVVzvcSkw==} 377 | engines: {node: '>= 10'} 378 | dev: true 379 | 380 | /concat-map/0.0.1: 381 | resolution: {integrity: sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=} 382 | dev: true 383 | 384 | /cosmiconfig/7.0.0: 385 | resolution: {integrity: sha512-pondGvTuVYDk++upghXJabWzL6Kxu6f26ljFw64Swq9v6sQPUL3EUlVDV56diOjpCayKihL6hVe8exIACU4XcA==} 386 | engines: {node: '>=10'} 387 | dependencies: 388 | '@types/parse-json': 4.0.0 389 | import-fresh: 3.3.0 390 | parse-json: 5.2.0 391 | path-type: 4.0.0 392 | yaml: 1.10.2 393 | dev: true 394 | 395 | /css-color-names/0.0.4: 396 | resolution: {integrity: sha1-gIrcLnnPhHOAabZGyyDsJ762KeA=} 397 | dev: true 398 | 399 | /css-color-names/1.0.1: 400 | resolution: {integrity: sha512-/loXYOch1qU1biStIFsHH8SxTmOseh1IJqFvy8IujXOm1h+QjUdDhkzOrR5HG8K8mlxREj0yfi8ewCHx0eMxzA==} 401 | dev: true 402 | 403 | /css-declaration-sorter/6.0.3_postcss@8.3.5: 404 | resolution: {integrity: sha512-52P95mvW1SMzuRZegvpluT6yEv0FqQusydKQPZsNN5Q7hh8EwQvN8E2nwuJ16BBvNN6LcoIZXu/Bk58DAhrrxw==} 405 | engines: {node: '>= 10'} 406 | peerDependencies: 407 | postcss: ^8.0.9 408 | dependencies: 409 | postcss: 8.3.5 410 | timsort: 0.3.0 411 | dev: true 412 | 413 | /css-select/3.1.2: 414 | resolution: {integrity: sha512-qmss1EihSuBNWNNhHjxzxSfJoFBM/lERB/Q4EnsJQQC62R2evJDW481091oAdOr9uh46/0n4nrg0It5cAnj1RA==} 415 | dependencies: 416 | boolbase: 1.0.0 417 | css-what: 4.0.0 418 | domhandler: 4.2.0 419 | domutils: 2.7.0 420 | nth-check: 2.0.0 421 | dev: true 422 | 423 | /css-tree/1.1.3: 424 | resolution: {integrity: sha512-tRpdppF7TRazZrjJ6v3stzv93qxRcSsFmW6cX0Zm2NVKpxE1WV1HblnghVv9TreireHkqI/VDEsfolRF1p6y7Q==} 425 | engines: {node: '>=8.0.0'} 426 | dependencies: 427 | mdn-data: 2.0.14 428 | source-map: 0.6.1 429 | dev: true 430 | 431 | /css-unit-converter/1.1.2: 432 | resolution: {integrity: sha512-IiJwMC8rdZE0+xiEZHeru6YoONC4rfPMqGm2W85jMIbkFvv5nFTwJVFHam2eFrN6txmoUYFAFXiv8ICVeTO0MA==} 433 | dev: true 434 | 435 | /css-what/4.0.0: 436 | resolution: {integrity: sha512-teijzG7kwYfNVsUh2H/YN62xW3KK9YhXEgSlbxMlcyjPNvdKJqFx5lrwlJgoFP1ZHlB89iGDlo/JyshKeRhv5A==} 437 | engines: {node: '>= 6'} 438 | dev: true 439 | 440 | /cssesc/3.0.0: 441 | resolution: {integrity: sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==} 442 | engines: {node: '>=4'} 443 | hasBin: true 444 | dev: true 445 | 446 | /cssnano-preset-default/5.1.3_postcss@8.3.5: 447 | resolution: {integrity: sha512-qo9tX+t4yAAZ/yagVV3b+QBKeLklQbmgR3wI7mccrDcR+bEk9iHgZN1E7doX68y9ThznLya3RDmR+nc7l6/2WQ==} 448 | engines: {node: ^10 || ^12 || >=14.0} 449 | peerDependencies: 450 | postcss: ^8.2.15 451 | dependencies: 452 | css-declaration-sorter: 6.0.3_postcss@8.3.5 453 | cssnano-utils: 2.0.1_postcss@8.3.5 454 | postcss: 8.3.5 455 | postcss-calc: 8.0.0_postcss@8.3.5 456 | postcss-colormin: 5.2.0_postcss@8.3.5 457 | postcss-convert-values: 5.0.1_postcss@8.3.5 458 | postcss-discard-comments: 5.0.1_postcss@8.3.5 459 | postcss-discard-duplicates: 5.0.1_postcss@8.3.5 460 | postcss-discard-empty: 5.0.1_postcss@8.3.5 461 | postcss-discard-overridden: 5.0.1_postcss@8.3.5 462 | postcss-merge-longhand: 5.0.2_postcss@8.3.5 463 | postcss-merge-rules: 5.0.2_postcss@8.3.5 464 | postcss-minify-font-values: 5.0.1_postcss@8.3.5 465 | postcss-minify-gradients: 5.0.1_postcss@8.3.5 466 | postcss-minify-params: 5.0.1_postcss@8.3.5 467 | postcss-minify-selectors: 5.1.0_postcss@8.3.5 468 | postcss-normalize-charset: 5.0.1_postcss@8.3.5 469 | postcss-normalize-display-values: 5.0.1_postcss@8.3.5 470 | postcss-normalize-positions: 5.0.1_postcss@8.3.5 471 | postcss-normalize-repeat-style: 5.0.1_postcss@8.3.5 472 | postcss-normalize-string: 5.0.1_postcss@8.3.5 473 | postcss-normalize-timing-functions: 5.0.1_postcss@8.3.5 474 | postcss-normalize-unicode: 5.0.1_postcss@8.3.5 475 | postcss-normalize-url: 5.0.2_postcss@8.3.5 476 | postcss-normalize-whitespace: 5.0.1_postcss@8.3.5 477 | postcss-ordered-values: 5.0.2_postcss@8.3.5 478 | postcss-reduce-initial: 5.0.1_postcss@8.3.5 479 | postcss-reduce-transforms: 5.0.1_postcss@8.3.5 480 | postcss-svgo: 5.0.2_postcss@8.3.5 481 | postcss-unique-selectors: 5.0.1_postcss@8.3.5 482 | dev: true 483 | 484 | /cssnano-utils/2.0.1_postcss@8.3.5: 485 | resolution: {integrity: sha512-i8vLRZTnEH9ubIyfdZCAdIdgnHAUeQeByEeQ2I7oTilvP9oHO6RScpeq3GsFUVqeB8uZgOQ9pw8utofNn32hhQ==} 486 | engines: {node: ^10 || ^12 || >=14.0} 487 | peerDependencies: 488 | postcss: ^8.2.15 489 | dependencies: 490 | postcss: 8.3.5 491 | dev: true 492 | 493 | /cssnano/5.0.6_postcss@8.3.5: 494 | resolution: {integrity: sha512-NiaLH/7yqGksFGsFNvSRe2IV/qmEBAeDE64dYeD8OBrgp6lE8YoMeQJMtsv5ijo6MPyhuoOvFhI94reahBRDkw==} 495 | engines: {node: ^10 || ^12 || >=14.0} 496 | peerDependencies: 497 | postcss: ^8.2.15 498 | dependencies: 499 | cosmiconfig: 7.0.0 500 | cssnano-preset-default: 5.1.3_postcss@8.3.5 501 | is-resolvable: 1.1.0 502 | postcss: 8.3.5 503 | dev: true 504 | 505 | /csso/4.2.0: 506 | resolution: {integrity: sha512-wvlcdIbf6pwKEk7vHj8/Bkc0B4ylXZruLvOgs9doS5eOsOpuodOV2zJChSpkp+pRpYQLQMeF04nr3Z68Sta9jA==} 507 | engines: {node: '>=8.0.0'} 508 | dependencies: 509 | css-tree: 1.1.3 510 | dev: true 511 | 512 | /debug/4.3.2: 513 | resolution: {integrity: sha512-mOp8wKcvj7XxC78zLgw/ZA+6TSgkoE2C/ienthhRD298T7UNwAg9diBpLRxC0mOezLl4B0xV7M0cCO6P/O0Xhw==} 514 | engines: {node: '>=6.0'} 515 | peerDependencies: 516 | supports-color: '*' 517 | peerDependenciesMeta: 518 | supports-color: 519 | optional: true 520 | dependencies: 521 | ms: 2.1.2 522 | dev: true 523 | 524 | /defined/1.0.0: 525 | resolution: {integrity: sha1-yY2bzvdWdBiOEQlpFRGZ45sfppM=} 526 | dev: true 527 | 528 | /detect-indent/6.1.0: 529 | resolution: {integrity: sha512-reYkTUJAZb9gUuZ2RvVCNhVHdg62RHnJ7WJl8ftMi4diZ6NWlciOzQN88pUhSELEwflJht4oQDv0F0BMlwaYtA==} 530 | engines: {node: '>=8'} 531 | dev: true 532 | 533 | /detective/5.2.0: 534 | resolution: {integrity: sha512-6SsIx+nUUbuK0EthKjv0zrdnajCCXVYGmbYYiYjFVpzcjwEs/JMDZ8tPRG29J/HhN56t3GJp2cGSWDRjjot8Pg==} 535 | engines: {node: '>=0.8.0'} 536 | hasBin: true 537 | dependencies: 538 | acorn-node: 1.8.2 539 | defined: 1.0.0 540 | minimist: 1.2.5 541 | dev: true 542 | 543 | /didyoumean/1.2.1: 544 | resolution: {integrity: sha1-6S7f2tplN9SE1zwBcv0eugxJdv8=} 545 | dev: true 546 | 547 | /dlv/1.1.3: 548 | resolution: {integrity: sha512-+HlytyjlPKnIG8XuRG8WvmBP8xs8P71y+SKKS6ZXWoEgLuePxtDoUEiH7WkdePWrQ5JBpE6aoVqfZfJUQkjXwA==} 549 | dev: true 550 | 551 | /dom-serializer/1.3.2: 552 | resolution: {integrity: sha512-5c54Bk5Dw4qAxNOI1pFEizPSjVsx5+bpJKmL2kPn8JhBUq2q09tTCa3mjijun2NfK78NMouDYNMBkOrPZiS+ig==} 553 | dependencies: 554 | domelementtype: 2.2.0 555 | domhandler: 4.2.0 556 | entities: 2.2.0 557 | dev: true 558 | 559 | /domelementtype/2.2.0: 560 | resolution: {integrity: sha512-DtBMo82pv1dFtUmHyr48beiuq792Sxohr+8Hm9zoxklYPfa6n0Z3Byjj2IV7bmr2IyqClnqEQhfgHJJ5QF0R5A==} 561 | dev: true 562 | 563 | /domhandler/4.2.0: 564 | resolution: {integrity: sha512-zk7sgt970kzPks2Bf+dwT/PLzghLnsivb9CcxkvR8Mzr66Olr0Ofd8neSbglHJHaHa2MadfoSdNlKYAaafmWfA==} 565 | engines: {node: '>= 4'} 566 | dependencies: 567 | domelementtype: 2.2.0 568 | dev: true 569 | 570 | /domutils/2.7.0: 571 | resolution: {integrity: sha512-8eaHa17IwJUPAiB+SoTYBo5mCdeMgdcAoXJ59m6DT1vw+5iLS3gNoqYaRowaBKtGVrOF1Jz4yDTgYKLK2kvfJg==} 572 | dependencies: 573 | dom-serializer: 1.3.2 574 | domelementtype: 2.2.0 575 | domhandler: 4.2.0 576 | dev: true 577 | 578 | /electron-to-chromium/1.3.754: 579 | resolution: {integrity: sha512-Q50dJbfYYRtwK3G9mFP/EsJVzlgcYwKxFjbXmvVa1lDAbdviPcT9QOpFoufDApub4j0hBfDRL6v3lWNLEdEDXQ==} 580 | dev: true 581 | 582 | /entities/2.2.0: 583 | resolution: {integrity: sha512-p92if5Nz619I0w+akJrLZH0MX0Pb5DX39XOwQTtXSdQQOaYH03S1uIQp4mhOZtAXrxq4ViO67YTiLBo2638o9A==} 584 | dev: true 585 | 586 | /error-ex/1.3.2: 587 | resolution: {integrity: sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==} 588 | dependencies: 589 | is-arrayish: 0.2.1 590 | dev: true 591 | 592 | /esbuild/0.12.9: 593 | resolution: {integrity: sha512-MWRhAbMOJ9RJygCrt778rz/qNYgA4ZVj6aXnNPxFjs7PmIpb0fuB9Gmg5uWrr6n++XKwwm/RmSz6RR5JL2Ocsw==} 594 | hasBin: true 595 | requiresBuild: true 596 | dev: true 597 | 598 | /escalade/3.1.1: 599 | resolution: {integrity: sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==} 600 | engines: {node: '>=6'} 601 | dev: true 602 | 603 | /escape-string-regexp/1.0.5: 604 | resolution: {integrity: sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=} 605 | engines: {node: '>=0.8.0'} 606 | dev: true 607 | 608 | /estree-walker/2.0.2: 609 | resolution: {integrity: sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==} 610 | dev: true 611 | 612 | /fast-glob/3.2.5: 613 | resolution: {integrity: sha512-2DtFcgT68wiTTiwZ2hNdJfcHNke9XOfnwmBRWXhmeKM8rF0TGwmC/Qto3S7RoZKp5cilZbxzO5iTNTQsJ+EeDg==} 614 | engines: {node: '>=8'} 615 | dependencies: 616 | '@nodelib/fs.stat': 2.0.5 617 | '@nodelib/fs.walk': 1.2.7 618 | glob-parent: 5.1.2 619 | merge2: 1.4.1 620 | micromatch: 4.0.4 621 | picomatch: 2.3.0 622 | dev: true 623 | 624 | /fastq/1.11.0: 625 | resolution: {integrity: sha512-7Eczs8gIPDrVzT+EksYBcupqMyxSHXXrHOLRRxU2/DicV8789MRBRR8+Hc2uWzUupOs4YS4JzBmBxjjCVBxD/g==} 626 | dependencies: 627 | reusify: 1.0.4 628 | dev: true 629 | 630 | /fill-range/7.0.1: 631 | resolution: {integrity: sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==} 632 | engines: {node: '>=8'} 633 | dependencies: 634 | to-regex-range: 5.0.1 635 | dev: true 636 | 637 | /fraction.js/4.1.1: 638 | resolution: {integrity: sha512-MHOhvvxHTfRFpF1geTK9czMIZ6xclsEor2wkIGYYq+PxcQqT7vStJqjhe6S1TenZrMZzo+wlqOufBDVepUEgPg==} 639 | dev: true 640 | 641 | /fs-extra/10.0.0: 642 | resolution: {integrity: sha512-C5owb14u9eJwizKGdchcDUQeFtlSHHthBk8pbX9Vc1PFZrLombudjDnNns88aYslCyF6IY5SUw3Roz6xShcEIQ==} 643 | engines: {node: '>=12'} 644 | dependencies: 645 | graceful-fs: 4.2.6 646 | jsonfile: 6.1.0 647 | universalify: 2.0.0 648 | dev: true 649 | 650 | /fs.realpath/1.0.0: 651 | resolution: {integrity: sha1-FQStJSMVjKpA20onh8sBQRmU6k8=} 652 | dev: true 653 | 654 | /fsevents/2.3.2: 655 | resolution: {integrity: sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==} 656 | engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0} 657 | os: [darwin] 658 | dev: true 659 | optional: true 660 | 661 | /function-bind/1.1.1: 662 | resolution: {integrity: sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==} 663 | dev: true 664 | 665 | /glob-parent/5.1.2: 666 | resolution: {integrity: sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==} 667 | engines: {node: '>= 6'} 668 | dependencies: 669 | is-glob: 4.0.1 670 | dev: true 671 | 672 | /glob-parent/6.0.0: 673 | resolution: {integrity: sha512-Hdd4287VEJcZXUwv1l8a+vXC1GjOQqXe+VS30w/ypihpcnu9M1n3xeYeJu5CBpeEQj2nAab2xxz28GuA3vp4Ww==} 674 | engines: {node: '>=10.13.0'} 675 | dependencies: 676 | is-glob: 4.0.1 677 | dev: true 678 | 679 | /glob/7.1.7: 680 | resolution: {integrity: sha512-OvD9ENzPLbegENnYP5UUfJIirTg4+XwMWGaQfQTY0JenxNvvIKP3U3/tAQSPIu/lHxXYSZmpXlUHeqAIdKzBLQ==} 681 | dependencies: 682 | fs.realpath: 1.0.0 683 | inflight: 1.0.6 684 | inherits: 2.0.4 685 | minimatch: 3.0.4 686 | once: 1.4.0 687 | path-is-absolute: 1.0.1 688 | dev: true 689 | 690 | /globalyzer/0.1.0: 691 | resolution: {integrity: sha512-40oNTM9UfG6aBmuKxk/giHn5nQ8RVz/SS4Ir6zgzOv9/qC3kKZ9v4etGTcJbEl/NyVQH7FGU7d+X1egr57Md2Q==} 692 | dev: true 693 | 694 | /globrex/0.1.2: 695 | resolution: {integrity: sha512-uHJgbwAMwNFf5mLst7IWLNg14x1CkeqglJb/K3doi4dw6q2IvAAmM/Y81kevy83wP+Sst+nutFTYOGg3d1lsxg==} 696 | dev: true 697 | 698 | /graceful-fs/4.2.6: 699 | resolution: {integrity: sha512-nTnJ528pbqxYanhpDYsi4Rd8MAeaBA67+RZ10CM1m3bTAVFEDcd5AuA4a6W5YkGZ1iNXHzZz8T6TBKLeBuNriQ==} 700 | dev: true 701 | 702 | /has-flag/3.0.0: 703 | resolution: {integrity: sha1-tdRU3CGZriJWmfNGfloH87lVuv0=} 704 | engines: {node: '>=4'} 705 | dev: true 706 | 707 | /has-flag/4.0.0: 708 | resolution: {integrity: sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==} 709 | engines: {node: '>=8'} 710 | dev: true 711 | 712 | /has/1.0.3: 713 | resolution: {integrity: sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==} 714 | engines: {node: '>= 0.4.0'} 715 | dependencies: 716 | function-bind: 1.1.1 717 | dev: true 718 | 719 | /hex-color-regex/1.1.0: 720 | resolution: {integrity: sha512-l9sfDFsuqtOqKDsQdqrMRk0U85RZc0RtOR9yPI7mRVOa4FsR/BVnZ0shmQRM96Ji99kYZP/7hn1cedc1+ApsTQ==} 721 | dev: true 722 | 723 | /hsl-regex/1.0.0: 724 | resolution: {integrity: sha1-1JMwx4ntgZ4nakwNJy3/owsY/m4=} 725 | dev: true 726 | 727 | /hsla-regex/1.0.0: 728 | resolution: {integrity: sha1-wc56MWjIxmFAM6S194d/OyJfnDg=} 729 | dev: true 730 | 731 | /html-tags/3.1.0: 732 | resolution: {integrity: sha512-1qYz89hW3lFDEazhjW0yVAV87lw8lVkrJocr72XmBkMKsoSVJCQx3W8BXsC7hO2qAt8BoVjYjtAcZ9perqGnNg==} 733 | engines: {node: '>=8'} 734 | dev: true 735 | 736 | /import-cwd/3.0.0: 737 | resolution: {integrity: sha512-4pnzH16plW+hgvRECbDWpQl3cqtvSofHWh44met7ESfZ8UZOWWddm8hEyDTqREJ9RbYHY8gi8DqmaelApoOGMg==} 738 | engines: {node: '>=8'} 739 | dependencies: 740 | import-from: 3.0.0 741 | dev: true 742 | 743 | /import-fresh/3.3.0: 744 | resolution: {integrity: sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==} 745 | engines: {node: '>=6'} 746 | dependencies: 747 | parent-module: 1.0.1 748 | resolve-from: 4.0.0 749 | dev: true 750 | 751 | /import-from/3.0.0: 752 | resolution: {integrity: sha512-CiuXOFFSzkU5x/CR0+z7T91Iht4CXgfCxVOFRhh2Zyhg5wOpWvvDLQUsWl+gcN+QscYBjez8hDCt85O7RLDttQ==} 753 | engines: {node: '>=8'} 754 | dependencies: 755 | resolve-from: 5.0.0 756 | dev: true 757 | 758 | /inflight/1.0.6: 759 | resolution: {integrity: sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=} 760 | dependencies: 761 | once: 1.4.0 762 | wrappy: 1.0.2 763 | dev: true 764 | 765 | /inherits/2.0.4: 766 | resolution: {integrity: sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==} 767 | dev: true 768 | 769 | /is-absolute-url/3.0.3: 770 | resolution: {integrity: sha512-opmNIX7uFnS96NtPmhWQgQx6/NYFgsUXYMllcfzwWKUMwfo8kku1TvE6hkNcH+Q1ts5cMVrsY7j0bxXQDciu9Q==} 771 | engines: {node: '>=8'} 772 | dev: true 773 | 774 | /is-arrayish/0.2.1: 775 | resolution: {integrity: sha1-d8mYQFJ6qOyxqLppe4BkWnqSap0=} 776 | dev: true 777 | 778 | /is-arrayish/0.3.2: 779 | resolution: {integrity: sha512-eVRqCvVlZbuw3GrM63ovNSNAeA1K16kaR/LRY/92w0zxQ5/1YzwblUX652i4Xs9RwAGjW9d9y6X88t8OaAJfWQ==} 780 | dev: true 781 | 782 | /is-binary-path/2.1.0: 783 | resolution: {integrity: sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==} 784 | engines: {node: '>=8'} 785 | dependencies: 786 | binary-extensions: 2.2.0 787 | dev: true 788 | 789 | /is-color-stop/1.1.0: 790 | resolution: {integrity: sha1-z/9HGu5N1cnhWFmPvhKWe1za00U=} 791 | dependencies: 792 | css-color-names: 0.0.4 793 | hex-color-regex: 1.1.0 794 | hsl-regex: 1.0.0 795 | hsla-regex: 1.0.0 796 | rgb-regex: 1.0.1 797 | rgba-regex: 1.0.0 798 | dev: true 799 | 800 | /is-core-module/2.4.0: 801 | resolution: {integrity: sha512-6A2fkfq1rfeQZjxrZJGerpLCTHRNEBiSgnu0+obeJpEPZRUooHgsizvzv0ZjJwOz3iWIHdJtVWJ/tmPr3D21/A==} 802 | dependencies: 803 | has: 1.0.3 804 | dev: true 805 | 806 | /is-extglob/2.1.1: 807 | resolution: {integrity: sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=} 808 | engines: {node: '>=0.10.0'} 809 | dev: true 810 | 811 | /is-glob/4.0.1: 812 | resolution: {integrity: sha512-5G0tKtBTFImOqDnLB2hG6Bp2qcKEFduo4tZu9MT/H6NQv/ghhy30o55ufafxJ/LdH79LLs2Kfrn85TLKyA7BUg==} 813 | engines: {node: '>=0.10.0'} 814 | dependencies: 815 | is-extglob: 2.1.1 816 | dev: true 817 | 818 | /is-number/7.0.0: 819 | resolution: {integrity: sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==} 820 | engines: {node: '>=0.12.0'} 821 | dev: true 822 | 823 | /is-resolvable/1.1.0: 824 | resolution: {integrity: sha512-qgDYXFSR5WvEfuS5dMj6oTMEbrrSaM0CrFk2Yiq/gXnBvD9pMa2jGXxyhGLfvhZpuMZe18CJpFxAt3CRs42NMg==} 825 | dev: true 826 | 827 | /js-tokens/4.0.0: 828 | resolution: {integrity: sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==} 829 | dev: true 830 | 831 | /json-parse-even-better-errors/2.3.1: 832 | resolution: {integrity: sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==} 833 | dev: true 834 | 835 | /jsonfile/6.1.0: 836 | resolution: {integrity: sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==} 837 | dependencies: 838 | universalify: 2.0.0 839 | optionalDependencies: 840 | graceful-fs: 4.2.6 841 | dev: true 842 | 843 | /lilconfig/2.0.3: 844 | resolution: {integrity: sha512-EHKqr/+ZvdKCifpNrJCKxBTgk5XupZA3y/aCPY9mxfgBzmgh93Mt/WqjjQ38oMxXuvDokaKiM3lAgvSH2sjtHg==} 845 | engines: {node: '>=10'} 846 | dev: true 847 | 848 | /lines-and-columns/1.1.6: 849 | resolution: {integrity: sha1-HADHQ7QzzQpOgHWPe2SldEDZ/wA=} 850 | dev: true 851 | 852 | /lodash.memoize/4.1.2: 853 | resolution: {integrity: sha1-vMbEmkKihA7Zl/Mj6tpezRguC/4=} 854 | dev: true 855 | 856 | /lodash.toarray/4.4.0: 857 | resolution: {integrity: sha1-JMS/zWsvuji/0FlNsRedjptlZWE=} 858 | dev: true 859 | 860 | /lodash.topath/4.5.2: 861 | resolution: {integrity: sha1-NhY1Hzu6YZlKCTGYlmC9AyVP0Ak=} 862 | dev: true 863 | 864 | /lodash.uniq/4.5.0: 865 | resolution: {integrity: sha1-0CJTc662Uq3BvILklFM5qEJ1R3M=} 866 | dev: true 867 | 868 | /lodash/4.17.21: 869 | resolution: {integrity: sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==} 870 | dev: true 871 | 872 | /mdn-data/2.0.14: 873 | resolution: {integrity: sha512-dn6wd0uw5GsdswPFfsgMp5NSB0/aDe6fK94YJV/AJDYXL6HVLWBsxeq7js7Ad+mU2K9LAlwpk6kN2D5mwCPVow==} 874 | dev: true 875 | 876 | /merge2/1.4.1: 877 | resolution: {integrity: sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==} 878 | engines: {node: '>= 8'} 879 | dev: true 880 | 881 | /micromatch/4.0.4: 882 | resolution: {integrity: sha512-pRmzw/XUcwXGpD9aI9q/0XOwLNygjETJ8y0ao0wdqprrzDa4YnxLcz7fQRZr8voh8V10kGhABbNcHVk5wHgWwg==} 883 | engines: {node: '>=8.6'} 884 | dependencies: 885 | braces: 3.0.2 886 | picomatch: 2.3.0 887 | dev: true 888 | 889 | /min-indent/1.0.1: 890 | resolution: {integrity: sha512-I9jwMn07Sy/IwOj3zVkVik2JTvgpaykDZEigL6Rx6N9LbMywwUSMtxET+7lVoDLLd3O3IXwJwvuuns8UB/HeAg==} 891 | engines: {node: '>=4'} 892 | dev: true 893 | 894 | /minimatch/3.0.4: 895 | resolution: {integrity: sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==} 896 | dependencies: 897 | brace-expansion: 1.1.11 898 | dev: true 899 | 900 | /minimist/1.2.5: 901 | resolution: {integrity: sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw==} 902 | dev: true 903 | 904 | /modern-normalize/1.1.0: 905 | resolution: {integrity: sha512-2lMlY1Yc1+CUy0gw4H95uNN7vjbpoED7NNRSBHE25nWfLBdmMzFCsPshlzbxHz+gYMcBEUN8V4pU16prcdPSgA==} 906 | engines: {node: '>=6'} 907 | dev: true 908 | 909 | /mri/1.1.6: 910 | resolution: {integrity: sha512-oi1b3MfbyGa7FJMP9GmLTttni5JoICpYBRlq+x5V16fZbLsnL9N3wFqqIm/nIG43FjUFkFh9Epzp/kzUGUnJxQ==} 911 | engines: {node: '>=4'} 912 | dev: true 913 | 914 | /ms/2.1.2: 915 | resolution: {integrity: sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==} 916 | dev: true 917 | 918 | /nanoid/3.1.23: 919 | resolution: {integrity: sha512-FiB0kzdP0FFVGDKlRLEQ1BgDzU87dy5NnzjeW9YZNt+/c3+q82EQDUwniSAUxp/F0gFNI1ZhKU1FqYsMuqZVnw==} 920 | engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1} 921 | hasBin: true 922 | dev: true 923 | 924 | /node-emoji/1.10.0: 925 | resolution: {integrity: sha512-Yt3384If5H6BYGVHiHwTL+99OzJKHhgp82S8/dktEK73T26BazdgZ4JZh92xSVtGNJvz9UbXdNAc5hcrXV42vw==} 926 | dependencies: 927 | lodash.toarray: 4.4.0 928 | dev: true 929 | 930 | /node-releases/1.1.73: 931 | resolution: {integrity: sha512-uW7fodD6pyW2FZNZnp/Z3hvWKeEW1Y8R1+1CnErE8cXFXzl5blBOoVB41CvMer6P6Q0S5FXDwcHgFd1Wj0U9zg==} 932 | dev: true 933 | 934 | /normalize-path/3.0.0: 935 | resolution: {integrity: sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==} 936 | engines: {node: '>=0.10.0'} 937 | dev: true 938 | 939 | /normalize-range/0.1.2: 940 | resolution: {integrity: sha1-LRDAa9/TEuqXd2laTShDlFa3WUI=} 941 | engines: {node: '>=0.10.0'} 942 | dev: true 943 | 944 | /normalize-url/6.1.0: 945 | resolution: {integrity: sha512-DlL+XwOy3NxAQ8xuC0okPgK46iuVNAK01YN7RueYBqqFeGsBjV9XmCAzAdgt+667bCl5kPh9EqKKDwnaPG1I7A==} 946 | engines: {node: '>=10'} 947 | dev: true 948 | 949 | /nth-check/2.0.0: 950 | resolution: {integrity: sha512-i4sc/Kj8htBrAiH1viZ0TgU8Y5XqCaV/FziYK6TBczxmeKm3AEFWqqF3195yKudrarqy7Zu80Ra5dobFjn9X/Q==} 951 | dependencies: 952 | boolbase: 1.0.0 953 | dev: true 954 | 955 | /object-hash/2.2.0: 956 | resolution: {integrity: sha512-gScRMn0bS5fH+IuwyIFgnh9zBdo4DV+6GhygmWM9HyNJSgS0hScp1f5vjtm7oIIOiT9trXrShAkLFSc2IqKNgw==} 957 | engines: {node: '>= 6'} 958 | dev: true 959 | 960 | /once/1.4.0: 961 | resolution: {integrity: sha1-WDsap3WWHUsROsF9nFC6753Xa9E=} 962 | dependencies: 963 | wrappy: 1.0.2 964 | dev: true 965 | 966 | /parent-module/1.0.1: 967 | resolution: {integrity: sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==} 968 | engines: {node: '>=6'} 969 | dependencies: 970 | callsites: 3.1.0 971 | dev: true 972 | 973 | /parse-json/5.2.0: 974 | resolution: {integrity: sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==} 975 | engines: {node: '>=8'} 976 | dependencies: 977 | '@babel/code-frame': 7.14.5 978 | error-ex: 1.3.2 979 | json-parse-even-better-errors: 2.3.1 980 | lines-and-columns: 1.1.6 981 | dev: true 982 | 983 | /path-is-absolute/1.0.1: 984 | resolution: {integrity: sha1-F0uSaHNVNP+8es5r9TpanhtcX18=} 985 | engines: {node: '>=0.10.0'} 986 | dev: true 987 | 988 | /path-parse/1.0.7: 989 | resolution: {integrity: sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==} 990 | dev: true 991 | 992 | /path-type/4.0.0: 993 | resolution: {integrity: sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==} 994 | engines: {node: '>=8'} 995 | dev: true 996 | 997 | /picomatch/2.3.0: 998 | resolution: {integrity: sha512-lY1Q/PiJGC2zOv/z391WOTD+Z02bCgsFfvxoXXf6h7kv9o+WmsmzYqrAwY63sNgOxE4xEdq0WyUnXfKeBrSvYw==} 999 | engines: {node: '>=8.6'} 1000 | dev: true 1001 | 1002 | /postcss-calc/8.0.0_postcss@8.3.5: 1003 | resolution: {integrity: sha512-5NglwDrcbiy8XXfPM11F3HeC6hoT9W7GUH/Zi5U/p7u3Irv4rHhdDcIZwG0llHXV4ftsBjpfWMXAnXNl4lnt8g==} 1004 | peerDependencies: 1005 | postcss: ^8.2.2 1006 | dependencies: 1007 | postcss: 8.3.5 1008 | postcss-selector-parser: 6.0.6 1009 | postcss-value-parser: 4.1.0 1010 | dev: true 1011 | 1012 | /postcss-colormin/5.2.0_postcss@8.3.5: 1013 | resolution: {integrity: sha512-+HC6GfWU3upe5/mqmxuqYZ9B2Wl4lcoUUNkoaX59nEWV4EtADCMiBqui111Bu8R8IvaZTmqmxrqOAqjbHIwXPw==} 1014 | engines: {node: ^10 || ^12 || >=14.0} 1015 | peerDependencies: 1016 | postcss: ^8.2.15 1017 | dependencies: 1018 | browserslist: 4.16.6 1019 | caniuse-api: 3.0.0 1020 | colord: 2.0.1 1021 | postcss: 8.3.5 1022 | postcss-value-parser: 4.1.0 1023 | dev: true 1024 | 1025 | /postcss-convert-values/5.0.1_postcss@8.3.5: 1026 | resolution: {integrity: sha512-C3zR1Do2BkKkCgC0g3sF8TS0koF2G+mN8xxayZx3f10cIRmTaAnpgpRQZjNekTZxM2ciSPoh2IWJm0VZx8NoQg==} 1027 | engines: {node: ^10 || ^12 || >=14.0} 1028 | peerDependencies: 1029 | postcss: ^8.2.15 1030 | dependencies: 1031 | postcss: 8.3.5 1032 | postcss-value-parser: 4.1.0 1033 | dev: true 1034 | 1035 | /postcss-discard-comments/5.0.1_postcss@8.3.5: 1036 | resolution: {integrity: sha512-lgZBPTDvWrbAYY1v5GYEv8fEO/WhKOu/hmZqmCYfrpD6eyDWWzAOsl2rF29lpvziKO02Gc5GJQtlpkTmakwOWg==} 1037 | engines: {node: ^10 || ^12 || >=14.0} 1038 | peerDependencies: 1039 | postcss: ^8.2.15 1040 | dependencies: 1041 | postcss: 8.3.5 1042 | dev: true 1043 | 1044 | /postcss-discard-duplicates/5.0.1_postcss@8.3.5: 1045 | resolution: {integrity: sha512-svx747PWHKOGpAXXQkCc4k/DsWo+6bc5LsVrAsw+OU+Ibi7klFZCyX54gjYzX4TH+f2uzXjRviLARxkMurA2bA==} 1046 | engines: {node: ^10 || ^12 || >=14.0} 1047 | peerDependencies: 1048 | postcss: ^8.2.15 1049 | dependencies: 1050 | postcss: 8.3.5 1051 | dev: true 1052 | 1053 | /postcss-discard-empty/5.0.1_postcss@8.3.5: 1054 | resolution: {integrity: sha512-vfU8CxAQ6YpMxV2SvMcMIyF2LX1ZzWpy0lqHDsOdaKKLQVQGVP1pzhrI9JlsO65s66uQTfkQBKBD/A5gp9STFw==} 1055 | engines: {node: ^10 || ^12 || >=14.0} 1056 | peerDependencies: 1057 | postcss: ^8.2.15 1058 | dependencies: 1059 | postcss: 8.3.5 1060 | dev: true 1061 | 1062 | /postcss-discard-overridden/5.0.1_postcss@8.3.5: 1063 | resolution: {integrity: sha512-Y28H7y93L2BpJhrdUR2SR2fnSsT+3TVx1NmVQLbcnZWwIUpJ7mfcTC6Za9M2PG6w8j7UQRfzxqn8jU2VwFxo3Q==} 1064 | engines: {node: ^10 || ^12 || >=14.0} 1065 | peerDependencies: 1066 | postcss: ^8.2.15 1067 | dependencies: 1068 | postcss: 8.3.5 1069 | dev: true 1070 | 1071 | /postcss-js/3.0.3: 1072 | resolution: {integrity: sha512-gWnoWQXKFw65Hk/mi2+WTQTHdPD5UJdDXZmX073EY/B3BWnYjO4F4t0VneTCnCGQ5E5GsCdMkzPaTXwl3r5dJw==} 1073 | engines: {node: '>=10.0'} 1074 | dependencies: 1075 | camelcase-css: 2.0.1 1076 | postcss: 8.3.5 1077 | dev: true 1078 | 1079 | /postcss-load-config/3.1.0: 1080 | resolution: {integrity: sha512-ipM8Ds01ZUophjDTQYSVP70slFSYg3T0/zyfII5vzhN6V57YSxMgG5syXuwi5VtS8wSf3iL30v0uBdoIVx4Q0g==} 1081 | engines: {node: '>= 10'} 1082 | peerDependencies: 1083 | ts-node: '>=9.0.0' 1084 | peerDependenciesMeta: 1085 | ts-node: 1086 | optional: true 1087 | dependencies: 1088 | import-cwd: 3.0.0 1089 | lilconfig: 2.0.3 1090 | yaml: 1.10.2 1091 | dev: true 1092 | 1093 | /postcss-merge-longhand/5.0.2_postcss@8.3.5: 1094 | resolution: {integrity: sha512-BMlg9AXSI5G9TBT0Lo/H3PfUy63P84rVz3BjCFE9e9Y9RXQZD3+h3YO1kgTNsNJy7bBc1YQp8DmSnwLIW5VPcw==} 1095 | engines: {node: ^10 || ^12 || >=14.0} 1096 | peerDependencies: 1097 | postcss: ^8.2.15 1098 | dependencies: 1099 | css-color-names: 1.0.1 1100 | postcss: 8.3.5 1101 | postcss-value-parser: 4.1.0 1102 | stylehacks: 5.0.1_postcss@8.3.5 1103 | dev: true 1104 | 1105 | /postcss-merge-rules/5.0.2_postcss@8.3.5: 1106 | resolution: {integrity: sha512-5K+Md7S3GwBewfB4rjDeol6V/RZ8S+v4B66Zk2gChRqLTCC8yjnHQ601omj9TKftS19OPGqZ/XzoqpzNQQLwbg==} 1107 | engines: {node: ^10 || ^12 || >=14.0} 1108 | peerDependencies: 1109 | postcss: ^8.2.15 1110 | dependencies: 1111 | browserslist: 4.16.6 1112 | caniuse-api: 3.0.0 1113 | cssnano-utils: 2.0.1_postcss@8.3.5 1114 | postcss: 8.3.5 1115 | postcss-selector-parser: 6.0.6 1116 | vendors: 1.0.4 1117 | dev: true 1118 | 1119 | /postcss-minify-font-values/5.0.1_postcss@8.3.5: 1120 | resolution: {integrity: sha512-7JS4qIsnqaxk+FXY1E8dHBDmraYFWmuL6cgt0T1SWGRO5bzJf8sUoelwa4P88LEWJZweHevAiDKxHlofuvtIoA==} 1121 | engines: {node: ^10 || ^12 || >=14.0} 1122 | peerDependencies: 1123 | postcss: ^8.2.15 1124 | dependencies: 1125 | postcss: 8.3.5 1126 | postcss-value-parser: 4.1.0 1127 | dev: true 1128 | 1129 | /postcss-minify-gradients/5.0.1_postcss@8.3.5: 1130 | resolution: {integrity: sha512-odOwBFAIn2wIv+XYRpoN2hUV3pPQlgbJ10XeXPq8UY2N+9ZG42xu45lTn/g9zZ+d70NKSQD6EOi6UiCMu3FN7g==} 1131 | engines: {node: ^10 || ^12 || >=14.0} 1132 | peerDependencies: 1133 | postcss: ^8.2.15 1134 | dependencies: 1135 | cssnano-utils: 2.0.1_postcss@8.3.5 1136 | is-color-stop: 1.1.0 1137 | postcss: 8.3.5 1138 | postcss-value-parser: 4.1.0 1139 | dev: true 1140 | 1141 | /postcss-minify-params/5.0.1_postcss@8.3.5: 1142 | resolution: {integrity: sha512-4RUC4k2A/Q9mGco1Z8ODc7h+A0z7L7X2ypO1B6V8057eVK6mZ6xwz6QN64nHuHLbqbclkX1wyzRnIrdZehTEHw==} 1143 | engines: {node: ^10 || ^12 || >=14.0} 1144 | peerDependencies: 1145 | postcss: ^8.2.15 1146 | dependencies: 1147 | alphanum-sort: 1.0.2 1148 | browserslist: 4.16.6 1149 | cssnano-utils: 2.0.1_postcss@8.3.5 1150 | postcss: 8.3.5 1151 | postcss-value-parser: 4.1.0 1152 | uniqs: 2.0.0 1153 | dev: true 1154 | 1155 | /postcss-minify-selectors/5.1.0_postcss@8.3.5: 1156 | resolution: {integrity: sha512-NzGBXDa7aPsAcijXZeagnJBKBPMYLaJJzB8CQh6ncvyl2sIndLVWfbcDi0SBjRWk5VqEjXvf8tYwzoKf4Z07og==} 1157 | engines: {node: ^10 || ^12 || >=14.0} 1158 | peerDependencies: 1159 | postcss: ^8.2.15 1160 | dependencies: 1161 | alphanum-sort: 1.0.2 1162 | postcss: 8.3.5 1163 | postcss-selector-parser: 6.0.6 1164 | dev: true 1165 | 1166 | /postcss-nested/5.0.5_postcss@8.3.5: 1167 | resolution: {integrity: sha512-GSRXYz5bccobpTzLQZXOnSOfKl6TwVr5CyAQJUPub4nuRJSOECK5AqurxVgmtxP48p0Kc/ndY/YyS1yqldX0Ew==} 1168 | engines: {node: '>=10.0'} 1169 | peerDependencies: 1170 | postcss: ^8.1.13 1171 | dependencies: 1172 | postcss: 8.3.5 1173 | postcss-selector-parser: 6.0.6 1174 | dev: true 1175 | 1176 | /postcss-normalize-charset/5.0.1_postcss@8.3.5: 1177 | resolution: {integrity: sha512-6J40l6LNYnBdPSk+BHZ8SF+HAkS4q2twe5jnocgd+xWpz/mx/5Sa32m3W1AA8uE8XaXN+eg8trIlfu8V9x61eg==} 1178 | engines: {node: ^10 || ^12 || >=14.0} 1179 | peerDependencies: 1180 | postcss: ^8.2.15 1181 | dependencies: 1182 | postcss: 8.3.5 1183 | dev: true 1184 | 1185 | /postcss-normalize-display-values/5.0.1_postcss@8.3.5: 1186 | resolution: {integrity: sha512-uupdvWk88kLDXi5HEyI9IaAJTE3/Djbcrqq8YgjvAVuzgVuqIk3SuJWUisT2gaJbZm1H9g5k2w1xXilM3x8DjQ==} 1187 | engines: {node: ^10 || ^12 || >=14.0} 1188 | peerDependencies: 1189 | postcss: ^8.2.15 1190 | dependencies: 1191 | cssnano-utils: 2.0.1_postcss@8.3.5 1192 | postcss: 8.3.5 1193 | postcss-value-parser: 4.1.0 1194 | dev: true 1195 | 1196 | /postcss-normalize-positions/5.0.1_postcss@8.3.5: 1197 | resolution: {integrity: sha512-rvzWAJai5xej9yWqlCb1OWLd9JjW2Ex2BCPzUJrbaXmtKtgfL8dBMOOMTX6TnvQMtjk3ei1Lswcs78qKO1Skrg==} 1198 | engines: {node: ^10 || ^12 || >=14.0} 1199 | peerDependencies: 1200 | postcss: ^8.2.15 1201 | dependencies: 1202 | postcss: 8.3.5 1203 | postcss-value-parser: 4.1.0 1204 | dev: true 1205 | 1206 | /postcss-normalize-repeat-style/5.0.1_postcss@8.3.5: 1207 | resolution: {integrity: sha512-syZ2itq0HTQjj4QtXZOeefomckiV5TaUO6ReIEabCh3wgDs4Mr01pkif0MeVwKyU/LHEkPJnpwFKRxqWA/7O3w==} 1208 | engines: {node: ^10 || ^12 || >=14.0} 1209 | peerDependencies: 1210 | postcss: ^8.2.15 1211 | dependencies: 1212 | cssnano-utils: 2.0.1_postcss@8.3.5 1213 | postcss: 8.3.5 1214 | postcss-value-parser: 4.1.0 1215 | dev: true 1216 | 1217 | /postcss-normalize-string/5.0.1_postcss@8.3.5: 1218 | resolution: {integrity: sha512-Ic8GaQ3jPMVl1OEn2U//2pm93AXUcF3wz+OriskdZ1AOuYV25OdgS7w9Xu2LO5cGyhHCgn8dMXh9bO7vi3i9pA==} 1219 | engines: {node: ^10 || ^12 || >=14.0} 1220 | peerDependencies: 1221 | postcss: ^8.2.15 1222 | dependencies: 1223 | postcss: 8.3.5 1224 | postcss-value-parser: 4.1.0 1225 | dev: true 1226 | 1227 | /postcss-normalize-timing-functions/5.0.1_postcss@8.3.5: 1228 | resolution: {integrity: sha512-cPcBdVN5OsWCNEo5hiXfLUnXfTGtSFiBU9SK8k7ii8UD7OLuznzgNRYkLZow11BkQiiqMcgPyh4ZqXEEUrtQ1Q==} 1229 | engines: {node: ^10 || ^12 || >=14.0} 1230 | peerDependencies: 1231 | postcss: ^8.2.15 1232 | dependencies: 1233 | cssnano-utils: 2.0.1_postcss@8.3.5 1234 | postcss: 8.3.5 1235 | postcss-value-parser: 4.1.0 1236 | dev: true 1237 | 1238 | /postcss-normalize-unicode/5.0.1_postcss@8.3.5: 1239 | resolution: {integrity: sha512-kAtYD6V3pK0beqrU90gpCQB7g6AOfP/2KIPCVBKJM2EheVsBQmx/Iof+9zR9NFKLAx4Pr9mDhogB27pmn354nA==} 1240 | engines: {node: ^10 || ^12 || >=14.0} 1241 | peerDependencies: 1242 | postcss: ^8.2.15 1243 | dependencies: 1244 | browserslist: 4.16.6 1245 | postcss: 8.3.5 1246 | postcss-value-parser: 4.1.0 1247 | dev: true 1248 | 1249 | /postcss-normalize-url/5.0.2_postcss@8.3.5: 1250 | resolution: {integrity: sha512-k4jLTPUxREQ5bpajFQZpx8bCF2UrlqOTzP9kEqcEnOfwsRshWs2+oAFIHfDQB8GO2PaUaSE0NlTAYtbluZTlHQ==} 1251 | engines: {node: ^10 || ^12 || >=14.0} 1252 | peerDependencies: 1253 | postcss: ^8.2.15 1254 | dependencies: 1255 | is-absolute-url: 3.0.3 1256 | normalize-url: 6.1.0 1257 | postcss: 8.3.5 1258 | postcss-value-parser: 4.1.0 1259 | dev: true 1260 | 1261 | /postcss-normalize-whitespace/5.0.1_postcss@8.3.5: 1262 | resolution: {integrity: sha512-iPklmI5SBnRvwceb/XH568yyzK0qRVuAG+a1HFUsFRf11lEJTiQQa03a4RSCQvLKdcpX7XsI1Gen9LuLoqwiqA==} 1263 | engines: {node: ^10 || ^12 || >=14.0} 1264 | peerDependencies: 1265 | postcss: ^8.2.15 1266 | dependencies: 1267 | postcss: 8.3.5 1268 | postcss-value-parser: 4.1.0 1269 | dev: true 1270 | 1271 | /postcss-ordered-values/5.0.2_postcss@8.3.5: 1272 | resolution: {integrity: sha512-8AFYDSOYWebJYLyJi3fyjl6CqMEG/UVworjiyK1r573I56kb3e879sCJLGvR3merj+fAdPpVplXKQZv+ey6CgQ==} 1273 | engines: {node: ^10 || ^12 || >=14.0} 1274 | peerDependencies: 1275 | postcss: ^8.2.15 1276 | dependencies: 1277 | cssnano-utils: 2.0.1_postcss@8.3.5 1278 | postcss: 8.3.5 1279 | postcss-value-parser: 4.1.0 1280 | dev: true 1281 | 1282 | /postcss-reduce-initial/5.0.1_postcss@8.3.5: 1283 | resolution: {integrity: sha512-zlCZPKLLTMAqA3ZWH57HlbCjkD55LX9dsRyxlls+wfuRfqCi5mSlZVan0heX5cHr154Dq9AfbH70LyhrSAezJw==} 1284 | engines: {node: ^10 || ^12 || >=14.0} 1285 | peerDependencies: 1286 | postcss: ^8.2.15 1287 | dependencies: 1288 | browserslist: 4.16.6 1289 | caniuse-api: 3.0.0 1290 | postcss: 8.3.5 1291 | dev: true 1292 | 1293 | /postcss-reduce-transforms/5.0.1_postcss@8.3.5: 1294 | resolution: {integrity: sha512-a//FjoPeFkRuAguPscTVmRQUODP+f3ke2HqFNgGPwdYnpeC29RZdCBvGRGTsKpMURb/I3p6jdKoBQ2zI+9Q7kA==} 1295 | engines: {node: ^10 || ^12 || >=14.0} 1296 | peerDependencies: 1297 | postcss: ^8.2.15 1298 | dependencies: 1299 | cssnano-utils: 2.0.1_postcss@8.3.5 1300 | postcss: 8.3.5 1301 | postcss-value-parser: 4.1.0 1302 | dev: true 1303 | 1304 | /postcss-selector-parser/6.0.6: 1305 | resolution: {integrity: sha512-9LXrvaaX3+mcv5xkg5kFwqSzSH1JIObIx51PrndZwlmznwXRfxMddDvo9gve3gVR8ZTKgoFDdWkbRFmEhT4PMg==} 1306 | engines: {node: '>=4'} 1307 | dependencies: 1308 | cssesc: 3.0.0 1309 | util-deprecate: 1.0.2 1310 | dev: true 1311 | 1312 | /postcss-svgo/5.0.2_postcss@8.3.5: 1313 | resolution: {integrity: sha512-YzQuFLZu3U3aheizD+B1joQ94vzPfE6BNUcSYuceNxlVnKKsOtdo6hL9/zyC168Q8EwfLSgaDSalsUGa9f2C0A==} 1314 | engines: {node: ^10 || ^12 || >=14.0} 1315 | peerDependencies: 1316 | postcss: ^8.2.15 1317 | dependencies: 1318 | postcss: 8.3.5 1319 | postcss-value-parser: 4.1.0 1320 | svgo: 2.3.0 1321 | dev: true 1322 | 1323 | /postcss-unique-selectors/5.0.1_postcss@8.3.5: 1324 | resolution: {integrity: sha512-gwi1NhHV4FMmPn+qwBNuot1sG1t2OmacLQ/AX29lzyggnjd+MnVD5uqQmpXO3J17KGL2WAxQruj1qTd3H0gG/w==} 1325 | engines: {node: ^10 || ^12 || >=14.0} 1326 | peerDependencies: 1327 | postcss: ^8.2.15 1328 | dependencies: 1329 | alphanum-sort: 1.0.2 1330 | postcss: 8.3.5 1331 | postcss-selector-parser: 6.0.6 1332 | uniqs: 2.0.0 1333 | dev: true 1334 | 1335 | /postcss-value-parser/3.3.1: 1336 | resolution: {integrity: sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==} 1337 | dev: true 1338 | 1339 | /postcss-value-parser/4.1.0: 1340 | resolution: {integrity: sha512-97DXOFbQJhk71ne5/Mt6cOu6yxsSfM0QGQyl0L25Gca4yGWEGJaig7l7gbCX623VqTBNGLRLaVUCnNkcedlRSQ==} 1341 | dev: true 1342 | 1343 | /postcss/8.3.5: 1344 | resolution: {integrity: sha512-NxTuJocUhYGsMiMFHDUkmjSKT3EdH4/WbGF6GCi1NDGk+vbcUTun4fpbOqaPtD8IIsztA2ilZm2DhYCuyN58gA==} 1345 | engines: {node: ^10 || ^12 || >=14} 1346 | dependencies: 1347 | colorette: 1.2.2 1348 | nanoid: 3.1.23 1349 | source-map-js: 0.6.2 1350 | dev: true 1351 | 1352 | /prettier-plugin-svelte/2.3.1_prettier@2.2.1+svelte@3.38.3: 1353 | resolution: {integrity: sha512-F1/r6OYoBq8Zgurhs1MN25tdrhPw0JW5JjioPRqpxbYdmrZ3gY/DzHGs0B6zwd4DLyRsfGB2gqhxUCbHt/D1fw==} 1354 | peerDependencies: 1355 | prettier: ^1.16.4 || ^2.0.0 1356 | svelte: ^3.2.0 1357 | dependencies: 1358 | prettier: 2.2.1 1359 | svelte: 3.38.3 1360 | dev: true 1361 | 1362 | /prettier/2.2.1: 1363 | resolution: {integrity: sha512-PqyhM2yCjg/oKkFPtTGUojv7gnZAoG80ttl45O6x2Ug/rMJw4wcc9k6aaf2hibP7BGVCCM33gZoGjyvt9mm16Q==} 1364 | engines: {node: '>=10.13.0'} 1365 | hasBin: true 1366 | dev: true 1367 | 1368 | /pretty-hrtime/1.0.3: 1369 | resolution: {integrity: sha1-t+PqQkNaTJsnWdmeDyAesZWALuE=} 1370 | engines: {node: '>= 0.8'} 1371 | dev: true 1372 | 1373 | /purgecss/4.0.3: 1374 | resolution: {integrity: sha512-PYOIn5ibRIP34PBU9zohUcCI09c7drPJJtTDAc0Q6QlRz2/CHQ8ywGLdE7ZhxU2VTqB7p5wkvj5Qcm05Rz3Jmw==} 1375 | hasBin: true 1376 | dependencies: 1377 | commander: 6.2.1 1378 | glob: 7.1.7 1379 | postcss: 8.3.5 1380 | postcss-selector-parser: 6.0.6 1381 | dev: true 1382 | 1383 | /queue-microtask/1.2.3: 1384 | resolution: {integrity: sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==} 1385 | dev: true 1386 | 1387 | /quick-lru/5.1.1: 1388 | resolution: {integrity: sha512-WuyALRjWPDGtt/wzJiadO5AXY+8hZ80hVpe6MyivgraREW751X3SbhRvG3eLKOYN+8VEvqLcf3wdnt44Z4S4SA==} 1389 | engines: {node: '>=10'} 1390 | dev: true 1391 | 1392 | /readdirp/3.6.0: 1393 | resolution: {integrity: sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==} 1394 | engines: {node: '>=8.10.0'} 1395 | dependencies: 1396 | picomatch: 2.3.0 1397 | dev: true 1398 | 1399 | /reduce-css-calc/2.1.8: 1400 | resolution: {integrity: sha512-8liAVezDmUcH+tdzoEGrhfbGcP7nOV4NkGE3a74+qqvE7nt9i4sKLGBuZNOnpI4WiGksiNPklZxva80061QiPg==} 1401 | dependencies: 1402 | css-unit-converter: 1.1.2 1403 | postcss-value-parser: 3.3.1 1404 | dev: true 1405 | 1406 | /require-relative/0.8.7: 1407 | resolution: {integrity: sha1-eZlTn8ngR6N5KPoZb44VY9q9Nt4=} 1408 | dev: true 1409 | 1410 | /resolve-from/4.0.0: 1411 | resolution: {integrity: sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==} 1412 | engines: {node: '>=4'} 1413 | dev: true 1414 | 1415 | /resolve-from/5.0.0: 1416 | resolution: {integrity: sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==} 1417 | engines: {node: '>=8'} 1418 | dev: true 1419 | 1420 | /resolve/1.20.0: 1421 | resolution: {integrity: sha512-wENBPt4ySzg4ybFQW2TT1zMQucPK95HSh/nq2CFTZVOGut2+pQvSsgtda4d26YrYcr067wjbmzOG8byDPBX63A==} 1422 | dependencies: 1423 | is-core-module: 2.4.0 1424 | path-parse: 1.0.7 1425 | dev: true 1426 | 1427 | /reusify/1.0.4: 1428 | resolution: {integrity: sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==} 1429 | engines: {iojs: '>=1.0.0', node: '>=0.10.0'} 1430 | dev: true 1431 | 1432 | /rgb-regex/1.0.1: 1433 | resolution: {integrity: sha1-wODWiC3w4jviVKR16O3UGRX+rrE=} 1434 | dev: true 1435 | 1436 | /rgba-regex/1.0.0: 1437 | resolution: {integrity: sha1-QzdOLiyglosO8VI0YLfXMP8i7rM=} 1438 | dev: true 1439 | 1440 | /rimraf/3.0.2: 1441 | resolution: {integrity: sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==} 1442 | hasBin: true 1443 | dependencies: 1444 | glob: 7.1.7 1445 | dev: true 1446 | 1447 | /rollup/2.52.2: 1448 | resolution: {integrity: sha512-4RlFC3k2BIHlUsJ9mGd8OO+9Lm2eDF5P7+6DNQOp5sx+7N/1tFM01kELfbxlMX3MxT6owvLB1ln4S3QvvQlbUA==} 1449 | engines: {node: '>=10.0.0'} 1450 | hasBin: true 1451 | optionalDependencies: 1452 | fsevents: 2.3.2 1453 | dev: true 1454 | 1455 | /run-parallel/1.2.0: 1456 | resolution: {integrity: sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==} 1457 | dependencies: 1458 | queue-microtask: 1.2.3 1459 | dev: true 1460 | 1461 | /sade/1.7.4: 1462 | resolution: {integrity: sha512-y5yauMD93rX840MwUJr7C1ysLFBgMspsdTo4UVrDg3fXDvtwOyIqykhVAAm6fk/3au77773itJStObgK+LKaiA==} 1463 | engines: {node: '>= 6'} 1464 | dependencies: 1465 | mri: 1.1.6 1466 | dev: true 1467 | 1468 | /simple-swizzle/0.2.2: 1469 | resolution: {integrity: sha1-pNprY1/8zMoz9w0Xy5JZLeleVXo=} 1470 | dependencies: 1471 | is-arrayish: 0.3.2 1472 | dev: true 1473 | 1474 | /source-map-js/0.6.2: 1475 | resolution: {integrity: sha512-/3GptzWzu0+0MBQFrDKzw/DvvMTUORvgY6k6jd/VS6iCR4RDTKWH6v6WPwQoUO8667uQEf9Oe38DxAYWY5F/Ug==} 1476 | engines: {node: '>=0.10.0'} 1477 | dev: true 1478 | 1479 | /source-map/0.6.1: 1480 | resolution: {integrity: sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==} 1481 | engines: {node: '>=0.10.0'} 1482 | dev: true 1483 | 1484 | /stable/0.1.8: 1485 | resolution: {integrity: sha512-ji9qxRnOVfcuLDySj9qzhGSEFVobyt1kIOSkj1qZzYLzq7Tos/oUUWvotUPQLlrsidqsK6tBH89Bc9kL5zHA6w==} 1486 | dev: true 1487 | 1488 | /strip-indent/3.0.0: 1489 | resolution: {integrity: sha512-laJTa3Jb+VQpaC6DseHhF7dXVqHTfJPCRDaEbid/drOhgitgYku/letMUqOXFoWV0zIIUbjpdH2t+tYj4bQMRQ==} 1490 | engines: {node: '>=8'} 1491 | dependencies: 1492 | min-indent: 1.0.1 1493 | dev: true 1494 | 1495 | /stylehacks/5.0.1_postcss@8.3.5: 1496 | resolution: {integrity: sha512-Es0rVnHIqbWzveU1b24kbw92HsebBepxfcqe5iix7t9j0PQqhs0IxXVXv0pY2Bxa08CgMkzD6OWql7kbGOuEdA==} 1497 | engines: {node: ^10 || ^12 || >=14.0} 1498 | peerDependencies: 1499 | postcss: ^8.2.15 1500 | dependencies: 1501 | browserslist: 4.16.6 1502 | postcss: 8.3.5 1503 | postcss-selector-parser: 6.0.6 1504 | dev: true 1505 | 1506 | /supports-color/5.5.0: 1507 | resolution: {integrity: sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==} 1508 | engines: {node: '>=4'} 1509 | dependencies: 1510 | has-flag: 3.0.0 1511 | dev: true 1512 | 1513 | /supports-color/7.2.0: 1514 | resolution: {integrity: sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==} 1515 | engines: {node: '>=8'} 1516 | dependencies: 1517 | has-flag: 4.0.0 1518 | dev: true 1519 | 1520 | /svelte-hmr/0.14.4_svelte@3.38.3: 1521 | resolution: {integrity: sha512-kItFF7vqzStckSigoFmMnxJpTOdB9TWnQAW6Js+yAB4277tLbJIIE5KBlGHNmJNpA7MguqidsPB27Uw5UzQPCA==} 1522 | peerDependencies: 1523 | svelte: '>=3.19.0' 1524 | dependencies: 1525 | svelte: 3.38.3 1526 | dev: true 1527 | 1528 | /svelte-preprocess/4.7.3_7d4d22e7287a4965435cb62392efd75a: 1529 | resolution: {integrity: sha512-Zx1/xLeGOIBlZMGPRCaXtlMe4ZA0faato5Dc3CosEqwu75MIEPuOstdkH6cy+RYTUYynoxzNaDxkPX4DbrPwRA==} 1530 | engines: {node: '>= 9.11.2'} 1531 | requiresBuild: true 1532 | peerDependencies: 1533 | '@babel/core': ^7.10.2 1534 | coffeescript: ^2.5.1 1535 | less: ^3.11.3 1536 | node-sass: '*' 1537 | postcss: ^7 || ^8 1538 | postcss-load-config: ^2.1.0 || ^3.0.0 1539 | pug: ^3.0.0 1540 | sass: ^1.26.8 1541 | stylus: ^0.54.7 1542 | sugarss: ^2.0.0 1543 | svelte: ^3.23.0 1544 | typescript: ^3.9.5 || ^4.0.0 1545 | peerDependenciesMeta: 1546 | '@babel/core': 1547 | optional: true 1548 | coffeescript: 1549 | optional: true 1550 | less: 1551 | optional: true 1552 | node-sass: 1553 | optional: true 1554 | postcss: 1555 | optional: true 1556 | postcss-load-config: 1557 | optional: true 1558 | pug: 1559 | optional: true 1560 | sass: 1561 | optional: true 1562 | stylus: 1563 | optional: true 1564 | sugarss: 1565 | optional: true 1566 | typescript: 1567 | optional: true 1568 | dependencies: 1569 | '@types/pug': 2.0.4 1570 | '@types/sass': 1.16.0 1571 | detect-indent: 6.1.0 1572 | postcss: 8.3.5 1573 | postcss-load-config: 3.1.0 1574 | strip-indent: 3.0.0 1575 | svelte: 3.38.3 1576 | dev: true 1577 | 1578 | /svelte/3.38.3: 1579 | resolution: {integrity: sha512-N7bBZJH0iF24wsalFZF+fVYMUOigaAUQMIcEKHO3jstK/iL8VmP9xE+P0/a76+FkNcWt+TDv2Gx1taUoUscrvw==} 1580 | engines: {node: '>= 8'} 1581 | dev: true 1582 | 1583 | /svgo/2.3.0: 1584 | resolution: {integrity: sha512-fz4IKjNO6HDPgIQxu4IxwtubtbSfGEAJUq/IXyTPIkGhWck/faiiwfkvsB8LnBkKLvSoyNNIY6d13lZprJMc9Q==} 1585 | engines: {node: '>=10.13.0'} 1586 | hasBin: true 1587 | dependencies: 1588 | '@trysound/sax': 0.1.1 1589 | chalk: 4.1.1 1590 | commander: 7.2.0 1591 | css-select: 3.1.2 1592 | css-tree: 1.1.3 1593 | csso: 4.2.0 1594 | stable: 0.1.8 1595 | dev: true 1596 | 1597 | /tailwindcss/2.2.2_72be89de93206f86f2d67dd5290ec14d: 1598 | resolution: {integrity: sha512-OzFWhlnfrO3JXZKHQiqZcb0Wwl3oJSmQ7PvT2jdIgCjV5iUoAyql9bb9ZLCSBI5TYXmawujXAoNxXVfP5Auy/Q==} 1599 | engines: {node: '>=12.13.0'} 1600 | hasBin: true 1601 | peerDependencies: 1602 | autoprefixer: ^10.0.2 1603 | postcss: ^8.0.9 1604 | dependencies: 1605 | '@fullhuman/postcss-purgecss': 4.0.3_postcss@8.3.5 1606 | arg: 5.0.0 1607 | autoprefixer: 10.2.6_postcss@8.3.5 1608 | bytes: 3.1.0 1609 | chalk: 4.1.1 1610 | chokidar: 3.5.2 1611 | color: 3.1.3 1612 | cosmiconfig: 7.0.0 1613 | detective: 5.2.0 1614 | didyoumean: 1.2.1 1615 | dlv: 1.1.3 1616 | fast-glob: 3.2.5 1617 | fs-extra: 10.0.0 1618 | glob-parent: 6.0.0 1619 | html-tags: 3.1.0 1620 | is-glob: 4.0.1 1621 | lodash: 4.17.21 1622 | lodash.topath: 4.5.2 1623 | modern-normalize: 1.1.0 1624 | node-emoji: 1.10.0 1625 | normalize-path: 3.0.0 1626 | object-hash: 2.2.0 1627 | postcss: 8.3.5 1628 | postcss-js: 3.0.3 1629 | postcss-load-config: 3.1.0 1630 | postcss-nested: 5.0.5_postcss@8.3.5 1631 | postcss-selector-parser: 6.0.6 1632 | postcss-value-parser: 4.1.0 1633 | pretty-hrtime: 1.0.3 1634 | quick-lru: 5.1.1 1635 | reduce-css-calc: 2.1.8 1636 | resolve: 1.20.0 1637 | tmp: 0.2.1 1638 | transitivePeerDependencies: 1639 | - ts-node 1640 | dev: true 1641 | 1642 | /timsort/0.3.0: 1643 | resolution: {integrity: sha1-QFQRqOfmM5/mTbmiNN4R3DHgK9Q=} 1644 | dev: true 1645 | 1646 | /tiny-glob/0.2.9: 1647 | resolution: {integrity: sha512-g/55ssRPUjShh+xkfx9UPDXqhckHEsHr4Vd9zX55oSdGZc/MD0m3sferOkwWtp98bv+kcVfEHtRJgBVJzelrzg==} 1648 | dependencies: 1649 | globalyzer: 0.1.0 1650 | globrex: 0.1.2 1651 | dev: true 1652 | 1653 | /tmp/0.2.1: 1654 | resolution: {integrity: sha512-76SUhtfqR2Ijn+xllcI5P1oyannHNHByD80W1q447gU3mp9G9PSpGdWmjUOHRDPiHYacIk66W7ubDTuPF3BEtQ==} 1655 | engines: {node: '>=8.17.0'} 1656 | dependencies: 1657 | rimraf: 3.0.2 1658 | dev: true 1659 | 1660 | /to-regex-range/5.0.1: 1661 | resolution: {integrity: sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==} 1662 | engines: {node: '>=8.0'} 1663 | dependencies: 1664 | is-number: 7.0.0 1665 | dev: true 1666 | 1667 | /uniqs/2.0.0: 1668 | resolution: {integrity: sha1-/+3ks2slKQaW5uFl1KWe25mOawI=} 1669 | dev: true 1670 | 1671 | /universalify/2.0.0: 1672 | resolution: {integrity: sha512-hAZsKq7Yy11Zu1DE0OzWjw7nnLZmJZYTDZZyEFHZdUhV8FkH5MCfoU1XMaxXovpyW5nq5scPqq0ZDP9Zyl04oQ==} 1673 | engines: {node: '>= 10.0.0'} 1674 | dev: true 1675 | 1676 | /util-deprecate/1.0.2: 1677 | resolution: {integrity: sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=} 1678 | dev: true 1679 | 1680 | /vendors/1.0.4: 1681 | resolution: {integrity: sha512-/juG65kTL4Cy2su4P8HjtkTxk6VmJDiOPBufWniqQ6wknac6jNiXS9vU+hO3wgusiyqWlzTbVHi0dyJqRONg3w==} 1682 | dev: true 1683 | 1684 | /vite/2.3.8: 1685 | resolution: {integrity: sha512-QiEx+iqNnJntSgSF2fWRQvRey9pORIrtNJzNyBJXwc+BdzWs83FQolX84cTBo393cfhObrtWa6180dAa4NLDiQ==} 1686 | engines: {node: '>=12.0.0'} 1687 | hasBin: true 1688 | dependencies: 1689 | esbuild: 0.12.9 1690 | postcss: 8.3.5 1691 | resolve: 1.20.0 1692 | rollup: 2.52.2 1693 | optionalDependencies: 1694 | fsevents: 2.3.2 1695 | dev: true 1696 | 1697 | /wrappy/1.0.2: 1698 | resolution: {integrity: sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=} 1699 | dev: true 1700 | 1701 | /xtend/4.0.2: 1702 | resolution: {integrity: sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==} 1703 | engines: {node: '>=0.4'} 1704 | dev: true 1705 | 1706 | /yaml/1.10.2: 1707 | resolution: {integrity: sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg==} 1708 | engines: {node: '>= 6'} 1709 | dev: true 1710 | -------------------------------------------------------------------------------- /frontend/postcss.config.cjs: -------------------------------------------------------------------------------- 1 | const tailwindcss = require("tailwindcss"); 2 | const autoprefixer = require("autoprefixer"); 3 | const cssnano = require("cssnano"); 4 | 5 | const mode = process.env.NODE_ENV; 6 | const dev = mode === "development"; 7 | 8 | const config = { 9 | plugins: [ 10 | //Some plugins, like postcss-nested, need to run before Tailwind, 11 | tailwindcss(), 12 | //But others, like autoprefixer, need to run after, 13 | autoprefixer(), 14 | !dev && cssnano({ 15 | preset: "default", 16 | }) 17 | ], 18 | }; 19 | 20 | module.exports = config; -------------------------------------------------------------------------------- /frontend/src/app.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | %svelte.head% 8 | 9 | 10 |
%svelte.body%
11 | 12 | 13 | -------------------------------------------------------------------------------- /frontend/src/app.postcss: -------------------------------------------------------------------------------- 1 | /* Write your global styles here, in PostCSS syntax */ 2 | @tailwind base; 3 | @tailwind components; 4 | @tailwind utilities -------------------------------------------------------------------------------- /frontend/src/global.d.ts: -------------------------------------------------------------------------------- 1 | /// 2 | -------------------------------------------------------------------------------- /frontend/src/lib/variables.js: -------------------------------------------------------------------------------- 1 | export const variables = { 2 | apiPath: import.meta.env.VITE_API_BASE_PATH, 3 | }; -------------------------------------------------------------------------------- /frontend/src/routes/__layout.svelte: -------------------------------------------------------------------------------- 1 | 4 | 5 | 6 | -------------------------------------------------------------------------------- /frontend/src/routes/index.svelte: -------------------------------------------------------------------------------- 1 | 15 | 16 | 19 | 20 |
21 |
22 |

FastAPI & Piccolo Example Project

23 |

24 | Visit kit.svelte.dev to read the documentation 25 |

26 | {#each products as product} 27 |

{product.name}

28 | {/each} 29 |
30 |
31 | -------------------------------------------------------------------------------- /frontend/static/favicon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/heliumbrain/fastapi-piccolo/895f55790d05782a1bd7d042b305fd8343c47d62/frontend/static/favicon.png -------------------------------------------------------------------------------- /frontend/svelte.config.js: -------------------------------------------------------------------------------- 1 | import preprocess from "svelte-preprocess"; 2 | import adapter from '@sveltejs/adapter-node'; 3 | /** @type {import('@sveltejs/kit').Config} */ 4 | const config = { 5 | kit: { 6 | adapter: adapter({ 7 | out: 'build' 8 | }), 9 | // hydrate the
element in src/app.html 10 | target: '#svelte' 11 | }, 12 | 13 | preprocess: [preprocess({ 14 | "postcss": true 15 | })] 16 | }; 17 | 18 | 19 | export default config; 20 | // Workaround until SvelteKit uses Vite 2.3.8 (and it's confirmed to fix the Tailwind JIT problem) 21 | const mode = process.env.NODE_ENV; 22 | const dev = mode === "development"; 23 | process.env.TAILWIND_MODE = dev ? "watch" : "build"; 24 | -------------------------------------------------------------------------------- /frontend/tailwind.config.cjs: -------------------------------------------------------------------------------- 1 | const config = { 2 | purge: [ 3 | "./src/**/*.{html,js,svelte,ts}", 4 | ], 5 | theme: { 6 | extend: {}, 7 | }, 8 | plugins: [], 9 | }; 10 | 11 | module.exports = config; 12 | -------------------------------------------------------------------------------- /piccolo-fastapi/Dockerfile: -------------------------------------------------------------------------------- 1 | # pull official base image 2 | FROM python:3.9.4-slim-buster 3 | 4 | # set working directory 5 | RUN mkdir -p /usr/src/app 6 | WORKDIR /usr/src/app 7 | 8 | # set environment variables 9 | ENV PYTHONDONTWRITEBYTECODE 1 10 | ENV PYTHONUNBUFFERED 1 11 | 12 | # install system dependencies 13 | RUN apt-get update \ 14 | && apt-get -y install netcat gcc postgresql \ 15 | && apt-get clean 16 | 17 | # install python dependencies 18 | RUN pip install --upgrade pip 19 | COPY ./requirements.txt . 20 | RUN pip install -r requirements.txt 21 | 22 | # add app 23 | COPY . . 24 | 25 | # add entrypoint.sh 26 | COPY ./entrypoint.sh . 27 | RUN chmod +x /usr/src/app/entrypoint.sh 28 | 29 | # run entrypoint.sh 30 | ENTRYPOINT ["/usr/src/app/entrypoint.sh"] -------------------------------------------------------------------------------- /piccolo-fastapi/app.py: -------------------------------------------------------------------------------- 1 | import typing as t 2 | 3 | from fastapi import FastAPI 4 | from piccolo.apps.user.tables import BaseUser 5 | from piccolo.engine import engine_finder 6 | from piccolo_admin.endpoints import create_admin 7 | from piccolo_api.session_auth.middleware import SessionsAuthBackend 8 | from piccolo_api.session_auth.tables import SessionsBase 9 | from product.piccolo_app import APP_CONFIG 10 | from product.routers import product_router 11 | from product.tables import Product 12 | from starlette.middleware.authentication import AuthenticationMiddleware 13 | from starlette.routing import Mount 14 | from starlette.staticfiles import StaticFiles 15 | 16 | app = FastAPI( 17 | routes=[ 18 | Mount( 19 | "/admin/", 20 | create_admin(tables=[Product], site_name="FastAPI + Piccolo - Admin"), 21 | ), 22 | ], 23 | ) 24 | 25 | from fastapi.middleware.cors import CORSMiddleware 26 | 27 | app = FastAPI() 28 | 29 | app.add_middleware( 30 | CORSMiddleware, 31 | allow_origins=["*"], # Don't allow all in production, only for testing purposes! 32 | allow_credentials=True, 33 | allow_methods=["*"], 34 | allow_headers=["*"], 35 | ) 36 | 37 | 38 | session_auth = ( 39 | AuthenticationMiddleware( 40 | app, 41 | backend=SessionsAuthBackend( 42 | auth_table=BaseUser, 43 | session_table=SessionsBase, 44 | cookie_name="piccoloauth", 45 | admin_only=True, 46 | superuser_only=False, 47 | active_only=True, 48 | ), 49 | ), 50 | ) 51 | 52 | 53 | app.include_router(product_router) 54 | 55 | 56 | @app.on_event("startup") 57 | async def open_database_connection_pool(): 58 | try: 59 | engine = engine_finder() 60 | await engine.start_connection_pool() 61 | except Exception: 62 | print("Unable to connect to the database") 63 | 64 | 65 | @app.on_event("shutdown") 66 | async def close_database_connection_pool(): 67 | try: 68 | engine = engine_finder() 69 | await engine.close_connection_pool() 70 | except Exception: 71 | print("Unable to connect to the database") 72 | -------------------------------------------------------------------------------- /piccolo-fastapi/config.py: -------------------------------------------------------------------------------- 1 | from pydantic import BaseSettings 2 | 3 | 4 | class Settings(BaseSettings): 5 | postgres_user: str 6 | postgres_password: str 7 | postgres_db: str 8 | postgres_host: str 9 | postgres_port: int 10 | 11 | class Config: 12 | env_file = "../.env" 13 | env_file_encoding = "utf-8" 14 | 15 | 16 | settings = Settings() 17 | -------------------------------------------------------------------------------- /piccolo-fastapi/dependencies.py: -------------------------------------------------------------------------------- 1 | from piccolo_api.session_auth.middleware import SessionsAuthBackend 2 | from starlette.middleware.authentication import AuthenticationMiddleware 3 | 4 | # TODO: Add the SessionsAuthBackend as a reusable dependency 5 | -------------------------------------------------------------------------------- /piccolo-fastapi/entrypoint.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | 3 | echo "Waiting for postgres..." 4 | 5 | while ! nc -z postgres 5432; do 6 | sleep 0.1 7 | done 8 | 9 | echo "PostgreSQL started" 10 | 11 | exec "$@" -------------------------------------------------------------------------------- /piccolo-fastapi/main.py: -------------------------------------------------------------------------------- 1 | if __name__ == "__main__": 2 | 3 | import uvicorn 4 | 5 | uvicorn.run("app:app", reload=True) 6 | -------------------------------------------------------------------------------- /piccolo-fastapi/piccolo_conf.py: -------------------------------------------------------------------------------- 1 | from config import settings 2 | from piccolo.conf.apps import AppRegistry 3 | from piccolo.engine.postgres import PostgresEngine 4 | 5 | DB = PostgresEngine( 6 | config={ 7 | "database": settings.postgres_db, 8 | "user": settings.postgres_user, 9 | "password": settings.postgres_user, 10 | "host": settings.postgres_host, 11 | "port": settings.postgres_port, 12 | } 13 | ) 14 | 15 | APP_REGISTRY = AppRegistry( 16 | apps=[ 17 | "product.piccolo_app", 18 | "piccolo_admin.piccolo_app", 19 | "piccolo.apps.user.piccolo_app", 20 | "piccolo_api.session_auth.piccolo_app", 21 | ] 22 | ) 23 | -------------------------------------------------------------------------------- /piccolo-fastapi/poetry.lock: -------------------------------------------------------------------------------- 1 | [[package]] 2 | name = "aiofiles" 3 | version = "0.7.0" 4 | description = "File support for asyncio." 5 | category = "main" 6 | optional = false 7 | python-versions = ">=3.6,<4.0" 8 | 9 | [[package]] 10 | name = "aiosqlite" 11 | version = "0.17.0" 12 | description = "asyncio bridge to the standard sqlite3 module" 13 | category = "main" 14 | optional = false 15 | python-versions = ">=3.6" 16 | 17 | [package.dependencies] 18 | typing_extensions = ">=3.7.2" 19 | 20 | [[package]] 21 | name = "appdirs" 22 | version = "1.4.4" 23 | description = "A small Python module for determining appropriate platform-specific dirs, e.g. a \"user data dir\"." 24 | category = "main" 25 | optional = false 26 | python-versions = "*" 27 | 28 | [[package]] 29 | name = "asgiref" 30 | version = "3.3.4" 31 | description = "ASGI specs, helper code, and adapters" 32 | category = "main" 33 | optional = false 34 | python-versions = ">=3.6" 35 | 36 | [package.extras] 37 | tests = ["pytest", "pytest-asyncio", "mypy (>=0.800)"] 38 | 39 | [[package]] 40 | name = "asyncpg" 41 | version = "0.23.0" 42 | description = "An asyncio PostgreSQL driver" 43 | category = "main" 44 | optional = false 45 | python-versions = ">=3.5.0" 46 | 47 | [package.extras] 48 | dev = ["Cython (>=0.29.20,<0.30.0)", "pytest (>=3.6.0)", "Sphinx (>=1.7.3,<1.8.0)", "sphinxcontrib-asyncio (>=0.2.0,<0.3.0)", "sphinx-rtd-theme (>=0.2.4,<0.3.0)", "pycodestyle (>=2.5.0,<2.6.0)", "flake8 (>=3.7.9,<3.8.0)", "uvloop (>=0.14.0,<0.15.0)"] 49 | docs = ["Sphinx (>=1.7.3,<1.8.0)", "sphinxcontrib-asyncio (>=0.2.0,<0.3.0)", "sphinx-rtd-theme (>=0.2.4,<0.3.0)"] 50 | test = ["pycodestyle (>=2.5.0,<2.6.0)", "flake8 (>=3.7.9,<3.8.0)", "uvloop (>=0.14.0,<0.15.0)"] 51 | 52 | [[package]] 53 | name = "black" 54 | version = "21.6b0" 55 | description = "The uncompromising code formatter." 56 | category = "main" 57 | optional = false 58 | python-versions = ">=3.6.2" 59 | 60 | [package.dependencies] 61 | appdirs = "*" 62 | click = ">=7.1.2" 63 | mypy-extensions = ">=0.4.3" 64 | pathspec = ">=0.8.1,<1" 65 | regex = ">=2020.1.8" 66 | toml = ">=0.10.1" 67 | 68 | [package.extras] 69 | colorama = ["colorama (>=0.4.3)"] 70 | d = ["aiohttp (>=3.6.0)", "aiohttp-cors (>=0.4.0)"] 71 | python2 = ["typed-ast (>=1.4.2)"] 72 | uvloop = ["uvloop (>=0.15.2)"] 73 | 74 | [[package]] 75 | name = "click" 76 | version = "8.0.1" 77 | description = "Composable command line interface toolkit" 78 | category = "main" 79 | optional = false 80 | python-versions = ">=3.6" 81 | 82 | [package.dependencies] 83 | colorama = {version = "*", markers = "platform_system == \"Windows\""} 84 | 85 | [[package]] 86 | name = "colorama" 87 | version = "0.4.4" 88 | description = "Cross-platform colored terminal text." 89 | category = "main" 90 | optional = false 91 | python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*" 92 | 93 | [[package]] 94 | name = "docstring-parser" 95 | version = "0.7.1" 96 | description = "" 97 | category = "main" 98 | optional = false 99 | python-versions = "~=3.6" 100 | 101 | [[package]] 102 | name = "fastapi" 103 | version = "0.65.2" 104 | description = "FastAPI framework, high performance, easy to learn, fast to code, ready for production" 105 | category = "main" 106 | optional = false 107 | python-versions = ">=3.6" 108 | 109 | [package.dependencies] 110 | pydantic = ">=1.6.2,<1.7 || >1.7,<1.7.1 || >1.7.1,<1.7.2 || >1.7.2,<1.7.3 || >1.7.3,<1.8 || >1.8,<1.8.1 || >1.8.1,<2.0.0" 111 | starlette = "0.14.2" 112 | 113 | [package.extras] 114 | all = ["requests (>=2.24.0,<3.0.0)", "aiofiles (>=0.5.0,<0.6.0)", "jinja2 (>=2.11.2,<3.0.0)", "python-multipart (>=0.0.5,<0.0.6)", "itsdangerous (>=1.1.0,<2.0.0)", "pyyaml (>=5.3.1,<6.0.0)", "graphene (>=2.1.8,<3.0.0)", "ujson (>=4.0.1,<5.0.0)", "orjson (>=3.2.1,<4.0.0)", "email_validator (>=1.1.1,<2.0.0)", "uvicorn[standard] (>=0.12.0,<0.14.0)", "async_exit_stack (>=1.0.1,<2.0.0)", "async_generator (>=1.10,<2.0.0)"] 115 | dev = ["python-jose[cryptography] (>=3.1.0,<4.0.0)", "passlib[bcrypt] (>=1.7.2,<2.0.0)", "autoflake (>=1.3.1,<2.0.0)", "flake8 (>=3.8.3,<4.0.0)", "uvicorn[standard] (>=0.12.0,<0.14.0)", "graphene (>=2.1.8,<3.0.0)"] 116 | doc = ["mkdocs (>=1.1.2,<2.0.0)", "mkdocs-material (>=6.1.4,<7.0.0)", "markdown-include (>=0.5.1,<0.6.0)", "mkdocs-markdownextradata-plugin (>=0.1.7,<0.2.0)", "typer-cli (>=0.0.9,<0.0.10)", "pyyaml (>=5.3.1,<6.0.0)"] 117 | test = ["pytest (==5.4.3)", "pytest-cov (==2.10.0)", "pytest-asyncio (>=0.14.0,<0.15.0)", "mypy (==0.812)", "flake8 (>=3.8.3,<4.0.0)", "black (==20.8b1)", "isort (>=5.0.6,<6.0.0)", "requests (>=2.24.0,<3.0.0)", "httpx (>=0.14.0,<0.15.0)", "email_validator (>=1.1.1,<2.0.0)", "sqlalchemy (>=1.3.18,<1.4.0)", "peewee (>=3.13.3,<4.0.0)", "databases[sqlite] (>=0.3.2,<0.4.0)", "orjson (>=3.2.1,<4.0.0)", "ujson (>=4.0.1,<5.0.0)", "async_exit_stack (>=1.0.1,<2.0.0)", "async_generator (>=1.10,<2.0.0)", "python-multipart (>=0.0.5,<0.0.6)", "aiofiles (>=0.5.0,<0.6.0)", "flask (>=1.1.2,<2.0.0)"] 118 | 119 | [[package]] 120 | name = "flake8" 121 | version = "3.9.2" 122 | description = "the modular source code checker: pep8 pyflakes and co" 123 | category = "dev" 124 | optional = false 125 | python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*,>=2.7" 126 | 127 | [package.dependencies] 128 | mccabe = ">=0.6.0,<0.7.0" 129 | pycodestyle = ">=2.7.0,<2.8.0" 130 | pyflakes = ">=2.3.0,<2.4.0" 131 | 132 | [[package]] 133 | name = "h11" 134 | version = "0.12.0" 135 | description = "A pure-Python, bring-your-own-I/O implementation of HTTP/1.1" 136 | category = "main" 137 | optional = false 138 | python-versions = ">=3.6" 139 | 140 | [[package]] 141 | name = "h2" 142 | version = "4.0.0" 143 | description = "HTTP/2 State-Machine based protocol implementation" 144 | category = "main" 145 | optional = false 146 | python-versions = ">=3.6.1" 147 | 148 | [package.dependencies] 149 | hpack = ">=4.0,<5" 150 | hyperframe = ">=6.0,<7" 151 | 152 | [[package]] 153 | name = "hpack" 154 | version = "4.0.0" 155 | description = "Pure-Python HPACK header compression" 156 | category = "main" 157 | optional = false 158 | python-versions = ">=3.6.1" 159 | 160 | [[package]] 161 | name = "hypercorn" 162 | version = "0.11.2" 163 | description = "A ASGI Server based on Hyper libraries and inspired by Gunicorn." 164 | category = "main" 165 | optional = false 166 | python-versions = ">=3.7" 167 | 168 | [package.dependencies] 169 | h11 = "*" 170 | h2 = ">=3.1.0" 171 | priority = "*" 172 | toml = "*" 173 | wsproto = ">=0.14.0" 174 | 175 | [package.extras] 176 | h3 = ["aioquic (>=0.9.0,<1.0)"] 177 | tests = ["hypothesis", "mock", "pytest", "pytest-asyncio", "pytest-cov", "pytest-trio", "trio"] 178 | trio = ["trio (>=0.11.0)"] 179 | uvloop = ["uvloop"] 180 | 181 | [[package]] 182 | name = "hyperframe" 183 | version = "6.0.1" 184 | description = "HTTP/2 framing layer for Python" 185 | category = "main" 186 | optional = false 187 | python-versions = ">=3.6.1" 188 | 189 | [[package]] 190 | name = "inflection" 191 | version = "0.5.1" 192 | description = "A port of Ruby on Rails inflector to Python" 193 | category = "main" 194 | optional = false 195 | python-versions = ">=3.5" 196 | 197 | [[package]] 198 | name = "jinja2" 199 | version = "3.0.1" 200 | description = "A very fast and expressive template engine." 201 | category = "main" 202 | optional = false 203 | python-versions = ">=3.6" 204 | 205 | [package.dependencies] 206 | MarkupSafe = ">=2.0" 207 | 208 | [package.extras] 209 | i18n = ["Babel (>=2.7)"] 210 | 211 | [[package]] 212 | name = "markupsafe" 213 | version = "2.0.1" 214 | description = "Safely add untrusted strings to HTML/XML markup." 215 | category = "main" 216 | optional = false 217 | python-versions = ">=3.6" 218 | 219 | [[package]] 220 | name = "mccabe" 221 | version = "0.6.1" 222 | description = "McCabe checker, plugin for flake8" 223 | category = "dev" 224 | optional = false 225 | python-versions = "*" 226 | 227 | [[package]] 228 | name = "mypy-extensions" 229 | version = "0.4.3" 230 | description = "Experimental type system extensions for programs checked with the mypy typechecker." 231 | category = "main" 232 | optional = false 233 | python-versions = "*" 234 | 235 | [[package]] 236 | name = "pathspec" 237 | version = "0.8.1" 238 | description = "Utility library for gitignore style pattern matching of file paths." 239 | category = "main" 240 | optional = false 241 | python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*" 242 | 243 | [[package]] 244 | name = "piccolo" 245 | version = "0.21.1" 246 | description = "A fast, user friendly ORM and query builder which supports asyncio." 247 | category = "main" 248 | optional = false 249 | python-versions = ">=3.7.0" 250 | 251 | [package.dependencies] 252 | aiosqlite = ">=0.16.0" 253 | asyncpg = ">=0.21.0" 254 | black = "*" 255 | colorama = ">=0.4.0" 256 | inflection = ">=0.5.1" 257 | Jinja2 = ">=2.11.0" 258 | targ = ">=0.3.3" 259 | 260 | [package.extras] 261 | orjson = ["orjson (==3.4.1)"] 262 | playground = ["ipython"] 263 | 264 | [[package]] 265 | name = "piccolo-admin" 266 | version = "0.13.2" 267 | description = "A simple and powerful admin for Piccolo models, using ASGI." 268 | category = "main" 269 | optional = false 270 | python-versions = ">=3.7.0" 271 | 272 | [package.dependencies] 273 | aiofiles = ">=0.5.0" 274 | fastapi = ">=0.62.0" 275 | Hypercorn = "*" 276 | piccolo = ">=0.20.0" 277 | piccolo-api = ">=0.15.0" 278 | targ = ">=0.1.9" 279 | uvicorn = "*" 280 | 281 | [package.extras] 282 | faker = ["faker (==6.5.0)"] 283 | 284 | [[package]] 285 | name = "piccolo-api" 286 | version = "0.15.0" 287 | description = "Utilities for using the Piccolo ORM in ASGI apps, plus essential ASGI middleware." 288 | category = "main" 289 | optional = false 290 | python-versions = ">=3.7.0" 291 | 292 | [package.dependencies] 293 | fastapi = ">=0.58.0" 294 | Jinja2 = ">=2.11.0" 295 | piccolo = ">=0.20.0" 296 | pydantic = ">=1.6" 297 | PyJWT = ">=1.7.1" 298 | python-multipart = ">=0.0.5" 299 | 300 | [[package]] 301 | name = "priority" 302 | version = "1.3.0" 303 | description = "A pure-Python implementation of the HTTP/2 priority tree" 304 | category = "main" 305 | optional = false 306 | python-versions = "*" 307 | 308 | [[package]] 309 | name = "pycodestyle" 310 | version = "2.7.0" 311 | description = "Python style guide checker" 312 | category = "dev" 313 | optional = false 314 | python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" 315 | 316 | [[package]] 317 | name = "pydantic" 318 | version = "1.8.2" 319 | description = "Data validation and settings management using python 3.6 type hinting" 320 | category = "main" 321 | optional = false 322 | python-versions = ">=3.6.1" 323 | 324 | [package.dependencies] 325 | typing-extensions = ">=3.7.4.3" 326 | 327 | [package.extras] 328 | dotenv = ["python-dotenv (>=0.10.4)"] 329 | email = ["email-validator (>=1.0.3)"] 330 | 331 | [[package]] 332 | name = "pyflakes" 333 | version = "2.3.1" 334 | description = "passive checker of Python programs" 335 | category = "dev" 336 | optional = false 337 | python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" 338 | 339 | [[package]] 340 | name = "pyjwt" 341 | version = "2.1.0" 342 | description = "JSON Web Token implementation in Python" 343 | category = "main" 344 | optional = false 345 | python-versions = ">=3.6" 346 | 347 | [package.extras] 348 | crypto = ["cryptography (>=3.3.1,<4.0.0)"] 349 | dev = ["sphinx", "sphinx-rtd-theme", "zope.interface", "cryptography (>=3.3.1,<4.0.0)", "pytest (>=6.0.0,<7.0.0)", "coverage[toml] (==5.0.4)", "mypy", "pre-commit"] 350 | docs = ["sphinx", "sphinx-rtd-theme", "zope.interface"] 351 | tests = ["pytest (>=6.0.0,<7.0.0)", "coverage[toml] (==5.0.4)"] 352 | 353 | [[package]] 354 | name = "python-dotenv" 355 | version = "0.18.0" 356 | description = "Read key-value pairs from a .env file and set them as environment variables" 357 | category = "main" 358 | optional = false 359 | python-versions = "*" 360 | 361 | [package.extras] 362 | cli = ["click (>=5.0)"] 363 | 364 | [[package]] 365 | name = "python-multipart" 366 | version = "0.0.5" 367 | description = "A streaming multipart parser for Python" 368 | category = "main" 369 | optional = false 370 | python-versions = "*" 371 | 372 | [package.dependencies] 373 | six = ">=1.4.0" 374 | 375 | [[package]] 376 | name = "regex" 377 | version = "2021.4.4" 378 | description = "Alternative regular expression module, to replace re." 379 | category = "main" 380 | optional = false 381 | python-versions = "*" 382 | 383 | [[package]] 384 | name = "rope" 385 | version = "0.19.0" 386 | description = "a python refactoring library..." 387 | category = "dev" 388 | optional = false 389 | python-versions = "*" 390 | 391 | [package.extras] 392 | dev = ["pytest"] 393 | 394 | [[package]] 395 | name = "six" 396 | version = "1.16.0" 397 | description = "Python 2 and 3 compatibility utilities" 398 | category = "main" 399 | optional = false 400 | python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*" 401 | 402 | [[package]] 403 | name = "starlette" 404 | version = "0.14.2" 405 | description = "The little ASGI library that shines." 406 | category = "main" 407 | optional = false 408 | python-versions = ">=3.6" 409 | 410 | [package.extras] 411 | full = ["aiofiles", "graphene", "itsdangerous", "jinja2", "python-multipart", "pyyaml", "requests"] 412 | 413 | [[package]] 414 | name = "targ" 415 | version = "0.3.3" 416 | description = "Build a Python CLI for your app, just using type hints and docstrings." 417 | category = "main" 418 | optional = false 419 | python-versions = ">=3.7.0" 420 | 421 | [package.dependencies] 422 | colorama = ">=0.4.0,<0.5.0" 423 | docstring-parser = "0.7.1" 424 | 425 | [[package]] 426 | name = "toml" 427 | version = "0.10.2" 428 | description = "Python Library for Tom's Obvious, Minimal Language" 429 | category = "main" 430 | optional = false 431 | python-versions = ">=2.6, !=3.0.*, !=3.1.*, !=3.2.*" 432 | 433 | [[package]] 434 | name = "typing-extensions" 435 | version = "3.10.0.0" 436 | description = "Backported and Experimental Type Hints for Python 3.5+" 437 | category = "main" 438 | optional = false 439 | python-versions = "*" 440 | 441 | [[package]] 442 | name = "uvicorn" 443 | version = "0.14.0" 444 | description = "The lightning-fast ASGI server." 445 | category = "main" 446 | optional = false 447 | python-versions = "*" 448 | 449 | [package.dependencies] 450 | asgiref = ">=3.3.4" 451 | click = ">=7" 452 | h11 = ">=0.8" 453 | 454 | [package.extras] 455 | standard = ["websockets (>=9.1)", "httptools (>=0.2.0,<0.3.0)", "watchgod (>=0.6)", "python-dotenv (>=0.13)", "PyYAML (>=5.1)", "uvloop (>=0.14.0,!=0.15.0,!=0.15.1)", "colorama (>=0.4)"] 456 | 457 | [[package]] 458 | name = "wsproto" 459 | version = "1.0.0" 460 | description = "WebSockets state-machine based protocol implementation" 461 | category = "main" 462 | optional = false 463 | python-versions = ">=3.6.1" 464 | 465 | [package.dependencies] 466 | h11 = ">=0.9.0,<1" 467 | 468 | [metadata] 469 | lock-version = "1.1" 470 | python-versions = "^3.9" 471 | content-hash = "2d101cac70f737eea4459240bddca3c4d9c19e34d49cd3058c4312f0931f6de6" 472 | 473 | [metadata.files] 474 | aiofiles = [ 475 | {file = "aiofiles-0.7.0-py3-none-any.whl", hash = "sha256:c67a6823b5f23fcab0a2595a289cec7d8c863ffcb4322fb8cd6b90400aedfdbc"}, 476 | {file = "aiofiles-0.7.0.tar.gz", hash = "sha256:a1c4fc9b2ff81568c83e21392a82f344ea9d23da906e4f6a52662764545e19d4"}, 477 | ] 478 | aiosqlite = [ 479 | {file = "aiosqlite-0.17.0-py3-none-any.whl", hash = "sha256:6c49dc6d3405929b1d08eeccc72306d3677503cc5e5e43771efc1e00232e8231"}, 480 | {file = "aiosqlite-0.17.0.tar.gz", hash = "sha256:f0e6acc24bc4864149267ac82fb46dfb3be4455f99fe21df82609cc6e6baee51"}, 481 | ] 482 | appdirs = [ 483 | {file = "appdirs-1.4.4-py2.py3-none-any.whl", hash = "sha256:a841dacd6b99318a741b166adb07e19ee71a274450e68237b4650ca1055ab128"}, 484 | {file = "appdirs-1.4.4.tar.gz", hash = "sha256:7d5d0167b2b1ba821647616af46a749d1c653740dd0d2415100fe26e27afdf41"}, 485 | ] 486 | asgiref = [ 487 | {file = "asgiref-3.3.4-py3-none-any.whl", hash = "sha256:92906c611ce6c967347bbfea733f13d6313901d54dcca88195eaeb52b2a8e8ee"}, 488 | {file = "asgiref-3.3.4.tar.gz", hash = "sha256:d1216dfbdfb63826470995d31caed36225dcaf34f182e0fa257a4dd9e86f1b78"}, 489 | ] 490 | asyncpg = [ 491 | {file = "asyncpg-0.23.0-cp35-cp35m-macosx_10_14_x86_64.whl", hash = "sha256:f86378bbfbec7334af03bad4d5fd432149286665ecc8bfbcb7135da56b15d34b"}, 492 | {file = "asyncpg-0.23.0-cp35-cp35m-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:255839c8c52ebd72d6d0159564d7eb8f70fcf6cc9ce7cdc7e98328fd3279bf52"}, 493 | {file = "asyncpg-0.23.0-cp36-cp36m-macosx_10_14_x86_64.whl", hash = "sha256:11102ac2febbc208427f39e4555537ecf188bd70ef7b285fc92c6c16b748b4c6"}, 494 | {file = "asyncpg-0.23.0-cp36-cp36m-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:d82d94badd34c8adbc5c85b85085317444cd9e062fc8b956221b34ba4c823b56"}, 495 | {file = "asyncpg-0.23.0-cp36-cp36m-win_amd64.whl", hash = "sha256:a88654ede00596a7bdaa08066ff0505aed491f790621dcdb478066c7ddfd1a3d"}, 496 | {file = "asyncpg-0.23.0-cp37-cp37m-macosx_10_14_x86_64.whl", hash = "sha256:a2031df7573c80186339039cc2c4e684648fea5eaa9537c24f18c509bda2cd3f"}, 497 | {file = "asyncpg-0.23.0-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:2710b5740cbd572e0fddc20986a44707f05d3f84e29fab72abe87fb8c2fc6885"}, 498 | {file = "asyncpg-0.23.0-cp37-cp37m-win_amd64.whl", hash = "sha256:b784138e69752aaa905b60c5a07a891445706824358fe1440d47113db72c8946"}, 499 | {file = "asyncpg-0.23.0-cp38-cp38-macosx_10_14_x86_64.whl", hash = "sha256:a19429d480a387346ae74b38da20e8da004337f14e5066f4bd6a10a8bbe74d3c"}, 500 | {file = "asyncpg-0.23.0-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:43c44d323c3bd6514fbe6a892ccfdc551259bd92e98dd34ad1a52bad8c7974f3"}, 501 | {file = "asyncpg-0.23.0-cp38-cp38-win_amd64.whl", hash = "sha256:df84f3e93cd08cb31a252510a2e7be4bb15e6dff8a06d91f94c057a305d5d55d"}, 502 | {file = "asyncpg-0.23.0-cp39-cp39-macosx_10_14_x86_64.whl", hash = "sha256:98bef539326408da0c2ed0714432e4c79e345820697914318013588ff235b581"}, 503 | {file = "asyncpg-0.23.0-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:bd6e1f3db9889b5d987b6a1cab49c5b5070756290f3420a4c7a63d942d73ab69"}, 504 | {file = "asyncpg-0.23.0-cp39-cp39-win_amd64.whl", hash = "sha256:ceedd46f569f5efb8b4def3d1dd6a0d85e1a44722608d68aa1d2d0f8693c1bff"}, 505 | {file = "asyncpg-0.23.0.tar.gz", hash = "sha256:812dafa4c9e264d430adcc0f5899f0dc5413155a605088af696f952d72d36b5e"}, 506 | ] 507 | black = [ 508 | {file = "black-21.6b0-py3-none-any.whl", hash = "sha256:dfb8c5a069012b2ab1e972e7b908f5fb42b6bbabcba0a788b86dc05067c7d9c7"}, 509 | {file = "black-21.6b0.tar.gz", hash = "sha256:dc132348a88d103016726fe360cb9ede02cecf99b76e3660ce6c596be132ce04"}, 510 | ] 511 | click = [ 512 | {file = "click-8.0.1-py3-none-any.whl", hash = "sha256:fba402a4a47334742d782209a7c79bc448911afe1149d07bdabdf480b3e2f4b6"}, 513 | {file = "click-8.0.1.tar.gz", hash = "sha256:8c04c11192119b1ef78ea049e0a6f0463e4c48ef00a30160c704337586f3ad7a"}, 514 | ] 515 | colorama = [ 516 | {file = "colorama-0.4.4-py2.py3-none-any.whl", hash = "sha256:9f47eda37229f68eee03b24b9748937c7dc3868f906e8ba69fbcbdd3bc5dc3e2"}, 517 | {file = "colorama-0.4.4.tar.gz", hash = "sha256:5941b2b48a20143d2267e95b1c2a7603ce057ee39fd88e7329b0c292aa16869b"}, 518 | ] 519 | docstring-parser = [ 520 | {file = "docstring_parser-0.7.1.tar.gz", hash = "sha256:7f91d48ea2e4ad04a101f3aa24767f8475545acc93af1b3b14c617733d40c086"}, 521 | ] 522 | fastapi = [ 523 | {file = "fastapi-0.65.2-py3-none-any.whl", hash = "sha256:39569a18914075b2f1aaa03bcb9dc96a38e0e5dabaf3972e088c9077dfffa379"}, 524 | {file = "fastapi-0.65.2.tar.gz", hash = "sha256:8359e55d8412a5571c0736013d90af235d6949ec4ce978e9b63500c8f4b6f714"}, 525 | ] 526 | flake8 = [ 527 | {file = "flake8-3.9.2-py2.py3-none-any.whl", hash = "sha256:bf8fd333346d844f616e8d47905ef3a3384edae6b4e9beb0c5101e25e3110907"}, 528 | {file = "flake8-3.9.2.tar.gz", hash = "sha256:07528381786f2a6237b061f6e96610a4167b226cb926e2aa2b6b1d78057c576b"}, 529 | ] 530 | h11 = [ 531 | {file = "h11-0.12.0-py3-none-any.whl", hash = "sha256:36a3cb8c0a032f56e2da7084577878a035d3b61d104230d4bd49c0c6b555a9c6"}, 532 | {file = "h11-0.12.0.tar.gz", hash = "sha256:47222cb6067e4a307d535814917cd98fd0a57b6788ce715755fa2b6c28b56042"}, 533 | ] 534 | h2 = [ 535 | {file = "h2-4.0.0-py3-none-any.whl", hash = "sha256:ac9e293a1990b339d5d71b19c5fe630e3dd4d768c620d1730d355485323f1b25"}, 536 | {file = "h2-4.0.0.tar.gz", hash = "sha256:bb7ac7099dd67a857ed52c815a6192b6b1f5ba6b516237fc24a085341340593d"}, 537 | ] 538 | hpack = [ 539 | {file = "hpack-4.0.0-py3-none-any.whl", hash = "sha256:84a076fad3dc9a9f8063ccb8041ef100867b1878b25ef0ee63847a5d53818a6c"}, 540 | {file = "hpack-4.0.0.tar.gz", hash = "sha256:fc41de0c63e687ebffde81187a948221294896f6bdc0ae2312708df339430095"}, 541 | ] 542 | hypercorn = [ 543 | {file = "Hypercorn-0.11.2-py3-none-any.whl", hash = "sha256:8007c10f81566920f8ae12c0e26e146f94ca70506da964b5a727ad610aa1d821"}, 544 | {file = "Hypercorn-0.11.2.tar.gz", hash = "sha256:5ba1e719c521080abd698ff5781a2331e34ef50fc1c89a50960538115a896a9a"}, 545 | ] 546 | hyperframe = [ 547 | {file = "hyperframe-6.0.1-py3-none-any.whl", hash = "sha256:0ec6bafd80d8ad2195c4f03aacba3a8265e57bc4cff261e802bf39970ed02a15"}, 548 | {file = "hyperframe-6.0.1.tar.gz", hash = "sha256:ae510046231dc8e9ecb1a6586f63d2347bf4c8905914aa84ba585ae85f28a914"}, 549 | ] 550 | inflection = [ 551 | {file = "inflection-0.5.1-py2.py3-none-any.whl", hash = "sha256:f38b2b640938a4f35ade69ac3d053042959b62a0f1076a5bbaa1b9526605a8a2"}, 552 | {file = "inflection-0.5.1.tar.gz", hash = "sha256:1a29730d366e996aaacffb2f1f1cb9593dc38e2ddd30c91250c6dde09ea9b417"}, 553 | ] 554 | jinja2 = [ 555 | {file = "Jinja2-3.0.1-py3-none-any.whl", hash = "sha256:1f06f2da51e7b56b8f238affdd6b4e2c61e39598a378cc49345bc1bd42a978a4"}, 556 | {file = "Jinja2-3.0.1.tar.gz", hash = "sha256:703f484b47a6af502e743c9122595cc812b0271f661722403114f71a79d0f5a4"}, 557 | ] 558 | markupsafe = [ 559 | {file = "MarkupSafe-2.0.1-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:f9081981fe268bd86831e5c75f7de206ef275defcb82bc70740ae6dc507aee51"}, 560 | {file = "MarkupSafe-2.0.1-cp36-cp36m-manylinux1_i686.whl", hash = "sha256:0955295dd5eec6cb6cc2fe1698f4c6d84af2e92de33fbcac4111913cd100a6ff"}, 561 | {file = "MarkupSafe-2.0.1-cp36-cp36m-manylinux1_x86_64.whl", hash = "sha256:0446679737af14f45767963a1a9ef7620189912317d095f2d9ffa183a4d25d2b"}, 562 | {file = "MarkupSafe-2.0.1-cp36-cp36m-manylinux2010_i686.whl", hash = "sha256:f826e31d18b516f653fe296d967d700fddad5901ae07c622bb3705955e1faa94"}, 563 | {file = "MarkupSafe-2.0.1-cp36-cp36m-manylinux2010_x86_64.whl", hash = "sha256:fa130dd50c57d53368c9d59395cb5526eda596d3ffe36666cd81a44d56e48872"}, 564 | {file = "MarkupSafe-2.0.1-cp36-cp36m-manylinux2014_aarch64.whl", hash = "sha256:905fec760bd2fa1388bb5b489ee8ee5f7291d692638ea5f67982d968366bef9f"}, 565 | {file = "MarkupSafe-2.0.1-cp36-cp36m-win32.whl", hash = "sha256:6c4ca60fa24e85fe25b912b01e62cb969d69a23a5d5867682dd3e80b5b02581d"}, 566 | {file = "MarkupSafe-2.0.1-cp36-cp36m-win_amd64.whl", hash = "sha256:b2f4bf27480f5e5e8ce285a8c8fd176c0b03e93dcc6646477d4630e83440c6a9"}, 567 | {file = "MarkupSafe-2.0.1-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:0717a7390a68be14b8c793ba258e075c6f4ca819f15edfc2a3a027c823718567"}, 568 | {file = "MarkupSafe-2.0.1-cp37-cp37m-manylinux1_i686.whl", hash = "sha256:6557b31b5e2c9ddf0de32a691f2312a32f77cd7681d8af66c2692efdbef84c18"}, 569 | {file = "MarkupSafe-2.0.1-cp37-cp37m-manylinux1_x86_64.whl", hash = "sha256:49e3ceeabbfb9d66c3aef5af3a60cc43b85c33df25ce03d0031a608b0a8b2e3f"}, 570 | {file = "MarkupSafe-2.0.1-cp37-cp37m-manylinux2010_i686.whl", hash = "sha256:d7f9850398e85aba693bb640262d3611788b1f29a79f0c93c565694658f4071f"}, 571 | {file = "MarkupSafe-2.0.1-cp37-cp37m-manylinux2010_x86_64.whl", hash = "sha256:6a7fae0dd14cf60ad5ff42baa2e95727c3d81ded453457771d02b7d2b3f9c0c2"}, 572 | {file = "MarkupSafe-2.0.1-cp37-cp37m-manylinux2014_aarch64.whl", hash = "sha256:b7f2d075102dc8c794cbde1947378051c4e5180d52d276987b8d28a3bd58c17d"}, 573 | {file = "MarkupSafe-2.0.1-cp37-cp37m-win32.whl", hash = "sha256:a30e67a65b53ea0a5e62fe23682cfe22712e01f453b95233b25502f7c61cb415"}, 574 | {file = "MarkupSafe-2.0.1-cp37-cp37m-win_amd64.whl", hash = "sha256:611d1ad9a4288cf3e3c16014564df047fe08410e628f89805e475368bd304914"}, 575 | {file = "MarkupSafe-2.0.1-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:be98f628055368795d818ebf93da628541e10b75b41c559fdf36d104c5787066"}, 576 | {file = "MarkupSafe-2.0.1-cp38-cp38-manylinux1_i686.whl", hash = "sha256:1d609f577dc6e1aa17d746f8bd3c31aa4d258f4070d61b2aa5c4166c1539de35"}, 577 | {file = "MarkupSafe-2.0.1-cp38-cp38-manylinux1_x86_64.whl", hash = "sha256:7d91275b0245b1da4d4cfa07e0faedd5b0812efc15b702576d103293e252af1b"}, 578 | {file = "MarkupSafe-2.0.1-cp38-cp38-manylinux2010_i686.whl", hash = "sha256:01a9b8ea66f1658938f65b93a85ebe8bc016e6769611be228d797c9d998dd298"}, 579 | {file = "MarkupSafe-2.0.1-cp38-cp38-manylinux2010_x86_64.whl", hash = "sha256:47ab1e7b91c098ab893b828deafa1203de86d0bc6ab587b160f78fe6c4011f75"}, 580 | {file = "MarkupSafe-2.0.1-cp38-cp38-manylinux2014_aarch64.whl", hash = "sha256:97383d78eb34da7e1fa37dd273c20ad4320929af65d156e35a5e2d89566d9dfb"}, 581 | {file = "MarkupSafe-2.0.1-cp38-cp38-win32.whl", hash = "sha256:023cb26ec21ece8dc3907c0e8320058b2e0cb3c55cf9564da612bc325bed5e64"}, 582 | {file = "MarkupSafe-2.0.1-cp38-cp38-win_amd64.whl", hash = "sha256:984d76483eb32f1bcb536dc27e4ad56bba4baa70be32fa87152832cdd9db0833"}, 583 | {file = "MarkupSafe-2.0.1-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:2ef54abee730b502252bcdf31b10dacb0a416229b72c18b19e24a4509f273d26"}, 584 | {file = "MarkupSafe-2.0.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:3c112550557578c26af18a1ccc9e090bfe03832ae994343cfdacd287db6a6ae7"}, 585 | {file = "MarkupSafe-2.0.1-cp39-cp39-manylinux1_i686.whl", hash = "sha256:53edb4da6925ad13c07b6d26c2a852bd81e364f95301c66e930ab2aef5b5ddd8"}, 586 | {file = "MarkupSafe-2.0.1-cp39-cp39-manylinux1_x86_64.whl", hash = "sha256:f5653a225f31e113b152e56f154ccbe59eeb1c7487b39b9d9f9cdb58e6c79dc5"}, 587 | {file = "MarkupSafe-2.0.1-cp39-cp39-manylinux2010_i686.whl", hash = "sha256:4efca8f86c54b22348a5467704e3fec767b2db12fc39c6d963168ab1d3fc9135"}, 588 | {file = "MarkupSafe-2.0.1-cp39-cp39-manylinux2010_x86_64.whl", hash = "sha256:ab3ef638ace319fa26553db0624c4699e31a28bb2a835c5faca8f8acf6a5a902"}, 589 | {file = "MarkupSafe-2.0.1-cp39-cp39-manylinux2014_aarch64.whl", hash = "sha256:f8ba0e8349a38d3001fae7eadded3f6606f0da5d748ee53cc1dab1d6527b9509"}, 590 | {file = "MarkupSafe-2.0.1-cp39-cp39-win32.whl", hash = "sha256:10f82115e21dc0dfec9ab5c0223652f7197feb168c940f3ef61563fc2d6beb74"}, 591 | {file = "MarkupSafe-2.0.1-cp39-cp39-win_amd64.whl", hash = "sha256:693ce3f9e70a6cf7d2fb9e6c9d8b204b6b39897a2c4a1aa65728d5ac97dcc1d8"}, 592 | {file = "MarkupSafe-2.0.1.tar.gz", hash = "sha256:594c67807fb16238b30c44bdf74f36c02cdf22d1c8cda91ef8a0ed8dabf5620a"}, 593 | ] 594 | mccabe = [ 595 | {file = "mccabe-0.6.1-py2.py3-none-any.whl", hash = "sha256:ab8a6258860da4b6677da4bd2fe5dc2c659cff31b3ee4f7f5d64e79735b80d42"}, 596 | {file = "mccabe-0.6.1.tar.gz", hash = "sha256:dd8d182285a0fe56bace7f45b5e7d1a6ebcbf524e8f3bd87eb0f125271b8831f"}, 597 | ] 598 | mypy-extensions = [ 599 | {file = "mypy_extensions-0.4.3-py2.py3-none-any.whl", hash = "sha256:090fedd75945a69ae91ce1303b5824f428daf5a028d2f6ab8a299250a846f15d"}, 600 | {file = "mypy_extensions-0.4.3.tar.gz", hash = "sha256:2d82818f5bb3e369420cb3c4060a7970edba416647068eb4c5343488a6c604a8"}, 601 | ] 602 | pathspec = [ 603 | {file = "pathspec-0.8.1-py2.py3-none-any.whl", hash = "sha256:aa0cb481c4041bf52ffa7b0d8fa6cd3e88a2ca4879c533c9153882ee2556790d"}, 604 | {file = "pathspec-0.8.1.tar.gz", hash = "sha256:86379d6b86d75816baba717e64b1a3a3469deb93bb76d613c9ce79edc5cb68fd"}, 605 | ] 606 | piccolo = [ 607 | {file = "piccolo-0.21.1-py3-none-any.whl", hash = "sha256:12eb50e0720eefb649ba7be01ed6b05fea6767aeff08dc06ce085449667ebce2"}, 608 | {file = "piccolo-0.21.1.tar.gz", hash = "sha256:afe28453c87d44adc339665eed0a538e56c29de27a1d34a941eb16f482a05265"}, 609 | ] 610 | piccolo-admin = [ 611 | {file = "piccolo_admin-0.13.2-py3-none-any.whl", hash = "sha256:810c751bafa2e865f2b795fc7bbab5c24d7f20518e9b66e1aa0dde02d5ad64e1"}, 612 | {file = "piccolo_admin-0.13.2.tar.gz", hash = "sha256:d0675cbc3f3753a4fc6840e7353b5a3c1d5fd0dd109465cd9444882c9bddbdda"}, 613 | ] 614 | piccolo-api = [ 615 | {file = "piccolo_api-0.15.0-py3-none-any.whl", hash = "sha256:ed353935bf27870e35d9f3574424854af63db24fa7974c99a2016fc5f6606eb3"}, 616 | {file = "piccolo_api-0.15.0.tar.gz", hash = "sha256:322885d925ba57ddb64342865f0c3cc9e36d76f5979dfbd095c34a4a9e6ed7dc"}, 617 | ] 618 | priority = [ 619 | {file = "priority-1.3.0-py2.py3-none-any.whl", hash = "sha256:be4fcb94b5e37cdeb40af5533afe6dd603bd665fe9c8b3052610fc1001d5d1eb"}, 620 | {file = "priority-1.3.0.tar.gz", hash = "sha256:6bc1961a6d7fcacbfc337769f1a382c8e746566aaa365e78047abe9f66b2ffbe"}, 621 | ] 622 | pycodestyle = [ 623 | {file = "pycodestyle-2.7.0-py2.py3-none-any.whl", hash = "sha256:514f76d918fcc0b55c6680472f0a37970994e07bbb80725808c17089be302068"}, 624 | {file = "pycodestyle-2.7.0.tar.gz", hash = "sha256:c389c1d06bf7904078ca03399a4816f974a1d590090fecea0c63ec26ebaf1cef"}, 625 | ] 626 | pydantic = [ 627 | {file = "pydantic-1.8.2-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:05ddfd37c1720c392f4e0d43c484217b7521558302e7069ce8d318438d297739"}, 628 | {file = "pydantic-1.8.2-cp36-cp36m-manylinux1_i686.whl", hash = "sha256:a7c6002203fe2c5a1b5cbb141bb85060cbff88c2d78eccbc72d97eb7022c43e4"}, 629 | {file = "pydantic-1.8.2-cp36-cp36m-manylinux2014_i686.whl", hash = "sha256:589eb6cd6361e8ac341db97602eb7f354551482368a37f4fd086c0733548308e"}, 630 | {file = "pydantic-1.8.2-cp36-cp36m-manylinux2014_x86_64.whl", hash = "sha256:10e5622224245941efc193ad1d159887872776df7a8fd592ed746aa25d071840"}, 631 | {file = "pydantic-1.8.2-cp36-cp36m-win_amd64.whl", hash = "sha256:99a9fc39470010c45c161a1dc584997f1feb13f689ecf645f59bb4ba623e586b"}, 632 | {file = "pydantic-1.8.2-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:a83db7205f60c6a86f2c44a61791d993dff4b73135df1973ecd9eed5ea0bda20"}, 633 | {file = "pydantic-1.8.2-cp37-cp37m-manylinux1_i686.whl", hash = "sha256:41b542c0b3c42dc17da70554bc6f38cbc30d7066d2c2815a94499b5684582ecb"}, 634 | {file = "pydantic-1.8.2-cp37-cp37m-manylinux2014_i686.whl", hash = "sha256:ea5cb40a3b23b3265f6325727ddfc45141b08ed665458be8c6285e7b85bd73a1"}, 635 | {file = "pydantic-1.8.2-cp37-cp37m-manylinux2014_x86_64.whl", hash = "sha256:18b5ea242dd3e62dbf89b2b0ec9ba6c7b5abaf6af85b95a97b00279f65845a23"}, 636 | {file = "pydantic-1.8.2-cp37-cp37m-win_amd64.whl", hash = "sha256:234a6c19f1c14e25e362cb05c68afb7f183eb931dd3cd4605eafff055ebbf287"}, 637 | {file = "pydantic-1.8.2-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:021ea0e4133e8c824775a0cfe098677acf6fa5a3cbf9206a376eed3fc09302cd"}, 638 | {file = "pydantic-1.8.2-cp38-cp38-manylinux1_i686.whl", hash = "sha256:e710876437bc07bd414ff453ac8ec63d219e7690128d925c6e82889d674bb505"}, 639 | {file = "pydantic-1.8.2-cp38-cp38-manylinux2014_i686.whl", hash = "sha256:ac8eed4ca3bd3aadc58a13c2aa93cd8a884bcf21cb019f8cfecaae3b6ce3746e"}, 640 | {file = "pydantic-1.8.2-cp38-cp38-manylinux2014_x86_64.whl", hash = "sha256:4a03cbbe743e9c7247ceae6f0d8898f7a64bb65800a45cbdc52d65e370570820"}, 641 | {file = "pydantic-1.8.2-cp38-cp38-win_amd64.whl", hash = "sha256:8621559dcf5afacf0069ed194278f35c255dc1a1385c28b32dd6c110fd6531b3"}, 642 | {file = "pydantic-1.8.2-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:8b223557f9510cf0bfd8b01316bf6dd281cf41826607eada99662f5e4963f316"}, 643 | {file = "pydantic-1.8.2-cp39-cp39-manylinux1_i686.whl", hash = "sha256:244ad78eeb388a43b0c927e74d3af78008e944074b7d0f4f696ddd5b2af43c62"}, 644 | {file = "pydantic-1.8.2-cp39-cp39-manylinux2014_i686.whl", hash = "sha256:05ef5246a7ffd2ce12a619cbb29f3307b7c4509307b1b49f456657b43529dc6f"}, 645 | {file = "pydantic-1.8.2-cp39-cp39-manylinux2014_x86_64.whl", hash = "sha256:54cd5121383f4a461ff7644c7ca20c0419d58052db70d8791eacbbe31528916b"}, 646 | {file = "pydantic-1.8.2-cp39-cp39-win_amd64.whl", hash = "sha256:4be75bebf676a5f0f87937c6ddb061fa39cbea067240d98e298508c1bda6f3f3"}, 647 | {file = "pydantic-1.8.2-py3-none-any.whl", hash = "sha256:fec866a0b59f372b7e776f2d7308511784dace622e0992a0b59ea3ccee0ae833"}, 648 | {file = "pydantic-1.8.2.tar.gz", hash = "sha256:26464e57ccaafe72b7ad156fdaa4e9b9ef051f69e175dbbb463283000c05ab7b"}, 649 | ] 650 | pyflakes = [ 651 | {file = "pyflakes-2.3.1-py2.py3-none-any.whl", hash = "sha256:7893783d01b8a89811dd72d7dfd4d84ff098e5eed95cfa8905b22bbffe52efc3"}, 652 | {file = "pyflakes-2.3.1.tar.gz", hash = "sha256:f5bc8ecabc05bb9d291eb5203d6810b49040f6ff446a756326104746cc00c1db"}, 653 | ] 654 | pyjwt = [ 655 | {file = "PyJWT-2.1.0-py3-none-any.whl", hash = "sha256:934d73fbba91b0483d3857d1aff50e96b2a892384ee2c17417ed3203f173fca1"}, 656 | {file = "PyJWT-2.1.0.tar.gz", hash = "sha256:fba44e7898bbca160a2b2b501f492824fc8382485d3a6f11ba5d0c1937ce6130"}, 657 | ] 658 | python-dotenv = [ 659 | {file = "python-dotenv-0.18.0.tar.gz", hash = "sha256:effaac3c1e58d89b3ccb4d04a40dc7ad6e0275fda25fd75ae9d323e2465e202d"}, 660 | {file = "python_dotenv-0.18.0-py2.py3-none-any.whl", hash = "sha256:dd8fe852847f4fbfadabf6183ddd4c824a9651f02d51714fa075c95561959c7d"}, 661 | ] 662 | python-multipart = [ 663 | {file = "python-multipart-0.0.5.tar.gz", hash = "sha256:f7bb5f611fc600d15fa47b3974c8aa16e93724513b49b5f95c81e6624c83fa43"}, 664 | ] 665 | regex = [ 666 | {file = "regex-2021.4.4-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:619d71c59a78b84d7f18891fe914446d07edd48dc8328c8e149cbe0929b4e000"}, 667 | {file = "regex-2021.4.4-cp36-cp36m-manylinux1_i686.whl", hash = "sha256:47bf5bf60cf04d72bf6055ae5927a0bd9016096bf3d742fa50d9bf9f45aa0711"}, 668 | {file = "regex-2021.4.4-cp36-cp36m-manylinux1_x86_64.whl", hash = "sha256:281d2fd05555079448537fe108d79eb031b403dac622621c78944c235f3fcf11"}, 669 | {file = "regex-2021.4.4-cp36-cp36m-manylinux2010_i686.whl", hash = "sha256:bd28bc2e3a772acbb07787c6308e00d9626ff89e3bfcdebe87fa5afbfdedf968"}, 670 | {file = "regex-2021.4.4-cp36-cp36m-manylinux2010_x86_64.whl", hash = "sha256:7c2a1af393fcc09e898beba5dd59196edaa3116191cc7257f9224beaed3e1aa0"}, 671 | {file = "regex-2021.4.4-cp36-cp36m-manylinux2014_aarch64.whl", hash = "sha256:c38c71df845e2aabb7fb0b920d11a1b5ac8526005e533a8920aea97efb8ec6a4"}, 672 | {file = "regex-2021.4.4-cp36-cp36m-manylinux2014_i686.whl", hash = "sha256:96fcd1888ab4d03adfc9303a7b3c0bd78c5412b2bfbe76db5b56d9eae004907a"}, 673 | {file = "regex-2021.4.4-cp36-cp36m-manylinux2014_x86_64.whl", hash = "sha256:ade17eb5d643b7fead300a1641e9f45401c98eee23763e9ed66a43f92f20b4a7"}, 674 | {file = "regex-2021.4.4-cp36-cp36m-win32.whl", hash = "sha256:e8e5b509d5c2ff12f8418006d5a90e9436766133b564db0abaec92fd27fcee29"}, 675 | {file = "regex-2021.4.4-cp36-cp36m-win_amd64.whl", hash = "sha256:11d773d75fa650cd36f68d7ca936e3c7afaae41b863b8c387a22aaa78d3c5c79"}, 676 | {file = "regex-2021.4.4-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:d3029c340cfbb3ac0a71798100ccc13b97dddf373a4ae56b6a72cf70dfd53bc8"}, 677 | {file = "regex-2021.4.4-cp37-cp37m-manylinux1_i686.whl", hash = "sha256:18c071c3eb09c30a264879f0d310d37fe5d3a3111662438889ae2eb6fc570c31"}, 678 | {file = "regex-2021.4.4-cp37-cp37m-manylinux1_x86_64.whl", hash = "sha256:4c557a7b470908b1712fe27fb1ef20772b78079808c87d20a90d051660b1d69a"}, 679 | {file = "regex-2021.4.4-cp37-cp37m-manylinux2010_i686.whl", hash = "sha256:01afaf2ec48e196ba91b37451aa353cb7eda77efe518e481707e0515025f0cd5"}, 680 | {file = "regex-2021.4.4-cp37-cp37m-manylinux2010_x86_64.whl", hash = "sha256:3a9cd17e6e5c7eb328517969e0cb0c3d31fd329298dd0c04af99ebf42e904f82"}, 681 | {file = "regex-2021.4.4-cp37-cp37m-manylinux2014_aarch64.whl", hash = "sha256:90f11ff637fe8798933fb29f5ae1148c978cccb0452005bf4c69e13db951e765"}, 682 | {file = "regex-2021.4.4-cp37-cp37m-manylinux2014_i686.whl", hash = "sha256:919859aa909429fb5aa9cf8807f6045592c85ef56fdd30a9a3747e513db2536e"}, 683 | {file = "regex-2021.4.4-cp37-cp37m-manylinux2014_x86_64.whl", hash = "sha256:339456e7d8c06dd36a22e451d58ef72cef293112b559010db3d054d5560ef439"}, 684 | {file = "regex-2021.4.4-cp37-cp37m-win32.whl", hash = "sha256:67bdb9702427ceddc6ef3dc382455e90f785af4c13d495f9626861763ee13f9d"}, 685 | {file = "regex-2021.4.4-cp37-cp37m-win_amd64.whl", hash = "sha256:32e65442138b7b76dd8173ffa2cf67356b7bc1768851dded39a7a13bf9223da3"}, 686 | {file = "regex-2021.4.4-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:1e1c20e29358165242928c2de1482fb2cf4ea54a6a6dea2bd7a0e0d8ee321500"}, 687 | {file = "regex-2021.4.4-cp38-cp38-manylinux1_i686.whl", hash = "sha256:314d66636c494ed9c148a42731b3834496cc9a2c4251b1661e40936814542b14"}, 688 | {file = "regex-2021.4.4-cp38-cp38-manylinux1_x86_64.whl", hash = "sha256:6d1b01031dedf2503631d0903cb563743f397ccaf6607a5e3b19a3d76fc10480"}, 689 | {file = "regex-2021.4.4-cp38-cp38-manylinux2010_i686.whl", hash = "sha256:741a9647fcf2e45f3a1cf0e24f5e17febf3efe8d4ba1281dcc3aa0459ef424dc"}, 690 | {file = "regex-2021.4.4-cp38-cp38-manylinux2010_x86_64.whl", hash = "sha256:4c46e22a0933dd783467cf32b3516299fb98cfebd895817d685130cc50cd1093"}, 691 | {file = "regex-2021.4.4-cp38-cp38-manylinux2014_aarch64.whl", hash = "sha256:e512d8ef5ad7b898cdb2d8ee1cb09a8339e4f8be706d27eaa180c2f177248a10"}, 692 | {file = "regex-2021.4.4-cp38-cp38-manylinux2014_i686.whl", hash = "sha256:980d7be47c84979d9136328d882f67ec5e50008681d94ecc8afa8a65ed1f4a6f"}, 693 | {file = "regex-2021.4.4-cp38-cp38-manylinux2014_x86_64.whl", hash = "sha256:ce15b6d103daff8e9fee13cf7f0add05245a05d866e73926c358e871221eae87"}, 694 | {file = "regex-2021.4.4-cp38-cp38-win32.whl", hash = "sha256:a91aa8619b23b79bcbeb37abe286f2f408d2f2d6f29a17237afda55bb54e7aac"}, 695 | {file = "regex-2021.4.4-cp38-cp38-win_amd64.whl", hash = "sha256:c0502c0fadef0d23b128605d69b58edb2c681c25d44574fc673b0e52dce71ee2"}, 696 | {file = "regex-2021.4.4-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:598585c9f0af8374c28edd609eb291b5726d7cbce16be6a8b95aa074d252ee17"}, 697 | {file = "regex-2021.4.4-cp39-cp39-manylinux1_i686.whl", hash = "sha256:ee54ff27bf0afaf4c3b3a62bcd016c12c3fdb4ec4f413391a90bd38bc3624605"}, 698 | {file = "regex-2021.4.4-cp39-cp39-manylinux1_x86_64.whl", hash = "sha256:7d9884d86dd4dd489e981d94a65cd30d6f07203d90e98f6f657f05170f6324c9"}, 699 | {file = "regex-2021.4.4-cp39-cp39-manylinux2010_i686.whl", hash = "sha256:bf5824bfac591ddb2c1f0a5f4ab72da28994548c708d2191e3b87dd207eb3ad7"}, 700 | {file = "regex-2021.4.4-cp39-cp39-manylinux2010_x86_64.whl", hash = "sha256:563085e55b0d4fb8f746f6a335893bda5c2cef43b2f0258fe1020ab1dd874df8"}, 701 | {file = "regex-2021.4.4-cp39-cp39-manylinux2014_aarch64.whl", hash = "sha256:b9c3db21af35e3b3c05764461b262d6f05bbca08a71a7849fd79d47ba7bc33ed"}, 702 | {file = "regex-2021.4.4-cp39-cp39-manylinux2014_i686.whl", hash = "sha256:3916d08be28a1149fb97f7728fca1f7c15d309a9f9682d89d79db75d5e52091c"}, 703 | {file = "regex-2021.4.4-cp39-cp39-manylinux2014_x86_64.whl", hash = "sha256:fd45ff9293d9274c5008a2054ecef86a9bfe819a67c7be1afb65e69b405b3042"}, 704 | {file = "regex-2021.4.4-cp39-cp39-win32.whl", hash = "sha256:fa4537fb4a98fe8fde99626e4681cc644bdcf2a795038533f9f711513a862ae6"}, 705 | {file = "regex-2021.4.4-cp39-cp39-win_amd64.whl", hash = "sha256:97f29f57d5b84e73fbaf99ab3e26134e6687348e95ef6b48cfd2c06807005a07"}, 706 | {file = "regex-2021.4.4.tar.gz", hash = "sha256:52ba3d3f9b942c49d7e4bc105bb28551c44065f139a65062ab7912bef10c9afb"}, 707 | ] 708 | rope = [ 709 | {file = "rope-0.19.0.tar.gz", hash = "sha256:64e6d747532e1f5c8009ec5aae3e5523a5bcedf516f39a750d57d8ed749d90da"}, 710 | ] 711 | six = [ 712 | {file = "six-1.16.0-py2.py3-none-any.whl", hash = "sha256:8abb2f1d86890a2dfb989f9a77cfcfd3e47c2a354b01111771326f8aa26e0254"}, 713 | {file = "six-1.16.0.tar.gz", hash = "sha256:1e61c37477a1626458e36f7b1d82aa5c9b094fa4802892072e49de9c60c4c926"}, 714 | ] 715 | starlette = [ 716 | {file = "starlette-0.14.2-py3-none-any.whl", hash = "sha256:3c8e48e52736b3161e34c9f0e8153b4f32ec5d8995a3ee1d59410d92f75162ed"}, 717 | {file = "starlette-0.14.2.tar.gz", hash = "sha256:7d49f4a27f8742262ef1470608c59ddbc66baf37c148e938c7038e6bc7a998aa"}, 718 | ] 719 | targ = [ 720 | {file = "targ-0.3.3-py3-none-any.whl", hash = "sha256:21bf34aae53d913f84193a780034abf0f033d3c03941a233d2be7dacd58cff91"}, 721 | {file = "targ-0.3.3.tar.gz", hash = "sha256:ae89237e9aee3d36f837b680c1bc8ff2c499e47ad7d0ba299a0ad9cb72b804e8"}, 722 | ] 723 | toml = [ 724 | {file = "toml-0.10.2-py2.py3-none-any.whl", hash = "sha256:806143ae5bfb6a3c6e736a764057db0e6a0e05e338b5630894a5f779cabb4f9b"}, 725 | {file = "toml-0.10.2.tar.gz", hash = "sha256:b3bda1d108d5dd99f4a20d24d9c348e91c4db7ab1b749200bded2f839ccbe68f"}, 726 | ] 727 | typing-extensions = [ 728 | {file = "typing_extensions-3.10.0.0-py2-none-any.whl", hash = "sha256:0ac0f89795dd19de6b97debb0c6af1c70987fd80a2d62d1958f7e56fcc31b497"}, 729 | {file = "typing_extensions-3.10.0.0-py3-none-any.whl", hash = "sha256:779383f6086d90c99ae41cf0ff39aac8a7937a9283ce0a414e5dd782f4c94a84"}, 730 | {file = "typing_extensions-3.10.0.0.tar.gz", hash = "sha256:50b6f157849174217d0656f99dc82fe932884fb250826c18350e159ec6cdf342"}, 731 | ] 732 | uvicorn = [ 733 | {file = "uvicorn-0.14.0-py3-none-any.whl", hash = "sha256:2a76bb359171a504b3d1c853409af3adbfa5cef374a4a59e5881945a97a93eae"}, 734 | {file = "uvicorn-0.14.0.tar.gz", hash = "sha256:45ad7dfaaa7d55cab4cd1e85e03f27e9d60bc067ddc59db52a2b0aeca8870292"}, 735 | ] 736 | wsproto = [ 737 | {file = "wsproto-1.0.0-py3-none-any.whl", hash = "sha256:d8345d1808dd599b5ffb352c25a367adb6157e664e140dbecba3f9bc007edb9f"}, 738 | {file = "wsproto-1.0.0.tar.gz", hash = "sha256:868776f8456997ad0d9720f7322b746bbe9193751b5b290b7f924659377c8c38"}, 739 | ] 740 | -------------------------------------------------------------------------------- /piccolo-fastapi/product/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/heliumbrain/fastapi-piccolo/895f55790d05782a1bd7d042b305fd8343c47d62/piccolo-fastapi/product/__init__.py -------------------------------------------------------------------------------- /piccolo-fastapi/product/models.py: -------------------------------------------------------------------------------- 1 | from pydantic import BaseModel 2 | 3 | """ 4 | Pydantic model used for validation of the request data in 5 | POST:/products endpoint 6 | """ 7 | 8 | 9 | class PydanticProductIn(BaseModel): 10 | name: str 11 | quantity: int 12 | price: float 13 | 14 | 15 | """ 16 | Pydantic model defining the data Product data to be returned in the 17 | response of POST:/products and GET:/products 18 | """ 19 | 20 | 21 | class PydanticProductOut(BaseModel): 22 | id: int 23 | name: str 24 | quantity: int 25 | price: float 26 | -------------------------------------------------------------------------------- /piccolo-fastapi/product/piccolo_app.py: -------------------------------------------------------------------------------- 1 | """ 2 | Import all of the Tables subclasses in your app here, and register them with 3 | the APP_CONFIG. 4 | """ 5 | 6 | import os 7 | 8 | from piccolo.conf.apps import AppConfig 9 | 10 | from .tables import Product 11 | 12 | CURRENT_DIRECTORY = os.path.dirname(os.path.abspath(__file__)) 13 | 14 | 15 | APP_CONFIG = AppConfig( 16 | app_name="product", 17 | migrations_folder_path=os.path.join(CURRENT_DIRECTORY, "piccolo_migrations"), 18 | table_classes=[Product], 19 | migration_dependencies=[], 20 | commands=[], 21 | ) 22 | -------------------------------------------------------------------------------- /piccolo-fastapi/product/piccolo_migrations/2021-06-22T00-35-24.py: -------------------------------------------------------------------------------- 1 | from decimal import Decimal 2 | 3 | from piccolo.apps.migrations.auto import MigrationManager 4 | from piccolo.columns.base import OnDelete, OnUpdate 5 | from piccolo.columns.column_types import JSON, ForeignKey, Integer, Numeric, Varchar 6 | from piccolo.columns.indexes import IndexMethod 7 | from piccolo.table import Table 8 | 9 | 10 | class BaseUser(Table, tablename="piccolo_user"): 11 | pass 12 | 13 | 14 | ID = "2021-06-22T00:35:24" 15 | VERSION = "0.21.1" 16 | 17 | 18 | async def forwards(): 19 | manager = MigrationManager(migration_id=ID, app_name="product") 20 | 21 | manager.add_table("Product", tablename="product") 22 | 23 | manager.add_column( 24 | table_class_name="Product", 25 | tablename="product", 26 | column_name="name", 27 | column_class_name="Varchar", 28 | column_class=Varchar, 29 | params={ 30 | "length": 255, 31 | "default": "", 32 | "null": False, 33 | "primary": False, 34 | "key": False, 35 | "unique": False, 36 | "index": False, 37 | "index_method": IndexMethod.btree, 38 | "choices": None, 39 | }, 40 | ) 41 | 42 | manager.add_column( 43 | table_class_name="Product", 44 | tablename="product", 45 | column_name="quantity", 46 | column_class_name="Integer", 47 | column_class=Integer, 48 | params={ 49 | "default": 0, 50 | "null": False, 51 | "primary": False, 52 | "key": False, 53 | "unique": False, 54 | "index": False, 55 | "index_method": IndexMethod.btree, 56 | "choices": None, 57 | }, 58 | ) 59 | 60 | manager.add_column( 61 | table_class_name="Product", 62 | tablename="product", 63 | column_name="price", 64 | column_class_name="Numeric", 65 | column_class=Numeric, 66 | params={ 67 | "default": Decimal("0"), 68 | "digits": (5, 2), 69 | "null": False, 70 | "primary": False, 71 | "key": False, 72 | "unique": False, 73 | "index": False, 74 | "index_method": IndexMethod.btree, 75 | "choices": None, 76 | }, 77 | ) 78 | 79 | manager.add_column( 80 | table_class_name="Product", 81 | tablename="product", 82 | column_name="details", 83 | column_class_name="JSON", 84 | column_class=JSON, 85 | params={ 86 | "default": "{}", 87 | "null": False, 88 | "primary": False, 89 | "key": False, 90 | "unique": False, 91 | "index": False, 92 | "index_method": IndexMethod.btree, 93 | "choices": None, 94 | }, 95 | ) 96 | 97 | manager.add_column( 98 | table_class_name="Product", 99 | tablename="product", 100 | column_name="author", 101 | column_class_name="ForeignKey", 102 | column_class=ForeignKey, 103 | params={ 104 | "references": BaseUser, 105 | "on_delete": OnDelete.cascade, 106 | "on_update": OnUpdate.cascade, 107 | "default": None, 108 | "null": True, 109 | "primary": False, 110 | "key": False, 111 | "unique": False, 112 | "index": False, 113 | "index_method": IndexMethod.btree, 114 | "choices": None, 115 | }, 116 | ) 117 | 118 | return manager 119 | -------------------------------------------------------------------------------- /piccolo-fastapi/product/piccolo_migrations/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/heliumbrain/fastapi-piccolo/895f55790d05782a1bd7d042b305fd8343c47d62/piccolo-fastapi/product/piccolo_migrations/__init__.py -------------------------------------------------------------------------------- /piccolo-fastapi/product/routers.py: -------------------------------------------------------------------------------- 1 | from http.client import HTTPConnection 2 | from typing import List 3 | 4 | from fastapi.responses import JSONResponse 5 | from fastapi.routing import APIRouter 6 | from piccolo.apps.user.tables import BaseUser 7 | from piccolo_api.session_auth.middleware import SessionsAuthBackend 8 | from piccolo_api.session_auth.tables import SessionsBase 9 | from product import piccolo_app 10 | from starlette.authentication import AuthenticationError 11 | from starlette.middleware.authentication import AuthenticationMiddleware 12 | from starlette.requests import HTTPConnection 13 | 14 | from .models import PydanticProductIn, PydanticProductOut 15 | from .tables import Product 16 | 17 | # Create a product router that can later be included in FastAPI 18 | product_router = APIRouter() 19 | 20 | auth = AuthenticationMiddleware( 21 | piccolo_app, 22 | backend=SessionsAuthBackend( 23 | admin_only=True, 24 | cookie_name="id", 25 | auth_table=BaseUser, 26 | session_table=SessionsBase, 27 | active_only=False, 28 | superuser_only=False, 29 | ), 30 | ) 31 | 32 | """ 33 | Defining the routes for the product_router. 34 | Note that the decorator calls the product_router and not the FastAPI app directly 35 | """ 36 | 37 | 38 | @product_router.get("/products/", response_model=List[PydanticProductOut]) 39 | async def get_products(): 40 | return await Product.select().order_by(Product.id).run() 41 | 42 | 43 | @product_router.post("/products/", response_model=PydanticProductOut) 44 | async def create_product(product: PydanticProductIn, conn: HTTPConnection): 45 | try: 46 | await auth.backend.authenticate(conn) 47 | product = Product(**product.__dict__) 48 | await product.save().run() 49 | return PydanticProductOut(**product.__dict__) 50 | except AuthenticationError: 51 | return JSONResponse(status_code=401, content="401 - Unauthorized") 52 | 53 | 54 | ## TODO: Add routes for DELETE and PUT 55 | -------------------------------------------------------------------------------- /piccolo-fastapi/product/tables.py: -------------------------------------------------------------------------------- 1 | from typing import Dict 2 | 3 | from piccolo.apps.user.tables import BaseUser 4 | from piccolo.columns import JSON, ForeignKey, Integer, Numeric, Varchar 5 | from piccolo.table import Table 6 | 7 | 8 | class Product(Table): 9 | name: str = Varchar() 10 | quantity: int = Integer() 11 | price: int = Numeric(digits=(5, 2)) 12 | details: Dict = JSON() 13 | author: BaseUser = ForeignKey(references=BaseUser) 14 | -------------------------------------------------------------------------------- /piccolo-fastapi/pyproject.toml: -------------------------------------------------------------------------------- 1 | [tool.poetry] 2 | name = "piccolo-fastapi" 3 | version = "0.1.0" 4 | description = "An example project showcasing how to integrate Piccolo-ORM with a FastAPI application" 5 | authors = ["heliumbrain "] 6 | 7 | [tool.poetry.dependencies] 8 | python = "^3.9" 9 | piccolo = "^0.21.1" 10 | fastapi = "^0.65.2" 11 | uvicorn = "^0.14.0" 12 | Jinja2 = "^3.0.1" 13 | piccolo-admin = "^0.13.2" 14 | python-dotenv = "^0.18.0" 15 | pydantic = "^1.8.2" 16 | piccolo-api = "^0.15.0" 17 | 18 | [tool.poetry.dev-dependencies] 19 | rope = "^0.19.0" 20 | black = "^21.6b0" 21 | flake8 = "^3.9.2" 22 | 23 | [build-system] 24 | requires = ["poetry-core>=1.0.0"] 25 | build-backend = "poetry.core.masonry.api" 26 | -------------------------------------------------------------------------------- /piccolo-fastapi/requirements.txt: -------------------------------------------------------------------------------- 1 | aiofiles==0.7.0; python_version >= "3.6" and python_version < "4.0" and python_full_version >= "3.7.0" 2 | aiosqlite==0.17.0; python_version >= "3.6" and python_full_version >= "3.7.0" 3 | appdirs==1.4.4; python_full_version >= "3.7.0" 4 | asgiref==3.3.4; python_version >= "3.6" and python_full_version >= "3.7.0" 5 | asyncpg==0.23.0; python_full_version >= "3.7.0" 6 | black==21.6b0; python_full_version >= "3.6.2" 7 | click==8.0.1; python_version >= "3.6" and python_full_version >= "3.7.0" 8 | colorama==0.4.4; platform_system == "Windows" and python_version >= "3.6" and python_full_version >= "3.7.0" 9 | docstring-parser==0.7.1; python_version >= "3.6" and python_version < "4.0" and python_full_version >= "3.7.0" 10 | fastapi==0.65.2; python_version >= "3.6" 11 | h11==0.12.0; python_version >= "3.7" and python_full_version >= "3.7.0" 12 | h2==4.0.0; python_version >= "3.7" and python_full_version >= "3.7.0" 13 | hpack==4.0.0; python_version >= "3.7" and python_full_version >= "3.7.0" 14 | hypercorn==0.11.2; python_version >= "3.7" and python_full_version >= "3.7.0" 15 | hyperframe==6.0.1; python_version >= "3.7" and python_full_version >= "3.7.0" 16 | inflection==0.5.1; python_version >= "3.5" and python_full_version >= "3.7.0" 17 | jinja2==3.0.1; python_version >= "3.6" 18 | markupsafe==2.0.1; python_version >= "3.6" and python_full_version >= "3.7.0" 19 | mypy-extensions==0.4.3; python_full_version >= "3.7.0" 20 | pathspec==0.8.1; python_full_version >= "3.7.0" 21 | piccolo-admin==0.13.2; python_full_version >= "3.7.0" 22 | piccolo-api==0.15.0; python_full_version >= "3.7.0" 23 | piccolo==0.21.1; python_full_version >= "3.7.0" 24 | priority==1.3.0; python_version >= "3.7" and python_full_version >= "3.7.0" 25 | pydantic==1.8.2; python_full_version >= "3.6.1" 26 | pyjwt==2.1.0; python_version >= "3.6" and python_full_version >= "3.7.0" 27 | python-dotenv==0.18.0 28 | python-multipart==0.0.5; python_full_version >= "3.7.0" 29 | regex==2021.4.4; python_full_version >= "3.7.0" 30 | six==1.16.0; python_full_version >= "3.7.0" 31 | starlette==0.14.2; python_version >= "3.6" and python_full_version >= "3.7.0" 32 | targ==0.3.3; python_full_version >= "3.7.0" 33 | toml==0.10.2; python_version >= "3.7" and python_full_version >= "3.7.0" 34 | typing-extensions==3.10.0.0; python_full_version >= "3.7.0" and python_version >= "3.6" 35 | uvicorn==0.14.0 36 | wsproto==1.0.0; python_version >= "3.7" and python_full_version >= "3.7.0" 37 | -------------------------------------------------------------------------------- /sample.env: -------------------------------------------------------------------------------- 1 | # Used by piccolo-fastapi 2 | POSTGRES_USER=postgres 3 | POSTGRES_PASSWORD=postgres 4 | POSTGRES_DB=postgres 5 | POSTGRES_HOST=localhost 6 | POSTGRES_PORT=5432 7 | 8 | # Used by frontend 9 | API_BASE_PATH=http://localhost:8000/ --------------------------------------------------------------------------------