├── .cargo └── config ├── .github ├── FUNDING.yml ├── ISSUE_TEMPLATE │ ├── blank_issue.md │ ├── bug_report.yml │ ├── config.yml │ └── feature_request.md ├── dependabot.yml ├── pull_request_template.md └── workflows │ ├── codspeed.yml │ ├── lint-pr.yml │ ├── preview-deployments.yml │ ├── python-CI.yml │ ├── release-CI.yml │ └── rust-CI.yml ├── .gitignore ├── .pre-commit-config.yaml ├── .well-known └── funding-manifest-urls ├── CHANGELOG.md ├── CODE_OF_CONDUCT.md ├── CONTRIBUTING.md ├── Cargo.lock ├── Cargo.toml ├── LICENSE ├── README.md ├── benchmark.sh ├── docs ├── docs_src ├── .env.example ├── .eslintrc.json ├── .gitignore ├── README.md ├── jsconfig.json ├── mdx │ ├── recma.mjs │ ├── rehype.mjs │ └── remark.mjs ├── next.config.mjs ├── package-lock.json ├── package.json ├── postcss.config.js ├── prettier.config.js ├── public │ ├── RobynOG.svg │ ├── architecture │ │ ├── architecture.png │ │ ├── const-request-optimisation-basis.png │ │ ├── const-request-optimisation.png │ │ └── multi-processing.png │ ├── fonts │ │ ├── Inter-italic.var.woff2 │ │ ├── Inter-roman.var.woff2 │ │ └── Mona-Sans.var.woff2 │ ├── funding.json │ └── robynog.png ├── src │ ├── components │ │ ├── Button.jsx │ │ ├── Card.jsx │ │ ├── Container.jsx │ │ ├── Footer.jsx │ │ ├── Header.jsx │ │ ├── Prose.jsx │ │ ├── Section.jsx │ │ ├── SimpleLayout.jsx │ │ ├── SocialIcons.jsx │ │ ├── Testimonials.jsx │ │ ├── documentation │ │ │ ├── ApiDocs.jsx │ │ │ ├── BottomNavbar.jsx │ │ │ ├── Button.jsx │ │ │ ├── Code.jsx │ │ │ ├── Guides.jsx │ │ │ ├── Heading.jsx │ │ │ ├── HeroPattern.jsx │ │ │ ├── LanguageSelector.jsx │ │ │ ├── Layout.jsx │ │ │ ├── Libraries.jsx │ │ │ ├── MobileNavigation.jsx │ │ │ ├── ModeToggle.jsx │ │ │ ├── Navigation.jsx │ │ │ ├── Prose.jsx │ │ │ ├── Search.jsx │ │ │ ├── SectionProvider.jsx │ │ │ ├── Tag.jsx │ │ │ ├── icons │ │ │ │ ├── BellIcon.jsx │ │ │ │ ├── BoltIcon.jsx │ │ │ │ ├── BookIcon.jsx │ │ │ │ ├── CalendarIcon.jsx │ │ │ │ ├── CartIcon.jsx │ │ │ │ ├── ChatBubbleIcon.jsx │ │ │ │ ├── CheckIcon.jsx │ │ │ │ ├── ChevronRightLeftIcon.jsx │ │ │ │ ├── ClipboardIcon.jsx │ │ │ │ ├── CogIcon.jsx │ │ │ │ ├── CopyIcon.jsx │ │ │ │ ├── DocumentIcon.jsx │ │ │ │ ├── EnvelopeIcon.jsx │ │ │ │ ├── FaceSmileIcon.jsx │ │ │ │ ├── FolderIcon.jsx │ │ │ │ ├── LinkIcon.jsx │ │ │ │ ├── ListIcon.jsx │ │ │ │ ├── MagnifyingGlassIcon.jsx │ │ │ │ ├── MapPinIcon.jsx │ │ │ │ ├── PackageIcon.jsx │ │ │ │ ├── PaperAirplaneIcon.jsx │ │ │ │ ├── PaperClipIcon.jsx │ │ │ │ ├── ShapesIcon.jsx │ │ │ │ ├── ShirtIcon.jsx │ │ │ │ ├── SquaresPlusIcon.jsx │ │ │ │ ├── TagIcon.jsx │ │ │ │ ├── UserIcon.jsx │ │ │ │ └── UsersIcon.jsx │ │ │ └── mdx.jsx │ │ └── releases │ │ │ ├── Button.jsx │ │ │ ├── FeedProvider.jsx │ │ │ ├── FormattedDate.jsx │ │ │ ├── IconLink.jsx │ │ │ ├── Intro.jsx │ │ │ ├── Layout.jsx │ │ │ ├── SignUpForm.jsx │ │ │ └── mdx.jsx │ ├── images │ │ ├── avatar.jpg │ │ ├── commit-suggestions.png │ │ ├── configuration-files.png │ │ ├── dark-mode.png │ │ ├── first-release.png │ │ ├── logos │ │ │ ├── airbnb.svg │ │ │ ├── animaginary.svg │ │ │ ├── cosmos.svg │ │ │ ├── facebook.svg │ │ │ ├── helio-stream.svg │ │ │ ├── open-shuttle.svg │ │ │ ├── planetaria.svg │ │ │ └── starbucks.svg │ │ ├── portrait.jpg │ │ ├── robyn_logo.jpg │ │ └── sparckles-logo.png │ ├── lib │ │ ├── formatDate.js │ │ ├── getAllArticles.js │ │ └── remToPx.js │ ├── pages │ │ ├── _app.jsx │ │ ├── _document.jsx │ │ ├── community.jsx │ │ ├── documentation │ │ │ ├── en │ │ │ │ ├── api_reference │ │ │ │ │ ├── advanced_features.mdx │ │ │ │ │ ├── authentication.mdx │ │ │ │ │ ├── const_requests.mdx │ │ │ │ │ ├── cors.mdx │ │ │ │ │ ├── dependency_injection.mdx │ │ │ │ │ ├── exceptions.mdx │ │ │ │ │ ├── file-uploads.mdx │ │ │ │ │ ├── form_data.mdx │ │ │ │ │ ├── future-roadmap.mdx │ │ │ │ │ ├── getting_started.mdx │ │ │ │ │ ├── graphql-support.mdx │ │ │ │ │ ├── index.mdx │ │ │ │ │ ├── middlewares.mdx │ │ │ │ │ ├── multiprocess_execution.mdx │ │ │ │ │ ├── openapi.mdx │ │ │ │ │ ├── redirection.mdx │ │ │ │ │ ├── request_object.mdx │ │ │ │ │ ├── robyn_env.mdx │ │ │ │ │ ├── scaling.mdx │ │ │ │ │ ├── templating.mdx │ │ │ │ │ ├── using_rust_directly.mdx │ │ │ │ │ ├── websockets.mdx │ │ │ │ │ └── zh │ │ │ │ │ │ └── getting_started.mdx │ │ │ │ ├── architecture.mdx │ │ │ │ ├── community-resources.mdx │ │ │ │ ├── example_app │ │ │ │ │ ├── authentication-middlewares.mdx │ │ │ │ │ ├── authentication.mdx │ │ │ │ │ ├── deployment.mdx │ │ │ │ │ ├── index.mdx │ │ │ │ │ ├── modeling_routes.mdx │ │ │ │ │ ├── monitoring_and_logging.mdx │ │ │ │ │ ├── openapi.mdx │ │ │ │ │ ├── real_time_notifications.mdx │ │ │ │ │ ├── subrouters.mdx │ │ │ │ │ ├── templates.mdx │ │ │ │ │ └── zh │ │ │ │ │ │ ├── index.mdx │ │ │ │ │ │ └── subrouters.mdx │ │ │ │ ├── framework_performance_comparison.mdx │ │ │ │ ├── hosting.mdx │ │ │ │ ├── index.mdx │ │ │ │ └── plugins.mdx │ │ │ └── zh │ │ │ │ ├── api_reference │ │ │ │ ├── advanced_features.mdx │ │ │ │ ├── authentication.mdx │ │ │ │ ├── const_requests.mdx │ │ │ │ ├── cors.mdx │ │ │ │ ├── dependency_injection.mdx │ │ │ │ ├── exceptions.mdx │ │ │ │ ├── file-uploads.mdx │ │ │ │ ├── form_data.mdx │ │ │ │ ├── future-roadmap.mdx │ │ │ │ ├── getting_started.mdx │ │ │ │ ├── graphql-support.mdx │ │ │ │ ├── index.mdx │ │ │ │ ├── middlewares.mdx │ │ │ │ ├── multiprocess_execution.mdx │ │ │ │ ├── openapi.mdx │ │ │ │ ├── redirection.mdx │ │ │ │ ├── request_object.mdx │ │ │ │ ├── robyn_env.mdx │ │ │ │ ├── scaling.mdx │ │ │ │ ├── templating.mdx │ │ │ │ ├── using_rust_directly.mdx │ │ │ │ ├── views.mdx │ │ │ │ └── websockets.mdx │ │ │ │ ├── architecture.mdx │ │ │ │ ├── community-resources.mdx │ │ │ │ ├── example_app │ │ │ │ ├── authentication-middlewares.mdx │ │ │ │ ├── authentication.mdx │ │ │ │ ├── deployment.mdx │ │ │ │ ├── index.mdx │ │ │ │ ├── modeling_routes.mdx │ │ │ │ ├── monitoring_and_logging.mdx │ │ │ │ ├── openapi.mdx │ │ │ │ ├── real_time_notifications.mdx │ │ │ │ ├── subrouters_and_views.mdx │ │ │ │ └── templates.mdx │ │ │ │ ├── framework_performance_comparison.mdx │ │ │ │ ├── hosting.mdx │ │ │ │ ├── index.mdx │ │ │ │ └── plugins.mdx │ │ ├── index.jsx │ │ └── releases │ │ │ └── index.jsx │ └── styles │ │ ├── documentation.css │ │ ├── prism.css │ │ ├── releases │ │ ├── base.css │ │ ├── components.css │ │ ├── tailwind.css │ │ ├── typography.css │ │ └── utilities.css │ │ └── tailwind.css └── tailwind.config.js ├── integration_tests ├── __init__.py ├── base_routes.py ├── build │ └── index.html ├── conftest.py ├── downloads │ └── test.txt ├── helpers │ ├── __init__.py │ ├── http_methods_helpers.py │ └── network_helpers.py ├── index.html ├── index.py ├── openapi_config.json ├── random_number.rs ├── subroutes │ ├── __init__.py │ └── di_subrouter.py ├── templates │ └── test.html ├── test_add_route_without_decorator.py ├── test_app.py ├── test_authentication.py ├── test_base_url.py ├── test_basic_routes.py ├── test_binary_output.py ├── test_cli.py ├── test_delete_requests.py ├── test_dependency_injection.py ├── test_env_populator.py ├── test_exception_handling.py ├── test_file_download.py ├── test_get_requests.py ├── test_middlewares.py ├── test_multipart_data.py ├── test_openapi.py ├── test_patch_requests.py ├── test_post_requests.py ├── test_put_requests.py ├── test_request_json.py ├── test_split_request_params.py ├── test_status_code.py ├── test_subrouter.py ├── test_unsupported_types.py └── test_web_sockets.py ├── noxfile.py ├── poetry.lock ├── pyproject.toml ├── robyn ├── __init__.py ├── __main__.py ├── argument_parser.py ├── authentication.py ├── cli.py ├── dependency_injection.py ├── env_populator.py ├── events.py ├── exceptions.py ├── jsonify.py ├── logger.py ├── openapi.py ├── processpool.py ├── py.typed ├── reloader.py ├── responses.py ├── robyn.pyi ├── router.py ├── scaffold │ ├── mongo │ │ ├── Dockerfile │ │ ├── app.py │ │ └── requirements.txt │ ├── no-db │ │ ├── Dockerfile │ │ ├── app.py │ │ └── requirements.txt │ ├── postgres │ │ ├── Dockerfile │ │ ├── app.py │ │ ├── requirements.txt │ │ └── supervisord.conf │ ├── prisma │ │ ├── Dockerfile │ │ ├── app.py │ │ ├── requirements.txt │ │ └── schema.prisma │ ├── sqlalchemy │ │ ├── Dockerfile │ │ ├── __init__.py │ │ ├── app.py │ │ ├── models.py │ │ └── requirements.txt │ ├── sqlite │ │ ├── Dockerfile │ │ ├── app.py │ │ └── requirements.txt │ └── sqlmodel │ │ ├── Dockerfile │ │ ├── app.py │ │ ├── models.py │ │ └── requirements.txt ├── status_codes.py ├── swagger.html ├── templating.py ├── types.py └── ws.py ├── scripts ├── format.sh └── release.sh ├── setup.py ├── src ├── executors │ ├── mod.rs │ └── web_socket_executors.rs ├── io_helpers │ └── mod.rs ├── lib.rs ├── routers │ ├── const_router.rs │ ├── http_router.rs │ ├── middleware_router.rs │ ├── mod.rs │ └── web_socket_router.rs ├── server.rs ├── shared_socket.rs ├── types │ ├── function_info.rs │ ├── headers.rs │ ├── identity.rs │ ├── mod.rs │ ├── multimap.rs │ ├── request.rs │ └── response.rs └── websockets │ ├── mod.rs │ └── registry.rs └── unit_tests └── test_request_object.py /.cargo/config: -------------------------------------------------------------------------------- 1 | [target.x86_64-apple-darwin] 2 | rustflags = [ 3 | "-C", "link-arg=-undefined", 4 | "-C", "link-arg=dynamic_lookup", 5 | ] 6 | 7 | [target.aarch64-apple-darwin] 8 | rustflags = [ 9 | "-C", "link-arg=-undefined", 10 | "-C", "link-arg=dynamic_lookup", 11 | ] 12 | -------------------------------------------------------------------------------- /.github/FUNDING.yml: -------------------------------------------------------------------------------- 1 | # These are supported funding model platforms 2 | 3 | github: [sansyrox] # Replace with up to 4 GitHub Sponsors-enabled usernames e.g., [user1, user2] 4 | #patreon: # Replace with a single Patreon username 5 | open_collective: robyn_oss # Replace with a single Open Collective username 6 | #ko_fi: # Replace with a single Ko-fi username 7 | #tidelift: # Replace with a single Tidelift platform-name/package-name e.g., npm/babel 8 | #community_bridge: # Replace with a single Community Bridge project-name e.g., cloud-foundry 9 | # liberapay: # Replace with a single Liberapay username 10 | # issuehunt: # Replace with a single IssueHunt username 11 | # otechie: # Replace with a single Otechie username 12 | # lfx_crowdfunding: # Replace with a single LFX Crowdfunding project-name e.g., cloud-foundry 13 | # custom: # Replace with up to 4 custom sponsorship URLs e.g., ['link1', 'link2'] 14 | -------------------------------------------------------------------------------- /.github/ISSUE_TEMPLATE/blank_issue.md: -------------------------------------------------------------------------------- 1 | --- 2 | name: 📝 Blank Issue 3 | about: Create a blank issue. 4 | --- -------------------------------------------------------------------------------- /.github/ISSUE_TEMPLATE/bug_report.yml: -------------------------------------------------------------------------------- 1 | name: 🐛 Bug Report 2 | description: Create a bug report 3 | labels: [bug] 4 | body: 5 | - type: markdown 6 | attributes: 7 | value: | 8 | Thank you for taking the time to fill out this bug report! 9 | Please fill out the form below... 10 | - type: textarea 11 | id: description 12 | attributes: 13 | label: Bug Description 14 | description: Please provide a clear and concise description of what the bug is, and what you would expect to happen. 15 | placeholder: The bug is... 16 | validations: 17 | required: true 18 | - type: textarea 19 | id: reproduce 20 | attributes: 21 | label: Steps to Reproduce 22 | description: Please provide the steps to reproduce this bug. You can include your code here if it is relevant. 23 | placeholder: | 24 | 1. 25 | 2. 26 | 3. 27 | validations: 28 | required: false 29 | - type: dropdown 30 | id: os 31 | attributes: 32 | label: Your operating system 33 | options: 34 | - Windows 35 | - MacOS 36 | - Linux 37 | - Other (specify below) 38 | validations: 39 | required: false 40 | - type: dropdown 41 | id: py_version 42 | attributes: 43 | label: Your Python version (`python --version`) 44 | options: 45 | - 3.9 46 | - 3.10 47 | - 3.11 48 | - 3.12 49 | - Other (specify below) 50 | validations: 51 | required: false 52 | - type: dropdown 53 | id: robyn_version 54 | attributes: 55 | label: Your Robyn version 56 | options: 57 | - main branch 58 | - latest 59 | - Other (specify below) 60 | validations: 61 | required: false 62 | - type: textarea 63 | id: additional-info 64 | attributes: 65 | label: Additional Info 66 | description: Any additional info that you think might be useful or relevant to this bug 67 | -------------------------------------------------------------------------------- /.github/ISSUE_TEMPLATE/config.yml: -------------------------------------------------------------------------------- 1 | blank_issues_enabled: true 2 | contact_links: 3 | - name: Discord Community Support 4 | url: https://discord.gg/rkERZ5eNU8 5 | about: You can ask and answer questions here. 6 | - name: Documentation 7 | url: https://robyn.tech 8 | about: The Robyn documentation. 9 | -------------------------------------------------------------------------------- /.github/ISSUE_TEMPLATE/feature_request.md: -------------------------------------------------------------------------------- 1 | --- 2 | name: 💡 Feature request 3 | about: Suggest an idea to improve Robyn 4 | labels: [enhancement] 5 | --- 6 | 7 | -------------------------------------------------------------------------------- /.github/dependabot.yml: -------------------------------------------------------------------------------- 1 | # Keep GitHub Actions up to date with GitHub's Dependabot... 2 | # https://docs.github.com/en/code-security/dependabot/working-with-dependabot/keeping-your-actions-up-to-date-with-dependabot 3 | # https://docs.github.com/en/code-security/dependabot/dependabot-version-updates/configuration-options-for-the-dependabot.yml-file#package-ecosystem 4 | version: 2 5 | updates: 6 | - package-ecosystem: github-actions 7 | directory: / 8 | groups: 9 | github-actions: 10 | patterns: 11 | - "*" # Group all Actions updates into a single larger pull request 12 | schedule: 13 | interval: weekly 14 | -------------------------------------------------------------------------------- /.github/pull_request_template.md: -------------------------------------------------------------------------------- 1 | ## Description 2 | 3 | This PR fixes # 4 | 5 | ## Summary 6 | 7 | This PR does.... 8 | 9 | 13 | 14 | ## PR Checklist 15 | 16 | Please ensure that: 17 | 18 | - [ ] The PR contains a descriptive title 19 | - [ ] The PR contains a descriptive summary of the changes 20 | - [ ] You build and test your changes before submitting a PR. 21 | - [ ] You have added relevant documentation 22 | - [ ] You have added relevant tests. We prefer integration tests wherever possible 23 | 24 | ## Pre-Commit Instructions: 25 | 26 | - [ ] Ensure that you have run the [pre-commit hooks](https://github.com/sparckles/robyn#%EF%B8%8F-to-develop-locally) on your PR. 27 | 28 | -------------------------------------------------------------------------------- /.github/workflows/codspeed.yml: -------------------------------------------------------------------------------- 1 | name: codspeed-benchmarks 2 | 3 | on: 4 | push: 5 | branches: 6 | - "main" # or "master" 7 | pull_request: 8 | # `workflow_dispatch` allows CodSpeed to trigger backtest 9 | # performance analysis in order to generate initial data. 10 | workflow_dispatch: 11 | 12 | env: 13 | UV_SYSTEM_PYTHON: 1 14 | 15 | jobs: 16 | benchmarks: 17 | runs-on: ubuntu-22.04 18 | steps: 19 | - uses: actions/checkout@v4 20 | 21 | - name: Install uv 22 | uses: astral-sh/setup-uv@v6 23 | with: 24 | version: "0.7.5" 25 | 26 | - uses: actions/setup-python@v5 27 | with: 28 | python-version: "3.9" 29 | 30 | - name: Install dependencies with uv 31 | run: | 32 | echo "# Installing Dependencies" 33 | uv pip install -r pyproject.toml --group dev --group test 34 | echo "# Installing Project" 35 | uv pip install -e . 36 | 37 | - name: Add macos target 38 | if: matrix.os == 'macos' 39 | run: rustup target add aarch64-apple-darwin 40 | 41 | - name: Setup Rust part of the project 42 | run: | 43 | echo "::group::Checking dependencies" 44 | echo "# Checking dependencies, If not found any then it will stop the job." 45 | which uv python pip maturin pytest 46 | echo "# Checking pip list" 47 | pip list 48 | echo "::endgroup::" 49 | 50 | echo "::group::Running & Installing build" 51 | maturin build -i python --universal2 --out dist 52 | uv pip install --no-index --find-links=dist/ robyn 53 | echo "::endgroup::" 54 | 55 | - name: Run benchmarks 56 | uses: CodSpeedHQ/action@v3.5.0 57 | with: 58 | token: ${{ secrets.CODSPEED_TOKEN }} 59 | run: pytest integration_tests --codspeed 60 | 61 | -------------------------------------------------------------------------------- /.github/workflows/lint-pr.yml: -------------------------------------------------------------------------------- 1 | name: Lint PR 2 | 3 | on: 4 | pull_request: 5 | branches: [main] 6 | 7 | 8 | env: 9 | UV_SYSTEM_PYTHON: 1 10 | 11 | jobs: 12 | lint: 13 | runs-on: ubuntu-latest 14 | steps: 15 | - uses: actions/checkout@v4 16 | - name: Install uv 17 | uses: astral-sh/setup-uv@v3 18 | 19 | - uses: actions/setup-python@v5 20 | with: 21 | python-version: "3.11" 22 | 23 | - name: Install dependencies with uv 24 | run: | 25 | uv pip install ruff isort black 26 | - name: Run linters 27 | run: | 28 | uv run ruff check . 29 | uv run isort --check-only --diff . 30 | -------------------------------------------------------------------------------- /.github/workflows/python-CI.yml: -------------------------------------------------------------------------------- 1 | # CI to test Robyn on major Linux, MacOS and Windows 2 | 3 | on: [push, pull_request] 4 | 5 | name: Python Continuous integration 6 | 7 | jobs: 8 | tests: 9 | strategy: 10 | fail-fast: false 11 | matrix: 12 | os: ["windows", "ubuntu", "macos"] 13 | python-version: ["3.9", "3.10", "3.11", "3.12"] 14 | name: ${{ matrix.os }} tests with python ${{ matrix.python-version }} 15 | runs-on: ${{ matrix.os }}-latest 16 | steps: 17 | - uses: actions/checkout@v4 18 | - name: Set up Python ${{ matrix.python-version }} 19 | uses: actions/setup-python@v5 20 | with: 21 | python-version: ${{ matrix.python-version }} 22 | - name: Set up Nox 23 | uses: wntrblm/nox@2024.03.02 24 | with: 25 | python-versions: ${{ matrix.python-version }} 26 | - name: Test with Nox 27 | run: nox --non-interactive --error-on-missing-interpreter -p ${{ matrix.python-version }} 28 | -------------------------------------------------------------------------------- /.github/workflows/rust-CI.yml: -------------------------------------------------------------------------------- 1 | # CI to build, test, format, and lint the Rust code 2 | 3 | on: [push, pull_request] 4 | 5 | name: Rust Continuous integration 6 | 7 | jobs: 8 | check: 9 | name: Check 10 | runs-on: ubuntu-latest 11 | steps: 12 | - uses: actions/checkout@v4 13 | - uses: dtolnay/rust-toolchain@stable 14 | - run: cargo check 15 | 16 | test: 17 | name: Test Suite 18 | runs-on: ubuntu-latest 19 | steps: 20 | - uses: actions/checkout@v4 21 | - uses: dtolnay/rust-toolchain@stable 22 | - run: cargo test 23 | 24 | fmt: 25 | name: Rustfmt 26 | runs-on: ubuntu-latest 27 | steps: 28 | - uses: actions/checkout@v4 29 | - uses: dtolnay/rust-toolchain@stable 30 | with: 31 | components: rustfmt 32 | - run: cargo fmt --check 33 | 34 | clippy: 35 | name: Clippy 36 | runs-on: ubuntu-latest 37 | steps: 38 | - uses: actions/checkout@v4 39 | - uses: dtolnay/rust-toolchain@stable 40 | with: 41 | components: clippy 42 | - run: cargo clippy 43 | # -- -D warnings 44 | 45 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | .python-version 2 | /target 3 | 4 | # ignore pre compiled binaries 5 | *.so 6 | dist/ 7 | 8 | #python cache 9 | *__pycache__ 10 | *tags 11 | 12 | # DS_Store 13 | *.DS_Store 14 | .vscode 15 | 16 | # pycharm 17 | .idea 18 | 19 | # python venv 20 | .venv 21 | venv 22 | robyn.code-workspace 23 | hello_robyn.py 24 | robyn.env 25 | 26 | # nox 27 | .nox/ 28 | 29 | # new docs dependencies 30 | # dependencies 31 | docs_src/node_modules 32 | docs_src/.pnp 33 | docs_src/.pnp.js 34 | 35 | # testing 36 | docs_src/coverage 37 | 38 | # next.js 39 | docs_src/.next/ 40 | docs_src/out/ 41 | 42 | # production 43 | docs_src/build 44 | 45 | # misc 46 | docs_src/.DS_Store 47 | docs_src/*.pem 48 | 49 | # debug 50 | docs_src/npm-debug.log* 51 | docs_src/yarn-debug.log* 52 | docs_src/yarn-error.log* 53 | docs_src/.pnpm-debug.log* 54 | 55 | # local env files 56 | docs_src/.env*.local 57 | 58 | # vercel 59 | docs_src/.vercel 60 | 61 | # generated files 62 | docs_src/public/rss/ 63 | -------------------------------------------------------------------------------- /.pre-commit-config.yaml: -------------------------------------------------------------------------------- 1 | repos: 2 | - repo: https://github.com/astral-sh/ruff-pre-commit 3 | rev: v0.4.10 4 | hooks: 5 | - id: ruff 6 | args: 7 | - --fix 8 | - id: ruff-format 9 | 10 | ci: 11 | autoupdate_schedule: weekly 12 | -------------------------------------------------------------------------------- /.well-known/funding-manifest-urls: -------------------------------------------------------------------------------- 1 | https://robyn.tech/funding.json 2 | -------------------------------------------------------------------------------- /CODE_OF_CONDUCT.md: -------------------------------------------------------------------------------- 1 | ### Robyn Open Source Community Guidelines 2 | 3 | - **Be friendly and patient**. 4 | - **Be welcoming**. 5 | - **Be respectful**. 6 | - **Be careful in the words that we choose**. 7 | -------------------------------------------------------------------------------- /Cargo.toml: -------------------------------------------------------------------------------- 1 | [package] 2 | name = "robyn" 3 | version = "0.67.0" 4 | authors = ["Sanskar Jethi "] 5 | edition = "2021" 6 | description = "Robyn is a Super Fast Async Python Web Framework with a Rust runtime." 7 | license = "BSD License (BSD)" 8 | homepage = "https://github.com/sparckles/robyn" 9 | readme = "README.md" 10 | 11 | # See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html 12 | [lib] 13 | name = "robyn" 14 | crate-type = ["cdylib", "rlib"] 15 | 16 | [dependencies] 17 | pyo3 = { version = "0.20.0", features = ["extension-module"] } 18 | pyo3-asyncio = { version="0.20.0" , features = ["attributes", "tokio-runtime"] } 19 | pyo3-log = "0.8.4" 20 | tokio = { version = "1.26.0", features = ["full"] } 21 | dashmap = "5.4.3" 22 | anyhow = "1.0.69" 23 | actix = "0.13.4" 24 | actix-web-actors = "4.3.0" 25 | actix-web = "4.4.2" 26 | actix-http = "3.3.1" 27 | actix-files = "0.6.2" 28 | futures = "0.3.27" 29 | futures-util = "0.3.27" 30 | matchit = "0.7.3" 31 | socket2 = { version = "0.5.1", features = ["all"] } 32 | uuid = { version = "1.3.0", features = ["serde", "v4"] } 33 | log = "0.4.17" 34 | pythonize = "0.20.0" 35 | serde = "1.0.187" 36 | serde_json = "1.0.109" 37 | once_cell = "1.8.0" 38 | actix-multipart = "0.6.1" 39 | parking_lot = "0.12.3" 40 | 41 | [features] 42 | io-uring = ["actix-web/experimental-io-uring"] 43 | 44 | [profile.release] 45 | codegen-units = 1 46 | lto = true 47 | panic = "abort" 48 | strip = true 49 | 50 | [package.metadata.maturin] 51 | name = "robyn" 52 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | BSD 2-Clause License 2 | 3 | Copyright (c) 2021, Sanskar Jethi 4 | All rights reserved. 5 | 6 | Redistribution and use in source and binary forms, with or without 7 | modification, are permitted provided that the following conditions are met: 8 | 9 | 1. Redistributions of source code must retain the above copyright notice, this 10 | list of conditions and the following disclaimer. 11 | 12 | 2. Redistributions in binary form must reproduce the above copyright notice, 13 | this list of conditions and the following disclaimer in the documentation 14 | and/or other materials provided with the distribution. 15 | 16 | THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" 17 | AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 18 | IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE 19 | DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE 20 | FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 21 | DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR 22 | SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER 23 | CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, 24 | OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 25 | OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 26 | -------------------------------------------------------------------------------- /benchmark.sh: -------------------------------------------------------------------------------- 1 | #!/bin/sh 2 | 3 | # Benchmark script to get info about Robyn's performances 4 | # You can use this benchmark when developing on Robyn to test if your changes had a huge 5 | # impact on performances. You cannot compare benchmarks from different machine and even 6 | # several runs on the same machine can give very different results sometimes. 7 | # Be aware of this when using this script! 8 | 9 | Help() { 10 | echo "Benchmark script to get info about Robyn's performances." 11 | echo 12 | echo "USAGE:" 13 | echo " benchmark [-h|m|n|y]" 14 | echo 15 | echo "OPTIONS:" 16 | echo " -h Print this help." 17 | echo " -m Run 'maturin develop' to compile the Rust part of Robyn." 18 | echo " -n Set the number of requests that oha sends." 19 | echo " -y Skip prompt" 20 | exit 0 21 | } 22 | 23 | yes_flag=false 24 | run_maturin=false 25 | number=100000 26 | while getopts hymn: opt; do 27 | case $opt in 28 | h) 29 | Help 30 | ;; 31 | y) 32 | yes_flag=true 33 | ;; 34 | m) 35 | run_maturin=true 36 | ;; 37 | n) 38 | number=$OPTARG 39 | ;; 40 | ?) 41 | echo 'Error in command line parsing' >&2 42 | Help 43 | exit 1 44 | ;; 45 | esac 46 | done 47 | 48 | # Prompt user to check if he installed the requirements for running the benchmark 49 | if [ "$yes_flag" = false ]; then 50 | echo "Make sure you are running this in your venv and you installed 'oha' using 'cargo install oha'" 51 | echo "Do you want to proceed?" 52 | while true; do 53 | read -p "" yn 54 | case $yn in 55 | [Yy]* ) break;; 56 | [Nn]* ) exit;; 57 | * ) echo "Please answer yes or no.";; 58 | esac 59 | done 60 | fi 61 | 62 | 63 | # Compile Rust 64 | if $run_maturin; then 65 | maturin develop 66 | fi 67 | 68 | # Run the server in the background 69 | python3 ./integration_tests/base_routes.py & 70 | sleep 1 71 | 72 | # oha will display benchmark results 73 | oha -n "$number" http://localhost:8080/sync 74 | 75 | # Kill subprocesses after exiting the script (python + robyn server) 76 | # (see https://stackoverflow.com/questions/360201/how-do-i-kill-background-processes-jobs-when-my-shell-script-exits) 77 | trap "trap - TERM && kill 0" INT TERM EXIT 78 | -------------------------------------------------------------------------------- /docs: -------------------------------------------------------------------------------- 1 | ./docs_src/src/pages/documentation -------------------------------------------------------------------------------- /docs_src/.env.example: -------------------------------------------------------------------------------- 1 | NEXT_PUBLIC_SITE_URL=https://example.com 2 | -------------------------------------------------------------------------------- /docs_src/.eslintrc.json: -------------------------------------------------------------------------------- 1 | { 2 | "extends": ["next","next/core-web-vitals"], 3 | "rules": { 4 | "react/no-unescaped-entities": "off" 5 | } 6 | } 7 | -------------------------------------------------------------------------------- /docs_src/.gitignore: -------------------------------------------------------------------------------- 1 | # See https://help.github.com/articles/ignoring-files/ for more about ignoring files. 2 | 3 | # dependencies 4 | /node_modules 5 | /.pnp 6 | .pnp.js 7 | 8 | # testing 9 | /coverage 10 | 11 | # next.js 12 | /.next/ 13 | /out/ 14 | 15 | # production 16 | /build 17 | 18 | # misc 19 | .DS_Store 20 | *.pem 21 | 22 | # debug 23 | npm-debug.log* 24 | yarn-debug.log* 25 | yarn-error.log* 26 | .pnpm-debug.log* 27 | 28 | # local env files 29 | .env*.local 30 | 31 | # vercel 32 | .vercel 33 | 34 | # generated files 35 | /public/rss/ 36 | -------------------------------------------------------------------------------- /docs_src/README.md: -------------------------------------------------------------------------------- 1 | ## Docs Base 2 | 3 | This is the documentation website that will be used as a base for Robyn and Starfyre docs. 4 | 5 | ## Setup 6 | 7 | 1. Clone this repo 8 | 2. Run `npm install` 9 | 3. Run `npm run dev` 10 | 4. Open `http://localhost:3000` in your browser 11 | 12 | -------------------------------------------------------------------------------- /docs_src/jsconfig.json: -------------------------------------------------------------------------------- 1 | { 2 | "compilerOptions": { 3 | "baseUrl": ".", 4 | "paths": { 5 | "@/*": ["src/*"] 6 | } 7 | } 8 | } 9 | -------------------------------------------------------------------------------- /docs_src/mdx/recma.mjs: -------------------------------------------------------------------------------- 1 | import { mdxAnnotations } from 'mdx-annotations' 2 | import recmaNextjsStaticProps from 'recma-nextjs-static-props' 3 | import { recmaImportImages } from 'recma-import-images' 4 | 5 | function recmaRemoveNamedExports() { 6 | return (tree) => { 7 | tree.body = tree.body.map((node) => { 8 | if (node.type === 'ExportNamedDeclaration') { 9 | return node.declaration 10 | } 11 | return node 12 | }) 13 | } 14 | } 15 | 16 | export const recmaPlugins = [ 17 | mdxAnnotations.recma, 18 | recmaRemoveNamedExports, 19 | recmaNextjsStaticProps, 20 | recmaImportImages, 21 | ] 22 | -------------------------------------------------------------------------------- /docs_src/mdx/remark.mjs: -------------------------------------------------------------------------------- 1 | import { mdxAnnotations } from 'mdx-annotations' 2 | import remarkGfm from 'remark-gfm' 3 | import remarkUnwrapImages from 'remark-unwrap-images' 4 | 5 | export const remarkPlugins = [ 6 | mdxAnnotations.remark, 7 | remarkGfm, 8 | remarkUnwrapImages, 9 | ] 10 | -------------------------------------------------------------------------------- /docs_src/next.config.mjs: -------------------------------------------------------------------------------- 1 | import nextMDX from '@next/mdx' 2 | import { remarkPlugins } from './mdx/remark.mjs' 3 | import { rehypePlugins } from './mdx/rehype.mjs' 4 | import { recmaPlugins } from './mdx/recma.mjs' 5 | 6 | const withMDX = nextMDX({ 7 | options: { 8 | remarkPlugins, 9 | rehypePlugins, 10 | recmaPlugins, 11 | providerImportSource: '@mdx-js/react', 12 | }, 13 | }) 14 | 15 | /** @type {import('next').NextConfig} */ 16 | const nextConfig = { 17 | reactStrictMode: true, 18 | pageExtensions: ['js', 'jsx', 'ts', 'tsx', 'mdx'], 19 | experimental: { 20 | scrollRestoration: true, 21 | }, 22 | i18n: { 23 | locales: ['en', 'zh'], 24 | defaultLocale: 'en', 25 | localeDetection: false, 26 | }, 27 | async redirects() { 28 | return [ 29 | { 30 | source: '/documentation', 31 | destination: '/documentation/en', 32 | permanent: false, 33 | }, 34 | ] 35 | }, 36 | } 37 | 38 | export default withMDX(nextConfig) 39 | -------------------------------------------------------------------------------- /docs_src/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "tailwindui-template", 3 | "version": "0.1.0", 4 | "private": true, 5 | "scripts": { 6 | "dev": "next dev", 7 | "build": "next build", 8 | "start": "next start", 9 | "lint": "next lint" 10 | }, 11 | "browserslist": "defaults, not ie <= 11", 12 | "dependencies": { 13 | "@algolia/autocomplete-core": "^1.9.3", 14 | "@algolia/autocomplete-preset-algolia": "^1.9.3", 15 | "@headlessui/react": "^1.7.15", 16 | "@heroicons/react": "^2.0.18", 17 | "@mapbox/rehype-prism": "^0.8.0", 18 | "@mdx-js/loader": "^2.1.5", 19 | "@mdx-js/react": "^2.1.5", 20 | "@next/mdx": "^13.0.2", 21 | "@sindresorhus/slugify": "^2.2.1", 22 | "@tailwindcss/typography": "^0.5.4", 23 | "@vercel/analytics": "^1.0.2", 24 | "algoliasearch": "^4.17.2", 25 | "autoprefixer": "^10.4.12", 26 | "axios": "^1.4.0", 27 | "clsx": "^1.2.1", 28 | "fast-glob": "^3.2.11", 29 | "feed": "^4.2.2", 30 | "focus-visible": "^5.2.0", 31 | "framer-motion": "^10.12.16", 32 | "highlight.js": "^11.8.0", 33 | "mdx-annotations": "^0.1.3", 34 | "meilisearch": "^0.33.0", 35 | "next": "13.4.2", 36 | "next-mdx-remote": "^4.4.1", 37 | "next-router-mock": "^0.9.3", 38 | "postcss-focus-visible": "^6.0.4", 39 | "prism-themes": "^1.9.0", 40 | "prismjs": "^1.29.0", 41 | "react": "18.2.0", 42 | "react-dom": "18.2.0", 43 | "react-markdown": "^8.0.7", 44 | "recma-import-images": "^0.0.3", 45 | "recma-nextjs-static-props": "^1.0.0", 46 | "rehype-autolink-headings": "^6.1.1", 47 | "rehype-mdx-title": "^2.0.0", 48 | "rehype-slug": "^5.1.0", 49 | "remark-gfm": "^3.0.1", 50 | "remark-rehype-wrap": "^0.0.2", 51 | "remark-unwrap-images": "^3.0.1", 52 | "shiki": "^0.14.2", 53 | "tailwindcss": "^3.3.0", 54 | "zustand": "^4.3.8" 55 | }, 56 | "devDependencies": { 57 | "eslint": "8.26.0", 58 | "eslint-config-next": "13.0.2", 59 | "prettier": "^2.8.7", 60 | "prettier-plugin-tailwindcss": "^0.2.6" 61 | } 62 | } 63 | -------------------------------------------------------------------------------- /docs_src/postcss.config.js: -------------------------------------------------------------------------------- 1 | module.exports = { 2 | plugins: { 3 | tailwindcss: {}, 4 | 'postcss-focus-visible': { 5 | replaceWith: '[data-focus-visible-added]', 6 | }, 7 | autoprefixer: {}, 8 | }, 9 | } 10 | -------------------------------------------------------------------------------- /docs_src/prettier.config.js: -------------------------------------------------------------------------------- 1 | module.exports = { 2 | singleQuote: true, 3 | semi: false, 4 | plugins: [require('prettier-plugin-tailwindcss')], 5 | } 6 | -------------------------------------------------------------------------------- /docs_src/public/architecture/architecture.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sparckles/Robyn/3b85e62993f0e1e079e1516ea775d2cba1244837/docs_src/public/architecture/architecture.png -------------------------------------------------------------------------------- /docs_src/public/architecture/const-request-optimisation-basis.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sparckles/Robyn/3b85e62993f0e1e079e1516ea775d2cba1244837/docs_src/public/architecture/const-request-optimisation-basis.png -------------------------------------------------------------------------------- /docs_src/public/architecture/const-request-optimisation.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sparckles/Robyn/3b85e62993f0e1e079e1516ea775d2cba1244837/docs_src/public/architecture/const-request-optimisation.png -------------------------------------------------------------------------------- /docs_src/public/architecture/multi-processing.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sparckles/Robyn/3b85e62993f0e1e079e1516ea775d2cba1244837/docs_src/public/architecture/multi-processing.png -------------------------------------------------------------------------------- /docs_src/public/fonts/Inter-italic.var.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sparckles/Robyn/3b85e62993f0e1e079e1516ea775d2cba1244837/docs_src/public/fonts/Inter-italic.var.woff2 -------------------------------------------------------------------------------- /docs_src/public/fonts/Inter-roman.var.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sparckles/Robyn/3b85e62993f0e1e079e1516ea775d2cba1244837/docs_src/public/fonts/Inter-roman.var.woff2 -------------------------------------------------------------------------------- /docs_src/public/fonts/Mona-Sans.var.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sparckles/Robyn/3b85e62993f0e1e079e1516ea775d2cba1244837/docs_src/public/fonts/Mona-Sans.var.woff2 -------------------------------------------------------------------------------- /docs_src/public/robynog.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sparckles/Robyn/3b85e62993f0e1e079e1516ea775d2cba1244837/docs_src/public/robynog.png -------------------------------------------------------------------------------- /docs_src/src/components/Button.jsx: -------------------------------------------------------------------------------- 1 | import Link from 'next/link' 2 | import clsx from 'clsx' 3 | 4 | const variantStyles = { 5 | primary: 6 | 'font-semibold text-zinc-100 bg-zinc-700 hover:bg-zinc-600 active:bg-zinc-700 active:text-zinc-100/70', 7 | secondary: 8 | 'font-medium bg-zinc-800/50 text-zinc-300 hover:bg-zinc-800 hover:text-zinc-50 active:bg-zinc-800/50 active:text-zinc-50/70', 9 | } 10 | 11 | export function Button({ variant = 'primary', className, href, ...props }) { 12 | className = clsx( 13 | 'inline-flex items-center gap-2 justify-center rounded-md py-2 px-3 text-sm outline-offset-2 transition active:transition-none', 14 | variantStyles[variant], 15 | className 16 | ) 17 | 18 | return href ? ( 19 | 20 | ) : ( 21 | 59 |

60 | 61 | ))} 62 | 63 | 64 | ) 65 | } 66 | -------------------------------------------------------------------------------- /docs_src/src/components/documentation/HeroPattern.jsx: -------------------------------------------------------------------------------- 1 | export function HeroPattern() { 2 | return ( 3 |
4 | 17 | ) 18 | } 19 | -------------------------------------------------------------------------------- /docs_src/src/components/documentation/Layout.jsx: -------------------------------------------------------------------------------- 1 | import { motion } from 'framer-motion' 2 | 3 | import { Footer } from '@/components/Footer' 4 | import { BottomNavbar } from '@/components/documentation/BottomNavbar' 5 | import { Navigation } from '@/components/documentation/Navigation' 6 | import { Prose } from '@/components/documentation/Prose' 7 | import { SectionProvider } from '@/components/documentation/SectionProvider' 8 | 9 | export function Layout({ children, sections = [] }) { 10 | return ( 11 | 12 |
13 | 17 |
18 | 19 | 20 | 21 |
22 |
23 |
24 |
25 | {children} 26 |
27 |
28 |
29 |
30 |
31 | ) 32 | } 33 | -------------------------------------------------------------------------------- /docs_src/src/components/documentation/Libraries.jsx: -------------------------------------------------------------------------------- 1 | import Image from 'next/image' 2 | 3 | import { Button } from '@/components/documentation/Button' 4 | import { Heading } from '@/components/documentation/Heading' 5 | 6 | const libraries = [ 7 | { 8 | href: '#', 9 | name: 'PHP', 10 | description: 11 | 'A popular general-purpose scripting language that is especially suited to web development.', 12 | }, 13 | { 14 | href: '#', 15 | name: 'Ruby', 16 | description: 17 | 'A dynamic, open source programming language with a focus on simplicity and productivity.', 18 | }, 19 | { 20 | href: '#', 21 | name: 'Node.js', 22 | description: 23 | 'Node.js® is an open-source, cross-platform JavaScript runtime environment.', 24 | }, 25 | { 26 | href: '#', 27 | name: 'Python', 28 | description: 29 | 'Python is a programming language that lets you work quickly and integrate systems more effectively.', 30 | }, 31 | { 32 | href: '#', 33 | name: 'Go', 34 | description: 35 | 'An open-source programming language supported by Google with built-in concurrency.', 36 | }, 37 | ] 38 | 39 | export function Libraries() { 40 | return ( 41 |
42 | 43 | Official libraries 44 | 45 |
46 | {libraries.map((library) => ( 47 |
48 |
49 |

50 | {library.name} 51 |

52 |

53 | {library.description} 54 |

55 |

56 | 59 |

60 |
61 | 67 |
68 | ))} 69 |
70 |
71 | ) 72 | } 73 | -------------------------------------------------------------------------------- /docs_src/src/components/documentation/ModeToggle.jsx: -------------------------------------------------------------------------------- 1 | function SunIcon(props) { 2 | return ( 3 | 10 | ) 11 | } 12 | 13 | function MoonIcon(props) { 14 | return ( 15 | 18 | ) 19 | } 20 | -------------------------------------------------------------------------------- /docs_src/src/components/documentation/Prose.jsx: -------------------------------------------------------------------------------- 1 | import clsx from 'clsx' 2 | 3 | export function Prose({ className, ...props }) { 4 | return ( 5 |
12 | ) 13 | } 14 | -------------------------------------------------------------------------------- /docs_src/src/components/documentation/Tag.jsx: -------------------------------------------------------------------------------- 1 | import clsx from 'clsx' 2 | 3 | const variantStyles = { 4 | medium: 'rounded-lg px-1.5 ring-1 ring-inset', 5 | } 6 | 7 | const colorStyles = { 8 | orange: { 9 | small: 'text-orange-400', 10 | medium: 'ring-orange-400/30 bg-orange-400/10 text-orange-400', 11 | }, 12 | sky: { 13 | small: 'text-sky-500', 14 | medium: 'ring-sky-400/30 bg-sky-400/10 text-sky-400', 15 | }, 16 | amber: { 17 | small: 'text-amber-500', 18 | medium: 'ring-amber-400/30 bg-amber-400/10 text-amber-400', 19 | }, 20 | rose: { 21 | small: 'text-rose-500', 22 | medium: 'ring-rose-500/20 bg-rose-400/10 text-rose-400', 23 | }, 24 | zinc: { 25 | small: 'text-zinc-500', 26 | medium: 'ring-zinc-500/20 bg-zinc-400/10 text-zinc-400', 27 | }, 28 | } 29 | 30 | const valueColorMap = { 31 | get: 'orange', 32 | post: 'sky', 33 | put: 'amber', 34 | delete: 'rose', 35 | } 36 | 37 | export function Tag({ 38 | children, 39 | variant = 'medium', 40 | color = valueColorMap[children.toLowerCase()] ?? 'orange', 41 | }) { 42 | return ( 43 | 50 | {children} 51 | 52 | ) 53 | } 54 | -------------------------------------------------------------------------------- /docs_src/src/components/documentation/icons/BellIcon.jsx: -------------------------------------------------------------------------------- 1 | export function BellIcon(props) { 2 | return ( 3 | 16 | ) 17 | } 18 | -------------------------------------------------------------------------------- /docs_src/src/components/documentation/icons/BoltIcon.jsx: -------------------------------------------------------------------------------- 1 | export function BoltIcon(props) { 2 | return ( 3 | 10 | ) 11 | } 12 | -------------------------------------------------------------------------------- /docs_src/src/components/documentation/icons/BookIcon.jsx: -------------------------------------------------------------------------------- 1 | export function BookIcon(props) { 2 | return ( 3 | 16 | ) 17 | } 18 | -------------------------------------------------------------------------------- /docs_src/src/components/documentation/icons/CalendarIcon.jsx: -------------------------------------------------------------------------------- 1 | export function CalendarIcon(props) { 2 | return ( 3 | 22 | ) 23 | } 24 | -------------------------------------------------------------------------------- /docs_src/src/components/documentation/icons/CartIcon.jsx: -------------------------------------------------------------------------------- 1 | export function CartIcon(props) { 2 | return ( 3 | 14 | ) 15 | } 16 | -------------------------------------------------------------------------------- /docs_src/src/components/documentation/icons/ChatBubbleIcon.jsx: -------------------------------------------------------------------------------- 1 | export function ChatBubbleIcon(props) { 2 | return ( 3 | 16 | ) 17 | } 18 | -------------------------------------------------------------------------------- /docs_src/src/components/documentation/icons/CheckIcon.jsx: -------------------------------------------------------------------------------- 1 | export function CheckIcon(props) { 2 | return ( 3 | 16 | ) 17 | } 18 | -------------------------------------------------------------------------------- /docs_src/src/components/documentation/icons/ChevronRightLeftIcon.jsx: -------------------------------------------------------------------------------- 1 | export function ChevronRightLeftIcon(props) { 2 | return ( 3 | 16 | ) 17 | } 18 | -------------------------------------------------------------------------------- /docs_src/src/components/documentation/icons/ClipboardIcon.jsx: -------------------------------------------------------------------------------- 1 | export function ClipboardIcon(props) { 2 | return ( 3 | 16 | ) 17 | } 18 | -------------------------------------------------------------------------------- /docs_src/src/components/documentation/icons/CogIcon.jsx: -------------------------------------------------------------------------------- 1 | export function CogIcon(props) { 2 | return ( 3 | 18 | ) 19 | } 20 | -------------------------------------------------------------------------------- /docs_src/src/components/documentation/icons/CopyIcon.jsx: -------------------------------------------------------------------------------- 1 | export function CopyIcon(props) { 2 | return ( 3 | 16 | ) 17 | } 18 | -------------------------------------------------------------------------------- /docs_src/src/components/documentation/icons/DocumentIcon.jsx: -------------------------------------------------------------------------------- 1 | export function DocumentIcon(props) { 2 | return ( 3 | 16 | ) 17 | } 18 | -------------------------------------------------------------------------------- /docs_src/src/components/documentation/icons/EnvelopeIcon.jsx: -------------------------------------------------------------------------------- 1 | export function EnvelopeIcon(props) { 2 | return ( 3 | 16 | ) 17 | } 18 | -------------------------------------------------------------------------------- /docs_src/src/components/documentation/icons/FaceSmileIcon.jsx: -------------------------------------------------------------------------------- 1 | export function FaceSmileIcon(props) { 2 | return ( 3 | 16 | ) 17 | } 18 | -------------------------------------------------------------------------------- /docs_src/src/components/documentation/icons/FolderIcon.jsx: -------------------------------------------------------------------------------- 1 | export function FolderIcon(props) { 2 | return ( 3 | 21 | ) 22 | } 23 | -------------------------------------------------------------------------------- /docs_src/src/components/documentation/icons/LinkIcon.jsx: -------------------------------------------------------------------------------- 1 | export function LinkIcon(props) { 2 | return ( 3 | 11 | ) 12 | } 13 | -------------------------------------------------------------------------------- /docs_src/src/components/documentation/icons/ListIcon.jsx: -------------------------------------------------------------------------------- 1 | export function ListIcon(props) { 2 | return ( 3 | 16 | ) 17 | } 18 | -------------------------------------------------------------------------------- /docs_src/src/components/documentation/icons/MagnifyingGlassIcon.jsx: -------------------------------------------------------------------------------- 1 | export function MagnifyingGlassIcon(props) { 2 | return ( 3 | 12 | ) 13 | } 14 | -------------------------------------------------------------------------------- /docs_src/src/components/documentation/icons/MapPinIcon.jsx: -------------------------------------------------------------------------------- 1 | export function MapPinIcon(props) { 2 | return ( 3 | 18 | ) 19 | } 20 | -------------------------------------------------------------------------------- /docs_src/src/components/documentation/icons/PackageIcon.jsx: -------------------------------------------------------------------------------- 1 | export function PackageIcon(props) { 2 | return ( 3 | 15 | ) 16 | } 17 | -------------------------------------------------------------------------------- /docs_src/src/components/documentation/icons/PaperAirplaneIcon.jsx: -------------------------------------------------------------------------------- 1 | export function PaperAirplaneIcon(props) { 2 | return ( 3 | 16 | ) 17 | } 18 | -------------------------------------------------------------------------------- /docs_src/src/components/documentation/icons/PaperClipIcon.jsx: -------------------------------------------------------------------------------- 1 | export function PaperClipIcon(props) { 2 | return ( 3 | 11 | ) 12 | } 13 | -------------------------------------------------------------------------------- /docs_src/src/components/documentation/icons/ShapesIcon.jsx: -------------------------------------------------------------------------------- 1 | export function ShapesIcon(props) { 2 | return ( 3 | 16 | ) 17 | } 18 | -------------------------------------------------------------------------------- /docs_src/src/components/documentation/icons/ShirtIcon.jsx: -------------------------------------------------------------------------------- 1 | export function ShirtIcon(props) { 2 | return ( 3 | 10 | ) 11 | } 12 | -------------------------------------------------------------------------------- /docs_src/src/components/documentation/icons/SquaresPlusIcon.jsx: -------------------------------------------------------------------------------- 1 | export function SquaresPlusIcon(props) { 2 | return ( 3 | 16 | ) 17 | } 18 | -------------------------------------------------------------------------------- /docs_src/src/components/documentation/icons/TagIcon.jsx: -------------------------------------------------------------------------------- 1 | export function TagIcon(props) { 2 | return ( 3 | 18 | ) 19 | } 20 | -------------------------------------------------------------------------------- /docs_src/src/components/documentation/icons/UserIcon.jsx: -------------------------------------------------------------------------------- 1 | export function UserIcon(props) { 2 | return ( 3 | 23 | ) 24 | } 25 | -------------------------------------------------------------------------------- /docs_src/src/components/documentation/icons/UsersIcon.jsx: -------------------------------------------------------------------------------- 1 | export function UsersIcon(props) { 2 | return ( 3 | 27 | ) 28 | } 29 | -------------------------------------------------------------------------------- /docs_src/src/components/releases/Button.jsx: -------------------------------------------------------------------------------- 1 | import Link from 'next/link' 2 | import clsx from 'clsx' 3 | 4 | function ButtonInner({ arrow = false, children }) { 5 | return ( 6 | <> 7 | 8 | 9 | {children} {arrow ? : null} 10 | 11 | ) 12 | } 13 | 14 | export function Button({ href, className, arrow, children, ...props }) { 15 | className = clsx( 16 | className, 17 | 'group relative isolate flex-none rounded-md py-1.5 text-[0.8125rem]/6 font-semibold text-white', 18 | arrow ? 'pl-2.5 pr-[calc(9/16*1rem)]' : 'px-2.5' 19 | ) 20 | 21 | return href ? ( 22 | 23 | {children} 24 | 25 | ) : ( 26 | 29 | ) 30 | } 31 | -------------------------------------------------------------------------------- /docs_src/src/components/releases/FeedProvider.jsx: -------------------------------------------------------------------------------- 1 | import { createContext, useContext } from 'react' 2 | 3 | let FeedContext = createContext({ isFeed: false }) 4 | 5 | export function FeedProvider({ children }) { 6 | return ( 7 | 8 | {children} 9 | 10 | ) 11 | } 12 | 13 | export function useFeed() { 14 | return useContext(FeedContext) 15 | } 16 | -------------------------------------------------------------------------------- /docs_src/src/components/releases/FormattedDate.jsx: -------------------------------------------------------------------------------- 1 | const dateFormatter = new Intl.DateTimeFormat('en-US', { 2 | year: 'numeric', 3 | month: 'short', 4 | day: 'numeric', 5 | timeZone: 'UTC', 6 | }) 7 | 8 | export function FormattedDate({ date, ...props }) { 9 | date = typeof date === 'string' ? new Date(date) : date 10 | 11 | return ( 12 | 15 | ) 16 | } 17 | -------------------------------------------------------------------------------- /docs_src/src/components/releases/IconLink.jsx: -------------------------------------------------------------------------------- 1 | import Link from 'next/link' 2 | import clsx from 'clsx' 3 | 4 | export function IconLink({ 5 | children, 6 | className, 7 | compact = false, 8 | large = false, 9 | icon: Icon, 10 | ...props 11 | }) { 12 | return ( 13 | 21 | 22 | 23 | {children} 24 | 25 | ) 26 | } 27 | -------------------------------------------------------------------------------- /docs_src/src/components/releases/Layout.jsx: -------------------------------------------------------------------------------- 1 | import { useId } from 'react' 2 | 3 | import { Intro } from '@/components/releases/Intro' 4 | 5 | function Timeline() { 6 | let id = useId() 7 | 8 | return ( 9 |
10 | 25 |
26 | ) 27 | } 28 | 29 | function FixedSidebar({ main }) { 30 | return ( 31 |
32 |
33 |
34 |
35 |
{main}
36 |
37 |
38 |
39 |
40 | ) 41 | } 42 | 43 | export function Layout({ children }) { 44 | return ( 45 | <> 46 | } /> 47 |