Merge pull request #1243 from mikepenz/develop

dev -> main
This commit is contained in:
Mike Penz
2023-09-01 12:33:24 +02:00
committed by GitHub
28 changed files with 310 additions and 2974 deletions
-7
View File
@@ -1,10 +1,3 @@
#!/bin/bash #!/bin/bash
npm install npm install
# also install dependencies for `pr-collector`
cd pr-collector
npm install
npm run build && npm run package
cd ..
+12 -1
View File
@@ -6,4 +6,15 @@ updates:
directory: '/' directory: '/'
# Check the npm registry for updates every day (weekdays) # Check the npm registry for updates every day (weekdays)
schedule: schedule:
interval: 'daily' interval: 'weekly'
groups:
dev-dependencies:
patterns:
- "@types/*"
- "eslint*"
- "jest*"
- "@typescript-eslint/*"
- "js-yaml"
- "prettier"
- "ts-jest"
- "typescript"
-7
View File
@@ -32,13 +32,6 @@ jobs:
with: with:
node-version: 16.x node-version: 16.x
- name: Build PR-Collector
run: |
cd pr-collector
npm ci
npm run build
npm run package
- name: Build Action - name: Build Action
run: | run: |
npm ci npm ci
-8
View File
@@ -24,18 +24,10 @@ jobs:
- name: Install NPM - name: Install NPM
run: | run: |
cd pr-collector
npm install
cd ..
npm install npm install
- name: Run NPM - name: Run NPM
run: | run: |
cd pr-collector
npm run all
cd ..
npm run all npm run all
env: env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
+86 -62
View File
@@ -239,8 +239,8 @@ This configuration is a `JSON` in the following format. (The below showcases *ex
"order": "ASC", "order": "ASC",
"on_property": "mergedAt" "on_property": "mergedAt"
}, },
"template": "${{CHANGELOG}}\n\n<details>\n<summary>Uncategorized</summary>\n\n${{UNCATEGORIZED}}\n</details>", "template": "#{{CHANGELOG}}\n\n<details>\n<summary>Uncategorized</summary>\n\n#{{UNCATEGORIZED}}\n</details>",
"pr_template": "- ${{TITLE}}\n - PR: #${{NUMBER}}", "pr_template": "- #{{TITLE}}\n - PR: ##{{NUMBER}}",
"empty_template": "- no changes", "empty_template": "- no changes",
"label_extractor": [ "label_extractor": [
{ {
@@ -350,21 +350,22 @@ Table of supported placeholders allowed to be used in the `pr_template` configur
| **Placeholder** | **Description** | | **Placeholder** | **Description** |
|-------------------|----------------------------------------------------------------------------------------------------| |-------------------|----------------------------------------------------------------------------------------------------|
| `${{NUMBER}}` | The number referencing this pull request. E.g. 13. | | `#{{NUMBER}}` | The number referencing this pull request. E.g. 13. |
| `${{TITLE}}` | Specified title of the merged pull request. | | `#{{TITLE}}` | Specified title of the merged pull request. |
| `${{URL}}` | Url linking to the pull request on GitHub. | | `#{{URL}}` | Url linking to the pull request on GitHub. |
| `${{STATUS}}` | Status of the PR. Usually always `merged`. Possibly `Open` if `includeOpen` is configured. | | `#{{STATUS}}` | Status of the PR. Usually always `merged`. Possibly `Open` if `includeOpen` is configured. |
| `${{CREATED_AT}}` | The ISO time, the pull request was created at. | | `#{{CREATED_AT}}` | The ISO time, the pull request was created at. |
| `${{MERGED_AT}}` | The ISO time, the pull request was merged at. | | `#{{MERGED_AT}}` | The ISO time, the pull request was merged at. |
| `${{MERGE_SHA}}` | The commit SHA, the pull request was merged with. | | `#{{MERGE_SHA}}` | The commit SHA, the pull request was merged with. |
| `${{AUTHOR}}` | Author creating and opening the pull request. | | `#{{AUTHOR}}` | Author creating and opening the pull request. |
| `${{LABELS}}` | The labels associated with this pull request, joined by `,`. | | `#{{LABELS}}` | The labels associated with this pull request, joined by `,`. |
| `${{MILESTONE}}` | Milestone this PR was part of, as assigned on GitHub. | | `#{{MILESTONE}}` | Milestone this PR was part of, as assigned on GitHub. |
| `${{BODY}}` | Description/Body of the pull request as specified on GitHub. | | `#{{BODY}}` | Description/Body of the pull request as specified on GitHub. |
| `${{ASSIGNEES}}` | Login names of assigned GitHub users, joined by `,`. | | `#{{ASSIGNEES}}` | Login names of assigned GitHub users, joined by `,`. |
| `${{REVIEWERS}}` | GitHub Login names of specified reviewers, joined by `,`. Requires `fetchReviewers` to be enabled. | | `#{{REVIEWERS}}` | GitHub Login names of specified reviewers, joined by `,`. Requires `fetchReviewers` to be enabled. |
| `${{APPROVERS}}` | GitHub Login names of users who approved the PR, joined by `,`. | | `#{{APPROVERS}}` | GitHub Login names of users who approved the PR, joined by `,`. |
> **Note**: `v4` updates the default placeholders format to `#{{}}`. The old format `${{}}` will be supported until v5 for backwards compatiblity.
<details><summary><b>Array Placeholders</b></summary> <details><summary><b>Array Placeholders</b></summary>
<p> <p>
@@ -376,9 +377,9 @@ When using `*` values are joined by `,`.
| **Placeholder** | **Description** | | **Placeholder** | **Description** |
|---------------------|-------------------------------------------------------------------------------------| |---------------------|-------------------------------------------------------------------------------------|
| `${{ASSIGNEES[*]}}` | Login names of assigned GitHub users. | | `#{{ASSIGNEES[*]}}` | Login names of assigned GitHub users. |
| `${{REVIEWERS[*]}}` | GitHub Login names of specified reviewers. Requires `fetchReviewers` to be enabled. | | `#{{REVIEWERS[*]}}` | GitHub Login names of specified reviewers. Requires `fetchReviewers` to be enabled. |
| `${{APPROVERS[*]}}` | GitHub Login names of users who approved the PR. | | `#{{APPROVERS[*]}}` | GitHub Login names of users who approved the PR. |
Additionally there are special array placeholders like `REVIEWS` which allows access to it's properties via Additionally there are special array placeholders like `REVIEWS` which allows access to it's properties via
`(KEY)[(*/index)].(property)`. `(KEY)[(*/index)].(property)`.
@@ -387,19 +388,19 @@ For example: `REVIEWS[*].author` or `REVIEWS[*].body`
| **Placeholder** | **Description** | | **Placeholder** | **Description** |
|-------------------------------|--------------------------------------------| |-------------------------------|--------------------------------------------|
| `${{REVIEWS[*].author}}` | GitHub Login names of specified reviewers. | | `#{{REVIEWS[*].author}}` | GitHub Login names of specified reviewers. |
| `${{REVIEWS[*].body}}` | The body of the review. | | `#{{REVIEWS[*].body}}` | The body of the review. |
| `${{REVIEWS[*].htmlURL}}` | The URL to the given review. | | `#{{REVIEWS[*].htmlURL}}` | The URL to the given review. |
| `${{REVIEWS[*].submittedAt}}` | The date whent he review was submitted. | | `#{{REVIEWS[*].submittedAt}}` | The date whent he review was submitted. |
| `${{REVIEWS[*].state}}` | The state of the given review. | | `#{{REVIEWS[*].state}}` | The state of the given review. |
Similar to `REVIEWS`, `REFERENCED` PRs also offer special placeholders. Similar to `REVIEWS`, `REFERENCED` PRs also offer special placeholders.
| **Placeholder** | **Description** | | **Placeholder** | **Description** |
|-------------------------------|---------------------------------------------------------------------------| |-------------------------------|---------------------------------------------------------------------------|
| `${{REFERENCED[*].number}}` | The PR number of the referenced PR. | | `#{{REFERENCED[*].number}}` | The PR number of the referenced PR. |
| `${{REFERENCED[*].title}}` | The title of the referenced PR. | | `#{{REFERENCED[*].title}}` | The title of the referenced PR. |
| `${{REFERENCED[*]."..."}}` | Allows to use most other PR properties as placeholder. | | `#{{REFERENCED[*]."..."}}` | Allows to use most other PR properties as placeholder. |
</p> </p>
</details> </details>
@@ -412,27 +413,27 @@ Table of supported placeholders allowed to be used in the `template` and `empty_
| **Placeholder** | **Description** | **Empty** | | **Placeholder** | **Description** | **Empty** |
|----------------------------|----------------------------------------------------------------------------------------------------|:---------:| |----------------------------|----------------------------------------------------------------------------------------------------|:---------:|
| `${{CHANGELOG}}` | The contents of the changelog, matching the labels as specified in the categories configuration | | | `#{{CHANGELOG}}` | The contents of the changelog, matching the labels as specified in the categories configuration | |
| `${{UNCATEGORIZED}}` | All pull requests not matching a specified label in categories | | | `#{{UNCATEGORIZED}}` | All pull requests not matching a specified label in categories | |
| `${{OPEN}}` | All open pull requests. Will only be fetched if `includeOpen` is enabled. | | | `#{{OPEN}}` | All open pull requests. Will only be fetched if `includeOpen` is enabled. | |
| `${{IGNORED}}` | All pull requests defining labels matching the `ignore_labels` configuration | | | `#{{IGNORED}}` | All pull requests defining labels matching the `ignore_labels` configuration | |
| `${{OWNER}}` | Describes the owner of the repository the changelog was generated for | x | | `#{{OWNER}}` | Describes the owner of the repository the changelog was generated for | x |
| `${{REPO}}` | The repository name of the repo the changelog was generated for | x | | `#{{REPO}}` | The repository name of the repo the changelog was generated for | x |
| `${{FROM_TAG}}` | Defines the 'start' from where the changelog did consider merged pull requests | x | | `#{{FROM_TAG}}` | Defines the 'start' from where the changelog did consider merged pull requests | x |
| `${{FROM_TAG_DATE}}` | Defines the date at which the 'start' tag was created. Requires `fetchReleaseInformation`. | x | | `#{{FROM_TAG_DATE}}` | Defines the date at which the 'start' tag was created. Requires `fetchReleaseInformation`. | x |
| `${{TO_TAG}}` | Defines until which tag the changelog did consider merged pull requests | x | | `#{{TO_TAG}}` | Defines until which tag the changelog did consider merged pull requests | x |
| `${{TO_TAG_DATE}}` | Defines the date at which the 'until' tag was created. Requires `fetchReleaseInformation`. | x | | `#{{TO_TAG_DATE}}` | Defines the date at which the 'until' tag was created. Requires `fetchReleaseInformation`. | x |
| `${{RELEASE_DIFF}}` | Introduces a link to the full diff between from tag and to tag releases | x | | `#{{RELEASE_DIFF}}` | Introduces a link to the full diff between from tag and to tag releases | x |
| `${{CHANGED_FILES}}` | The count of changed files. | | | `#{{CHANGED_FILES}}` | The count of changed files. | |
| `${{ADDITIONS}}` | The count of code additions (lines). | | | `#{{ADDITIONS}}` | The count of code additions (lines). | |
| `${{DELETIONS}}` | The count of code deletions (lines). | | | `#{{DELETIONS}}` | The count of code deletions (lines). | |
| `${{CHANGES}}` | The count of total changes (lines). | | | `#{{CHANGES}}` | The count of total changes (lines). | |
| `${{COMMITS}}` | The count of commits in this release. | | | `#{{COMMITS}}` | The count of commits in this release. | |
| `${{CATEGORIZED_COUNT}}` | The count of PRs which were categorized | | | `#{{CATEGORIZED_COUNT}}` | The count of PRs which were categorized | |
| `${{UNCATEGORIZED_COUNT}}` | The count of PRs and changes which were not categorized. No label overlapping with category labels | | | `#{{UNCATEGORIZED_COUNT}}` | The count of PRs and changes which were not categorized. No label overlapping with category labels | |
| `${{OPEN_COUNT}}` | The count of open PRs. Will only be fetched if `includeOpen` is configured. | | | `#{{OPEN_COUNT}}` | The count of open PRs. Will only be fetched if `includeOpen` is configured. | |
| `${{IGNORED_COUNT}}` | The count of PRs and changes which were specifically ignored from the changelog. | | | `#{{IGNORED_COUNT}}` | The count of PRs and changes which were specifically ignored from the changelog. | |
| `${{DAYS_SINCE}}` | Days between the 2 releases. Requires `fetchReleaseInformation` to be enabled. | x | | `#{{DAYS_SINCE}}` | Days between the 2 releases. Requires `fetchReleaseInformation` to be enabled. | x |
### Configuration Specification ### Configuration Specification
@@ -494,8 +495,8 @@ Custom placeholders can be defined via the `configuration.json` as `custom_place
```json ```json
{ {
"template": "**Epics**\n${{EPIC[*]}}\n\n${{CHANGELOG}}", "template": "**Epics**\n#{{EPIC[*]}}\n\n#{{CHANGELOG}}",
"pr_template": "- ${{TITLE}} - ${{URL}} ${{EPIC}}", "pr_template": "- #{{TITLE}} - #{{URL}} #{{EPIC}}",
"custom_placeholders": [ "custom_placeholders": [
{ {
"name": "EPIC", "name": "EPIC",
@@ -518,7 +519,7 @@ This example will look for JIRA tickets in the EPIC project, and extract all of
| custom_placeholders.source | The source PLACEHOLDER, requires to be one of the existing Template or PR Template placeholders. | | custom_placeholders.source | The source PLACEHOLDER, requires to be one of the existing Template or PR Template placeholders. |
| custom_placeholders.transformer | The transformer specification used to extract the value from the original source PLACEHOLDER. | | custom_placeholders.transformer | The transformer specification used to extract the value from the original source PLACEHOLDER. |
A placeholder with the name as `CUSTOM_PLACEHOLDER` can be used as `${{CUSTOM_PLACEHOLDER}}` in the target template. A placeholder with the name as `CUSTOM_PLACEHOLDER` can be used as `#{{CUSTOM_PLACEHOLDER}}` in the target template.
By default the same restriction applies as for PR vs template placeholder. E.g. a global placeholder can only be used in the global template (and not in the PR template). By default the same restriction applies as for PR vs template placeholder. E.g. a global placeholder can only be used in the global template (and not in the PR template).
Custom placeholders offer one new feature though. PR related placeholders can be used in the global template via the following syntax: Custom placeholders offer one new feature though. PR related placeholders can be used in the global template via the following syntax:
@@ -551,23 +552,29 @@ It's suggested to export the token to your path before running the tests so that
export GITHUB_TOKEN=your_personal_github_pat export GITHUB_TOKEN=your_personal_github_pat
``` ```
## Local Testing 🧪 ## Local Testing 🧪
This GitHub action is fully developed in Typescript and can be run locally via npm. Doing so is a great way to test the action and/or your custom configurations locally, without the need to push and re-run GitHub actions over and over again. This GitHub action is fully developed in Typescript and can be run locally via npm or right from the browser using GitHub Codespace.
To run this action locally, first make sure you provide a `GITHUB_TOKEN` with enough permissions to access the repository. [![Open in GitHub Codespaces](https://github.com/codespaces/badge.svg)](https://codespaces.new/mikepenz/release-changelog-builder-action)
Doing so is a great way to test the action and/or your custom configurations locally, without the need to push and re-run GitHub actions over and over again.
To run locally, or to access private repositories (GitHub Codespaces has automatic access to public repos with the default token), you will require to provide a valid `GITHUB_TOKEN` with read only permissions to access the repositories you want to run this action towards. (See more details in [Token Permission](#Token-Permission))
``` ```
# GitHub token for the action # Export the token in the CLI you use to execute.
export GITHUB_TOKEN=your_read_only_github_token export GITHUB_TOKEN=your_read_only_github_token
``` ```
Afterwards run the testcases with: Afterwards it is possible to run the tests included in the project:
```bash ```bash
npm test -- custom.test.ts npm test -- main.test.ts # modify the file name to run other testcases
``` ```
To test your own configuration, it's adviced to create a new `__tests__/custom.test.ts` file, modify it to your needs (e.g. change repo, change token, change settings, ...), and then run it via `npm test -- custom.test.ts`
<details><summary><b>custom.test.ts</b></summary> <details><summary><b>custom.test.ts</b></summary>
<p> <p>
@@ -606,15 +613,32 @@ it('Test custom changelog builder', async () => {
const changeLog = await releaseNotesBuilder.build() const changeLog = await releaseNotesBuilder.build()
console.log(changeLog) console.log(changeLog)
expect(changeLog).toStrictEqual(`define-expected-output`)
}) })
``` ```
</p> </p>
</details> </details>
Additionally it is possible to do full debugging including the option of breakpoints via (for example) Visual Code. One major benefit of setting up a custom test is that it will allow you to use javascripts full debugging support, including the option of breakpoints via (for example) Visual Code.
Open the project in Visual code -> open the terminal -> use the `+` and start a new `JavaScript Debug Terminal`. Afterwards run the tests as described above.
From GitHub codespaces, open the terminal panel -> Click the small arrow down beside `+` and pick `JavaScript Debug Terminal` (make sure to export the token again). Now execute the test with this terminal. (This is very similar to local Visual Code environments).
## Token Permission
Permissions depend on the specific usecase, however this action only requires `read-only` permissions as it will not make modifications to the repository.
For `Fine-grained personal access tokens` this means:
- `read` for [Pull requests](https://github.com/mikepenz/release-changelog-builder-action/blob/develop/pr-collector/src/pullRequests.ts#L124)
- Covered by the `pull-requests` scope
- `read` for [Commits](https://github.com/mikepenz/release-changelog-builder-action/blob/develop/pr-collector/src/commits.ts#L54)
- Covered by the `contents` scope
- `read` for [Tags](https://github.com/mikepenz/release-changelog-builder-action/blob/develop/pr-collector/src/tags.ts#L32) (if not available the `from` and `to` refs have to be provided)
- Covered by the `contents` scope
- `read` to [list reviews](https://github.com/mikepenz/release-changelog-builder-action/blob/develop/pr-collector/src/pullRequests.ts#L186)
- Covered by the `contents` scope
For Classic tokens you only have to create the token without special permissions.
## Developed By ## Developed By
@@ -637,13 +661,13 @@ Open the project in Visual code -> open the terminal -> use the `+` and start a
## License ## License
Copyright for portions of pr-release-notes are held by Nikolay Blagoev, 2019-2020 as part of project pull-release-notes. Copyright for portions of pr-release-notes are held by Nikolay Blagoev, 2019-2020 as part of project pull-release-notes.
All other copyright for project pr-release-notes are held by Mike Penz, 2021. All other copyright for project pr-release-notes are held by Mike Penz, 2023.
## Fork License ## Fork License
All patches and changes applied to the original source are licensed under the Apache 2.0 license. All patches and changes applied to the original source are licensed under the Apache 2.0 license.
Copyright 2022 Mike Penz Copyright 2023 Mike Penz
Licensed under the Apache License, Version 2.0 (the "License"); Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License. you may not use this file except in compliance with the License.
+1 -1
View File
@@ -14,6 +14,6 @@ it('Configurations are merged correctly', async () => {
console.log(mergedConfiguration) console.log(mergedConfiguration)
expect(JSON.stringify(mergedConfiguration)).toEqual( expect(JSON.stringify(mergedConfiguration)).toEqual(
`{\"max_tags_to_fetch\":200,\"max_pull_requests\":1000,\"max_back_track_time_days\":1000,\"exclude_merge_branches\":[],\"sort\":\"DESC\",\"template\":\"$\{\{CHANGELOG}}\",\"pr_template\":\"- $\{\{TITLE}}\\n - PR: #$\{\{NUMBER}}\",\"empty_template\":\"- no magic changes\",\"categories\":[{\"title\":\"## 🚀 Features\",\"labels\":[\"feature\"]},{\"title\":\"## 🐛 Fixes\",\"labels\":[\"fix\"]},{\"title\":\"## 🧪 Tests\",\"labels\":[\"test\"]}],\"ignore_labels\":[\"ignore\"],\"label_extractor\":[],\"transformers\":[],\"tag_resolver\":{\"method\":\"semver\"},\"base_branches\":[],\"custom_placeholders\":[],\"trim_values\":true}` `{\"max_tags_to_fetch\":200,\"max_pull_requests\":1000,\"max_back_track_time_days\":1000,\"exclude_merge_branches\":[],\"sort\":\"DESC\",\"template\":\"#\{\{CHANGELOG}}\",\"pr_template\":\"- #\{\{TITLE}}\\n - PR: ##\{\{NUMBER}}\",\"empty_template\":\"- no magic changes\",\"categories\":[{\"title\":\"## 🚀 Features\",\"labels\":[\"feature\"]},{\"title\":\"## 🐛 Fixes\",\"labels\":[\"fix\"]},{\"title\":\"## 🧪 Tests\",\"labels\":[\"test\"]}],\"ignore_labels\":[\"ignore\"],\"label_extractor\":[],\"transformers\":[],\"tag_resolver\":{\"method\":\"semver\"},\"base_branches\":[],\"custom_placeholders\":[],\"trim_values\":true}`
) )
}) })
+9 -9
View File
@@ -86,7 +86,7 @@ it('Should use empty placeholder', async () => {
false, // enable commitMode false, // enable commitMode
false, // enable exportCache false, // enable exportCache
false, // enable exportOnly false, // enable exportOnly
"caches/rcba_0.0.2-0.0.3_cache.json", // path to the cache 'caches/rcba_0.0.2-0.0.3_cache.json', // path to the cache
configuration configuration
) )
@@ -115,7 +115,7 @@ it('Should fill empty placeholders', async () => {
false, // enable commitMode false, // enable commitMode
false, // enable exportCache false, // enable exportCache
false, // enable exportOnly false, // enable exportOnly
"caches/rcba_0.0.2-0.0.3_cache.json", // path to the cache 'caches/rcba_0.0.2-0.0.3_cache.json', // path to the cache
configuration configuration
) )
@@ -146,7 +146,7 @@ it('Should fill `template` placeholders', async () => {
false, // enable commitMode false, // enable commitMode
false, // enable exportCache false, // enable exportCache
false, // enable exportOnly false, // enable exportOnly
"caches/rcba_0.0.1-0.0.3_cache.json", // path to the cache 'caches/rcba_0.0.1-0.0.3_cache.json', // path to the cache
configuration configuration
) )
@@ -178,7 +178,7 @@ it('Should fill `template` placeholders, ignore', async () => {
false, // enable commitMode false, // enable commitMode
false, // enable exportCache false, // enable exportCache
false, // enable exportOnly false, // enable exportOnly
"caches/rcba_0.9.1-0.9.5_cache.json", // path to the cache 'caches/rcba_0.9.1-0.9.5_cache.json', // path to the cache
configuration configuration
) )
@@ -209,7 +209,7 @@ it('Uncategorized category', async () => {
false, // enable commitMode false, // enable commitMode
false, // enable exportCache false, // enable exportCache
false, // enable exportOnly false, // enable exportOnly
"caches/rcba_0.9.1-0.9.5_cache.json", // path to the cache 'caches/rcba_0.9.1-0.9.5_cache.json', // path to the cache
configuration configuration
) )
@@ -240,7 +240,7 @@ it('Verify commit based changelog', async () => {
true, // enable commitMode true, // enable commitMode
false, // enable exportCache false, // enable exportCache
false, // enable exportOnly false, // enable exportOnly
"caches/rcba_0.0.1-0.0.3_commit_cache.json", // path to the cache 'caches/rcba_0.0.1-0.0.3_commit_cache.json', // path to the cache
configuration configuration
) )
@@ -271,7 +271,7 @@ it('Verify commit based changelog, with emoji categorisation', async () => {
true, // enable commitMode true, // enable commitMode
false, // enable exportCache false, // enable exportCache
false, // enable exportOnly false, // enable exportOnly
"caches/stackzy_bd3242-17a9e4_cache.json", // path to the cache 'caches/stackzy_bd3242-17a9e4_cache.json', // path to the cache
configuration configuration
) )
@@ -377,7 +377,7 @@ it('Verify reviewers who approved are fetched and also release information', asy
it('Fetch release information', async () => { it('Fetch release information', async () => {
const configuration = mergeConfiguration(undefined, resolveConfiguration('', 'configs_test/configuration_approvers.json')) const configuration = mergeConfiguration(undefined, resolveConfiguration('', 'configs_test/configuration_approvers.json'))
configuration.template = '${{FROM_TAG}}-${{FROM_TAG_DATE}}\n${{TO_TAG}}-${{TO_TAG_DATE}}\n${{DAYS_SINCE}}' configuration.template = '#{{FROM_TAG}}-#{{FROM_TAG_DATE}}\n#{{TO_TAG}}-#{{TO_TAG_DATE}}\n#{{DAYS_SINCE}}'
const releaseNotesBuilder = new ReleaseNotesBuilder( const releaseNotesBuilder = new ReleaseNotesBuilder(
null, // baseUrl null, // baseUrl
null, // token null, // token
@@ -407,7 +407,7 @@ it('Fetch release information', async () => {
it('Fetch release information for non existing tag / release', async () => { it('Fetch release information for non existing tag / release', async () => {
const configuration = mergeConfiguration(undefined, resolveConfiguration('', 'configs_test/configuration_approvers.json')) const configuration = mergeConfiguration(undefined, resolveConfiguration('', 'configs_test/configuration_approvers.json'))
configuration.template = '${{FROM_TAG}}-${{FROM_TAG_DATE}}\n${{TO_TAG}}-${{TO_TAG_DATE}}\n${{DAYS_SINCE}}' configuration.template = '#{{FROM_TAG}}-#{{FROM_TAG_DATE}}\n#{{TO_TAG}}-#{{TO_TAG_DATE}}\n#{{DAYS_SINCE}}'
const releaseNotesBuilder = new ReleaseNotesBuilder( const releaseNotesBuilder = new ReleaseNotesBuilder(
null, // baseUrl null, // baseUrl
null, // token null, // token
+11 -11
View File
@@ -3,7 +3,7 @@ import {Octokit} from '@octokit/rest'
import {buildChangelog} from '../src/transform' import {buildChangelog} from '../src/transform'
import {pullData} from '../src/pr-collector/prCollector' import {pullData} from '../src/pr-collector/prCollector'
import fetch from 'node-fetch' import fetch from 'node-fetch'
import { Data } from '../src/releaseNotesBuilder' import {Data} from '../src/releaseNotesBuilder'
jest.setTimeout(180000) jest.setTimeout(180000)
@@ -37,7 +37,7 @@ it('Should have empty changelog (tags)', async () => {
if (enablePullData) { if (enablePullData) {
data = await pullData(octokit, options) data = await pullData(octokit, options)
} else { } else {
data = checkExportedData(false, "caches/rcba_0.0.2-0.0.3_cache.json") data = checkExportedData(false, 'caches/rcba_0.0.2-0.0.3_cache.json')
} }
const changeLog = buildChangelog(data!.diffInfo, data!.mergedPullRequests, options) const changeLog = buildChangelog(data!.diffInfo, data!.mergedPullRequests, options)
console.log(changeLog) console.log(changeLog)
@@ -64,7 +64,7 @@ it('Should match generated changelog (tags)', async () => {
if (enablePullData) { if (enablePullData) {
data = await pullData(octokit, options) data = await pullData(octokit, options)
} else { } else {
data = checkExportedData(false, "caches/rcba_0.0.1-0.0.3_cache.json") data = checkExportedData(false, 'caches/rcba_0.0.1-0.0.3_cache.json')
} }
const changeLog = buildChangelog(data!.diffInfo, data!.mergedPullRequests, options) const changeLog = buildChangelog(data!.diffInfo, data!.mergedPullRequests, options)
console.log(changeLog) console.log(changeLog)
@@ -97,7 +97,7 @@ it('Should match generated changelog (refs)', async () => {
if (enablePullData) { if (enablePullData) {
data = await pullData(octokit, options) data = await pullData(octokit, options)
} else { } else {
data = checkExportedData(false, "caches/rcba_5ec7a2-fa3788_cache.json") data = checkExportedData(false, 'caches/rcba_5ec7a2-fa3788_cache.json')
} }
const changeLog = buildChangelog(data!.diffInfo, data!.mergedPullRequests, options) const changeLog = buildChangelog(data!.diffInfo, data!.mergedPullRequests, options)
console.log(changeLog) console.log(changeLog)
@@ -137,7 +137,7 @@ it('Should match generated changelog and replace all occurrences (refs)', async
if (enablePullData) { if (enablePullData) {
data = await pullData(octokit, options) data = await pullData(octokit, options)
} else { } else {
data = checkExportedData(false, "caches/rcba_5ec7a2-fa3788_cache.json") data = checkExportedData(false, 'caches/rcba_5ec7a2-fa3788_cache.json')
} }
const changeLog = buildChangelog(data!.diffInfo, data!.mergedPullRequests, options) const changeLog = buildChangelog(data!.diffInfo, data!.mergedPullRequests, options)
console.log(changeLog) console.log(changeLog)
@@ -180,7 +180,7 @@ it('Should match ordered ASC', async () => {
if (enablePullData) { if (enablePullData) {
data = await pullData(octokit, options) data = await pullData(octokit, options)
} else { } else {
data = checkExportedData(false, "caches/rcba_0.3.0-0.5.0_cache.json") data = checkExportedData(false, 'caches/rcba_0.3.0-0.5.0_cache.json')
} }
const changeLog = buildChangelog(data!.diffInfo, data!.mergedPullRequests, options) const changeLog = buildChangelog(data!.diffInfo, data!.mergedPullRequests, options)
console.log(changeLog) console.log(changeLog)
@@ -208,7 +208,7 @@ it('Should match ordered DESC', async () => {
if (enablePullData) { if (enablePullData) {
data = await pullData(octokit, options) data = await pullData(octokit, options)
} else { } else {
data = checkExportedData(false, "caches/rcba_0.3.0-0.5.0_cache.json") data = checkExportedData(false, 'caches/rcba_0.3.0-0.5.0_cache.json')
} }
const changeLog = buildChangelog(data!.diffInfo, data!.mergedPullRequests, options) const changeLog = buildChangelog(data!.diffInfo, data!.mergedPullRequests, options)
console.log(changeLog) console.log(changeLog)
@@ -235,7 +235,7 @@ it('Should match ordered by title ASC', async () => {
if (enablePullData) { if (enablePullData) {
data = await pullData(octokit, options) data = await pullData(octokit, options)
} else { } else {
data = checkExportedData(false, "caches/rcba_0.3.0-0.5.0_cache.json") data = checkExportedData(false, 'caches/rcba_0.3.0-0.5.0_cache.json')
} }
const changeLog = buildChangelog(data!.diffInfo, data!.mergedPullRequests, options) const changeLog = buildChangelog(data!.diffInfo, data!.mergedPullRequests, options)
console.log(changeLog) console.log(changeLog)
@@ -264,7 +264,7 @@ it('Should match ordered by title DESC', async () => {
if (enablePullData) { if (enablePullData) {
data = await pullData(octokit, options) data = await pullData(octokit, options)
} else { } else {
data = checkExportedData(false, "caches/rcba_0.3.0-0.5.0_cache.json") data = checkExportedData(false, 'caches/rcba_0.3.0-0.5.0_cache.json')
} }
const changeLog = buildChangelog(data!.diffInfo, data!.mergedPullRequests, options) const changeLog = buildChangelog(data!.diffInfo, data!.mergedPullRequests, options)
console.log(changeLog) console.log(changeLog)
@@ -293,7 +293,7 @@ it('Should ignore PRs not merged into develop branch', async () => {
if (enablePullData) { if (enablePullData) {
data = await pullData(octokit, options) data = await pullData(octokit, options)
} else { } else {
data = checkExportedData(false, "caches/rcba_1.3.1-1.4.0_base_develop_cache.json") data = checkExportedData(false, 'caches/rcba_1.3.1-1.4.0_base_develop_cache.json')
} }
const changeLog = buildChangelog(data!.diffInfo, data!.mergedPullRequests, options) const changeLog = buildChangelog(data!.diffInfo, data!.mergedPullRequests, options)
console.log(changeLog) console.log(changeLog)
@@ -320,7 +320,7 @@ it('Should ignore PRs not merged into main branch', async () => {
if (enablePullData) { if (enablePullData) {
data = await pullData(octokit, options) data = await pullData(octokit, options)
} else { } else {
data = checkExportedData(false, "caches/rcba_1.3.1-1.4.0_base_main_cache.json") data = checkExportedData(false, 'caches/rcba_1.3.1-1.4.0_base_main_cache.json')
} }
const changeLog = buildChangelog(data!.diffInfo, data!.mergedPullRequests, options) const changeLog = buildChangelog(data!.diffInfo, data!.mergedPullRequests, options)
console.log(changeLog) console.log(changeLog)
+5 -5
View File
@@ -409,7 +409,7 @@ it('Reference PRs', async () => {
labels: [] labels: []
} }
] ]
customConfig.pr_template = '${{NUMBER}} -- ${{REFERENCED[*].number}}' customConfig.pr_template = '#{{NUMBER}} -- #{{REFERENCED[*].number}}'
customConfig.reference = { customConfig.reference = {
pattern: '.* #(.).*', // matches the 1 from "abcdefg #1 adfasdf" pattern: '.* #(.).*', // matches the 1 from "abcdefg #1 adfasdf"
on_property: 'body', on_property: 'body',
@@ -440,7 +440,7 @@ it('Use empty_content for empty category', async () => {
it('Commit SHA-1 in commitMode', async () => { it('Commit SHA-1 in commitMode', async () => {
const customConfig = Object.assign({}, DefaultConfiguration) const customConfig = Object.assign({}, DefaultConfiguration)
customConfig.sort = 'DESC' customConfig.sort = 'DESC'
customConfig.pr_template = '${{MERGE_SHA}}' customConfig.pr_template = '#{{MERGE_SHA}}'
const resultChangelog = buildChangelog(DefaultDiffInfo, pullRequestsWithLabels, { const resultChangelog = buildChangelog(DefaultDiffInfo, pullRequestsWithLabels, {
owner: 'mikepenz', owner: 'mikepenz',
@@ -461,7 +461,7 @@ it('Commit SHA-1 in commitMode', async () => {
it('Release Diff', async () => { it('Release Diff', async () => {
const customConfig = Object.assign({}, DefaultConfiguration) const customConfig = Object.assign({}, DefaultConfiguration)
customConfig.template = '${{RELEASE_DIFF}}\n${{DAYS_SINCE}}' customConfig.template = '#{{RELEASE_DIFF}}\n#{{DAYS_SINCE}}'
const resultChangelog = buildChangelog(DefaultDiffInfo, pullRequestsWithLabels, { const resultChangelog = buildChangelog(DefaultDiffInfo, pullRequestsWithLabels, {
owner: 'mikepenz', owner: 'mikepenz',
@@ -542,8 +542,8 @@ it('Extract custom placeholder from PR body and replace in global template', asy
} }
] ]
customConfig.template = customConfig.template =
'${{CHANGELOG}}\n\n${{C_PLACEHOLER_2[2]}}\n\n${{C_PLACEHOLER_2[*]}}${{C_PLACEHOLDER_1[7]}}${{C_PLACEHOLER_2[1493]}}${{C_PLACEHOLER_4[*]}}${{C_PLACEHOLER_4[0]}}${{C_PLACEHOLER_3[1]}}' '#{{CHANGELOG}}\n\n#{{C_PLACEHOLER_2[2]}}\n\n#{{C_PLACEHOLER_2[*]}}#{{C_PLACEHOLDER_1[7]}}#{{C_PLACEHOLER_2[1493]}}#{{C_PLACEHOLER_4[*]}}#{{C_PLACEHOLER_4[0]}}#{{C_PLACEHOLER_3[1]}}'
customConfig.pr_template = '${{BODY}} ----> ${{C_PLACEHOLDER_1}}${{C_PLACEHOLER_3}}' customConfig.pr_template = '#{{BODY}} ----> #{{C_PLACEHOLDER_1}}#{{C_PLACEHOLER_3}}'
expect(buildChangelogTest(customConfig, mergedPullRequests)).toStrictEqual( expect(buildChangelogTest(customConfig, mergedPullRequests)).toStrictEqual(
`## 🚀 Features\n\nno magic body1 for this matter ----> - body1body1\nno magic body3 for this matter ----> - body3\n\n## 🐛 Fixes\n\nno magic body2 for this matter ----> - body2\nno magic body3 for this matter ----> - body3\n\n## 🧪 Others\n\nno magic body4 for this matter ----> - body4\n\n\n\n\n- ody3\n\n\n- ody1\n- ody2\n- ody3\n- ody4` `## 🚀 Features\n\nno magic body1 for this matter ----> - body1body1\nno magic body3 for this matter ----> - body3\n\n## 🐛 Fixes\n\nno magic body2 for this matter ----> - body2\nno magic body3 for this matter ----> - body3\n\n## 🧪 Others\n\nno magic body4 for this matter ----> - body4\n\n\n\n\n- ody3\n\n\n- ody1\n- ody2\n- ody3\n- ody4`
+3 -3
View File
@@ -90,9 +90,9 @@
"order": "ASC", "order": "ASC",
"on_property": "mergedAt" "on_property": "mergedAt"
}, },
"template": "${{CHANGELOG}}\n${{UNCATEGORIZED}}\n${{IGNORED}}\n${{OWNER}}\n${{REPO}}\n${{FROM_TAG}}\n${{TO_TAG}}\n${{RELEASE_DIFF}}\n${{CATEGORIZED_COUNT}}\n${{UNCATEGORIZED_COUNT}}\n${{IGNORED_COUNT}}\n${{CHANGED_FILES}}\n${{ADDITIONS}}\n${{DELETIONS}}\n${{CHANGES}}\n${{COMMITS}}", "template": "#{{CHANGELOG}}\n#{{UNCATEGORIZED}}\n#{{IGNORED}}\n#{{OWNER}}\n#{{REPO}}\n#{{FROM_TAG}}\n#{{TO_TAG}}\n#{{RELEASE_DIFF}}\n#{{CATEGORIZED_COUNT}}\n#{{UNCATEGORIZED_COUNT}}\n#{{IGNORED_COUNT}}\n#{{CHANGED_FILES}}\n#{{ADDITIONS}}\n#{{DELETIONS}}\n#{{CHANGES}}\n#{{COMMITS}}",
"pr_template": "- ${{TITLE}}\n - PR: #${{NUMBER}}", "pr_template": "- #{{TITLE}}\n - PR: ##{{NUMBER}}",
"empty_template": "${{OWNER}}\n${{REPO}}\n${{FROM_TAG}}\n${{TO_TAG}}\n${{RELEASE_DIFF}}", "empty_template": "#{{OWNER}}\n#{{REPO}}\n#{{FROM_TAG}}\n#{{TO_TAG}}\n#{{RELEASE_DIFF}}",
"categories": [ "categories": [
{ {
"title": "## 🚀 Features", "title": "## 🚀 Features",
+3 -3
View File
@@ -117,9 +117,9 @@
"order": "ASC", "order": "ASC",
"on_property": "mergedAt" "on_property": "mergedAt"
}, },
"template": "${{CHANGELOG}}\n\nUncategorized:\n${{UNCATEGORIZED}}\n\nIgnored:\n${{IGNORED}}\n\n${{UNCATEGORIZED_COUNT}}\n${{IGNORED_COUNT}}", "template": "#{{CHANGELOG}}\n\nUncategorized:\n#{{UNCATEGORIZED}}\n\nIgnored:\n#{{IGNORED}}\n\n#{{UNCATEGORIZED_COUNT}}\n#{{IGNORED_COUNT}}",
"pr_template": "- ${{TITLE}}\n", "pr_template": "- #{{TITLE}}\n",
"empty_template": "${{OWNER}}\n${{REPO}}\n${{FROM_TAG}}\n${{TO_TAG}}", "empty_template": "#{{OWNER}}\n#{{REPO}}\n#{{FROM_TAG}}\n#{{TO_TAG}}",
"categories": [ "categories": [
{ {
"title": "## 📦 Uncategorized", "title": "## 📦 Uncategorized",
+2 -2
View File
@@ -31,8 +31,8 @@
"max_back_track_time_days": 1000, "max_back_track_time_days": 1000,
"exclude_merge_branches": [], "exclude_merge_branches": [],
"sort": "ASC", "sort": "ASC",
"template": "${{CHANGELOG}}", "template": "#{{CHANGELOG}}",
"pr_template": "- ${{TITLE}}\n - PR: #${{NUMBER}}", "pr_template": "- #{{TITLE}}\n - PR: ##{{NUMBER}}",
"empty_template": "- no changes", "empty_template": "- no changes",
"categories": [ "categories": [
{ {
+2 -2
View File
@@ -579,8 +579,8 @@
"max_back_track_time_days": 1000, "max_back_track_time_days": 1000,
"exclude_merge_branches": [], "exclude_merge_branches": [],
"sort": "ASC", "sort": "ASC",
"template": "${{CHANGELOG}}", "template": "#{{CHANGELOG}}",
"pr_template": "- ${{TITLE}}\n - PR: #${{NUMBER}}", "pr_template": "- #{{TITLE}}\n - PR: ##{{NUMBER}}",
"empty_template": "- no changes", "empty_template": "- no changes",
"categories": [ "categories": [
{ {
+3 -3
View File
@@ -443,9 +443,9 @@
"order": "ASC", "order": "ASC",
"on_property": "mergedAt" "on_property": "mergedAt"
}, },
"template": "${{CHANGELOG}}\n${{UNCATEGORIZED}}\n${{IGNORED}}\n${{OWNER}}\n${{REPO}}\n${{FROM_TAG}}\n${{TO_TAG}}\n${{RELEASE_DIFF}}\n${{CATEGORIZED_COUNT}}\n${{UNCATEGORIZED_COUNT}}\n${{IGNORED_COUNT}}\n${{CHANGED_FILES}}\n${{ADDITIONS}}\n${{DELETIONS}}\n${{CHANGES}}\n${{COMMITS}}", "template": "#{{CHANGELOG}}\n#{{UNCATEGORIZED}}\n#{{IGNORED}}\n#{{OWNER}}\n#{{REPO}}\n#{{FROM_TAG}}\n#{{TO_TAG}}\n#{{RELEASE_DIFF}}\n#{{CATEGORIZED_COUNT}}\n#{{UNCATEGORIZED_COUNT}}\n#{{IGNORED_COUNT}}\n#{{CHANGED_FILES}}\n#{{ADDITIONS}}\n#{{DELETIONS}}\n#{{CHANGES}}\n#{{COMMITS}}",
"pr_template": "- ${{TITLE}}\n - PR: #${{NUMBER}}", "pr_template": "- #{{TITLE}}\n - PR: ##{{NUMBER}}",
"empty_template": "${{OWNER}}\n${{REPO}}\n${{FROM_TAG}}\n${{TO_TAG}}\n${{RELEASE_DIFF}}", "empty_template": "#{{OWNER}}\n#{{REPO}}\n#{{FROM_TAG}}\n#{{TO_TAG}}\n#{{RELEASE_DIFF}}",
"categories": [ "categories": [
{ {
"title": "## 🚀 Features", "title": "## 🚀 Features",
@@ -171,8 +171,8 @@
"max_back_track_time_days": 1000, "max_back_track_time_days": 1000,
"exclude_merge_branches": [], "exclude_merge_branches": [],
"sort": "DESC", "sort": "DESC",
"template": "${{CHANGELOG}}", "template": "#{{CHANGELOG}}",
"pr_template": "${{NUMBER}}", "pr_template": "#{{NUMBER}}",
"empty_template": "- no changes", "empty_template": "- no changes",
"categories": [ "categories": [
{ {
+2 -2
View File
@@ -127,8 +127,8 @@
"max_back_track_time_days": 1000, "max_back_track_time_days": 1000,
"exclude_merge_branches": [], "exclude_merge_branches": [],
"sort": "DESC", "sort": "DESC",
"template": "${{CHANGELOG}}", "template": "#{{CHANGELOG}}",
"pr_template": "${{NUMBER}}", "pr_template": "#{{NUMBER}}",
"empty_template": "- no changes", "empty_template": "- no changes",
"categories": [ "categories": [
{ {
+2 -2
View File
@@ -87,8 +87,8 @@
"max_back_track_time_days": 1000, "max_back_track_time_days": 1000,
"exclude_merge_branches": [], "exclude_merge_branches": [],
"sort": "ASC", "sort": "ASC",
"template": "${{CHANGELOG}}", "template": "#{{CHANGELOG}}",
"pr_template": "- ${{TITLE}}\n - PR: #${{NUMBER}}", "pr_template": "- #{{TITLE}}\n - PR: ##{{NUMBER}}",
"empty_template": "- no changes", "empty_template": "- no changes",
"categories": [ "categories": [
{ {
+2 -2
View File
@@ -468,8 +468,8 @@
"order": "ASC", "order": "ASC",
"on_property": "mergedAt" "on_property": "mergedAt"
}, },
"template": "${{CHANGELOG}}", "template": "#{{CHANGELOG}}",
"pr_template": "${{TITLE}}", "pr_template": "#{{TITLE}}",
"empty_template": "- no changes", "empty_template": "- no changes",
"categories": [ "categories": [
{ {
Generated Vendored
+9 -9
View File
@@ -18,8 +18,8 @@ exports.DefaultConfiguration = {
order: 'ASC', order: 'ASC',
on_property: 'mergedAt' // the property to sort on. (mergedAt falls back to createdAt) on_property: 'mergedAt' // the property to sort on. (mergedAt falls back to createdAt)
}, },
template: '${{CHANGELOG}}', template: '#{{CHANGELOG}}',
pr_template: '- ${{TITLE}}\n - PR: #${{NUMBER}}', pr_template: '- #{{TITLE}}\n - PR: ##{{NUMBER}}',
empty_template: '- no changes', empty_template: '- no changes',
categories: [ categories: [
{ {
@@ -2380,7 +2380,7 @@ function replacePlaceholders(template, arrayPlaceholderMap /* arrayPlaceholderKe
return transformed; return transformed;
} }
function handlePlaceholder(template, key, value, placeholders /* placeholders to apply */, placeholderPrMap /* map to keep replaced placeholder values with their key */, configuration) { function handlePlaceholder(template, key, value, placeholders /* placeholders to apply */, placeholderPrMap /* map to keep replaced placeholder values with their key */, configuration) {
let transformed = template.replaceAll(`\${{${key}}}`, configuration.trim_values ? value.trim() : value); let transformed = template.replaceAll(`#{{${key}}}`, configuration.trim_values ? value.trim() : value);
// replace custom placeholders // replace custom placeholders
const phs = placeholders.get(key); const phs = placeholders.get(key);
if (phs) { if (phs) {
@@ -2393,7 +2393,7 @@ function handlePlaceholder(template, key, value, placeholders /* placeholders to
if (placeholderPrMap) { if (placeholderPrMap) {
(0, utils_1.createOrSet)(placeholderPrMap, placeholder.name, extractedValue); (0, utils_1.createOrSet)(placeholderPrMap, placeholder.name, extractedValue);
} }
transformed = transformed.replaceAll(`\${{${placeholder.name}}}`, configuration.trim_values ? extractedValue.trim() : extractedValue); transformed = transformed.replaceAll(`#{{${placeholder.name}}}`, configuration.trim_values ? extractedValue.trim() : extractedValue);
if (core.isDebug()) { if (core.isDebug()) {
core.debug(` Custom Placeholder successfully matched data - ${extractValues} (${placeholder.name})`); core.debug(` Custom Placeholder successfully matched data - ${extractValues} (${placeholder.name})`);
} }
@@ -2442,9 +2442,9 @@ function replacePrPlaceholders(template, placeholderPrMap /* map with all pr rel
let transformed = template; let transformed = template;
for (const [key, values] of placeholderPrMap) { for (const [key, values] of placeholderPrMap) {
for (let i = 0; i < values.length; i++) { for (let i = 0; i < values.length; i++) {
transformed = transformed.replaceAll(`\${{${key}[${i}]}}`, configuration.trim_values ? values[i].trim() : values[i]); transformed = transformed.replaceAll(`#{{${key}[${i}]}}`, configuration.trim_values ? values[i].trim() : values[i]);
} }
transformed = transformed.replaceAll(`\${{${key}[*]}}`, values.join('')); transformed = transformed.replaceAll(`#{{${key}[*]}}`, values.join(''));
} }
return transformed; return transformed;
} }
@@ -2452,7 +2452,7 @@ function cleanupPrPlaceholders(template, placeholders) {
let transformed = template; let transformed = template;
for (const [, phs] of placeholders) { for (const [, phs] of placeholders) {
for (const ph of phs) { for (const ph of phs) {
transformed = transformed.replaceAll(new RegExp(`\\$\\{\\{${ph.name}(?:\\[.+?\\])?\\}\\}`, 'gu'), ''); transformed = transformed.replaceAll(new RegExp(`#\\{\\{${ph.name}(?:\\[.+?\\])?\\}\\}`, 'gu'), '');
} }
} }
return transformed; return transformed;
@@ -2460,7 +2460,7 @@ function cleanupPrPlaceholders(template, placeholders) {
function cleanupPlaceholders(template) { function cleanupPlaceholders(template) {
let transformed = template; let transformed = template;
for (const phs of ['REVIEWS', 'REFERENCED', 'ASSIGNEES', 'REVIEWERS', 'APPROVERS']) { for (const phs of ['REVIEWS', 'REFERENCED', 'ASSIGNEES', 'REVIEWERS', 'APPROVERS']) {
transformed = transformed.replaceAll(new RegExp(`\\$\\{\\{${phs}\\[.+?\\]\\..*?\\}\\}`, 'gu'), ''); transformed = transformed.replaceAll(new RegExp(`#\\{\\{${phs}\\[.+?\\]\\..*?\\}\\}`, 'gu'), '');
} }
return transformed; return transformed;
} }
@@ -2717,7 +2717,7 @@ function readConfiguration(filename) {
function parseConfiguration(config) { function parseConfiguration(config) {
try { try {
// for compatiblity with the `yml` file we require to use `#{{}}` instead of `${{}}` - replace it here. // for compatiblity with the `yml` file we require to use `#{{}}` instead of `${{}}` - replace it here.
const configurationJSON = JSON.parse(config.replace(/#{{/g, '${{')); const configurationJSON = JSON.parse(config.replace(/\${{/g, '#{{'));
return configurationJSON; return configurationJSON;
} }
catch (error) { catch (error) {
Generated Vendored
+1 -1
View File
File diff suppressed because one or more lines are too long
+139 -123
View File
@@ -20,20 +20,20 @@
}, },
"devDependencies": { "devDependencies": {
"@types/jest": "^29.5.4", "@types/jest": "^29.5.4",
"@types/node": "^20.5.6", "@types/node": "^20.5.7",
"@types/node-fetch": "^2.6.4", "@types/node-fetch": "^2.6.4",
"@types/semver": "^7.5.0", "@types/semver": "^7.5.1",
"@typescript-eslint/eslint-plugin": "^6.4.1", "@typescript-eslint/eslint-plugin": "^6.5.0",
"@typescript-eslint/parser": "^6.4.1", "@typescript-eslint/parser": "^6.5.0",
"@vercel/ncc": "^0.36.1", "@vercel/ncc": "^0.36.1",
"eslint": "^8.47.0", "eslint": "^8.48.0",
"eslint-plugin-github": "^4.9.2", "eslint-plugin-github": "^4.10.0",
"eslint-plugin-jest": "^27.2.3", "eslint-plugin-jest": "^27.2.3",
"eslint-plugin-prettier": "^5.0.0", "eslint-plugin-prettier": "^5.0.0",
"jest": "^29.6.4", "jest": "^29.6.4",
"jest-circus": "^29.6.4", "jest-circus": "^29.6.4",
"js-yaml": "^4.1.0", "js-yaml": "^4.1.0",
"prettier": "3.0.2", "prettier": "3.0.3",
"ts-jest": "^29.1.1", "ts-jest": "^29.1.1",
"typescript": "^5.2.2" "typescript": "^5.2.2"
} }
@@ -102,12 +102,12 @@
} }
}, },
"node_modules/@babel/code-frame": { "node_modules/@babel/code-frame": {
"version": "7.22.10", "version": "7.22.13",
"resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.22.10.tgz", "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.22.13.tgz",
"integrity": "sha512-/KKIMG4UEL35WmI9OlvMhurwtytjvXoFcGNrOvyG9zIzA8YmPjVtIZUf7b05+TPO7G7/GEmLHDaoCgACHl9hhA==", "integrity": "sha512-XktuhWlJ5g+3TJXc5upd9Ks1HutSArik6jf2eAjYFyIOf4ej3RN+184cZbzDvbPnuTJIUhPKKJE3cIsYTiAT3w==",
"dev": true, "dev": true,
"dependencies": { "dependencies": {
"@babel/highlight": "^7.22.10", "@babel/highlight": "^7.22.13",
"chalk": "^2.4.2" "chalk": "^2.4.2"
}, },
"engines": { "engines": {
@@ -419,9 +419,9 @@
} }
}, },
"node_modules/@babel/highlight": { "node_modules/@babel/highlight": {
"version": "7.22.10", "version": "7.22.13",
"resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.22.10.tgz", "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.22.13.tgz",
"integrity": "sha512-78aUtVcT7MUscr0K5mIEnkwxPE0MaxkR5RxRwuHaQ+JuU5AmTPhY+do2mdzVTnIJJpyBglql2pehuBIWHug+WQ==", "integrity": "sha512-C/BaXcnnvBCmHTpz/VGZ8jgtE2aYlW4hxDhseJAWZb7gqGM/qtCK6iZUb0TyKFf7BOUsBH7Q7fkRsDRhg1XklQ==",
"dev": true, "dev": true,
"dependencies": { "dependencies": {
"@babel/helper-validator-identifier": "^7.22.5", "@babel/helper-validator-identifier": "^7.22.5",
@@ -504,9 +504,9 @@
} }
}, },
"node_modules/@babel/parser": { "node_modules/@babel/parser": {
"version": "7.22.11", "version": "7.22.14",
"resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.22.11.tgz", "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.22.14.tgz",
"integrity": "sha512-R5zb8eJIBPJriQtbH/htEQy4k7E2dHWlD2Y2VT07JCzwYZHBxV5ZYtM0UhXSNMT74LyxuM+b1jdL7pSesXbC/g==", "integrity": "sha512-1KucTHgOvaw/LzCVrEOAyXkr9rQlp0A1HiHRYnSUE9dmb8PvPW7o5sscg+5169r54n3vGlbx6GevTE/Iw/P3AQ==",
"dev": true, "dev": true,
"bin": { "bin": {
"parser": "bin/babel-parser.js" "parser": "bin/babel-parser.js"
@@ -816,9 +816,9 @@
} }
}, },
"node_modules/@eslint/js": { "node_modules/@eslint/js": {
"version": "8.47.0", "version": "8.48.0",
"resolved": "https://registry.npmjs.org/@eslint/js/-/js-8.47.0.tgz", "resolved": "https://registry.npmjs.org/@eslint/js/-/js-8.48.0.tgz",
"integrity": "sha512-P6omY1zv5MItm93kLM8s2vr1HICJH8v0dvddDhysbIuZ+vcjOHg5Zbkf1mTkcmi2JA9oBG2anOkRnW8WJTS8Og==", "integrity": "sha512-ZSjtmelB7IJfWD2Fvb7+Z+ChTIKWq6kjda95fLcQKNS5aheVHn4IkfgRQE3sIIzTcSLwLcLZUD9UBt+V7+h+Pw==",
"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"
@@ -831,9 +831,9 @@
"dev": true "dev": true
}, },
"node_modules/@humanwhocodes/config-array": { "node_modules/@humanwhocodes/config-array": {
"version": "0.11.10", "version": "0.11.11",
"resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.11.10.tgz", "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.11.11.tgz",
"integrity": "sha512-KVVjQmNUepDVGXNuoRRdmmEjruj0KfiGSbS8LVc12LMsWDQzRXJ0qdhN8L8uUigKpfEHRhlaQFY0ib1tnUbNeQ==", "integrity": "sha512-N2brEuAadi0CcdeMXUkhbZB84eskAc8MEX1By6qEchoVywSgXPIjou4rYsl0V3Hj0ZnuGycGCjdNgockbzeWNA==",
"dev": true, "dev": true,
"dependencies": { "dependencies": {
"@humanwhocodes/object-schema": "^1.2.1", "@humanwhocodes/object-schema": "^1.2.1",
@@ -1719,9 +1719,9 @@
"dev": true "dev": true
}, },
"node_modules/@types/node": { "node_modules/@types/node": {
"version": "20.5.6", "version": "20.5.7",
"resolved": "https://registry.npmjs.org/@types/node/-/node-20.5.6.tgz", "resolved": "https://registry.npmjs.org/@types/node/-/node-20.5.7.tgz",
"integrity": "sha512-Gi5wRGPbbyOTX+4Y2iULQ27oUPrefaB0PxGQJnfyWN3kvEDGM3mIB5M/gQLmitZf7A9FmLeaqxD3L1CXpm3VKQ==", "integrity": "sha512-dP7f3LdZIysZnmvP3ANJYTSwg+wLLl8p7RqniVlV7j+oXSXAbt9h0WIBFmJy5inWZoX9wZN6eXx+YXd9Rh3RBA==",
"dev": true "dev": true
}, },
"node_modules/@types/node-fetch": { "node_modules/@types/node-fetch": {
@@ -1735,9 +1735,9 @@
} }
}, },
"node_modules/@types/semver": { "node_modules/@types/semver": {
"version": "7.5.0", "version": "7.5.1",
"resolved": "https://registry.npmjs.org/@types/semver/-/semver-7.5.0.tgz", "resolved": "https://registry.npmjs.org/@types/semver/-/semver-7.5.1.tgz",
"integrity": "sha512-G8hZ6XJiHnuhQKR7ZmysCeJWE08o8T0AXtk5darsCaTVsYZhhgUrq53jizaR2FvsoeCwJhlmwTjkXBY5Pn/ZHw==", "integrity": "sha512-cJRQXpObxfNKkFAZbJl2yjWtJCqELQIdShsogr1d2MilP8dKD9TE/nEKHkJgUNHdGKCQaf9HbIynuV2csLGVLg==",
"dev": true "dev": true
}, },
"node_modules/@types/stack-utils": { "node_modules/@types/stack-utils": {
@@ -1762,16 +1762,16 @@
"dev": true "dev": true
}, },
"node_modules/@typescript-eslint/eslint-plugin": { "node_modules/@typescript-eslint/eslint-plugin": {
"version": "6.4.1", "version": "6.5.0",
"resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-6.4.1.tgz", "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-6.5.0.tgz",
"integrity": "sha512-3F5PtBzUW0dYlq77Lcqo13fv+58KDwUib3BddilE8ajPJT+faGgxmI9Sw+I8ZS22BYwoir9ZhNXcLi+S+I2bkw==", "integrity": "sha512-2pktILyjvMaScU6iK3925uvGU87E+N9rh372uGZgiMYwafaw9SXq86U04XPq3UH6tzRvNgBsub6x2DacHc33lw==",
"dev": true, "dev": true,
"dependencies": { "dependencies": {
"@eslint-community/regexpp": "^4.5.1", "@eslint-community/regexpp": "^4.5.1",
"@typescript-eslint/scope-manager": "6.4.1", "@typescript-eslint/scope-manager": "6.5.0",
"@typescript-eslint/type-utils": "6.4.1", "@typescript-eslint/type-utils": "6.5.0",
"@typescript-eslint/utils": "6.4.1", "@typescript-eslint/utils": "6.5.0",
"@typescript-eslint/visitor-keys": "6.4.1", "@typescript-eslint/visitor-keys": "6.5.0",
"debug": "^4.3.4", "debug": "^4.3.4",
"graphemer": "^1.4.0", "graphemer": "^1.4.0",
"ignore": "^5.2.4", "ignore": "^5.2.4",
@@ -1797,15 +1797,15 @@
} }
}, },
"node_modules/@typescript-eslint/parser": { "node_modules/@typescript-eslint/parser": {
"version": "6.4.1", "version": "6.5.0",
"resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-6.4.1.tgz", "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-6.5.0.tgz",
"integrity": "sha512-610G6KHymg9V7EqOaNBMtD1GgpAmGROsmfHJPXNLCU9bfIuLrkdOygltK784F6Crboyd5tBFayPB7Sf0McrQwg==", "integrity": "sha512-LMAVtR5GN8nY0G0BadkG0XIe4AcNMeyEy3DyhKGAh9k4pLSMBO7rF29JvDBpZGCmp5Pgz5RLHP6eCpSYZJQDuQ==",
"dev": true, "dev": true,
"dependencies": { "dependencies": {
"@typescript-eslint/scope-manager": "6.4.1", "@typescript-eslint/scope-manager": "6.5.0",
"@typescript-eslint/types": "6.4.1", "@typescript-eslint/types": "6.5.0",
"@typescript-eslint/typescript-estree": "6.4.1", "@typescript-eslint/typescript-estree": "6.5.0",
"@typescript-eslint/visitor-keys": "6.4.1", "@typescript-eslint/visitor-keys": "6.5.0",
"debug": "^4.3.4" "debug": "^4.3.4"
}, },
"engines": { "engines": {
@@ -1825,13 +1825,13 @@
} }
}, },
"node_modules/@typescript-eslint/scope-manager": { "node_modules/@typescript-eslint/scope-manager": {
"version": "6.4.1", "version": "6.5.0",
"resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-6.4.1.tgz", "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-6.5.0.tgz",
"integrity": "sha512-p/OavqOQfm4/Hdrr7kvacOSFjwQ2rrDVJRPxt/o0TOWdFnjJptnjnZ+sYDR7fi4OimvIuKp+2LCkc+rt9fIW+A==", "integrity": "sha512-A8hZ7OlxURricpycp5kdPTH3XnjG85UpJS6Fn4VzeoH4T388gQJ/PGP4ole5NfKt4WDVhmLaQ/dBLNDC4Xl/Kw==",
"dev": true, "dev": true,
"dependencies": { "dependencies": {
"@typescript-eslint/types": "6.4.1", "@typescript-eslint/types": "6.5.0",
"@typescript-eslint/visitor-keys": "6.4.1" "@typescript-eslint/visitor-keys": "6.5.0"
}, },
"engines": { "engines": {
"node": "^16.0.0 || >=18.0.0" "node": "^16.0.0 || >=18.0.0"
@@ -1842,13 +1842,13 @@
} }
}, },
"node_modules/@typescript-eslint/type-utils": { "node_modules/@typescript-eslint/type-utils": {
"version": "6.4.1", "version": "6.5.0",
"resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-6.4.1.tgz", "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-6.5.0.tgz",
"integrity": "sha512-7ON8M8NXh73SGZ5XvIqWHjgX2f+vvaOarNliGhjrJnv1vdjG0LVIz+ToYfPirOoBi56jxAKLfsLm40+RvxVVXA==", "integrity": "sha512-f7OcZOkRivtujIBQ4yrJNIuwyCQO1OjocVqntl9dgSIZAdKqicj3xFDqDOzHDlGCZX990LqhLQXWRnQvsapq8A==",
"dev": true, "dev": true,
"dependencies": { "dependencies": {
"@typescript-eslint/typescript-estree": "6.4.1", "@typescript-eslint/typescript-estree": "6.5.0",
"@typescript-eslint/utils": "6.4.1", "@typescript-eslint/utils": "6.5.0",
"debug": "^4.3.4", "debug": "^4.3.4",
"ts-api-utils": "^1.0.1" "ts-api-utils": "^1.0.1"
}, },
@@ -1869,9 +1869,9 @@
} }
}, },
"node_modules/@typescript-eslint/types": { "node_modules/@typescript-eslint/types": {
"version": "6.4.1", "version": "6.5.0",
"resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-6.4.1.tgz", "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-6.5.0.tgz",
"integrity": "sha512-zAAopbNuYu++ijY1GV2ylCsQsi3B8QvfPHVqhGdDcbx/NK5lkqMnCGU53amAjccSpk+LfeONxwzUhDzArSfZJg==", "integrity": "sha512-eqLLOEF5/lU8jW3Bw+8auf4lZSbbljHR2saKnYqON12G/WsJrGeeDHWuQePoEf9ro22+JkbPfWQwKEC5WwLQ3w==",
"dev": true, "dev": true,
"engines": { "engines": {
"node": "^16.0.0 || >=18.0.0" "node": "^16.0.0 || >=18.0.0"
@@ -1882,13 +1882,13 @@
} }
}, },
"node_modules/@typescript-eslint/typescript-estree": { "node_modules/@typescript-eslint/typescript-estree": {
"version": "6.4.1", "version": "6.5.0",
"resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-6.4.1.tgz", "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-6.5.0.tgz",
"integrity": "sha512-xF6Y7SatVE/OyV93h1xGgfOkHr2iXuo8ip0gbfzaKeGGuKiAnzS+HtVhSPx8Www243bwlW8IF7X0/B62SzFftg==", "integrity": "sha512-q0rGwSe9e5Kk/XzliB9h2LBc9tmXX25G0833r7kffbl5437FPWb2tbpIV9wAATebC/018pGa9fwPDuvGN+LxWQ==",
"dev": true, "dev": true,
"dependencies": { "dependencies": {
"@typescript-eslint/types": "6.4.1", "@typescript-eslint/types": "6.5.0",
"@typescript-eslint/visitor-keys": "6.4.1", "@typescript-eslint/visitor-keys": "6.5.0",
"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",
@@ -1909,17 +1909,17 @@
} }
}, },
"node_modules/@typescript-eslint/utils": { "node_modules/@typescript-eslint/utils": {
"version": "6.4.1", "version": "6.5.0",
"resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-6.4.1.tgz", "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-6.5.0.tgz",
"integrity": "sha512-F/6r2RieNeorU0zhqZNv89s9bDZSovv3bZQpUNOmmQK1L80/cV4KEu95YUJWi75u5PhboFoKUJBnZ4FQcoqhDw==", "integrity": "sha512-9nqtjkNykFzeVtt9Pj6lyR9WEdd8npPhhIPM992FWVkZuS6tmxHfGVnlUcjpUP2hv8r4w35nT33mlxd+Be1ACQ==",
"dev": true, "dev": true,
"dependencies": { "dependencies": {
"@eslint-community/eslint-utils": "^4.4.0", "@eslint-community/eslint-utils": "^4.4.0",
"@types/json-schema": "^7.0.12", "@types/json-schema": "^7.0.12",
"@types/semver": "^7.5.0", "@types/semver": "^7.5.0",
"@typescript-eslint/scope-manager": "6.4.1", "@typescript-eslint/scope-manager": "6.5.0",
"@typescript-eslint/types": "6.4.1", "@typescript-eslint/types": "6.5.0",
"@typescript-eslint/typescript-estree": "6.4.1", "@typescript-eslint/typescript-estree": "6.5.0",
"semver": "^7.5.4" "semver": "^7.5.4"
}, },
"engines": { "engines": {
@@ -1934,12 +1934,12 @@
} }
}, },
"node_modules/@typescript-eslint/visitor-keys": { "node_modules/@typescript-eslint/visitor-keys": {
"version": "6.4.1", "version": "6.5.0",
"resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-6.4.1.tgz", "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-6.5.0.tgz",
"integrity": "sha512-y/TyRJsbZPkJIZQXrHfdnxVnxyKegnpEvnRGNam7s3TRR2ykGefEWOhaef00/UUN3IZxizS7BTO3svd3lCOJRQ==", "integrity": "sha512-yCB/2wkbv3hPsh02ZS8dFQnij9VVQXJMN/gbQsaaY+zxALkZnxa/wagvLEFsAWMPv7d7lxQmNsIzGU1w/T/WyA==",
"dev": true, "dev": true,
"dependencies": { "dependencies": {
"@typescript-eslint/types": "6.4.1", "@typescript-eslint/types": "6.5.0",
"eslint-visitor-keys": "^3.4.1" "eslint-visitor-keys": "^3.4.1"
}, },
"engines": { "engines": {
@@ -2128,16 +2128,16 @@
} }
}, },
"node_modules/array.prototype.findlastindex": { "node_modules/array.prototype.findlastindex": {
"version": "1.2.2", "version": "1.2.3",
"resolved": "https://registry.npmjs.org/array.prototype.findlastindex/-/array.prototype.findlastindex-1.2.2.tgz", "resolved": "https://registry.npmjs.org/array.prototype.findlastindex/-/array.prototype.findlastindex-1.2.3.tgz",
"integrity": "sha512-tb5thFFlUcp7NdNF6/MpDk/1r/4awWG1FIz3YqDf+/zJSTezBb+/5WViH41obXULHVpDzoiCLpJ/ZO9YbJMsdw==", "integrity": "sha512-LzLoiOMAxvy+Gd3BAq3B7VeIgPdo+Q8hthvKtXybMvRV0jrXfJM/t8mw7nNlpEcVlVUnCnM2KSX4XU5HmpodOA==",
"dev": true, "dev": true,
"dependencies": { "dependencies": {
"call-bind": "^1.0.2", "call-bind": "^1.0.2",
"define-properties": "^1.1.4", "define-properties": "^1.2.0",
"es-abstract": "^1.20.4", "es-abstract": "^1.22.1",
"es-shim-unscopables": "^1.0.0", "es-shim-unscopables": "^1.0.0",
"get-intrinsic": "^1.1.3" "get-intrinsic": "^1.2.1"
}, },
"engines": { "engines": {
"node": ">= 0.4" "node": ">= 0.4"
@@ -2520,9 +2520,9 @@
} }
}, },
"node_modules/caniuse-lite": { "node_modules/caniuse-lite": {
"version": "1.0.30001523", "version": "1.0.30001525",
"resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001523.tgz", "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001525.tgz",
"integrity": "sha512-I5q5cisATTPZ1mc588Z//pj/Ox80ERYDfR71YnvY7raS/NOk8xXlZcB0sF7JdqaV//kOaa6aus7lRfpdnt1eBA==", "integrity": "sha512-/3z+wB4icFt3r0USMwxujAqRvaD/B7rvGTsKhbhSQErVrJvkZCLhgNLJxU8MevahQVH6hCU9FsHdNUFbiwmE7Q==",
"dev": true, "dev": true,
"funding": [ "funding": [
{ {
@@ -2960,9 +2960,9 @@
} }
}, },
"node_modules/electron-to-chromium": { "node_modules/electron-to-chromium": {
"version": "1.4.502", "version": "1.4.508",
"resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.502.tgz", "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.508.tgz",
"integrity": "sha512-xqeGw3Gr6o3uyHy/yKjdnDQHY2RQvXcGC2cfHjccK1IGkH6cX1WQBN8EeC/YpwPhGkBaikDTecJ8+ssxSVRQlw==", "integrity": "sha512-FFa8QKjQK/A5QuFr2167myhMesGrhlOBD+3cYNxO9/S4XzHEXesyTD/1/xF644gC8buFPz3ca6G1LOQD0tZrrg==",
"dev": true "dev": true
}, },
"node_modules/emittery": { "node_modules/emittery": {
@@ -3107,15 +3107,15 @@
} }
}, },
"node_modules/eslint": { "node_modules/eslint": {
"version": "8.47.0", "version": "8.48.0",
"resolved": "https://registry.npmjs.org/eslint/-/eslint-8.47.0.tgz", "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.48.0.tgz",
"integrity": "sha512-spUQWrdPt+pRVP1TTJLmfRNJJHHZryFmptzcafwSvHsceV81djHOdnEeDmkdotZyLNjDhrOasNK8nikkoG1O8Q==", "integrity": "sha512-sb6DLeIuRXxeM1YljSe1KEx9/YYeZFQWcV8Rq9HfigmdDEugjLEVEa1ozDjL6YDjBpQHPJxJzze+alxi4T3OLg==",
"dev": true, "dev": true,
"dependencies": { "dependencies": {
"@eslint-community/eslint-utils": "^4.2.0", "@eslint-community/eslint-utils": "^4.2.0",
"@eslint-community/regexpp": "^4.6.1", "@eslint-community/regexpp": "^4.6.1",
"@eslint/eslintrc": "^2.1.2", "@eslint/eslintrc": "^2.1.2",
"@eslint/js": "^8.47.0", "@eslint/js": "8.48.0",
"@humanwhocodes/config-array": "^0.11.10", "@humanwhocodes/config-array": "^0.11.10",
"@humanwhocodes/module-importer": "^1.0.1", "@humanwhocodes/module-importer": "^1.0.1",
"@nodelib/fs.walk": "^1.2.8", "@nodelib/fs.walk": "^1.2.8",
@@ -3274,9 +3274,9 @@
} }
}, },
"node_modules/eslint-plugin-github": { "node_modules/eslint-plugin-github": {
"version": "4.9.2", "version": "4.10.0",
"resolved": "https://registry.npmjs.org/eslint-plugin-github/-/eslint-plugin-github-4.9.2.tgz", "resolved": "https://registry.npmjs.org/eslint-plugin-github/-/eslint-plugin-github-4.10.0.tgz",
"integrity": "sha512-osez6Sio/fLr/3QkW5HE1wbCOcmYG5030/6QIa9IcKyyfchewlecdnYcsbeUMUtdIiU9lWqhroQp2H/O7auxBA==", "integrity": "sha512-YKtqBtFbjih1wZNTwZjtLPEG6B/4ySMa38fgOo/rbMJpNKO3+OaKzwwOYkeKx/FapM/4MsTP9ExqUcDV+dkixA==",
"dev": true, "dev": true,
"dependencies": { "dependencies": {
"@github/browserslist-config": "^1.0.0", "@github/browserslist-config": "^1.0.0",
@@ -3866,16 +3866,17 @@
} }
}, },
"node_modules/flat-cache": { "node_modules/flat-cache": {
"version": "3.0.4", "version": "3.1.0",
"resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-3.0.4.tgz", "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-3.1.0.tgz",
"integrity": "sha512-dm9s5Pw7Jc0GvMYbshN6zchCA9RgQlzzEZX3vylR9IqFfS8XciblUXOKfW6SiuJ0e13eDYZoZV5wdrev7P3Nwg==", "integrity": "sha512-OHx4Qwrrt0E4jEIcI5/Xb+f+QmJYNj2rrK8wiIdQOIrB9WrrJL8cjZvXdXuBTkkEwEqLycb5BeZDV1o2i9bTew==",
"dev": true, "dev": true,
"dependencies": { "dependencies": {
"flatted": "^3.1.0", "flatted": "^3.2.7",
"keyv": "^4.5.3",
"rimraf": "^3.0.2" "rimraf": "^3.0.2"
}, },
"engines": { "engines": {
"node": "^10.12.0 || >=12.0.0" "node": ">=12.0.0"
} }
}, },
"node_modules/flatted": { "node_modules/flatted": {
@@ -3934,15 +3935,15 @@
"dev": true "dev": true
}, },
"node_modules/function.prototype.name": { "node_modules/function.prototype.name": {
"version": "1.1.5", "version": "1.1.6",
"resolved": "https://registry.npmjs.org/function.prototype.name/-/function.prototype.name-1.1.5.tgz", "resolved": "https://registry.npmjs.org/function.prototype.name/-/function.prototype.name-1.1.6.tgz",
"integrity": "sha512-uN7m/BzVKQnCUF/iW8jYea67v++2u7m5UgENbHRtdDVclOUP+FMPlCNdmk0h/ysGyo2tavMJEDqJAkJdRa1vMA==", "integrity": "sha512-Z5kx79swU5P27WEayXM1tBi5Ze/lbIyiNgU3qyXUOf9b2rgXYyF9Dy9Cx+IQv/Lc8WCG6L82zwUPpSS9hGehIg==",
"dev": true, "dev": true,
"dependencies": { "dependencies": {
"call-bind": "^1.0.2", "call-bind": "^1.0.2",
"define-properties": "^1.1.3", "define-properties": "^1.2.0",
"es-abstract": "^1.19.0", "es-abstract": "^1.22.1",
"functions-have-names": "^1.2.2" "functions-have-names": "^1.2.3"
}, },
"engines": { "engines": {
"node": ">= 0.4" "node": ">= 0.4"
@@ -5327,6 +5328,12 @@
"node": ">=4" "node": ">=4"
} }
}, },
"node_modules/json-buffer": {
"version": "3.0.1",
"resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.1.tgz",
"integrity": "sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==",
"dev": true
},
"node_modules/json-parse-even-better-errors": { "node_modules/json-parse-even-better-errors": {
"version": "2.3.1", "version": "2.3.1",
"resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz", "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz",
@@ -5372,6 +5379,15 @@
"node": ">=4.0" "node": ">=4.0"
} }
}, },
"node_modules/keyv": {
"version": "4.5.3",
"resolved": "https://registry.npmjs.org/keyv/-/keyv-4.5.3.tgz",
"integrity": "sha512-QCiSav9WaX1PgETJ+SpNnx2PRRapJ/oRSXM4VO5OGYGSjrxbKPVFVhB3l2OCbLCk329N8qyAtsJjSjvVBWzEug==",
"dev": true,
"dependencies": {
"json-buffer": "3.0.1"
}
},
"node_modules/kleur": { "node_modules/kleur": {
"version": "3.0.3", "version": "3.0.3",
"resolved": "https://registry.npmjs.org/kleur/-/kleur-3.0.3.tgz", "resolved": "https://registry.npmjs.org/kleur/-/kleur-3.0.3.tgz",
@@ -5701,28 +5717,28 @@
} }
}, },
"node_modules/object.entries": { "node_modules/object.entries": {
"version": "1.1.6", "version": "1.1.7",
"resolved": "https://registry.npmjs.org/object.entries/-/object.entries-1.1.6.tgz", "resolved": "https://registry.npmjs.org/object.entries/-/object.entries-1.1.7.tgz",
"integrity": "sha512-leTPzo4Zvg3pmbQ3rDK69Rl8GQvIqMWubrkxONG9/ojtFE2rD9fjMKfSI5BxW3osRH1m6VdzmqK8oAY9aT4x5w==", "integrity": "sha512-jCBs/0plmPsOnrKAfFQXRG2NFjlhZgjjcBLSmTnEhU8U6vVTsVe8ANeQJCHTl3gSsI4J+0emOoCgoKlmQPMgmA==",
"dev": true, "dev": true,
"dependencies": { "dependencies": {
"call-bind": "^1.0.2", "call-bind": "^1.0.2",
"define-properties": "^1.1.4", "define-properties": "^1.2.0",
"es-abstract": "^1.20.4" "es-abstract": "^1.22.1"
}, },
"engines": { "engines": {
"node": ">= 0.4" "node": ">= 0.4"
} }
}, },
"node_modules/object.fromentries": { "node_modules/object.fromentries": {
"version": "2.0.6", "version": "2.0.7",
"resolved": "https://registry.npmjs.org/object.fromentries/-/object.fromentries-2.0.6.tgz", "resolved": "https://registry.npmjs.org/object.fromentries/-/object.fromentries-2.0.7.tgz",
"integrity": "sha512-VciD13dswC4j1Xt5394WR4MzmAQmlgN72phd/riNp9vtD7tp4QQWJ0R4wvclXcafgcYK8veHRed2W6XeGBvcfg==", "integrity": "sha512-UPbPHML6sL8PI/mOqPwsH4G6iyXcCGzLin8KvEPenOZN5lpCNBZZQ+V62vdjB1mQHrmqGQt5/OJzemUA+KJmEA==",
"dev": true, "dev": true,
"dependencies": { "dependencies": {
"call-bind": "^1.0.2", "call-bind": "^1.0.2",
"define-properties": "^1.1.4", "define-properties": "^1.2.0",
"es-abstract": "^1.20.4" "es-abstract": "^1.22.1"
}, },
"engines": { "engines": {
"node": ">= 0.4" "node": ">= 0.4"
@@ -5732,26 +5748,26 @@
} }
}, },
"node_modules/object.groupby": { "node_modules/object.groupby": {
"version": "1.0.0", "version": "1.0.1",
"resolved": "https://registry.npmjs.org/object.groupby/-/object.groupby-1.0.0.tgz", "resolved": "https://registry.npmjs.org/object.groupby/-/object.groupby-1.0.1.tgz",
"integrity": "sha512-70MWG6NfRH9GnbZOikuhPPYzpUpof9iW2J9E4dW7FXTqPNb6rllE6u39SKwwiNh8lCwX3DDb5OgcKGiEBrTTyw==", "integrity": "sha512-HqaQtqLnp/8Bn4GL16cj+CUYbnpe1bh0TtEaWvybszDG4tgxCJuRpV8VGuvNaI1fAnI4lUJzDG55MXcOH4JZcQ==",
"dev": true, "dev": true,
"dependencies": { "dependencies": {
"call-bind": "^1.0.2", "call-bind": "^1.0.2",
"define-properties": "^1.2.0", "define-properties": "^1.2.0",
"es-abstract": "^1.21.2", "es-abstract": "^1.22.1",
"get-intrinsic": "^1.2.1" "get-intrinsic": "^1.2.1"
} }
}, },
"node_modules/object.values": { "node_modules/object.values": {
"version": "1.1.6", "version": "1.1.7",
"resolved": "https://registry.npmjs.org/object.values/-/object.values-1.1.6.tgz", "resolved": "https://registry.npmjs.org/object.values/-/object.values-1.1.7.tgz",
"integrity": "sha512-FVVTkD1vENCsAcwNs9k6jea2uHC/X0+JcjG8YA60FN5CMaJmG95wT9jek/xX9nornqGRrBkKtzuAu2wuHpKqvw==", "integrity": "sha512-aU6xnDFYT3x17e/f0IiiwlGPTy2jzMySGfUB4fq6z7CV8l85CWHDk5ErhyhpfDHhrOMwGFhSQkhMGHaIotA6Ng==",
"dev": true, "dev": true,
"dependencies": { "dependencies": {
"call-bind": "^1.0.2", "call-bind": "^1.0.2",
"define-properties": "^1.1.4", "define-properties": "^1.2.0",
"es-abstract": "^1.20.4" "es-abstract": "^1.22.1"
}, },
"engines": { "engines": {
"node": ">= 0.4" "node": ">= 0.4"
@@ -6030,9 +6046,9 @@
} }
}, },
"node_modules/prettier": { "node_modules/prettier": {
"version": "3.0.2", "version": "3.0.3",
"resolved": "https://registry.npmjs.org/prettier/-/prettier-3.0.2.tgz", "resolved": "https://registry.npmjs.org/prettier/-/prettier-3.0.3.tgz",
"integrity": "sha512-o2YR9qtniXvwEZlOKbveKfDQVyqxbEIWn48Z8m3ZJjBjcCmUy3xZGIv+7AkaeuaTr6yPXJjwv07ZWlsWbEy1rQ==", "integrity": "sha512-L/4pUDMxcNa8R/EthV08Zt42WBO4h1rarVtK0K+QJG0X187OLo7l699jWw0GKuwzkPQ//jMFA/8Xm6Fh3J/DAg==",
"dev": true, "dev": true,
"bin": { "bin": {
"prettier": "bin/prettier.cjs" "prettier": "bin/prettier.cjs"
+7 -7
View File
@@ -43,20 +43,20 @@
}, },
"devDependencies": { "devDependencies": {
"@types/jest": "^29.5.4", "@types/jest": "^29.5.4",
"@types/node": "^20.5.6", "@types/node": "^20.5.7",
"@types/node-fetch": "^2.6.4", "@types/node-fetch": "^2.6.4",
"@types/semver": "^7.5.0", "@types/semver": "^7.5.1",
"@typescript-eslint/eslint-plugin": "^6.4.1", "@typescript-eslint/eslint-plugin": "^6.5.0",
"@typescript-eslint/parser": "^6.4.1", "@typescript-eslint/parser": "^6.5.0",
"@vercel/ncc": "^0.36.1", "@vercel/ncc": "^0.36.1",
"eslint": "^8.47.0", "eslint": "^8.48.0",
"eslint-plugin-github": "^4.9.2", "eslint-plugin-github": "^4.10.0",
"eslint-plugin-jest": "^27.2.3", "eslint-plugin-jest": "^27.2.3",
"eslint-plugin-prettier": "^5.0.0", "eslint-plugin-prettier": "^5.0.0",
"jest": "^29.6.4", "jest": "^29.6.4",
"jest-circus": "^29.6.4", "jest-circus": "^29.6.4",
"js-yaml": "^4.1.0", "js-yaml": "^4.1.0",
"prettier": "3.0.2", "prettier": "3.0.3",
"ts-jest": "^29.1.1", "ts-jest": "^29.1.1",
"typescript": "^5.2.2" "typescript": "^5.2.2"
} }
-2629
View File
File diff suppressed because it is too large Load Diff
-50
View File
@@ -1,50 +0,0 @@
{
"name": "pr-collector",
"version": "v1.2.0",
"description": "Library to fetch GitHub pull request between 2 tags/sha1 hashes.",
"main": "lib/prCollector.js",
"types": "lib/prCollector.d.ts",
"scripts": {
"build": "tsc",
"format": "prettier --write **/*.ts",
"format-check": "prettier --check **/*.ts",
"lint": "eslint src/**/*.ts",
"package": "ncc build --source-map --license licenses.txt",
"test": "jest --passWithNoTests",
"all": "npm run build && npm run format && npm run lint && npm run package && npm test"
},
"repository": {
"type": "git",
"url": "git+https://github.com/mikepenz/release-changelog-builder.git"
},
"keywords": [
"github",
"release",
"notes",
"change",
"pull-requests"
],
"author": "Mike Penz",
"license": "Apache 2.0",
"dependencies": {
"@actions/core": "^1.10.0",
"@actions/exec": "^1.1.1",
"@actions/github": "^5.1.1",
"@octokit/rest": "^20.0.1",
"https-proxy-agent": "^7.0.1",
"moment": "^2.29.4",
"node-fetch": "2.6.12",
"semver": "^7.5.4"
},
"devDependencies": {
"@types/node": "^20.5.6",
"@types/node-fetch": "^2.6.4",
"@types/semver": "^7.5.0",
"@typescript-eslint/eslint-plugin": "^6.4.1",
"@vercel/ncc": "^0.36.1",
"eslint-plugin-prettier": "^5.0.0",
"js-yaml": "^4.1.0",
"prettier": "3.0.2",
"typescript": "^5.2.2"
}
}
-14
View File
@@ -1,14 +0,0 @@
{
"compilerOptions": {
"target": "es6", /* Specify ECMAScript target version: 'ES3' (default), 'ES5', 'ES2015', 'ES2016', 'ES2017', 'ES2018', 'ES2019' or 'ESNEXT'. */
"module": "commonjs", /* Specify module code generation: 'none', 'commonjs', 'amd', 'system', 'umd', 'es2015', or 'ESNext'. */
"outDir": "./lib", /* Redirect output structure to the directory. */
"rootDir": "./src", /* Specify the root directory of input files. Use to control the output directory structure with --outDir. */
"strict": true, /* Enable all strict type-checking options. */
"noImplicitAny": true, /* Raise error on expressions and declarations with an implied 'any' type. */
"esModuleInterop": true, /* Enables emit interoperability between CommonJS and ES Modules via creation of namespace objects for all imports. Implies 'allowSyntheticDefaultImports'. */
"lib": [ "ES2021.String" ], /* Enable custom `ES2021.String` extension in typescript for `replaceAll` */
"declaration": true
},
"exclude": ["node_modules", "**/*.test.ts", "lib"]
}
+2 -2
View File
@@ -70,8 +70,8 @@ export const DefaultConfiguration: Configuration = {
order: 'ASC', // the sorting order order: 'ASC', // the sorting order
on_property: 'mergedAt' // the property to sort on. (mergedAt falls back to createdAt) on_property: 'mergedAt' // the property to sort on. (mergedAt falls back to createdAt)
}, },
template: '${{CHANGELOG}}', // the global template to host the changelog template: '#{{CHANGELOG}}', // the global template to host the changelog
pr_template: '- ${{TITLE}}\n - PR: #${{NUMBER}}', // the per PR template to pick pr_template: '- #{{TITLE}}\n - PR: ##{{NUMBER}}', // the per PR template to pick
empty_template: '- no changes', // the template to use if no pull requests are found empty_template: '- no changes', // the template to use if no pull requests are found
categories: [ categories: [
{ {
+6 -6
View File
@@ -456,7 +456,7 @@ function handlePlaceholder(
placeholderPrMap: Map<string, string[]> | undefined /* map to keep replaced placeholder values with their key */, placeholderPrMap: Map<string, string[]> | undefined /* map to keep replaced placeholder values with their key */,
configuration: Configuration configuration: Configuration
): string { ): string {
let transformed = template.replaceAll(`\${{${key}}}`, configuration.trim_values ? value.trim() : value) let transformed = template.replaceAll(`#{{${key}}}`, configuration.trim_values ? value.trim() : value)
// replace custom placeholders // replace custom placeholders
const phs = placeholders.get(key) const phs = placeholders.get(key)
if (phs) { if (phs) {
@@ -470,7 +470,7 @@ function handlePlaceholder(
createOrSet(placeholderPrMap, placeholder.name, extractedValue) createOrSet(placeholderPrMap, placeholder.name, extractedValue)
} }
transformed = transformed.replaceAll( transformed = transformed.replaceAll(
`\${{${placeholder.name}}}`, `#{{${placeholder.name}}}`,
configuration.trim_values ? extractedValue.trim() : extractedValue configuration.trim_values ? extractedValue.trim() : extractedValue
) )
@@ -542,9 +542,9 @@ function replacePrPlaceholders(
let transformed = template let transformed = template
for (const [key, values] of placeholderPrMap) { for (const [key, values] of placeholderPrMap) {
for (let i = 0; i < values.length; i++) { for (let i = 0; i < values.length; i++) {
transformed = transformed.replaceAll(`\${{${key}[${i}]}}`, configuration.trim_values ? values[i].trim() : values[i]) transformed = transformed.replaceAll(`#{{${key}[${i}]}}`, configuration.trim_values ? values[i].trim() : values[i])
} }
transformed = transformed.replaceAll(`\${{${key}[*]}}`, values.join('')) transformed = transformed.replaceAll(`#{{${key}[*]}}`, values.join(''))
} }
return transformed return transformed
} }
@@ -553,7 +553,7 @@ function cleanupPrPlaceholders(template: string, placeholders: Map<string, Place
let transformed = template let transformed = template
for (const [, phs] of placeholders) { for (const [, phs] of placeholders) {
for (const ph of phs) { for (const ph of phs) {
transformed = transformed.replaceAll(new RegExp(`\\$\\{\\{${ph.name}(?:\\[.+?\\])?\\}\\}`, 'gu'), '') transformed = transformed.replaceAll(new RegExp(`#\\{\\{${ph.name}(?:\\[.+?\\])?\\}\\}`, 'gu'), '')
} }
} }
return transformed return transformed
@@ -562,7 +562,7 @@ function cleanupPrPlaceholders(template: string, placeholders: Map<string, Place
function cleanupPlaceholders(template: string): string { function cleanupPlaceholders(template: string): string {
let transformed = template let transformed = template
for (const phs of ['REVIEWS', 'REFERENCED', 'ASSIGNEES', 'REVIEWERS', 'APPROVERS']) { for (const phs of ['REVIEWS', 'REFERENCED', 'ASSIGNEES', 'REVIEWERS', 'APPROVERS']) {
transformed = transformed.replaceAll(new RegExp(`\\$\\{\\{${phs}\\[.+?\\]\\..*?\\}\\}`, 'gu'), '') transformed = transformed.replaceAll(new RegExp(`#\\{\\{${phs}\\[.+?\\]\\..*?\\}\\}`, 'gu'), '')
} }
return transformed return transformed
} }
+1 -1
View File
@@ -153,7 +153,7 @@ function readConfiguration(filename: string): Configuration | undefined {
export function parseConfiguration(config: string): Configuration | undefined { export function parseConfiguration(config: string): Configuration | undefined {
try { try {
// for compatiblity with the `yml` file we require to use `#{{}}` instead of `${{}}` - replace it here. // for compatiblity with the `yml` file we require to use `#{{}}` instead of `${{}}` - replace it here.
const configurationJSON: Configuration = JSON.parse(config.replace(/#{{/g, '${{')) const configurationJSON: Configuration = JSON.parse(config.replace(/\${{/g, '#{{'))
return configurationJSON return configurationJSON
} catch (error) { } catch (error) {
core.info(`⚠️ Configuration provided, but it couldn't be parsed. Fallback to Defaults.`) core.info(`⚠️ Configuration provided, but it couldn't be parsed. Fallback to Defaults.`)