Compare commits

..

1 Commits

Author SHA1 Message Date
Patrick Ellis
5e7dbb3581 re-run npm run build 2022-08-12 10:49:20 -04:00
24 changed files with 386 additions and 4485 deletions

View File

@@ -1,35 +0,0 @@
---
name: Bug report
about: Create a bug report
title: ''
labels: bug, needs triage
assignees: ''
---
<!--- Please direct any generic questions related to actions to our support community forum at https://github.community/c/code-to-cloud/github-actions/41 --->
<!--- Before opening up a new bug report, please make sure to check for similar existing issues -->
**Description:**
A clear and concise description of what the bug is.
**Action version:**
Specify the action version
**Platform:**
- [ ] Ubuntu
- [ ] macOS
- [ ] Windows
**Runner type:**
- [ ] Hosted
- [ ] Self-hosted
**Repro steps:**
A description with steps to reproduce the issue. If your have a public example or repo to share, please provide the link.
**Expected behavior:**
A description of what you expected to happen.
**Actual behavior:**
A description of what is actually happening.

View File

@@ -1 +0,0 @@
blank_issues_enabled: false

View File

@@ -1,18 +0,0 @@
---
name: Feature request
about: Suggest an idea for this project
title: ''
labels: feature request, needs triage
assignees: ''
---
<!--- Please direct any generic questions related to actions to our support community forum at https://github.community/c/code-to-cloud/github-actions/41 --->
<!--- Before opening up a new feature request, please make sure to check for similar existing issues and pull requests -->
**Description:**
Describe your proposal.
**Justification:**
Justification or a use case for your proposal.
**Are you willing to submit a PR?**
<!--- We accept contributions! -->

View File

@@ -1,9 +0,0 @@
**Description:**
Describe your changes.
**Related issue:**
Add link to the related issue.
**Check list:**
- [ ] Mark if documentation changes are required.
- [ ] Mark if tests were added or updated to cover the changes.

View File

@@ -1,17 +0,0 @@
name: Basic validation
on:
pull_request:
paths-ignore:
- '**.md'
push:
branches:
- main
- releases/*
paths-ignore:
- '**.md'
jobs:
call-basic-validation:
name: Basic validation
uses: actions/reusable-workflows/.github/workflows/basic-validation.yml@main

28
.github/workflows/build_test.yml vendored Normal file
View File

@@ -0,0 +1,28 @@
name: Build & Test
on:
pull_request:
paths-ignore:
- '**.md'
push:
branches:
- main
- releases/*
paths-ignore:
- '**.md'
jobs:
build:
runs-on: ${{ matrix.os }}
strategy:
matrix:
os: [ubuntu-latest, windows-latest, macos-latest]
steps:
- uses: actions/checkout@v2
- name: Setup node 16
uses: actions/setup-node@v2
with:
node-version: 16.x
- run: npm install
- run: npm run build
- run: npm test

View File

@@ -1,17 +0,0 @@
name: Check dist/
on:
push:
branches:
- main
paths-ignore:
- '**.md'
pull_request:
paths-ignore:
- '**.md'
workflow_dispatch:
jobs:
call-check-dist:
name: Check dist/
uses: actions/reusable-workflows/.github/workflows/check-dist.yml@main

View File

@@ -1,14 +0,0 @@
name: CodeQL analysis
on:
push:
branches: [ main ]
pull_request:
branches: [ main ]
schedule:
- cron: '0 3 * * 0'
jobs:
call-codeQL-analysis:
name: CodeQL analysis
uses: actions/reusable-workflows/.github/workflows/codeql-analysis.yml@main

View File

@@ -1,15 +0,0 @@
name: Licensed
on:
push:
branches:
- main
pull_request:
branches:
- main
workflow_dispatch:
jobs:
call-licensed:
name: Licensed
uses: actions/reusable-workflows/.github/workflows/licensed.yml@main

View File

@@ -1,28 +0,0 @@
name: Release new action version
on:
release:
types: [released]
workflow_dispatch:
inputs:
TAG_NAME:
description: 'Tag name that the major tag will point to'
required: true
env:
TAG_NAME: ${{ github.event.inputs.TAG_NAME || github.event.release.tag_name }}
permissions:
contents: write
jobs:
update_tag:
name: Update the major tag to include the ${{ github.event.inputs.TAG_NAME || github.event.release.tag_name }} changes
environment:
name: releaseNewActionVersion
runs-on: ubuntu-latest
steps:
- name: Update the ${{ env.TAG_NAME }} tag
uses: actions/publish-action@v0.2.1
with:
source-tag: ${{ env.TAG_NAME }}
slack-webhook: ${{ secrets.SLACK_WEBHOOK }}

View File

@@ -0,0 +1,50 @@
name: Licenses
on:
push:
branches: [main]
paths: [package.json, package-lock.json]
pull_request:
branches: [main]
paths: [package.json, package-lock.json]
workflow_dispatch:
jobs:
# Updates our cache of license files in response to changes to our dependencies
# declared in package-lock.json. Automatically commits the changes and pushes
# them to your branch. NB `check_license_status` should always run *after* this
#
# see https://github.com/actions/labeler/pull/155 for more context
update_licenses:
runs-on: ubuntu-latest
name: Update Licenses
steps:
- uses: actions/checkout@v1
- uses: jonabc/setup-licensed@v1
with:
version: '3.x'
github_token: ${{ secrets.GITHUB_TOKEN }}
- run: npm install --production
- uses: jonabc/licensed-ci@v1
with:
github_token: ${{ secrets.GITHUB_TOKEN }}
# Fails if any of our dependencies have licenses that our incompatible with our
# requirements (see .licensed.yml) OR if any of our dependencies have been
# upgraded to a new version without us having updated their corresponding
# license metadata file in .licenses/
#
# see https://github.com/actions/labeler/pull/91 for more context
check_licenses:
needs: update_licenses
if: always() # always run after we update the license cache. if it failed, we will probably just fail as well
runs-on: ubuntu-latest
name: Check Licenses
steps:
- uses: actions/checkout@v2
- uses: jonabc/setup-licensed@v1.0.2
with:
version: '3.x'
github_token: ${{ secrets.GITHUB_TOKEN }}
- run: npm install
- run: licensed status

View File

@@ -1,6 +1,6 @@
--- ---
name: "@actions/core" name: "@actions/core"
version: 1.10.0 version: 1.9.1
type: npm type: npm
summary: Actions core lib summary: Actions core lib
homepage: https://github.com/actions/toolkit/tree/main/packages/core homepage: https://github.com/actions/toolkit/tree/main/packages/core

View File

@@ -1,6 +1,6 @@
--- ---
name: minimatch name: minimatch
version: 3.1.2 version: 3.0.4
type: npm type: npm
summary: a glob matcher in javascript summary: a glob matcher in javascript
homepage: homepage:

View File

@@ -1,12 +0,0 @@
{
"printWidth": 80,
"tabWidth": 2,
"useTabs": false,
"semi": true,
"singleQuote": true,
"trailingComma": "none",
"bracketSpacing": false,
"arrowParens": "avoid",
"parser": "typescript",
"endOfLine": "auto"
}

View File

@@ -1 +1 @@
* @actions/setup-actions-team * @actions/actions-runtime

View File

@@ -56,11 +56,6 @@ label1:
# Add 'label2' to any file changes within 'example2' folder # Add 'label2' to any file changes within 'example2' folder
label2: example2/* label2: example2/*
# Add label3 to any change to .txt files within the entire repository. Quotation marks are required for the leading asterisk
label3:
- '**/*.txt'
``` ```
#### Common Examples #### Common Examples
@@ -71,7 +66,7 @@ repo:
- '*' - '*'
# Add '@domain/core' label to any change within the 'core' package # Add '@domain/core' label to any change within the 'core' package
'@domain/core': @domain/core:
- package/core/* - package/core/*
- package/core/**/* - package/core/**/*

View File

@@ -1,34 +1,34 @@
export const context = { export const context = {
payload: { payload: {
pull_request: { pull_request: {
number: 123 number: 123,
} },
}, },
repo: { repo: {
owner: 'monalisa', owner: "monalisa",
repo: 'helloworld' repo: "helloworld",
} },
}; };
const mockApi = { const mockApi = {
rest: { rest: {
issues: { issues: {
addLabels: jest.fn(), addLabels: jest.fn(),
removeLabel: jest.fn() removeLabel: jest.fn(),
}, },
pulls: { pulls: {
get: jest.fn().mockResolvedValue({}), get: jest.fn().mockResolvedValue({}),
listFiles: { listFiles: {
endpoint: { endpoint: {
merge: jest.fn().mockReturnValue({}) merge: jest.fn().mockReturnValue({}),
} },
} },
}, },
repos: { repos: {
getContent: jest.fn() getContent: jest.fn(),
} },
}, },
paginate: jest.fn() paginate: jest.fn(),
}; };
export const getOctokit = jest.fn().mockImplementation(() => mockApi); export const getOctokit = jest.fn().mockImplementation(() => mockApi);

View File

@@ -1,27 +1,27 @@
import {checkGlobs} from '../src/labeler'; import { checkGlobs } from "../src/labeler";
import * as core from '@actions/core'; import * as core from "@actions/core";
jest.mock('@actions/core'); jest.mock("@actions/core");
beforeAll(() => { beforeAll(() => {
jest.spyOn(core, 'getInput').mockImplementation((name, options) => { jest.spyOn(core, "getInput").mockImplementation((name, options) => {
return jest.requireActual('@actions/core').getInput(name, options); return jest.requireActual("@actions/core").getInput(name, options);
}); });
}); });
const matchConfig = [{any: ['*.txt']}]; const matchConfig = [{ any: ["*.txt"] }];
describe('checkGlobs', () => { describe("checkGlobs", () => {
it('returns true when our pattern does match changed files', () => { it("returns true when our pattern does match changed files", () => {
const changedFiles = ['foo.txt', 'bar.txt']; const changedFiles = ["foo.txt", "bar.txt"];
const result = checkGlobs(changedFiles, matchConfig); const result = checkGlobs(changedFiles, matchConfig);
expect(result).toBeTruthy(); expect(result).toBeTruthy();
}); });
it('returns false when our pattern does not match changed files', () => { it("returns false when our pattern does not match changed files", () => {
const changedFiles = ['foo.docx']; const changedFiles = ["foo.docx"];
const result = checkGlobs(changedFiles, matchConfig); const result = checkGlobs(changedFiles, matchConfig);
expect(result).toBeFalsy(); expect(result).toBeFalsy();

View File

@@ -1,45 +1,45 @@
import {run} from '../src/labeler'; import { run } from "../src/labeler";
import * as github from '@actions/github'; import * as github from "@actions/github";
import * as core from '@actions/core'; import * as core from "@actions/core";
const fs = jest.requireActual('fs'); const fs = jest.requireActual("fs");
jest.mock('@actions/core'); jest.mock("@actions/core");
jest.mock('@actions/github'); jest.mock("@actions/github");
const gh = github.getOctokit('_'); const gh = github.getOctokit("_");
const addLabelsMock = jest.spyOn(gh.rest.issues, 'addLabels'); const addLabelsMock = jest.spyOn(gh.rest.issues, "addLabels");
const removeLabelMock = jest.spyOn(gh.rest.issues, 'removeLabel'); const removeLabelMock = jest.spyOn(gh.rest.issues, "removeLabel");
const reposMock = jest.spyOn(gh.rest.repos, 'getContent'); const reposMock = jest.spyOn(gh.rest.repos, "getContent");
const paginateMock = jest.spyOn(gh, 'paginate'); const paginateMock = jest.spyOn(gh, "paginate");
const getPullMock = jest.spyOn(gh.rest.pulls, 'get'); const getPullMock = jest.spyOn(gh.rest.pulls, "get");
const yamlFixtures = { const yamlFixtures = {
'only_pdfs.yml': fs.readFileSync('__tests__/fixtures/only_pdfs.yml') "only_pdfs.yml": fs.readFileSync("__tests__/fixtures/only_pdfs.yml"),
}; };
afterAll(() => jest.restoreAllMocks()); afterAll(() => jest.restoreAllMocks());
describe('run', () => { describe("run", () => {
it('adds labels to PRs that match our glob patterns', async () => { it("adds labels to PRs that match our glob patterns", async () => {
usingLabelerConfigYaml('only_pdfs.yml'); usingLabelerConfigYaml("only_pdfs.yml");
mockGitHubResponseChangedFiles('foo.pdf'); mockGitHubResponseChangedFiles("foo.pdf");
await run(); await run();
expect(removeLabelMock).toHaveBeenCalledTimes(0); expect(removeLabelMock).toHaveBeenCalledTimes(0);
expect(addLabelsMock).toHaveBeenCalledTimes(1); expect(addLabelsMock).toHaveBeenCalledTimes(1);
expect(addLabelsMock).toHaveBeenCalledWith({ expect(addLabelsMock).toHaveBeenCalledWith({
owner: 'monalisa', owner: "monalisa",
repo: 'helloworld', repo: "helloworld",
issue_number: 123, issue_number: 123,
labels: ['touched-a-pdf-file'] labels: ["touched-a-pdf-file"],
}); });
}); });
it('does not add labels to PRs that do not match our glob patterns', async () => { it("does not add labels to PRs that do not match our glob patterns", async () => {
usingLabelerConfigYaml('only_pdfs.yml'); usingLabelerConfigYaml("only_pdfs.yml");
mockGitHubResponseChangedFiles('foo.txt'); mockGitHubResponseChangedFiles("foo.txt");
await run(); await run();
@@ -47,23 +47,23 @@ describe('run', () => {
expect(addLabelsMock).toHaveBeenCalledTimes(0); expect(addLabelsMock).toHaveBeenCalledTimes(0);
}); });
it('(with sync-labels: true) it deletes preexisting PR labels that no longer match the glob pattern', async () => { it("(with sync-labels: true) it deletes preexisting PR labels that no longer match the glob pattern", async () => {
let mockInput = { let mockInput = {
'repo-token': 'foo', "repo-token": "foo",
'configuration-path': 'bar', "configuration-path": "bar",
'sync-labels': true "sync-labels": true,
}; };
jest jest
.spyOn(core, 'getInput') .spyOn(core, "getInput")
.mockImplementation((name: string, ...opts) => mockInput[name]); .mockImplementation((name: string, ...opts) => mockInput[name]);
usingLabelerConfigYaml('only_pdfs.yml'); usingLabelerConfigYaml("only_pdfs.yml");
mockGitHubResponseChangedFiles('foo.txt'); mockGitHubResponseChangedFiles("foo.txt");
getPullMock.mockResolvedValue(<any>{ getPullMock.mockResolvedValue(<any>{
data: { data: {
labels: [{name: 'touched-a-pdf-file'}] labels: [{ name: "touched-a-pdf-file" }],
} },
}); });
await run(); await run();
@@ -71,30 +71,30 @@ describe('run', () => {
expect(addLabelsMock).toHaveBeenCalledTimes(0); expect(addLabelsMock).toHaveBeenCalledTimes(0);
expect(removeLabelMock).toHaveBeenCalledTimes(1); expect(removeLabelMock).toHaveBeenCalledTimes(1);
expect(removeLabelMock).toHaveBeenCalledWith({ expect(removeLabelMock).toHaveBeenCalledWith({
owner: 'monalisa', owner: "monalisa",
repo: 'helloworld', repo: "helloworld",
issue_number: 123, issue_number: 123,
name: 'touched-a-pdf-file' name: "touched-a-pdf-file",
}); });
}); });
it('(with sync-labels: false) it issues no delete calls even when there are preexisting PR labels that no longer match the glob pattern', async () => { it("(with sync-labels: false) it issues no delete calls even when there are preexisting PR labels that no longer match the glob pattern", async () => {
let mockInput = { let mockInput = {
'repo-token': 'foo', "repo-token": "foo",
'configuration-path': 'bar', "configuration-path": "bar",
'sync-labels': false "sync-labels": false,
}; };
jest jest
.spyOn(core, 'getInput') .spyOn(core, "getInput")
.mockImplementation((name: string, ...opts) => mockInput[name]); .mockImplementation((name: string, ...opts) => mockInput[name]);
usingLabelerConfigYaml('only_pdfs.yml'); usingLabelerConfigYaml("only_pdfs.yml");
mockGitHubResponseChangedFiles('foo.txt'); mockGitHubResponseChangedFiles("foo.txt");
getPullMock.mockResolvedValue(<any>{ getPullMock.mockResolvedValue(<any>{
data: { data: {
labels: [{name: 'touched-a-pdf-file'}] labels: [{ name: "touched-a-pdf-file" }],
} },
}); });
await run(); await run();
@@ -106,11 +106,11 @@ describe('run', () => {
function usingLabelerConfigYaml(fixtureName: keyof typeof yamlFixtures): void { function usingLabelerConfigYaml(fixtureName: keyof typeof yamlFixtures): void {
reposMock.mockResolvedValue(<any>{ reposMock.mockResolvedValue(<any>{
data: {content: yamlFixtures[fixtureName], encoding: 'utf8'} data: { content: yamlFixtures[fixtureName], encoding: "utf8" },
}); });
} }
function mockGitHubResponseChangedFiles(...files: string[]): void { function mockGitHubResponseChangedFiles(...files: string[]): void {
const returnValue = files.map(f => ({filename: f})); const returnValue = files.map((f) => ({ filename: f }));
paginateMock.mockReturnValue(<any>returnValue); paginateMock.mockReturnValue(<any>returnValue);
} }

4355
dist/index.js vendored

File diff suppressed because one or more lines are too long

58
package-lock.json generated
View File

@@ -1,15 +1,15 @@
{ {
"name": "labeler", "name": "labeler",
"version": "4.0.1", "version": "3.1.0",
"lockfileVersion": 2, "lockfileVersion": 2,
"requires": true, "requires": true,
"packages": { "packages": {
"": { "": {
"name": "labeler", "name": "labeler",
"version": "4.0.1", "version": "3.1.0",
"license": "MIT", "license": "MIT",
"dependencies": { "dependencies": {
"@actions/core": "^1.10.0", "@actions/core": "^1.9.1",
"@actions/github": "^5.0.0", "@actions/github": "^5.0.0",
"js-yaml": "^4.1.0", "js-yaml": "^4.1.0",
"minimatch": "^3.0.4" "minimatch": "^3.0.4"
@@ -21,15 +21,15 @@
"@types/node": "^16.11.7", "@types/node": "^16.11.7",
"@vercel/ncc": "^0.34.0", "@vercel/ncc": "^0.34.0",
"jest": "^27.5.1", "jest": "^27.5.1",
"prettier": "^2.7.1", "prettier": "^2.6.2",
"ts-jest": "^27.1.3", "ts-jest": "^27.1.3",
"typescript": "^4.8.4" "typescript": "^4.6.3"
} }
}, },
"node_modules/@actions/core": { "node_modules/@actions/core": {
"version": "1.10.0", "version": "1.9.1",
"resolved": "https://registry.npmjs.org/@actions/core/-/core-1.10.0.tgz", "resolved": "https://registry.npmjs.org/@actions/core/-/core-1.9.1.tgz",
"integrity": "sha512-2aZDDa3zrrZbP5ZYg159sNoLRb61nQ7awl5pSvIq5Qpj81vwDzdMRKzkWJGJuwVvWpvZKx7vspJALyvaaIQyug==", "integrity": "sha512-5ad+U2YGrmmiw6du20AQW5XuWo7UKN2052FjSV7MX+Wfjf8sCqcsZe62NfgHys4QI4/Y+vQvLKYL8jWtA1ZBTA==",
"dependencies": { "dependencies": {
"@actions/http-client": "^2.0.1", "@actions/http-client": "^2.0.1",
"uuid": "^8.3.2" "uuid": "^8.3.2"
@@ -3306,9 +3306,9 @@
} }
}, },
"node_modules/minimatch": { "node_modules/minimatch": {
"version": "3.1.2", "version": "3.0.4",
"resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz",
"integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==",
"dependencies": { "dependencies": {
"brace-expansion": "^1.1.7" "brace-expansion": "^1.1.7"
}, },
@@ -3584,9 +3584,9 @@
} }
}, },
"node_modules/prettier": { "node_modules/prettier": {
"version": "2.7.1", "version": "2.6.2",
"resolved": "https://registry.npmjs.org/prettier/-/prettier-2.7.1.tgz", "resolved": "https://registry.npmjs.org/prettier/-/prettier-2.6.2.tgz",
"integrity": "sha512-ujppO+MkdPqoVINuDFDRLClm7D78qbDt0/NR+wp5FqEZOoTNAjPHWj17QRhu7geIHJfcNhRk1XVQmF8Bp3ye+g==", "integrity": "sha512-PkUpF+qoXTqhOeWL9fu7As8LXsIUZ1WYaJiY/a7McAQzxjk82OF0tibkFXVCDImZtWxbvojFjerkiLb0/q8mew==",
"dev": true, "dev": true,
"bin": { "bin": {
"prettier": "bin-prettier.js" "prettier": "bin-prettier.js"
@@ -4152,9 +4152,9 @@
} }
}, },
"node_modules/typescript": { "node_modules/typescript": {
"version": "4.8.4", "version": "4.6.3",
"resolved": "https://registry.npmjs.org/typescript/-/typescript-4.8.4.tgz", "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.6.3.tgz",
"integrity": "sha512-QCh+85mCy+h0IGff8r5XWzOVSbBO+KfeYrMQh7NJ58QujwcE22u+NUSmUxqF+un70P9GXKxa2HCNiTTMJknyjQ==", "integrity": "sha512-yNIatDa5iaofVozS/uQJEl3JRWLKKGJKh6Yaiv0GLGSuhpFJe7P3SbHZ8/yjAHRQwKRoA6YZqlfjXWmVzoVSMw==",
"dev": true, "dev": true,
"bin": { "bin": {
"tsc": "bin/tsc", "tsc": "bin/tsc",
@@ -4413,9 +4413,9 @@
}, },
"dependencies": { "dependencies": {
"@actions/core": { "@actions/core": {
"version": "1.10.0", "version": "1.9.1",
"resolved": "https://registry.npmjs.org/@actions/core/-/core-1.10.0.tgz", "resolved": "https://registry.npmjs.org/@actions/core/-/core-1.9.1.tgz",
"integrity": "sha512-2aZDDa3zrrZbP5ZYg159sNoLRb61nQ7awl5pSvIq5Qpj81vwDzdMRKzkWJGJuwVvWpvZKx7vspJALyvaaIQyug==", "integrity": "sha512-5ad+U2YGrmmiw6du20AQW5XuWo7UKN2052FjSV7MX+Wfjf8sCqcsZe62NfgHys4QI4/Y+vQvLKYL8jWtA1ZBTA==",
"requires": { "requires": {
"@actions/http-client": "^2.0.1", "@actions/http-client": "^2.0.1",
"uuid": "^8.3.2" "uuid": "^8.3.2"
@@ -6994,9 +6994,9 @@
"dev": true "dev": true
}, },
"minimatch": { "minimatch": {
"version": "3.1.2", "version": "3.0.4",
"resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz",
"integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==",
"requires": { "requires": {
"brace-expansion": "^1.1.7" "brace-expansion": "^1.1.7"
} }
@@ -7206,9 +7206,9 @@
"dev": true "dev": true
}, },
"prettier": { "prettier": {
"version": "2.7.1", "version": "2.6.2",
"resolved": "https://registry.npmjs.org/prettier/-/prettier-2.7.1.tgz", "resolved": "https://registry.npmjs.org/prettier/-/prettier-2.6.2.tgz",
"integrity": "sha512-ujppO+MkdPqoVINuDFDRLClm7D78qbDt0/NR+wp5FqEZOoTNAjPHWj17QRhu7geIHJfcNhRk1XVQmF8Bp3ye+g==", "integrity": "sha512-PkUpF+qoXTqhOeWL9fu7As8LXsIUZ1WYaJiY/a7McAQzxjk82OF0tibkFXVCDImZtWxbvojFjerkiLb0/q8mew==",
"dev": true "dev": true
}, },
"pretty-format": { "pretty-format": {
@@ -7606,9 +7606,9 @@
} }
}, },
"typescript": { "typescript": {
"version": "4.8.4", "version": "4.6.3",
"resolved": "https://registry.npmjs.org/typescript/-/typescript-4.8.4.tgz", "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.6.3.tgz",
"integrity": "sha512-QCh+85mCy+h0IGff8r5XWzOVSbBO+KfeYrMQh7NJ58QujwcE22u+NUSmUxqF+un70P9GXKxa2HCNiTTMJknyjQ==", "integrity": "sha512-yNIatDa5iaofVozS/uQJEl3JRWLKKGJKh6Yaiv0GLGSuhpFJe7P3SbHZ8/yjAHRQwKRoA6YZqlfjXWmVzoVSMw==",
"dev": true "dev": true
}, },
"universal-user-agent": { "universal-user-agent": {

View File

@@ -1,13 +1,12 @@
{ {
"name": "labeler", "name": "labeler",
"version": "4.0.1", "version": "3.1.0",
"description": "Labels pull requests by files altered", "description": "Labels pull requests by files altered",
"main": "lib/main.js", "main": "lib/main.js",
"scripts": { "scripts": {
"build": "tsc && ncc build lib/main.js", "build": "tsc && ncc build lib/main.js",
"format": "prettier --write **/*.ts", "format": "prettier --write \"**/*.ts\"",
"format-check": "prettier --check **/*.ts", "format-check": "prettier --check \"**/*.ts\"",
"lint": "echo \"Fake command that does nothing. It is used in reusable workflows\"",
"test": "jest" "test": "jest"
}, },
"repository": { "repository": {
@@ -23,7 +22,7 @@
"author": "GitHub", "author": "GitHub",
"license": "MIT", "license": "MIT",
"dependencies": { "dependencies": {
"@actions/core": "^1.10.0", "@actions/core": "^1.9.1",
"@actions/github": "^5.0.0", "@actions/github": "^5.0.0",
"js-yaml": "^4.1.0", "js-yaml": "^4.1.0",
"minimatch": "^3.0.4" "minimatch": "^3.0.4"
@@ -35,8 +34,8 @@
"@types/js-yaml": "^4.0.5", "@types/js-yaml": "^4.0.5",
"@vercel/ncc": "^0.34.0", "@vercel/ncc": "^0.34.0",
"jest": "^27.5.1", "jest": "^27.5.1",
"prettier": "^2.7.1", "prettier": "^2.6.2",
"ts-jest": "^27.1.3", "ts-jest": "^27.1.3",
"typescript": "^4.8.4" "typescript": "^4.6.3"
} }
} }

View File

@@ -1,7 +1,7 @@
import * as core from '@actions/core'; import * as core from "@actions/core";
import * as github from '@actions/github'; import * as github from "@actions/github";
import * as yaml from 'js-yaml'; import * as yaml from "js-yaml";
import {Minimatch, IMinimatch} from 'minimatch'; import { Minimatch, IMinimatch } from "minimatch";
interface MatchConfig { interface MatchConfig {
all?: string[]; all?: string[];
@@ -13,22 +13,22 @@ type ClientType = ReturnType<typeof github.getOctokit>;
export async function run() { export async function run() {
try { try {
const token = core.getInput('repo-token', {required: true}); const token = core.getInput("repo-token", { required: true });
const configPath = core.getInput('configuration-path', {required: true}); const configPath = core.getInput("configuration-path", { required: true });
const syncLabels = !!core.getInput('sync-labels', {required: false}); const syncLabels = !!core.getInput("sync-labels", { required: false });
const prNumber = getPrNumber(); const prNumber = getPrNumber();
if (!prNumber) { if (!prNumber) {
console.log('Could not get pull request number from context, exiting'); console.log("Could not get pull request number from context, exiting");
return; return;
} }
const client: ClientType = github.getOctokit(token); const client: ClientType = github.getOctokit(token);
const {data: pullRequest} = await client.rest.pulls.get({ const { data: pullRequest } = await client.rest.pulls.get({
owner: github.context.repo.owner, owner: github.context.repo.owner,
repo: github.context.repo.repo, repo: github.context.repo.repo,
pull_number: prNumber pull_number: prNumber,
}); });
core.debug(`fetching changed files for pr #${prNumber}`); core.debug(`fetching changed files for pr #${prNumber}`);
@@ -44,7 +44,7 @@ export async function run() {
core.debug(`processing ${label}`); core.debug(`processing ${label}`);
if (checkGlobs(changedFiles, globs)) { if (checkGlobs(changedFiles, globs)) {
labels.push(label); labels.push(label);
} else if (pullRequest.labels.find(l => l.name === label)) { } else if (pullRequest.labels.find((l) => l.name === label)) {
labelsToRemove.push(label); labelsToRemove.push(label);
} }
} }
@@ -78,15 +78,15 @@ async function getChangedFiles(
const listFilesOptions = client.rest.pulls.listFiles.endpoint.merge({ const listFilesOptions = client.rest.pulls.listFiles.endpoint.merge({
owner: github.context.repo.owner, owner: github.context.repo.owner,
repo: github.context.repo.repo, repo: github.context.repo.repo,
pull_number: prNumber pull_number: prNumber,
}); });
const listFilesResponse = await client.paginate(listFilesOptions); const listFilesResponse = await client.paginate(listFilesOptions);
const changedFiles = listFilesResponse.map((f: any) => f.filename); const changedFiles = listFilesResponse.map((f: any) => f.filename);
core.debug('found changed files:'); core.debug("found changed files:");
for (const file of changedFiles) { for (const file of changedFiles) {
core.debug(' ' + file); core.debug(" " + file);
} }
return changedFiles; return changedFiles;
@@ -116,7 +116,7 @@ async function fetchContent(
owner: github.context.repo.owner, owner: github.context.repo.owner,
repo: github.context.repo.repo, repo: github.context.repo.repo,
path: repoPath, path: repoPath,
ref: github.context.sha ref: github.context.sha,
}); });
return Buffer.from(response.data.content, response.data.encoding).toString(); return Buffer.from(response.data.content, response.data.encoding).toString();
@@ -127,7 +127,7 @@ function getLabelGlobMapFromObject(
): Map<string, StringOrMatchConfig[]> { ): Map<string, StringOrMatchConfig[]> {
const labelGlobs: Map<string, StringOrMatchConfig[]> = new Map(); const labelGlobs: Map<string, StringOrMatchConfig[]> = new Map();
for (const label in configObject) { for (const label in configObject) {
if (typeof configObject[label] === 'string') { if (typeof configObject[label] === "string") {
labelGlobs.set(label, [configObject[label]]); labelGlobs.set(label, [configObject[label]]);
} else if (configObject[label] instanceof Array) { } else if (configObject[label] instanceof Array) {
labelGlobs.set(label, configObject[label]); labelGlobs.set(label, configObject[label]);
@@ -142,9 +142,9 @@ function getLabelGlobMapFromObject(
} }
function toMatchConfig(config: StringOrMatchConfig): MatchConfig { function toMatchConfig(config: StringOrMatchConfig): MatchConfig {
if (typeof config === 'string') { if (typeof config === "string") {
return { return {
any: [config] any: [config],
}; };
} }
@@ -152,7 +152,7 @@ function toMatchConfig(config: StringOrMatchConfig): MatchConfig {
} }
function printPattern(matcher: IMinimatch): string { function printPattern(matcher: IMinimatch): string {
return (matcher.negate ? '!' : '') + matcher.pattern; return (matcher.negate ? "!" : "") + matcher.pattern;
} }
export function checkGlobs( export function checkGlobs(
@@ -185,7 +185,7 @@ function isMatch(changedFile: string, matchers: IMinimatch[]): boolean {
// equivalent to "Array.some()" but expanded for debugging and clarity // equivalent to "Array.some()" but expanded for debugging and clarity
function checkAny(changedFiles: string[], globs: string[]): boolean { function checkAny(changedFiles: string[], globs: string[]): boolean {
const matchers = globs.map(g => new Minimatch(g)); const matchers = globs.map((g) => new Minimatch(g));
core.debug(` checking "any" patterns`); core.debug(` checking "any" patterns`);
for (const changedFile of changedFiles) { for (const changedFile of changedFiles) {
if (isMatch(changedFile, matchers)) { if (isMatch(changedFile, matchers)) {
@@ -200,7 +200,7 @@ function checkAny(changedFiles: string[], globs: string[]): boolean {
// equivalent to "Array.every()" but expanded for debugging and clarity // equivalent to "Array.every()" but expanded for debugging and clarity
function checkAll(changedFiles: string[], globs: string[]): boolean { function checkAll(changedFiles: string[], globs: string[]): boolean {
const matchers = globs.map(g => new Minimatch(g)); const matchers = globs.map((g) => new Minimatch(g));
core.debug(` checking "all" patterns`); core.debug(` checking "all" patterns`);
for (const changedFile of changedFiles) { for (const changedFile of changedFiles) {
if (!isMatch(changedFile, matchers)) { if (!isMatch(changedFile, matchers)) {
@@ -238,7 +238,7 @@ async function addLabels(
owner: github.context.repo.owner, owner: github.context.repo.owner,
repo: github.context.repo.repo, repo: github.context.repo.repo,
issue_number: prNumber, issue_number: prNumber,
labels: labels labels: labels,
}); });
} }
@@ -248,12 +248,12 @@ async function removeLabels(
labels: string[] labels: string[]
) { ) {
await Promise.all( await Promise.all(
labels.map(label => labels.map((label) =>
client.rest.issues.removeLabel({ client.rest.issues.removeLabel({
owner: github.context.repo.owner, owner: github.context.repo.owner,
repo: github.context.repo.repo, repo: github.context.repo.repo,
issue_number: prNumber, issue_number: prNumber,
name: label name: label,
}) })
) )
); );

View File

@@ -1,3 +1,3 @@
import {run} from './labeler'; import { run } from "./labeler";
run(); run();