├── .github ├── CODEOWNERS ├── ISSUE_TEMPLATE │ ├── BUG_REPORT.yml │ └── FEATURE_REQUEST.yml ├── dependabot.yml └── workflows │ ├── codeql.yml │ └── spammy-guardian.yml ├── .gitignore ├── .husky ├── .gitignore └── pre-commit ├── .npmrc ├── CODE_OF_CONDUCT.md ├── CONTRIBUTING.md ├── LICENSE ├── MAINTENANCE.md ├── Procfile ├── README.md ├── api ├── Conduit.postman_collection.json ├── README.md ├── openapi.yml └── run-api-tests.sh ├── apps ├── api │ ├── .gitignore │ ├── .npmrc │ ├── README.md │ ├── nitro.config.ts │ ├── package.json │ ├── prisma │ │ ├── dev.db │ │ ├── migrations │ │ │ ├── 20241009081140_init │ │ │ │ └── migration.sql │ │ │ └── migration_lock.toml │ │ ├── schema.prisma │ │ └── seed.ts │ ├── server │ │ ├── auth-event-handler.ts │ │ ├── models │ │ │ ├── article.model.ts │ │ │ ├── comment.model.ts │ │ │ ├── http-exception.model.ts │ │ │ ├── profile.model.ts │ │ │ ├── tag.model.ts │ │ │ └── user.model.ts │ │ ├── public │ │ │ └── images │ │ │ │ ├── demo-avatar.png │ │ │ │ └── smiley-cyrus.jpeg │ │ ├── routes │ │ │ └── api │ │ │ │ ├── [...].options.ts │ │ │ │ ├── articles │ │ │ │ ├── [slug] │ │ │ │ │ ├── comments │ │ │ │ │ │ ├── [id].delete.ts │ │ │ │ │ │ ├── index.get.ts │ │ │ │ │ │ └── index.post.ts │ │ │ │ │ ├── favorite │ │ │ │ │ │ ├── index.delete.ts │ │ │ │ │ │ └── index.post.ts │ │ │ │ │ ├── index.delete.ts │ │ │ │ │ ├── index.get.ts │ │ │ │ │ └── index.put.ts │ │ │ │ ├── feed.get.ts │ │ │ │ ├── index.get.ts │ │ │ │ └── index.post.ts │ │ │ │ ├── profiles │ │ │ │ └── [username] │ │ │ │ │ ├── follow │ │ │ │ │ ├── index.delete.ts │ │ │ │ │ └── index.post.ts │ │ │ │ │ └── index.get.ts │ │ │ │ ├── tags │ │ │ │ └── index.get.ts │ │ │ │ ├── user │ │ │ │ ├── index.get.ts │ │ │ │ └── index.put.ts │ │ │ │ ├── users │ │ │ │ ├── index.post.ts │ │ │ │ └── login.post.ts │ │ │ │ └── v2 │ │ │ │ ├── auth │ │ │ │ ├── login.post.ts │ │ │ │ ├── logout.post.ts │ │ │ │ └── signup.post.ts │ │ │ │ └── profile │ │ │ │ ├── [id].get.ts │ │ │ │ └── [id].put.ts │ │ └── utils │ │ │ ├── article.mapper.ts │ │ │ ├── auth.ts │ │ │ ├── author.mapper.ts │ │ │ ├── foo.ts │ │ │ ├── generate-token.ts │ │ │ ├── hash-password.ts │ │ │ ├── prisma.ts │ │ │ └── profile.utils.ts │ └── tsconfig.json └── documentation │ ├── .gitignore │ ├── .vscode │ ├── extensions.json │ └── launch.json │ ├── README.md │ ├── astro.config.mjs │ ├── package-lock.json │ ├── package.json │ ├── public │ └── favicon.svg │ ├── src │ ├── assets │ │ ├── img │ │ │ ├── codebaseshow-logo.png │ │ │ ├── codebaseshow-logo.svg │ │ │ ├── conduit_l.png │ │ │ ├── end.png │ │ │ ├── favicon.ico │ │ │ ├── logo.svg │ │ │ ├── realworld-dual-mode.png │ │ │ ├── realworld-logo.png │ │ │ ├── realworld.png │ │ │ ├── spaceship.png │ │ │ └── stacks_hr.gif │ │ └── swagger.json │ ├── content │ │ ├── config.ts │ │ └── docs │ │ │ ├── community │ │ │ ├── authors.md │ │ │ ├── resources.md │ │ │ └── special-thanks.md │ │ │ ├── implementation-creation │ │ │ ├── expectations.md │ │ │ ├── features.md │ │ │ └── introduction.md │ │ │ ├── index.mdx │ │ │ ├── introduction.mdx │ │ │ └── specifications │ │ │ ├── backend │ │ │ ├── api-response-format.md │ │ │ ├── cors.md │ │ │ ├── endpoints.md │ │ │ ├── error-handling.md │ │ │ ├── introduction.md │ │ │ ├── postman.md │ │ │ └── tests.md │ │ │ ├── frontend │ │ │ ├── api.md │ │ │ ├── routing.md │ │ │ ├── styles.md │ │ │ ├── swagger.mdx │ │ │ ├── templates.md │ │ │ └── tests.md │ │ │ └── mobile-specs │ │ │ └── introduction.md │ ├── env.d.ts │ └── tailwind.css │ ├── tailwind.config.mjs │ └── tsconfig.json ├── media ├── conduit_l.png ├── end.png ├── mobile_icons │ ├── android │ │ ├── mipmap-hdpi │ │ │ └── ic_launcher.png │ │ ├── mipmap-ldpi │ │ │ └── ic_launcher.png │ │ ├── mipmap-mdpi │ │ │ └── ic_launcher.png │ │ ├── mipmap-xhdpi │ │ │ └── ic_launcher.png │ │ ├── mipmap-xxhdpi │ │ │ └── ic_launcher.png │ │ ├── mipmap-xxxhdpi │ │ │ └── ic_launcher.png │ │ └── playstore-icon.png │ ├── imessenger │ │ ├── icon-messages-app-27x20@1x.png │ │ ├── icon-messages-app-27x20@2x.png │ │ ├── icon-messages-app-27x20@3x.png │ │ ├── icon-messages-app-iPadAir-67x50@2x.png │ │ ├── icon-messages-app-iPadAir-74x55@2x.png │ │ ├── icon-messages-app-iPhone-60x45@1x.png │ │ ├── icon-messages-app-iPhone-60x45@2x.png │ │ ├── icon-messages-app-iPhone-60x45@3x.png │ │ ├── icon-messages-app-store-1024x768.png │ │ ├── icon-messages-transcript-32x24@1x.png │ │ ├── icon-messages-transcript-32x24@2x.png │ │ └── icon-messages-transcript-32x24@3x.png │ ├── ios │ │ ├── AppIcon.appiconset │ │ │ ├── Contents.json │ │ │ ├── Icon-App-20x20@1x.png │ │ │ ├── Icon-App-20x20@2x.png │ │ │ ├── Icon-App-20x20@3x.png │ │ │ ├── Icon-App-29x29@1x.png │ │ │ ├── Icon-App-29x29@2x.png │ │ │ ├── Icon-App-29x29@3x.png │ │ │ ├── Icon-App-40x40@1x.png │ │ │ ├── Icon-App-40x40@2x.png │ │ │ ├── Icon-App-40x40@3x.png │ │ │ ├── Icon-App-57x57@1x.png │ │ │ ├── Icon-App-57x57@2x.png │ │ │ ├── Icon-App-60x60@1x.png │ │ │ ├── Icon-App-60x60@2x.png │ │ │ ├── Icon-App-60x60@3x.png │ │ │ ├── Icon-App-72x72@1x.png │ │ │ ├── Icon-App-72x72@2x.png │ │ │ ├── Icon-App-76x76@1x.png │ │ │ ├── Icon-App-76x76@2x.png │ │ │ ├── Icon-App-76x76@3x.png │ │ │ ├── Icon-App-83.5x83.5@2x.png │ │ │ ├── Icon-Small-50x50@1x.png │ │ │ └── Icon-Small-50x50@2x.png │ │ ├── README.md │ │ ├── iTunesArtwork@1x.png │ │ ├── iTunesArtwork@2x.png │ │ └── iTunesArtwork@3x.png │ └── watchkit │ │ └── AppIcon.appiconset │ │ ├── Contents.json │ │ ├── Icon-24@2x.png │ │ ├── Icon-27.5@2x.png │ │ ├── Icon-29@2x.png │ │ ├── Icon-29@3x.png │ │ ├── Icon-40@2x.png │ │ ├── Icon-44@2x.png │ │ ├── Icon-86@2x.png │ │ └── Icon-98@2x.png ├── realworld-dual-mode.png ├── realworld-logo.png ├── realworld.png ├── spacer-1669x257.gif └── stacks_hr.gif ├── package.json ├── pnpm-lock.yaml ├── pnpm-workspace.yaml └── turbo.json /.github/CODEOWNERS: -------------------------------------------------------------------------------- 1 | 2 | -------------------------------------------------------------------------------- /.github/ISSUE_TEMPLATE/BUG_REPORT.yml: -------------------------------------------------------------------------------- 1 | name: 🐞 Bug report 2 | description: Report a bug in the RealWorld project 3 | title: '[Bug]: ' 4 | labels: 5 | - bug 6 | body: 7 | - type: dropdown 8 | attributes: 9 | label: Relevant scope 10 | description: What is the scope of this request? 11 | options: 12 | - Frontend specs 13 | - Backend specs 14 | - Deployed demo 15 | - 'Other: describe below' 16 | validations: 17 | required: true 18 | - type: textarea 19 | attributes: 20 | label: Description 21 | description: A clear and concise description of the problem 22 | validations: 23 | required: true 24 | - type: markdown 25 | attributes: 26 | value: >- 27 | This template was generated with [Issue Forms 28 | Creator](https://www.issue-forms-creator.app/) 29 | -------------------------------------------------------------------------------- /.github/ISSUE_TEMPLATE/FEATURE_REQUEST.yml: -------------------------------------------------------------------------------- 1 | name: 🚀 Feature request 2 | description: Suggest a feature for RealWorld project 3 | title: '[Feature Request]:' 4 | body: 5 | - type: markdown 6 | attributes: 7 | value: '# Feature Request' 8 | - type: dropdown 9 | attributes: 10 | label: Relevant Scope 11 | description: What is the scope of this request? 12 | options: 13 | - Frontend specs 14 | - Backend specs 15 | - 'Other: describe below' 16 | validations: 17 | required: true 18 | - type: textarea 19 | attributes: 20 | label: Description 21 | description: ' ' 22 | validations: 23 | required: true 24 | - type: textarea 25 | attributes: 26 | label: Describe the solution you'd like 27 | description: If you have a solution in mind, please describe it. 28 | - type: textarea 29 | attributes: 30 | label: Describe alternatives you've considered 31 | description: Have you considered any alternative solutions or workarounds? 32 | - type: markdown 33 | attributes: 34 | value: >- 35 | This template was generated with [Issue Forms 36 | Creator](https://www.issue-forms-creator.app/) 37 | -------------------------------------------------------------------------------- /.github/dependabot.yml: -------------------------------------------------------------------------------- 1 | version: 2 2 | updates: 3 | - package-ecosystem: github-actions 4 | directory: '/' 5 | schedule: 6 | interval: weekly 7 | open-pull-requests-limit: 10 8 | 9 | - package-ecosystem: npm 10 | directory: '/' 11 | schedule: 12 | interval: weekly 13 | open-pull-requests-limit: 10 14 | -------------------------------------------------------------------------------- /.github/workflows/codeql.yml: -------------------------------------------------------------------------------- 1 | name: 'CodeQL' 2 | 3 | on: 4 | workflow_dispatch: 5 | schedule: 6 | - cron: '24 3 * * 3' 7 | 8 | jobs: 9 | analyze: 10 | name: Analyze 11 | runs-on: ubuntu-latest 12 | permissions: 13 | actions: read 14 | contents: read 15 | security-events: write 16 | 17 | strategy: 18 | fail-fast: false 19 | matrix: 20 | language: ['javascript'] 21 | 22 | steps: 23 | - name: Checkout repository 24 | uses: actions/checkout@v4 25 | 26 | - name: Initialize CodeQL 27 | uses: github/codeql-action/init@v2 28 | with: 29 | languages: ${{ matrix.language }} 30 | 31 | - name: Perform CodeQL Analysis 32 | uses: github/codeql-action/analyze@v2 33 | with: 34 | category: '/language:${{matrix.language}}' 35 | -------------------------------------------------------------------------------- /.github/workflows/spammy-guardian.yml: -------------------------------------------------------------------------------- 1 | name: Spammy Guardian 2 | on: 3 | workflow_dispatch: 4 | inputs: 5 | issueId: 6 | description: 'id of the issue to test againt' 7 | required: true 8 | issue_comment: 9 | issues: 10 | types: [opened] 11 | jobs: 12 | spammy-guardian: 13 | runs-on: ubuntu-latest 14 | if: ${{ github.actor != 'dependabot[bot]' || github.actor != 'netlify[bot]' }} 15 | steps: 16 | - uses: kerhub/spammy-guardian@fa79bcda24df6dae5b93285e1749e59c77add4bd 17 | with: 18 | token: ${{ secrets.GITHUB_TOKEN }} 19 | -------------------------------------------------------------------------------- /.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 | # Local env files 9 | .env 10 | .env.local 11 | .env.development.local 12 | .env.test.local 13 | .env.production.local 14 | 15 | # Testing 16 | coverage 17 | 18 | # Turbo 19 | .turbo 20 | 21 | # Vercel 22 | .vercel 23 | 24 | # Build Outputs 25 | .next/ 26 | out/ 27 | build 28 | dist 29 | 30 | 31 | # Debug 32 | npm-debug.log* 33 | yarn-debug.log* 34 | yarn-error.log* 35 | 36 | # Misc 37 | .DS_Store 38 | *.pem 39 | 40 | 41 | # IDEs 42 | .idea 43 | -------------------------------------------------------------------------------- /.husky/.gitignore: -------------------------------------------------------------------------------- 1 | _ 2 | -------------------------------------------------------------------------------- /.husky/pre-commit: -------------------------------------------------------------------------------- 1 | #!/bin/sh 2 | . "$(dirname "$0")/_/husky.sh" 3 | 4 | npx lint-staged 5 | -------------------------------------------------------------------------------- /.npmrc: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gothinkster/realworld/6dc657a136a00b4f6441a5b4506b7e5712c79ebd/.npmrc -------------------------------------------------------------------------------- /CODE_OF_CONDUCT.md: -------------------------------------------------------------------------------- 1 | # Contributor Covenant Code of Conduct 2 | 3 | ## Our Pledge 4 | 5 | We as members, contributors, and leaders pledge to make participation in our 6 | community a harassment-free experience for everyone, regardless of age, body 7 | size, visible or invisible disability, ethnicity, sex characteristics, gender 8 | identity and expression, level of experience, education, socio-economic status, 9 | nationality, personal appearance, race, religion, or sexual identity 10 | and orientation. 11 | 12 | We pledge to act and interact in ways that contribute to an open, welcoming, 13 | diverse, inclusive, and healthy community. 14 | 15 | ## Our Standards 16 | 17 | Examples of behavior that contributes to a positive environment for our 18 | community include: 19 | 20 | - Demonstrating empathy and kindness toward other people 21 | - Being respectful of differing opinions, viewpoints, and experiences 22 | - Giving and gracefully accepting constructive feedback 23 | - Accepting responsibility and apologizing to those affected by our mistakes, 24 | and learning from the experience 25 | - Focusing on what is best not just for us as individuals, but for the 26 | overall community 27 | 28 | Examples of unacceptable behavior include: 29 | 30 | - The use of sexualized language or imagery, and sexual attention or 31 | advances of any kind 32 | - Trolling, insulting or derogatory comments, and personal or political attacks 33 | - Public or private harassment 34 | - Publishing others' private information, such as a physical or email 35 | address, without their explicit permission 36 | - Other conduct which could reasonably be considered inappropriate in a 37 | professional setting 38 | 39 | ## Enforcement Responsibilities 40 | 41 | Community leaders are responsible for clarifying and enforcing our standards of 42 | acceptable behavior and will take appropriate and fair corrective action in 43 | response to any behavior that they deem inappropriate, threatening, offensive, 44 | or harmful. 45 | 46 | Community leaders have the right and responsibility to remove, edit, or reject 47 | comments, commits, code, wiki edits, issues, and other contributions that are 48 | not aligned to this Code of Conduct, and will communicate reasons for moderation 49 | decisions when appropriate. 50 | 51 | ## Scope 52 | 53 | This Code of Conduct applies within all community spaces, and also applies when 54 | an individual is officially representing the community in public spaces. 55 | Examples of representing our community include using an official e-mail address, 56 | posting via an official social media account, or acting as an appointed 57 | representative at an online or offline event. 58 | 59 | ## Enforcement 60 | 61 | Instances of abusive, harassing, or otherwise unacceptable behavior may be 62 | reported to the community leaders responsible for enforcement at 63 | hello@thinkster.io. 64 | All complaints will be reviewed and investigated promptly and fairly. 65 | 66 | All community leaders are obligated to respect the privacy and security of the 67 | reporter of any incident. 68 | 69 | ## Enforcement Guidelines 70 | 71 | Community leaders will follow these Community Impact Guidelines in determining 72 | the consequences for any action they deem in violation of this Code of Conduct: 73 | 74 | ### 1. Correction 75 | 76 | **Community Impact**: Use of inappropriate language or other behavior deemed 77 | unprofessional or unwelcome in the community. 78 | 79 | **Consequence**: A private, written warning from community leaders, providing 80 | clarity around the nature of the violation and an explanation of why the 81 | behavior was inappropriate. A public apology may be requested. 82 | 83 | ### 2. Warning 84 | 85 | **Community Impact**: A violation through a single incident or series 86 | of actions. 87 | 88 | **Consequence**: A warning with consequences for continued behavior. No 89 | interaction with the people involved, including unsolicited interaction with 90 | those enforcing the Code of Conduct, for a specified period of time. This 91 | includes avoiding interactions in community spaces as well as external channels 92 | like social media. Violating these terms may lead to a temporary or 93 | permanent ban. 94 | 95 | ### 3. Temporary Ban 96 | 97 | **Community Impact**: A serious violation of community standards, including 98 | sustained inappropriate behavior. 99 | 100 | **Consequence**: A temporary ban from any sort of interaction or public 101 | communication with the community for a specified period of time. No public or 102 | private interaction with the people involved, including unsolicited interaction 103 | with those enforcing the Code of Conduct, is allowed during this period. 104 | Violating these terms may lead to a permanent ban. 105 | 106 | ### 4. Permanent Ban 107 | 108 | **Community Impact**: Demonstrating a pattern of violation of community 109 | standards, including sustained inappropriate behavior, harassment of an 110 | individual, or aggression toward or disparagement of classes of individuals. 111 | 112 | **Consequence**: A permanent ban from any sort of public interaction within 113 | the community. 114 | 115 | ## Attribution 116 | 117 | This Code of Conduct is adapted from the [Contributor Covenant][homepage], 118 | version 2.0, available at 119 | https://www.contributor-covenant.org/version/2/0/code_of_conduct.html. 120 | 121 | Community Impact Guidelines were inspired by [Mozilla's code of conduct 122 | enforcement ladder](https://github.com/mozilla/diversity). 123 | 124 | [homepage]: https://www.contributor-covenant.org 125 | 126 | For answers to common questions about this code of conduct, see the FAQ at 127 | https://www.contributor-covenant.org/faq. Translations are available at 128 | https://www.contributor-covenant.org/translations. 129 | -------------------------------------------------------------------------------- /CONTRIBUTING.md: -------------------------------------------------------------------------------- 1 | # Contributing to RealWorld 2 | 3 | We would love for you to contribute to RealWorld and help make it even better than it is 4 | today! As a contributor, here are the guidelines we would like you to follow: 5 | 6 | - [Code of Conduct](#coc) 7 | - [Question or Problem?](#question) 8 | - [Issues and Bugs](#issue) 9 | - [Feature Requests](#feature) 10 | - [Submission Guidelines](#submit) 11 | - [Coding Rules](#rules) 12 | - [Commit Message Guidelines](#commit) 13 | 14 | ## Code of Conduct 15 | 16 | Help us keep RealWorld open and inclusive. Please read and follow our [Code of Conduct][coc]. 17 | 18 | ## Got a Question or Problem? 19 | 20 | Do not open issues for general support questions as we want to keep GitHub issues for bug reports and feature requests. 21 | For open discussions, we encourage you to use the [Github Discussions][github-discussions] channels. 22 | 23 | ## Interested in creating Conduit for your framework? 24 | 25 | To create an official implementation of Conduit, check out our [Github Discussions](https://github.com/gothinkster/realworld/discussions/categories/wip-implementations) and see if anyone else has requested and/or is already working on your framework. 26 | If not, feel free to start working on one! 27 | 28 | Start [here][github-spec]! 29 | 30 | ## Found a Bug? 31 | 32 | If you find a bug in the project, you can help us by 33 | [submitting an issue][github-issue] to our [GitHub Repository][github]. Even better, you can 34 | [submit a Pull Request](#submit-pr) with a fix. 35 | 36 | ## Missing a Feature? 37 | 38 | You can _request_ a new feature by [submitting an issue](#submit-issue) to our GitHub 39 | repository. 40 | 41 | If you would like to _implement_ a new feature, please submit an issue with 42 | a proposal for your work **FIRST**, to be sure that we can use it. 43 | Please consider what kind of change it is: 44 | 45 | - For a **Major Feature**, first open an issue and outline your proposal so that it can be 46 | discussed. This will also allow us to better coordinate our efforts, prevent duplication of work, 47 | and help you to craft the change so that it is successfully accepted into the project. 48 | - **Small Features** can be crafted and directly [submitted as a Pull Request](#submit-pr). 49 | 50 | ## Submission Guidelines 51 | 52 | ### Submitting an Issue 53 | 54 | Before you submit an issue, please search the issue tracker, maybe an issue for your problem already exists and the discussion might inform you of workarounds readily available. 55 | 56 | You can file new issues by selecting from our [new issue templates][github-choose] and filling out the issue template. 57 | 58 | ### Submitting a Pull Request (PR) 59 | 60 | Before you submit your Pull Request (PR) consider the following guidelines: 61 | 62 | 1. Search [GitHub](https://github.com/gothinkster/realworld/pulls) for an open or closed PR 63 | that relates to your submission. You don't want to duplicate effort. 64 | 1. Be sure that an issue describes the problem you're fixing, or documents the design for the feature you'd like to add. 65 | Discussing the design up front helps to ensure that we're ready to accept your work. 66 | 1. Fork the gothinkster/realworld repo. 67 | 1. Make your changes in a new git branch: 68 | 69 | ```bash 70 | git checkout -b my-fix-branch master 71 | ``` 72 | 73 | 1. Create your patch. 74 | 75 | 1. Commit your changes using a descriptive commit message that follows our 76 | [commit message conventions](#commit). 77 | 78 | 1. Push your branch to GitHub: 79 | 80 | ```bash 81 | git push origin my-fix-branch 82 | ``` 83 | 84 | 1. In GitHub, send a pull request to `realworld:master`. 85 | 86 | - If we suggest changes then: 87 | 88 | - Make the required updates. 89 | - Rebase your branch and force push to your GitHub repository (this will update your Pull Request): 90 | 91 | ```bash 92 | git rebase master -i 93 | git push -f 94 | ``` 95 | 96 | That's it! Thank you for your contribution! 97 | 98 | #### After your pull request is merged 99 | 100 | After your pull request is merged, you can safely delete your branch and pull the changes 101 | from the master (upstream) repository: 102 | 103 | - Delete the remote branch on GitHub either through the GitHub web UI or your local shell as follows: 104 | 105 | ```bash 106 | git push origin --delete my-fix-branch 107 | ``` 108 | 109 | - Check out the master branch: 110 | 111 | ```bash 112 | git checkout master -f 113 | ``` 114 | 115 | - Delete the local branch: 116 | 117 | ```bash 118 | git branch -D my-fix-branch 119 | ``` 120 | 121 | - Update your master with the latest upstream version: 122 | 123 | ```bash 124 | git pull --ff upstream master 125 | ``` 126 | 127 | ## Commit Message Guidelines 128 | 129 | > These guidelines have been added to the project starting from 130 | 131 | We have very precise rules over how our git commit messages can be formatted. This leads to **more 132 | readable messages** that are easy to follow when looking through the **project history**. 133 | 134 | ### Commit Message Format 135 | 136 | Each commit message consists of a **header**, a **body** and a **footer**. The header has a special 137 | format that includes a **type**, a **scope** and a **subject**: 138 | 139 | ``` 140 | (): 141 | 142 | 143 | 144 |