├── .nvmrc ├── .gitignore ├── dist └── package.json ├── assets └── screenshot.png ├── .prettierrc.yml ├── .github ├── FUNDING.yml └── workflows │ └── release.yml ├── LICENSE ├── src ├── utils.js ├── schema.js └── index.js ├── action.yml ├── package.json ├── README.md └── CHANGELOG.md /.nvmrc: -------------------------------------------------------------------------------- 1 | 20.9.0 2 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | node_modules 2 | .assets 3 | -------------------------------------------------------------------------------- /dist/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "type": "module" 3 | } 4 | -------------------------------------------------------------------------------- /assets/screenshot.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/dessant/support-requests/HEAD/assets/screenshot.png -------------------------------------------------------------------------------- /.prettierrc.yml: -------------------------------------------------------------------------------- 1 | singleQuote: true 2 | bracketSpacing: false 3 | arrowParens: 'avoid' 4 | trailingComma: 'none' 5 | -------------------------------------------------------------------------------- /.github/FUNDING.yml: -------------------------------------------------------------------------------- 1 | github: dessant 2 | patreon: dessant 3 | custom: 4 | - https://armin.dev/go/paypal 5 | - https://armin.dev/go/bitcoin 6 | -------------------------------------------------------------------------------- /.github/workflows/release.yml: -------------------------------------------------------------------------------- 1 | name: Create release 2 | 3 | on: 4 | push: 5 | tags: 6 | - 'v[0-9]+.[0-9]+.[0-9]+' 7 | 8 | jobs: 9 | release: 10 | name: Release on GitHub 11 | runs-on: ubuntu-22.04 12 | permissions: 13 | contents: write 14 | steps: 15 | - name: Create GitHub release 16 | uses: softprops/action-gh-release@v1 17 | with: 18 | tag_name: ${{ github.ref_name }} 19 | name: ${{ github.ref_name }} 20 | body: > 21 | Learn more about this release from the [changelog](https://github.com/dessant/support-requests/blob/main/CHANGELOG.md#changelog). 22 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) 2017-2023 Armin Sebastian 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. 22 | -------------------------------------------------------------------------------- /src/utils.js: -------------------------------------------------------------------------------- 1 | import core from '@actions/core'; 2 | import github from '@actions/github'; 3 | import {retry} from '@octokit/plugin-retry'; 4 | import {throttling} from '@octokit/plugin-throttling'; 5 | 6 | import {schema} from './schema.js'; 7 | 8 | function getConfig() { 9 | const input = Object.fromEntries( 10 | Object.keys(schema.describe().keys).map(item => [item, core.getInput(item)]) 11 | ); 12 | 13 | const {error, value} = schema.validate(input, {abortEarly: false}); 14 | if (error) { 15 | throw error; 16 | } 17 | 18 | return value; 19 | } 20 | 21 | function getClient(token) { 22 | const requestRetries = 3; 23 | 24 | const rateLimitCallback = function ( 25 | retryAfter, 26 | options, 27 | octokit, 28 | retryCount 29 | ) { 30 | core.info( 31 | `Request quota exhausted for request ${options.method} ${options.url}` 32 | ); 33 | 34 | if (retryCount < requestRetries) { 35 | core.info(`Retrying after ${retryAfter} seconds`); 36 | 37 | return true; 38 | } 39 | }; 40 | 41 | const options = { 42 | request: {retries: requestRetries}, 43 | throttle: { 44 | onSecondaryRateLimit: rateLimitCallback, 45 | onRateLimit: rateLimitCallback 46 | } 47 | }; 48 | 49 | return github.getOctokit(token, options, retry, throttling); 50 | } 51 | 52 | export {getConfig, getClient}; 53 | -------------------------------------------------------------------------------- /src/schema.js: -------------------------------------------------------------------------------- 1 | import Joi from 'joi'; 2 | 3 | const extendedJoi = Joi.extend(joi => { 4 | return { 5 | type: 'closeReason', 6 | base: joi.string(), 7 | coerce: { 8 | from: 'string', 9 | method(value, helpers) { 10 | value = value.trim(); 11 | if (value === 'not planned') { 12 | value = 'not_planned'; 13 | } 14 | 15 | return {value}; 16 | } 17 | } 18 | }; 19 | }); 20 | 21 | const schema = Joi.object({ 22 | 'github-token': Joi.string().trim().max(100), 23 | 24 | 'support-label': Joi.string().trim().max(50).default('support'), 25 | 26 | 'issue-comment': Joi.string() 27 | .trim() 28 | .max(10000) 29 | .allow('') 30 | .default( 31 | ':wave: @{issue-author}, we use the issue tracker exclusively ' + 32 | 'for bug reports and feature requests. However, this issue appears ' + 33 | 'to be a support request. Please use our support channels ' + 34 | 'to get help with the project.' 35 | ), 36 | 37 | 'close-issue': Joi.boolean().default(true), 38 | 39 | 'issue-close-reason': extendedJoi 40 | .closeReason() 41 | .valid('completed', 'not_planned') 42 | .default('not planned'), 43 | 44 | 'lock-issue': Joi.boolean().default(true), 45 | 46 | 'issue-lock-reason': Joi.string() 47 | .valid('resolved', 'off-topic', 'too heated', 'spam', '') 48 | .default('off-topic') 49 | }); 50 | 51 | export {schema}; 52 | -------------------------------------------------------------------------------- /action.yml: -------------------------------------------------------------------------------- 1 | name: 'Support Requests' 2 | description: 'Comment on and close issues labeled as support requests' 3 | author: 'Armin Sebastian' 4 | inputs: 5 | github-token: 6 | description: 'GitHub access token' 7 | default: '${{ github.token }}' 8 | support-label: 9 | description: 'Label used to mark issues as support requests' 10 | default: 'support' 11 | issue-comment: 12 | description: 'Comment to post on issues marked as support requests, `{issue-author}` is an optional placeholder' 13 | default: > 14 | :wave: @{issue-author}, we use the issue tracker exclusively for bug reports 15 | and feature requests. However, this issue appears to be a support request. 16 | Please use our support channels to get help with the project. 17 | close-issue: 18 | description: 'Close issues marked as support requests, value must be either `true` or `false`' 19 | default: true 20 | issue-close-reason: 21 | description: 'Reason for closing issues, value must be either `completed` or `not planned`' 22 | default: 'not planned' 23 | lock-issue: 24 | description: Lock issues marked as support requests, value must be either `true` or `false`' 25 | default: false 26 | issue-lock-reason: 27 | description: 'Reason for locking issues, value must be one of `resolved`, `off-topic`, `too heated` or `spam`' 28 | default: 'off-topic' 29 | runs: 30 | using: 'node20' 31 | main: 'dist/index.js' 32 | branding: 33 | icon: 'help-circle' 34 | color: 'purple' 35 | -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "support-requests", 3 | "version": "4.0.0", 4 | "description": "A GitHub Action that comments on and closes issues labeled as support requests.", 5 | "author": "Armin Sebastian", 6 | "license": "MIT", 7 | "homepage": "https://github.com/dessant/support-requests", 8 | "repository": { 9 | "url": "https://github.com/dessant/support-requests.git", 10 | "type": "git" 11 | }, 12 | "bugs": { 13 | "url": "https://github.com/dessant/support-requests/issues" 14 | }, 15 | "type": "module", 16 | "main": "src/index.js", 17 | "scripts": { 18 | "build": "ncc build src/index.js -o dist", 19 | "update": "ncu --upgrade", 20 | "release": "commit-and-tag-version", 21 | "push": "git push --tags origin main" 22 | }, 23 | "dependencies": { 24 | "@actions/core": "^1.10.1", 25 | "@actions/github": "^6.0.0", 26 | "@octokit/plugin-throttling": "^8.1.2", 27 | "@octokit/plugin-retry": "^6.0.1", 28 | "joi": "^17.11.0" 29 | }, 30 | "devDependencies": { 31 | "@vercel/ncc": "^0.38.1", 32 | "commit-and-tag-version": "^12.0.0", 33 | "npm-check-updates": "^16.14.6", 34 | "prettier": "^3.1.0" 35 | }, 36 | "engines": { 37 | "node": ">=20.0.0" 38 | }, 39 | "keywords": [ 40 | "github", 41 | "issues", 42 | "support", 43 | "label", 44 | "support issues", 45 | "label issues", 46 | "close issues", 47 | "automation", 48 | "github actions", 49 | "project management", 50 | "bot" 51 | ], 52 | "private": true 53 | } 54 | -------------------------------------------------------------------------------- /src/index.js: -------------------------------------------------------------------------------- 1 | import core from '@actions/core'; 2 | import github from '@actions/github'; 3 | 4 | import {getConfig, getClient} from './utils.js'; 5 | 6 | async function run() { 7 | try { 8 | const config = getConfig(); 9 | const client = getClient(config['github-token']); 10 | 11 | const app = new App(config, client); 12 | if (github.context.payload.action === 'labeled') { 13 | await app.labeled(); 14 | } else if (github.context.payload.action === 'unlabeled') { 15 | await app.unlabeled(); 16 | } else if (github.context.payload.action === 'reopened') { 17 | await app.reopened(); 18 | } 19 | } catch (err) { 20 | core.setFailed(err); 21 | } 22 | } 23 | 24 | class App { 25 | constructor(config, client) { 26 | this.config = config; 27 | this.client = client; 28 | } 29 | 30 | async labeled() { 31 | if (github.context.payload.label.name !== this.config['support-label']) { 32 | return; 33 | } 34 | 35 | const issueData = github.context.payload.issue; 36 | const issue = {...github.context.repo, issue_number: issueData.number}; 37 | 38 | const comment = this.config['issue-comment']; 39 | if (comment) { 40 | core.debug(`Commenting (issue: ${issue.issue_number})`); 41 | 42 | const commentBody = comment.replace( 43 | /{issue-author}/, 44 | issueData.user.login 45 | ); 46 | await this.ensureUnlock( 47 | issue, 48 | { 49 | active: issueData.locked, 50 | reason: issueData.active_lock_reason, 51 | restoreLock: !this.config['lock-issue'] 52 | }, 53 | () => 54 | this.client.rest.issues 55 | .createComment({...issue, body: commentBody}) 56 | .catch(err => core.warning(err.toString())) 57 | ); 58 | } 59 | 60 | const closeReason = this.config['issue-close-reason']; 61 | if ( 62 | this.config['close-issue'] && 63 | (issueData.state === 'open' || issueData.state_reason !== closeReason) 64 | ) { 65 | core.debug(`Closing (issue: ${issue.issue_number})`); 66 | 67 | await this.client.rest.issues.update({ 68 | ...issue, 69 | state: 'closed', 70 | state_reason: closeReason 71 | }); 72 | } 73 | 74 | const lockReason = this.config['issue-lock-reason'] || null; 75 | if ( 76 | this.config['lock-issue'] && 77 | (!issueData.locked || issueData.active_lock_reason !== lockReason) 78 | ) { 79 | core.debug(`Locking (issue: ${issue.issue_number})`); 80 | 81 | const params = {...issue}; 82 | 83 | if (lockReason) { 84 | params.lock_reason = lockReason; 85 | } 86 | 87 | // Lock reason is not updated when issue is locked 88 | // Issue is unlocked before posting comment 89 | if (issueData.active_lock_reason !== lockReason && !comment) { 90 | await this.client.rest.issues.unlock(issue); 91 | } 92 | 93 | await this.client.rest.issues.lock(params); 94 | } 95 | } 96 | 97 | async unlabeled() { 98 | if (github.context.payload.label.name !== this.config['support-label']) { 99 | return; 100 | } 101 | 102 | const issueData = github.context.payload.issue; 103 | const issue = {...github.context.repo, issue_number: issueData.number}; 104 | 105 | if (this.config['close-issue'] && issueData.state === 'closed') { 106 | core.debug(`Reopening (issue: ${issue.issue_number})`); 107 | 108 | await this.client.rest.issues.update({...issue, state: 'open'}); 109 | } 110 | 111 | if (this.config['lock-issue'] && issueData.locked) { 112 | core.debug(`Unlocking (issue: ${issue.issue_number})`); 113 | 114 | await this.client.rest.issues.unlock(issue); 115 | } 116 | } 117 | 118 | async reopened() { 119 | const issueData = github.context.payload.issue; 120 | const supportLabel = this.config['support-label']; 121 | 122 | if (!issueData.labels.map(label => label.name).includes(supportLabel)) { 123 | return; 124 | } 125 | 126 | const issue = {...github.context.repo, issue_number: issueData.number}; 127 | 128 | core.debug(`Unlabeling (issue: ${issue.issue_number})`); 129 | 130 | await this.client.rest.issues.removeLabel({...issue, name: supportLabel}); 131 | 132 | if (this.config['lock-issue'] && issueData.locked) { 133 | core.debug(`Unlocking (issue: ${issue.issue_number})`); 134 | 135 | await this.client.rest.issues.unlock(issue); 136 | } 137 | } 138 | 139 | async ensureUnlock(issue, lock, action) { 140 | if (lock.active) { 141 | if (!lock.hasOwnProperty('reason')) { 142 | const {data: issueData} = await this.client.rest.issues.get(issue); 143 | lock.reason = issueData.active_lock_reason; 144 | } 145 | 146 | await this.client.rest.issues.unlock(issue); 147 | 148 | let actionError; 149 | try { 150 | await action(); 151 | } catch (err) { 152 | actionError = err; 153 | } 154 | 155 | if (lock.restoreLock) { 156 | if (lock.reason) { 157 | issue = {...issue, lock_reason: lock.reason}; 158 | } 159 | 160 | await this.client.rest.issues.lock(issue); 161 | } 162 | 163 | if (actionError) { 164 | throw actionError; 165 | } 166 | } else { 167 | await action(); 168 | } 169 | } 170 | } 171 | 172 | run(); 173 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # Support Requests 2 | 3 | Support Requests is a GitHub Action that comments on 4 | and closes issues labeled as support requests. 5 | 6 | ![](assets/screenshot.png) 7 | 8 | ## Supporting the Project 9 | 10 | The continued development of Support Requests is made possible 11 | thanks to the support of awesome backers. If you'd like to join them, 12 | please consider contributing with 13 | [Patreon](https://armin.dev/go/patreon?pr=support-requests&src=repo), 14 | [PayPal](https://armin.dev/go/paypal?pr=support-requests&src=repo) or 15 | [Bitcoin](https://armin.dev/go/bitcoin?pr=support-requests&src=repo). 16 | 17 | ## Description 18 | 19 | Support Requests is a specialized version of 20 | [Label Actions](https://github.com/dessant/label-actions), 21 | and it can perform the following actions when an issue 22 | is labeled, unlabeled or reopened: 23 | 24 | - The support label is added: leave a comment, close and lock the issue 25 | - The support label is removed: reopen and unlock the issue 26 | - The issue is reopened: remove the support label, unlock the issue 27 | 28 | ## Usage 29 | 30 | Create the `support-requests.yml` workflow file in the `.github/workflows` 31 | directory, use one of the [example workflows](#examples) to get started. 32 | 33 | ### Inputs 34 | 35 | The action can be configured using [input parameters](https://docs.github.com/en/actions/using-workflows/workflow-syntax-for-github-actions#jobsjob_idstepswith). 36 | 37 | 38 | - **`github-token`** 39 | - GitHub access token, value must be `${{ github.token }}` or an encrypted 40 | secret that contains a [personal access token](#using-a-personal-access-token) 41 | - Optional, defaults to `${{ github.token }}` 42 | - **`support-label`** 43 | - Label used to mark issues as support requests 44 | - Optional, defaults to `support` 45 | - **`issue-comment`** 46 | - Comment to post on issues marked as support requests, 47 | `{issue-author}` is an optional placeholder 48 | - Optional, defaults to `:wave: @{issue-author}, we use the issue tracker 49 | exclusively for bug reports and feature requests. However, this issue 50 | appears to be a support request. Please use our support channels 51 | to get help with the project.` 52 | - **`close-issue`** 53 | - Close issues marked as support requests, 54 | value must be either `true` or `false` 55 | - Optional, defaults to `true` 56 | - **`issue-close-reason`** 57 | - Reason for closing issues, value must be 58 | either `completed` or `not planned` 59 | - Optional, defaults to `not planned` 60 | - **`lock-issue`** 61 | - Lock issues marked as support requests, 62 | value must be either `true` or `false` 63 | - Optional, defaults to `false` 64 | - **`issue-lock-reason`** 65 | - Reason for locking issues, value must be one 66 | of `resolved`, `off-topic`, `too heated` or `spam` 67 | - Optional, defaults to `off-topic` 68 | 69 | ## Examples 70 | 71 | The following workflow will comment on and close issues 72 | marked as support requests. 73 | 74 | 75 | ```yaml 76 | name: 'Support Requests' 77 | 78 | on: 79 | issues: 80 | types: [labeled, unlabeled, reopened] 81 | 82 | permissions: 83 | issues: write 84 | 85 | jobs: 86 | action: 87 | runs-on: ubuntu-latest 88 | steps: 89 | - uses: dessant/support-requests@v4 90 | ``` 91 | 92 | ### Available input parameters 93 | 94 | This workflow declares all the available input parameters of the action 95 | and their default values. Any of the parameters can be omitted. 96 | 97 | 98 | ```yaml 99 | name: 'Support Requests' 100 | 101 | on: 102 | issues: 103 | types: [labeled, unlabeled, reopened] 104 | 105 | permissions: 106 | issues: write 107 | 108 | jobs: 109 | action: 110 | runs-on: ubuntu-latest 111 | steps: 112 | - uses: dessant/support-requests@v4 113 | with: 114 | github-token: ${{ github.token }} 115 | support-label: 'support' 116 | issue-comment: > 117 | :wave: @{issue-author}, we use the issue tracker exclusively 118 | for bug reports and feature requests. However, this issue appears 119 | to be a support request. Please use our support channels 120 | to get help with the project. 121 | close-issue: true 122 | issue-close-reason: 'not planned' 123 | lock-issue: false 124 | issue-lock-reason: 'off-topic' 125 | ``` 126 | 127 | ### Using a personal access token 128 | 129 | The action uses an installation access token by default to interact with GitHub. 130 | You may also authenticate with a personal access token to perform actions 131 | as a GitHub user instead of the `github-actions` app. 132 | 133 | Create a [personal access token](https://docs.github.com/en/authentication/keeping-your-account-and-data-secure/managing-your-personal-access-tokens#creating-a-personal-access-token-classic) 134 | with the `repo` or `public_repo` scopes enabled, and add the token as an 135 | [encrypted secret](https://docs.github.com/en/actions/security-guides/using-secrets-in-github-actions#creating-secrets-for-a-repository) 136 | for the repository or organization, then provide the action with the secret 137 | using the `github-token` input parameter. 138 | 139 | 140 | ```yaml 141 | steps: 142 | - uses: dessant/support-requests@v4 143 | with: 144 | github-token: ${{ secrets.PERSONAL_ACCESS_TOKEN }} 145 | ``` 146 | 147 | ## License 148 | 149 | Copyright (c) 2017-2023 Armin Sebastian 150 | 151 | This software is released under the terms of the MIT License. 152 | See the [LICENSE](LICENSE) file for further information. 153 | -------------------------------------------------------------------------------- /CHANGELOG.md: -------------------------------------------------------------------------------- 1 | # Changelog 2 | 3 | All notable changes to this project will be documented in this file. See [commit-and-tag-version](https://github.com/absolute-version/commit-and-tag-version) for commit guidelines. 4 | 5 | ## [4.0.0](https://github.com/dessant/support-requests/compare/v3.0.0...v4.0.0) (2023-11-15) 6 | 7 | 8 | ### ⚠ BREAKING CHANGES 9 | 10 | * the action now requires Node.js 20 11 | 12 | ### Features 13 | 14 | * set close reason ([cb26bc2](https://github.com/dessant/support-requests/commit/cb26bc2f96dccbf470d41a582ba8815e262928fa)), closes [#10](https://github.com/dessant/support-requests/issues/10) 15 | 16 | 17 | ### Bug Fixes 18 | 19 | * always apply close and lock reason ([7e8888e](https://github.com/dessant/support-requests/commit/7e8888e8b42b2ea7092921e6f6997484c8cb8366)) 20 | * retry and throttle GitHub API requests ([2755608](https://github.com/dessant/support-requests/commit/2755608ece89dbb09f6d5d4e89ff0d3cb7440733)) 21 | * update dependencies ([008bb20](https://github.com/dessant/support-requests/commit/008bb205a4a418c16886a3aa05ea457c3038e08c)) 22 | 23 | ## [3.0.0](https://github.com/dessant/support-requests/compare/v2.1.2...v3.0.0) (2022-12-04) 24 | 25 | 26 | ### ⚠ BREAKING CHANGES 27 | 28 | * the action now requires Node.js 16 29 | 30 | ### Bug Fixes 31 | 32 | * update dependencies ([98a49e5](https://github.com/dessant/support-requests/commit/98a49e5fe14d2ac577c5040929acade12296b906)) 33 | * update docs ([d40910d](https://github.com/dessant/support-requests/commit/d40910dc927308b57f739e1208a98dc383a7c33e)) 34 | 35 | ### [2.1.2](https://github.com/dessant/support-requests/compare/v2.1.1...v2.1.2) (2021-10-02) 36 | 37 | ### [2.1.1](https://github.com/dessant/support-requests/compare/v2.1.0...v2.1.1) (2021-07-09) 38 | 39 | 40 | ### Bug Fixes 41 | 42 | * update GitHub API calls ([fa1e92b](https://github.com/dessant/support-requests/commit/fa1e92b447253f0739c784bec76cff1ffca26a74)) 43 | 44 | ## [2.1.0](https://github.com/dessant/support-requests/compare/v2.0.1...v2.1.0) (2021-07-09) 45 | 46 | 47 | ### Features 48 | 49 | * default `github-token` to `github.token` ([#7](https://github.com/dessant/support-requests/issues/7)) ([731cce0](https://github.com/dessant/support-requests/commit/731cce00ca4b42a6ffd5daf63d11386d592c6567)) 50 | * document the use of personal access tokens ([6ba0377](https://github.com/dessant/support-requests/commit/6ba0377537d5719b6b907feabd5e5e3057321cee)) 51 | 52 | 53 | ### Bug Fixes 54 | 55 | * declare required permissions ([692a08a](https://github.com/dessant/support-requests/commit/692a08a4e543e181bc7feb42e2c7c7fe1b3c9d08)) 56 | * lock temporarily unlocked issues even after an error ([182adbd](https://github.com/dessant/support-requests/commit/182adbde03cf78d5a21b696ed2023a2c3d7197c7)) 57 | 58 | ### [2.0.1](https://github.com/dessant/support-requests/compare/v2.0.0...v2.0.1) (2021-01-01) 59 | 60 | 61 | ### Bug Fixes 62 | 63 | * update dependencies ([f502ca6](https://github.com/dessant/support-requests/commit/f502ca66a0381e462f29149e7e0b41eae901fc61)) 64 | 65 | ## [2.0.0](https://github.com/dessant/support-requests/compare/v1.0.1...v2.0.0) (2020-08-24) 66 | 67 | 68 | ### ⚠ BREAKING CHANGES 69 | 70 | * The deployment method and configuration options have changed. 71 | 72 | ### Features 73 | 74 | * move to GitHub Actions ([4777aa0](https://github.com/dessant/support-requests/commit/4777aa0377f867dbeb97eccd63414255a1fc739a)) 75 | 76 | ### [1.0.1](https://github.com/dessant/support-requests/compare/v1.0.0...v1.0.1) (2019-10-25) 77 | 78 | 79 | ### Bug Fixes 80 | 81 | * update dependencies ([7372f4f](https://github.com/dessant/support-requests/commit/7372f4f530e0c33f1d20a91ec3ee54adf137ea35)) 82 | 83 | ## [1.0.0](https://github.com/dessant/support-requests/compare/v0.4.3...v1.0.0) (2019-06-10) 84 | 85 | 86 | ### Features 87 | 88 | * update dependencies ([64530c9](https://github.com/dessant/support-requests/commit/64530c9)) 89 | 90 | 91 | ### BREAKING CHANGES 92 | 93 | * probot < 9.2.13 no longer supported. 94 | 95 | 96 | 97 | 98 | ## [0.4.3](https://github.com/dessant/support-requests/compare/v0.4.2...v0.4.3) (2019-01-20) 99 | 100 | 101 | ### Bug Fixes 102 | 103 | * apply stricter config validation ([c5b97f4](https://github.com/dessant/support-requests/commit/c5b97f4)) 104 | 105 | 106 | 107 | 108 | ## [0.4.2](https://github.com/dessant/support-requests/compare/v0.4.1...v0.4.2) (2018-10-03) 109 | 110 | 111 | ### Bug Fixes 112 | 113 | * allow latest version of node ([df959cb](https://github.com/dessant/support-requests/commit/df959cb)) 114 | 115 | 116 | 117 | 118 | ## [0.4.1](https://github.com/dessant/support-requests/compare/v0.4.0...v0.4.1) (2018-09-26) 119 | 120 | 121 | ### Bug Fixes 122 | 123 | * allow more versions of node to be used ([7481973](https://github.com/dessant/support-requests/commit/7481973)) 124 | 125 | 126 | 127 | 128 | # [0.4.0](https://github.com/dessant/support-requests/compare/v0.3.1...v0.4.0) (2018-07-23) 129 | 130 | 131 | ### Features 132 | 133 | * notify maintainers about configuration errors ([6886c26](https://github.com/dessant/support-requests/commit/6886c26)) 134 | 135 | 136 | 137 | 138 | ## [0.3.1](https://github.com/dessant/support-requests/compare/v0.3.0...v0.3.1) (2018-06-27) 139 | 140 | 141 | 142 | 143 | # [0.3.0](https://github.com/dessant/support-requests/compare/v0.2.1...v0.3.0) (2018-06-24) 144 | 145 | 146 | ### Bug Fixes 147 | 148 | * account for missing label object when label is removed ([eb1e76d](https://github.com/dessant/support-requests/commit/eb1e76d)) 149 | * add `_extends` option to config schema ([62d0c05](https://github.com/dessant/support-requests/commit/62d0c05)) 150 | 151 | 152 | ### Features 153 | 154 | * add option for setting lock reason ([e91b1c8](https://github.com/dessant/support-requests/commit/e91b1c8)) 155 | * add support for mentioning the issue author ([b43e76e](https://github.com/dessant/support-requests/commit/b43e76e)) 156 | * also comment when issue is locked and set lock reason ([67fad24](https://github.com/dessant/support-requests/commit/67fad24)) 157 | * extend settings from a different repository ([6affa95](https://github.com/dessant/support-requests/commit/6affa95)) 158 | 159 | 160 | 161 | 162 | ## [0.2.1](https://github.com/dessant/support-requests/compare/v0.2.0...v0.2.1) (2018-06-01) 163 | 164 | 165 | ### Bug Fixes 166 | 167 | * set main module path ([e9f828f](https://github.com/dessant/support-requests/commit/e9f828f)) 168 | 169 | 170 | 171 | 172 | # [0.2.0](https://github.com/dessant/support-requests/compare/v0.1.2...v0.2.0) (2018-05-06) 173 | 174 | 175 | ### Features 176 | 177 | * validate config options ([2833846](https://github.com/dessant/support-requests/commit/2833846)) 178 | 179 | 180 | 181 | 182 | ## [0.1.2](https://github.com/dessant/support-requests/compare/v0.1.1...v0.1.2) (2017-11-12) 183 | 184 | 185 | ### Bug Fixes 186 | 187 | * comment only if issue is not locked ([a68e322](https://github.com/dessant/support-requests/commit/a68e322)) 188 | 189 | 190 | 191 | 192 | ## [0.1.1](https://github.com/dessant/support-requests/compare/v0.1.0...v0.1.1) (2017-11-11) 193 | 194 | 195 | ### Bug Fixes 196 | 197 | * set exact node and npm versions for Glitch deployment ([cbd8374](https://github.com/dessant/support-requests/commit/cbd8374)) 198 | 199 | 200 | 201 | 202 | # 0.1.0 (2017-11-03) 203 | --------------------------------------------------------------------------------