node-package-release-action 2.1.4 → 2.1.5

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1,45 @@
1
+ import js from '@eslint/js';
2
+ import { FlatCompat } from '@eslint/eslintrc';
3
+ import path from 'path';
4
+ import { fileURLToPath } from 'url';
5
+ import ts from 'typescript-eslint';
6
+
7
+ const __filename = fileURLToPath(import.meta.url);
8
+ const __dirname = path.dirname(__filename);
9
+
10
+ const compat = new FlatCompat({
11
+ baseDirectory: __dirname,
12
+ resolvePluginsRelativeTo: __dirname,
13
+ recommendedConfig: js.configs.recommended,
14
+ });
15
+
16
+ export default ts.config(
17
+ ...compat.config({
18
+ env: {
19
+ browser: true,
20
+ es2022: true,
21
+ node: true,
22
+ },
23
+ extends: ['eslint:recommended', 'plugin:prettier/recommended'],
24
+ parser: '@typescript-eslint/parser',
25
+ parserOptions: {
26
+ project: './tsconfig.json',
27
+ ecmaVersion: 'latest',
28
+ sourceType: 'module',
29
+ },
30
+ root: true,
31
+ rules: {},
32
+ ignorePatterns: [
33
+ 'node_modules/**/*',
34
+ 'lib/**/*',
35
+ 'dist/**/*',
36
+ 'eslint.config.js',
37
+ ],
38
+ overrides: [
39
+ {
40
+ files: ['*.ts'],
41
+ },
42
+ ],
43
+ }),
44
+ ...ts.configs.recommendedTypeChecked,
45
+ );
package/lib/checkDiff.js CHANGED
@@ -1,37 +1,26 @@
1
1
  "use strict";
2
- var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
3
- function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
4
- return new (P || (P = Promise))(function (resolve, reject) {
5
- function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
6
- function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
7
- function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
8
- step((generator = generator.apply(thisArg, _arguments || [])).next());
9
- });
10
- };
11
2
  Object.defineProperty(exports, "__esModule", { value: true });
12
3
  exports.checkDiff = void 0;
13
4
  const node_path_1 = require("node:path");
14
5
  const core_1 = require("@actions/core");
15
6
  const exec_1 = require("@actions/exec");
16
7
  const glob_1 = require("glob");
17
- function checkDiff(tag) {
18
- return __awaiter(this, void 0, void 0, function* () {
19
- const directory = (0, core_1.getInput)('directory');
20
- const diffTargets = (0, core_1.getInput)('diff-targets');
21
- const diffOutput = yield (0, exec_1.getExecOutput)('git', [
22
- 'diff',
23
- tag,
24
- '--name-only',
25
- '--',
26
- ...(0, glob_1.globSync)((0, node_path_1.join)(directory, diffTargets)),
27
- ]);
28
- (0, core_1.debug)(`Diff against ${tag}:` +
29
- '\n' +
30
- diffOutput.stdout
31
- .split('\n')
32
- .map((line) => ` ${line}`)
33
- .join('\n'));
34
- return diffOutput.stdout.split('\n').join('') !== '';
35
- });
8
+ async function checkDiff(tag) {
9
+ const directory = (0, core_1.getInput)('directory');
10
+ const diffTargets = (0, core_1.getInput)('diff-targets');
11
+ const diffOutput = await (0, exec_1.getExecOutput)('git', [
12
+ 'diff',
13
+ tag,
14
+ '--name-only',
15
+ '--',
16
+ ...(0, glob_1.globSync)((0, node_path_1.join)(directory, diffTargets)),
17
+ ]);
18
+ (0, core_1.debug)(`Diff against ${tag}:` +
19
+ '\n' +
20
+ diffOutput.stdout
21
+ .split('\n')
22
+ .map((line) => ` ${line}`)
23
+ .join('\n'));
24
+ return diffOutput.stdout.split('\n').join('') !== '';
36
25
  }
37
26
  exports.checkDiff = checkDiff;
package/lib/configGit.js CHANGED
@@ -1,43 +1,32 @@
1
1
  "use strict";
2
- var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
3
- function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
4
- return new (P || (P = Promise))(function (resolve, reject) {
5
- function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
6
- function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
7
- function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
8
- step((generator = generator.apply(thisArg, _arguments || [])).next());
9
- });
10
- };
11
2
  Object.defineProperty(exports, "__esModule", { value: true });
12
3
  exports.configGit = exports.GITHUB_ACTION_USER_EMAIL = exports.GITHUB_ACTION_USER_NAME = void 0;
13
4
  const core_1 = require("@actions/core");
14
5
  const exec_1 = require("@actions/exec");
15
6
  exports.GITHUB_ACTION_USER_NAME = 'GitHub Action';
16
7
  exports.GITHUB_ACTION_USER_EMAIL = '41898282+github-actions[bot]@users.noreply.github.com';
17
- function configGit() {
18
- return __awaiter(this, void 0, void 0, function* () {
19
- yield (0, exec_1.getExecOutput)('git', [
20
- 'config',
21
- '--global',
22
- 'user.name',
23
- exports.GITHUB_ACTION_USER_NAME,
24
- ]);
25
- yield (0, exec_1.getExecOutput)('git', [
26
- 'config',
27
- '--global',
28
- 'user.email',
29
- exports.GITHUB_ACTION_USER_EMAIL,
30
- ]);
31
- yield (0, exec_1.getExecOutput)('git', ['config', '--global', 'push.default', 'simple']);
32
- yield (0, exec_1.getExecOutput)('git', [
33
- 'config',
34
- '--global',
35
- 'push.autoSetupRemote',
36
- 'true',
37
- ]);
38
- const githubToken = (0, core_1.getInput)('github-token');
39
- (0, core_1.exportVariable)('GH_TOKEN', githubToken);
40
- yield (0, exec_1.getExecOutput)('gh', ['auth', 'setup-git']);
41
- });
8
+ async function configGit() {
9
+ await (0, exec_1.getExecOutput)('git', [
10
+ 'config',
11
+ '--global',
12
+ 'user.name',
13
+ exports.GITHUB_ACTION_USER_NAME,
14
+ ]);
15
+ await (0, exec_1.getExecOutput)('git', [
16
+ 'config',
17
+ '--global',
18
+ 'user.email',
19
+ exports.GITHUB_ACTION_USER_EMAIL,
20
+ ]);
21
+ await (0, exec_1.getExecOutput)('git', ['config', '--global', 'push.default', 'simple']);
22
+ await (0, exec_1.getExecOutput)('git', [
23
+ 'config',
24
+ '--global',
25
+ 'push.autoSetupRemote',
26
+ 'true',
27
+ ]);
28
+ const githubToken = (0, core_1.getInput)('github-token');
29
+ (0, core_1.exportVariable)('GH_TOKEN', githubToken);
30
+ await (0, exec_1.getExecOutput)('gh', ['auth', 'setup-git']);
42
31
  }
43
32
  exports.configGit = configGit;
@@ -1,39 +1,28 @@
1
1
  "use strict";
2
- var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
3
- function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
4
- return new (P || (P = Promise))(function (resolve, reject) {
5
- function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
6
- function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
7
- function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
8
- step((generator = generator.apply(thisArg, _arguments || [])).next());
9
- });
10
- };
11
2
  Object.defineProperty(exports, "__esModule", { value: true });
12
3
  exports.createRelease = void 0;
13
4
  const core_1 = require("@actions/core");
14
- function createRelease(owner, repo, version, octokit) {
15
- return __awaiter(this, void 0, void 0, function* () {
16
- const dryRun = (0, core_1.getBooleanInput)('dry-run');
17
- if (dryRun) {
18
- (0, core_1.notice)('Release creation is skipped in dry run');
19
- const response = yield octokit.rest.repos.generateReleaseNotes({
20
- owner,
21
- repo,
22
- tag_name: `v${version}`,
23
- name: `v${version}`,
24
- });
25
- (0, core_1.info)(`Release name: ${response.data.name}`);
26
- (0, core_1.info)('Release body:\n' + response.data.body + '\n\n');
27
- return;
28
- }
29
- yield octokit.rest.repos.createRelease({
5
+ async function createRelease(owner, repo, version, octokit) {
6
+ const dryRun = (0, core_1.getBooleanInput)('dry-run');
7
+ if (dryRun) {
8
+ (0, core_1.notice)('Release creation is skipped in dry run');
9
+ const response = await octokit.rest.repos.generateReleaseNotes({
30
10
  owner,
31
11
  repo,
32
12
  tag_name: `v${version}`,
33
13
  name: `v${version}`,
34
- generate_release_notes: true,
35
- prerelease: (0, core_1.getBooleanInput)('prerelease'),
36
14
  });
15
+ (0, core_1.info)(`Release name: ${response.data.name}`);
16
+ (0, core_1.info)('Release body:\n' + response.data.body + '\n\n');
17
+ return;
18
+ }
19
+ await octokit.rest.repos.createRelease({
20
+ owner,
21
+ repo,
22
+ tag_name: `v${version}`,
23
+ name: `v${version}`,
24
+ generate_release_notes: true,
25
+ prerelease: (0, core_1.getBooleanInput)('prerelease'),
37
26
  });
38
27
  }
39
28
  exports.createRelease = createRelease;
@@ -1,26 +1,15 @@
1
1
  "use strict";
2
- var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
3
- function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
4
- return new (P || (P = Promise))(function (resolve, reject) {
5
- function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
6
- function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
7
- function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
8
- step((generator = generator.apply(thisArg, _arguments || [])).next());
9
- });
10
- };
11
2
  Object.defineProperty(exports, "__esModule", { value: true });
12
3
  exports.fetchEverything = void 0;
13
4
  const exec_1 = require("@actions/exec");
14
- function fetchEverything() {
15
- return __awaiter(this, void 0, void 0, function* () {
16
- yield (0, exec_1.getExecOutput)('git', ['fetch', '--tags', 'origin']);
17
- const gitIsShallowRepositoryOutput = yield (0, exec_1.getExecOutput)('git', [
18
- 'rev-parse',
19
- '--is-shallow-repository',
20
- ]);
21
- if (gitIsShallowRepositoryOutput.stdout.trim() === 'true') {
22
- yield (0, exec_1.getExecOutput)('git', ['fetch', '--unshallow', 'origin']);
23
- }
24
- });
5
+ async function fetchEverything() {
6
+ await (0, exec_1.getExecOutput)('git', ['fetch', '--tags', 'origin']);
7
+ const gitIsShallowRepositoryOutput = await (0, exec_1.getExecOutput)('git', [
8
+ 'rev-parse',
9
+ '--is-shallow-repository',
10
+ ]);
11
+ if (gitIsShallowRepositoryOutput.stdout.trim() === 'true') {
12
+ await (0, exec_1.getExecOutput)('git', ['fetch', '--unshallow', 'origin']);
13
+ }
25
14
  }
26
15
  exports.fetchEverything = fetchEverything;
@@ -1,44 +1,33 @@
1
1
  "use strict";
2
- var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
3
- function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
4
- return new (P || (P = Promise))(function (resolve, reject) {
5
- function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
6
- function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
7
- function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
8
- step((generator = generator.apply(thisArg, _arguments || [])).next());
9
- });
10
- };
11
2
  Object.defineProperty(exports, "__esModule", { value: true });
12
3
  exports.findLastSameReleaseTypeVersion = void 0;
13
4
  const core_1 = require("@actions/core");
14
5
  const semver_1 = require("semver");
15
6
  const getAllGitTags_1 = require("./getAllGitTags");
16
- function findLastSameReleaseTypeVersion(releaseVersion, releaseType) {
17
- return __awaiter(this, void 0, void 0, function* () {
18
- const versionTags = yield (0, getAllGitTags_1.getAllGitTags)();
19
- if (versionTags.length === 0) {
20
- (0, core_1.warning)(`No tag found.`);
21
- return null;
22
- }
23
- const sortedTags = (0, semver_1.rsort)(versionTags);
24
- let candidateTag = sortedTags.shift();
25
- while (candidateTag !== undefined &&
26
- ((0, semver_1.gte)(candidateTag, releaseVersion) ||
27
- (0, semver_1.diff)(candidateTag, releaseVersion) !== releaseType)) {
28
- candidateTag = sortedTags.shift();
29
- }
30
- let cursorTag = candidateTag;
31
- while (cursorTag !== undefined &&
32
- (0, semver_1.diff)(cursorTag, releaseVersion) === releaseType &&
33
- (0, semver_1.inc)(cursorTag, releaseType) === releaseVersion) {
34
- candidateTag = cursorTag;
35
- cursorTag = sortedTags.shift();
36
- }
37
- if (candidateTag === undefined) {
38
- (0, core_1.warning)(`No tag found.`);
39
- return null;
40
- }
41
- return candidateTag;
42
- });
7
+ async function findLastSameReleaseTypeVersion(releaseVersion, releaseType) {
8
+ const versionTags = await (0, getAllGitTags_1.getAllGitTags)();
9
+ if (versionTags.length === 0) {
10
+ (0, core_1.warning)(`No tag found.`);
11
+ return null;
12
+ }
13
+ const sortedTags = (0, semver_1.rsort)(versionTags);
14
+ let candidateTag = sortedTags.shift();
15
+ while (candidateTag !== undefined &&
16
+ ((0, semver_1.gte)(candidateTag, releaseVersion) ||
17
+ (0, semver_1.diff)(candidateTag, releaseVersion) !== releaseType)) {
18
+ candidateTag = sortedTags.shift();
19
+ }
20
+ let cursorTag = candidateTag;
21
+ while (cursorTag !== undefined &&
22
+ (0, semver_1.diff)(cursorTag, releaseVersion) === releaseType &&
23
+ (0, semver_1.inc)(cursorTag, releaseType) === releaseVersion) {
24
+ candidateTag = cursorTag;
25
+ cursorTag = sortedTags.shift();
26
+ }
27
+ if (candidateTag === undefined) {
28
+ (0, core_1.warning)(`No tag found.`);
29
+ return null;
30
+ }
31
+ return candidateTag;
43
32
  }
44
33
  exports.findLastSameReleaseTypeVersion = findLastSameReleaseTypeVersion;
@@ -1,23 +1,12 @@
1
1
  "use strict";
2
- var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
3
- function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
4
- return new (P || (P = Promise))(function (resolve, reject) {
5
- function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
6
- function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
7
- function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
8
- step((generator = generator.apply(thisArg, _arguments || [])).next());
9
- });
10
- };
11
2
  Object.defineProperty(exports, "__esModule", { value: true });
12
3
  exports.getAllGitTags = void 0;
13
4
  const exec_1 = require("@actions/exec");
14
5
  const semver_1 = require("semver");
15
- function getAllGitTags() {
16
- return __awaiter(this, void 0, void 0, function* () {
17
- const tagOutput = yield (0, exec_1.getExecOutput)('git', ['tag']);
18
- const allTags = tagOutput.stdout.split('\n');
19
- const versionTags = allTags.filter((tag) => (0, semver_1.valid)(tag));
20
- return versionTags;
21
- });
6
+ async function getAllGitTags() {
7
+ const tagOutput = await (0, exec_1.getExecOutput)('git', ['tag']);
8
+ const allTags = tagOutput.stdout.split('\n');
9
+ const versionTags = allTags.filter((tag) => (0, semver_1.valid)(tag));
10
+ return versionTags;
22
11
  }
23
12
  exports.getAllGitTags = getAllGitTags;
@@ -1,28 +1,17 @@
1
1
  "use strict";
2
- var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
3
- function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
4
- return new (P || (P = Promise))(function (resolve, reject) {
5
- function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
6
- function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
7
- function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
8
- step((generator = generator.apply(thisArg, _arguments || [])).next());
9
- });
10
- };
11
2
  Object.defineProperty(exports, "__esModule", { value: true });
12
3
  exports.getLastGitTag = void 0;
13
4
  const core_1 = require("@actions/core");
14
5
  const semver_1 = require("semver");
15
6
  const getAllGitTags_1 = require("./getAllGitTags");
16
- function getLastGitTag() {
17
- return __awaiter(this, void 0, void 0, function* () {
18
- const versionTags = yield (0, getAllGitTags_1.getAllGitTags)();
19
- if (versionTags.length === 0) {
20
- (0, core_1.warning)(`No tag found.`);
21
- return null;
22
- }
23
- const sortedTags = (0, semver_1.rsort)(versionTags);
24
- const lastTag = sortedTags[0];
25
- return lastTag;
26
- });
7
+ async function getLastGitTag() {
8
+ const versionTags = await (0, getAllGitTags_1.getAllGitTags)();
9
+ if (versionTags.length === 0) {
10
+ (0, core_1.warning)(`No tag found.`);
11
+ return null;
12
+ }
13
+ const sortedTags = (0, semver_1.rsort)(versionTags);
14
+ const lastTag = sortedTags[0];
15
+ return lastTag;
27
16
  }
28
17
  exports.getLastGitTag = getLastGitTag;
@@ -1,64 +1,53 @@
1
1
  "use strict";
2
- var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
3
- function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
4
- return new (P || (P = Promise))(function (resolve, reject) {
5
- function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
6
- function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
7
- function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
8
- step((generator = generator.apply(thisArg, _arguments || [])).next());
9
- });
10
- };
11
2
  Object.defineProperty(exports, "__esModule", { value: true });
12
3
  exports.getLatestReleaseTag = void 0;
13
4
  const core_1 = require("@actions/core");
14
5
  const request_error_1 = require("@octokit/request-error");
15
6
  const semver_1 = require("semver");
16
- function getLatestReleaseTag(owner, repo, octokit) {
17
- return __awaiter(this, void 0, void 0, function* () {
18
- try {
19
- const latestReleaseResponse = yield octokit.rest.repos.getLatestRelease({
20
- owner,
21
- repo,
22
- });
23
- // Latest release doesn't include pre-release.
24
- const latestRelease = latestReleaseResponse.data;
25
- if ((0, semver_1.valid)(latestRelease.tag_name) !== null) {
26
- return latestRelease.tag_name;
27
- }
28
- else {
29
- (0, core_1.warning)(`Latest release tag is not a valid semver: ${latestRelease.tag_name}`);
30
- }
7
+ async function getLatestReleaseTag(owner, repo, octokit) {
8
+ try {
9
+ const latestReleaseResponse = await octokit.rest.repos.getLatestRelease({
10
+ owner,
11
+ repo,
12
+ });
13
+ // Latest release doesn't include pre-release.
14
+ const latestRelease = latestReleaseResponse.data;
15
+ if ((0, semver_1.valid)(latestRelease.tag_name) !== null) {
16
+ return latestRelease.tag_name;
17
+ }
18
+ else {
19
+ (0, core_1.warning)(`Latest release tag is not a valid semver: ${latestRelease.tag_name}`);
31
20
  }
32
- catch (error) {
33
- if (error instanceof request_error_1.RequestError) {
34
- if (error.status === 404) {
35
- (0, core_1.warning)(`Latest release not found but pre-release may exist`);
36
- }
37
- else {
38
- throw new Error(`Unexpected error: [${error.status}] ${error.message}`);
39
- }
21
+ }
22
+ catch (error) {
23
+ if (error instanceof request_error_1.RequestError) {
24
+ if (error.status === 404) {
25
+ (0, core_1.warning)(`Latest release not found but pre-release may exist`);
40
26
  }
41
27
  else {
42
- throw error;
28
+ throw new Error(`Unexpected error: [${error.status}] ${error.message}`);
43
29
  }
44
30
  }
45
- const releasesResponse = yield octokit.rest.repos.listReleases({
46
- owner,
47
- repo,
48
- });
49
- if (releasesResponse.data.length === 0) {
50
- (0, core_1.warning)(`No release found`);
51
- return null;
52
- }
53
- const releaseTags = releasesResponse.data.map((release) => release.tag_name);
54
- const validReleaseTags = releaseTags.filter((tag) => (0, semver_1.valid)(tag) !== null);
55
- if (validReleaseTags.length === 0) {
56
- (0, core_1.warning)(`No valid release tag found`);
57
- (0, core_1.debug)('Release tags:\n' + releaseTags.map((tag) => ` ${tag}`).join('\n'));
58
- return null;
31
+ else {
32
+ throw error;
59
33
  }
60
- const sortedReleaseTags = (0, semver_1.rsort)(validReleaseTags);
61
- return sortedReleaseTags[0];
34
+ }
35
+ const releasesResponse = await octokit.rest.repos.listReleases({
36
+ owner,
37
+ repo,
62
38
  });
39
+ if (releasesResponse.data.length === 0) {
40
+ (0, core_1.warning)(`No release found`);
41
+ return null;
42
+ }
43
+ const releaseTags = releasesResponse.data.map((release) => release.tag_name);
44
+ const validReleaseTags = releaseTags.filter((tag) => (0, semver_1.valid)(tag) !== null);
45
+ if (validReleaseTags.length === 0) {
46
+ (0, core_1.warning)(`No valid release tag found`);
47
+ (0, core_1.debug)('Release tags:\n' + releaseTags.map((tag) => ` ${tag}`).join('\n'));
48
+ return null;
49
+ }
50
+ const sortedReleaseTags = (0, semver_1.rsort)(validReleaseTags);
51
+ return sortedReleaseTags[0];
63
52
  }
64
53
  exports.getLatestReleaseTag = getLatestReleaseTag;
package/lib/getOctokit.js CHANGED
@@ -10,8 +10,8 @@ function getOctokit() {
10
10
  const Octokit = utils_1.GitHub.plugin(plugin_throttling_1.throttling, plugin_retry_1.retry);
11
11
  const octokit = new Octokit((0, utils_1.getOctokitOptions)(githubToken, {
12
12
  throttle: {
13
- onRateLimit: (retryAfter, options) => {
14
- if (options.request.retryCount === 0) {
13
+ onRateLimit: (retryAfter, options, _, retryCount) => {
14
+ if (retryCount === 0) {
15
15
  octokit.log.warn(`Request quota exhausted for request ${options.method} ${options.url}`);
16
16
  octokit.log.info(`Retrying after ${retryAfter} seconds!`);
17
17
  return true;
@@ -20,8 +20,8 @@ function getOctokit() {
20
20
  octokit.log.error(`Request quota exhausted for request ${options.method} ${options.url}`);
21
21
  }
22
22
  },
23
- onSecondaryRateLimit: (retryAfter, options) => {
24
- if (options.request.retryCount === 0) {
23
+ onSecondaryRateLimit: (retryAfter, options, _, retryCount) => {
24
+ if (retryCount === 0) {
25
25
  octokit.log.warn(`Abuse detected for request ${options.method} ${options.url}`);
26
26
  octokit.log.info(`Retrying after ${retryAfter} seconds!`);
27
27
  return true;
@@ -1,2 +1,2 @@
1
1
  export declare const DEFAULT_WORKING_DIRECTORY: string;
2
- export declare function getPackageVersion(): Promise<string | null>;
2
+ export declare function getPackageVersion(): string | null;
@@ -1,13 +1,4 @@
1
1
  "use strict";
2
- var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
3
- function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
4
- return new (P || (P = Promise))(function (resolve, reject) {
5
- function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
6
- function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
7
- function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
8
- step((generator = generator.apply(thisArg, _arguments || [])).next());
9
- });
10
- };
11
2
  Object.defineProperty(exports, "__esModule", { value: true });
12
3
  exports.getPackageVersion = exports.DEFAULT_WORKING_DIRECTORY = void 0;
13
4
  const module_1 = require("module");
@@ -16,18 +7,16 @@ const node_path_1 = require("node:path");
16
7
  const core_1 = require("@actions/core");
17
8
  exports.DEFAULT_WORKING_DIRECTORY = process.cwd();
18
9
  function getPackageVersion() {
19
- return __awaiter(this, void 0, void 0, function* () {
20
- const directory = (0, core_1.getInput)('directory');
21
- const absoluteDirectory = (0, node_path_1.resolve)(exports.DEFAULT_WORKING_DIRECTORY, directory);
22
- const packageJsonPath = (0, node_path_1.resolve)(absoluteDirectory, 'package.json');
23
- if (!(0, node_fs_1.existsSync)(packageJsonPath)) {
24
- (0, core_1.warning)(`package.json cannot be found at ${packageJsonPath}`);
25
- return null;
26
- }
27
- const require = (0, module_1.createRequire)(absoluteDirectory);
28
- (0, core_1.notice)(`Using package.json from: ${packageJsonPath}`);
29
- const { version } = require(packageJsonPath);
30
- return String(version);
31
- });
10
+ const directory = (0, core_1.getInput)('directory');
11
+ const absoluteDirectory = (0, node_path_1.resolve)(exports.DEFAULT_WORKING_DIRECTORY, directory);
12
+ const packageJsonPath = (0, node_path_1.resolve)(absoluteDirectory, 'package.json');
13
+ if (!(0, node_fs_1.existsSync)(packageJsonPath)) {
14
+ (0, core_1.warning)(`package.json cannot be found at ${packageJsonPath}`);
15
+ return null;
16
+ }
17
+ const require = (0, module_1.createRequire)(absoluteDirectory);
18
+ (0, core_1.notice)(`Using package.json from: ${packageJsonPath}`);
19
+ const { version } = require(packageJsonPath);
20
+ return String(version);
32
21
  }
33
22
  exports.getPackageVersion = getPackageVersion;
package/lib/index.js CHANGED
@@ -1,13 +1,4 @@
1
1
  "use strict";
2
- var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
3
- function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
4
- return new (P || (P = Promise))(function (resolve, reject) {
5
- function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
6
- function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
7
- function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
8
- step((generator = generator.apply(thisArg, _arguments || [])).next());
9
- });
10
- };
11
2
  Object.defineProperty(exports, "__esModule", { value: true });
12
3
  const core_1 = require("@actions/core");
13
4
  const github_1 = require("@actions/github");
@@ -26,53 +17,51 @@ const pushBranch_1 = require("./pushBranch");
26
17
  const setVersion_1 = require("./setVersion");
27
18
  const updateTags_1 = require("./updateTags");
28
19
  const DEFAULT_VERSION = '0.1.0';
29
- function run() {
30
- return __awaiter(this, void 0, void 0, function* () {
31
- yield (0, configGit_1.configGit)();
32
- yield (0, fetchEverything_1.fetchEverything)();
33
- const lastGitTag = yield (0, getLastGitTag_1.getLastGitTag)();
34
- (0, core_1.notice)(`Last git tag: ${lastGitTag}`);
35
- const packageVersion = yield (0, getPackageVersion_1.getPackageVersion)();
36
- (0, core_1.notice)(`package.json version: ${packageVersion}`);
37
- const { owner, repo } = github_1.context.repo;
38
- const octokit = (0, getOctokit_1.getOctokit)();
39
- const latestReleaseTag = yield (0, getLatestReleaseTag_1.getLatestReleaseTag)(owner, repo, octokit);
40
- (0, core_1.notice)(`Latest release tag: ${latestReleaseTag}`);
41
- const versions = [lastGitTag, packageVersion, latestReleaseTag].flatMap((version) => (version === null ? [] : [version]));
42
- const sortedVersions = (0, semver_1.rsort)(versions);
43
- const highestVersion = sortedVersions.length === 0 ? DEFAULT_VERSION : sortedVersions[0];
44
- (0, core_1.notice)(`Highest version: ${highestVersion}`);
45
- const releaseType = ReleaseType_1.RELEASE_TYPES.find((releaseType) => (0, core_1.getInput)('release-type').toLowerCase() === releaseType);
46
- if (releaseType === undefined) {
47
- (0, core_1.setFailed)(`Invalid release-type input: ${(0, core_1.getInput)('release-type')}`);
48
- return;
49
- }
50
- const releaseVersion = (0, semver_1.inc)(highestVersion, releaseType);
51
- if (releaseVersion === null) {
52
- (0, core_1.setFailed)('Failed to compute release version');
53
- return;
54
- }
55
- (0, core_1.notice)(`Release version: ${releaseVersion}`);
56
- if ((0, core_1.getBooleanInput)('skip-if-no-diff')) {
57
- const lastSameReleaseTypeVersion = yield (0, findLastSameReleaseTypeVersion_1.findLastSameReleaseTypeVersion)(releaseVersion, releaseType);
58
- (0, core_1.notice)(`Last same release type version: ${lastSameReleaseTypeVersion}`);
59
- if (lastSameReleaseTypeVersion !== null) {
60
- const diff = yield (0, checkDiff_1.checkDiff)(lastSameReleaseTypeVersion);
61
- if (!diff) {
62
- (0, core_1.notice)(`Skip due to lack of diff between HEAD..${lastSameReleaseTypeVersion}`);
63
- (0, core_1.setOutput)('skipped', true);
64
- return;
65
- }
20
+ async function run() {
21
+ await (0, configGit_1.configGit)();
22
+ await (0, fetchEverything_1.fetchEverything)();
23
+ const lastGitTag = await (0, getLastGitTag_1.getLastGitTag)();
24
+ (0, core_1.notice)(`Last git tag: ${lastGitTag}`);
25
+ const packageVersion = (0, getPackageVersion_1.getPackageVersion)();
26
+ (0, core_1.notice)(`package.json version: ${packageVersion}`);
27
+ const { owner, repo } = github_1.context.repo;
28
+ const octokit = (0, getOctokit_1.getOctokit)();
29
+ const latestReleaseTag = await (0, getLatestReleaseTag_1.getLatestReleaseTag)(owner, repo, octokit);
30
+ (0, core_1.notice)(`Latest release tag: ${latestReleaseTag}`);
31
+ const versions = [lastGitTag, packageVersion, latestReleaseTag].flatMap((version) => (version === null ? [] : [version]));
32
+ const sortedVersions = (0, semver_1.rsort)(versions);
33
+ const highestVersion = sortedVersions.length === 0 ? DEFAULT_VERSION : sortedVersions[0];
34
+ (0, core_1.notice)(`Highest version: ${highestVersion}`);
35
+ const releaseType = ReleaseType_1.RELEASE_TYPES.find((releaseType) => (0, core_1.getInput)('release-type').toLowerCase() === releaseType);
36
+ if (releaseType === undefined) {
37
+ (0, core_1.setFailed)(`Invalid release-type input: ${(0, core_1.getInput)('release-type')}`);
38
+ return;
39
+ }
40
+ const releaseVersion = (0, semver_1.inc)(highestVersion, releaseType);
41
+ if (releaseVersion === null) {
42
+ (0, core_1.setFailed)('Failed to compute release version');
43
+ return;
44
+ }
45
+ (0, core_1.notice)(`Release version: ${releaseVersion}`);
46
+ if ((0, core_1.getBooleanInput)('skip-if-no-diff')) {
47
+ const lastSameReleaseTypeVersion = await (0, findLastSameReleaseTypeVersion_1.findLastSameReleaseTypeVersion)(releaseVersion, releaseType);
48
+ (0, core_1.notice)(`Last same release type version: ${lastSameReleaseTypeVersion}`);
49
+ if (lastSameReleaseTypeVersion !== null) {
50
+ const diff = await (0, checkDiff_1.checkDiff)(lastSameReleaseTypeVersion);
51
+ if (!diff) {
52
+ (0, core_1.notice)(`Skip due to lack of diff between HEAD..${lastSameReleaseTypeVersion}`);
53
+ (0, core_1.setOutput)('skipped', true);
54
+ return;
66
55
  }
67
- (0, core_1.setOutput)('skipped', false);
68
- }
69
- (0, core_1.setOutput)('tag', `v${releaseVersion}`);
70
- yield (0, setVersion_1.setVersion)(releaseVersion);
71
- yield (0, pushBranch_1.pushBranch)();
72
- yield (0, createRelease_1.createRelease)(owner, repo, releaseVersion, octokit);
73
- if ((0, core_1.getBooleanInput)('update-shorthand-release')) {
74
- (0, updateTags_1.updateTags)(releaseVersion);
75
56
  }
76
- });
57
+ (0, core_1.setOutput)('skipped', false);
58
+ }
59
+ (0, core_1.setOutput)('tag', `v${releaseVersion}`);
60
+ await (0, setVersion_1.setVersion)(releaseVersion);
61
+ await (0, pushBranch_1.pushBranch)();
62
+ await (0, createRelease_1.createRelease)(owner, repo, releaseVersion, octokit);
63
+ if ((0, core_1.getBooleanInput)('update-shorthand-release')) {
64
+ await (0, updateTags_1.updateTags)(releaseVersion);
65
+ }
77
66
  }
78
- run();
67
+ run().catch((error) => (0, core_1.setFailed)(error));
package/lib/pushBranch.js CHANGED
@@ -1,36 +1,25 @@
1
1
  "use strict";
2
- var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
3
- function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
4
- return new (P || (P = Promise))(function (resolve, reject) {
5
- function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
6
- function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
7
- function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
8
- step((generator = generator.apply(thisArg, _arguments || [])).next());
9
- });
10
- };
11
2
  Object.defineProperty(exports, "__esModule", { value: true });
12
3
  exports.pushBranch = void 0;
13
4
  const core_1 = require("@actions/core");
14
5
  const exec_1 = require("@actions/exec");
15
- function pushBranch() {
16
- return __awaiter(this, void 0, void 0, function* () {
17
- const dryRun = (0, core_1.getBooleanInput)('dry-run');
18
- const gitBranchOutput = yield (0, exec_1.getExecOutput)('git', [
19
- 'branch',
20
- '--show-current',
21
- ]);
22
- const branchName = gitBranchOutput.stdout;
23
- if (branchName === '') {
24
- (0, core_1.error)(`No branch detected`);
25
- (0, core_1.error)(`Did you forget to set the ref input in the actions/checkout Action?`);
26
- throw new Error(`No branch detected`);
27
- }
28
- (0, core_1.notice)(`Current branch: ${branchName}`);
29
- yield (0, exec_1.getExecOutput)('git', [
30
- 'push',
31
- '--follow-tags',
32
- ...(dryRun ? ['--dry-run'] : []),
33
- ]);
34
- });
6
+ async function pushBranch() {
7
+ const dryRun = (0, core_1.getBooleanInput)('dry-run');
8
+ const gitBranchOutput = await (0, exec_1.getExecOutput)('git', [
9
+ 'branch',
10
+ '--show-current',
11
+ ]);
12
+ const branchName = gitBranchOutput.stdout;
13
+ if (branchName === '') {
14
+ (0, core_1.error)(`No branch detected`);
15
+ (0, core_1.error)(`Did you forget to set the ref input in the actions/checkout Action?`);
16
+ throw new Error(`No branch detected`);
17
+ }
18
+ (0, core_1.notice)(`Current branch: ${branchName}`);
19
+ await (0, exec_1.getExecOutput)('git', [
20
+ 'push',
21
+ '--follow-tags',
22
+ ...(dryRun ? ['--dry-run'] : []),
23
+ ]);
35
24
  }
36
25
  exports.pushBranch = pushBranch;
package/lib/setVersion.js CHANGED
@@ -1,13 +1,4 @@
1
1
  "use strict";
2
- var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
3
- function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
4
- return new (P || (P = Promise))(function (resolve, reject) {
5
- function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
6
- function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
7
- function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
8
- step((generator = generator.apply(thisArg, _arguments || [])).next());
9
- });
10
- };
11
2
  Object.defineProperty(exports, "__esModule", { value: true });
12
3
  exports.setVersion = exports.DEFAULT_WORKING_DIRECTORY = void 0;
13
4
  const node_fs_1 = require("node:fs");
@@ -15,18 +6,16 @@ const node_path_1 = require("node:path");
15
6
  const core_1 = require("@actions/core");
16
7
  const exec_1 = require("@actions/exec");
17
8
  exports.DEFAULT_WORKING_DIRECTORY = process.cwd();
18
- function setVersion(version) {
19
- return __awaiter(this, void 0, void 0, function* () {
20
- const directory = (0, core_1.getInput)('directory');
21
- const absoluteDirectory = (0, node_path_1.resolve)(exports.DEFAULT_WORKING_DIRECTORY, directory);
22
- const packageJsonPath = (0, node_path_1.resolve)(absoluteDirectory, 'package.json');
23
- if ((0, node_fs_1.existsSync)(packageJsonPath)) {
24
- yield (0, exec_1.getExecOutput)('npm', ['version', version]);
25
- }
26
- else {
27
- yield (0, exec_1.getExecOutput)('git', ['tag', `v${version}`]);
28
- }
29
- (0, core_1.notice)(`Tag created: v${version}`);
30
- });
9
+ async function setVersion(version) {
10
+ const directory = (0, core_1.getInput)('directory');
11
+ const absoluteDirectory = (0, node_path_1.resolve)(exports.DEFAULT_WORKING_DIRECTORY, directory);
12
+ const packageJsonPath = (0, node_path_1.resolve)(absoluteDirectory, 'package.json');
13
+ if ((0, node_fs_1.existsSync)(packageJsonPath)) {
14
+ await (0, exec_1.getExecOutput)('npm', ['version', version]);
15
+ }
16
+ else {
17
+ await (0, exec_1.getExecOutput)('git', ['tag', `v${version}`]);
18
+ }
19
+ (0, core_1.notice)(`Tag created: v${version}`);
31
20
  }
32
21
  exports.setVersion = setVersion;
package/lib/updateTags.js CHANGED
@@ -1,53 +1,42 @@
1
1
  "use strict";
2
- var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
3
- function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
4
- return new (P || (P = Promise))(function (resolve, reject) {
5
- function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
6
- function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
7
- function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
8
- step((generator = generator.apply(thisArg, _arguments || [])).next());
9
- });
10
- };
11
2
  Object.defineProperty(exports, "__esModule", { value: true });
12
3
  exports.updateTags = void 0;
13
4
  const core_1 = require("@actions/core");
14
5
  const exec_1 = require("@actions/exec");
15
6
  const semver_1 = require("semver");
16
- function updateTags(version) {
17
- return __awaiter(this, void 0, void 0, function* () {
18
- const semver = (0, semver_1.parse)(version);
19
- const dryRun = (0, core_1.getBooleanInput)('dry-run');
20
- if (semver === null) {
21
- throw new Error(`Failed to parse the version as semver: ${version}`);
22
- }
23
- if (semver.prerelease.length !== 0) {
24
- (0, core_1.warning)(`Pre-release version should not be used to update shorthand tags: ${version}` +
25
- "\nPlease don't set release-type to prerelease and update-shorthand-release to true at the same time");
26
- }
27
- if (semver.major > 0) {
28
- yield (0, exec_1.getExecOutput)('git', ['tag', '-f', `v${semver.major}`]);
29
- (0, core_1.notice)(`Tag updated: v${semver.major}`);
30
- }
31
- else {
32
- (0, core_1.warning)(`Tag v0 is not allowed so it's not updated`);
33
- }
34
- if (semver.major > 0 || semver.minor > 0) {
35
- yield (0, exec_1.getExecOutput)('git', [
36
- 'tag',
37
- '-f',
38
- `v${semver.major}.${semver.minor}`,
39
- ]);
40
- (0, core_1.notice)(`Tag updated: v${semver.major}.${semver.minor}`);
41
- }
42
- else {
43
- (0, core_1.warning)(`Tag v0.0 is not allowed so it's not updated`);
44
- }
45
- yield (0, exec_1.getExecOutput)('git', [
46
- 'push',
7
+ async function updateTags(version) {
8
+ const semver = (0, semver_1.parse)(version);
9
+ const dryRun = (0, core_1.getBooleanInput)('dry-run');
10
+ if (semver === null) {
11
+ throw new Error(`Failed to parse the version as semver: ${version}`);
12
+ }
13
+ if (semver.prerelease.length !== 0) {
14
+ (0, core_1.warning)(`Pre-release version should not be used to update shorthand tags: ${version}` +
15
+ "\nPlease don't set release-type to prerelease and update-shorthand-release to true at the same time");
16
+ }
17
+ if (semver.major > 0) {
18
+ await (0, exec_1.getExecOutput)('git', ['tag', '-f', `v${semver.major}`]);
19
+ (0, core_1.notice)(`Tag updated: v${semver.major}`);
20
+ }
21
+ else {
22
+ (0, core_1.warning)(`Tag v0 is not allowed so it's not updated`);
23
+ }
24
+ if (semver.major > 0 || semver.minor > 0) {
25
+ await (0, exec_1.getExecOutput)('git', [
26
+ 'tag',
47
27
  '-f',
48
- '--tags',
49
- ...(dryRun ? ['--dry-run'] : []),
28
+ `v${semver.major}.${semver.minor}`,
50
29
  ]);
51
- });
30
+ (0, core_1.notice)(`Tag updated: v${semver.major}.${semver.minor}`);
31
+ }
32
+ else {
33
+ (0, core_1.warning)(`Tag v0.0 is not allowed so it's not updated`);
34
+ }
35
+ await (0, exec_1.getExecOutput)('git', [
36
+ 'push',
37
+ '-f',
38
+ '--tags',
39
+ ...(dryRun ? ['--dry-run'] : []),
40
+ ]);
52
41
  }
53
42
  exports.updateTags = updateTags;
package/package.json CHANGED
@@ -1,15 +1,15 @@
1
1
  {
2
2
  "name": "node-package-release-action",
3
- "version": "2.1.4",
3
+ "version": "2.1.5",
4
4
  "description": "A template to create custom GitHub Action with TypeScript/JavaScript.",
5
5
  "main": "lib/index.js",
6
6
  "types": "lib/index.d.js",
7
7
  "type": "module",
8
8
  "scripts": {
9
- "build": "yarn tsc",
10
- "package": "yarn ncc build src/index.ts --external eslint --source-map --license licenses.txt",
9
+ "build": "rm -rf lib && yarn tsc",
10
+ "package": "rm -rf dist && yarn ncc build src/index.ts --external eslint --source-map --license licenses.txt",
11
11
  "test": "echo \"Error: no test specified\" && exit 1",
12
- "lint": "eslint -c .eslintrc.json src",
12
+ "lint": "eslint -c eslint.config.js",
13
13
  "preversion": "rm -rf lib && rm -rf dist && yarn && yarn build && yarn package"
14
14
  },
15
15
  "repository": {
@@ -24,6 +24,8 @@
24
24
  "homepage": "https://github.com/CatChen/node-package-release-action#readme",
25
25
  "funding": "https://github.com/CatChen/node-package-release-action?sponsor=1",
26
26
  "devDependencies": {
27
+ "@eslint/eslintrc": "^3.0.2",
28
+ "@eslint/js": "^9.1.1",
27
29
  "@octokit/graphql-schema": "^15.1.2",
28
30
  "@octokit/webhooks-definitions": "^3.67.3",
29
31
  "@serverless-guru/prettier-plugin-import-order": "^0.4.1",
@@ -33,23 +35,27 @@
33
35
  "@typescript-eslint/eslint-plugin": "^7.1.1",
34
36
  "@typescript-eslint/parser": "^7.1.1",
35
37
  "@vercel/ncc": "^0.38.0",
36
- "eslint": "^8.27.0",
38
+ "eslint": "^9.1.1",
37
39
  "eslint-config-prettier": "^9.0.0",
38
40
  "eslint-plugin-prettier": "5",
39
41
  "husky": "^9.0.11",
40
42
  "lint-staged": "^15.0.2",
41
43
  "prettier": "^3.0.2",
42
- "typescript": "^5.0.2"
44
+ "typescript": "^5.0.2",
45
+ "typescript-eslint": "^7.8.0"
43
46
  },
44
47
  "dependencies": {
45
48
  "@actions/core": "^1.10.0",
46
49
  "@actions/exec": "^1.1.1",
47
50
  "@actions/github": "^6.0.0",
48
51
  "@octokit/plugin-retry": "^6.0.1",
49
- "@octokit/plugin-throttling": "^5.0.1",
52
+ "@octokit/plugin-throttling": "^8.2.0",
50
53
  "glob": "^10.2.3",
51
54
  "semver": "^7.3.8"
52
55
  },
56
+ "resolutions": {
57
+ "strip-ansi": "6.0.1"
58
+ },
53
59
  "lint-staged": {
54
60
  "*.(ts,js)": "yarn lint --fix",
55
61
  "*.json": "yarn prettier -w",