├── .deepsource.toml
├── .editorconfig
├── .github
├── PULL_REQUEST_TEMPLATE.md
└── workflows
│ ├── ci.yml
│ └── cron.yml
├── .gitignore
├── .nvmrc
├── .prettierignore
├── .prettierrc
├── .python-version
├── .vscode
└── settings.json
├── LICENSE
├── Makefile
├── README.md
├── assets
├── .gitkeep
└── gfi-logo-white.svg
├── bun.lockb
├── components
├── Banner.vue
├── Navbar.vue
├── RepoBox.vue
├── Sidebar.vue
└── SubscriptionForm.vue
├── composables
└── states.js
├── data
├── generated.sample.json
├── labels.json
├── repositories.toml
└── tags.sample.json
├── gfi
├── __init__.py
├── populate.py
└── test_data.py
├── layouts
└── default.vue
├── mypy.ini
├── nuxt.config.ts
├── package.json
├── pages
├── index.vue
└── language
│ └── [slug].vue
├── poetry.lock
├── public
├── android-chrome-192x192.png
├── android-chrome-512x512.png
├── apple-touch-icon.png
├── favicon-16x16.png
├── favicon-32x32.png
├── favicon.ico
├── gfi-logo-white.svg
├── icon.png
├── images
│ ├── icon.png
│ ├── mailchimp.jpg
│ └── meta.jpg
├── readme-logo.svg
├── site.webmanifest
└── social
│ ├── github.svg
│ ├── heart.svg
│ └── twitter.svg
├── pyproject.toml
├── sync.js
├── tailwind.config.js
├── tsconfig.json
└── vercel.json
/.deepsource.toml:
--------------------------------------------------------------------------------
1 | version = 1
2 |
3 | test_patterns = [
4 | 'gfi/test_*.py',
5 | ]
6 |
7 | [[analyzers]]
8 | name = 'python'
9 | enabled = true
10 |
11 | [analyzers.meta]
12 | max_line_length = 120
13 |
14 | [[analyzers]]
15 | name = "javascript"
16 | enabled = true
17 |
18 | [analyzers.meta]
19 | environment = [
20 | "nodejs",
21 | "jest",
22 | "browser"
23 | ]
24 | plugins = ["vue"]
25 |
26 | [[transformers]]
27 | name = 'black'
28 | enabled = true
29 |
30 | [[transformers]]
31 | name = 'prettier'
32 | enabled = true
33 |
34 | [[analyzers]]
35 | name = "secrets"
36 | enabled = true
37 |
--------------------------------------------------------------------------------
/.editorconfig:
--------------------------------------------------------------------------------
1 | root = true
2 |
3 | [*]
4 | indent_style = space
5 | indent_size = 2
6 | end_of_line = lf
7 | charset = utf-8
8 | trim_trailing_whitespace = true
9 | insert_final_newline = true
10 |
11 | # The JSON files contain newlines inconsistently
12 | [*.json]
13 | insert_final_newline = ignore
14 |
15 | # Minified JavaScript files shouldn't be changed
16 | [**.min.js]
17 | indent_style = ignore
18 | insert_final_newline = ignore
19 |
20 | [Makefile]
21 | indent_style = tab
22 |
23 | [*.py]
24 | indent_style = space
25 | indent_size = 4
26 |
27 | [*.md]
28 | trim_trailing_whitespace = false
29 |
--------------------------------------------------------------------------------
/.github/PULL_REQUEST_TEMPLATE.md:
--------------------------------------------------------------------------------
1 | #### ℹ️ Repository information
2 |
3 | **The repository has**:
4 |
5 | - [ ] At least three issues with the `good first issue` label.
6 | - [ ] At least 10 contributors.
7 | - [ ] Detailed setup instructions for the project.
8 | - [ ] CONTRIBUTING.md
9 | - [ ] Actively maintained.
10 |
--------------------------------------------------------------------------------
/.github/workflows/ci.yml:
--------------------------------------------------------------------------------
1 | name: CI
2 |
3 | on: [push]
4 |
5 | jobs:
6 | test:
7 | runs-on: ubuntu-latest
8 | steps:
9 | - name: Checkout repo
10 | uses: actions/checkout@v4
11 |
12 | - name: Set up Python 3.12
13 | uses: actions/setup-python@v5
14 | with:
15 | python-version: '3.12'
16 |
17 | - name: Install dependencies
18 | run: make pre-build
19 |
20 | - name: Run tests for data sanity
21 | run: make test
22 |
--------------------------------------------------------------------------------
/.github/workflows/cron.yml:
--------------------------------------------------------------------------------
1 | name: Cron
2 |
3 | on:
4 | schedule:
5 | - cron: '0 8 * * *'
6 | workflow_dispatch:
7 |
8 | jobs:
9 | deploy:
10 | runs-on: ubuntu-latest
11 | steps:
12 | - name: Checkout repo
13 | uses: actions/checkout@v4
14 |
15 | - name: Set up Python 3.12
16 | uses: actions/setup-python@v5
17 | with:
18 | python-version: '3.12'
19 |
20 | - name: Set up bun
21 | uses: oven-sh/setup-bun@v1
22 |
23 | - name: Install dependencies
24 | run: |
25 | make pre-build
26 | bun install
27 |
28 | - name: Populate the latest data
29 | run: make generate
30 | env:
31 | GH_ACCESS_TOKEN: ${{ secrets.GH_ACCESS_TOKEN }}
32 |
33 | - name: Sync data to the blob store
34 | run: bun sync up
35 | env:
36 | BLOB_READ_WRITE_TOKEN: ${{ secrets.BLOB_READ_WRITE_TOKEN }}
37 |
38 | - name: Trigger deployment
39 | uses: joelwmale/webhook-action@master
40 | with:
41 | url: ${{ secrets.DEPLOY_HOOK_URL }}
42 |
--------------------------------------------------------------------------------
/.gitignore:
--------------------------------------------------------------------------------
1 | # Nuxt dev/build outputs
2 | .output
3 | .data
4 | .nuxt
5 | .nitro
6 | .cache
7 | dist
8 |
9 | # Node dependencies
10 | node_modules
11 |
12 | # Logs
13 | logs
14 | *.log
15 |
16 | # Misc
17 | .DS_Store
18 | .fleet
19 | .idea
20 |
21 | # Local env files
22 | .env
23 | .env.*
24 | !.env.example
25 |
26 | __pycache__
27 |
28 | # Generated data files
29 | data/generated.json
30 | data/tags.json
31 | content/language/*.md
32 |
--------------------------------------------------------------------------------
/.nvmrc:
--------------------------------------------------------------------------------
1 | node 20.10.0
2 |
--------------------------------------------------------------------------------
/.prettierignore:
--------------------------------------------------------------------------------
1 | .nuxt
2 | pnpm-lock.yaml
3 | dist
4 | .output
5 | *.json
6 |
--------------------------------------------------------------------------------
/.prettierrc:
--------------------------------------------------------------------------------
1 | {
2 | "printWidth": 120,
3 | "tabWidth": 2,
4 | "singleQuote": true,
5 | "trailingComma": "none",
6 | "bracketSpacing": true,
7 | "semi": false
8 | }
9 |
--------------------------------------------------------------------------------
/.python-version:
--------------------------------------------------------------------------------
1 | 3.12
2 |
--------------------------------------------------------------------------------
/.vscode/settings.json:
--------------------------------------------------------------------------------
1 | {
2 | "python.formatting.provider": "black"
3 | }
4 |
--------------------------------------------------------------------------------
/LICENSE:
--------------------------------------------------------------------------------
1 | Copyright 2020 DeepSource Corp.
2 |
3 | Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:
4 |
5 | The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.
6 |
7 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
8 |
9 |
10 |
--------------------------------------------------------------------------------
/Makefile:
--------------------------------------------------------------------------------
1 | .ONESHELL:
2 | pre-build:
3 | pip install --upgrade poetry
4 | poetry install --no-root
5 |
6 | build:
7 | bun install
8 | bun generate
9 |
10 | generate:
11 | poetry run python gfi/populate.py
12 |
13 | generate-prod:
14 | bun install
15 | bun sync down
16 | bun generate
17 |
18 | test:
19 | poetry run python gfi/test_data.py
20 | poetry run mypy gfi/*.py
21 |
22 | format:
23 | poetry run ruff format .
24 | bunx prettier --write .
25 |
26 | .DEFAULT_GOAL := build
27 |
--------------------------------------------------------------------------------
/README.md:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 | Welcome! 👋🏼
9 |
10 | **Good First Issue** is an initiative to curate easy pickings from popular projects, so developers who've never contributed to open-source can get started quickly.
11 |
12 | Open-source maintainers are always looking to get more people involved, but new developers generally think it's challenging to become a contributor. We believe getting developers to fix super-easy issues removes the barrier for future contributions. This is why Good First Issue exists.
13 |
14 | ## Adding a new project
15 |
16 | You're welcome to add a new project in Good First Issue, and we encourage all projects — old and new, big and small.
17 |
18 | Follow these simple steps:
19 |
20 | - Our goal is to narrow down projects for new open-source contributors. To maintain the quality of projects in Good First Issue, please make sure your GitHub repository meets the following criteria:
21 |
22 | - It has at least three issues with the `good first issue` label. This label is already present on all repositories by default. If not, you can follow the steps [here](https://help.github.com/en/github/managing-your-work-on-github/applying-labels-to-issues-and-pull-requests).
23 |
24 | - It has at least 10 contributors.
25 |
26 | - It contains a README.md with detailed setup instructions for the project, and a CONTRIBUTING.md with guidelines for new contributors.
27 |
28 | - It is actively maintained.
29 |
30 | - Add your repository's path (in lexicographic order) in [data/repositories.toml](data/repositories.toml).
31 |
32 | - Create a new pull-request. Please add the link to the issues page of the repository in the PR description. Once the pull request is merged, the changes will be live on [goodfirstissue.dev](https://goodfirstissue.dev/).
33 |
34 | ## Setting up the project locally
35 |
36 | Good First Issue has two components — the front-end app built with Nuxt.js and a data population script written in Python.
37 |
38 | To contribute new features and changes to the website, you would want to run the app locally. Please follow these steps:
39 |
40 | 1. Clone the project locally. Make sure you have Python 3 and a recent version of Node.js installed on your computer.
41 |
42 | 2. Make a copy of the sample data files for your local app to use and rename them to the filename that the app expects. **This step is important, as the front-end app won't work without these data files.**
43 |
44 | ```bash
45 | $ cp data/generated.sample.json data/generated.json
46 | $ cp data/tags.sample.json data/tags.json
47 | ```
48 |
49 | 3. Build the front-end app and start the development server.
50 |
51 | ```bash
52 | $ bun install # install the dependencies
53 | $ bun dev # start the development server
54 | ```
55 |
56 | The app should open in your browser.
57 |
--------------------------------------------------------------------------------
/assets/.gitkeep:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/chriskthomas/good-first-issue/38424a9d9c68f19a567d2fddad0a1e850995c3c5/assets/.gitkeep
--------------------------------------------------------------------------------
/assets/gfi-logo-white.svg:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
--------------------------------------------------------------------------------
/bun.lockb:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/chriskthomas/good-first-issue/38424a9d9c68f19a567d2fddad0a1e850995c3c5/bun.lockb
--------------------------------------------------------------------------------
/components/Banner.vue:
--------------------------------------------------------------------------------
1 |
2 |
6 |
7 |
8 |
9 |
10 |
11 |
12 |
13 |
14 |
26 |
--------------------------------------------------------------------------------
/components/Navbar.vue:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 | /
9 | {{ activeTag.language }}
10 |
11 |
12 |
13 |
14 |
15 |
24 |
--------------------------------------------------------------------------------
/components/RepoBox.vue:
--------------------------------------------------------------------------------
1 |
2 |
11 |
12 |
32 |
33 | {{ repo.description }}
34 |
35 |
39 |
lang: {{ repo.language }}
40 |
stars: {{ repo.stars_display }}
41 |
42 | last activity: {{ lastModifiedDisplay }}
43 |
44 |
45 |
46 |
47 |
48 | #{{ issue.number }}
49 |
67 |
68 |
69 |
70 |
71 |
72 |
117 |
--------------------------------------------------------------------------------
/components/Sidebar.vue:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
About
5 |
6 | Good First Issue curates easy pickings from popular open-source projects, and helps you make your first
7 | contribution to open-source.
8 |
9 |
10 |
11 |
Browse by language
12 |
13 | {{ tag.language }}
23 | × {{ tag.count }}
30 |
31 |
32 |
44 |
45 |
60 |
61 |
62 |
63 |
68 |
80 |
--------------------------------------------------------------------------------
/components/SubscriptionForm.vue:
--------------------------------------------------------------------------------
1 |
2 |
21 |
22 |
--------------------------------------------------------------------------------
/composables/states.js:
--------------------------------------------------------------------------------
1 | export const useOpenRepoId = () => useState('openRepoId', () => null)
2 |
--------------------------------------------------------------------------------
/data/labels.json:
--------------------------------------------------------------------------------
1 | {
2 | "labels": ["good first issue", "good-first-issue"]
3 | }
4 |
--------------------------------------------------------------------------------
/data/repositories.toml:
--------------------------------------------------------------------------------
1 | repositories = [
2 | 'github.com/deepsourcelabs/good-first-issue',
3 | 'github.com/4paradigm/OpenMLDB',
4 | 'github.com/abpframework/abp',
5 | 'github.com/AcademySoftwareFoundation/openvdb',
6 | 'github.com/activecm/rita',
7 | 'github.com/AdityaMulgundkar/flutter_opencv',
8 | 'github.com/agershun/alasql',
9 | 'github.com/akiran/react-slick',
10 | 'github.com/akxcv/vuera',
11 | 'github.com/alexellis/arkade',
12 | 'github.com/alexfertel/rust-algorithms',
13 | 'github.com/alfasoftware/astra',
14 | 'github.com/alibaba/nacos',
15 | 'github.com/alibaba/Sentinel',
16 | 'github.com/allure-framework/allure2',
17 | 'github.com/ampproject/amphtml',
18 | 'github.com/AMU-Code-Squad/food-up',
19 | 'github.com/angular-ui/ui-grid',
20 | 'github.com/angular/components',
21 | 'github.com/ankidroid/Anki-Android',
22 | 'github.com/ansible/awx',
23 | 'github.com/AntennaPod/AntennaPod',
24 | 'github.com/apache/age',
25 | 'github.com/apache/apisix',
26 | 'github.com/apache/dubbo',
27 | 'github.com/apache/incubator-doris',
28 | 'github.com/apache/incubator-mxnet',
29 | 'github.com/apache/incubator-superset',
30 | 'github.com/apache/openwhisk',
31 | 'github.com/apache/shardingsphere',
32 | 'github.com/apache/skywalking',
33 | 'github.com/apache/trafficserver',
34 | 'github.com/apifytech/apify-js',
35 | 'github.com/apoclyps/reviews',
36 | 'github.com/apollographql/apollo-kotlin',
37 | 'github.com/apostrophecms/apostrophe',
38 | 'github.com/appbaseio/reactivesearch',
39 | 'github.com/appium/appium-desktop',
40 | 'github.com/appleseedhq/appleseed',
41 | 'github.com/appsmithorg/appsmith',
42 | 'github.com/appwrite/appwrite',
43 | 'github.com/arduino/arduino-cli',
44 | 'github.com/ArduPilot/ardupilot',
45 | 'github.com/argoproj/argo-cd',
46 | 'github.com/argoproj/argo',
47 | 'github.com/arguflow/arguflow',
48 | 'github.com/ARMmbed/mbedtls',
49 | 'github.com/Arsenic-ATG/Qt-calculator',
50 | 'github.com/artalar/reatom',
51 | 'github.com/arxiv-vanity/engrafo',
52 | 'github.com/AssemblyScript/assemblyscript',
53 | 'github.com/assertj/assertj-core',
54 | 'github.com/astropy/astropy',
55 | 'github.com/atlassian/react-beautiful-dnd',
56 | 'github.com/AtomicGameEngine/AtomicGameEngine',
57 | 'github.com/auroraeditor/auroraeditor',
58 | 'github.com/AutoFixture/AutoFixture',
59 | 'github.com/Automattic/wp-calypso',
60 | 'github.com/automl/auto-sklearn',
61 | 'github.com/Avaiga/taipy',
62 | 'github.com/aws-amplify/amplify-cli',
63 | 'github.com/aws-amplify/amplify-js',
64 | 'github.com/aws/amazon-vpc-cni-k8s',
65 | 'github.com/aws/aws-cdk',
66 | 'github.com/awslabs/s2n',
67 | 'github.com/awslabs/serverless-application-model',
68 | 'github.com/axel-download-accelerator/axel',
69 | 'github.com/Azure/mmlspark',
70 | 'github.com/babel/babel',
71 | 'github.com/badges/shields',
72 | 'github.com/ballercat/walt',
73 | 'github.com/ballerina-platform/ballerina-lang',
74 | 'github.com/bancodobrasil/stop-analyzing-api',
75 | 'github.com/bancodobrasil/stop-analyzing-embed',
76 | 'github.com/bastion-rs/bastion',
77 | 'github.com/bazelbuild/bazel',
78 | 'github.com/bbatsov/projectile',
79 | 'github.com/bcherny/json-schema-to-typescript',
80 | 'github.com/beautify-web/js-beautify',
81 | 'github.com/billimarie/prosecutor-database',
82 | 'github.com/biopython/biopython',
83 | 'github.com/bisq-network/bisq',
84 | 'github.com/bitcoin/bitcoin',
85 | 'github.com/bitwarden/clients',
86 | 'github.com/bitwarden/mobile',
87 | 'github.com/BlitzKraft/saythanks.io',
88 | 'github.com/blockstack/blockstack-browser',
89 | 'github.com/bmarvinb/react-trello-clone',
90 | 'github.com/boa-dev/boa',
91 | 'github.com/bokeh/bokeh',
92 | 'github.com/borgbackup/borg',
93 | 'github.com/bpmn-io/bpmn-js',
94 | 'github.com/brave/brave-browser',
95 | 'github.com/brianegan/flutter_architecture_samples',
96 | 'github.com/brigadecore/brigade',
97 | 'github.com/Brightify/Cuckoo',
98 | 'github.com/brndnmtthws/conky',
99 | 'github.com/btcpayserver/btcpayserver',
100 | 'github.com/buildbot/buildbot',
101 | 'github.com/buildpacks/pack',
102 | 'github.com/buzzfeed/sso',
103 | 'github.com/c410-f3r/oapth',
104 | 'github.com/CachetHQ/Cachet',
105 | 'github.com/cake-build/cake',
106 | 'github.com/cake-build/website',
107 | 'github.com/canonical/multipass',
108 | 'github.com/casey/just',
109 | 'github.com/catboost/catboost',
110 | 'github.com/ccrama/Slide',
111 | 'github.com/centerofci/mathesar',
112 | 'github.com/certbot/certbot',
113 | 'github.com/CesiumGS/cesium',
114 | 'github.com/chaos-mesh/chaos-mesh',
115 | 'github.com/chapel-lang/chapel',
116 | 'github.com/chatwoot/chatwoot',
117 | 'github.com/Chocobozzz/PeerTube',
118 | 'github.com/ckb-next/ckb-next',
119 | 'github.com/ckeditor/ckeditor4',
120 | 'github.com/clab/dynet',
121 | 'github.com/CleverRaven/Cataclysm-DDA',
122 | 'github.com/clojure-emacs/cider',
123 | 'github.com/cloudflare/wrangler',
124 | 'github.com/cobrateam/splinter',
125 | 'github.com/cockroachdb/cockroach',
126 | 'github.com/codenameone/CodenameOne',
127 | 'github.com/coder/coder',
128 | 'github.com/coder/code-server',
129 | 'github.com/coder/envbuilder',
130 | 'github.com/coder/modules',
131 | 'github.com/coder/terraform-provider-coder',
132 | 'github.com/collectd/collectd',
133 | 'github.com/commandlineparser/commandline',
134 | 'github.com/compas-dev/compas_fab',
135 | 'github.com/composer/composer',
136 | 'github.com/conan-io/conan',
137 | 'github.com/concourse/concourse',
138 | 'github.com/containers/libpod',
139 | 'github.com/containers/skopeo',
140 | 'github.com/continuedev/continue',
141 | 'github.com/conversejs/converse.js',
142 | 'github.com/coq/coq',
143 | 'github.com/corda/corda',
144 | 'github.com/cornellius-gp/gpytorch',
145 | 'github.com/CorsixTH/CorsixTH',
146 | 'github.com/cortexlabs/cortex',
147 | 'github.com/cosmos/cosmos-sdk',
148 | 'github.com/crate/crate',
149 | 'github.com/creativecommons/project_creativecommons.org',
150 | 'github.com/creativecommons/vocabulary',
151 | 'github.com/creativecommons/wp-plugin-creativecommons',
152 | 'github.com/crossbario/autobahn-python',
153 | 'github.com/crossoverJie/cim',
154 | 'github.com/crossplaneio/crossplane',
155 | 'github.com/cupy/cupy',
156 | 'github.com/cython/cython',
157 | 'github.com/cztomczak/cefpython',
158 | 'github.com/dabl/dabl',
159 | 'github.com/dabreegster/abstreet',
160 | 'github.com/dagster-io/dagster',
161 | 'github.com/dapr/dapr',
162 | 'github.com/darrenburns/ward',
163 | 'github.com/dask/dask-ml',
164 | 'github.com/dask/dask',
165 | 'github.com/datafuselabs/datafuse',
166 | 'github.com/db-migrate/node-db-migrate',
167 | 'github.com/dbeaver/dbeaver',
168 | 'github.com/dbidwell94/vanilact',
169 | 'github.com/denoland/deno',
170 | 'github.com/denysdovhan/spaceship-prompt',
171 | 'github.com/DesignSystemsOSS/eccentrictouch',
172 | 'github.com/developit/microbundle',
173 | 'github.com/diasurgical/devilutionX',
174 | 'github.com/diesel-rs/diesel',
175 | 'github.com/DiFronzo/blockchair',
176 | 'github.com/dis-moi/extension',
177 | 'github.com/django-import-export/django-import-export',
178 | 'github.com/djc/quinn',
179 | 'github.com/dmlc/gluon-nlp',
180 | 'github.com/dmlc/xgboost',
181 | 'github.com/doccano/doccano',
182 | 'github.com/docker-slim/docker-slim',
183 | 'github.com/Dolibarr/dolibarr',
184 | 'github.com/dotenv-linter/dotenv-linter',
185 | 'github.com/dotfiles/dotfiles.github.com',
186 | 'github.com/dotnet/aspnetcore',
187 | 'github.com/dotnet/BenchmarkDotNet',
188 | 'github.com/dotnet/command-line-api',
189 | 'github.com/dotnet/efcore',
190 | 'github.com/dotnet/extensions',
191 | 'github.com/dotnet/machinelearning',
192 | 'github.com/dotnet/spark',
193 | 'github.com/dotnetcore/FreeSql',
194 | 'github.com/Dreamacro/clash',
195 | 'github.com/duo-labs/cloudmapper',
196 | 'github.com/dylan-power/dinosaur-exploder',
197 | 'github.com/DynamoRIO/drmemory',
198 | 'github.com/DynamoRIO/dynamorio',
199 | 'github.com/ealush/vest',
200 | 'github.com/EasyEngine/easyengine',
201 | 'github.com/eclipse/che',
202 | 'github.com/eclipse/eclipse-collections',
203 | 'github.com/eclipse/omr',
204 | 'github.com/eclipse/openj9',
205 | 'github.com/eclipsesource/J2V8',
206 | 'github.com/EFForg/https-everywhere',
207 | 'github.com/einsteinpy/einsteinpy',
208 | 'github.com/elastic/beats',
209 | 'github.com/elastic/elasticsearch',
210 | 'github.com/elastic/eui',
211 | 'github.com/elastic/kibana',
212 | 'github.com/elastic/rally',
213 | 'github.com/electron/electron',
214 | 'github.com/electron/electronjs.org',
215 | 'github.com/ElementsProject/lightning',
216 | 'github.com/emanuele-em/proxelar',
217 | 'github.com/ember-cli/ember-cli',
218 | 'github.com/empathyco/x',
219 | 'github.com/empathyco/x-archetype',
220 | 'github.com/encode/httpx',
221 | 'github.com/epicmaxco/vuestic-admin',
222 | 'github.com/eslint/eslint',
223 | 'github.com/ethereum/go-ethereum',
224 | 'github.com/ethereum/solidity',
225 | 'github.com/ethereum/web3.py',
226 | 'github.com/ethyca/fides',
227 | 'github.com/ethyca/fidesops',
228 | 'github.com/evhub/coconut',
229 | 'github.com/external-secrets/external-secrets',
230 | 'github.com/facebook/docusaurus',
231 | 'github.com/facebook/draft-js',
232 | 'github.com/facebook/flipper',
233 | 'github.com/facebook/flow',
234 | 'github.com/facebook/fresco',
235 | 'github.com/facebook/jest',
236 | 'github.com/facebook/react-native-website',
237 | 'github.com/facebook/react-native',
238 | 'github.com/facebookincubator/Bowler',
239 | 'github.com/facebookresearch/pythia',
240 | 'github.com/Factom-Asset-Tokens/fatd',
241 | 'github.com/fairfield-programming/backend-server',
242 | 'github.com/falconry/falcon',
243 | 'github.com/fastify/fastify',
244 | 'github.com/FeatureLabs/featuretools',
245 | 'github.com/find-sec-bugs/find-sec-bugs',
246 | 'github.com/fish-shell/fish-shell',
247 | 'github.com/fishtown-analytics/dbt',
248 | 'github.com/flarum/core',
249 | 'github.com/flipt-io/flipt',
250 | 'github.com/fluffyP4nd4/NoteIt',
251 | 'github.com/fortio/fortio',
252 | 'github.com/fossasia/open-event-server',
253 | 'github.com/Foundry376/Mailspring',
254 | 'github.com/freedomofpress/securedrop',
255 | 'github.com/FreshRSS/FreshRSS',
256 | 'github.com/FStarLang/FStar',
257 | 'github.com/GameFoundry/bsf',
258 | 'github.com/gatsbyjs/gatsby',
259 | 'github.com/gchq/CyberChef',
260 | 'github.com/gcushen/hugo-academic',
261 | 'github.com/geopandas/geopandas',
262 | 'github.com/getgauge/taiko',
263 | 'github.com/getzola/zola',
264 | 'github.com/git-cola/git-cola',
265 | 'github.com/git-tfs/git-tfs',
266 | 'github.com/gitcoinco/web',
267 | 'github.com/gitcommitshow/auth-jwt',
268 | 'github.com/Giuliano1993/make-js-component',
269 | 'github.com/gizak/termui',
270 | 'github.com/Glavin001/atom-beautify',
271 | 'github.com/globaleaks/GlobaLeaks',
272 | 'github.com/glpi-project/glpi',
273 | 'github.com/gnuradio/gnuradio',
274 | 'github.com/go-gitea/gitea',
275 | 'github.com/go-swagger/go-swagger',
276 | 'github.com/goatshriek/stumpless',
277 | 'github.com/goharbor/harbor',
278 | 'github.com/gomods/athens',
279 | 'github.com/google/data-transfer-project',
280 | 'github.com/google/gvisor',
281 | 'github.com/google/jax',
282 | 'github.com/google/TensorNetwork',
283 | 'github.com/google/timesketch',
284 | 'github.com/GoogleChrome/lighthouse',
285 | 'github.com/GoogleChrome/rendertron',
286 | 'github.com/GoogleChrome/workbox',
287 | 'github.com/GoogleChromeLabs/ProjectVisBug',
288 | 'github.com/GoogleChromeLabs/squoosh',
289 | 'github.com/GoogleContainerTools/jib',
290 | 'github.com/GoogleContainerTools/kaniko',
291 | 'github.com/GoogleContainerTools/skaffold',
292 | 'github.com/googleforgames/agones',
293 | 'github.com/gophish/gophish',
294 | 'github.com/goreleaser/goreleaser',
295 | 'github.com/gpbl/react-day-picker',
296 | 'github.com/grafana/loki',
297 | 'github.com/grammyjs/grammY',
298 | 'github.com/grandnode/grandnode',
299 | 'github.com/graph-gophers/graphql-go',
300 | 'github.com/graphhopper/graphhopper',
301 | 'github.com/Graylog2/graylog2-server',
302 | 'github.com/grpc-ecosystem/grpc-gateway',
303 | 'github.com/gruntwork-io/terragrunt',
304 | 'github.com/Guake/guake',
305 | 'github.com/hackmdio/codimd',
306 | 'github.com/hamaluik/timecop',
307 | 'github.com/haproxy/haproxy',
308 | 'github.com/hardkoded/puppeteer-sharp',
309 | 'github.com/Harvey-OS/harvey',
310 | 'github.com/hashicorp/packer',
311 | 'github.com/hasura/gitkube',
312 | 'github.com/hasura/graphql-engine',
313 | 'github.com/hazelcast/hazelcast',
314 | 'github.com/helm/helm',
315 | 'github.com/Heptagram-Bot/Heptagram',
316 | 'github.com/Hermit-Tools/Thumbnail-Maker',
317 | 'github.com/hewiefreeman/GopherGameServer',
318 | 'github.com/hoppscotch/hoppscotch',
319 | 'github.com/http4s/http4s',
320 | 'github.com/hubtype/botonic',
321 | 'github.com/hudson-and-thames/mlfinlab',
322 | 'github.com/Hypfer/Valetudo',
323 | 'github.com/ibis-project/ibis',
324 | 'github.com/Icinga/icinga2',
325 | 'github.com/Idrinth/api-bench',
326 | 'github.com/imsnif/bandwhich',
327 | 'github.com/indeedeng/starfish',
328 | 'github.com/infection/infection',
329 | 'github.com/Infisical/infisical',
330 | 'github.com/intel/cve-bin-tool',
331 | 'github.com/intel/dffml',
332 | 'github.com/internetarchive/openlibrary',
333 | 'github.com/iodide-project/iodide',
334 | 'github.com/ionic-team/capacitor',
335 | 'github.com/iovisor/bpftrace',
336 | 'github.com/ipython/ipython',
337 | 'github.com/isomorphic-git/isomorphic-git',
338 | 'github.com/iterative/dvc',
339 | 'github.com/iusehooks/usetheform',
340 | 'github.com/JabRef/jabref',
341 | 'github.com/jaegertracing/jaeger',
342 | 'github.com/janko/vim-test',
343 | 'github.com/jbush001/NyuziProcessor',
344 | 'github.com/JdeRobot/RoboticsAcademy',
345 | 'github.com/jendrikseipp/vulture',
346 | 'github.com/jenkins-x/jx',
347 | 'github.com/JetBrains/Exposed',
348 | 'github.com/jetstack/cert-manager',
349 | 'github.com/jgm/pandoc',
350 | 'github.com/JiahuiYu/generative_inpainting',
351 | 'github.com/jina-ai/jina',
352 | 'github.com/joomla/joomla-cms',
353 | 'github.com/jopohl/urh',
354 | 'github.com/jshint/jshint',
355 | 'github.com/julialang/julia',
356 | 'github.com/JuliaOpt/JuMP.jl',
357 | 'github.com/jupyter-widgets/ipywidgets',
358 | 'github.com/jupyter/notebook',
359 | 'github.com/jupyterhub/binderhub',
360 | 'github.com/jupyterlab/jupyterlab',
361 | 'github.com/justadudewhohacks/opencv4nodejs',
362 | 'github.com/juspay/hyperswitch',
363 | 'github.com/kariustobias/acme-rs',
364 | 'github.com/KaTeX/KaTeX',
365 | 'github.com/kedro-org/kedro',
366 | 'github.com/kelektiv/node-cron',
367 | 'github.com/keptn/keptn',
368 | 'github.com/keephq/keep',
369 | 'github.com/keras-team/keras',
370 | 'github.com/kevinfjiang/FuncNotify',
371 | 'github.com/kevinanielsen/go-fast-cdn',
372 | 'github.com/keystonejs/keystone',
373 | 'github.com/kiali/kiali',
374 | 'github.com/knative/serving',
375 | 'github.com/knex/knex',
376 | 'github.com/kodadot/nft-gallery',
377 | 'github.com/komeiji-satori/Dress',
378 | 'github.com/Kong/insomnia',
379 | 'github.com/Kong/kong',
380 | 'github.com/krassowski/jupyterlab-lsp',
381 | 'github.com/krishdevdb/reseter.css',
382 | 'github.com/ktorio/ktor',
383 | 'github.com/kubeapps/kubeapps',
384 | 'github.com/kubearmor/kubearmor',
385 | 'github.com/KubeOperator/KubeOperator',
386 | 'github.com/kubernetes-sigs/krew',
387 | 'github.com/kubernetes/dashboard',
388 | 'github.com/kubernetes/kubernetes',
389 | 'github.com/kubernetes/minikube',
390 | 'github.com/kubernetes/test-infra',
391 | 'github.com/kubernetes/website',
392 | 'github.com/kumahq/kuma',
393 | 'github.com/lagom/lagom',
394 | 'github.com/lando/lando',
395 | 'github.com/LangTrans/LangTrans',
396 | 'github.com/LappleApple/feedmereadmes',
397 | 'github.com/lark-parser/lark',
398 | 'github.com/launchbadge/sqlx',
399 | 'github.com/laurent22/joplin',
400 | 'github.com/layer5io/layer5',
401 | 'github.com/leandrowd/react-responsive-carousel',
402 | 'github.com/learn-awesome/learn',
403 | 'github.com/lerna/lerna',
404 | 'github.com/less/less.js',
405 | 'github.com/lhsazevedo/vuetify-material-auth',
406 | 'github.com/lifting-bits/mcsema',
407 | 'github.com/lightdash/lightdash',
408 | 'github.com/lightningnetwork/lnd',
409 | 'github.com/LightTable/LightTable',
410 | 'github.com/line/armeria',
411 | 'github.com/linkedin/cruise-control',
412 | 'github.com/linkerd/linkerd2',
413 | 'github.com/linq2db/linq2db',
414 | 'github.com/LMMS/lmms',
415 | 'github.com/loadimpact/k6',
416 | 'github.com/lobsters/lobsters',
417 | 'github.com/ludwig-ai/ludwig',
418 | 'github.com/ludwig-ai/ludwig-docs',
419 | 'github.com/lukasoppermann/html5sortable',
420 | 'github.com/lusaxweb/vuesax',
421 | 'github.com/maartenbreddels/ipyvolume',
422 | 'github.com/maddypie/PyCalc',
423 | 'github.com/MadhuNimmo/QuinesInAllLangs',
424 | 'github.com/magento/magento2',
425 | 'github.com/Magicianred/learn-by-doing',
426 | 'github.com/mailchain/mailchain',
427 | 'github.com/MakeContributions/ideahub',
428 | 'github.com/MakeContributions/markdown-dungeon',
429 | 'github.com/mamamia5x/markdownpedia',
430 | 'github.com/mapbox/mapbox-gl-js',
431 | 'github.com/mapbox/mapbox-gl-native',
432 | 'github.com/margaritahumanitarian/helpafamily',
433 | 'github.com/marmelab/react-admin',
434 | 'github.com/mars-project/mars',
435 | 'github.com/masoniteframework/masonite',
436 | 'github.com/masoniteframework/orm',
437 | 'github.com/MaterialDesignInXAML/MaterialDesignInXamlToolkit',
438 | 'github.com/mateuszz0000/imgprocalgs',
439 | 'github.com/matplotlib/matplotlib',
440 | 'github.com/mattermost/mattermost-server',
441 | 'github.com/mattgodbolt/compiler-explorer',
442 | 'github.com/mavoweb/mavo',
443 | 'github.com/mcollina/autocannon',
444 | 'github.com/mdx-js/mdx',
445 | 'github.com/medusajs/medusa',
446 | 'github.com/meilisearch/MeiliSearch',
447 | 'github.com/mermaid-js/mermaid',
448 | 'github.com/meshery/meshery',
449 | 'github.com/mesonbuild/meson',
450 | 'github.com/MessageKit/MessageKit',
451 | 'github.com/MetaMask/metamask-extension',
452 | 'github.com/microsoft/ChakraCore',
453 | 'github.com/microsoft/graspologic',
454 | 'github.com/microsoft/GSL',
455 | 'github.com/microsoft/TypeScript',
456 | 'github.com/microsoft/vcpkg',
457 | 'github.com/Microsoft/vscode',
458 | 'github.com/mike42/escpos-php',
459 | 'github.com/milvus-io/bootcamp',
460 | 'github.com/milvus-io/milvus',
461 | 'github.com/mimblewimble/grin',
462 | 'github.com/mindsphere/mindconnect-nodejs',
463 | 'github.com/miroiu/nodify',
464 | 'github.com/mlflow/mlflow',
465 | 'github.com/mlpack/mlpack',
466 | 'github.com/moaazsidat/react-native-qrcode-scanner',
467 | 'github.com/mobile-shell/mosh',
468 | 'github.com/mockk/mockk',
469 | 'github.com/modin-project/modin',
470 | 'github.com/monicahq/monica',
471 | 'github.com/mono/mono',
472 | 'github.com/MonoGame/MonoGame',
473 | 'github.com/MontFerret/ferret',
474 | 'github.com/mopidy/mopidy',
475 | 'github.com/morenoh149/react-native-contacts',
476 | 'github.com/MovingBlocks/Terasology',
477 | 'github.com/MrSwitch/hello.js',
478 | 'github.com/mui-org/material-ui',
479 | 'github.com/muke1908/chat-e2ee',
480 | 'github.com/mumble-voip/mumble',
481 | 'github.com/Musish/Musish',
482 | 'github.com/namespace-ee/react-calendar-timeline',
483 | 'github.com/namhyung/uftrace',
484 | 'github.com/nannou-org/nannou',
485 | 'github.com/nas5w/use-local-storage',
486 | 'github.com/NativeScript/NativeScript',
487 | 'github.com/nclient/NClient',
488 | 'github.com/neo4jrb/activegraph',
489 | 'github.com/neovim/neovim',
490 | 'github.com/nestjsx/crud',
491 | 'github.com/netlify/netlify-cms',
492 | 'github.com/neurodata/hyppo',
493 | 'github.com/neutraltone/awesome-stock-resources',
494 | 'github.com/newsboat/newsboat',
495 | 'github.com/nexB/scancode-toolkit',
496 | 'github.com/nextcloud/android',
497 | 'github.com/nextcloud/server',
498 | 'github.com/nidhaloff/b_rabbit',
499 | 'github.com/nidhaloff/deep-translator',
500 | 'github.com/nidhaloff/dolmetscher',
501 | 'github.com/nidhaloff/gpx_converter',
502 | 'github.com/nidhaloff/igel',
503 | 'github.com/nodejs/node',
504 | 'github.com/nokia/ntt',
505 | 'github.com/Noovolari/leapp',
506 | 'github.com/npm/cli',
507 | 'github.com/nteract/hydrogen',
508 | 'github.com/nukeop/nuclear',
509 | 'github.com/numba/numba',
510 | 'github.com/numpy/numpy',
511 | 'github.com/nushell/nushell',
512 | 'github.com/nuxt/nuxt.js',
513 | 'github.com/oauth-xx/oauth2',
514 | 'github.com/objectbox/objectbox-dart',
515 | 'github.com/obsproject/obs-studio',
516 | 'github.com/ockam-network/ockam',
517 | 'github.com/OfflineIMAP/offlineimap',
518 | 'github.com/oilshell/oil',
519 | 'github.com/okteto/okteto',
520 | 'github.com/OneStep-elecTRON/onestep-electron-content',
521 | 'github.com/onlydustxyz/starklings',
522 | 'github.com/open-sauced/open-sauced',
523 | 'github.com/openatx/uiautomator2',
524 | 'github.com/OpenBeta/open-tacos',
525 | 'github.com/openchemistry/avogadrolibs',
526 | 'github.com/opencv/cvat',
527 | 'github.com/opencv/opencv',
528 | 'github.com/OpenDroneMap/WebODM',
529 | 'github.com/openemr/openemr',
530 | 'github.com/OpenGenus/cosmos',
531 | 'github.com/OpenLightingProject/open-fixture-library',
532 | 'github.com/OpenLiveWriter/OpenLiveWriter',
533 | 'github.com/OpenMined/PySyft',
534 | 'github.com/OpenRCT2/OpenRCT2',
535 | 'github.com/OpenRefine/OpenRefine',
536 | 'github.com/openseadragon/openseadragon',
537 | 'github.com/opensearch-project/OpenSearch',
538 | 'github.com/opensearch-project/OpenSearch-Dashboards',
539 | 'github.com/openssl/openssl',
540 | 'github.com/OpenTTD/OpenTTD',
541 | 'github.com/openzfs/zfs',
542 | 'github.com/oppia/oppia',
543 | 'github.com/optuna/optuna',
544 | 'github.com/oracle/opengrok',
545 | 'github.com/osm-search/Nominatim',
546 | 'github.com/owncloud/client',
547 | 'github.com/oxyplot/oxyplot',
548 | 'github.com/p4lang/behavioral-model',
549 | 'github.com/panda3d/panda3d',
550 | 'github.com/pandas-dev/pandas',
551 | 'github.com/pantsbuild/pants',
552 | 'github.com/parse-community/parse-server',
553 | 'github.com/pester/Pester',
554 | 'github.com/PetrochukM/PyTorch-NLP',
555 | 'github.com/PHP-FFMpeg/PHP-FFMpeg',
556 | 'github.com/phpmd/phpmd',
557 | 'github.com/phpmyadmin/phpmyadmin',
558 | 'github.com/phpservermon/phpservermon',
559 | 'github.com/pieces-app/example-ts',
560 | 'github.com/playframework/playframework',
561 | 'github.com/Plume-org/Plume',
562 | 'github.com/pmd/pmd',
563 | 'github.com/pnpm/pnpm',
564 | 'github.com/PointCloudLibrary/pcl',
565 | 'github.com/portainer/portainer',
566 | 'github.com/PostHog/posthog',
567 | 'github.com/predibase/lorax',
568 | 'github.com/PrefectHQ/prefect',
569 | 'github.com/PrestaShop/PrestaShop',
570 | 'github.com/PrismJS/prism',
571 | 'github.com/projectcontour/contour',
572 | 'github.com/Provenance-Emu/Provenance',
573 | 'github.com/prysmaticlabs/prysm',
574 | 'github.com/pterodactyl/panel',
575 | 'github.com/pugjs/pug',
576 | 'github.com/purpleidea/mgmt',
577 | 'github.com/pwndbg/pwndbg',
578 | 'github.com/pydata/xarray',
579 | 'github.com/pygame/pygame',
580 | 'github.com/pyinstaller/pyinstaller',
581 | 'github.com/pypa/pip',
582 | 'github.com/pypa/pipenv',
583 | 'github.com/pypa/warehouse',
584 | 'github.com/pyqtgraph/pyqtgraph',
585 | 'github.com/pyro-ppl/pyro',
586 | 'github.com/pyroscope-io/pyroscope',
587 | 'github.com/python-geeks/Automation-scripts',
588 | 'github.com/python-visualization/folium',
589 | 'github.com/pythonnet/pythonnet',
590 | 'github.com/pytorch/glow',
591 | 'github.com/pytorch/ignite',
592 | 'github.com/pytorch/pytorch',
593 | 'github.com/PyTorchLightning/pytorch-lightning',
594 | 'github.com/pywinauto/pywinauto',
595 | 'github.com/Qiskit/qiskit-terra',
596 | 'github.com/qmk/qmk_firmware',
597 | 'github.com/qTox/qTox',
598 | 'github.com/QuantConnect/Lean',
599 | 'github.com/quantumlib/Cirq',
600 | 'github.com/quarkusio/quarkus',
601 | 'github.com/questdb/questdb',
602 | 'github.com/quicktype/quicktype',
603 | 'github.com/radareorg/cutter',
604 | 'github.com/radareorg/radare2',
605 | 'github.com/rakudo/rakudo',
606 | 'github.com/randombit/botan',
607 | 'github.com/rapidsai/cuml',
608 | 'github.com/RaRe-Technologies/gensim',
609 | 'github.com/ray-project/ray',
610 | 'github.com/rclone/rclone',
611 | 'github.com/react-native-community/cli',
612 | 'github.com/react-native-community/react-native-share',
613 | 'github.com/react-native-community/react-native-svg',
614 | 'github.com/react-toolbox/react-toolbox',
615 | 'github.com/reactioncommerce/reaction',
616 | 'github.com/reactjs/react-rails',
617 | 'github.com/reactjs/reactjs.org',
618 | 'github.com/readthedocs/readthedocs.org',
619 | 'github.com/redux-saga/redux-saga',
620 | 'github.com/refinedev/refine',
621 | 'github.com/remacs/remacs',
622 | 'github.com/renovatebot/renovate',
623 | 'github.com/responsively-org/responsively-app',
624 | 'github.com/RetroShare/RetroShare',
625 | 'github.com/revertinc/revert',
626 | 'github.com/rigetti/pyquil',
627 | 'github.com/ripple/rippled',
628 | 'github.com/rjsf-team/react-jsonschema-form',
629 | 'github.com/rodrigo-arenas/Sklearn-genetic-opt',
630 | 'github.com/rstudio/keras',
631 | 'github.com/rubberduck-vba/Rubberduck',
632 | 'github.com/rubocop-hq/rubocop',
633 | 'github.com/rudderlabs/rudder-server',
634 | 'github.com/rust-analyzer/rust-analyzer',
635 | 'github.com/rust-lang/rust-by-example',
636 | 'github.com/rust-lang/rust-clippy',
637 | 'github.com/rust-lang/rustfmt',
638 | 'github.com/rust-windowing/glutin',
639 | 'github.com/rust-windowing/winit',
640 | 'github.com/rustsim/nalgebra',
641 | 'github.com/Sable/soot',
642 | 'github.com/SAP/chevrotain',
643 | 'github.com/SasanLabs/VulnerableApp',
644 | 'github.com/sayanarijit/xplr',
645 | 'github.com/sbt/sbt',
646 | 'github.com/sButtons/sbuttons',
647 | 'github.com/scalanlp/breeze',
648 | 'github.com/scalaz/scalaz',
649 | 'github.com/scikit-image/scikit-image',
650 | 'github.com/scikit-learn/scikit-learn',
651 | 'github.com/scipy/scipy',
652 | 'github.com/scrapy/scrapy',
653 | 'github.com/SeaQL/sea-orm',
654 | 'github.com/SeaQL/sea-query',
655 | 'github.com/SeaQL/sea-schema',
656 | 'github.com/seata/seata',
657 | 'github.com/sebastianbergmann/phpunit',
658 | 'github.com/sendgrid/sendgrid-php',
659 | 'github.com/sequelize/sequelize',
660 | 'github.com/serialport/node-serialport',
661 | 'github.com/serverless/components',
662 | 'github.com/serverless/serverless',
663 | 'github.com/SFTtech/openage',
664 | 'github.com/shahednasser/awesome-resources',
665 | 'github.com/shaynethiessen/terrene',
666 | 'github.com/SheetJS/sheetjs',
667 | 'github.com/shentao/vue-multiselect',
668 | 'github.com/shogun-toolbox/shogun',
669 | 'github.com/shravan20/github-readme-quotes',
670 | 'github.com/Sibyx/django_api_forms',
671 | 'github.com/sif/Ghost-Artemis',
672 | 'github.com/Signoz/signoz',
673 | 'github.com/simonmichael/hledger',
674 | 'github.com/simple-icons/simple-icons',
675 | 'github.com/sindresorhus/refined-github',
676 | 'github.com/SirVer/ultisnips',
677 | 'github.com/sitespeedio/coach',
678 | 'github.com/sitespeedio/sitespeed.io',
679 | 'github.com/slackapi/node-slack-sdk',
680 | 'github.com/slic3r/Slic3r',
681 | 'github.com/smallstep/certificates',
682 | 'github.com/smallstep/cli',
683 | 'github.com/snabbdom/snabbdom',
684 | 'github.com/snowtrack/snowfs',
685 | 'github.com/solid/node-solid-server',
686 | 'github.com/solidusio/solidus',
687 | 'github.com/sorbet/sorbet',
688 | 'github.com/sourcegraph/sourcegraph',
689 | 'github.com/sourcerer-io/sourcerer-app',
690 | 'github.com/spaceuptech/space-cloud',
691 | 'github.com/spack/spack',
692 | 'github.com/splitbrain/dokuwiki',
693 | 'github.com/spotbugs/spotbugs',
694 | 'github.com/spotify/backstage',
695 | 'github.com/spotify/scio',
696 | 'github.com/square/retrofit',
697 | 'github.com/SSENSE/vue-carousel',
698 | 'github.com/StackStorm/st2',
699 | 'github.com/stan-dev/stan',
700 | 'github.com/statsmodels/statsmodels',
701 | 'github.com/Stellarium/stellarium',
702 | 'github.com/storybookjs/storybook',
703 | 'github.com/strapi/strapi',
704 | 'github.com/streamich/react-use',
705 | 'github.com/streamlit/streamlit',
706 | 'github.com/strongbox/strongbox',
707 | 'github.com/strongloop/loopback-next',
708 | 'github.com/stryker-mutator/stryker-net',
709 | 'github.com/STVIR/pysot',
710 | 'github.com/styleguidist/react-styleguidist',
711 | 'github.com/stylelint/stylelint',
712 | 'github.com/subethaedit/SubEthaEdit',
713 | 'github.com/supercollider/supercollider',
714 | 'github.com/sveltejs/sapper',
715 | 'github.com/sveltejs/svelte',
716 | 'github.com/swapagarwal/swag-for-dev',
717 | 'github.com/sylabs/singularity',
718 | 'github.com/Sylius/Sylius',
719 | 'github.com/symfony/symfony',
720 | 'github.com/sympy/sympy',
721 | 'github.com/syncthing/syncthing',
722 | 'github.com/sysgears/apollo-universal-starter-kit',
723 | 'github.com/TandoorRecipes/recipes',
724 | 'github.com/tantivy-search/tantivy',
725 | 'github.com/tarantool/tarantool',
726 | 'github.com/tchiotludo/akhq',
727 | 'github.com/TDAmeritrade/stumpy',
728 | 'github.com/TeamAmaze/AmazeFileManager',
729 | 'github.com/TeamNewPipe/NewPipe',
730 | 'github.com/tektoncd/pipeline',
731 | 'github.com/telepresenceio/telepresence',
732 | 'github.com/tenancy/multi-tenant',
733 | 'github.com/Tencent/wepy',
734 | 'github.com/tendermint/tendermint',
735 | 'github.com/tensorflow/probability',
736 | 'github.com/tensorflow/tensorflow',
737 | 'github.com/tensorflow/tfjs',
738 | 'github.com/terraform-providers/terraform-provider-aws',
739 | 'github.com/terraform-providers/terraform-provider-azurerm',
740 | 'github.com/testcontainers/testcontainers-java',
741 | 'github.com/textlint/textlint',
742 | 'github.com/thanos-io/thanos',
743 | 'github.com/themesberg/flowbite-react',
744 | 'github.com/themix-project/oomox',
745 | 'github.com/thepracticaldev/dev.to',
746 | 'github.com/theroopesh/freshbey',
747 | 'github.com/theupdateframework/tuf',
748 | 'github.com/ThreeMammals/Ocelot',
749 | 'github.com/tiangolo/fastapi',
750 | 'github.com/timothycrosley/isort',
751 | 'github.com/tinacms/tinacms',
752 | 'github.com/tizonia/tizonia-openmax-il',
753 | 'github.com/tomkp/react-split-pane',
754 | 'github.com/tongueroo/jets',
755 | 'github.com/ToolJet/ToolJet',
756 | 'github.com/traceloop/openllmetry',
757 | 'github.com/trailofbits/manticore',
758 | 'github.com/tridactyl/tridactyl',
759 | 'github.com/tweag/asterius',
760 | 'github.com/typescript-eslint/typescript-eslint',
761 | 'github.com/tzapu/WiFiManager',
762 | 'github.com/ubuntu/microk8s',
763 | 'github.com/Udayraj123/OMRChecker',
764 | 'github.com/unisonweb/unison',
765 | 'github.com/UniversalMediaServer/UniversalMediaServer',
766 | 'github.com/unoplatform/uno',
767 | 'github.com/UPC/ravada',
768 | 'github.com/uutils/coreutils',
769 | 'github.com/valhalla/valhalla',
770 | 'github.com/validatorjs/validator.js',
771 | 'github.com/Varying-Vagrant-Vagrants/VVV',
772 | 'github.com/version0chiro/Find-Me-Issues',
773 | 'github.com/vesoft-inc/nebula',
774 | 'github.com/vespa-engine/vespa',
775 | 'github.com/vicky002/AlgoWiki',
776 | 'github.com/vimeo/psalm',
777 | 'github.com/vmware-tanzu/carvel',
778 | 'github.com/vmware-tanzu/community-edition',
779 | 'github.com/vmware-tanzu/velero',
780 | 'github.com/vmware/versatile-data-kit',
781 | 'github.com/volta-cli/volta',
782 | 'github.com/VSCodeVim/Vim',
783 | 'github.com/vuejs/vue-router',
784 | 'github.com/vuejs/vue',
785 | 'github.com/vuejs/vuepress',
786 | 'github.com/vuetifyjs/vuetify',
787 | 'github.com/VulcanJS/Vulcan',
788 | 'github.com/wagtail/wagtail',
789 | 'github.com/WallarooLabs/wallaroo',
790 | 'github.com/wasdk/WebAssemblyStudio',
791 | 'github.com/weaveworks/eksctl',
792 | 'github.com/weaveworks/footloose',
793 | 'github.com/weaveworks/ignite',
794 | 'github.com/weaveworks/weave',
795 | 'github.com/web-platform-tests/wpt',
796 | 'github.com/webhintio/hint',
797 | 'github.com/WeblateOrg/weblate',
798 | 'github.com/wemake-services/wemake-python-styleguide',
799 | 'github.com/wesnoth/wesnoth',
800 | 'github.com/wger-project/flutter',
801 | 'github.com/wger-project/wger',
802 | 'github.com/whatwg/fetch',
803 | 'github.com/whatwg/html',
804 | 'github.com/whitesmith/rubycritic',
805 | 'github.com/winstonjs/winston',
806 | 'github.com/winsw/winsw',
807 | 'github.com/withspectrum/spectrum',
808 | 'github.com/woocommerce/woocommerce',
809 | 'github.com/wordpress-mobile/WordPress-Android',
810 | 'github.com/wordpress-mobile/WordPress-iOS',
811 | 'github.com/WordPress/gutenberg',
812 | 'github.com/WordPress/openverse-api',
813 | 'github.com/WordPress/openverse-catalog',
814 | 'github.com/WordPress/openverse-frontend',
815 | 'github.com/WordPress/openverse',
816 | 'github.com/wp-graphql/wp-graphql',
817 | 'github.com/wyattowalsh/data-science-notes',
818 | 'github.com/xenia-project/xenia',
819 | 'github.com/xtermjs/xterm.js',
820 | 'github.com/xunit/xunit',
821 | 'github.com/yarnpkg/yarn',
822 | 'github.com/yashaka/selene',
823 | 'github.com/yewstack/yew',
824 | 'github.com/Yoast/wordpress-seo',
825 | 'github.com/yugabyte/yugabyte-db',
826 | 'github.com/zaproxy/zaproxy',
827 | 'github.com/zcash/zcash',
828 | 'github.com/zeebe-io/zeebe',
829 | 'github.com/zeek/zeek',
830 | 'github.com/zeit/hyper',
831 | 'github.com/zeit/next.js',
832 | 'github.com/zenml-io/zenml',
833 | 'github.com/zephyrproject-rtos/zephyr',
834 | 'github.com/zio/zio',
835 | 'github.com/zitadel/zitadel',
836 | 'github.com/zsh-users/zsh-completions',
837 | 'github.com/zsh-users/zsh-syntax-highlighting',
838 | 'github.com/zulip/zulip',
839 | 'github.com/ZupIT/charlescd',
840 | 'github.com/ZupIT/ritchie-cli',
841 | 'github.com/ZupIT/ritchie-formulas'
842 | ]
843 |
--------------------------------------------------------------------------------
/data/tags.sample.json:
--------------------------------------------------------------------------------
1 | [
2 | { "language": "JavaScript", "count": 7, "slug": "javascript" },
3 | { "language": "Python", "count": 5, "slug": "python" },
4 | { "language": "HTML", "count": 4, "slug": "html" },
5 | { "language": "TypeScript", "count": 3, "slug": "typescript" },
6 | { "language": "C", "count": 3, "slug": "c" }
7 | ]
8 |
--------------------------------------------------------------------------------
/gfi/__init__.py:
--------------------------------------------------------------------------------
1 | #!/usr/bin/env python
2 | # -*- coding: utf-8 -*-
3 |
--------------------------------------------------------------------------------
/gfi/populate.py:
--------------------------------------------------------------------------------
1 | #!/usr/bin/env python
2 | # -*- coding: utf-8 -*-
3 | import itertools
4 | import json
5 | import random
6 | import re
7 | from collections import Counter
8 | from concurrent.futures import ThreadPoolExecutor
9 | from operator import itemgetter
10 | from os import getenv, path
11 | from typing import TypedDict, Dict, Union, Sequence, Optional, Mapping
12 |
13 | import toml
14 |
15 | from github3 import exceptions, login
16 | from numerize import numerize
17 | from emoji import emojize
18 | from slugify import slugify
19 | from loguru import logger
20 |
21 | MAX_CONCURRENCY = 25 # max number of requests to make to GitHub in parallel
22 | MAX_REPOSITORIES = 500 # max number of repositories populated in one session
23 | REPO_DATA_FILE = "data/repositories.toml"
24 | REPO_GENERATED_DATA_FILE = "data/generated.json"
25 | TAGS_GENERATED_DATA_FILE = "data/tags.json"
26 | GH_URL_PATTERN = re.compile(r"[http://|https://]?github.com/(?P[\w\.-]+)/(?P[\w\.-]+)/?")
27 | LABELS_DATA_FILE = "data/labels.json"
28 | ISSUE_STATE = "open"
29 | ISSUE_SORT = "created"
30 | ISSUE_SORT_DIRECTION = "desc"
31 | ISSUE_LIMIT = 10
32 | SLUGIFY_REPLACEMENTS = [["#", "sharp"], ["+", "plus"]]
33 |
34 | if not path.exists(LABELS_DATA_FILE):
35 | raise RuntimeError("No labels data file found. Exiting.")
36 |
37 | with open(LABELS_DATA_FILE) as labels_file:
38 | LABELS_DATA = json.load(labels_file)
39 |
40 | ISSUE_LABELS = LABELS_DATA["labels"]
41 |
42 |
43 | class RepoNotFoundException(Exception):
44 | """Exception class for repo not found."""
45 |
46 |
47 | def parse_github_url(url: str) -> dict:
48 | """Take the GitHub repo URL and return a tuple with owner login and repo name."""
49 | match = GH_URL_PATTERN.search(url)
50 | if match:
51 | return match.groupdict()
52 | return {}
53 |
54 |
55 | class RepositoryIdentifier(TypedDict):
56 | owner: str
57 | name: str
58 |
59 |
60 | RepositoryInfo = Dict["str", Union[str, int, Sequence]]
61 |
62 |
63 | def get_repository_info(identifier: RepositoryIdentifier) -> Optional[RepositoryInfo]:
64 | """Get the relevant information needed for the repository from its owner login and name."""
65 | owner, name = identifier["owner"], identifier["name"]
66 |
67 | logger.info("Getting info for {}/{}", owner, name)
68 |
69 | # create a logged in GitHub client
70 | client = login(token=getenv("GH_ACCESS_TOKEN"))
71 |
72 | info: RepositoryInfo = {}
73 |
74 | # get the repository; if the repo is not found, log a warning
75 | try:
76 | repository = client.repository(owner, name)
77 | # Don't find issues inside archived repos.
78 | if repository.archived:
79 | return None
80 |
81 | good_first_issues = set(
82 | itertools.chain.from_iterable(
83 | repository.issues(
84 | labels=label,
85 | state=ISSUE_STATE,
86 | number=ISSUE_LIMIT,
87 | sort=ISSUE_SORT,
88 | direction=ISSUE_SORT_DIRECTION,
89 | )
90 | for label in ISSUE_LABELS
91 | )
92 | )
93 | logger.info("\t found {} good first issues", len(good_first_issues))
94 | # check if repo has at least one good first issue
95 | if good_first_issues and repository.language:
96 | # store the repo info
97 | info["name"] = name
98 | info["owner"] = owner
99 | info["description"] = emojize(repository.description or "")
100 | info["language"] = repository.language
101 | info["slug"] = slugify(repository.language, replacements=SLUGIFY_REPLACEMENTS)
102 | info["url"] = repository.html_url
103 | info["stars"] = repository.stargazers_count
104 | info["stars_display"] = numerize.numerize(repository.stargazers_count)
105 | info["last_modified"] = repository.pushed_at.isoformat()
106 | info["id"] = str(repository.id)
107 |
108 | # get the latest issues with the tag
109 | issues = []
110 | for issue in good_first_issues:
111 | issues.append(
112 | {
113 | "title": issue.title,
114 | "url": issue.html_url,
115 | "number": issue.number,
116 | "comments_count": issue.comments_count,
117 | "created_at": issue.created_at.isoformat(),
118 | }
119 | )
120 |
121 | info["issues"] = issues
122 | else:
123 | logger.info("\t skipping due to insufficient issues or info")
124 | except exceptions.NotFoundError:
125 | logger.warning("Not Found: {}/{}", owner, name)
126 | except exceptions.ForbiddenError:
127 | logger.warning("Skipped due to rate-limits: {}/{}", owner, name)
128 | except exceptions.ConnectionError:
129 | logger.warning("Skipped due to connection errors: {}/{}", owner, name)
130 |
131 | return info
132 |
133 |
134 | if __name__ == "__main__":
135 | # parse the repositories data file and get the list of repos
136 | # for generating pages for.
137 |
138 | if not path.exists(REPO_DATA_FILE):
139 | raise RuntimeError("No config data file found. Exiting.")
140 |
141 | # if the GitHub Access Token isn't found, raise an error
142 | if not getenv("GH_ACCESS_TOKEN"):
143 | raise RuntimeError("Access token not present in the env variable `GH_ACCESS_TOKEN`")
144 |
145 | REPOSITORIES = []
146 | TAGS: Counter = Counter()
147 | with open(REPO_DATA_FILE, "r") as data_file:
148 | DATA = toml.load(REPO_DATA_FILE)
149 |
150 | logger.info(
151 | "Found {} repository entries in {}",
152 | len(DATA["repositories"]),
153 | REPO_DATA_FILE,
154 | )
155 |
156 | # pre-process the URLs and only continue with the list of valid GitHub URLs
157 | repositories = list(filter(bool, [parse_github_url(url) for url in DATA["repositories"]]))
158 |
159 | # shuffle the order of the repositories
160 | random.shuffle(repositories)
161 |
162 | with ThreadPoolExecutor(max_workers=MAX_CONCURRENCY) as executor:
163 | results = executor.map(get_repository_info, repositories[:MAX_REPOSITORIES])
164 |
165 | # filter out repositories with valid data and increment tag counts
166 | for result in results:
167 | if result:
168 | REPOSITORIES.append(result)
169 | TAGS[result["language"]] += 1
170 |
171 | # write to generated JSON files
172 |
173 | with open(REPO_GENERATED_DATA_FILE, "w") as file_desc:
174 | json.dump(REPOSITORIES, file_desc)
175 | logger.info("Wrote data for {} repos to {}", len(REPOSITORIES), REPO_GENERATED_DATA_FILE)
176 |
177 | # use only those tags that have at least three occurrences
178 | tags = [
179 | {
180 | "language": key,
181 | "count": value,
182 | "slug": slugify(key, replacements=SLUGIFY_REPLACEMENTS),
183 | }
184 | for (key, value) in TAGS.items()
185 | if value >= 3
186 | ]
187 | tags_sorted = sorted(tags, key=itemgetter("count"), reverse=True)
188 | with open(TAGS_GENERATED_DATA_FILE, "w") as file_desc:
189 | json.dump(tags_sorted, file_desc)
190 | logger.info("Wrote {} tags to {}", len(tags), TAGS_GENERATED_DATA_FILE)
191 |
--------------------------------------------------------------------------------
/gfi/test_data.py:
--------------------------------------------------------------------------------
1 | #!/usr/bin/env python
2 | # -*- coding: utf-8 -*-
3 | import json
4 | import os
5 | import unittest
6 | from collections import Counter
7 |
8 | import toml
9 |
10 | DATA_FILE_PATH = "data/repositories.toml"
11 | LABELS_FILE_PATH = "data/labels.json"
12 |
13 |
14 | def _get_data_from_toml(file_path):
15 | with open(file_path, "r") as file_desc:
16 | return toml.load(file_desc)
17 |
18 |
19 | def _get_data_from_json(file_path):
20 | with open(file_path, "r") as file_desc:
21 | return json.load(file_desc)
22 |
23 |
24 | class TestDataSanity(unittest.TestCase):
25 | """Test for sanity of the data file."""
26 |
27 | @staticmethod
28 | def test_data_file_exists():
29 | """Verify that the data file exists."""
30 | assert os.path.exists(DATA_FILE_PATH)
31 |
32 | @staticmethod
33 | def test_labels_file_exists():
34 | """Verify that the labels file exists."""
35 | assert os.path.exists(LABELS_FILE_PATH)
36 |
37 | @staticmethod
38 | def test_data_file_sane():
39 | """Verify that the file is a valid TOML with required data."""
40 | data = _get_data_from_toml(DATA_FILE_PATH)
41 | assert "repositories" in data
42 |
43 | @staticmethod
44 | def test_labels_file_sane():
45 | """Verify that the labels file is a valid JSON"""
46 | data = _get_data_from_json(LABELS_FILE_PATH)
47 | assert "labels" in data
48 |
49 | @staticmethod
50 | def test_no_duplicates():
51 | """Verify that all entries are unique."""
52 | data = _get_data_from_toml(DATA_FILE_PATH)
53 | repos = data.get("repositories", [])
54 | print([item for item, count in Counter(repos).items() if count > 1])
55 | assert len(repos) == len(set(repos))
56 |
57 |
58 | if __name__ == "__main__":
59 | unittest.main()
60 |
--------------------------------------------------------------------------------
/layouts/default.vue:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
9 |
10 |
11 |
12 |
13 |
54 |
--------------------------------------------------------------------------------
/mypy.ini:
--------------------------------------------------------------------------------
1 | [mypy]
2 | warn_redundant_casts = True
3 | warn_unused_ignores = True
4 |
5 | [mypy-github3.*]
6 | ignore_missing_imports = True
7 |
8 | [mypy-numerize.*]
9 | ignore_missing_imports = True
10 |
11 | [mypy-emoji.*]
12 | ignore_missing_imports = True
13 |
--------------------------------------------------------------------------------
/nuxt.config.ts:
--------------------------------------------------------------------------------
1 | // https://nuxt.com/docs/api/configuration/nuxt-config
2 | export default defineNuxtConfig({
3 | devtools: { enabled: true },
4 | modules: ['@nuxtjs/tailwindcss', 'nuxt-gtag', 'nuxt-simple-sitemap'],
5 | nitro: {
6 | prerender: {
7 | crawlLinks: true
8 | }
9 | },
10 | site: {
11 | url: 'https://goodfirstissue.dev'
12 | }
13 | })
14 |
--------------------------------------------------------------------------------
/package.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "nuxt-app",
3 | "private": true,
4 | "type": "module",
5 | "scripts": {
6 | "build": "nuxt build",
7 | "dev": "nuxt dev",
8 | "generate": "nuxt generate",
9 | "preview": "nuxt preview",
10 | "postinstall": "nuxt prepare",
11 | "sync": "bun sync.js"
12 | },
13 | "devDependencies": {
14 | "@nuxt/devtools": "latest",
15 | "@nuxtjs/tailwindcss": "latest",
16 | "nuxt": "^3.8.2",
17 | "nuxt-gtag": "^0.5.9",
18 | "nuxt-simple-sitemap": "^3.4.0",
19 | "prettier": "^3.1.1"
20 | },
21 | "dependencies": {
22 | "@heroicons/vue": "^2.0.18",
23 | "@vercel/blob": "^0.16.1",
24 | "dayjs": "^1.11.10"
25 | }
26 | }
27 |
--------------------------------------------------------------------------------
/pages/index.vue:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
20 |
--------------------------------------------------------------------------------
/pages/language/[slug].vue:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
25 |
--------------------------------------------------------------------------------
/poetry.lock:
--------------------------------------------------------------------------------
1 | # This file is automatically @generated by Poetry 1.7.1 and should not be changed by hand.
2 |
3 | [[package]]
4 | name = "certifi"
5 | version = "2023.11.17"
6 | description = "Python package for providing Mozilla's CA Bundle."
7 | optional = false
8 | python-versions = ">=3.6"
9 | files = [
10 | {file = "certifi-2023.11.17-py3-none-any.whl", hash = "sha256:e036ab49d5b79556f99cfc2d9320b34cfbe5be05c5871b51de9329f0603b0474"},
11 | {file = "certifi-2023.11.17.tar.gz", hash = "sha256:9b469f3a900bf28dc19b8cfbf8019bf47f7fdd1a65a1d4ffb98fc14166beb4d1"},
12 | ]
13 |
14 | [[package]]
15 | name = "cffi"
16 | version = "1.16.0"
17 | description = "Foreign Function Interface for Python calling C code."
18 | optional = false
19 | python-versions = ">=3.8"
20 | files = [
21 | {file = "cffi-1.16.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:6b3d6606d369fc1da4fd8c357d026317fbb9c9b75d36dc16e90e84c26854b088"},
22 | {file = "cffi-1.16.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:ac0f5edd2360eea2f1daa9e26a41db02dd4b0451b48f7c318e217ee092a213e9"},
23 | {file = "cffi-1.16.0-cp310-cp310-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:7e61e3e4fa664a8588aa25c883eab612a188c725755afff6289454d6362b9673"},
24 | {file = "cffi-1.16.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a72e8961a86d19bdb45851d8f1f08b041ea37d2bd8d4fd19903bc3083d80c896"},
25 | {file = "cffi-1.16.0-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:5b50bf3f55561dac5438f8e70bfcdfd74543fd60df5fa5f62d94e5867deca684"},
26 | {file = "cffi-1.16.0-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:7651c50c8c5ef7bdb41108b7b8c5a83013bfaa8a935590c5d74627c047a583c7"},
27 | {file = "cffi-1.16.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e4108df7fe9b707191e55f33efbcb2d81928e10cea45527879a4749cbe472614"},
28 | {file = "cffi-1.16.0-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:32c68ef735dbe5857c810328cb2481e24722a59a2003018885514d4c09af9743"},
29 | {file = "cffi-1.16.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:673739cb539f8cdaa07d92d02efa93c9ccf87e345b9a0b556e3ecc666718468d"},
30 | {file = "cffi-1.16.0-cp310-cp310-win32.whl", hash = "sha256:9f90389693731ff1f659e55c7d1640e2ec43ff725cc61b04b2f9c6d8d017df6a"},
31 | {file = "cffi-1.16.0-cp310-cp310-win_amd64.whl", hash = "sha256:e6024675e67af929088fda399b2094574609396b1decb609c55fa58b028a32a1"},
32 | {file = "cffi-1.16.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:b84834d0cf97e7d27dd5b7f3aca7b6e9263c56308ab9dc8aae9784abb774d404"},
33 | {file = "cffi-1.16.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:1b8ebc27c014c59692bb2664c7d13ce7a6e9a629be20e54e7271fa696ff2b417"},
34 | {file = "cffi-1.16.0-cp311-cp311-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ee07e47c12890ef248766a6e55bd38ebfb2bb8edd4142d56db91b21ea68b7627"},
35 | {file = "cffi-1.16.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d8a9d3ebe49f084ad71f9269834ceccbf398253c9fac910c4fd7053ff1386936"},
36 | {file = "cffi-1.16.0-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:e70f54f1796669ef691ca07d046cd81a29cb4deb1e5f942003f401c0c4a2695d"},
37 | {file = "cffi-1.16.0-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:5bf44d66cdf9e893637896c7faa22298baebcd18d1ddb6d2626a6e39793a1d56"},
38 | {file = "cffi-1.16.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7b78010e7b97fef4bee1e896df8a4bbb6712b7f05b7ef630f9d1da00f6444d2e"},
39 | {file = "cffi-1.16.0-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:c6a164aa47843fb1b01e941d385aab7215563bb8816d80ff3a363a9f8448a8dc"},
40 | {file = "cffi-1.16.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:e09f3ff613345df5e8c3667da1d918f9149bd623cd9070c983c013792a9a62eb"},
41 | {file = "cffi-1.16.0-cp311-cp311-win32.whl", hash = "sha256:2c56b361916f390cd758a57f2e16233eb4f64bcbeee88a4881ea90fca14dc6ab"},
42 | {file = "cffi-1.16.0-cp311-cp311-win_amd64.whl", hash = "sha256:db8e577c19c0fda0beb7e0d4e09e0ba74b1e4c092e0e40bfa12fe05b6f6d75ba"},
43 | {file = "cffi-1.16.0-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:fa3a0128b152627161ce47201262d3140edb5a5c3da88d73a1b790a959126956"},
44 | {file = "cffi-1.16.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:68e7c44931cc171c54ccb702482e9fc723192e88d25a0e133edd7aff8fcd1f6e"},
45 | {file = "cffi-1.16.0-cp312-cp312-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:abd808f9c129ba2beda4cfc53bde801e5bcf9d6e0f22f095e45327c038bfe68e"},
46 | {file = "cffi-1.16.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:88e2b3c14bdb32e440be531ade29d3c50a1a59cd4e51b1dd8b0865c54ea5d2e2"},
47 | {file = "cffi-1.16.0-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:fcc8eb6d5902bb1cf6dc4f187ee3ea80a1eba0a89aba40a5cb20a5087d961357"},
48 | {file = "cffi-1.16.0-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:b7be2d771cdba2942e13215c4e340bfd76398e9227ad10402a8767ab1865d2e6"},
49 | {file = "cffi-1.16.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e715596e683d2ce000574bae5d07bd522c781a822866c20495e52520564f0969"},
50 | {file = "cffi-1.16.0-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:2d92b25dbf6cae33f65005baf472d2c245c050b1ce709cc4588cdcdd5495b520"},
51 | {file = "cffi-1.16.0-cp312-cp312-win32.whl", hash = "sha256:b2ca4e77f9f47c55c194982e10f058db063937845bb2b7a86c84a6cfe0aefa8b"},
52 | {file = "cffi-1.16.0-cp312-cp312-win_amd64.whl", hash = "sha256:68678abf380b42ce21a5f2abde8efee05c114c2fdb2e9eef2efdb0257fba1235"},
53 | {file = "cffi-1.16.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:0c9ef6ff37e974b73c25eecc13952c55bceed9112be2d9d938ded8e856138bcc"},
54 | {file = "cffi-1.16.0-cp38-cp38-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:a09582f178759ee8128d9270cd1344154fd473bb77d94ce0aeb2a93ebf0feaf0"},
55 | {file = "cffi-1.16.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e760191dd42581e023a68b758769e2da259b5d52e3103c6060ddc02c9edb8d7b"},
56 | {file = "cffi-1.16.0-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:80876338e19c951fdfed6198e70bc88f1c9758b94578d5a7c4c91a87af3cf31c"},
57 | {file = "cffi-1.16.0-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:a6a14b17d7e17fa0d207ac08642c8820f84f25ce17a442fd15e27ea18d67c59b"},
58 | {file = "cffi-1.16.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6602bc8dc6f3a9e02b6c22c4fc1e47aa50f8f8e6d3f78a5e16ac33ef5fefa324"},
59 | {file = "cffi-1.16.0-cp38-cp38-win32.whl", hash = "sha256:131fd094d1065b19540c3d72594260f118b231090295d8c34e19a7bbcf2e860a"},
60 | {file = "cffi-1.16.0-cp38-cp38-win_amd64.whl", hash = "sha256:31d13b0f99e0836b7ff893d37af07366ebc90b678b6664c955b54561fc36ef36"},
61 | {file = "cffi-1.16.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:582215a0e9adbe0e379761260553ba11c58943e4bbe9c36430c4ca6ac74b15ed"},
62 | {file = "cffi-1.16.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:b29ebffcf550f9da55bec9e02ad430c992a87e5f512cd63388abb76f1036d8d2"},
63 | {file = "cffi-1.16.0-cp39-cp39-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:dc9b18bf40cc75f66f40a7379f6a9513244fe33c0e8aa72e2d56b0196a7ef872"},
64 | {file = "cffi-1.16.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9cb4a35b3642fc5c005a6755a5d17c6c8b6bcb6981baf81cea8bfbc8903e8ba8"},
65 | {file = "cffi-1.16.0-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:b86851a328eedc692acf81fb05444bdf1891747c25af7529e39ddafaf68a4f3f"},
66 | {file = "cffi-1.16.0-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:c0f31130ebc2d37cdd8e44605fb5fa7ad59049298b3f745c74fa74c62fbfcfc4"},
67 | {file = "cffi-1.16.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8f8e709127c6c77446a8c0a8c8bf3c8ee706a06cd44b1e827c3e6a2ee6b8c098"},
68 | {file = "cffi-1.16.0-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:748dcd1e3d3d7cd5443ef03ce8685043294ad6bd7c02a38d1bd367cfd968e000"},
69 | {file = "cffi-1.16.0-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:8895613bcc094d4a1b2dbe179d88d7fb4a15cee43c052e8885783fac397d91fe"},
70 | {file = "cffi-1.16.0-cp39-cp39-win32.whl", hash = "sha256:ed86a35631f7bfbb28e108dd96773b9d5a6ce4811cf6ea468bb6a359b256b1e4"},
71 | {file = "cffi-1.16.0-cp39-cp39-win_amd64.whl", hash = "sha256:3686dffb02459559c74dd3d81748269ffb0eb027c39a6fc99502de37d501faa8"},
72 | {file = "cffi-1.16.0.tar.gz", hash = "sha256:bcb3ef43e58665bbda2fb198698fcae6776483e0c4a631aa5647806c25e02cc0"},
73 | ]
74 |
75 | [package.dependencies]
76 | pycparser = "*"
77 |
78 | [[package]]
79 | name = "charset-normalizer"
80 | version = "3.3.2"
81 | description = "The Real First Universal Charset Detector. Open, modern and actively maintained alternative to Chardet."
82 | optional = false
83 | python-versions = ">=3.7.0"
84 | files = [
85 | {file = "charset-normalizer-3.3.2.tar.gz", hash = "sha256:f30c3cb33b24454a82faecaf01b19c18562b1e89558fb6c56de4d9118a032fd5"},
86 | {file = "charset_normalizer-3.3.2-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:25baf083bf6f6b341f4121c2f3c548875ee6f5339300e08be3f2b2ba1721cdd3"},
87 | {file = "charset_normalizer-3.3.2-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:06435b539f889b1f6f4ac1758871aae42dc3a8c0e24ac9e60c2384973ad73027"},
88 | {file = "charset_normalizer-3.3.2-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:9063e24fdb1e498ab71cb7419e24622516c4a04476b17a2dab57e8baa30d6e03"},
89 | {file = "charset_normalizer-3.3.2-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6897af51655e3691ff853668779c7bad41579facacf5fd7253b0133308cf000d"},
90 | {file = "charset_normalizer-3.3.2-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:1d3193f4a680c64b4b6a9115943538edb896edc190f0b222e73761716519268e"},
91 | {file = "charset_normalizer-3.3.2-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:cd70574b12bb8a4d2aaa0094515df2463cb429d8536cfb6c7ce983246983e5a6"},
92 | {file = "charset_normalizer-3.3.2-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8465322196c8b4d7ab6d1e049e4c5cb460d0394da4a27d23cc242fbf0034b6b5"},
93 | {file = "charset_normalizer-3.3.2-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:a9a8e9031d613fd2009c182b69c7b2c1ef8239a0efb1df3f7c8da66d5dd3d537"},
94 | {file = "charset_normalizer-3.3.2-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:beb58fe5cdb101e3a055192ac291b7a21e3b7ef4f67fa1d74e331a7f2124341c"},
95 | {file = "charset_normalizer-3.3.2-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:e06ed3eb3218bc64786f7db41917d4e686cc4856944f53d5bdf83a6884432e12"},
96 | {file = "charset_normalizer-3.3.2-cp310-cp310-musllinux_1_1_ppc64le.whl", hash = "sha256:2e81c7b9c8979ce92ed306c249d46894776a909505d8f5a4ba55b14206e3222f"},
97 | {file = "charset_normalizer-3.3.2-cp310-cp310-musllinux_1_1_s390x.whl", hash = "sha256:572c3763a264ba47b3cf708a44ce965d98555f618ca42c926a9c1616d8f34269"},
98 | {file = "charset_normalizer-3.3.2-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:fd1abc0d89e30cc4e02e4064dc67fcc51bd941eb395c502aac3ec19fab46b519"},
99 | {file = "charset_normalizer-3.3.2-cp310-cp310-win32.whl", hash = "sha256:3d47fa203a7bd9c5b6cee4736ee84ca03b8ef23193c0d1ca99b5089f72645c73"},
100 | {file = "charset_normalizer-3.3.2-cp310-cp310-win_amd64.whl", hash = "sha256:10955842570876604d404661fbccbc9c7e684caf432c09c715ec38fbae45ae09"},
101 | {file = "charset_normalizer-3.3.2-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:802fe99cca7457642125a8a88a084cef28ff0cf9407060f7b93dca5aa25480db"},
102 | {file = "charset_normalizer-3.3.2-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:573f6eac48f4769d667c4442081b1794f52919e7edada77495aaed9236d13a96"},
103 | {file = "charset_normalizer-3.3.2-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:549a3a73da901d5bc3ce8d24e0600d1fa85524c10287f6004fbab87672bf3e1e"},
104 | {file = "charset_normalizer-3.3.2-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f27273b60488abe721a075bcca6d7f3964f9f6f067c8c4c605743023d7d3944f"},
105 | {file = "charset_normalizer-3.3.2-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:1ceae2f17a9c33cb48e3263960dc5fc8005351ee19db217e9b1bb15d28c02574"},
106 | {file = "charset_normalizer-3.3.2-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:65f6f63034100ead094b8744b3b97965785388f308a64cf8d7c34f2f2e5be0c4"},
107 | {file = "charset_normalizer-3.3.2-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:753f10e867343b4511128c6ed8c82f7bec3bd026875576dfd88483c5c73b2fd8"},
108 | {file = "charset_normalizer-3.3.2-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:4a78b2b446bd7c934f5dcedc588903fb2f5eec172f3d29e52a9096a43722adfc"},
109 | {file = "charset_normalizer-3.3.2-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:e537484df0d8f426ce2afb2d0f8e1c3d0b114b83f8850e5f2fbea0e797bd82ae"},
110 | {file = "charset_normalizer-3.3.2-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:eb6904c354526e758fda7167b33005998fb68c46fbc10e013ca97f21ca5c8887"},
111 | {file = "charset_normalizer-3.3.2-cp311-cp311-musllinux_1_1_ppc64le.whl", hash = "sha256:deb6be0ac38ece9ba87dea880e438f25ca3eddfac8b002a2ec3d9183a454e8ae"},
112 | {file = "charset_normalizer-3.3.2-cp311-cp311-musllinux_1_1_s390x.whl", hash = "sha256:4ab2fe47fae9e0f9dee8c04187ce5d09f48eabe611be8259444906793ab7cbce"},
113 | {file = "charset_normalizer-3.3.2-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:80402cd6ee291dcb72644d6eac93785fe2c8b9cb30893c1af5b8fdd753b9d40f"},
114 | {file = "charset_normalizer-3.3.2-cp311-cp311-win32.whl", hash = "sha256:7cd13a2e3ddeed6913a65e66e94b51d80a041145a026c27e6bb76c31a853c6ab"},
115 | {file = "charset_normalizer-3.3.2-cp311-cp311-win_amd64.whl", hash = "sha256:663946639d296df6a2bb2aa51b60a2454ca1cb29835324c640dafb5ff2131a77"},
116 | {file = "charset_normalizer-3.3.2-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:0b2b64d2bb6d3fb9112bafa732def486049e63de9618b5843bcdd081d8144cd8"},
117 | {file = "charset_normalizer-3.3.2-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:ddbb2551d7e0102e7252db79ba445cdab71b26640817ab1e3e3648dad515003b"},
118 | {file = "charset_normalizer-3.3.2-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:55086ee1064215781fff39a1af09518bc9255b50d6333f2e4c74ca09fac6a8f6"},
119 | {file = "charset_normalizer-3.3.2-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8f4a014bc36d3c57402e2977dada34f9c12300af536839dc38c0beab8878f38a"},
120 | {file = "charset_normalizer-3.3.2-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:a10af20b82360ab00827f916a6058451b723b4e65030c5a18577c8b2de5b3389"},
121 | {file = "charset_normalizer-3.3.2-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:8d756e44e94489e49571086ef83b2bb8ce311e730092d2c34ca8f7d925cb20aa"},
122 | {file = "charset_normalizer-3.3.2-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:90d558489962fd4918143277a773316e56c72da56ec7aa3dc3dbbe20fdfed15b"},
123 | {file = "charset_normalizer-3.3.2-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:6ac7ffc7ad6d040517be39eb591cac5ff87416c2537df6ba3cba3bae290c0fed"},
124 | {file = "charset_normalizer-3.3.2-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:7ed9e526742851e8d5cc9e6cf41427dfc6068d4f5a3bb03659444b4cabf6bc26"},
125 | {file = "charset_normalizer-3.3.2-cp312-cp312-musllinux_1_1_i686.whl", hash = "sha256:8bdb58ff7ba23002a4c5808d608e4e6c687175724f54a5dade5fa8c67b604e4d"},
126 | {file = "charset_normalizer-3.3.2-cp312-cp312-musllinux_1_1_ppc64le.whl", hash = "sha256:6b3251890fff30ee142c44144871185dbe13b11bab478a88887a639655be1068"},
127 | {file = "charset_normalizer-3.3.2-cp312-cp312-musllinux_1_1_s390x.whl", hash = "sha256:b4a23f61ce87adf89be746c8a8974fe1c823c891d8f86eb218bb957c924bb143"},
128 | {file = "charset_normalizer-3.3.2-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:efcb3f6676480691518c177e3b465bcddf57cea040302f9f4e6e191af91174d4"},
129 | {file = "charset_normalizer-3.3.2-cp312-cp312-win32.whl", hash = "sha256:d965bba47ddeec8cd560687584e88cf699fd28f192ceb452d1d7ee807c5597b7"},
130 | {file = "charset_normalizer-3.3.2-cp312-cp312-win_amd64.whl", hash = "sha256:96b02a3dc4381e5494fad39be677abcb5e6634bf7b4fa83a6dd3112607547001"},
131 | {file = "charset_normalizer-3.3.2-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:95f2a5796329323b8f0512e09dbb7a1860c46a39da62ecb2324f116fa8fdc85c"},
132 | {file = "charset_normalizer-3.3.2-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c002b4ffc0be611f0d9da932eb0f704fe2602a9a949d1f738e4c34c75b0863d5"},
133 | {file = "charset_normalizer-3.3.2-cp37-cp37m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:a981a536974bbc7a512cf44ed14938cf01030a99e9b3a06dd59578882f06f985"},
134 | {file = "charset_normalizer-3.3.2-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:3287761bc4ee9e33561a7e058c72ac0938c4f57fe49a09eae428fd88aafe7bb6"},
135 | {file = "charset_normalizer-3.3.2-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:42cb296636fcc8b0644486d15c12376cb9fa75443e00fb25de0b8602e64c1714"},
136 | {file = "charset_normalizer-3.3.2-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:0a55554a2fa0d408816b3b5cedf0045f4b8e1a6065aec45849de2d6f3f8e9786"},
137 | {file = "charset_normalizer-3.3.2-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:c083af607d2515612056a31f0a8d9e0fcb5876b7bfc0abad3ecd275bc4ebc2d5"},
138 | {file = "charset_normalizer-3.3.2-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:87d1351268731db79e0f8e745d92493ee2841c974128ef629dc518b937d9194c"},
139 | {file = "charset_normalizer-3.3.2-cp37-cp37m-musllinux_1_1_ppc64le.whl", hash = "sha256:bd8f7df7d12c2db9fab40bdd87a7c09b1530128315d047a086fa3ae3435cb3a8"},
140 | {file = "charset_normalizer-3.3.2-cp37-cp37m-musllinux_1_1_s390x.whl", hash = "sha256:c180f51afb394e165eafe4ac2936a14bee3eb10debc9d9e4db8958fe36afe711"},
141 | {file = "charset_normalizer-3.3.2-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:8c622a5fe39a48f78944a87d4fb8a53ee07344641b0562c540d840748571b811"},
142 | {file = "charset_normalizer-3.3.2-cp37-cp37m-win32.whl", hash = "sha256:db364eca23f876da6f9e16c9da0df51aa4f104a972735574842618b8c6d999d4"},
143 | {file = "charset_normalizer-3.3.2-cp37-cp37m-win_amd64.whl", hash = "sha256:86216b5cee4b06df986d214f664305142d9c76df9b6512be2738aa72a2048f99"},
144 | {file = "charset_normalizer-3.3.2-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:6463effa3186ea09411d50efc7d85360b38d5f09b870c48e4600f63af490e56a"},
145 | {file = "charset_normalizer-3.3.2-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:6c4caeef8fa63d06bd437cd4bdcf3ffefe6738fb1b25951440d80dc7df8c03ac"},
146 | {file = "charset_normalizer-3.3.2-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:37e55c8e51c236f95b033f6fb391d7d7970ba5fe7ff453dad675e88cf303377a"},
147 | {file = "charset_normalizer-3.3.2-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:fb69256e180cb6c8a894fee62b3afebae785babc1ee98b81cdf68bbca1987f33"},
148 | {file = "charset_normalizer-3.3.2-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:ae5f4161f18c61806f411a13b0310bea87f987c7d2ecdbdaad0e94eb2e404238"},
149 | {file = "charset_normalizer-3.3.2-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:b2b0a0c0517616b6869869f8c581d4eb2dd83a4d79e0ebcb7d373ef9956aeb0a"},
150 | {file = "charset_normalizer-3.3.2-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:45485e01ff4d3630ec0d9617310448a8702f70e9c01906b0d0118bdf9d124cf2"},
151 | {file = "charset_normalizer-3.3.2-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:eb00ed941194665c332bf8e078baf037d6c35d7c4f3102ea2d4f16ca94a26dc8"},
152 | {file = "charset_normalizer-3.3.2-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:2127566c664442652f024c837091890cb1942c30937add288223dc895793f898"},
153 | {file = "charset_normalizer-3.3.2-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:a50aebfa173e157099939b17f18600f72f84eed3049e743b68ad15bd69b6bf99"},
154 | {file = "charset_normalizer-3.3.2-cp38-cp38-musllinux_1_1_ppc64le.whl", hash = "sha256:4d0d1650369165a14e14e1e47b372cfcb31d6ab44e6e33cb2d4e57265290044d"},
155 | {file = "charset_normalizer-3.3.2-cp38-cp38-musllinux_1_1_s390x.whl", hash = "sha256:923c0c831b7cfcb071580d3f46c4baf50f174be571576556269530f4bbd79d04"},
156 | {file = "charset_normalizer-3.3.2-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:06a81e93cd441c56a9b65d8e1d043daeb97a3d0856d177d5c90ba85acb3db087"},
157 | {file = "charset_normalizer-3.3.2-cp38-cp38-win32.whl", hash = "sha256:6ef1d82a3af9d3eecdba2321dc1b3c238245d890843e040e41e470ffa64c3e25"},
158 | {file = "charset_normalizer-3.3.2-cp38-cp38-win_amd64.whl", hash = "sha256:eb8821e09e916165e160797a6c17edda0679379a4be5c716c260e836e122f54b"},
159 | {file = "charset_normalizer-3.3.2-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:c235ebd9baae02f1b77bcea61bce332cb4331dc3617d254df3323aa01ab47bd4"},
160 | {file = "charset_normalizer-3.3.2-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:5b4c145409bef602a690e7cfad0a15a55c13320ff7a3ad7ca59c13bb8ba4d45d"},
161 | {file = "charset_normalizer-3.3.2-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:68d1f8a9e9e37c1223b656399be5d6b448dea850bed7d0f87a8311f1ff3dabb0"},
162 | {file = "charset_normalizer-3.3.2-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:22afcb9f253dac0696b5a4be4a1c0f8762f8239e21b99680099abd9b2b1b2269"},
163 | {file = "charset_normalizer-3.3.2-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:e27ad930a842b4c5eb8ac0016b0a54f5aebbe679340c26101df33424142c143c"},
164 | {file = "charset_normalizer-3.3.2-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:1f79682fbe303db92bc2b1136016a38a42e835d932bab5b3b1bfcfbf0640e519"},
165 | {file = "charset_normalizer-3.3.2-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b261ccdec7821281dade748d088bb6e9b69e6d15b30652b74cbbac25e280b796"},
166 | {file = "charset_normalizer-3.3.2-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:122c7fa62b130ed55f8f285bfd56d5f4b4a5b503609d181f9ad85e55c89f4185"},
167 | {file = "charset_normalizer-3.3.2-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:d0eccceffcb53201b5bfebb52600a5fb483a20b61da9dbc885f8b103cbe7598c"},
168 | {file = "charset_normalizer-3.3.2-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:9f96df6923e21816da7e0ad3fd47dd8f94b2a5ce594e00677c0013018b813458"},
169 | {file = "charset_normalizer-3.3.2-cp39-cp39-musllinux_1_1_ppc64le.whl", hash = "sha256:7f04c839ed0b6b98b1a7501a002144b76c18fb1c1850c8b98d458ac269e26ed2"},
170 | {file = "charset_normalizer-3.3.2-cp39-cp39-musllinux_1_1_s390x.whl", hash = "sha256:34d1c8da1e78d2e001f363791c98a272bb734000fcef47a491c1e3b0505657a8"},
171 | {file = "charset_normalizer-3.3.2-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:ff8fa367d09b717b2a17a052544193ad76cd49979c805768879cb63d9ca50561"},
172 | {file = "charset_normalizer-3.3.2-cp39-cp39-win32.whl", hash = "sha256:aed38f6e4fb3f5d6bf81bfa990a07806be9d83cf7bacef998ab1a9bd660a581f"},
173 | {file = "charset_normalizer-3.3.2-cp39-cp39-win_amd64.whl", hash = "sha256:b01b88d45a6fcb69667cd6d2f7a9aeb4bf53760d7fc536bf679ec94fe9f3ff3d"},
174 | {file = "charset_normalizer-3.3.2-py3-none-any.whl", hash = "sha256:3e4d1f6587322d2788836a99c69062fbb091331ec940e02d12d179c1d53e25fc"},
175 | ]
176 |
177 | [[package]]
178 | name = "colorama"
179 | version = "0.4.6"
180 | description = "Cross-platform colored terminal text."
181 | optional = false
182 | python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*,!=3.5.*,!=3.6.*,>=2.7"
183 | files = [
184 | {file = "colorama-0.4.6-py2.py3-none-any.whl", hash = "sha256:4f1d9991f5acc0ca119f9d443620b77f9d6b33703e51011c16baf57afb285fc6"},
185 | {file = "colorama-0.4.6.tar.gz", hash = "sha256:08695f5cb7ed6e0531a20572697297273c47b8cae5a63ffc6d6ed5c201be6e44"},
186 | ]
187 |
188 | [[package]]
189 | name = "cryptography"
190 | version = "41.0.7"
191 | description = "cryptography is a package which provides cryptographic recipes and primitives to Python developers."
192 | optional = false
193 | python-versions = ">=3.7"
194 | files = [
195 | {file = "cryptography-41.0.7-cp37-abi3-macosx_10_12_universal2.whl", hash = "sha256:3c78451b78313fa81607fa1b3f1ae0a5ddd8014c38a02d9db0616133987b9cdf"},
196 | {file = "cryptography-41.0.7-cp37-abi3-macosx_10_12_x86_64.whl", hash = "sha256:928258ba5d6f8ae644e764d0f996d61a8777559f72dfeb2eea7e2fe0ad6e782d"},
197 | {file = "cryptography-41.0.7-cp37-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5a1b41bc97f1ad230a41657d9155113c7521953869ae57ac39ac7f1bb471469a"},
198 | {file = "cryptography-41.0.7-cp37-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:841df4caa01008bad253bce2a6f7b47f86dc9f08df4b433c404def869f590a15"},
199 | {file = "cryptography-41.0.7-cp37-abi3-manylinux_2_28_aarch64.whl", hash = "sha256:5429ec739a29df2e29e15d082f1d9ad683701f0ec7709ca479b3ff2708dae65a"},
200 | {file = "cryptography-41.0.7-cp37-abi3-manylinux_2_28_x86_64.whl", hash = "sha256:43f2552a2378b44869fe8827aa19e69512e3245a219104438692385b0ee119d1"},
201 | {file = "cryptography-41.0.7-cp37-abi3-musllinux_1_1_aarch64.whl", hash = "sha256:af03b32695b24d85a75d40e1ba39ffe7db7ffcb099fe507b39fd41a565f1b157"},
202 | {file = "cryptography-41.0.7-cp37-abi3-musllinux_1_1_x86_64.whl", hash = "sha256:49f0805fc0b2ac8d4882dd52f4a3b935b210935d500b6b805f321addc8177406"},
203 | {file = "cryptography-41.0.7-cp37-abi3-win32.whl", hash = "sha256:f983596065a18a2183e7f79ab3fd4c475205b839e02cbc0efbbf9666c4b3083d"},
204 | {file = "cryptography-41.0.7-cp37-abi3-win_amd64.whl", hash = "sha256:90452ba79b8788fa380dfb587cca692976ef4e757b194b093d845e8d99f612f2"},
205 | {file = "cryptography-41.0.7-pp310-pypy310_pp73-macosx_10_12_x86_64.whl", hash = "sha256:079b85658ea2f59c4f43b70f8119a52414cdb7be34da5d019a77bf96d473b960"},
206 | {file = "cryptography-41.0.7-pp310-pypy310_pp73-manylinux_2_28_aarch64.whl", hash = "sha256:b640981bf64a3e978a56167594a0e97db71c89a479da8e175d8bb5be5178c003"},
207 | {file = "cryptography-41.0.7-pp310-pypy310_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:e3114da6d7f95d2dee7d3f4eec16dacff819740bbab931aff8648cb13c5ff5e7"},
208 | {file = "cryptography-41.0.7-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:d5ec85080cce7b0513cfd233914eb8b7bbd0633f1d1703aa28d1dd5a72f678ec"},
209 | {file = "cryptography-41.0.7-pp38-pypy38_pp73-macosx_10_12_x86_64.whl", hash = "sha256:7a698cb1dac82c35fcf8fe3417a3aaba97de16a01ac914b89a0889d364d2f6be"},
210 | {file = "cryptography-41.0.7-pp38-pypy38_pp73-manylinux_2_28_aarch64.whl", hash = "sha256:37a138589b12069efb424220bf78eac59ca68b95696fc622b6ccc1c0a197204a"},
211 | {file = "cryptography-41.0.7-pp38-pypy38_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:68a2dec79deebc5d26d617bfdf6e8aab065a4f34934b22d3b5010df3ba36612c"},
212 | {file = "cryptography-41.0.7-pp38-pypy38_pp73-win_amd64.whl", hash = "sha256:09616eeaef406f99046553b8a40fbf8b1e70795a91885ba4c96a70793de5504a"},
213 | {file = "cryptography-41.0.7-pp39-pypy39_pp73-macosx_10_12_x86_64.whl", hash = "sha256:48a0476626da912a44cc078f9893f292f0b3e4c739caf289268168d8f4702a39"},
214 | {file = "cryptography-41.0.7-pp39-pypy39_pp73-manylinux_2_28_aarch64.whl", hash = "sha256:c7f3201ec47d5207841402594f1d7950879ef890c0c495052fa62f58283fde1a"},
215 | {file = "cryptography-41.0.7-pp39-pypy39_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:c5ca78485a255e03c32b513f8c2bc39fedb7f5c5f8535545bdc223a03b24f248"},
216 | {file = "cryptography-41.0.7-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:d6c391c021ab1f7a82da5d8d0b3cee2f4b2c455ec86c8aebbc84837a631ff309"},
217 | {file = "cryptography-41.0.7.tar.gz", hash = "sha256:13f93ce9bea8016c253b34afc6bd6a75993e5c40672ed5405a9c832f0d4a00bc"},
218 | ]
219 |
220 | [package.dependencies]
221 | cffi = ">=1.12"
222 |
223 | [package.extras]
224 | docs = ["sphinx (>=5.3.0)", "sphinx-rtd-theme (>=1.1.1)"]
225 | docstest = ["pyenchant (>=1.6.11)", "sphinxcontrib-spelling (>=4.0.1)", "twine (>=1.12.0)"]
226 | nox = ["nox"]
227 | pep8test = ["black", "check-sdist", "mypy", "ruff"]
228 | sdist = ["build"]
229 | ssh = ["bcrypt (>=3.1.5)"]
230 | test = ["pretend", "pytest (>=6.2.0)", "pytest-benchmark", "pytest-cov", "pytest-xdist"]
231 | test-randomorder = ["pytest-randomly"]
232 |
233 | [[package]]
234 | name = "emoji"
235 | version = "0.6.0"
236 | description = "Emoji for Python"
237 | optional = false
238 | python-versions = "*"
239 | files = [
240 | {file = "emoji-0.6.0.tar.gz", hash = "sha256:e42da4f8d648f8ef10691bc246f682a1ec6b18373abfd9be10ec0b398823bd11"},
241 | ]
242 |
243 | [package.extras]
244 | dev = ["coverage", "coveralls", "pytest"]
245 |
246 | [[package]]
247 | name = "github3-py"
248 | version = "4.0.1"
249 | description = "Python wrapper for the GitHub API(http://developer.github.com/v3)"
250 | optional = false
251 | python-versions = ">=3.7"
252 | files = [
253 | {file = "github3.py-4.0.1-py3-none-any.whl", hash = "sha256:a89af7de25650612d1da2f0609622bcdeb07ee8a45a1c06b2d16a05e4234e753"},
254 | {file = "github3.py-4.0.1.tar.gz", hash = "sha256:30d571076753efc389edc7f9aaef338a4fcb24b54d8968d5f39b1342f45ddd36"},
255 | ]
256 |
257 | [package.dependencies]
258 | pyjwt = {version = ">=2.3.0", extras = ["crypto"]}
259 | python-dateutil = ">=2.6.0"
260 | requests = ">=2.18"
261 | uritemplate = ">=3.0.0"
262 |
263 | [package.extras]
264 | dev = ["build", "github3-py[test]", "tox (>=3.1.3)", "twine", "wheel"]
265 | test = ["betamax (>=0.5.1)", "betamax-matchers (>=0.3.0)", "pytest (>=7.0)", "pytest-xdist[psutil]"]
266 |
267 | [[package]]
268 | name = "idna"
269 | version = "3.6"
270 | description = "Internationalized Domain Names in Applications (IDNA)"
271 | optional = false
272 | python-versions = ">=3.5"
273 | files = [
274 | {file = "idna-3.6-py3-none-any.whl", hash = "sha256:c05567e9c24a6b9faaa835c4821bad0590fbb9d5779e7caa6e1cc4978e7eb24f"},
275 | {file = "idna-3.6.tar.gz", hash = "sha256:9ecdbbd083b06798ae1e86adcbfe8ab1479cf864e4ee30fe4e46a003d12491ca"},
276 | ]
277 |
278 | [[package]]
279 | name = "loguru"
280 | version = "0.7.2"
281 | description = "Python logging made (stupidly) simple"
282 | optional = false
283 | python-versions = ">=3.5"
284 | files = [
285 | {file = "loguru-0.7.2-py3-none-any.whl", hash = "sha256:003d71e3d3ed35f0f8984898359d65b79e5b21943f78af86aa5491210429b8eb"},
286 | {file = "loguru-0.7.2.tar.gz", hash = "sha256:e671a53522515f34fd406340ee968cb9ecafbc4b36c679da03c18fd8d0bd51ac"},
287 | ]
288 |
289 | [package.dependencies]
290 | colorama = {version = ">=0.3.4", markers = "sys_platform == \"win32\""}
291 | win32-setctime = {version = ">=1.0.0", markers = "sys_platform == \"win32\""}
292 |
293 | [package.extras]
294 | dev = ["Sphinx (==7.2.5)", "colorama (==0.4.5)", "colorama (==0.4.6)", "exceptiongroup (==1.1.3)", "freezegun (==1.1.0)", "freezegun (==1.2.2)", "mypy (==v0.910)", "mypy (==v0.971)", "mypy (==v1.4.1)", "mypy (==v1.5.1)", "pre-commit (==3.4.0)", "pytest (==6.1.2)", "pytest (==7.4.0)", "pytest-cov (==2.12.1)", "pytest-cov (==4.1.0)", "pytest-mypy-plugins (==1.9.3)", "pytest-mypy-plugins (==3.0.0)", "sphinx-autobuild (==2021.3.14)", "sphinx-rtd-theme (==1.3.0)", "tox (==3.27.1)", "tox (==4.11.0)"]
295 |
296 | [[package]]
297 | name = "mypy"
298 | version = "1.7.1"
299 | description = "Optional static typing for Python"
300 | optional = false
301 | python-versions = ">=3.8"
302 | files = [
303 | {file = "mypy-1.7.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:12cce78e329838d70a204293e7b29af9faa3ab14899aec397798a4b41be7f340"},
304 | {file = "mypy-1.7.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:1484b8fa2c10adf4474f016e09d7a159602f3239075c7bf9f1627f5acf40ad49"},
305 | {file = "mypy-1.7.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:31902408f4bf54108bbfb2e35369877c01c95adc6192958684473658c322c8a5"},
306 | {file = "mypy-1.7.1-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:f2c2521a8e4d6d769e3234350ba7b65ff5d527137cdcde13ff4d99114b0c8e7d"},
307 | {file = "mypy-1.7.1-cp310-cp310-win_amd64.whl", hash = "sha256:fcd2572dd4519e8a6642b733cd3a8cfc1ef94bafd0c1ceed9c94fe736cb65b6a"},
308 | {file = "mypy-1.7.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:4b901927f16224d0d143b925ce9a4e6b3a758010673eeded9b748f250cf4e8f7"},
309 | {file = "mypy-1.7.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:2f7f6985d05a4e3ce8255396df363046c28bea790e40617654e91ed580ca7c51"},
310 | {file = "mypy-1.7.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:944bdc21ebd620eafefc090cdf83158393ec2b1391578359776c00de00e8907a"},
311 | {file = "mypy-1.7.1-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:9c7ac372232c928fff0645d85f273a726970c014749b924ce5710d7d89763a28"},
312 | {file = "mypy-1.7.1-cp311-cp311-win_amd64.whl", hash = "sha256:f6efc9bd72258f89a3816e3a98c09d36f079c223aa345c659622f056b760ab42"},
313 | {file = "mypy-1.7.1-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:6dbdec441c60699288adf051f51a5d512b0d818526d1dcfff5a41f8cd8b4aaf1"},
314 | {file = "mypy-1.7.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:4fc3d14ee80cd22367caaaf6e014494415bf440980a3045bf5045b525680ac33"},
315 | {file = "mypy-1.7.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2c6e4464ed5f01dc44dc9821caf67b60a4e5c3b04278286a85c067010653a0eb"},
316 | {file = "mypy-1.7.1-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:d9b338c19fa2412f76e17525c1b4f2c687a55b156320acb588df79f2e6fa9fea"},
317 | {file = "mypy-1.7.1-cp312-cp312-win_amd64.whl", hash = "sha256:204e0d6de5fd2317394a4eff62065614c4892d5a4d1a7ee55b765d7a3d9e3f82"},
318 | {file = "mypy-1.7.1-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:84860e06ba363d9c0eeabd45ac0fde4b903ad7aa4f93cd8b648385a888e23200"},
319 | {file = "mypy-1.7.1-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:8c5091ebd294f7628eb25ea554852a52058ac81472c921150e3a61cdd68f75a7"},
320 | {file = "mypy-1.7.1-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:40716d1f821b89838589e5b3106ebbc23636ffdef5abc31f7cd0266db936067e"},
321 | {file = "mypy-1.7.1-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:5cf3f0c5ac72139797953bd50bc6c95ac13075e62dbfcc923571180bebb662e9"},
322 | {file = "mypy-1.7.1-cp38-cp38-win_amd64.whl", hash = "sha256:78e25b2fd6cbb55ddfb8058417df193f0129cad5f4ee75d1502248e588d9e0d7"},
323 | {file = "mypy-1.7.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:75c4d2a6effd015786c87774e04331b6da863fc3fc4e8adfc3b40aa55ab516fe"},
324 | {file = "mypy-1.7.1-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:2643d145af5292ee956aa0a83c2ce1038a3bdb26e033dadeb2f7066fb0c9abce"},
325 | {file = "mypy-1.7.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:75aa828610b67462ffe3057d4d8a4112105ed211596b750b53cbfe182f44777a"},
326 | {file = "mypy-1.7.1-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:ee5d62d28b854eb61889cde4e1dbc10fbaa5560cb39780c3995f6737f7e82120"},
327 | {file = "mypy-1.7.1-cp39-cp39-win_amd64.whl", hash = "sha256:72cf32ce7dd3562373f78bd751f73c96cfb441de147cc2448a92c1a308bd0ca6"},
328 | {file = "mypy-1.7.1-py3-none-any.whl", hash = "sha256:f7c5d642db47376a0cc130f0de6d055056e010debdaf0707cd2b0fc7e7ef30ea"},
329 | {file = "mypy-1.7.1.tar.gz", hash = "sha256:fcb6d9afb1b6208b4c712af0dafdc650f518836065df0d4fb1d800f5d6773db2"},
330 | ]
331 |
332 | [package.dependencies]
333 | mypy-extensions = ">=1.0.0"
334 | tomli = {version = ">=1.1.0", markers = "python_version < \"3.11\""}
335 | typing-extensions = ">=4.1.0"
336 |
337 | [package.extras]
338 | dmypy = ["psutil (>=4.0)"]
339 | install-types = ["pip"]
340 | mypyc = ["setuptools (>=50)"]
341 | reports = ["lxml"]
342 |
343 | [[package]]
344 | name = "mypy-extensions"
345 | version = "1.0.0"
346 | description = "Type system extensions for programs checked with the mypy type checker."
347 | optional = false
348 | python-versions = ">=3.5"
349 | files = [
350 | {file = "mypy_extensions-1.0.0-py3-none-any.whl", hash = "sha256:4392f6c0eb8a5668a69e23d168ffa70f0be9ccfd32b5cc2d26a34ae5b844552d"},
351 | {file = "mypy_extensions-1.0.0.tar.gz", hash = "sha256:75dbf8955dc00442a438fc4d0666508a9a97b6bd41aa2f0ffe9d2f2725af0782"},
352 | ]
353 |
354 | [[package]]
355 | name = "numerize"
356 | version = "0.12"
357 | description = "Convert large numbers into readable numbers for humans."
358 | optional = false
359 | python-versions = "*"
360 | files = [
361 | {file = "numerize-0.12.tar.gz", hash = "sha256:5548fe72adceb2c7964998179697d80117bb117f57cd02f872cf5db40d615c04"},
362 | ]
363 |
364 | [[package]]
365 | name = "pycparser"
366 | version = "2.21"
367 | description = "C parser in Python"
368 | optional = false
369 | python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*"
370 | files = [
371 | {file = "pycparser-2.21-py2.py3-none-any.whl", hash = "sha256:8ee45429555515e1f6b185e78100aea234072576aa43ab53aefcae078162fca9"},
372 | {file = "pycparser-2.21.tar.gz", hash = "sha256:e644fdec12f7872f86c58ff790da456218b10f863970249516d60a5eaca77206"},
373 | ]
374 |
375 | [[package]]
376 | name = "pyjwt"
377 | version = "2.8.0"
378 | description = "JSON Web Token implementation in Python"
379 | optional = false
380 | python-versions = ">=3.7"
381 | files = [
382 | {file = "PyJWT-2.8.0-py3-none-any.whl", hash = "sha256:59127c392cc44c2da5bb3192169a91f429924e17aff6534d70fdc02ab3e04320"},
383 | {file = "PyJWT-2.8.0.tar.gz", hash = "sha256:57e28d156e3d5c10088e0c68abb90bfac3df82b40a71bd0daa20c65ccd5c23de"},
384 | ]
385 |
386 | [package.dependencies]
387 | cryptography = {version = ">=3.4.0", optional = true, markers = "extra == \"crypto\""}
388 |
389 | [package.extras]
390 | crypto = ["cryptography (>=3.4.0)"]
391 | dev = ["coverage[toml] (==5.0.4)", "cryptography (>=3.4.0)", "pre-commit", "pytest (>=6.0.0,<7.0.0)", "sphinx (>=4.5.0,<5.0.0)", "sphinx-rtd-theme", "zope.interface"]
392 | docs = ["sphinx (>=4.5.0,<5.0.0)", "sphinx-rtd-theme", "zope.interface"]
393 | tests = ["coverage[toml] (==5.0.4)", "pytest (>=6.0.0,<7.0.0)"]
394 |
395 | [[package]]
396 | name = "python-dateutil"
397 | version = "2.8.2"
398 | description = "Extensions to the standard Python datetime module"
399 | optional = false
400 | python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,>=2.7"
401 | files = [
402 | {file = "python-dateutil-2.8.2.tar.gz", hash = "sha256:0123cacc1627ae19ddf3c27a5de5bd67ee4586fbdd6440d9748f8abb483d3e86"},
403 | {file = "python_dateutil-2.8.2-py2.py3-none-any.whl", hash = "sha256:961d03dc3453ebbc59dbdea9e4e11c5651520a876d0f4db161e8674aae935da9"},
404 | ]
405 |
406 | [package.dependencies]
407 | six = ">=1.5"
408 |
409 | [[package]]
410 | name = "python-slugify"
411 | version = "4.0.1"
412 | description = "A Python Slugify application that handles Unicode"
413 | optional = false
414 | python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*"
415 | files = [
416 | {file = "python-slugify-4.0.1.tar.gz", hash = "sha256:69a517766e00c1268e5bbfc0d010a0a8508de0b18d30ad5a1ff357f8ae724270"},
417 | ]
418 |
419 | [package.dependencies]
420 | text-unidecode = ">=1.3"
421 |
422 | [package.extras]
423 | unidecode = ["Unidecode (>=1.1.1)"]
424 |
425 | [[package]]
426 | name = "requests"
427 | version = "2.31.0"
428 | description = "Python HTTP for Humans."
429 | optional = false
430 | python-versions = ">=3.7"
431 | files = [
432 | {file = "requests-2.31.0-py3-none-any.whl", hash = "sha256:58cd2187c01e70e6e26505bca751777aa9f2ee0b7f4300988b709f44e013003f"},
433 | {file = "requests-2.31.0.tar.gz", hash = "sha256:942c5a758f98d790eaed1a29cb6eefc7ffb0d1cf7af05c3d2791656dbd6ad1e1"},
434 | ]
435 |
436 | [package.dependencies]
437 | certifi = ">=2017.4.17"
438 | charset-normalizer = ">=2,<4"
439 | idna = ">=2.5,<4"
440 | urllib3 = ">=1.21.1,<3"
441 |
442 | [package.extras]
443 | socks = ["PySocks (>=1.5.6,!=1.5.7)"]
444 | use-chardet-on-py3 = ["chardet (>=3.0.2,<6)"]
445 |
446 | [[package]]
447 | name = "ruff"
448 | version = "0.1.8"
449 | description = "An extremely fast Python linter and code formatter, written in Rust."
450 | optional = false
451 | python-versions = ">=3.7"
452 | files = [
453 | {file = "ruff-0.1.8-py3-none-macosx_10_12_x86_64.macosx_11_0_arm64.macosx_10_12_universal2.whl", hash = "sha256:7de792582f6e490ae6aef36a58d85df9f7a0cfd1b0d4fe6b4fb51803a3ac96fa"},
454 | {file = "ruff-0.1.8-py3-none-macosx_10_12_x86_64.whl", hash = "sha256:c8e3255afd186c142eef4ec400d7826134f028a85da2146102a1172ecc7c3696"},
455 | {file = "ruff-0.1.8-py3-none-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ff78a7583020da124dd0deb835ece1d87bb91762d40c514ee9b67a087940528b"},
456 | {file = "ruff-0.1.8-py3-none-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:bd8ee69b02e7bdefe1e5da2d5b6eaaddcf4f90859f00281b2333c0e3a0cc9cd6"},
457 | {file = "ruff-0.1.8-py3-none-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:a05b0ddd7ea25495e4115a43125e8a7ebed0aa043c3d432de7e7d6e8e8cd6448"},
458 | {file = "ruff-0.1.8-py3-none-manylinux_2_17_ppc64.manylinux2014_ppc64.whl", hash = "sha256:e6f08ca730f4dc1b76b473bdf30b1b37d42da379202a059eae54ec7fc1fbcfed"},
459 | {file = "ruff-0.1.8-py3-none-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:f35960b02df6b827c1b903091bb14f4b003f6cf102705efc4ce78132a0aa5af3"},
460 | {file = "ruff-0.1.8-py3-none-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:7d076717c67b34c162da7c1a5bda16ffc205e0e0072c03745275e7eab888719f"},
461 | {file = "ruff-0.1.8-py3-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b6a21ab023124eafb7cef6d038f835cb1155cd5ea798edd8d9eb2f8b84be07d9"},
462 | {file = "ruff-0.1.8-py3-none-musllinux_1_2_aarch64.whl", hash = "sha256:ce697c463458555027dfb194cb96d26608abab920fa85213deb5edf26e026664"},
463 | {file = "ruff-0.1.8-py3-none-musllinux_1_2_armv7l.whl", hash = "sha256:db6cedd9ffed55548ab313ad718bc34582d394e27a7875b4b952c2d29c001b26"},
464 | {file = "ruff-0.1.8-py3-none-musllinux_1_2_i686.whl", hash = "sha256:05ffe9dbd278965271252704eddb97b4384bf58b971054d517decfbf8c523f05"},
465 | {file = "ruff-0.1.8-py3-none-musllinux_1_2_x86_64.whl", hash = "sha256:5daaeaf00ae3c1efec9742ff294b06c3a2a9db8d3db51ee4851c12ad385cda30"},
466 | {file = "ruff-0.1.8-py3-none-win32.whl", hash = "sha256:e49fbdfe257fa41e5c9e13c79b9e79a23a79bd0e40b9314bc53840f520c2c0b3"},
467 | {file = "ruff-0.1.8-py3-none-win_amd64.whl", hash = "sha256:f41f692f1691ad87f51708b823af4bb2c5c87c9248ddd3191c8f088e66ce590a"},
468 | {file = "ruff-0.1.8-py3-none-win_arm64.whl", hash = "sha256:aa8ee4f8440023b0a6c3707f76cadce8657553655dcbb5fc9b2f9bb9bee389f6"},
469 | {file = "ruff-0.1.8.tar.gz", hash = "sha256:f7ee467677467526cfe135eab86a40a0e8db43117936ac4f9b469ce9cdb3fb62"},
470 | ]
471 |
472 | [[package]]
473 | name = "six"
474 | version = "1.16.0"
475 | description = "Python 2 and 3 compatibility utilities"
476 | optional = false
477 | python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*"
478 | files = [
479 | {file = "six-1.16.0-py2.py3-none-any.whl", hash = "sha256:8abb2f1d86890a2dfb989f9a77cfcfd3e47c2a354b01111771326f8aa26e0254"},
480 | {file = "six-1.16.0.tar.gz", hash = "sha256:1e61c37477a1626458e36f7b1d82aa5c9b094fa4802892072e49de9c60c4c926"},
481 | ]
482 |
483 | [[package]]
484 | name = "text-unidecode"
485 | version = "1.3"
486 | description = "The most basic Text::Unidecode port"
487 | optional = false
488 | python-versions = "*"
489 | files = [
490 | {file = "text-unidecode-1.3.tar.gz", hash = "sha256:bad6603bb14d279193107714b288be206cac565dfa49aa5b105294dd5c4aab93"},
491 | {file = "text_unidecode-1.3-py2.py3-none-any.whl", hash = "sha256:1311f10e8b895935241623731c2ba64f4c455287888b18189350b67134a822e8"},
492 | ]
493 |
494 | [[package]]
495 | name = "toml"
496 | version = "0.10.2"
497 | description = "Python Library for Tom's Obvious, Minimal Language"
498 | optional = false
499 | python-versions = ">=2.6, !=3.0.*, !=3.1.*, !=3.2.*"
500 | files = [
501 | {file = "toml-0.10.2-py2.py3-none-any.whl", hash = "sha256:806143ae5bfb6a3c6e736a764057db0e6a0e05e338b5630894a5f779cabb4f9b"},
502 | {file = "toml-0.10.2.tar.gz", hash = "sha256:b3bda1d108d5dd99f4a20d24d9c348e91c4db7ab1b749200bded2f839ccbe68f"},
503 | ]
504 |
505 | [[package]]
506 | name = "tomli"
507 | version = "2.0.1"
508 | description = "A lil' TOML parser"
509 | optional = false
510 | python-versions = ">=3.7"
511 | files = [
512 | {file = "tomli-2.0.1-py3-none-any.whl", hash = "sha256:939de3e7a6161af0c887ef91b7d41a53e7c5a1ca976325f429cb46ea9bc30ecc"},
513 | {file = "tomli-2.0.1.tar.gz", hash = "sha256:de526c12914f0c550d15924c62d72abc48d6fe7364aa87328337a31007fe8a4f"},
514 | ]
515 |
516 | [[package]]
517 | name = "types-python-slugify"
518 | version = "8.0.0.3"
519 | description = "Typing stubs for python-slugify"
520 | optional = false
521 | python-versions = "*"
522 | files = [
523 | {file = "types-python-slugify-8.0.0.3.tar.gz", hash = "sha256:868e6610ab9a01c01b2ccc1b982363e694d6bbb4fcf32e0d82688c89dceb4e2c"},
524 | {file = "types_python_slugify-8.0.0.3-py3-none-any.whl", hash = "sha256:2353c161c79ab6cce955b50720c6cd03586ec297558122236d130e4a19f21209"},
525 | ]
526 |
527 | [[package]]
528 | name = "types-toml"
529 | version = "0.10.8.7"
530 | description = "Typing stubs for toml"
531 | optional = false
532 | python-versions = "*"
533 | files = [
534 | {file = "types-toml-0.10.8.7.tar.gz", hash = "sha256:58b0781c681e671ff0b5c0319309910689f4ab40e8a2431e205d70c94bb6efb1"},
535 | {file = "types_toml-0.10.8.7-py3-none-any.whl", hash = "sha256:61951da6ad410794c97bec035d59376ce1cbf4453dc9b6f90477e81e4442d631"},
536 | ]
537 |
538 | [[package]]
539 | name = "typing-extensions"
540 | version = "4.9.0"
541 | description = "Backported and Experimental Type Hints for Python 3.8+"
542 | optional = false
543 | python-versions = ">=3.8"
544 | files = [
545 | {file = "typing_extensions-4.9.0-py3-none-any.whl", hash = "sha256:af72aea155e91adfc61c3ae9e0e342dbc0cba726d6cba4b6c72c1f34e47291cd"},
546 | {file = "typing_extensions-4.9.0.tar.gz", hash = "sha256:23478f88c37f27d76ac8aee6c905017a143b0b1b886c3c9f66bc2fd94f9f5783"},
547 | ]
548 |
549 | [[package]]
550 | name = "uritemplate"
551 | version = "4.1.1"
552 | description = "Implementation of RFC 6570 URI Templates"
553 | optional = false
554 | python-versions = ">=3.6"
555 | files = [
556 | {file = "uritemplate-4.1.1-py2.py3-none-any.whl", hash = "sha256:830c08b8d99bdd312ea4ead05994a38e8936266f84b9a7878232db50b044e02e"},
557 | {file = "uritemplate-4.1.1.tar.gz", hash = "sha256:4346edfc5c3b79f694bccd6d6099a322bbeb628dbf2cd86eea55a456ce5124f0"},
558 | ]
559 |
560 | [[package]]
561 | name = "urllib3"
562 | version = "2.1.0"
563 | description = "HTTP library with thread-safe connection pooling, file post, and more."
564 | optional = false
565 | python-versions = ">=3.8"
566 | files = [
567 | {file = "urllib3-2.1.0-py3-none-any.whl", hash = "sha256:55901e917a5896a349ff771be919f8bd99aff50b79fe58fec595eb37bbc56bb3"},
568 | {file = "urllib3-2.1.0.tar.gz", hash = "sha256:df7aa8afb0148fa78488e7899b2c59b5f4ffcfa82e6c54ccb9dd37c1d7b52d54"},
569 | ]
570 |
571 | [package.extras]
572 | brotli = ["brotli (>=1.0.9)", "brotlicffi (>=0.8.0)"]
573 | socks = ["pysocks (>=1.5.6,!=1.5.7,<2.0)"]
574 | zstd = ["zstandard (>=0.18.0)"]
575 |
576 | [[package]]
577 | name = "win32-setctime"
578 | version = "1.1.0"
579 | description = "A small Python utility to set file creation time on Windows"
580 | optional = false
581 | python-versions = ">=3.5"
582 | files = [
583 | {file = "win32_setctime-1.1.0-py3-none-any.whl", hash = "sha256:231db239e959c2fe7eb1d7dc129f11172354f98361c4fa2d6d2d7e278baa8aad"},
584 | {file = "win32_setctime-1.1.0.tar.gz", hash = "sha256:15cf5750465118d6929ae4de4eb46e8edae9a5634350c01ba582df868e932cb2"},
585 | ]
586 |
587 | [package.extras]
588 | dev = ["black (>=19.3b0)", "pytest (>=4.6.2)"]
589 |
590 | [metadata]
591 | lock-version = "2.0"
592 | python-versions = "^3.9"
593 | content-hash = "4f6c9f1c40c4fcdb4e4472f5e30c758de96ae8f9431e8ca3b04cf0c933aff0b3"
594 |
--------------------------------------------------------------------------------
/public/android-chrome-192x192.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/chriskthomas/good-first-issue/38424a9d9c68f19a567d2fddad0a1e850995c3c5/public/android-chrome-192x192.png
--------------------------------------------------------------------------------
/public/android-chrome-512x512.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/chriskthomas/good-first-issue/38424a9d9c68f19a567d2fddad0a1e850995c3c5/public/android-chrome-512x512.png
--------------------------------------------------------------------------------
/public/apple-touch-icon.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/chriskthomas/good-first-issue/38424a9d9c68f19a567d2fddad0a1e850995c3c5/public/apple-touch-icon.png
--------------------------------------------------------------------------------
/public/favicon-16x16.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/chriskthomas/good-first-issue/38424a9d9c68f19a567d2fddad0a1e850995c3c5/public/favicon-16x16.png
--------------------------------------------------------------------------------
/public/favicon-32x32.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/chriskthomas/good-first-issue/38424a9d9c68f19a567d2fddad0a1e850995c3c5/public/favicon-32x32.png
--------------------------------------------------------------------------------
/public/favicon.ico:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/chriskthomas/good-first-issue/38424a9d9c68f19a567d2fddad0a1e850995c3c5/public/favicon.ico
--------------------------------------------------------------------------------
/public/gfi-logo-white.svg:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
--------------------------------------------------------------------------------
/public/icon.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/chriskthomas/good-first-issue/38424a9d9c68f19a567d2fddad0a1e850995c3c5/public/icon.png
--------------------------------------------------------------------------------
/public/images/icon.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/chriskthomas/good-first-issue/38424a9d9c68f19a567d2fddad0a1e850995c3c5/public/images/icon.png
--------------------------------------------------------------------------------
/public/images/mailchimp.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/chriskthomas/good-first-issue/38424a9d9c68f19a567d2fddad0a1e850995c3c5/public/images/mailchimp.jpg
--------------------------------------------------------------------------------
/public/images/meta.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/chriskthomas/good-first-issue/38424a9d9c68f19a567d2fddad0a1e850995c3c5/public/images/meta.jpg
--------------------------------------------------------------------------------
/public/readme-logo.svg:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
--------------------------------------------------------------------------------
/public/site.webmanifest:
--------------------------------------------------------------------------------
1 | {"name":"","short_name":"","icons":[{"src":"/android-chrome-192x192.png","sizes":"192x192","type":"image/png"},{"src":"/android-chrome-512x512.png","sizes":"512x512","type":"image/png"}],"theme_color":"#33cb9a","background_color":"#16181d","display":"standalone"}
2 |
--------------------------------------------------------------------------------
/public/social/github.svg:
--------------------------------------------------------------------------------
1 |
2 |
3 |
--------------------------------------------------------------------------------
/public/social/heart.svg:
--------------------------------------------------------------------------------
1 |
2 |
3 |
--------------------------------------------------------------------------------
/public/social/twitter.svg:
--------------------------------------------------------------------------------
1 |
2 |
3 |
--------------------------------------------------------------------------------
/pyproject.toml:
--------------------------------------------------------------------------------
1 | [tool.poetry]
2 | name = "good-first-issue"
3 | version = "0.1.0"
4 | description = "https://goodfirstissue.dev"
5 | license = "MIT"
6 | authors = ["Sanket Saurav "]
7 |
8 | [tool.poetry.dependencies]
9 | python = "^3.9"
10 | "github3.py" = "^4.0.1"
11 | toml = "^0.10.2"
12 | numerize = "^0.12"
13 | emoji = "^0.6.0"
14 | requests = "^2.23.0"
15 | python-slugify = "^4.0.1"
16 |
17 | [tool.poetry.group.dev.dependencies]
18 | ruff = "^0.1.8"
19 | types-toml = "^0.10.8.7"
20 | types-python-slugify = "^8.0.0.3"
21 | loguru = "^0.7.2"
22 | mypy = "^1.7.1"
23 |
24 | [tool.ruff]
25 | line-length = 120
26 |
27 | [build-system]
28 | requires = ["poetry-core"]
29 | build-backend = "poetry.core.masonry.api"
30 |
--------------------------------------------------------------------------------
/sync.js:
--------------------------------------------------------------------------------
1 | import fs from 'fs'
2 | import path from 'path'
3 | import https from 'https'
4 |
5 | import { put, list } from '@vercel/blob'
6 |
7 | const dirToSync = './data'
8 | const filesToSync = ['generated.json', 'tags.json']
9 |
10 | /**
11 | * Downloads a file from a given url to a specified destination.
12 | *
13 | * @param {string} url - The URL of the file to download.
14 | * @param {string} dest - The destination where the file should be saved.
15 | * @return {Promise} A Promise that resolves when the file has been downloaded.
16 | */
17 | function downloadFile(url, dest) {
18 | return new Promise((resolve, reject) => {
19 | // Check if the file already exists
20 | const fileExists = fs.existsSync(dest)
21 |
22 | const file = fs.createWriteStream(dest, { flags: 'w' }) // 'w' flag for write mode
23 |
24 | https
25 | .get(url, (response) => {
26 | if (response.statusCode !== 200) {
27 | reject(new Error(`failed to download file: status code ${response.statusCode}`))
28 | return
29 | }
30 |
31 | response.pipe(file)
32 |
33 | if (fileExists) {
34 | console.log(`file ${dest} already exists. overwriting.`)
35 | }
36 | })
37 | .on('error', (err) => {
38 | reject(err)
39 | })
40 |
41 | file.on('finish', () => {
42 | resolve()
43 | })
44 |
45 | file.on('error', (err) => {
46 | fs.unlink(dest) // delete the file on error
47 | reject(err)
48 | })
49 | })
50 | }
51 |
52 | /**
53 | * Sync files from local to Vercel Blob
54 | */
55 | async function syncFilesUp() {
56 | for (const fileName of filesToSync) {
57 | const filePath = path.resolve(path.join(dirToSync, fileName))
58 | const stat = await fs.statSync(filePath)
59 |
60 | if (stat.isFile()) {
61 | const fileContent = await fs.readFileSync(filePath)
62 | await put(fileName, fileContent, { access: 'public', addRandomSuffix: false })
63 | }
64 | }
65 | }
66 |
67 | /**
68 | * Sync files from Vercel Blob to local
69 | */
70 | async function syncFilesDown() {
71 | const response = await list()
72 | for (const blob of response.blobs) {
73 | await downloadFile(blob.url, path.resolve(path.join(dirToSync, blob.pathname)))
74 | }
75 | }
76 |
77 | if (!("BLOB_READ_WRITE_TOKEN" in process.env)) {
78 | console.error('`BLOB_READ_WRITE_TOKEN` not set in env. exiting.')
79 | process.exit(1) // skicq: JS-0263
80 | }
81 |
82 | switch (process.argv[2]) {
83 | case 'up':
84 | await syncFilesUp()
85 | console.info('syncing up successful.')
86 | break
87 | case 'down':
88 | await syncFilesDown()
89 | console.info('syncing down successful.')
90 | break
91 | default:
92 | console.error('must provide a valid sync direction. exiting.')
93 | }
94 |
--------------------------------------------------------------------------------
/tailwind.config.js:
--------------------------------------------------------------------------------
1 | /** @type {import('tailwindcss').Config} */
2 | export default {
3 | content: [],
4 | theme: {
5 | extend: {
6 | colors: {
7 | transparent: 'transparent',
8 | current: 'currentColor',
9 | juniper: '#33cb9a',
10 | light_juniper: '#2EB78B',
11 | robin: '#4568dc',
12 | slate: '#52575c',
13 | cherry: '#df6145',
14 | honey: '#f6d87c',
15 | aqua: '#23c4f8',
16 | gitlab: '#6753B5',
17 | vanilla: {
18 | 100: '#ffffff',
19 | 200: '#f5f5f5',
20 | 300: '#eeeeee',
21 | 400: '#c0c1c3'
22 | },
23 | ink: {
24 | 100: '#373c49',
25 | 200: '#2c303a',
26 | 300: '#21242c',
27 | 400: '#16181d'
28 | }
29 | },
30 | fontFamily: {
31 | sans: [
32 | 'Inter',
33 | 'system-ui',
34 | '-apple-system',
35 | 'BlinkMacSystemFont',
36 | '"Segoe UI"',
37 | 'Roboto',
38 | '"Helvetica Neue"',
39 | 'Arial',
40 | '"Noto Sans"',
41 | 'sans-serif',
42 | '"Apple Color Emoji"',
43 | '"Segoe UI Emoji"',
44 | '"Segoe UI Symbol"',
45 | '"Noto Color Emoji"'
46 | ],
47 | serif: ['Georgia', 'Cambria', '"Times New Roman"', 'Times', 'serif'],
48 | mono: ['Menlo', 'Monaco', 'Consolas', '"Liberation Mono"', '"Courier New"', 'monospace']
49 | }
50 | }
51 | },
52 | plugins: []
53 | }
54 |
--------------------------------------------------------------------------------
/tsconfig.json:
--------------------------------------------------------------------------------
1 | {
2 | // https://nuxt.com/docs/guide/concepts/typescript
3 | "extends": "./.nuxt/tsconfig.json"
4 | }
5 |
--------------------------------------------------------------------------------
/vercel.json:
--------------------------------------------------------------------------------
1 | {
2 | "$schema": "https://openapi.vercel.sh/vercel.json",
3 | "buildCommand": "make generate-prod",
4 | "framework": "nuxtjs",
5 | "installCommand": "yum install -y python3-pip"
6 | }
7 |
--------------------------------------------------------------------------------