Compare commits

...

48 Commits

Author SHA1 Message Date
Matthew Costabile
a9f041ddd4 Merge pull request #142 from timrogers/timrogers/draft-issue
Allow users to add an issue/PR to a board in a different organization
2022-07-21 08:48:51 -04:00
Matthew Costabile
1809404e28 Merge branch 'main' into timrogers/draft-issue 2022-07-21 08:46:09 -04:00
Lukasz Warchol
0af0b18f28 Merge pull request #157 from actions/non-beta-projects
Remove beta references
2022-07-19 18:11:17 +02:00
Lukasz Warchol
c8dd399614 Remove beta references 2022-07-19 15:00:18 +00:00
Matthew Costabile
f111c2aa36 Merge pull request #156 from actions/dependabot/npm_and_yarn/concurrently-7.3.0
build(deps-dev): bump concurrently from 7.2.2 to 7.3.0
2022-07-19 09:30:12 -04:00
Matthew Costabile
12e917e04c Merge pull request #155 from actions/dependabot/npm_and_yarn/typescript-eslint/parser-5.30.7
build(deps-dev): bump @typescript-eslint/parser from 5.30.6 to 5.30.7
2022-07-19 09:29:58 -04:00
dependabot[bot]
dbe00218fb build(deps-dev): bump concurrently from 7.2.2 to 7.3.0
Bumps [concurrently](https://github.com/open-cli-tools/concurrently) from 7.2.2 to 7.3.0.
- [Release notes](https://github.com/open-cli-tools/concurrently/releases)
- [Commits](https://github.com/open-cli-tools/concurrently/compare/v7.2.2...v7.3.0)

---
updated-dependencies:
- dependency-name: concurrently
  dependency-type: direct:development
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
2022-07-19 13:26:23 +00:00
dependabot[bot]
fa0b958991 build(deps-dev): bump @typescript-eslint/parser from 5.30.6 to 5.30.7
Bumps [@typescript-eslint/parser](https://github.com/typescript-eslint/typescript-eslint/tree/HEAD/packages/parser) from 5.30.6 to 5.30.7.
- [Release notes](https://github.com/typescript-eslint/typescript-eslint/releases)
- [Changelog](https://github.com/typescript-eslint/typescript-eslint/blob/main/packages/parser/CHANGELOG.md)
- [Commits](https://github.com/typescript-eslint/typescript-eslint/commits/v5.30.7/packages/parser)

---
updated-dependencies:
- dependency-name: "@typescript-eslint/parser"
  dependency-type: direct:development
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
2022-07-19 13:26:00 +00:00
Matthew Costabile
f343062b82 Merge pull request #154 from actions/dependabot/npm_and_yarn/types/node-16.11.45
build(deps-dev): bump @types/node from 16.11.44 to 16.11.45
2022-07-18 10:28:07 -04:00
Matthew Costabile
e639bba4f0 Merge pull request #153 from actions/dependabot/npm_and_yarn/eslint-8.20.0
build(deps-dev): bump eslint from 8.19.0 to 8.20.0
2022-07-18 10:27:53 -04:00
dependabot[bot]
34ff2c7db4 build(deps-dev): bump @types/node from 16.11.44 to 16.11.45
Bumps [@types/node](https://github.com/DefinitelyTyped/DefinitelyTyped/tree/HEAD/types/node) from 16.11.44 to 16.11.45.
- [Release notes](https://github.com/DefinitelyTyped/DefinitelyTyped/releases)
- [Commits](https://github.com/DefinitelyTyped/DefinitelyTyped/commits/HEAD/types/node)

---
updated-dependencies:
- dependency-name: "@types/node"
  dependency-type: direct:development
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
2022-07-18 13:41:32 +00:00
dependabot[bot]
4065956be9 build(deps-dev): bump eslint from 8.19.0 to 8.20.0
Bumps [eslint](https://github.com/eslint/eslint) from 8.19.0 to 8.20.0.
- [Release notes](https://github.com/eslint/eslint/releases)
- [Changelog](https://github.com/eslint/eslint/blob/main/CHANGELOG.md)
- [Commits](https://github.com/eslint/eslint/compare/v8.19.0...v8.20.0)

---
updated-dependencies:
- dependency-name: eslint
  dependency-type: direct:development
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
2022-07-18 13:41:25 +00:00
dependabot[bot]
9b0fd13e3f build(deps-dev): bump @types/node from 16.11.43 to 16.11.44 (#151)
Bumps [@types/node](https://github.com/DefinitelyTyped/DefinitelyTyped/tree/HEAD/types/node) from 16.11.43 to 16.11.44.
- [Release notes](https://github.com/DefinitelyTyped/DefinitelyTyped/releases)
- [Commits](https://github.com/DefinitelyTyped/DefinitelyTyped/commits/HEAD/types/node)

---
updated-dependencies:
- dependency-name: "@types/node"
  dependency-type: direct:development
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>

Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2022-07-15 10:59:26 -03:00
dependabot[bot]
53d95574f4 build(deps-dev): bump eslint-plugin-jest from 26.5.3 to 26.6.0 (#152)
Bumps [eslint-plugin-jest](https://github.com/jest-community/eslint-plugin-jest) from 26.5.3 to 26.6.0.
- [Release notes](https://github.com/jest-community/eslint-plugin-jest/releases)
- [Changelog](https://github.com/jest-community/eslint-plugin-jest/blob/main/CHANGELOG.md)
- [Commits](https://github.com/jest-community/eslint-plugin-jest/compare/v26.5.3...v26.6.0)

---
updated-dependencies:
- dependency-name: eslint-plugin-jest
  dependency-type: direct:development
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>

Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2022-07-15 10:57:38 -03:00
Tim Rogers
ebd4dc568a Fix failing tests 2022-07-15 11:26:04 +01:00
Tim Rogers
9115f344bd Allow users to add an issue/PR to a board in a different organization
At present, this Action only supports adding an issue or pull
request to a project in the *same organization* as the issue or
pull request itself.

This removes that limitation. If the issue/pull request and
project have different owners, then instead of directly
creating a project item, we will instead create a "draft issue"
which will be added to the board.

Fixes #74.
2022-07-15 11:26:04 +01:00
Matthew Costabile
31c3cce717 Merge pull request #150 from actions/dependabot/npm_and_yarn/typescript-eslint/parser-5.30.6
build(deps-dev): bump @typescript-eslint/parser from 5.30.5 to 5.30.6
2022-07-13 09:46:10 -04:00
dependabot[bot]
c1795be3bc build(deps-dev): bump @typescript-eslint/parser from 5.30.5 to 5.30.6
Bumps [@typescript-eslint/parser](https://github.com/typescript-eslint/typescript-eslint/tree/HEAD/packages/parser) from 5.30.5 to 5.30.6.
- [Release notes](https://github.com/typescript-eslint/typescript-eslint/releases)
- [Changelog](https://github.com/typescript-eslint/typescript-eslint/blob/main/packages/parser/CHANGELOG.md)
- [Commits](https://github.com/typescript-eslint/typescript-eslint/commits/v5.30.6/packages/parser)

---
updated-dependencies:
- dependency-name: "@typescript-eslint/parser"
  dependency-type: direct:development
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
2022-07-13 13:42:38 +00:00
Matthew Costabile
75ae529d21 Merge pull request #148 from actions/dependabot/npm_and_yarn/types/node-16.11.43
build(deps-dev): bump @types/node from 16.11.42 to 16.11.43
2022-07-11 08:54:13 -04:00
dependabot[bot]
93eba4a2e5 build(deps-dev): bump @types/node from 16.11.42 to 16.11.43
Bumps [@types/node](https://github.com/DefinitelyTyped/DefinitelyTyped/tree/HEAD/types/node) from 16.11.42 to 16.11.43.
- [Release notes](https://github.com/DefinitelyTyped/DefinitelyTyped/releases)
- [Commits](https://github.com/DefinitelyTyped/DefinitelyTyped/commits/HEAD/types/node)

---
updated-dependencies:
- dependency-name: "@types/node"
  dependency-type: direct:development
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
2022-07-11 12:52:44 +00:00
Matthew Costabile
5582d9894f Merge pull request #146 from actions/dependabot/npm_and_yarn/eslint-8.19.0
build(deps-dev): bump eslint from 8.18.0 to 8.19.0
2022-07-11 08:52:23 -04:00
Matthew Costabile
97e01d66ef Merge pull request #149 from actions/dependabot/npm_and_yarn/typescript-eslint/parser-5.30.5
build(deps-dev): bump @typescript-eslint/parser from 5.30.0 to 5.30.5
2022-07-11 08:51:45 -04:00
dependabot[bot]
2a4deb3f9f build(deps-dev): bump @typescript-eslint/parser from 5.30.0 to 5.30.5
Bumps [@typescript-eslint/parser](https://github.com/typescript-eslint/typescript-eslint/tree/HEAD/packages/parser) from 5.30.0 to 5.30.5.
- [Release notes](https://github.com/typescript-eslint/typescript-eslint/releases)
- [Changelog](https://github.com/typescript-eslint/typescript-eslint/blob/main/packages/parser/CHANGELOG.md)
- [Commits](https://github.com/typescript-eslint/typescript-eslint/commits/v5.30.5/packages/parser)

---
updated-dependencies:
- dependency-name: "@typescript-eslint/parser"
  dependency-type: direct:development
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
2022-07-05 13:37:49 +00:00
dependabot[bot]
458653506b build(deps-dev): bump eslint from 8.18.0 to 8.19.0
Bumps [eslint](https://github.com/eslint/eslint) from 8.18.0 to 8.19.0.
- [Release notes](https://github.com/eslint/eslint/releases)
- [Changelog](https://github.com/eslint/eslint/blob/main/CHANGELOG.md)
- [Commits](https://github.com/eslint/eslint/compare/v8.18.0...v8.19.0)

---
updated-dependencies:
- dependency-name: eslint
  dependency-type: direct:development
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
2022-07-04 13:38:12 +00:00
Matthew Costabile
322721b8cd Merge pull request #144 from actions/dependabot/npm_and_yarn/eslint-plugin-prettier-4.2.1
build(deps-dev): bump eslint-plugin-prettier from 4.1.0 to 4.2.1
2022-06-30 09:48:11 -04:00
Matthew Costabile
601b150078 Merge pull request #145 from actions/dependabot/npm_and_yarn/types/node-16.11.42
build(deps-dev): bump @types/node from 16.11.41 to 16.11.42
2022-06-30 09:44:56 -04:00
dependabot[bot]
665443b5d9 build(deps-dev): bump @types/node from 16.11.41 to 16.11.42
Bumps [@types/node](https://github.com/DefinitelyTyped/DefinitelyTyped/tree/HEAD/types/node) from 16.11.41 to 16.11.42.
- [Release notes](https://github.com/DefinitelyTyped/DefinitelyTyped/releases)
- [Commits](https://github.com/DefinitelyTyped/DefinitelyTyped/commits/HEAD/types/node)

---
updated-dependencies:
- dependency-name: "@types/node"
  dependency-type: direct:development
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
2022-06-30 13:35:58 +00:00
dependabot[bot]
caae605ffb build(deps-dev): bump eslint-plugin-prettier from 4.1.0 to 4.2.1
Bumps [eslint-plugin-prettier](https://github.com/prettier/eslint-plugin-prettier) from 4.1.0 to 4.2.1.
- [Release notes](https://github.com/prettier/eslint-plugin-prettier/releases)
- [Changelog](https://github.com/prettier/eslint-plugin-prettier/blob/master/CHANGELOG.md)
- [Commits](https://github.com/prettier/eslint-plugin-prettier/compare/v4.1.0...v4.2.1)

---
updated-dependencies:
- dependency-name: eslint-plugin-prettier
  dependency-type: direct:development
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
2022-06-30 13:35:47 +00:00
Matthew Costabile
5d3a082e24 Merge pull request #143 from actions/fix-tests
fix tests to account for api change
2022-06-30 09:21:52 -04:00
Matthew Costabile
80b198ce77 fix tests to account for api change 2022-06-30 13:13:58 +00:00
Matthew Costabile
92eaaeabac Merge pull request #138 from actions/dependabot/npm_and_yarn/typescript-eslint/parser-5.30.0
build(deps-dev): bump @typescript-eslint/parser from 5.29.0 to 5.30.0
2022-06-28 09:47:01 -04:00
Matthew Costabile
8eedaeb3f8 Merge pull request #137 from actions/dependabot/npm_and_yarn/eslint-plugin-prettier-4.1.0
build(deps-dev): bump eslint-plugin-prettier from 4.0.0 to 4.1.0
2022-06-28 09:46:43 -04:00
dependabot[bot]
3b83e6acf9 build(deps-dev): bump @typescript-eslint/parser from 5.29.0 to 5.30.0
Bumps [@typescript-eslint/parser](https://github.com/typescript-eslint/typescript-eslint/tree/HEAD/packages/parser) from 5.29.0 to 5.30.0.
- [Release notes](https://github.com/typescript-eslint/typescript-eslint/releases)
- [Changelog](https://github.com/typescript-eslint/typescript-eslint/blob/main/packages/parser/CHANGELOG.md)
- [Commits](https://github.com/typescript-eslint/typescript-eslint/commits/v5.30.0/packages/parser)

---
updated-dependencies:
- dependency-name: "@typescript-eslint/parser"
  dependency-type: direct:development
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
2022-06-28 13:36:40 +00:00
dependabot[bot]
0bf2f64851 build(deps-dev): bump eslint-plugin-prettier from 4.0.0 to 4.1.0
Bumps [eslint-plugin-prettier](https://github.com/prettier/eslint-plugin-prettier) from 4.0.0 to 4.1.0.
- [Release notes](https://github.com/prettier/eslint-plugin-prettier/releases)
- [Changelog](https://github.com/prettier/eslint-plugin-prettier/blob/master/CHANGELOG.md)
- [Commits](https://github.com/prettier/eslint-plugin-prettier/compare/v4.0.0...v4.1.0)

---
updated-dependencies:
- dependency-name: eslint-plugin-prettier
  dependency-type: direct:development
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
2022-06-28 13:36:28 +00:00
Lukasz Warchol
ce9d751c8c Update legacy version reference in the Readme 2022-06-28 14:21:39 +02:00
Lukasz Warchol
2b841e5b72 Merge pull request #105 from lukewar/graphql/projectv2
Update Action to use new ProjectsV2 api
2022-06-28 14:05:29 +02:00
Lukasz Warchol
7ca6a73a54 Update examples to point at release version 2022-06-28 09:33:15 +00:00
Lukasz Warchol
79db2f4851 Update readme to mention right scopes needed by this action 2022-06-28 09:31:09 +00:00
Lukasz Warchol
cf1add2ac3 Rebuild after re-installing packages. 2022-06-27 15:09:31 +00:00
Lukasz Warchol
50a0a4c60e Revert package version 2022-06-27 15:05:39 +00:00
Lukasz Warchol
ed9ec99956 Merge branch 'main' into graphql/projectv2 2022-06-27 14:53:57 +00:00
Lukasz Warchol
79316c3c93 Build and package
Setting pckage version
2022-06-27 13:19:25 +00:00
Lukasz Warchol
2914167b9b Apply suggestions from code review
Co-authored-by: Matt B <9885259+Mattamorphic@users.noreply.github.com>
2022-06-27 15:01:14 +02:00
Lukasz Warchol
53101abf47 Build and package 2022-06-02 15:28:56 +00:00
Lukasz Warchol
0c1e36ed75 Update Readme to point the users of the deprecated API to version 0.0.3
Remove feature flags header as it will not be needed after API is released.
2022-06-02 14:59:09 +00:00
Lukasz Warchol
1664cea4b1 Fixing misplacement of headers 2022-05-20 12:48:37 +00:00
Lukasz Warchol
58dc7efeb3 Build and package 2022-05-20 12:24:18 +00:00
Lukasz Warchol
8bc56cd807 Update Action to use new ProjectsV2 api
ProjectsNext API is going to be deprecated in favour of new ProjectsV2.
2022-05-20 12:22:44 +00:00
13 changed files with 607 additions and 381 deletions

View File

@@ -18,3 +18,5 @@ jobs:
npm install npm install
- run: | - run: |
npm run build npm run build
- run: |
npm run test

View File

@@ -1,20 +1,20 @@
--- ---
name: "@actions/core" name: '@actions/core'
version: 1.9.0 version: 1.9.0
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
license: mit license: mit
licenses: licenses:
- sources: LICENSE.md - sources: LICENSE.md
text: |- text: |-
The MIT License (MIT) The MIT License (MIT)
Copyright 2019 GitHub Copyright 2019 GitHub
Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
notices: [] notices: []

View File

@@ -1,20 +1,20 @@
--- ---
name: "@actions/github" name: '@actions/github'
version: 5.0.3 version: 5.0.3
type: npm type: npm
summary: Actions github lib summary: Actions github lib
homepage: https://github.com/actions/toolkit/tree/main/packages/github homepage: https://github.com/actions/toolkit/tree/main/packages/github
license: mit license: mit
licenses: licenses:
- sources: LICENSE.md - sources: LICENSE.md
text: |- text: |-
The MIT License (MIT) The MIT License (MIT)
Copyright 2019 GitHub Copyright 2019 GitHub
Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
notices: [] notices: []

View File

@@ -1,32 +1,32 @@
--- ---
name: "@actions/http-client" name: '@actions/http-client'
version: 2.0.1 version: 2.0.1
type: npm type: npm
summary: Actions Http Client summary: Actions Http Client
homepage: https://github.com/actions/toolkit/tree/main/packages/http-client homepage: https://github.com/actions/toolkit/tree/main/packages/http-client
license: mit license: mit
licenses: licenses:
- sources: LICENSE - sources: LICENSE
text: | text: |
Actions Http Client for Node.js Actions Http Client for Node.js
Copyright (c) GitHub, Inc. Copyright (c) GitHub, Inc.
All rights reserved. All rights reserved.
MIT License MIT License
Permission is hereby granted, free of charge, to any person obtaining a copy of this software and Permission is hereby granted, free of charge, to any person obtaining a copy of this software and
associated documentation files (the "Software"), to deal in the Software without restriction, associated documentation files (the "Software"), to deal in the Software without restriction,
including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense,
and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so,
subject to the following conditions: subject to the following conditions:
The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED *AS IS*, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT THE SOFTWARE IS PROVIDED *AS IS*, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT
LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN
NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
notices: [] notices: []

View File

@@ -1,34 +1,34 @@
--- ---
name: "@octokit/core" name: '@octokit/core'
version: 3.6.0 version: 3.6.0
type: npm type: npm
summary: Extendable client for GitHub's REST & GraphQL APIs summary: Extendable client for GitHub's REST & GraphQL APIs
homepage: homepage:
license: mit license: mit
licenses: licenses:
- sources: LICENSE - sources: LICENSE
text: | text: |
The MIT License The MIT License
Copyright (c) 2019 Octokit contributors Copyright (c) 2019 Octokit contributors
Permission is hereby granted, free of charge, to any person obtaining a copy Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions: furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included in The above copyright notice and this permission notice shall be included in
all copies or substantial portions of the Software. all copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
THE SOFTWARE. THE SOFTWARE.
- sources: README.md - sources: README.md
text: "[MIT](LICENSE)" text: '[MIT](LICENSE)'
notices: [] notices: []

View File

@@ -1,17 +1,13 @@
# actions/add-to-project # actions/add-to-project
Use this action to automatically add the current issue or pull request to a GitHub project. Use this action to automatically add the current issue or pull request to a [GitHub project](https://docs.github.com/en/issues/trying-out-the-new-projects-experience/about-projects).
Note that this is for [GitHub projects Note that this action does not support [GitHub projects (classic)](https://docs.github.com/en/issues/organizing-your-work-with-project-boards).
(beta)](https://docs.github.com/en/issues/trying-out-the-new-projects-experience/about-projects),
not the original GitHub projects.
## Current Status ## Current Status
[![build-test](https://github.com/actions/add-to-project/actions/workflows/test.yml/badge.svg)](https://github.com/actions/add-to-project/actions/workflows/test.yml) [![build-test](https://github.com/actions/add-to-project/actions/workflows/test.yml/badge.svg)](https://github.com/actions/add-to-project/actions/workflows/test.yml)
🚨 **This action is in beta, however the API is stable. Some breaking changes might occur between versions, but it is not likely to break as long as you use a specific SHA or version number** 🚨 > **NOTE:** ⚠️ This action no longer uses the deprecated ProjectNext API. If you are looking for the old version of that action, use version [v0.0.5](https://github.com/actions/add-to-project/releases/tag/v0.0.5).
> **NOTE:** This Action (currently) only supports auto-adding Issues to a Project which lives in the same organization as your target Repository.
## Usage ## Usage
@@ -23,7 +19,9 @@ Create a workflow that runs when Issues or Pull Requests are opened or labeled i
Once you've configured your workflow, save it as a `.yml` file in your target Repository's `.github/workflows` directory. Once you've configured your workflow, save it as a `.yml` file in your target Repository's `.github/workflows` directory.
##### Example Usage: Issue opened with labels `bug` OR `needs-triage` ### Examples
#### Example Usage: Issue opened with labels `bug` OR `needs-triage`
```yaml ```yaml
name: Add bugs to bugs project name: Add bugs to bugs project
@@ -38,15 +36,17 @@ jobs:
name: Add issue to project name: Add issue to project
runs-on: ubuntu-latest runs-on: ubuntu-latest
steps: steps:
- uses: actions/add-to-project@main - uses: actions/add-to-project@RELEASE_VERSION
with: with:
# You can target a repository in a different organization
# to the issue
project-url: https://github.com/orgs/<orgName>/projects/<projectNumber> project-url: https://github.com/orgs/<orgName>/projects/<projectNumber>
github-token: ${{ secrets.ADD_TO_PROJECT_PAT }} github-token: ${{ secrets.ADD_TO_PROJECT_PAT }}
labeled: bug, needs-triage labeled: bug, needs-triage
label-operator: OR label-operator: OR
``` ```
##### Example Usage: Adds all issues opened that do not include the label `bug` OR `needs-triage` #### Example Usage: Adds all issues opened that do not include the label `bug` OR `needs-triage`
```yaml ```yaml
name: Adds all issues that don't include the 'bug' or 'needs-triage' labels to project board name: Adds all issues that don't include the 'bug' or 'needs-triage' labels to project board
@@ -61,7 +61,7 @@ jobs:
name: Add issue to project name: Add issue to project
runs-on: ubuntu-latest runs-on: ubuntu-latest
steps: steps:
- uses: actions/add-to-project@main - uses: actions/add-to-project@RELEASE_VERSION
with: with:
project-url: https://github.com/orgs/<orgName>/projects/<projectNumber> project-url: https://github.com/orgs/<orgName>/projects/<projectNumber>
github-token: ${{ secrets.ADD_TO_PROJECT_PAT }} github-token: ${{ secrets.ADD_TO_PROJECT_PAT }}
@@ -69,7 +69,7 @@ jobs:
label-operator: NOT label-operator: NOT
``` ```
##### Example Usage: Pull Requests labeled with `needs-review` and `size/XL` #### Example Usage: Pull Requests labeled with `needs-review` and `size/XL`
```yaml ```yaml
name: Add needs-review and size/XL pull requests to projects name: Add needs-review and size/XL pull requests to projects
@@ -84,7 +84,7 @@ jobs:
name: Add issue to project name: Add issue to project
runs-on: ubuntu-latest runs-on: ubuntu-latest
steps: steps:
- uses: actions/add-to-project@main - uses: actions/add-to-project@RELEASE_VERSION
with: with:
project-url: https://github.com/orgs/<orgName>/projects/<projectNumber> project-url: https://github.com/orgs/<orgName>/projects/<projectNumber>
github-token: ${{ secrets.ADD_TO_PROJECT_PAT }} github-token: ${{ secrets.ADD_TO_PROJECT_PAT }}
@@ -92,22 +92,29 @@ jobs:
label-operator: AND label-operator: AND
``` ```
#### Further reading and additional resources ### Further reading and additional resources
- [Inputs](#inputs) - [actions/add-to-project](#actionsadd-to-project)
- [Supported Events](#supported-events) - [Current Status](#current-status)
- [How to point the action to a specific branch or commit sha](#how-to-point-the-action-to-a-specific-branch-or-commit-sha) - [Usage](#usage)
- [Creating a PAT and adding it to your repository](#creating-a-pat-and-adding-it-to-your-repository) - [Examples](#examples)
- [Development](#development) - [Example Usage: Issue opened with labels `bug` OR `needs-triage`](#example-usage-issue-opened-with-labels-bug-or-needs-triage)
- [Publish to a distribution branch](#publish-to-a-distribution-branch) - [Example Usage: Adds all issues opened that do not include the label `bug` OR `needs-triage`](#example-usage-adds-all-issues-opened-that-do-not-include-the-label-bug-or-needs-triage)
- [Example Usage: Pull Requests labeled with `needs-review` and `size/XL`](#example-usage-pull-requests-labeled-with-needs-review-and-sizexl)
- [Further reading and additional resources](#further-reading-and-additional-resources)
- [Inputs](#inputs)
- [Supported Events](#supported-events)
- [Creating a PAT and adding it to your repository](#creating-a-pat-and-adding-it-to-your-repository)
- [Development](#development)
- [Publish to a distribution branch](#publish-to-a-distribution-branch)
- [License](#license)
## Inputs ## Inputs
- <a name="project-url">`project-url`</a> **(required)** is the URL of the GitHub project to add issues to. - <a name="project-url">`project-url`</a> **(required)** is the URL of the GitHub project to add issues to.
_eg: `https://github.com/orgs|users/<ownerName>/projects/<projectNumber>`_ _eg: `https://github.com/orgs|users/<ownerName>/projects/<projectNumber>`_
- <a name="github-token">`github-token`</a> **(required)** is a [personal access - <a name="github-token">`github-token`</a> **(required)** is a [personal access
token](https://github.com/settings/tokens/new) with the `repo`, `write:org` and token](https://github.com/settings/tokens/new) with `repo` and `project` scopes.
`read:org` scopes.
_See [Creating a PAT and adding it to your repository](#creating-a-pat-and-adding-it-to-your-repository) for more details_ _See [Creating a PAT and adding it to your repository](#creating-a-pat-and-adding-it-to-your-repository) for more details_
- <a name="labeled">`labeled`</a> **(optional)** is a comma-separated list of labels used to filter applicable issues. When this key is provided, an issue must have _one_ of the labels in the list to be added to the project. Omitting this key means that any issue will be added. - <a name="labeled">`labeled`</a> **(optional)** is a comma-separated list of labels used to filter applicable issues. When this key is provided, an issue must have _one_ of the labels in the list to be added to the project. Omitting this key means that any issue will be added.
- <a name="labeled">`label-operator`</a> **(optional)** is the behavior of the labels filter, either `AND`, `OR` or `NOT` that controls if the issue should be matched with `all` `labeled` input or any of them, default is `OR`. - <a name="labeled">`label-operator`</a> **(optional)** is the behavior of the labels filter, either `AND`, `OR` or `NOT` that controls if the issue should be matched with `all` `labeled` input or any of them, default is `OR`.
@@ -127,41 +134,10 @@ and the following [`pull_request` events](https://docs.github.com/en/actions/usi
Using these events ensure that a given issue or pull request, in the workflow's repo, is added to the [specified project](#project-url). If [labeled input(s)](#labeled) are defined, then issues will only be added if they contain at least _one_ of the labels in the list. Using these events ensure that a given issue or pull request, in the workflow's repo, is added to the [specified project](#project-url). If [labeled input(s)](#labeled) are defined, then issues will only be added if they contain at least _one_ of the labels in the list.
## How to point the action to a specific branch or commit sha
Pointing to a branch name generally isn't the safest way to refer to an action, but this is how you can use this action now before we've begun creating releases.
```yaml
jobs:
add-to-project:
name: Add issue to project
runs-on: ubuntu-latest
steps:
- uses: actions/add-to-project@main
with:
project-url: https://github.com/orgs/<orgName>/projects/<projectNumber>
github-token: ${{ secrets.ADD_TO_PROJECT_PAT }}
```
Another option would be to point to a full [commit SHA](https://docs.github.com/en/get-started/quickstart/github-glossary#commit):
```yaml
jobs:
add-to-project:
name: Add issue to project
runs-on: ubuntu-latest
steps:
- uses: actions/add-to-project@<commitSHA>
with:
project-url: https://github.com/orgs/<orgName>/projects/<projectNumber>
github-token: ${{ secrets.ADD_TO_PROJECT_PAT }}
```
## Creating a PAT and adding it to your repository ## Creating a PAT and adding it to your repository
- create a new [personal access - create a new [personal access
token](https://github.com/settings/tokens/new) with `repo`, `write:org` and token](https://github.com/settings/tokens/new) with `repo` and `project` scopes
`read:org` scopes
_See [Creating a personal access token](https://docs.github.com/en/authentication/keeping-your-account-and-data-secure/creating-a-personal-access-token) for more information_ _See [Creating a personal access token](https://docs.github.com/en/authentication/keeping-your-account-and-data-secure/creating-a-personal-access-token) for more information_
- add the newly created PAT as a repository secret, this secret will be referenced by the [github-token input](#github-token) - add the newly created PAT as a repository secret, this secret will be referenced by the [github-token input](#github-token)

View File

@@ -1,5 +1,6 @@
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 {addToProject, mustGetOwnerTypeQuery} from '../src/add-to-project' import {addToProject, mustGetOwnerTypeQuery} from '../src/add-to-project'
describe('addToProject', () => { describe('addToProject', () => {
@@ -11,7 +12,7 @@ describe('addToProject', () => {
beforeEach(() => { beforeEach(() => {
mockGetInput({ mockGetInput({
'project-url': 'https://github.com/orgs/github/projects/1', 'project-url': 'https://github.com/orgs/actions/projects/1',
'github-token': 'gh_token' 'github-token': 'gh_token'
}) })
@@ -23,46 +24,19 @@ describe('addToProject', () => {
jest.restoreAllMocks() jest.restoreAllMocks()
}) })
test('adds an issue to the project', async () => { test('adds an issue from the same organization to the project', async () => {
mockGraphQL(
{
test: /getProject/,
return: {
organization: {
projectNext: {
id: 'project-next-id'
}
}
}
},
{
test: /addProjectNextItem/,
return: {
addProjectNextItem: {
projectNextItem: {
id: 'project-next-item-id'
}
}
}
}
)
await addToProject()
expect(outputs.itemId).toEqual('project-next-item-id')
})
test('adds matching issues with a label filter without label-operator', async () => {
mockGetInput({
'project-url': 'https://github.com/orgs/github/projects/1',
'github-token': 'gh_token',
labeled: 'bug, new'
})
github.context.payload = { github.context.payload = {
issue: { issue: {
number: 1, number: 1,
labels: [{name: 'bug'}] labels: [{name: 'bug'}],
// eslint-disable-next-line camelcase
html_url: 'https://github.com/actions/add-to-project/issues/74'
},
repository: {
name: 'add-to-project',
owner: {
login: 'actions'
}
} }
} }
@@ -71,18 +45,18 @@ describe('addToProject', () => {
test: /getProject/, test: /getProject/,
return: { return: {
organization: { organization: {
projectNext: { projectV2: {
id: 'project-next-id' id: 'project-id'
} }
} }
} }
}, },
{ {
test: /addProjectNextItem/, test: /addProjectV2ItemById/,
return: { return: {
addProjectNextItem: { addProjectV2ItemById: {
projectNextItem: { item: {
id: 'project-next-item-id' id: 'project-item-id'
} }
} }
} }
@@ -91,12 +65,106 @@ describe('addToProject', () => {
await addToProject() await addToProject()
expect(outputs.itemId).toEqual('project-next-item-id') expect(outputs.itemId).toEqual('project-item-id')
})
test('adds an issue from a different organization to the project', async () => {
github.context.payload = {
issue: {
number: 2221,
labels: [{name: 'bug'}],
// eslint-disable-next-line camelcase
html_url: 'https://github.com/octokit/octokit.js/issues/2221'
},
repository: {
name: 'octokit.js',
owner: {
login: 'octokit'
}
}
}
mockGraphQL(
{
test: /getProject/,
return: {
organization: {
projectV2: {
id: 'project-id'
}
}
}
},
{
test: /addProjectV2DraftIssue/,
return: {
addProjectV2DraftIssue: {
projectItem: {
id: 'project-item-id'
}
}
}
}
)
await addToProject()
expect(outputs.itemId).toEqual('project-item-id')
})
test('adds matching issues with a label filter without label-operator', async () => {
mockGetInput({
'project-url': 'https://github.com/orgs/actions/projects/1',
'github-token': 'gh_token',
labeled: 'bug, new'
})
github.context.payload = {
issue: {
number: 1,
labels: [{name: 'bug'}],
// eslint-disable-next-line camelcase
html_url: 'https://github.com/actions/add-to-project/issues/74'
},
repository: {
name: 'add-to-project',
owner: {
login: 'actions'
}
}
}
mockGraphQL(
{
test: /getProject/,
return: {
organization: {
projectV2: {
id: 'project-id'
}
}
}
},
{
test: /addProjectV2ItemById/,
return: {
addProjectV2ItemById: {
item: {
id: 'project-item-id'
}
}
}
}
)
await addToProject()
expect(outputs.itemId).toEqual('project-item-id')
}) })
test('adds matching pull-requests with a label filter without label-operator', async () => { test('adds matching pull-requests with a label filter without label-operator', async () => {
mockGetInput({ mockGetInput({
'project-url': 'https://github.com/orgs/github/projects/1', 'project-url': 'https://github.com/orgs/actions/projects/1',
'github-token': 'gh_token', 'github-token': 'gh_token',
labeled: 'bug, new' labeled: 'bug, new'
}) })
@@ -105,7 +173,15 @@ describe('addToProject', () => {
// eslint-disable-next-line camelcase // eslint-disable-next-line camelcase
pull_request: { pull_request: {
number: 1, number: 1,
labels: [{name: 'bug'}] labels: [{name: 'bug'}],
// eslint-disable-next-line camelcase
html_url: 'https://github.com/actions/add-to-project/pull/136'
},
repository: {
name: 'add-to-project',
owner: {
login: 'actions'
}
} }
} }
@@ -114,18 +190,18 @@ describe('addToProject', () => {
test: /getProject/, test: /getProject/,
return: { return: {
organization: { organization: {
projectNext: { projectV2: {
id: 'project-next-id' id: 'project-id'
} }
} }
} }
}, },
{ {
test: /addProjectNextItem/, test: /addProjectV2ItemById/,
return: { return: {
addProjectNextItem: { addProjectV2ItemById: {
projectNextItem: { item: {
id: 'project-next-item-id' id: 'project-item-id'
} }
} }
} }
@@ -134,12 +210,12 @@ describe('addToProject', () => {
await addToProject() await addToProject()
expect(outputs.itemId).toEqual('project-next-item-id') expect(outputs.itemId).toEqual('project-item-id')
}) })
test('does not add un-matching issues with a label filter without label-operator', async () => { test('does not add un-matching issues with a label filter without label-operator', async () => {
mockGetInput({ mockGetInput({
'project-url': 'https://github.com/orgs/github/projects/1', 'project-url': 'https://github.com/orgs/actions/projects/1',
'github-token': 'gh_token', 'github-token': 'gh_token',
labeled: 'bug' labeled: 'bug'
}) })
@@ -147,7 +223,15 @@ describe('addToProject', () => {
github.context.payload = { github.context.payload = {
issue: { issue: {
number: 1, number: 1,
labels: [] labels: [],
// eslint-disable-next-line camelcase
html_url: 'https://github.com/actions/add-to-project/issues/74'
},
repository: {
name: 'add-to-project',
owner: {
login: 'actions'
}
} }
} }
@@ -160,7 +244,7 @@ describe('addToProject', () => {
test('adds matching issues with labels filter with AND label-operator', async () => { test('adds matching issues with labels filter with AND label-operator', async () => {
mockGetInput({ mockGetInput({
'project-url': 'https://github.com/orgs/github/projects/1', 'project-url': 'https://github.com/orgs/actions/projects/1',
'github-token': 'gh_token', 'github-token': 'gh_token',
labeled: 'bug, new', labeled: 'bug, new',
'label-operator': 'AND' 'label-operator': 'AND'
@@ -169,7 +253,15 @@ describe('addToProject', () => {
github.context.payload = { github.context.payload = {
issue: { issue: {
number: 1, number: 1,
labels: [{name: 'bug'}, {name: 'new'}] labels: [{name: 'bug'}, {name: 'new'}],
// eslint-disable-next-line camelcase
html_url: 'https://github.com/actions/add-to-project/issues/74'
},
repository: {
name: 'add-to-project',
owner: {
login: 'actions'
}
} }
} }
@@ -178,18 +270,18 @@ describe('addToProject', () => {
test: /getProject/, test: /getProject/,
return: { return: {
organization: { organization: {
projectNext: { projectV2: {
id: 'project-next-id' id: 'project-id'
} }
} }
} }
}, },
{ {
test: /addProjectNextItem/, test: /addProjectV2ItemById/,
return: { return: {
addProjectNextItem: { addProjectV2ItemById: {
projectNextItem: { item: {
id: 'project-next-item-id' id: 'project-item-id'
} }
} }
} }
@@ -198,12 +290,12 @@ describe('addToProject', () => {
await addToProject() await addToProject()
expect(outputs.itemId).toEqual('project-next-item-id') expect(outputs.itemId).toEqual('project-item-id')
}) })
test('does not add un-matching issues with labels filter with AND label-operator', async () => { test('does not add un-matching issues with labels filter with AND label-operator', async () => {
mockGetInput({ mockGetInput({
'project-url': 'https://github.com/orgs/github/projects/1', 'project-url': 'https://github.com/orgs/actions/projects/1',
'github-token': 'gh_token', 'github-token': 'gh_token',
labeled: 'bug, new', labeled: 'bug, new',
'label-operator': 'AND' 'label-operator': 'AND'
@@ -212,7 +304,15 @@ describe('addToProject', () => {
github.context.payload = { github.context.payload = {
issue: { issue: {
number: 1, number: 1,
labels: [{name: 'bug'}, {name: 'other'}] labels: [{name: 'bug'}, {name: 'other'}],
// eslint-disable-next-line camelcase
html_url: 'https://github.com/actions/add-to-project/issues/74'
},
repository: {
name: 'add-to-project',
owner: {
login: 'actions'
}
} }
} }
@@ -225,7 +325,7 @@ describe('addToProject', () => {
test('does not add matching issues with labels filter with NOT label-operator', async () => { test('does not add matching issues with labels filter with NOT label-operator', async () => {
mockGetInput({ mockGetInput({
'project-url': 'https://github.com/orgs/github/projects/1', 'project-url': 'https://github.com/orgs/actions/projects/1',
'github-token': 'gh_token', 'github-token': 'gh_token',
labeled: 'bug, new', labeled: 'bug, new',
'label-operator': 'NOT' 'label-operator': 'NOT'
@@ -234,7 +334,15 @@ describe('addToProject', () => {
github.context.payload = { github.context.payload = {
issue: { issue: {
number: 1, number: 1,
labels: [{name: 'bug'}] labels: [{name: 'bug'}],
// eslint-disable-next-line camelcase
html_url: 'https://github.com/actions/add-to-project/issues/74'
},
repository: {
name: 'add-to-project',
owner: {
login: 'actions'
}
} }
} }
@@ -247,7 +355,7 @@ describe('addToProject', () => {
test('adds issues that do not have labels present in the label list with NOT label-operator', async () => { test('adds issues that do not have labels present in the label list with NOT label-operator', async () => {
mockGetInput({ mockGetInput({
'project-url': 'https://github.com/orgs/github/projects/1', 'project-url': 'https://github.com/orgs/actions/projects/1',
'github-token': 'gh_token', 'github-token': 'gh_token',
labeled: 'bug, new', labeled: 'bug, new',
'label-operator': 'NOT' 'label-operator': 'NOT'
@@ -256,7 +364,15 @@ describe('addToProject', () => {
github.context.payload = { github.context.payload = {
issue: { issue: {
number: 1, number: 1,
labels: [{name: 'other'}] labels: [{name: 'other'}],
// eslint-disable-next-line camelcase
html_url: 'https://github.com/actions/add-to-project/issues/74'
},
repository: {
name: 'add-to-project',
owner: {
login: 'actions'
}
} }
} }
@@ -265,17 +381,17 @@ describe('addToProject', () => {
test: /getProject/, test: /getProject/,
return: { return: {
organization: { organization: {
projectNext: { projectV2: {
id: 'project-next-id' id: 'project-next-id'
} }
} }
} }
}, },
{ {
test: /addProjectNextItem/, test: /addProjectV2ItemById/,
return: { return: {
addProjectNextItem: { addProjectV2ItemById: {
projectNextItem: { item: {
id: 'project-next-item-id' id: 'project-next-item-id'
} }
} }
@@ -290,7 +406,7 @@ describe('addToProject', () => {
test('adds matching issues with multiple label filters', async () => { test('adds matching issues with multiple label filters', async () => {
mockGetInput({ mockGetInput({
'project-url': 'https://github.com/orgs/github/projects/1', 'project-url': 'https://github.com/orgs/actions/projects/1',
'github-token': 'gh_token', 'github-token': 'gh_token',
labeled: 'accessibility,backend,bug' labeled: 'accessibility,backend,bug'
}) })
@@ -298,7 +414,15 @@ describe('addToProject', () => {
github.context.payload = { github.context.payload = {
issue: { issue: {
number: 1, number: 1,
labels: [{name: 'accessibility'}, {name: 'backend'}] labels: [{name: 'accessibility'}, {name: 'backend'}],
// eslint-disable-next-line camelcase
html_url: 'https://github.com/actions/add-to-project/issues/74'
},
repository: {
name: 'add-to-project',
owner: {
login: 'actions'
}
} }
} }
@@ -307,18 +431,18 @@ describe('addToProject', () => {
test: /getProject/, test: /getProject/,
return: { return: {
organization: { organization: {
projectNext: { projectV2: {
id: 'project-next-id' id: 'project-id'
} }
} }
} }
}, },
{ {
test: /addProjectNextItem/, test: /addProjectV2ItemById/,
return: { return: {
addProjectNextItem: { addProjectV2ItemById: {
projectNextItem: { item: {
id: 'project-next-item-id' id: 'project-item-id'
} }
} }
} }
@@ -330,13 +454,15 @@ describe('addToProject', () => {
await addToProject() await addToProject()
expect(gqlMock).toHaveBeenCalled() expect(gqlMock).toHaveBeenCalled()
expect(infoSpy).not.toHaveBeenCalled() expect(infoSpy).toHaveBeenCalledWith('Creating project item')
expect(outputs.itemId).toEqual('project-next-item-id') // We shouldn't have any logs relating to the issue being skipped
expect(infoSpy.mock.calls.length).toEqual(1)
expect(outputs.itemId).toEqual('project-item-id')
}) })
test('does not add un-matching issues with multiple label filters', async () => { test('does not add un-matching issues with multiple label filters', async () => {
mockGetInput({ mockGetInput({
'project-url': 'https://github.com/orgs/github/projects/1', 'project-url': 'https://github.com/orgs/actions/projects/1',
'github-token': 'gh_token', 'github-token': 'gh_token',
labeled: 'accessibility, backend, bug' labeled: 'accessibility, backend, bug'
}) })
@@ -344,7 +470,15 @@ describe('addToProject', () => {
github.context.payload = { github.context.payload = {
issue: { issue: {
number: 1, number: 1,
labels: [{name: 'data'}, {name: 'frontend'}, {name: 'improvement'}] labels: [{name: 'data'}, {name: 'frontend'}, {name: 'improvement'}],
// eslint-disable-next-line camelcase
html_url: 'https://github.com/actions/add-to-project/issues/74'
},
repository: {
name: 'add-to-project',
owner: {
login: 'actions'
}
} }
} }
@@ -359,7 +493,7 @@ describe('addToProject', () => {
test('handles spaces and extra commas gracefully in label filter input', async () => { test('handles spaces and extra commas gracefully in label filter input', async () => {
mockGetInput({ mockGetInput({
'project-url': 'https://github.com/orgs/github/projects/1', 'project-url': 'https://github.com/orgs/actions/projects/1',
'github-token': 'gh_token', 'github-token': 'gh_token',
labeled: 'accessibility , backend ,, . , bug' labeled: 'accessibility , backend ,, . , bug'
}) })
@@ -368,7 +502,15 @@ describe('addToProject', () => {
issue: { issue: {
number: 1, number: 1,
labels: [{name: 'accessibility'}, {name: 'backend'}, {name: 'bug'}], labels: [{name: 'accessibility'}, {name: 'backend'}, {name: 'bug'}],
'label-operator': 'AND' 'label-operator': 'AND',
// eslint-disable-next-line camelcase
html_url: 'https://github.com/actions/add-to-project/issues/74'
},
repository: {
name: 'add-to-project',
owner: {
login: 'actions'
}
} }
} }
@@ -377,18 +519,18 @@ describe('addToProject', () => {
test: /getProject/, test: /getProject/,
return: { return: {
organization: { organization: {
projectNext: { projectV2: {
id: 'project-next-id' id: 'project-id'
} }
} }
} }
}, },
{ {
test: /addProjectNextItem/, test: /addProjectV2ItemById/,
return: { return: {
addProjectNextItem: { addProjectV2ItemById: {
projectNextItem: { item: {
id: 'project-next-item-id' id: 'project-item-id'
} }
} }
} }
@@ -400,8 +542,10 @@ describe('addToProject', () => {
await addToProject() await addToProject()
expect(gqlMock).toHaveBeenCalled() expect(gqlMock).toHaveBeenCalled()
expect(infoSpy).not.toHaveBeenCalled() expect(infoSpy).toHaveBeenCalledWith('Creating project item')
expect(outputs.itemId).toEqual('project-next-item-id') // We shouldn't have any logs relating to the issue being skipped
expect(infoSpy.mock.calls.length).toEqual(1)
expect(outputs.itemId).toEqual('project-item-id')
}) })
test(`throws an error when url isn't a valid project url`, async () => { test(`throws an error when url isn't a valid project url`, async () => {
@@ -413,7 +557,15 @@ describe('addToProject', () => {
github.context.payload = { github.context.payload = {
issue: { issue: {
number: 1, number: 1,
labels: [] labels: [],
// eslint-disable-next-line camelcase
html_url: 'https://github.com/actions/add-to-project/issues/74'
},
repository: {
name: 'add-to-project',
owner: {
login: 'actions'
}
} }
} }
@@ -435,7 +587,15 @@ describe('addToProject', () => {
github.context.payload = { github.context.payload = {
issue: { issue: {
number: 1, number: 1,
labels: [] labels: [],
// eslint-disable-next-line camelcase
html_url: 'https://github.com/actions/add-to-project/issues/74'
},
repository: {
name: 'add-to-project',
owner: {
login: 'actions'
}
} }
} }
@@ -450,7 +610,7 @@ describe('addToProject', () => {
test('constructs the correct graphQL query given an organization owner', async () => { test('constructs the correct graphQL query given an organization owner', async () => {
mockGetInput({ mockGetInput({
'project-url': 'https://github.com/orgs/github/projects/1', 'project-url': 'https://github.com/orgs/actions/projects/1',
'github-token': 'gh_token', 'github-token': 'gh_token',
labeled: 'bug, new' labeled: 'bug, new'
}) })
@@ -458,7 +618,15 @@ describe('addToProject', () => {
github.context.payload = { github.context.payload = {
issue: { issue: {
number: 1, number: 1,
labels: [{name: 'bug'}] labels: [{name: 'bug'}],
// eslint-disable-next-line camelcase
html_url: 'https://github.com/actions/add-to-project/issues/74'
},
repository: {
name: 'add-to-project',
owner: {
login: 'actions'
}
} }
} }
@@ -467,18 +635,18 @@ describe('addToProject', () => {
test: /getProject/, test: /getProject/,
return: { return: {
organization: { organization: {
projectNext: { projectV2: {
id: 'project-next-id' id: 'project-id'
} }
} }
} }
}, },
{ {
test: /addProjectNextItem/, test: /addProjectV2ItemById/,
return: { return: {
addProjectNextItem: { addProjectV2ItemById: {
projectNextItem: { item: {
id: 'project-next-item-id' id: 'project-item-id'
} }
} }
} }
@@ -487,8 +655,8 @@ describe('addToProject', () => {
await addToProject() await addToProject()
expect(gqlMock).toHaveBeenNthCalledWith(1, expect.stringContaining('organization(login: $ownerName)'), { expect(gqlMock).toHaveBeenNthCalledWith(1, expect.stringContaining('organization(login: $projectOwnerName)'), {
ownerName: 'github', projectOwnerName: 'actions',
projectNumber: 1 projectNumber: 1
}) })
}) })
@@ -503,7 +671,15 @@ describe('addToProject', () => {
github.context.payload = { github.context.payload = {
issue: { issue: {
number: 1, number: 1,
labels: [{name: 'bug'}] labels: [{name: 'bug'}],
// eslint-disable-next-line camelcase
html_url: 'https://github.com/monalisa/add-to-project/issues/74'
},
repository: {
name: 'add-to-project',
owner: {
login: 'monalisa'
}
} }
} }
@@ -512,18 +688,18 @@ describe('addToProject', () => {
test: /getProject/, test: /getProject/,
return: { return: {
organization: { organization: {
projectNext: { projectV2: {
id: 'project-next-id' id: 'project-id'
} }
} }
} }
}, },
{ {
test: /addProjectNextItem/, test: /addProjectV2ItemById/,
return: { return: {
addProjectNextItem: { addProjectV2ItemById: {
projectNextItem: { item: {
id: 'project-next-item-id' id: 'project-item-id'
} }
} }
} }
@@ -532,15 +708,15 @@ describe('addToProject', () => {
await addToProject() await addToProject()
expect(gqlMock).toHaveBeenNthCalledWith(1, expect.stringContaining('user(login: $ownerName)'), { expect(gqlMock).toHaveBeenNthCalledWith(1, expect.stringContaining('user(login: $projectOwnerName)'), {
ownerName: 'monalisa', projectOwnerName: 'monalisa',
projectNumber: 1 projectNumber: 1
}) })
}) })
test('compares labels case-insensitively', async () => { test('compares labels case-insensitively', async () => {
mockGetInput({ mockGetInput({
'project-url': 'https://github.com/orgs/github/projects/1', 'project-url': 'https://github.com/orgs/actions/projects/1',
'github-token': 'gh_token', 'github-token': 'gh_token',
labeled: 'FOO, Bar, baz', labeled: 'FOO, Bar, baz',
'label-operator': 'AND' 'label-operator': 'AND'
@@ -549,7 +725,15 @@ describe('addToProject', () => {
github.context.payload = { github.context.payload = {
issue: { issue: {
number: 1, number: 1,
labels: [{name: 'foo'}, {name: 'BAR'}, {name: 'baz'}] labels: [{name: 'foo'}, {name: 'BAR'}, {name: 'baz'}],
// eslint-disable-next-line camelcase
html_url: 'https://github.com/actions/add-to-project/issues/74'
},
repository: {
name: 'add-to-project',
owner: {
login: 'actions'
}
} }
} }
@@ -558,17 +742,17 @@ describe('addToProject', () => {
test: /getProject/, test: /getProject/,
return: { return: {
organization: { organization: {
projectNext: { projectV2: {
id: 'project-next-id' id: 'project-next-id'
} }
} }
} }
}, },
{ {
test: /addProjectNextItem/, test: /addProjectV2ItemById/,
return: { return: {
addProjectNextItem: { addProjectV2ItemById: {
projectNextItem: { item: {
id: 'project-next-item-id' id: 'project-next-item-id'
} }
} }

View File

@@ -1,5 +1,5 @@
name: Add To GitHub Projects Beta name: Add To GitHub projects
description: Automatically add issues and PRs to GitHub projects beta description: Automatically add issues and PRs to GitHub projects
author: GitHub author: GitHub
branding: branding:
icon: table icon: table

72
dist/index.js generated vendored
View File

@@ -46,7 +46,7 @@ const github = __importStar(__nccwpck_require__(5438));
// https://github.com/orgs|users/<ownerName>/projects/<projectNumber> // https://github.com/orgs|users/<ownerName>/projects/<projectNumber>
const urlParse = /^(?:https:\/\/)?github\.com\/(?<ownerType>orgs|users)\/(?<ownerName>[^/]+)\/projects\/(?<projectNumber>\d+)/; const urlParse = /^(?:https:\/\/)?github\.com\/(?<ownerType>orgs|users)\/(?<ownerName>[^/]+)\/projects\/(?<projectNumber>\d+)/;
function addToProject() { function addToProject() {
var _a, _b, _c, _d, _e, _f, _g, _h; var _a, _b, _c, _d, _e, _f, _g, _h, _j;
return __awaiter(this, void 0, void 0, function* () { return __awaiter(this, void 0, void 0, function* () {
const projectUrl = core.getInput('project-url', { required: true }); const projectUrl = core.getInput('project-url', { required: true });
const ghToken = core.getInput('github-token', { required: true }); const ghToken = core.getInput('github-token', { required: true });
@@ -57,9 +57,10 @@ function addToProject() {
.filter(l => l.length > 0)) !== null && _a !== void 0 ? _a : []; .filter(l => l.length > 0)) !== null && _a !== void 0 ? _a : [];
const labelOperator = core.getInput('label-operator').trim().toLocaleLowerCase(); const labelOperator = core.getInput('label-operator').trim().toLocaleLowerCase();
const octokit = github.getOctokit(ghToken); const octokit = github.getOctokit(ghToken);
const urlMatch = projectUrl.match(urlParse);
const issue = (_b = github.context.payload.issue) !== null && _b !== void 0 ? _b : github.context.payload.pull_request; const issue = (_b = github.context.payload.issue) !== null && _b !== void 0 ? _b : github.context.payload.pull_request;
const issueLabels = ((_c = issue === null || issue === void 0 ? void 0 : issue.labels) !== null && _c !== void 0 ? _c : []).map((l) => l.name.toLowerCase()); const issueLabels = ((_c = issue === null || issue === void 0 ? void 0 : issue.labels) !== null && _c !== void 0 ? _c : []).map((l) => l.name.toLowerCase());
const issueOwnerName = (_d = github.context.payload.repository) === null || _d === void 0 ? void 0 : _d.owner.login;
core.debug(`Issue/PR owner: ${issueOwnerName}`);
// Ensure the issue matches our `labeled` filter based on the label-operator. // Ensure the issue matches our `labeled` filter based on the label-operator.
if (labelOperator === 'and') { if (labelOperator === 'and') {
if (!labeled.every(l => issueLabels.includes(l))) { if (!labeled.every(l => issueLabels.includes(l))) {
@@ -80,45 +81,68 @@ function addToProject() {
} }
} }
core.debug(`Project URL: ${projectUrl}`); core.debug(`Project URL: ${projectUrl}`);
const urlMatch = projectUrl.match(urlParse);
if (!urlMatch) { if (!urlMatch) {
throw new Error(`Invalid project URL: ${projectUrl}. Project URL should match the format https://github.com/<orgs-or-users>/<ownerName>/projects/<projectNumber>`); throw new Error(`Invalid project URL: ${projectUrl}. Project URL should match the format https://github.com/<orgs-or-users>/<ownerName>/projects/<projectNumber>`);
} }
const ownerName = (_d = urlMatch.groups) === null || _d === void 0 ? void 0 : _d.ownerName; const projectOwnerName = (_e = urlMatch.groups) === null || _e === void 0 ? void 0 : _e.ownerName;
const projectNumber = parseInt((_f = (_e = urlMatch.groups) === null || _e === void 0 ? void 0 : _e.projectNumber) !== null && _f !== void 0 ? _f : '', 10); const projectNumber = parseInt((_g = (_f = urlMatch.groups) === null || _f === void 0 ? void 0 : _f.projectNumber) !== null && _g !== void 0 ? _g : '', 10);
const ownerType = (_g = urlMatch.groups) === null || _g === void 0 ? void 0 : _g.ownerType; const ownerType = (_h = urlMatch.groups) === null || _h === void 0 ? void 0 : _h.ownerType;
const ownerTypeQuery = mustGetOwnerTypeQuery(ownerType); const ownerTypeQuery = mustGetOwnerTypeQuery(ownerType);
core.debug(`Org name: ${ownerName}`); core.debug(`Project owner: ${projectOwnerName}`);
core.debug(`Project number: ${projectNumber}`); core.debug(`Project number: ${projectNumber}`);
core.debug(`Owner type: ${ownerType}`); core.debug(`Project owner type: ${ownerType}`);
// First, use the GraphQL API to request the project's node ID. // First, use the GraphQL API to request the project's node ID.
const idResp = yield octokit.graphql(`query getProject($ownerName: String!, $projectNumber: Int!) { const idResp = yield octokit.graphql(`query getProject($projectOwnerName: String!, $projectNumber: Int!) {
${ownerTypeQuery}(login: $ownerName) { ${ownerTypeQuery}(login: $projectOwnerName) {
projectNext(number: $projectNumber) { projectV2(number: $projectNumber) {
id id
} }
} }
}`, { }`, {
ownerName, projectOwnerName,
projectNumber projectNumber
}); });
const projectId = (_h = idResp[ownerTypeQuery]) === null || _h === void 0 ? void 0 : _h.projectNext.id; const projectId = (_j = idResp[ownerTypeQuery]) === null || _j === void 0 ? void 0 : _j.projectV2.id;
const contentId = issue === null || issue === void 0 ? void 0 : issue.node_id; const contentId = issue === null || issue === void 0 ? void 0 : issue.node_id;
core.debug(`Project node ID: ${projectId}`); core.debug(`Project node ID: ${projectId}`);
core.debug(`Content ID: ${contentId}`); core.debug(`Content ID: ${contentId}`);
// Next, use the GraphQL API to add the issue to the project. // Next, use the GraphQL API to add the issue to the project.
const addResp = yield octokit.graphql(`mutation addIssueToProject($input: AddProjectNextItemInput!) { // If the issue has the same owner as the project, we can directly
addProjectNextItem(input: $input) { // add a project item. Otherwise, we add a draft issue.
projectNextItem { if (issueOwnerName === projectOwnerName) {
id core.info('Creating project item');
const addResp = yield octokit.graphql(`mutation addIssueToProject($input: AddProjectV2ItemByIdInput!) {
addProjectV2ItemById(input: $input) {
item {
id
}
}
}`, {
input: {
projectId,
contentId
}
});
core.setOutput('itemId', addResp.addProjectV2ItemById.item.id);
}
else {
core.info('Creating draft issue in project');
const addResp = yield octokit.graphql(`mutation addDraftIssueToProject($projectId: ID!, $title: String!) {
addProjectV2DraftIssue(input: {
projectId: $projectId,
title: $title
}) {
projectItem {
id
}
}
}`, {
projectId,
title: issue === null || issue === void 0 ? void 0 : issue.html_url
});
core.setOutput('itemId', addResp.addProjectV2DraftIssue.projectItem.id);
} }
}
}`, {
input: {
contentId,
projectId
}
});
core.setOutput('itemId', addResp.addProjectNextItem.projectNextItem.id);
}); });
} }
exports.addToProject = addToProject; exports.addToProject = addToProject;

2
dist/index.js.map generated vendored

File diff suppressed because one or more lines are too long

166
package-lock.json generated
View File

@@ -15,14 +15,14 @@
"devDependencies": { "devDependencies": {
"@github/prettier-config": "^0.0.4", "@github/prettier-config": "^0.0.4",
"@types/jest": "^27.5.0", "@types/jest": "^27.5.0",
"@types/node": "~16.11.41", "@types/node": "~16.11.45",
"@typescript-eslint/parser": "^5.29.0", "@typescript-eslint/parser": "^5.30.7",
"@vercel/ncc": "^0.34.0", "@vercel/ncc": "^0.34.0",
"concurrently": "^7.2.2", "concurrently": "^7.3.0",
"eslint": "^8.18.0", "eslint": "^8.20.0",
"eslint-plugin-github": "^4.3.6", "eslint-plugin-github": "^4.3.6",
"eslint-plugin-jest": "^26.5.3", "eslint-plugin-jest": "^26.6.0",
"eslint-plugin-prettier": "^4.0.0", "eslint-plugin-prettier": "^4.2.1",
"jest": "^27.5.1", "jest": "^27.5.1",
"prettier": "2.7.1", "prettier": "2.7.1",
"ts-jest": "^27.1.4", "ts-jest": "^27.1.4",
@@ -1367,9 +1367,9 @@
"dev": true "dev": true
}, },
"node_modules/@types/node": { "node_modules/@types/node": {
"version": "16.11.41", "version": "16.11.45",
"resolved": "https://registry.npmjs.org/@types/node/-/node-16.11.41.tgz", "resolved": "https://registry.npmjs.org/@types/node/-/node-16.11.45.tgz",
"integrity": "sha512-mqoYK2TnVjdkGk8qXAVGc/x9nSaTpSrFaGFm43BUH3IdoBV0nta6hYaGmdOvIMlbHJbUEVen3gvwpwovAZKNdQ==", "integrity": "sha512-3rKg/L5x0rofKuuUt5zlXzOnKyIHXmIu5R8A0TuNDMF2062/AOIDBciFIjToLEJ/9F9DzkHNot+BpNsMI1OLdQ==",
"dev": true "dev": true
}, },
"node_modules/@types/prettier": { "node_modules/@types/prettier": {
@@ -1448,14 +1448,14 @@
} }
}, },
"node_modules/@typescript-eslint/parser": { "node_modules/@typescript-eslint/parser": {
"version": "5.29.0", "version": "5.30.7",
"resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-5.29.0.tgz", "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-5.30.7.tgz",
"integrity": "sha512-ruKWTv+x0OOxbzIw9nW5oWlUopvP/IQDjB5ZqmTglLIoDTctLlAJpAQFpNPJP/ZI7hTT9sARBosEfaKbcFuECw==", "integrity": "sha512-Rg5xwznHWWSy7v2o0cdho6n+xLhK2gntImp0rJroVVFkcYFYQ8C8UJTSuTw/3CnExBmPjycjmUJkxVmjXsld6A==",
"dev": true, "dev": true,
"dependencies": { "dependencies": {
"@typescript-eslint/scope-manager": "5.29.0", "@typescript-eslint/scope-manager": "5.30.7",
"@typescript-eslint/types": "5.29.0", "@typescript-eslint/types": "5.30.7",
"@typescript-eslint/typescript-estree": "5.29.0", "@typescript-eslint/typescript-estree": "5.30.7",
"debug": "^4.3.4" "debug": "^4.3.4"
}, },
"engines": { "engines": {
@@ -1475,13 +1475,13 @@
} }
}, },
"node_modules/@typescript-eslint/parser/node_modules/@typescript-eslint/scope-manager": { "node_modules/@typescript-eslint/parser/node_modules/@typescript-eslint/scope-manager": {
"version": "5.29.0", "version": "5.30.7",
"resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-5.29.0.tgz", "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-5.30.7.tgz",
"integrity": "sha512-etbXUT0FygFi2ihcxDZjz21LtC+Eps9V2xVx09zFoN44RRHPrkMflidGMI+2dUs821zR1tDS6Oc9IXxIjOUZwA==", "integrity": "sha512-7BM1bwvdF1UUvt+b9smhqdc/eniOnCKxQT/kj3oXtj3LqnTWCAM0qHRHfyzCzhEfWX0zrW7KqXXeE4DlchZBKw==",
"dev": true, "dev": true,
"dependencies": { "dependencies": {
"@typescript-eslint/types": "5.29.0", "@typescript-eslint/types": "5.30.7",
"@typescript-eslint/visitor-keys": "5.29.0" "@typescript-eslint/visitor-keys": "5.30.7"
}, },
"engines": { "engines": {
"node": "^12.22.0 || ^14.17.0 || >=16.0.0" "node": "^12.22.0 || ^14.17.0 || >=16.0.0"
@@ -1492,9 +1492,9 @@
} }
}, },
"node_modules/@typescript-eslint/parser/node_modules/@typescript-eslint/types": { "node_modules/@typescript-eslint/parser/node_modules/@typescript-eslint/types": {
"version": "5.29.0", "version": "5.30.7",
"resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-5.29.0.tgz", "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-5.30.7.tgz",
"integrity": "sha512-X99VbqvAXOMdVyfFmksMy3u8p8yoRGITgU1joBJPzeYa0rhdf5ok9S56/itRoUSh99fiDoMtarSIJXo7H/SnOg==", "integrity": "sha512-ocVkETUs82+U+HowkovV6uxf1AnVRKCmDRNUBUUo46/5SQv1owC/EBFkiu4MOHeZqhKz2ktZ3kvJJ1uFqQ8QPg==",
"dev": true, "dev": true,
"engines": { "engines": {
"node": "^12.22.0 || ^14.17.0 || >=16.0.0" "node": "^12.22.0 || ^14.17.0 || >=16.0.0"
@@ -1505,13 +1505,13 @@
} }
}, },
"node_modules/@typescript-eslint/parser/node_modules/@typescript-eslint/typescript-estree": { "node_modules/@typescript-eslint/parser/node_modules/@typescript-eslint/typescript-estree": {
"version": "5.29.0", "version": "5.30.7",
"resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-5.29.0.tgz", "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-5.30.7.tgz",
"integrity": "sha512-mQvSUJ/JjGBdvo+1LwC+GY2XmSYjK1nAaVw2emp/E61wEVYEyibRHCqm1I1vEKbXCpUKuW4G7u9ZCaZhJbLoNQ==", "integrity": "sha512-tNslqXI1ZdmXXrHER83TJ8OTYl4epUzJC0aj2i4DMDT4iU+UqLT3EJeGQvJ17BMbm31x5scSwo3hPM0nqQ1AEA==",
"dev": true, "dev": true,
"dependencies": { "dependencies": {
"@typescript-eslint/types": "5.29.0", "@typescript-eslint/types": "5.30.7",
"@typescript-eslint/visitor-keys": "5.29.0", "@typescript-eslint/visitor-keys": "5.30.7",
"debug": "^4.3.4", "debug": "^4.3.4",
"globby": "^11.1.0", "globby": "^11.1.0",
"is-glob": "^4.0.3", "is-glob": "^4.0.3",
@@ -1532,12 +1532,12 @@
} }
}, },
"node_modules/@typescript-eslint/parser/node_modules/@typescript-eslint/visitor-keys": { "node_modules/@typescript-eslint/parser/node_modules/@typescript-eslint/visitor-keys": {
"version": "5.29.0", "version": "5.30.7",
"resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-5.29.0.tgz", "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-5.30.7.tgz",
"integrity": "sha512-Hpb/mCWsjILvikMQoZIE3voc9wtQcS0A9FUw3h8bhr9UxBdtI/tw1ZDZUOXHXLOVMedKCH5NxyzATwnU78bWCQ==", "integrity": "sha512-KrRXf8nnjvcpxDFOKej4xkD7657+PClJs5cJVSG7NNoCNnjEdc46juNAQt7AyuWctuCgs6mVRc1xGctEqrjxWw==",
"dev": true, "dev": true,
"dependencies": { "dependencies": {
"@typescript-eslint/types": "5.29.0", "@typescript-eslint/types": "5.30.7",
"eslint-visitor-keys": "^3.3.0" "eslint-visitor-keys": "^3.3.0"
}, },
"engines": { "engines": {
@@ -2263,9 +2263,9 @@
"dev": true "dev": true
}, },
"node_modules/concurrently": { "node_modules/concurrently": {
"version": "7.2.2", "version": "7.3.0",
"resolved": "https://registry.npmjs.org/concurrently/-/concurrently-7.2.2.tgz", "resolved": "https://registry.npmjs.org/concurrently/-/concurrently-7.3.0.tgz",
"integrity": "sha512-DcQkI0ruil5BA/g7Xy3EWySGrFJovF5RYAYxwGvv9Jf9q9B1v3jPFP2tl6axExNf1qgF30kjoNYrangZ0ey4Aw==", "integrity": "sha512-IiDwm+8DOcFEInca494A8V402tNTQlJaYq78RF2rijOrKEk/AOHTxhN4U1cp7GYKYX5Q6Ymh1dLTBlzIMN0ikA==",
"dev": true, "dev": true,
"dependencies": { "dependencies": {
"chalk": "^4.1.0", "chalk": "^4.1.0",
@@ -2659,9 +2659,9 @@
} }
}, },
"node_modules/eslint": { "node_modules/eslint": {
"version": "8.18.0", "version": "8.20.0",
"resolved": "https://registry.npmjs.org/eslint/-/eslint-8.18.0.tgz", "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.20.0.tgz",
"integrity": "sha512-As1EfFMVk7Xc6/CvhssHUjsAQSkpfXvUGMFC3ce8JDe6WvqCgRrLOBQbVpsBFr1X1V+RACOadnzVvcUS5ni2bA==", "integrity": "sha512-d4ixhz5SKCa1D6SCPrivP7yYVi7nyD6A4vs6HIAul9ujBzcEmZVM3/0NN/yu5nKhmO1wjp5xQ46iRfmDGlOviA==",
"dev": true, "dev": true,
"dependencies": { "dependencies": {
"@eslint/eslintrc": "^1.3.0", "@eslint/eslintrc": "^1.3.0",
@@ -2901,9 +2901,9 @@
"dev": true "dev": true
}, },
"node_modules/eslint-plugin-jest": { "node_modules/eslint-plugin-jest": {
"version": "26.5.3", "version": "26.6.0",
"resolved": "https://registry.npmjs.org/eslint-plugin-jest/-/eslint-plugin-jest-26.5.3.tgz", "resolved": "https://registry.npmjs.org/eslint-plugin-jest/-/eslint-plugin-jest-26.6.0.tgz",
"integrity": "sha512-sICclUqJQnR1bFRZGLN2jnSVsYOsmPYYnroGCIMVSvTS3y8XR3yjzy1EcTQmk6typ5pRgyIWzbjqxK6cZHEZuQ==", "integrity": "sha512-f8n46/97ZFdU4KqeQYqO8AEVGIhHWvkpgNBWHH3jrM28/y8llnbf3IjfIKv6p2pZIMinK1PCqbbROxs9Eud02Q==",
"dev": true, "dev": true,
"dependencies": { "dependencies": {
"@typescript-eslint/utils": "^5.10.0" "@typescript-eslint/utils": "^5.10.0"
@@ -2934,15 +2934,15 @@
} }
}, },
"node_modules/eslint-plugin-prettier": { "node_modules/eslint-plugin-prettier": {
"version": "4.0.0", "version": "4.2.1",
"resolved": "https://registry.npmjs.org/eslint-plugin-prettier/-/eslint-plugin-prettier-4.0.0.tgz", "resolved": "https://registry.npmjs.org/eslint-plugin-prettier/-/eslint-plugin-prettier-4.2.1.tgz",
"integrity": "sha512-98MqmCJ7vJodoQK359bqQWaxOE0CS8paAz/GgjaZLyex4TTk3g9HugoO89EqWCrFiOqn9EVvcoo7gZzONCWVwQ==", "integrity": "sha512-f/0rXLXUt0oFYs8ra4w49wYZBG5GKZpAYsJSm6rnYL5uVDjd+zowwMwVZHnAjf4edNrKpCDYfXDgmRE/Ak7QyQ==",
"dev": true, "dev": true,
"dependencies": { "dependencies": {
"prettier-linter-helpers": "^1.0.0" "prettier-linter-helpers": "^1.0.0"
}, },
"engines": { "engines": {
"node": ">=6.0.0" "node": ">=12.0.0"
}, },
"peerDependencies": { "peerDependencies": {
"eslint": ">=7.28.0", "eslint": ">=7.28.0",
@@ -7577,9 +7577,9 @@
"dev": true "dev": true
}, },
"@types/node": { "@types/node": {
"version": "16.11.41", "version": "16.11.45",
"resolved": "https://registry.npmjs.org/@types/node/-/node-16.11.41.tgz", "resolved": "https://registry.npmjs.org/@types/node/-/node-16.11.45.tgz",
"integrity": "sha512-mqoYK2TnVjdkGk8qXAVGc/x9nSaTpSrFaGFm43BUH3IdoBV0nta6hYaGmdOvIMlbHJbUEVen3gvwpwovAZKNdQ==", "integrity": "sha512-3rKg/L5x0rofKuuUt5zlXzOnKyIHXmIu5R8A0TuNDMF2062/AOIDBciFIjToLEJ/9F9DzkHNot+BpNsMI1OLdQ==",
"dev": true "dev": true
}, },
"@types/prettier": { "@types/prettier": {
@@ -7638,41 +7638,41 @@
} }
}, },
"@typescript-eslint/parser": { "@typescript-eslint/parser": {
"version": "5.29.0", "version": "5.30.7",
"resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-5.29.0.tgz", "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-5.30.7.tgz",
"integrity": "sha512-ruKWTv+x0OOxbzIw9nW5oWlUopvP/IQDjB5ZqmTglLIoDTctLlAJpAQFpNPJP/ZI7hTT9sARBosEfaKbcFuECw==", "integrity": "sha512-Rg5xwznHWWSy7v2o0cdho6n+xLhK2gntImp0rJroVVFkcYFYQ8C8UJTSuTw/3CnExBmPjycjmUJkxVmjXsld6A==",
"dev": true, "dev": true,
"requires": { "requires": {
"@typescript-eslint/scope-manager": "5.29.0", "@typescript-eslint/scope-manager": "5.30.7",
"@typescript-eslint/types": "5.29.0", "@typescript-eslint/types": "5.30.7",
"@typescript-eslint/typescript-estree": "5.29.0", "@typescript-eslint/typescript-estree": "5.30.7",
"debug": "^4.3.4" "debug": "^4.3.4"
}, },
"dependencies": { "dependencies": {
"@typescript-eslint/scope-manager": { "@typescript-eslint/scope-manager": {
"version": "5.29.0", "version": "5.30.7",
"resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-5.29.0.tgz", "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-5.30.7.tgz",
"integrity": "sha512-etbXUT0FygFi2ihcxDZjz21LtC+Eps9V2xVx09zFoN44RRHPrkMflidGMI+2dUs821zR1tDS6Oc9IXxIjOUZwA==", "integrity": "sha512-7BM1bwvdF1UUvt+b9smhqdc/eniOnCKxQT/kj3oXtj3LqnTWCAM0qHRHfyzCzhEfWX0zrW7KqXXeE4DlchZBKw==",
"dev": true, "dev": true,
"requires": { "requires": {
"@typescript-eslint/types": "5.29.0", "@typescript-eslint/types": "5.30.7",
"@typescript-eslint/visitor-keys": "5.29.0" "@typescript-eslint/visitor-keys": "5.30.7"
} }
}, },
"@typescript-eslint/types": { "@typescript-eslint/types": {
"version": "5.29.0", "version": "5.30.7",
"resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-5.29.0.tgz", "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-5.30.7.tgz",
"integrity": "sha512-X99VbqvAXOMdVyfFmksMy3u8p8yoRGITgU1joBJPzeYa0rhdf5ok9S56/itRoUSh99fiDoMtarSIJXo7H/SnOg==", "integrity": "sha512-ocVkETUs82+U+HowkovV6uxf1AnVRKCmDRNUBUUo46/5SQv1owC/EBFkiu4MOHeZqhKz2ktZ3kvJJ1uFqQ8QPg==",
"dev": true "dev": true
}, },
"@typescript-eslint/typescript-estree": { "@typescript-eslint/typescript-estree": {
"version": "5.29.0", "version": "5.30.7",
"resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-5.29.0.tgz", "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-5.30.7.tgz",
"integrity": "sha512-mQvSUJ/JjGBdvo+1LwC+GY2XmSYjK1nAaVw2emp/E61wEVYEyibRHCqm1I1vEKbXCpUKuW4G7u9ZCaZhJbLoNQ==", "integrity": "sha512-tNslqXI1ZdmXXrHER83TJ8OTYl4epUzJC0aj2i4DMDT4iU+UqLT3EJeGQvJ17BMbm31x5scSwo3hPM0nqQ1AEA==",
"dev": true, "dev": true,
"requires": { "requires": {
"@typescript-eslint/types": "5.29.0", "@typescript-eslint/types": "5.30.7",
"@typescript-eslint/visitor-keys": "5.29.0", "@typescript-eslint/visitor-keys": "5.30.7",
"debug": "^4.3.4", "debug": "^4.3.4",
"globby": "^11.1.0", "globby": "^11.1.0",
"is-glob": "^4.0.3", "is-glob": "^4.0.3",
@@ -7681,12 +7681,12 @@
} }
}, },
"@typescript-eslint/visitor-keys": { "@typescript-eslint/visitor-keys": {
"version": "5.29.0", "version": "5.30.7",
"resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-5.29.0.tgz", "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-5.30.7.tgz",
"integrity": "sha512-Hpb/mCWsjILvikMQoZIE3voc9wtQcS0A9FUw3h8bhr9UxBdtI/tw1ZDZUOXHXLOVMedKCH5NxyzATwnU78bWCQ==", "integrity": "sha512-KrRXf8nnjvcpxDFOKej4xkD7657+PClJs5cJVSG7NNoCNnjEdc46juNAQt7AyuWctuCgs6mVRc1xGctEqrjxWw==",
"dev": true, "dev": true,
"requires": { "requires": {
"@typescript-eslint/types": "5.29.0", "@typescript-eslint/types": "5.30.7",
"eslint-visitor-keys": "^3.3.0" "eslint-visitor-keys": "^3.3.0"
} }
}, },
@@ -8204,9 +8204,9 @@
"dev": true "dev": true
}, },
"concurrently": { "concurrently": {
"version": "7.2.2", "version": "7.3.0",
"resolved": "https://registry.npmjs.org/concurrently/-/concurrently-7.2.2.tgz", "resolved": "https://registry.npmjs.org/concurrently/-/concurrently-7.3.0.tgz",
"integrity": "sha512-DcQkI0ruil5BA/g7Xy3EWySGrFJovF5RYAYxwGvv9Jf9q9B1v3jPFP2tl6axExNf1qgF30kjoNYrangZ0ey4Aw==", "integrity": "sha512-IiDwm+8DOcFEInca494A8V402tNTQlJaYq78RF2rijOrKEk/AOHTxhN4U1cp7GYKYX5Q6Ymh1dLTBlzIMN0ikA==",
"dev": true, "dev": true,
"requires": { "requires": {
"chalk": "^4.1.0", "chalk": "^4.1.0",
@@ -8504,9 +8504,9 @@
} }
}, },
"eslint": { "eslint": {
"version": "8.18.0", "version": "8.20.0",
"resolved": "https://registry.npmjs.org/eslint/-/eslint-8.18.0.tgz", "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.20.0.tgz",
"integrity": "sha512-As1EfFMVk7Xc6/CvhssHUjsAQSkpfXvUGMFC3ce8JDe6WvqCgRrLOBQbVpsBFr1X1V+RACOadnzVvcUS5ni2bA==", "integrity": "sha512-d4ixhz5SKCa1D6SCPrivP7yYVi7nyD6A4vs6HIAul9ujBzcEmZVM3/0NN/yu5nKhmO1wjp5xQ46iRfmDGlOviA==",
"dev": true, "dev": true,
"requires": { "requires": {
"@eslint/eslintrc": "^1.3.0", "@eslint/eslintrc": "^1.3.0",
@@ -8759,9 +8759,9 @@
} }
}, },
"eslint-plugin-jest": { "eslint-plugin-jest": {
"version": "26.5.3", "version": "26.6.0",
"resolved": "https://registry.npmjs.org/eslint-plugin-jest/-/eslint-plugin-jest-26.5.3.tgz", "resolved": "https://registry.npmjs.org/eslint-plugin-jest/-/eslint-plugin-jest-26.6.0.tgz",
"integrity": "sha512-sICclUqJQnR1bFRZGLN2jnSVsYOsmPYYnroGCIMVSvTS3y8XR3yjzy1EcTQmk6typ5pRgyIWzbjqxK6cZHEZuQ==", "integrity": "sha512-f8n46/97ZFdU4KqeQYqO8AEVGIhHWvkpgNBWHH3jrM28/y8llnbf3IjfIKv6p2pZIMinK1PCqbbROxs9Eud02Q==",
"dev": true, "dev": true,
"requires": { "requires": {
"@typescript-eslint/utils": "^5.10.0" "@typescript-eslint/utils": "^5.10.0"
@@ -8774,9 +8774,9 @@
"dev": true "dev": true
}, },
"eslint-plugin-prettier": { "eslint-plugin-prettier": {
"version": "4.0.0", "version": "4.2.1",
"resolved": "https://registry.npmjs.org/eslint-plugin-prettier/-/eslint-plugin-prettier-4.0.0.tgz", "resolved": "https://registry.npmjs.org/eslint-plugin-prettier/-/eslint-plugin-prettier-4.2.1.tgz",
"integrity": "sha512-98MqmCJ7vJodoQK359bqQWaxOE0CS8paAz/GgjaZLyex4TTk3g9HugoO89EqWCrFiOqn9EVvcoo7gZzONCWVwQ==", "integrity": "sha512-f/0rXLXUt0oFYs8ra4w49wYZBG5GKZpAYsJSm6rnYL5uVDjd+zowwMwVZHnAjf4edNrKpCDYfXDgmRE/Ak7QyQ==",
"dev": true, "dev": true,
"requires": { "requires": {
"prettier-linter-helpers": "^1.0.0" "prettier-linter-helpers": "^1.0.0"

View File

@@ -1,6 +1,6 @@
{ {
"name": "@actions/add-to-project", "name": "@actions/add-to-project",
"description": "Automatically issues and PRs to GitHub projects", "description": "Automatically adds issues and PRs to GitHub projects",
"version": "0.0.0", "version": "0.0.0",
"author": "GitHub and contributors", "author": "GitHub and contributors",
"dependencies": { "dependencies": {
@@ -14,14 +14,14 @@
"devDependencies": { "devDependencies": {
"@github/prettier-config": "^0.0.4", "@github/prettier-config": "^0.0.4",
"@types/jest": "^27.5.0", "@types/jest": "^27.5.0",
"@types/node": "~16.11.41", "@types/node": "~16.11.45",
"@typescript-eslint/parser": "^5.29.0", "@typescript-eslint/parser": "^5.30.7",
"@vercel/ncc": "^0.34.0", "@vercel/ncc": "^0.34.0",
"concurrently": "^7.2.2", "concurrently": "^7.3.0",
"eslint": "^8.18.0", "eslint": "^8.20.0",
"eslint-plugin-github": "^4.3.6", "eslint-plugin-github": "^4.3.6",
"eslint-plugin-jest": "^26.5.3", "eslint-plugin-jest": "^26.6.0",
"eslint-plugin-prettier": "^4.0.0", "eslint-plugin-prettier": "^4.2.1",
"jest": "^27.5.1", "jest": "^27.5.1",
"prettier": "2.7.1", "prettier": "2.7.1",
"ts-jest": "^27.1.4", "ts-jest": "^27.1.4",

View File

@@ -8,21 +8,29 @@ const urlParse =
interface ProjectNodeIDResponse { interface ProjectNodeIDResponse {
organization?: { organization?: {
projectNext: { projectV2: {
id: string id: string
} }
} }
user?: { user?: {
projectNext: { projectV2: {
id: string id: string
} }
} }
} }
interface ProjectAddItemResponse { interface ProjectAddItemResponse {
addProjectNextItem: { addProjectV2ItemById: {
projectNextItem: { item: {
id: string
}
}
}
interface ProjectV2AddDraftIssueResponse {
addProjectV2DraftIssue: {
projectItem: {
id: string id: string
} }
} }
@@ -40,9 +48,12 @@ export async function addToProject(): Promise<void> {
const labelOperator = core.getInput('label-operator').trim().toLocaleLowerCase() const labelOperator = core.getInput('label-operator').trim().toLocaleLowerCase()
const octokit = github.getOctokit(ghToken) const octokit = github.getOctokit(ghToken)
const urlMatch = projectUrl.match(urlParse)
const issue = github.context.payload.issue ?? github.context.payload.pull_request const issue = github.context.payload.issue ?? github.context.payload.pull_request
const issueLabels: string[] = (issue?.labels ?? []).map((l: {name: string}) => l.name.toLowerCase()) const issueLabels: string[] = (issue?.labels ?? []).map((l: {name: string}) => l.name.toLowerCase())
const issueOwnerName = github.context.payload.repository?.owner.login
core.debug(`Issue/PR owner: ${issueOwnerName}`)
// Ensure the issue matches our `labeled` filter based on the label-operator. // Ensure the issue matches our `labeled` filter based on the label-operator.
if (labelOperator === 'and') { if (labelOperator === 'and') {
@@ -64,60 +75,89 @@ export async function addToProject(): Promise<void> {
core.debug(`Project URL: ${projectUrl}`) core.debug(`Project URL: ${projectUrl}`)
const urlMatch = projectUrl.match(urlParse)
if (!urlMatch) { if (!urlMatch) {
throw new Error( throw new Error(
`Invalid project URL: ${projectUrl}. Project URL should match the format https://github.com/<orgs-or-users>/<ownerName>/projects/<projectNumber>` `Invalid project URL: ${projectUrl}. Project URL should match the format https://github.com/<orgs-or-users>/<ownerName>/projects/<projectNumber>`
) )
} }
const ownerName = urlMatch.groups?.ownerName const projectOwnerName = urlMatch.groups?.ownerName
const projectNumber = parseInt(urlMatch.groups?.projectNumber ?? '', 10) const projectNumber = parseInt(urlMatch.groups?.projectNumber ?? '', 10)
const ownerType = urlMatch.groups?.ownerType const ownerType = urlMatch.groups?.ownerType
const ownerTypeQuery = mustGetOwnerTypeQuery(ownerType) const ownerTypeQuery = mustGetOwnerTypeQuery(ownerType)
core.debug(`Org name: ${ownerName}`) core.debug(`Project owner: ${projectOwnerName}`)
core.debug(`Project number: ${projectNumber}`) core.debug(`Project number: ${projectNumber}`)
core.debug(`Owner type: ${ownerType}`) core.debug(`Project owner type: ${ownerType}`)
// First, use the GraphQL API to request the project's node ID. // First, use the GraphQL API to request the project's node ID.
const idResp = await octokit.graphql<ProjectNodeIDResponse>( const idResp = await octokit.graphql<ProjectNodeIDResponse>(
`query getProject($ownerName: String!, $projectNumber: Int!) { `query getProject($projectOwnerName: String!, $projectNumber: Int!) {
${ownerTypeQuery}(login: $ownerName) { ${ownerTypeQuery}(login: $projectOwnerName) {
projectNext(number: $projectNumber) { projectV2(number: $projectNumber) {
id id
} }
} }
}`, }`,
{ {
ownerName, projectOwnerName,
projectNumber projectNumber
} }
) )
const projectId = idResp[ownerTypeQuery]?.projectNext.id const projectId = idResp[ownerTypeQuery]?.projectV2.id
const contentId = issue?.node_id const contentId = issue?.node_id
core.debug(`Project node ID: ${projectId}`) core.debug(`Project node ID: ${projectId}`)
core.debug(`Content ID: ${contentId}`) core.debug(`Content ID: ${contentId}`)
// Next, use the GraphQL API to add the issue to the project. // Next, use the GraphQL API to add the issue to the project.
const addResp = await octokit.graphql<ProjectAddItemResponse>( // If the issue has the same owner as the project, we can directly
`mutation addIssueToProject($input: AddProjectNextItemInput!) { // add a project item. Otherwise, we add a draft issue.
addProjectNextItem(input: $input) { if (issueOwnerName === projectOwnerName) {
projectNextItem { core.info('Creating project item')
id
const addResp = await octokit.graphql<ProjectAddItemResponse>(
`mutation addIssueToProject($input: AddProjectV2ItemByIdInput!) {
addProjectV2ItemById(input: $input) {
item {
id
}
}
}`,
{
input: {
projectId,
contentId
} }
} }
}`, )
{
input: {
contentId,
projectId
}
}
)
core.setOutput('itemId', addResp.addProjectNextItem.projectNextItem.id) core.setOutput('itemId', addResp.addProjectV2ItemById.item.id)
} else {
core.info('Creating draft issue in project')
const addResp = await octokit.graphql<ProjectV2AddDraftIssueResponse>(
`mutation addDraftIssueToProject($projectId: ID!, $title: String!) {
addProjectV2DraftIssue(input: {
projectId: $projectId,
title: $title
}) {
projectItem {
id
}
}
}`,
{
projectId,
title: issue?.html_url
}
)
core.setOutput('itemId', addResp.addProjectV2DraftIssue.projectItem.id)
}
} }
export function mustGetOwnerTypeQuery(ownerType?: string): 'organization' | 'user' { export function mustGetOwnerTypeQuery(ownerType?: string): 'organization' | 'user' {