fork-version 4.0.0 → 4.1.1
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.
- package/CHANGELOG.md +21 -0
- package/README.md +18 -0
- package/dist/{chunk-4NLPWDCQ.js → chunk-35VBEKVS.js} +67 -5
- package/dist/chunk-35VBEKVS.js.map +1 -0
- package/dist/{chunk-2VYOEMMB.cjs → chunk-DZKKCJU5.cjs} +67 -5
- package/dist/chunk-DZKKCJU5.cjs.map +1 -0
- package/dist/cli.cjs +9 -9
- package/dist/cli.js +1 -1
- package/dist/index.cjs +19 -19
- package/dist/index.d.cts +3 -0
- package/dist/index.d.ts +3 -0
- package/dist/index.js +1 -1
- package/package.json +1 -1
- package/dist/chunk-2VYOEMMB.cjs.map +0 -1
- package/dist/chunk-4NLPWDCQ.js.map +0 -1
package/CHANGELOG.md
CHANGED
|
@@ -1,5 +1,26 @@
|
|
|
1
1
|
# Fork Version
|
|
2
2
|
|
|
3
|
+
## [4.1.1](https://github.com/eglavin/fork-version/compare/v4.1.0...v4.1.1) (2026-03-07)
|
|
4
|
+
|
|
5
|
+
|
|
6
|
+
### Refactor
|
|
7
|
+
|
|
8
|
+
* log count of reverts and merges and change labels of changes ([02f6fb0](https://github.com/eglavin/fork-version/commit/02f6fb0373b566fdb96380c6e6f233538584e504))
|
|
9
|
+
|
|
10
|
+
|
|
11
|
+
## [4.1.0](https://github.com/eglavin/fork-version/compare/v4.0.0...v4.1.0) (2026-03-05)
|
|
12
|
+
|
|
13
|
+
|
|
14
|
+
### Features
|
|
15
|
+
|
|
16
|
+
* add support for xml install shield product versions ([cd78383](https://github.com/eglavin/fork-version/commit/cd7838358bccb091dd593fe3edd363e8edcf21fc))
|
|
17
|
+
|
|
18
|
+
|
|
19
|
+
### Docs
|
|
20
|
+
|
|
21
|
+
* update readme ([71d7a15](https://github.com/eglavin/fork-version/commit/71d7a15f63503aa7e90fbb89a45ea5555080bef5))
|
|
22
|
+
|
|
23
|
+
|
|
3
24
|
## [4.0.0](https://github.com/eglavin/fork-version/compare/v3.1.4...v4.0.0) (2026-03-04)
|
|
4
25
|
|
|
5
26
|
|
package/README.md
CHANGED
|
@@ -434,6 +434,7 @@ Adds a suffix to the end of the release message, useful to add a `[skip ci]` mes
|
|
|
434
434
|
- [Plain Text](#plain-text)
|
|
435
435
|
- [MS Build](#ms-build)
|
|
436
436
|
- [ARM Bicep](#arm-bicep)
|
|
437
|
+
- [Install Shield ISM](#install-shield-ism)
|
|
437
438
|
|
|
438
439
|
#### Json Package
|
|
439
440
|
|
|
@@ -492,6 +493,23 @@ metadata contentVersion = '1.2.3.4'
|
|
|
492
493
|
var contentVersion string = '1.2.3.4'
|
|
493
494
|
```
|
|
494
495
|
|
|
496
|
+
#### Install Shield ISM
|
|
497
|
+
|
|
498
|
+
An Install Shield `*.ism` file can be either binary or an xml file. Fork-Version only supports the xml version.
|
|
499
|
+
|
|
500
|
+
```xml
|
|
501
|
+
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
|
|
502
|
+
<?xml-stylesheet type="text/xsl" href="is.xsl" ?>
|
|
503
|
+
<!DOCTYPE msi [...]>
|
|
504
|
+
<msi version="2.0" xmlns:dt="urn:schemas-microsoft-com:datatypes">
|
|
505
|
+
|
|
506
|
+
<table name="Property">
|
|
507
|
+
<row><td>ProductVersion</td><td>1.2.3</td><td/></row>
|
|
508
|
+
</table>
|
|
509
|
+
|
|
510
|
+
</msi>
|
|
511
|
+
```
|
|
512
|
+
|
|
495
513
|
#### Custom File Updater's
|
|
496
514
|
|
|
497
515
|
`TODO` [add support for custom file readers and writers through config #5](https://github.com/eglavin/fork-version/issues/5)
|
|
@@ -1096,6 +1096,49 @@ var ARMBicep = class {
|
|
|
1096
1096
|
return fileName.endsWith(".bicep");
|
|
1097
1097
|
}
|
|
1098
1098
|
};
|
|
1099
|
+
var InstallShieldISM = class {
|
|
1100
|
+
constructor(config, logger) {
|
|
1101
|
+
this.config = config;
|
|
1102
|
+
this.logger = logger;
|
|
1103
|
+
}
|
|
1104
|
+
read(fileName) {
|
|
1105
|
+
const filePath = resolve(this.config.path, fileName);
|
|
1106
|
+
if (fileExists(filePath)) {
|
|
1107
|
+
const fileContents = readFileSync(filePath, "utf8");
|
|
1108
|
+
const $ = cheerio.load(fileContents, {
|
|
1109
|
+
xmlMode: true,
|
|
1110
|
+
xml: { decodeEntities: false }
|
|
1111
|
+
});
|
|
1112
|
+
const version = $('msi > table[name="Property"] > row > td:contains("ProductVersion")').next().text().trim();
|
|
1113
|
+
if (version) {
|
|
1114
|
+
return {
|
|
1115
|
+
name: fileName,
|
|
1116
|
+
path: filePath,
|
|
1117
|
+
version
|
|
1118
|
+
};
|
|
1119
|
+
}
|
|
1120
|
+
this.logger.warn(`[File Manager] Unable to determine InstallShield ISM version: ${fileName}`);
|
|
1121
|
+
}
|
|
1122
|
+
}
|
|
1123
|
+
write(fileState, newVersion) {
|
|
1124
|
+
const fileContents = readFileSync(fileState.path, "utf8");
|
|
1125
|
+
const $ = cheerio.load(fileContents, {
|
|
1126
|
+
xmlMode: true,
|
|
1127
|
+
xml: { decodeEntities: false }
|
|
1128
|
+
});
|
|
1129
|
+
const versionCell = $(
|
|
1130
|
+
'msi > table[name="Property"] > row > td:contains("ProductVersion")'
|
|
1131
|
+
).next();
|
|
1132
|
+
if (versionCell.length > 0) {
|
|
1133
|
+
versionCell.text(newVersion);
|
|
1134
|
+
}
|
|
1135
|
+
const updatedContent = $.xml().replaceAll('"/>', '" />');
|
|
1136
|
+
writeFileSync(fileState.path, updatedContent, "utf8");
|
|
1137
|
+
}
|
|
1138
|
+
isSupportedFile(fileName) {
|
|
1139
|
+
return fileName.endsWith(".ism");
|
|
1140
|
+
}
|
|
1141
|
+
};
|
|
1099
1142
|
|
|
1100
1143
|
// src/files/file-manager.ts
|
|
1101
1144
|
var FileManager = class {
|
|
@@ -1107,12 +1150,14 @@ var FileManager = class {
|
|
|
1107
1150
|
this.PlainText = new PlainText(config, logger);
|
|
1108
1151
|
this.MSBuildProject = new MSBuildProject(config, logger);
|
|
1109
1152
|
this.ARMBicep = new ARMBicep(config, logger);
|
|
1153
|
+
this.InstallShieldISM = new InstallShieldISM(config, logger);
|
|
1110
1154
|
}
|
|
1111
1155
|
JSONPackage;
|
|
1112
1156
|
YAMLPackage;
|
|
1113
1157
|
PlainText;
|
|
1114
1158
|
MSBuildProject;
|
|
1115
1159
|
ARMBicep;
|
|
1160
|
+
InstallShieldISM;
|
|
1116
1161
|
/**
|
|
1117
1162
|
* Get the state from the given file name.
|
|
1118
1163
|
*
|
|
@@ -1143,6 +1188,9 @@ var FileManager = class {
|
|
|
1143
1188
|
if (this.ARMBicep.isSupportedFile(_fileName)) {
|
|
1144
1189
|
return this.ARMBicep.read(fileName);
|
|
1145
1190
|
}
|
|
1191
|
+
if (this.InstallShieldISM.isSupportedFile(_fileName)) {
|
|
1192
|
+
return this.InstallShieldISM.read(fileName);
|
|
1193
|
+
}
|
|
1146
1194
|
this.logger.error(`[File Manager] Unsupported file: ${fileName}`);
|
|
1147
1195
|
}
|
|
1148
1196
|
/**
|
|
@@ -1176,6 +1224,9 @@ var FileManager = class {
|
|
|
1176
1224
|
if (this.ARMBicep.isSupportedFile(_fileName)) {
|
|
1177
1225
|
return this.ARMBicep.write(fileState, newVersion);
|
|
1178
1226
|
}
|
|
1227
|
+
if (this.InstallShieldISM.isSupportedFile(_fileName)) {
|
|
1228
|
+
return this.InstallShieldISM.write(fileState, newVersion);
|
|
1229
|
+
}
|
|
1179
1230
|
this.logger.error(`[File Manager] Unsupported file: ${fileState.path}`);
|
|
1180
1231
|
}
|
|
1181
1232
|
};
|
|
@@ -1785,14 +1836,25 @@ async function getNextVersion(config, logger, commits, currentVersion) {
|
|
|
1785
1836
|
}
|
|
1786
1837
|
const isPreMajor = semver.lt(currentVersion, "1.0.0");
|
|
1787
1838
|
let releaseType = "patch";
|
|
1788
|
-
const changes = {
|
|
1839
|
+
const changes = {
|
|
1840
|
+
major: 0,
|
|
1841
|
+
minor: 0,
|
|
1842
|
+
patch: 0,
|
|
1843
|
+
merges: 0,
|
|
1844
|
+
reverts: 0
|
|
1845
|
+
};
|
|
1789
1846
|
if (config.releaseAs) {
|
|
1790
1847
|
releaseType = config.releaseAs;
|
|
1791
1848
|
} else {
|
|
1792
1849
|
let level = 2;
|
|
1793
1850
|
const MINOR_TYPES = ["feat", "feature"];
|
|
1794
1851
|
for (const commit of commits) {
|
|
1795
|
-
if (commit.merge
|
|
1852
|
+
if (commit.merge) {
|
|
1853
|
+
changes.merges += 1;
|
|
1854
|
+
continue;
|
|
1855
|
+
}
|
|
1856
|
+
if (commit.revert) {
|
|
1857
|
+
changes.reverts += 1;
|
|
1796
1858
|
continue;
|
|
1797
1859
|
}
|
|
1798
1860
|
if (commit.notes.length > 0 || commit.breakingChange) {
|
|
@@ -1830,7 +1892,7 @@ async function getNextVersion(config, logger, commits, currentVersion) {
|
|
|
1830
1892
|
logger.log(`Next version: ${nextVersion} (${releaseTypeOrPreRelease})`);
|
|
1831
1893
|
if (commits.length > 0) {
|
|
1832
1894
|
logger.log(
|
|
1833
|
-
` - Commits: ${commits.length}` + (changes.major > 0 ? `,
|
|
1895
|
+
` - Commits: ${commits.length}` + (changes.major > 0 ? `, Majors: ${changes.major}` : "") + (changes.minor > 0 ? `, Minors: ${changes.minor}` : "") + (changes.patch > 0 ? `, Patches: ${changes.patch}` : "") + (changes.reverts > 0 ? `, Reverts: ${changes.reverts}` : "") + (changes.merges > 0 ? `, Merges: ${changes.merges}` : "")
|
|
1834
1896
|
);
|
|
1835
1897
|
} else {
|
|
1836
1898
|
logger.log(" - No commits found.");
|
|
@@ -1993,5 +2055,5 @@ async function main(config, logger, fileManager, git) {
|
|
|
1993
2055
|
}
|
|
1994
2056
|
|
|
1995
2057
|
export { CommitParser, FileManager, ForkConfigSchema, Git, Logger, commitChanges, createParserOptions, filterRevertedCommits, getCommitsSinceTag, getCurrentVersion, getNextVersion, getUserConfig, inspectTag, inspectVersion, main, tagChanges, updateChangelog, validateConfig };
|
|
1996
|
-
//# sourceMappingURL=chunk-
|
|
1997
|
-
//# sourceMappingURL=chunk-
|
|
2058
|
+
//# sourceMappingURL=chunk-35VBEKVS.js.map
|
|
2059
|
+
//# sourceMappingURL=chunk-35VBEKVS.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/config/schema.js","../src/utils/escape-regex.ts","../src/services/git.ts","../src/config/changelog-preset-config.ts","../src/config/defaults.ts","../src/config/detect-git-host.ts","../src/config/load-config.ts","../src/config/merge-files.ts","../src/config/user-config.ts","../src/services/logger.ts","../src/utils/file-state.ts","../src/files/json-package.ts","../src/files/yaml-package.ts","../src/files/plain-text.ts","../src/files/ms-build-project.ts","../src/files/arm-bicep.ts","../src/files/install-shield-ism.ts","../src/files/file-manager.ts","../src/commands/validate-config.ts","../src/process/get-current-version.ts","../src/commands/inspect-version.ts","../src/commands/inspect-tag.ts","../src/utils/trim-string-array.ts","../src/commit-parser/options.ts","../src/commit-parser/parser-error.ts","../src/commit-parser/commit-parser.ts","../src/commit-parser/filter-reverted-commits.ts","../src/process/get-commits.ts","../src/utils/release-type.ts","../src/process/get-next-version.ts","../src/process/changelog.ts","../src/utils/format-commit-message.ts","../src/process/commit.ts","../src/process/tag.ts","../src/commands/main.ts"],"names":["z","fileContent","parsed","resolve","readFileSync","parse","writeFileSync","cheerio2","semver"],"mappings":"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","file":"chunk-35VBEKVS.js","sourcesContent":["import { z } from \"zod\";\n\nexport const ChangelogPresetConfigTypeSchema = z.object({\n\t/**\n\t * The type of commit message.\n\t * @example \"feat\", \"fix\", \"chore\", etc..\n\t */\n\ttype: z.string().describe('The type of commit message, such as \"feat\", \"fix\", \"chore\".'),\n\t/**\n\t * The scope of the commit message.\n\t */\n\tscope: z.string().optional().describe(\"The scope of the commit message.\"),\n\t/**\n\t * The section of the `CHANGELOG` the commit should show up in.\n\t */\n\tsection: z\n\t\t.string()\n\t\t.optional()\n\t\t.describe(\"The section of the `CHANGELOG` the commit should show up in.\"),\n\t/**\n\t * Should show in the generated changelog message?\n\t */\n\thidden: z.boolean().optional().describe(\"Should show in the generated changelog message?\"),\n});\n\nexport const ChangelogPresetConfigSchema = z.object({\n\t/**\n\t * List of explicitly supported commit message types.\n\t */\n\ttypes: z\n\t\t.array(ChangelogPresetConfigTypeSchema)\n\t\t.describe(\"List of explicitly supported commit message types.\"),\n\t/**\n\t * A URL representing a specific commit at a hash.\n\t * @default \"{{host}}/{{owner}}/{{repository}}/commit/{{hash}}\"\n\t */\n\tcommitUrlFormat: z.string().describe(\"A URL representing a specific commit at a hash.\"),\n\t/**\n\t * A URL representing the comparison between two git SHAs.\n\t * @default \"{{host}}/{{owner}}/{{repository}}/compare/{{previousTag}}...{{currentTag}}\"\n\t */\n\tcompareUrlFormat: z.string().describe(\"A URL representing the comparison between two git SHAs.\"),\n\t/**\n\t * A URL representing the issue format (allowing a different URL format to be swapped in\n\t * for Gitlab, Bitbucket, etc).\n\t * @default \"{{host}}/{{owner}}/{{repository}}/issues/{{id}}\"\n\t */\n\tissueUrlFormat: z.string().describe(\"A URL representing the issue format.\"),\n\t/**\n\t * A URL representing a user's profile on GitHub, Gitlab, etc. This URL is used\n\t * for substituting @eglavin with https://github.com/eglavin in commit messages.\n\t * @default \"{{host}}/{{user}}\"\n\t */\n\tuserUrlFormat: z.string().describe(\"A URL representing a user's profile on GitHub, Gitlab, etc.\"),\n\t/**\n\t * A string to be used to format the auto-generated release commit message.\n\t * @default \"chore(release): {{currentTag}}\"\n\t */\n\treleaseCommitMessageFormat: z\n\t\t.string()\n\t\t.describe(\"A string to be used to format the auto-generated release commit message.\"),\n\t/**\n\t * List of prefixes used to detect references to issues.\n\t * @default [\"#\"]\n\t */\n\tissuePrefixes: z\n\t\t.array(z.string())\n\t\t.describe(\"List of prefixes used to detect references to issues.\"),\n});\n\nexport const ForkConfigSchema = z.object({\n\t// Commands\n\t//\n\n\t/**\n\t * The command to run, can be one of the following:\n\t *\n\t * - `main` - Bumps the version, update files, generate changelog, commit, and tag.\n\t * - `inspect-version` - Prints the current version and exits.\n\t * - `inspect-tag` - Prints the current git tag and exits.\n\t * - `validate-config` - Validates the configuration and exits.\n\t *\n\t * @default \"main\"\n\t */\n\tcommand: z\n\t\t.literal([\"main\", \"inspect-version\", \"inspect-tag\", \"validate-config\"])\n\t\t.describe(\n\t\t\t\"The command to run. Can be one of: main, inspect-version, inspect-tag, validate-config. Defaults to main.\",\n\t\t),\n\t/**\n\t * If set, Fork-Version will print the current version and exit.\n\t * @default false\n\t *\n\t * @deprecated Set the `inspect-version` command instead.\n\t */\n\tinspectVersion: z\n\t\t.boolean()\n\t\t.optional()\n\t\t.describe(\"If set, Fork-Version will print the current version and exit.\"),\n\n\t// Options\n\t//\n\n\t/**\n\t * List of the files to be updated.\n\t * @default\n\t * ```js\n\t * [\"bower.json\", \"deno.json\", \"deno.jsonc\", \"jsr.json\", \"jsr.jsonc\", \"manifest.json\", \"npm-shrinkwrap.json\", \"package-lock.json\", \"package.json\"]\n\t * ```\n\t */\n\tfiles: z.array(z.string()).describe(\"List of the files to be updated.\"),\n\t/**\n\t * Glob pattern to match files to be updated.\n\t *\n\t * Internally we're using [glob](https://github.com/isaacs/node-glob) to match files.\n\t *\n\t * Read more about the pattern syntax [here](https://github.com/isaacs/node-glob/tree/v10.3.12?tab=readme-ov-file#glob-primer).\n\t *\n\t * @default undefined\n\t * @example \"*.json\"\n\t */\n\tglob: z.string().optional().describe(\"Glob pattern to match files to be updated.\"),\n\t/**\n\t * The path Fork-Version will run from.\n\t * @default\n\t * ```js\n\t * process.cwd()\n\t * ```\n\t */\n\tpath: z.string().describe('The path Fork-Version will run from. Defaults to \"process.cwd()\".'),\n\t/**\n\t * Name of the changelog file.\n\t * @default \"CHANGELOG.md\"\n\t */\n\tchangelog: z.string().describe('Name of the changelog file. Defaults to \"CHANGELOG.md\".'),\n\t/**\n\t * The header text for the changelog.\n\t * @default\n\t * ```markdown\n\t * # Changelog\n\t *\n\t * All notable changes to this project will be documented in this file. See [fork-version](https://github.com/eglavin/fork-version) for commit guidelines.\n\t * ```\n\t */\n\theader: z.string().describe(\"The header text for the changelog.\"),\n\t/**\n\t * Specify a prefix for the created tag.\n\t *\n\t * For instance if your version tag is prefixed by \"version/\" instead of \"v\" you have to specify\n\t * `tagPrefix: \"version/\"`.\n\t *\n\t * `tagPrefix` can also be used for a monorepo environment where you might want to deploy\n\t * multiple package from the same repository. In this case you can specify a prefix for\n\t * each package:\n\t *\n\t * | Example Value | Tag Created |\n\t * |:-------------------------|:------------------------------|\n\t * | \"\" | `1.2.3` |\n\t * | \"version/\" | `version/1.2.3` |\n\t * | \"@eglavin/fork-version-\" | `@eglavin/fork-version-1.2.3` |\n\t *\n\t * @example \"\", \"version/\", \"@eglavin/fork-version-\"\n\t * @default \"v\"\n\t */\n\ttagPrefix: z.string().describe('Specify a prefix for the created tag. Defaults to \"v\".'),\n\t/**\n\t * Make a pre-release with optional label if given value is a string.\n\t *\n\t * | Example Value | Produced Version |\n\t * |:--------------|:-----------------|\n\t * | true | `1.2.3-0` |\n\t * | \"alpha\" | `1.2.3-alpha-0` |\n\t * | \"beta\" | `1.2.3-beta-0` |\n\t *\n\t * @example true, \"alpha\", \"beta\", \"rc\"\n\t * @default undefined\n\t */\n\tpreRelease: z\n\t\t.string()\n\t\t.or(z.boolean())\n\t\t.optional()\n\t\t.describe(\"Make a pre-release with optional label if given value is a string.\"),\n\t/**\n\t * If set, Fork-Version will use this version instead of trying to determine one.\n\t * @example \"1.0.0\"\n\t * @default undefined\n\t */\n\tcurrentVersion: z\n\t\t.string()\n\t\t.optional()\n\t\t.describe(\"If set, Fork-Version will use this version instead of trying to determine one.\"),\n\t/**\n\t * If set, Fork-Version will attempt to update to this version, instead of incrementing using \"conventional-commit\".\n\t * @example \"2.0.0\"\n\t * @default undefined\n\t */\n\tnextVersion: z\n\t\t.string()\n\t\t.optional()\n\t\t.describe(\n\t\t\t'If set, Fork-Version will attempt to update to this version, instead of incrementing using \"conventional-commit\".',\n\t\t),\n\t/**\n\t * Release as increments the version by the specified level. Overrides the default behaviour of \"conventional-commit\".\n\t * @example \"major\", \"minor\", \"patch\"\n\t * @default undefined\n\t */\n\treleaseAs: z\n\t\t.union([z.literal(\"major\"), z.literal(\"minor\"), z.literal(\"patch\")])\n\t\t.optional()\n\t\t.describe(\n\t\t\t'Release as increments the version by the specified level. Overrides the default behaviour of \"conventional-commit\".',\n\t\t),\n\n\t// Flags\n\t//\n\n\t/**\n\t * Don't throw an error if multiple versions are found in the given files.\n\t * @default true\n\t */\n\tallowMultipleVersions: z\n\t\t.boolean()\n\t\t.describe(\"Don't throw an error if multiple versions are found in the given files.\"),\n\t/**\n\t * Commit all changes, not just files updated by Fork-Version.\n\t * @default false\n\t */\n\tcommitAll: z.boolean().describe(\"Commit all changes, not just files updated by Fork-Version.\"),\n\t/**\n\t * By default the conventional-changelog spec will only add commit types of `feat` and `fix` to the generated changelog.\n\t * If this flag is set, all [default commit types](https://github.com/conventional-changelog/conventional-changelog-config-spec/blob/238093090c14bd7d5151eb5316e635623ce633f9/versions/2.2.0/schema.json#L18)\n\t * will be added to the changelog.\n\t * @default false\n\t */\n\tchangelogAll: z\n\t\t.boolean()\n\t\t.describe(\n\t\t\t\"If this flag is set, all default commit types will be added to the changelog, not just `feat` and `fix`.\",\n\t\t),\n\t/**\n\t * Output debug information.\n\t * @default false\n\t */\n\tdebug: z.boolean().describe(\"Output debug information.\"),\n\t/**\n\t * No output will be written to disk or committed.\n\t * @default false\n\t */\n\tdryRun: z.boolean().describe(\"No output will be written to disk or committed.\"),\n\t/**\n\t * Run without logging to the terminal.\n\t * @default false\n\t */\n\tsilent: z.boolean().describe(\"Run without logging to the terminal.\"),\n\t/**\n\t * If unable to find a version in the given files, fallback and attempt to use the latest git tag.\n\t * @default true\n\t */\n\tgitTagFallback: z\n\t\t.boolean()\n\t\t.describe(\n\t\t\t\"If unable to find a version in the given files, fallback and attempt to use the latest git tag. Defaults to true.\",\n\t\t),\n\t/**\n\t * If true, git will sign the commit with the systems GPG key.\n\t * @see {@link https://git-scm.com/docs/git-commit#Documentation/git-commit.txt--Sltkeyidgt Git - GPG Sign Commits}\n\t * @default false\n\t */\n\tsign: z.boolean().describe(\"If true, git will sign the commit with the systems GPG key.\"),\n\t/**\n\t * If true, git will run user defined git hooks before committing.\n\t * @see {@link https://git-scm.com/docs/githooks Git - Git Hooks}\n\t * @default false\n\t */\n\tverify: z.boolean().describe(\"If true, git will run user defined git hooks before committing.\"),\n\n\t// Skip Steps\n\t//\n\n\t/**\n\t * Skip the bump step.\n\t * @default false\n\t */\n\tskipBump: z.boolean().describe(\"Skip the bump step.\"),\n\t/**\n\t * Skip the changelog step.\n\t * @default false\n\t */\n\tskipChangelog: z.boolean().describe(\"Skip the changelog step.\"),\n\t/**\n\t * Skip the commit step.\n\t * @default false\n\t */\n\tskipCommit: z.boolean().describe(\"Skip the commit step.\"),\n\t/**\n\t * Skip the tag step.\n\t * @default false\n\t */\n\tskipTag: z.boolean().describe(\"Skip the tag step.\"),\n\n\t/**\n\t * Override the default \"conventional-changelog-conventionalcommits\" preset configuration.\n\t */\n\tchangelogPresetConfig: ChangelogPresetConfigSchema.partial().describe(\n\t\t'Override the default \"conventional-changelog-conventionalcommits\" preset configuration.',\n\t),\n\n\t/**\n\t * Add a suffix to the release commit message.\n\t * @example \"[skip ci]\"\n\t */\n\treleaseMessageSuffix: z\n\t\t.string()\n\t\t.optional()\n\t\t.describe(\"Add a suffix to the release commit message.\"),\n});\n","/**\n * Escapes special characters in a string for use in a regular expression.\n *\n * @example\n * ```ts\n * escapeRegex(\"Hello. How are you?\"); // \"Hello\\. How are you\\?\"\n * ```\n */\nexport function escapeRegex(input: string): string {\n\treturn input.replace(/[.*+?^${}()|[\\]\\\\]/g, \"\\\\$&\");\n}\n","import { execFile } from \"node:child_process\";\nimport semver from \"semver\";\nimport { escapeRegex } from \"../utils/escape-regex\";\nimport type { ForkConfig } from \"../config/types\";\n\nexport class Git {\n\tconstructor(private config: Pick<ForkConfig, \"path\" | \"dryRun\">) {\n\t\tthis.add = this.add.bind(this);\n\t\tthis.commit = this.commit.bind(this);\n\t\tthis.tag = this.tag.bind(this);\n\t\tthis.log = this.log.bind(this);\n\t\tthis.isIgnored = this.isIgnored.bind(this);\n\t\tthis.getBranchName = this.getBranchName.bind(this);\n\t\tthis.getRemoteUrl = this.getRemoteUrl.bind(this);\n\t\tthis.getTags = this.getTags.bind(this);\n\t\tthis.getMostRecentTag = this.getMostRecentTag.bind(this);\n\t\tthis.getCleanedTags = this.getCleanedTags.bind(this);\n\t\tthis.getHighestSemverVersionFromTags = this.getHighestSemverVersionFromTags.bind(this);\n\t\tthis.getCommits = this.getCommits.bind(this);\n\t}\n\n\tasync #execGit(command: string, args: string[]): Promise<string> {\n\t\treturn new Promise((onResolve, onReject) => {\n\t\t\texecFile(\n\t\t\t\t\"git\",\n\t\t\t\t[command, ...args],\n\t\t\t\t{\n\t\t\t\t\tcwd: this.config.path,\n\t\t\t\t\tmaxBuffer: Infinity,\n\t\t\t\t},\n\t\t\t\t(error, stdout, stderr) => {\n\t\t\t\t\tif (error) {\n\t\t\t\t\t\tonReject(error);\n\t\t\t\t\t} else {\n\t\t\t\t\t\tonResolve(stdout ? stdout : stderr);\n\t\t\t\t\t}\n\t\t\t\t},\n\t\t\t);\n\t\t});\n\t}\n\n\t/**\n\t * Add file contents to the index\n\t *\n\t * [git-add Documentation](https://git-scm.com/docs/git-add)\n\t *\n\t * @example\n\t * ```ts\n\t * await git.add(\"CHANGELOG.md\");\n\t * ```\n\t */\n\tasync add(...args: (string | undefined)[]): Promise<string> {\n\t\tif (this.config.dryRun) {\n\t\t\treturn \"\";\n\t\t}\n\n\t\treturn this.#execGit(\"add\", args.filter(Boolean) as string[]);\n\t}\n\n\t/**\n\t * Record changes to the repository\n\t *\n\t * [git-commit Documentation](https://git-scm.com/docs/git-commit)\n\t *\n\t * @example\n\t * ```ts\n\t * await git.commit(\"--message\", \"chore(release): 1.2.3\");\n\t * ```\n\t */\n\tasync commit(...args: (string | undefined)[]): Promise<string> {\n\t\tif (this.config.dryRun) {\n\t\t\treturn \"\";\n\t\t}\n\n\t\treturn this.#execGit(\"commit\", args.filter(Boolean) as string[]);\n\t}\n\n\t/**\n\t * Create, list, delete or verify a tag object\n\t *\n\t * [git-tag Documentation](https://git-scm.com/docs/git-tag)\n\t *\n\t * @example\n\t * ```ts\n\t * await git.tag(\"--annotate\", \"v1.2.3\", \"--message\", \"chore(release): 1.2.3\");\n\t * ```\n\t */\n\tasync tag(...args: (string | undefined)[]): Promise<string> {\n\t\tif (this.config.dryRun) {\n\t\t\treturn \"\";\n\t\t}\n\n\t\treturn this.#execGit(\"tag\", args.filter(Boolean) as string[]);\n\t}\n\n\t/**\n\t * Show commit logs\n\t *\n\t * - [git-log Documentation](https://git-scm.com/docs/git-log)\n\t * - [pretty-formats Documentation](https://git-scm.com/docs/pretty-formats)\n\t *\n\t * @example\n\t * ```ts\n\t * await git.log(\"--oneline\");\n\t * ```\n\t */\n\tasync log(...args: (string | undefined)[]): Promise<string> {\n\t\ttry {\n\t\t\treturn await this.#execGit(\"log\", args.filter(Boolean) as string[]);\n\t\t} catch {\n\t\t\treturn \"\";\n\t\t}\n\t}\n\n\t/**\n\t * Check if a file is ignored by git\n\t *\n\t * [git-check-ignore Documentation](https://git-scm.com/docs/git-check-ignore)\n\t *\n\t * @example\n\t * ```ts\n\t * await git.isIgnored(\"src/my-file.txt\");\n\t * ```\n\t */\n\tasync isIgnored(file: string): Promise<boolean> {\n\t\ttry {\n\t\t\tawait this.#execGit(\"check-ignore\", [\"--no-index\", file]);\n\n\t\t\treturn true;\n\t\t} catch (_error) {\n\t\t\treturn false;\n\t\t}\n\t}\n\n\t/**\n\t * Get the name of the current branch\n\t *\n\t * [git-rev-parse Documentation](https://git-scm.com/docs/git-rev-parse)\n\t *\n\t * @example\n\t * ```ts\n\t * await git.getBranchName(); // \"main\"\n\t * ```\n\t */\n\tasync getBranchName(): Promise<string> {\n\t\ttry {\n\t\t\tconst branchName = await this.#execGit(\"rev-parse\", [\"--abbrev-ref\", \"HEAD\"]);\n\n\t\t\treturn branchName.trim();\n\t\t} catch {\n\t\t\treturn \"\";\n\t\t}\n\t}\n\n\t/**\n\t * Get the URL of the remote repository\n\t *\n\t * [git-config Documentation](https://git-scm.com/docs/git-config)\n\t *\n\t * @example\n\t * ```ts\n\t * await git.getRemoteUrl(); // \"https://github.com/eglavin/fork-version\"\n\t * ```\n\t */\n\tasync getRemoteUrl(): Promise<string> {\n\t\ttry {\n\t\t\tconst remoteUrl = await this.#execGit(\"config\", [\"--get\", \"remote.origin.url\"]);\n\n\t\t\treturn remoteUrl.trim();\n\t\t} catch (_error) {\n\t\t\treturn \"\";\n\t\t}\n\t}\n\n\t/**\n\t * `getTags` returns valid semver version tags in order of the commit history\n\t *\n\t * Using `git log` to get the commit history, we then parse the tags from the\n\t * commit details which is expected to be in the following format:\n\t * ```txt\n\t * commit 3841b1d05750d42197fe958e3d8e06df378a842d (HEAD -> main, tag: v1.0.2, tag: v1.0.1, tag: v1.0.0)\n\t * Author: Username <username@example.com>\n\t * Date: Sat Nov 9 15:00:00 2024 +0000\n\t *\n\t * chore(release): v1.0.0\n\t * ```\n\t *\n\t * - [Functionality extracted from the conventional-changelog - git-semver-tags project](https://github.com/conventional-changelog/conventional-changelog/blob/fac8045242099c016f5f3905e54e02b7d466bd7b/packages/git-semver-tags/index.js)\n\t * - [conventional-changelog git-semver-tags MIT Licence](https://github.com/conventional-changelog/conventional-changelog/blob/fac8045242099c016f5f3905e54e02b7d466bd7b/packages/git-semver-tags/LICENSE.md)\n\t *\n\t * @example\n\t * ```ts\n\t * await git.getTags(\"v\"); // [\"v1.0.2\", \"v1.0.1\", \"v1.0.0\"]\n\t * ```\n\t */\n\tasync getTags(tagPrefix: string | undefined): Promise<string[]> {\n\t\tconst logOutput = await this.log(\"--decorate\", \"--no-color\", \"--date-order\");\n\n\t\t/**\n\t\t * Search for tags in the following formats:\n\t\t * @example \"tag: 1.2.3,\" or \"tag: 1.2.3)\"\n\t\t */\n\t\tconst TAG_REGEX = /tag:\\s*(?<tag>.+?)[,)]/gi;\n\t\tconst tags: string[] = [];\n\t\tconst escapedTagPrefix = tagPrefix ? escapeRegex(tagPrefix) : undefined;\n\n\t\tlet tagMatch: RegExpExecArray | null = null;\n\t\twhile ((tagMatch = TAG_REGEX.exec(logOutput))) {\n\t\t\tconst { tag = \"\" } = tagMatch.groups ?? {};\n\n\t\t\tif (tagPrefix) {\n\t\t\t\tif (tag.startsWith(tagPrefix)) {\n\t\t\t\t\tconst tagWithoutPrefix = tag.replace(new RegExp(`^${escapedTagPrefix}`), \"\");\n\t\t\t\t\tif (semver.valid(tagWithoutPrefix)) {\n\t\t\t\t\t\ttags.push(tag);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t\t// If no tagPrefix is provided, only include tags that start with a digit and are valid semver\n\t\t\telse if (/^\\d/.test(tag) && semver.valid(tag)) {\n\t\t\t\ttags.push(tag);\n\t\t\t}\n\t\t}\n\n\t\treturn tags;\n\t}\n\n\t/**\n\t * Returns the latest git tag based on commit date\n\t *\n\t * @example\n\t * ```ts\n\t * await git.getMostRecentTag(\"v\"); // \"1.2.3\"\n\t * ```\n\t */\n\tasync getMostRecentTag(tagPrefix: string | undefined): Promise<string | undefined> {\n\t\tconst tags = await this.getTags(tagPrefix);\n\t\treturn tags[0] || undefined;\n\t}\n\n\t/**\n\t * Get cleaned semver tags, with any tag prefix's removed\n\t *\n\t * @example\n\t * ```ts\n\t * await git.getCleanedTags(\"v\"); // [\"1.2.3\", \"1.2.2\", \"1.2.1\"]\n\t * ```\n\t */\n\tasync getCleanedTags(tagPrefix: string | undefined): Promise<string[]> {\n\t\tconst tags = await this.getTags(tagPrefix);\n\t\tconst escapedTagPrefix = tagPrefix ? escapeRegex(tagPrefix) : undefined;\n\n\t\tconst cleanedTags = [];\n\t\tfor (const tag of tags) {\n\t\t\tconst tagWithoutPrefix = tag.replace(new RegExp(`^${escapedTagPrefix}`), \"\");\n\t\t\tconst cleanedTag = semver.clean(tagWithoutPrefix);\n\t\t\tif (cleanedTag) {\n\t\t\t\tcleanedTags.push(cleanedTag);\n\t\t\t}\n\t\t}\n\n\t\treturn cleanedTags;\n\t}\n\n\t/**\n\t * Get the highest semver version from git tags. This will return the highest\n\t * semver version found for the given tag prefix, regardless of the commit date.\n\t *\n\t * @example\n\t * ```ts\n\t * await git.getHighestSemverVersionFromTags(\"v\"); // \"1.2.3\"\n\t * ```\n\t */\n\tasync getHighestSemverVersionFromTags(\n\t\ttagPrefix: string | undefined,\n\t): Promise<string | undefined> {\n\t\tconst cleanedTags = await this.getCleanedTags(tagPrefix);\n\t\treturn cleanedTags.sort(semver.rcompare)[0] || undefined;\n\t}\n\n\t/**\n\t * Get commit history in a parsable format\n\t *\n\t * An array of strings with commit details is returned in the following format:\n\t * ```txt\n\t * subject\n\t * body\n\t * hash\n\t * committer date\n\t * committer name\n\t * committer email\n\t * ```\n\t *\n\t * @example\n\t * ```ts\n\t * await git.getCommits(\"v1.0.0\", \"HEAD\", \"src/utils\");\n\t * ```\n\t */\n\tasync getCommits(from = \"\", to = \"HEAD\", ...paths: string[]): Promise<string[]> {\n\t\tconst SCISSOR = \"^----------- FORK VERSION -----------^\";\n\n\t\tconst LOG_FORMAT = [\n\t\t\t\"%s\", // subject\n\t\t\t\"%b\", // body\n\t\t\t\"%H\", // hash\n\t\t\t\"%d\", // ref names\n\t\t\t\"%cI\", // committer date\n\t\t\t\"%cN\", // committer name\n\t\t\t\"%cE\", // committer email\n\t\t\tSCISSOR,\n\t\t].join(\"%n\");\n\n\t\tconst commits = await this.log(\n\t\t\t`--format=${LOG_FORMAT}`,\n\t\t\t[from, to].filter(Boolean).join(\"..\"),\n\t\t\tpaths.length ? \"--\" : \"\",\n\t\t\t...paths,\n\t\t);\n\n\t\tconst splitCommits = commits.split(`\\n${SCISSOR}\\n`);\n\n\t\tif (splitCommits.length === 0) {\n\t\t\treturn splitCommits;\n\t\t}\n\n\t\tif (splitCommits[0] === SCISSOR) {\n\t\t\tsplitCommits.shift();\n\t\t}\n\n\t\tif (splitCommits[splitCommits.length - 1] === \"\") {\n\t\t\tsplitCommits.pop();\n\t\t}\n\n\t\treturn splitCommits;\n\t}\n}\n","import { z } from \"zod\";\nimport conventionalChangelogConfigSpec from \"conventional-changelog-config-spec\";\n\nimport { ChangelogPresetConfigTypeSchema, ChangelogPresetConfigSchema } from \"./schema\";\nimport type { ForkVersionCLIArgs, ForkConfig } from \"./types\";\nimport type { DetectedGitHost } from \"./detect-git-host\";\n\nexport function getChangelogPresetConfig(\n\tmergedConfig: Partial<ForkConfig> | undefined,\n\tcliArguments: ForkVersionCLIArgs[\"flags\"],\n\tdetectedGitHost: DetectedGitHost | null,\n) {\n\tconst preset: { name: string; [_: string]: unknown } = {\n\t\tname: \"conventionalcommits\",\n\t};\n\n\t// First take any default values from the conventional-changelog-config-spec\n\tif (typeof conventionalChangelogConfigSpec.properties === \"object\") {\n\t\tObject.entries(conventionalChangelogConfigSpec.properties).forEach(([key, value]) => {\n\t\t\tif (\"default\" in value && value.default !== undefined) {\n\t\t\t\t// If the user has requested to see all types, we need to remove the hidden flag from the default types.\n\t\t\t\tif (mergedConfig?.changelogAll && key === \"types\") {\n\t\t\t\t\tconst parsedTypes = z.array(ChangelogPresetConfigTypeSchema).safeParse(value.default);\n\n\t\t\t\t\tif (parsedTypes.success) {\n\t\t\t\t\t\tparsedTypes.data.forEach((type) => {\n\t\t\t\t\t\t\tif (!type.section) {\n\t\t\t\t\t\t\t\tdelete type.hidden;\n\t\t\t\t\t\t\t\ttype.section = \"Other Changes\";\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t});\n\t\t\t\t\t\tpreset[key] = parsedTypes.data;\n\n\t\t\t\t\t\treturn;\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\tpreset[key] = value.default;\n\t\t\t}\n\t\t});\n\t}\n\n\t// If we've detected a git host, use the values from the detected host now so that they can\n\t// be overwritten by the users config later\n\tif (detectedGitHost) {\n\t\tObject.entries(detectedGitHost).forEach(([key, value]) => {\n\t\t\tif (value !== undefined) {\n\t\t\t\tpreset[key] = value;\n\t\t\t}\n\t\t});\n\t}\n\n\t// Then overwrite with any values from the users config\n\tif (\n\t\tmergedConfig?.changelogPresetConfig &&\n\t\ttypeof mergedConfig.changelogPresetConfig === \"object\"\n\t) {\n\t\tObject.entries(mergedConfig.changelogPresetConfig).forEach(([key, value]) => {\n\t\t\tif (value !== undefined) {\n\t\t\t\tpreset[key] = value;\n\t\t\t}\n\t\t});\n\t}\n\n\t// If the user has defined a releaseMessageSuffix, append it to the releaseCommitMessageFormat\n\tif (mergedConfig?.releaseMessageSuffix && !cliArguments?.releaseMessageSuffix) {\n\t\tpreset.releaseCommitMessageFormat = `${preset.releaseCommitMessageFormat} ${mergedConfig.releaseMessageSuffix}`;\n\t}\n\n\t// Finally overwrite with any values from the CLI arguments\n\tif (cliArguments?.commitUrlFormat) {\n\t\tpreset.commitUrlFormat = cliArguments.commitUrlFormat;\n\t}\n\tif (cliArguments?.compareUrlFormat) {\n\t\tpreset.compareUrlFormat = cliArguments.compareUrlFormat;\n\t}\n\tif (cliArguments?.issueUrlFormat) {\n\t\tpreset.issueUrlFormat = cliArguments.issueUrlFormat;\n\t}\n\tif (cliArguments?.userUrlFormat) {\n\t\tpreset.userUrlFormat = cliArguments.userUrlFormat;\n\t}\n\tif (cliArguments?.releaseCommitMessageFormat) {\n\t\tpreset.releaseCommitMessageFormat = cliArguments.releaseCommitMessageFormat;\n\t}\n\tif (cliArguments?.releaseMessageSuffix) {\n\t\tpreset.releaseCommitMessageFormat = `${preset.releaseCommitMessageFormat} ${cliArguments.releaseMessageSuffix}`;\n\t}\n\n\treturn ChangelogPresetConfigSchema.passthrough().parse(preset);\n}\n","import type { ForkConfig } from \"./types\";\n\nexport const DEFAULT_CONFIG: ForkConfig = {\n\t// Commands\n\tcommand: \"main\",\n\n\t// Options\n\tfiles: [\n\t\t\"package.json\",\n\t\t\"package-lock.json\",\n\t\t\"npm-shrinkwrap.json\",\n\t\t\"jsr.json\",\n\t\t\"jsr.jsonc\",\n\t\t\"deno.json\",\n\t\t\"deno.jsonc\",\n\t\t\"manifest.json\", // Chrome extensions\n\t\t\"bower.json\",\n\t],\n\tpath: process.cwd(),\n\tchangelog: \"CHANGELOG.md\",\n\theader: `# Changelog\n\nAll notable changes to this project will be documented in this file. See [fork-version](https://github.com/eglavin/fork-version) for commit guidelines.\n`,\n\ttagPrefix: \"v\",\n\n\t// Flags\n\tallowMultipleVersions: true,\n\tcommitAll: false,\n\tchangelogAll: false,\n\tdebug: false,\n\tdryRun: false,\n\tsilent: false,\n\tgitTagFallback: true,\n\tsign: false,\n\tverify: false,\n\n\t// Skip Steps\n\tskipBump: false,\n\tskipChangelog: false,\n\tskipCommit: false,\n\tskipTag: false,\n\n\tchangelogPresetConfig: {},\n};\n","import { Git } from \"../services/git\";\n\nexport interface DetectedGitHost {\n\tdetectedGitHost: string;\n\tcommitUrlFormat: string;\n\tcompareUrlFormat: string;\n\tissueUrlFormat: string;\n}\n\n/**\n * Conventional-Changelog already supports the following git hosts:\n * - Github\n * - Gitlab\n * - Bitbucket\n *\n * We want to detect if the user is using another host such as Azure DevOps,\n * if so we need to create the correct URLs so the changelog is generated\n * correctly.\n */\nexport async function detectGitHost(cwd: string): Promise<DetectedGitHost | null> {\n\tconst remoteUrl = await new Git({\n\t\tpath: cwd,\n\t\tdryRun: false,\n\t}).getRemoteUrl();\n\n\t// A checked out Azure DevOps remote URL looks like one of these:\n\t//\n\t// | Checkout Type | Remote URL |\n\t// | ------------- | --------------------------------------------------------------------------------------- |\n\t// | HTTPS | https://{{ORGANISATION}}@dev.azure.com/{{ORGANISATION}}/{{PROJECT}}/_git/{{REPOSITORY}} |\n\t// | SSH | git@ssh.dev.azure.com:v3/{{ORGANISATION}}/{{PROJECT}}/{{REPOSITORY}} |\n\t//\n\tif (remoteUrl.startsWith(\"https://\") && remoteUrl.includes(\"@dev.azure.com/\")) {\n\t\t/**\n\t\t * [Regex101.com](https://regex101.com/r/fF7HUc/1)\n\t\t */\n\t\tconst match =\n\t\t\t/^https:\\/\\/(?<atorganisation>.*?)@dev.azure.com\\/(?<organisation>.*?)\\/(?<project>.*?)\\/_git\\/(?<repository>.*?)(?:\\.git)?$/.exec(\n\t\t\t\tremoteUrl,\n\t\t\t);\n\n\t\tif (match?.groups) {\n\t\t\tconst { organisation = \"\", project = \"\", repository = \"\" } = match.groups;\n\n\t\t\treturn {\n\t\t\t\tdetectedGitHost: \"Azure\",\n\t\t\t\tcommitUrlFormat: `{{host}}/${organisation}/${project}/_git/${repository}/commit/{{hash}}`,\n\t\t\t\tcompareUrlFormat: `{{host}}/${organisation}/${project}/_git/${repository}/branchCompare?baseVersion=GT{{previousTag}}&targetVersion=GT{{currentTag}}`,\n\t\t\t\tissueUrlFormat: `{{host}}/${organisation}/${project}/_workitems/edit/{{id}}`,\n\t\t\t};\n\t\t}\n\t} else if (remoteUrl.startsWith(\"git@ssh.dev.azure.com:\")) {\n\t\t/**\n\t\t * [Regex101.com](https://regex101.com/r/VhNxWr/1)\n\t\t */\n\t\tconst match =\n\t\t\t/^git@ssh.dev.azure.com:v\\d\\/(?<organisation>.*?)\\/(?<project>.*?)\\/(?<repository>.*?)(?:\\.git)?$/.exec(\n\t\t\t\tremoteUrl,\n\t\t\t);\n\n\t\tif (match?.groups) {\n\t\t\tconst { organisation = \"\", project = \"\", repository = \"\" } = match.groups;\n\n\t\t\treturn {\n\t\t\t\tdetectedGitHost: \"Azure\",\n\t\t\t\tcommitUrlFormat: `{{host}}/${organisation}/${project}/_git/${repository}/commit/{{hash}}`,\n\t\t\t\tcompareUrlFormat: `{{host}}/${organisation}/${project}/_git/${repository}/branchCompare?baseVersion=GT{{previousTag}}&targetVersion=GT{{currentTag}}`,\n\t\t\t\tissueUrlFormat: `{{host}}/${organisation}/${project}/_workitems/edit/{{id}}`,\n\t\t\t};\n\t\t}\n\t}\n\n\treturn null;\n}\n","import { parse } from \"node:path\";\nimport { readFileSync } from \"node:fs\";\nimport JoyCon from \"joycon\";\nimport { bundleRequire } from \"bundle-require\";\n\nimport { ForkConfigSchema } from \"./schema\";\n\n/**\n * Name of the key in the package.json file that contains the users configuration.\n */\nconst PACKAGE_JSON_CONFIG_KEY = \"fork-version\";\n\nexport async function loadConfigFile(cwd: string) {\n\tconst joycon = new JoyCon({\n\t\tcwd,\n\t\tpackageKey: PACKAGE_JSON_CONFIG_KEY,\n\t\tstopDir: parse(cwd).root,\n\t});\n\tconst configFilePath = await joycon.resolve([\n\t\t\"fork.config.ts\",\n\t\t\"fork.config.js\",\n\t\t\"fork.config.cjs\",\n\t\t\"fork.config.mjs\",\n\t\t\"fork.config.json\",\n\t\t\"package.json\",\n\t]);\n\n\tif (!configFilePath) {\n\t\treturn {};\n\t}\n\n\t// Handle json config file.\n\tif (configFilePath.endsWith(\"json\")) {\n\t\tconst fileContent = JSON.parse(readFileSync(configFilePath).toString());\n\n\t\t// Handle package.json config file.\n\t\tif (configFilePath.endsWith(\"package.json\")) {\n\t\t\tif (\n\t\t\t\tfileContent[PACKAGE_JSON_CONFIG_KEY] &&\n\t\t\t\ttypeof fileContent[PACKAGE_JSON_CONFIG_KEY] === \"object\"\n\t\t\t) {\n\t\t\t\tconst parsed = ForkConfigSchema.partial().safeParse(fileContent[PACKAGE_JSON_CONFIG_KEY]);\n\t\t\t\tif (!parsed.success) {\n\t\t\t\t\tthrow new Error(`Validation error in: ${configFilePath}`, { cause: parsed.error });\n\t\t\t\t}\n\t\t\t\treturn parsed.data;\n\t\t\t}\n\n\t\t\treturn {};\n\t\t}\n\n\t\tconst parsed = ForkConfigSchema.partial().safeParse(fileContent);\n\t\tif (!parsed.success) {\n\t\t\tthrow new Error(`Validation error in: ${configFilePath}`, { cause: parsed.error });\n\t\t}\n\t\treturn parsed.data;\n\t}\n\n\t// Otherwise expect config file to use js or ts.\n\tconst fileContent = await bundleRequire({ filepath: configFilePath });\n\n\tconst parsed = ForkConfigSchema.partial().safeParse(fileContent.mod.default || fileContent.mod);\n\tif (!parsed.success) {\n\t\tthrow new Error(`Validation error in: ${configFilePath}`, { cause: parsed.error });\n\t}\n\treturn parsed.data;\n}\n","import { DEFAULT_CONFIG } from \"./defaults\";\n\nexport function mergeFiles(\n\tconfigFiles: string[] | undefined,\n\tcliFiles: string[] | undefined,\n\tglobResults: string[],\n): string[] {\n\tconst listOfFiles = new Set<string>();\n\n\t// Add files from the users config file\n\tif (Array.isArray(configFiles)) {\n\t\tconfigFiles.forEach((file) => listOfFiles.add(file));\n\t}\n\n\t// Add files from the cli arguments\n\tif (Array.isArray(cliFiles)) {\n\t\tcliFiles.forEach((file) => listOfFiles.add(file));\n\t}\n\n\t// Add files from glob results\n\tglobResults.forEach((file) => listOfFiles.add(file));\n\n\t// If the user has defined files use them, otherwise use the default list of files.\n\tif (listOfFiles.size) {\n\t\treturn Array.from(listOfFiles);\n\t}\n\n\treturn DEFAULT_CONFIG.files;\n}\n","import { resolve } from \"node:path\";\nimport { glob } from \"glob\";\n\nimport { getChangelogPresetConfig } from \"./changelog-preset-config\";\nimport { DEFAULT_CONFIG } from \"./defaults\";\nimport { detectGitHost } from \"./detect-git-host\";\nimport { loadConfigFile } from \"./load-config\";\nimport { mergeFiles } from \"./merge-files\";\nimport type { ForkVersionCLIArgs, ForkConfig } from \"./types\";\n\nexport async function getUserConfig(cliArguments: ForkVersionCLIArgs): Promise<ForkConfig> {\n\tconst cwd = cliArguments.flags.path ? resolve(cliArguments.flags.path) : process.cwd();\n\n\tconst configFile = await loadConfigFile(cwd);\n\n\tconst mergedConfig = {\n\t\t...DEFAULT_CONFIG,\n\t\t...configFile,\n\t\t...cliArguments.flags,\n\t} as ForkConfig;\n\n\tlet globResults: string[] = [];\n\tif (mergedConfig.glob) {\n\t\tglobResults = await glob(mergedConfig.glob, {\n\t\t\tcwd,\n\t\t\tignore: [\"node_modules/**\"],\n\t\t\tnodir: true,\n\t\t});\n\t}\n\n\tconst files = mergeFiles(configFile?.files, cliArguments.flags.files, globResults);\n\tconst detectedGitHost = await detectGitHost(cwd);\n\tconst changelogPresetConfig = getChangelogPresetConfig(\n\t\tmergedConfig,\n\t\tcliArguments.flags,\n\t\tdetectedGitHost,\n\t);\n\n\tlet command: ForkConfig[\"command\"] = DEFAULT_CONFIG.command;\n\tif (cliArguments.input.length > 0 && cliArguments.input[0].trim()) {\n\t\tcommand = cliArguments.input[0].trim().toLowerCase() as ForkConfig[\"command\"];\n\t} else if (mergedConfig.command.trim()) {\n\t\tcommand = mergedConfig.command.trim().toLowerCase() as ForkConfig[\"command\"];\n\t}\n\n\t// Support deprecated `--inspect-version` flag. Will be removed in a future major release.\n\tif (mergedConfig.inspectVersion) {\n\t\tcommand = \"inspect-version\";\n\t}\n\n\t// Force silent mode to avoid printing unnecessary information when running other commands.\n\tconst shouldBeSilent = ![DEFAULT_CONFIG.command].includes(command);\n\n\treturn {\n\t\t...mergedConfig,\n\n\t\tcommand,\n\t\tfiles,\n\t\tpath: cwd,\n\t\tpreRelease:\n\t\t\t// Meow doesn't support multiple flags with the same name, so we need to check both.\n\t\t\tcliArguments.flags.preReleaseTag ?? cliArguments.flags.preRelease ?? configFile.preRelease,\n\t\tsilent: shouldBeSilent || mergedConfig.silent,\n\t\tchangelogPresetConfig,\n\t};\n}\n","/* eslint-disable @typescript-eslint/no-explicit-any */\n\nimport type { ForkConfig } from \"../config/types\";\n\nexport class Logger {\n\tdisableLogs = false;\n\n\tconstructor(private config: Pick<ForkConfig, \"silent\" | \"debug\">) {\n\t\tthis.log = this.log.bind(this);\n\t\tthis.warn = this.warn.bind(this);\n\t\tthis.error = this.error.bind(this);\n\t\tthis.debug = this.debug.bind(this);\n\n\t\t// Disable logs if silent\n\t\tthis.disableLogs = this.config.silent;\n\t}\n\n\tpublic log(...messages: any[]) {\n\t\tif (!this.disableLogs) {\n\t\t\tconsole.log(...messages);\n\t\t}\n\t}\n\n\tpublic warn(...messages: any[]) {\n\t\tif (!this.disableLogs) {\n\t\t\tconsole.warn(...messages);\n\t\t}\n\t}\n\n\tpublic error(...messages: any[]) {\n\t\tif (!this.disableLogs) {\n\t\t\tconsole.error(...messages);\n\t\t}\n\t}\n\n\tpublic debug(...messages: any[]) {\n\t\tif (this.config.debug && !this.disableLogs) {\n\t\t\tconsole.debug(...messages);\n\t\t}\n\t}\n}\n","import { lstatSync } from \"node:fs\";\n\n/**\n * Determine if a file exists.\n * @example\n * ```ts\n * fileExists(\"~/.bashrc\"); // true\n * fileExists(\"~/missing-file.txt\"); // false\n * ```\n */\nexport function fileExists(filePath: string): boolean {\n\ttry {\n\t\treturn lstatSync(filePath).isFile();\n\t} catch (_error) {\n\t\treturn false;\n\t}\n}\n","import { resolve } from \"node:path\";\nimport { readFileSync, writeFileSync } from \"node:fs\";\nimport {\n\tapplyEdits,\n\ttype JSONPath,\n\tmodify,\n\tparse,\n\ttype ParseError,\n\ttype ParseOptions,\n} from \"jsonc-parser\";\n\nimport { fileExists } from \"../utils/file-state\";\nimport type { ForkConfig } from \"../config/types\";\nimport type { Logger } from \"../services/logger\";\nimport type { FileState, IFileManager } from \"./file-manager\";\n\n/** The things we are interested in, in package.json-like files. */\ninterface PackageJsonish {\n\tversion?: string;\n\tprivate?: unknown;\n\tpackages?: {\n\t\t\"\"?: {\n\t\t\tversion?: string;\n\t\t};\n\t};\n}\n\n/**\n * A json package file should have a version property, like what can be seen\n * in the package.json file in the root of this project.\n *\n * @example\n * ```json\n * {\n * \"name\": \"fork-version\",\n * \"version\": \"1.2.3\",\n * \"private\": true,\n * }\n * ```\n */\nexport class JSONPackage implements IFileManager {\n\tconstructor(\n\t\tprivate config: ForkConfig,\n\t\tprivate logger: Logger,\n\t) {}\n\n\t/** Options for parsing JSON and JSONC files. */\n\tprivate PARSE_OPTIONS: ParseOptions = {\n\t\tallowEmptyContent: false,\n\t\tallowTrailingComma: true,\n\t\tdisallowComments: false,\n\t};\n\n\t/**\n\t * Sets a new string value at the given path in a JSON or JSONC string.\n\t * @param jsonc the JSON or JSONC string (the contents of a file)\n\t * @param jsonPath path to the value to set, as an array of segments\n\t * @param newString string to set the value to\n\t * @returns the JSON or JSONC string with the value set\n\t */\n\tprivate setStringInJsonc(jsonc: string, jsonPath: JSONPath, newString: string): string {\n\t\tconst edits = modify(jsonc, jsonPath, newString, {});\n\t\treturn applyEdits(jsonc, edits);\n\t}\n\n\tpublic read(fileName: string): FileState | undefined {\n\t\tconst filePath = resolve(this.config.path, fileName);\n\n\t\tif (fileExists(filePath)) {\n\t\t\tconst fileContents = readFileSync(filePath, \"utf8\");\n\n\t\t\tconst parseErrors: ParseError[] = [];\n\t\t\tconst parsedJson: PackageJsonish = parse(fileContents, parseErrors, this.PARSE_OPTIONS);\n\t\t\tif (parseErrors.length) {\n\t\t\t\tthis.logger.warn(`[File Manager] Unable to parse JSON: ${fileName}`, parseErrors);\n\t\t\t\treturn undefined;\n\t\t\t}\n\n\t\t\tif (parsedJson?.version) {\n\t\t\t\treturn {\n\t\t\t\t\tname: fileName,\n\t\t\t\t\tpath: filePath,\n\t\t\t\t\tversion: parsedJson.version,\n\n\t\t\t\t\tisPrivate: typeof parsedJson?.private === \"boolean\" ? parsedJson.private : true,\n\t\t\t\t};\n\t\t\t}\n\n\t\t\tthis.logger.warn(`[File Manager] Unable to determine json version: ${fileName}`);\n\t\t}\n\t}\n\n\tpublic write(fileState: FileState, newVersion: string) {\n\t\tlet fileContents = readFileSync(fileState.path, \"utf8\");\n\n\t\tconst parseErrors: ParseError[] = [];\n\t\tconst parsedJson: PackageJsonish = parse(fileContents, parseErrors, this.PARSE_OPTIONS);\n\t\tif (parseErrors.length) {\n\t\t\tthis.logger.warn(`[File Manager] Unable to parse JSON: ${fileState.path}`, parseErrors);\n\t\t\treturn;\n\t\t}\n\n\t\tfileContents = this.setStringInJsonc(fileContents, [\"version\"], newVersion);\n\t\tif (parsedJson?.packages?.[\"\"]) {\n\t\t\t// package-lock v2 stores version here too.\n\t\t\tfileContents = this.setStringInJsonc(fileContents, [\"packages\", \"\", \"version\"], newVersion);\n\t\t}\n\n\t\twriteFileSync(fileState.path, fileContents, \"utf8\");\n\t}\n\n\tpublic isSupportedFile(fileName: string): boolean {\n\t\treturn fileName.endsWith(\".json\") || fileName.endsWith(\".jsonc\");\n\t}\n}\n","import { resolve } from \"node:path\";\nimport { readFileSync, writeFileSync } from \"node:fs\";\nimport { parse, parseDocument } from \"yaml\";\n\nimport { fileExists } from \"../utils/file-state\";\nimport type { ForkConfig } from \"../config/types\";\nimport type { Logger } from \"../services/logger\";\nimport type { FileState, IFileManager } from \"./file-manager\";\n\n/**\n * A yaml package file should have a version property on the top level, like what can be seen\n * in [this example project](https://github.com/eglavin/wordionary/blob/01ae9b9d604cecdf9d320ed6028a727be5e5349e/pubspec.yaml#L19C1-L19C17).\n *\n * @example\n * ```yaml\n * name: wordionary\n * description: \"A Flutter project.\"\n * publish_to: 'none'\n * version: 1.2.3\n * ```\n */\nexport class YAMLPackage implements IFileManager {\n\tconstructor(\n\t\tprivate config: ForkConfig,\n\t\tprivate logger: Logger,\n\t) {}\n\n\t/**\n\t * If the version is returned with a \"+\" symbol in the value then the version might be from a\n\t * flutter `pubspec.yaml` file, if so we want to retain the input builderNumber by splitting it\n\t * and joining it again later.\n\t */\n\tprivate handleBuildNumber(fileVersion: string): {\n\t\tversion: string;\n\t\tbuilderNumber?: string;\n\t} {\n\t\tconst [version, builderNumber] = fileVersion.split(\"+\");\n\n\t\t// If the builderNumber is an integer then we'll return the split value.\n\t\tif (/^\\d+$/.test(builderNumber)) {\n\t\t\treturn {\n\t\t\t\tversion,\n\t\t\t\tbuilderNumber,\n\t\t\t};\n\t\t}\n\n\t\treturn {\n\t\t\tversion: fileVersion,\n\t\t};\n\t}\n\n\tpublic read(fileName: string): FileState | undefined {\n\t\tconst filePath = resolve(this.config.path, fileName);\n\n\t\tif (fileExists(filePath)) {\n\t\t\tconst fileContents = readFileSync(filePath, \"utf-8\");\n\n\t\t\tconst fileVersion = parse(fileContents)?.version;\n\t\t\tif (fileVersion) {\n\t\t\t\tconst parsedVersion = this.handleBuildNumber(fileVersion);\n\n\t\t\t\treturn {\n\t\t\t\t\tname: fileName,\n\t\t\t\t\tpath: filePath,\n\t\t\t\t\tversion: parsedVersion.version || \"\",\n\t\t\t\t\tbuilderNumber: parsedVersion.builderNumber ?? undefined,\n\t\t\t\t};\n\t\t\t}\n\t\t}\n\n\t\tthis.logger.warn(`[File Manager] Unable to determine yaml version: ${fileName}`);\n\t}\n\n\tpublic write(fileState: FileState, newVersion: string): void {\n\t\tconst fileContents = readFileSync(fileState.path, \"utf8\");\n\t\tconst yamlDocument = parseDocument(fileContents);\n\n\t\tlet newFileVersion = newVersion;\n\t\tif (fileState.builderNumber !== undefined) {\n\t\t\tnewFileVersion += `+${fileState.builderNumber}`; // Reattach builderNumber if previously set.\n\t\t}\n\n\t\tyamlDocument.set(\"version\", newFileVersion);\n\n\t\twriteFileSync(fileState.path, yamlDocument.toString(), \"utf8\");\n\t}\n\n\tpublic isSupportedFile(fileName: string): boolean {\n\t\treturn fileName.endsWith(\".yaml\") || fileName.endsWith(\".yml\");\n\t}\n}\n","import { resolve } from \"node:path\";\nimport { readFileSync, writeFileSync } from \"node:fs\";\n\nimport { fileExists } from \"../utils/file-state\";\nimport type { ForkConfig } from \"../config/types\";\nimport type { Logger } from \"../services/logger\";\nimport type { FileState, IFileManager } from \"./file-manager\";\n\n/**\n * A plain text file will have just the version as the content.\n *\n * @example\n * ```txt\n * 1.2.3\n * ```\n */\nexport class PlainText implements IFileManager {\n\tconstructor(\n\t\tprivate config: ForkConfig,\n\t\tprivate logger: Logger,\n\t) {}\n\n\tpublic read(fileName: string): FileState | undefined {\n\t\tconst filePath = resolve(this.config.path, fileName);\n\n\t\tif (fileExists(filePath)) {\n\t\t\tconst fileContents = readFileSync(filePath, \"utf8\");\n\n\t\t\treturn {\n\t\t\t\tname: fileName,\n\t\t\t\tpath: filePath,\n\t\t\t\tversion: fileContents || \"\",\n\t\t\t};\n\t\t}\n\n\t\tthis.logger.warn(`[File Manager] Unable to determine plain text version: ${fileName}`);\n\t}\n\n\tpublic write(fileState: FileState, newVersion: string) {\n\t\twriteFileSync(fileState.path, newVersion, \"utf8\");\n\t}\n\n\tpublic isSupportedFile(fileName: string): boolean {\n\t\treturn fileName.endsWith(\"version.txt\");\n\t}\n}\n","import { resolve } from \"node:path\";\nimport { readFileSync, writeFileSync } from \"node:fs\";\nimport * as cheerio from \"cheerio/slim\";\n\nimport { fileExists } from \"../utils/file-state\";\nimport type { ForkConfig } from \"../config/types\";\nimport type { Logger } from \"../services/logger\";\nimport type { FileState, IFileManager } from \"./file-manager\";\n\n/**\n * A ms-build file is an xml file with a version property under the Project > PropertyGroup node.\n *\n * [Microsoft Learn - MSBuild Reference](https://learn.microsoft.com/en-us/visualstudio/msbuild/msbuild?view=vs-2022)\n *\n * @example\n * ```xml\n * <Project Sdk=\"Microsoft.NET.Sdk\">\n * <PropertyGroup>\n * <Version>1.2.3</Version>\n * </PropertyGroup>\n * </Project>\n * ```\n */\nexport class MSBuildProject implements IFileManager {\n\tconstructor(\n\t\tprivate config: ForkConfig,\n\t\tprivate logger: Logger,\n\t) {}\n\n\tpublic read(fileName: string): FileState | undefined {\n\t\tconst filePath = resolve(this.config.path, fileName);\n\n\t\tif (fileExists(filePath)) {\n\t\t\tconst fileContents = readFileSync(filePath, \"utf8\");\n\t\t\tconst $ = cheerio.load(fileContents, {\n\t\t\t\txmlMode: true,\n\t\t\t\txml: { decodeEntities: false },\n\t\t\t});\n\n\t\t\tconst version = $(\"Project > PropertyGroup > Version\").text();\n\t\t\tif (version) {\n\t\t\t\treturn {\n\t\t\t\t\tname: fileName,\n\t\t\t\t\tpath: filePath,\n\t\t\t\t\tversion: version,\n\t\t\t\t};\n\t\t\t}\n\n\t\t\tthis.logger.warn(`[File Manager] Unable to determine ms-build version: ${fileName}`);\n\t\t}\n\t}\n\n\tpublic write(fileState: FileState, newVersion: string) {\n\t\tconst fileContents = readFileSync(fileState.path, \"utf8\");\n\t\tconst $ = cheerio.load(fileContents, {\n\t\t\txmlMode: true,\n\t\t\txml: { decodeEntities: false },\n\t\t});\n\n\t\t$(\"Project > PropertyGroup > Version\").text(newVersion);\n\n\t\t// Cheerio doesn't handle self-closing tags well,\n\t\t// so we're manually adding a space before the closing tag.\n\t\tconst updatedContent = $.xml().replaceAll('\"/>', '\" />');\n\n\t\twriteFileSync(fileState.path, updatedContent, \"utf8\");\n\t}\n\n\tpublic isSupportedFile(fileName: string): boolean {\n\t\t// List of known ms-build project file extensions.\n\t\t// https://stackoverflow.com/questions/2007689/is-there-a-standard-file-extension-for-msbuild-files\n\t\treturn (\n\t\t\t[\".csproj\", \".dbproj\", \".esproj\", \".fsproj\", \".props\", \".vbproj\", \".vcxproj\"].findIndex(\n\t\t\t\t(ext) => fileName.endsWith(ext),\n\t\t\t) !== -1\n\t\t);\n\t}\n}\n","import { resolve } from \"node:path\";\nimport { readFileSync, writeFileSync } from \"node:fs\";\n\nimport { fileExists } from \"../utils/file-state\";\nimport type { ForkConfig } from \"../config/types\";\nimport type { Logger } from \"../services/logger\";\nimport type { FileState, IFileManager } from \"./file-manager\";\n\n/**\n * An ARM bicep file with metadata and variable called contentVersion.\n *\n * @example\n * ```bicep\n * metadata contentVersion = '1.2.3.4'\n * var contentVersion string = '1.2.3.4'\n * ```\n */\nexport class ARMBicep implements IFileManager {\n\tconstructor(\n\t\tprivate config: ForkConfig,\n\t\tprivate logger: Logger,\n\t) {}\n\n\t/** https://regex101.com/r/Lriphb/2 */\n\tprivate metadataRegex = /(metadata contentVersion *= *['\"])(?<version>[^'\"]+)(['\"])/;\n\n\t/** https://regex101.com/r/iKCTF9/1 */\n\tprivate varRegex = /(var contentVersion(?: string)? *= *['\"])(?<version>[^'\"]+)(['\"])/;\n\n\tpublic read(fileName: string): FileState | undefined {\n\t\tconst filePath = resolve(this.config.path, fileName);\n\n\t\tif (fileExists(filePath)) {\n\t\t\tconst fileContents = readFileSync(filePath, \"utf8\");\n\n\t\t\tconst metadataMatch = this.metadataRegex.exec(fileContents);\n\t\t\tconst varMatch = this.varRegex.exec(fileContents);\n\n\t\t\tif (metadataMatch?.groups?.version && varMatch?.groups?.version) {\n\t\t\t\treturn {\n\t\t\t\t\tname: fileName,\n\t\t\t\t\tpath: filePath,\n\t\t\t\t\tversion: metadataMatch.groups.version,\n\t\t\t\t};\n\t\t\t}\n\n\t\t\tif (!metadataMatch) {\n\t\t\t\tthis.logger.warn(\n\t\t\t\t\t`[File Manager] Missing 'metadata contentVersion' in bicep file: ${fileName}`,\n\t\t\t\t);\n\t\t\t}\n\t\t\tif (!varMatch) {\n\t\t\t\tthis.logger.warn(`[File Manager] Missing 'var contentVersion' in bicep file: ${fileName}`);\n\t\t\t}\n\t\t}\n\t}\n\n\tpublic write(fileState: FileState, newVersion: string) {\n\t\tconst fileContents = readFileSync(fileState.path, \"utf8\");\n\n\t\tconst updatedContent = fileContents\n\t\t\t.replace(this.metadataRegex, `$1${newVersion}$3`)\n\t\t\t.replace(this.varRegex, `$1${newVersion}$3`);\n\n\t\twriteFileSync(fileState.path, updatedContent, \"utf8\");\n\t}\n\n\tpublic isSupportedFile(fileName: string): boolean {\n\t\treturn fileName.endsWith(\".bicep\");\n\t}\n}\n","import { resolve } from \"node:path\";\nimport { readFileSync, writeFileSync } from \"node:fs\";\nimport * as cheerio from \"cheerio/slim\";\n\nimport { fileExists } from \"../utils/file-state\";\nimport type { ForkConfig } from \"../config/types\";\nimport type { Logger } from \"../services/logger\";\nimport type { FileState, IFileManager } from \"./file-manager\";\n\n/**\n * An InstallShield ISM file can be either XML or binary, only the XML format is supported\n * by this file manager. The XML format typically contains a \"Property\" table with a\n * \"ProductVersion\" property.\n *\n * @example\n * ```xml\n * <?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"yes\"?>\n * <?xml-stylesheet type=\"text/xsl\" href=\"is.xsl\" ?>\n * <!DOCTYPE msi [\n * ...\n * ]>\n * <msi version=\"2.0\" xmlns:dt=\"urn:schemas-microsoft-com:datatypes\">\n *\n * \t<table name=\"Property\">\n * \t\t<row><td>ProductVersion</td><td>1.2.3</td><td/></row>\n * \t</table>\n *\n * </msi>\n * ```\n */\nexport class InstallShieldISM implements IFileManager {\n\tconstructor(\n\t\tprivate config: ForkConfig,\n\t\tprivate logger: Logger,\n\t) {}\n\n\tread(fileName: string): FileState | undefined {\n\t\tconst filePath = resolve(this.config.path, fileName);\n\n\t\tif (fileExists(filePath)) {\n\t\t\tconst fileContents = readFileSync(filePath, \"utf8\");\n\t\t\tconst $ = cheerio.load(fileContents, {\n\t\t\t\txmlMode: true,\n\t\t\t\txml: { decodeEntities: false },\n\t\t\t});\n\n\t\t\tconst version = $('msi > table[name=\"Property\"] > row > td:contains(\"ProductVersion\")')\n\t\t\t\t.next()\n\t\t\t\t.text()\n\t\t\t\t.trim();\n\t\t\tif (version) {\n\t\t\t\treturn {\n\t\t\t\t\tname: fileName,\n\t\t\t\t\tpath: filePath,\n\t\t\t\t\tversion: version,\n\t\t\t\t};\n\t\t\t}\n\n\t\t\tthis.logger.warn(`[File Manager] Unable to determine InstallShield ISM version: ${fileName}`);\n\t\t}\n\t}\n\n\twrite(fileState: FileState, newVersion: string): void {\n\t\tconst fileContents = readFileSync(fileState.path, \"utf8\");\n\t\tconst $ = cheerio.load(fileContents, {\n\t\t\txmlMode: true,\n\t\t\txml: { decodeEntities: false },\n\t\t});\n\n\t\tconst versionCell = $(\n\t\t\t'msi > table[name=\"Property\"] > row > td:contains(\"ProductVersion\")',\n\t\t).next();\n\t\tif (versionCell.length > 0) {\n\t\t\tversionCell.text(newVersion);\n\t\t}\n\n\t\t// Cheerio doesn't handle self-closing tags well,\n\t\t// so we're manually adding a space before any closing tags.\n\t\tconst updatedContent = $.xml().replaceAll('\"/>', '\" />');\n\n\t\twriteFileSync(fileState.path, updatedContent, \"utf8\");\n\t}\n\n\tisSupportedFile(fileName: string): boolean {\n\t\treturn fileName.endsWith(\".ism\");\n\t}\n}\n","import { JSONPackage } from \"./json-package\";\nimport { YAMLPackage } from \"./yaml-package\";\nimport { PlainText } from \"./plain-text\";\nimport { MSBuildProject } from \"./ms-build-project\";\nimport { ARMBicep } from \"./arm-bicep\";\nimport { InstallShieldISM } from \"./install-shield-ism\";\n\nimport type { ForkConfig } from \"../config/types\";\nimport type { Logger } from \"../services/logger\";\n\nexport interface FileState {\n\tname: string;\n\tpath: string;\n\tversion: string;\n\n\t[other: string]: unknown;\n}\n\nexport interface IFileManager {\n\tread(fileName: string): FileState | undefined;\n\twrite(fileState: FileState, newVersion: string): void;\n\tisSupportedFile(fileName: string): boolean;\n}\n\nexport class FileManager {\n\tprivate JSONPackage: JSONPackage;\n\tprivate YAMLPackage: YAMLPackage;\n\tprivate PlainText: PlainText;\n\tprivate MSBuildProject: MSBuildProject;\n\tprivate ARMBicep: ARMBicep;\n\tprivate InstallShieldISM: InstallShieldISM;\n\n\tconstructor(\n\t\tprivate config: ForkConfig,\n\t\tprivate logger: Logger,\n\t) {\n\t\tthis.JSONPackage = new JSONPackage(config, logger);\n\t\tthis.YAMLPackage = new YAMLPackage(config, logger);\n\t\tthis.PlainText = new PlainText(config, logger);\n\t\tthis.MSBuildProject = new MSBuildProject(config, logger);\n\t\tthis.ARMBicep = new ARMBicep(config, logger);\n\t\tthis.InstallShieldISM = new InstallShieldISM(config, logger);\n\t}\n\n\t/**\n\t * Get the state from the given file name.\n\t *\n\t * @example\n\t * ```ts\n\t * fileManager.read(\"package.json\");\n\t * ```\n\t *\n\t * @returns\n\t * ```json\n\t * { \"name\": \"package.json\", \"path\": \"/path/to/package.json\", \"version\": \"1.2.3\", \"isPrivate\": true }\n\t * ```\n\t */\n\tpublic read(fileName: string): FileState | undefined {\n\t\tconst _fileName = fileName.toLowerCase();\n\n\t\tif (this.JSONPackage.isSupportedFile(_fileName)) {\n\t\t\treturn this.JSONPackage.read(fileName);\n\t\t}\n\n\t\tif (this.YAMLPackage.isSupportedFile(_fileName)) {\n\t\t\treturn this.YAMLPackage.read(fileName);\n\t\t}\n\n\t\tif (this.PlainText.isSupportedFile(_fileName)) {\n\t\t\treturn this.PlainText.read(fileName);\n\t\t}\n\n\t\tif (this.MSBuildProject.isSupportedFile(_fileName)) {\n\t\t\treturn this.MSBuildProject.read(fileName);\n\t\t}\n\n\t\tif (this.ARMBicep.isSupportedFile(_fileName)) {\n\t\t\treturn this.ARMBicep.read(fileName);\n\t\t}\n\n\t\tif (this.InstallShieldISM.isSupportedFile(_fileName)) {\n\t\t\treturn this.InstallShieldISM.read(fileName);\n\t\t}\n\n\t\tthis.logger.error(`[File Manager] Unsupported file: ${fileName}`);\n\t}\n\n\t/**\n\t * Write the new version to the given file.\n\t *\n\t * @example\n\t * ```ts\n\t * fileManager.write(\n\t * { name: \"package.json\", path: \"/path/to/package.json\", version: \"1.2.2\" },\n\t * \"1.2.3\"\n\t * );\n\t * ```\n\t */\n\tpublic write(fileState: FileState, newVersion: string): void {\n\t\tif (this.config.dryRun) {\n\t\t\treturn;\n\t\t}\n\t\tconst _fileName = fileState.name.toLowerCase();\n\n\t\tif (this.JSONPackage.isSupportedFile(_fileName)) {\n\t\t\treturn this.JSONPackage.write(fileState, newVersion);\n\t\t}\n\n\t\tif (this.YAMLPackage.isSupportedFile(_fileName)) {\n\t\t\treturn this.YAMLPackage.write(fileState, newVersion);\n\t\t}\n\n\t\tif (this.PlainText.isSupportedFile(_fileName)) {\n\t\t\treturn this.PlainText.write(fileState, newVersion);\n\t\t}\n\n\t\tif (this.MSBuildProject.isSupportedFile(_fileName)) {\n\t\t\treturn this.MSBuildProject.write(fileState, newVersion);\n\t\t}\n\n\t\tif (this.ARMBicep.isSupportedFile(_fileName)) {\n\t\t\treturn this.ARMBicep.write(fileState, newVersion);\n\t\t}\n\n\t\tif (this.InstallShieldISM.isSupportedFile(_fileName)) {\n\t\t\treturn this.InstallShieldISM.write(fileState, newVersion);\n\t\t}\n\n\t\tthis.logger.error(`[File Manager] Unsupported file: ${fileState.path}`);\n\t}\n}\n","import type { ForkConfig } from \"../config/types\";\n\nexport function validateConfig(config: ForkConfig): void {\n\t// Validation is done during config initialisation, so if we reach this point the config is valid.\n\t// The default flow already prints errors, so we just print the valid config here.\n\n\tconsole.log(`\n⚙️ Configuration:\n${JSON.stringify(config, null, 2)}\n\n✅ Configuration is valid.\n`);\n}\n","import semver from \"semver\";\n\nimport type { ForkConfig } from \"../config/types\";\nimport type { FileManager, FileState } from \"../files/file-manager\";\nimport type { Logger } from \"../services/logger\";\nimport type { Git } from \"../services/git\";\n\nexport interface CurrentVersion {\n\tversion: string;\n\tfiles: FileState[];\n}\n\nexport async function getCurrentVersion(\n\tconfig: ForkConfig,\n\tlogger: Logger,\n\tgit: Git,\n\tfileManager: FileManager,\n\tfilesToUpdate: string[],\n): Promise<CurrentVersion> {\n\tconst files: FileState[] = [];\n\tconst versions = new Set<string>();\n\n\tfor (const file of filesToUpdate) {\n\t\tif (await git.isIgnored(file)) {\n\t\t\tlogger.debug(`[Git Ignored] ${file}`);\n\t\t\tcontinue;\n\t\t}\n\n\t\tconst fileState = fileManager.read(file);\n\t\tif (fileState) {\n\t\t\tfiles.push(fileState);\n\n\t\t\tif (!config.currentVersion) {\n\t\t\t\tversions.add(fileState.version);\n\t\t\t}\n\t\t}\n\t}\n\n\tif (config.currentVersion) {\n\t\tversions.add(config.currentVersion);\n\t}\n\n\t// If we still don't have a version, try to get the highest version from git tags\n\tif (versions.size === 0 && config.gitTagFallback) {\n\t\tconst version = await git.getHighestSemverVersionFromTags(config.tagPrefix);\n\t\tif (version) {\n\t\t\tlogger.warn(`Using latest git tag as fallback`);\n\t\t\tversions.add(version);\n\t\t}\n\t}\n\n\tif (versions.size === 0) {\n\t\tthrow new Error(\"Unable to find current version\");\n\t} else if (versions.size > 1) {\n\t\tif (!config.allowMultipleVersions) {\n\t\t\tthrow new Error(\"Found multiple versions\");\n\t\t}\n\t\tlogger.warn(\n\t\t\t`Found multiple versions (${Array.from(versions).join(\", \")}), using the higher semver version`,\n\t\t);\n\t}\n\n\tconst currentVersion = semver.rsort(Array.from(versions))[0];\n\n\tlogger.log(`Current version: ${currentVersion}`);\n\treturn {\n\t\tfiles,\n\t\tversion: currentVersion,\n\t};\n}\n","import { getCurrentVersion } from \"../process/get-current-version\";\n\nimport type { ForkConfig } from \"../config/types\";\nimport type { Logger } from \"../services/logger\";\nimport type { FileManager } from \"../files/file-manager\";\nimport type { Git } from \"../services/git\";\n\nexport async function inspectVersion(\n\tconfig: ForkConfig,\n\tlogger: Logger,\n\tfileManager: FileManager,\n\tgit: Git,\n) {\n\tlet foundVersion = \"\";\n\n\ttry {\n\t\tconst currentVersion = await getCurrentVersion(config, logger, git, fileManager, config.files);\n\t\tif (currentVersion) foundVersion = currentVersion.version;\n\t} catch {\n\t\t// No version found\n\t}\n\n\tconsole.log(foundVersion);\n}\n","import type { ForkConfig } from \"../config/types\";\nimport type { Git } from \"../services/git\";\n\nexport async function inspectTag(config: ForkConfig, git: Git) {\n\tconst tag = await git.getMostRecentTag(config.tagPrefix);\n\n\tconsole.log(tag ?? \"\");\n}\n","export function trimStringArray(array: string[] | undefined): string[] | undefined {\n\tconst items = [];\n\n\tif (Array.isArray(array)) {\n\t\tfor (const item of array) {\n\t\t\tconst _item = item.trim();\n\t\t\tif (_item) {\n\t\t\t\titems.push(_item);\n\t\t\t}\n\t\t}\n\t}\n\n\tif (items.length === 0) {\n\t\treturn undefined;\n\t}\n\treturn items;\n}\n","import { trimStringArray } from \"../utils/trim-string-array\";\n\nexport interface ParserOptions {\n\t/**\n\t * Pattern to match commit subjects\n\t * - Expected capture groups: `type` `title`\n\t * - Optional capture groups: `scope`, `breakingChange`\n\t */\n\tsubjectPattern: RegExp | undefined;\n\n\t/**\n\t * Pattern to match merge commits\n\t * - Expected capture groups: `id`, `source`\n\t */\n\tmergePattern: RegExp | undefined;\n\n\t/**\n\t * Pattern to match revert commits\n\t * - Expected capture groups: `subject`, `hash`\n\t */\n\trevertPattern: RegExp | undefined;\n\n\t/**\n\t * Pattern to match commented out lines which will be trimmed\n\t */\n\tcommentPattern: RegExp | undefined;\n\n\t/**\n\t * Pattern to match mentions\n\t * - Expected capture groups: `username`\n\t */\n\tmentionPattern: RegExp | undefined;\n\n\t/**\n\t * List of action labels to match reference sections\n\t * @default\n\t * [\"close\", \"closes\", \"closed\", \"fix\", \"fixes\", \"fixed\", \"resolve\", \"resolves\", \"resolved\"]\n\t */\n\treferenceActions?: string[];\n\t/**\n\t * Pattern to match reference sections\n\t * - Expected capture groups: `action`, `reference`\n\t */\n\treferenceActionPattern: RegExp | undefined;\n\n\t/**\n\t * List of issue prefixes to match issue ids\n\t * @default\n\t * [\"#\"]\n\t */\n\tissuePrefixes?: string[];\n\t/**\n\t * Pattern to match issue references\n\t * - Expected capture groups: `repository`, `prefix`, `issue`\n\t */\n\tissuePattern: RegExp | undefined;\n\n\t/**\n\t * List of keywords to match note titles\n\t * @default\n\t * [\"BREAKING CHANGE\", \"BREAKING-CHANGE\"]\n\t */\n\tnoteKeywords?: string[];\n\t/**\n\t * Pattern to match note sections\n\t * - Expected capture groups: `title`\n\t * - Optional capture groups: `text`\n\t */\n\tnotePattern: RegExp | undefined;\n}\n\nexport function createParserOptions(userOptions?: Partial<ParserOptions>): ParserOptions {\n\tconst referenceActions = trimStringArray(userOptions?.referenceActions) ?? [\n\t\t\"close\",\n\t\t\"closes\",\n\t\t\"closed\",\n\t\t\"fix\",\n\t\t\"fixes\",\n\t\t\"fixed\",\n\t\t\"resolve\",\n\t\t\"resolves\",\n\t\t\"resolved\",\n\t];\n\tconst joinedReferenceActions = referenceActions.join(\"|\");\n\n\tconst issuePrefixes = trimStringArray(userOptions?.issuePrefixes) ?? [\"#\"];\n\tconst joinedIssuePrefixes = issuePrefixes.join(\"|\");\n\n\tconst noteKeywords = trimStringArray(userOptions?.noteKeywords) ?? [\n\t\t\"BREAKING CHANGE\",\n\t\t\"BREAKING-CHANGE\",\n\t];\n\tconst joinedNoteKeywords = noteKeywords.join(\"|\");\n\n\treturn {\n\t\tsubjectPattern: /^(?<type>\\w+)(?:\\((?<scope>.*)\\))?(?<breakingChange>!)?:\\s+(?<title>.*)/,\n\n\t\tmergePattern: /^Merge pull request #(?<id>\\d*) from (?<source>.*)/,\n\n\t\trevertPattern: /^[Rr]evert \"(?<subject>.*)\"(\\s*This reverts commit (?<hash>[a-zA-Z0-9]*)\\.)?/,\n\n\t\tcommentPattern: /^#(?!\\d+\\s)/,\n\n\t\tmentionPattern: /(?<!\\w)@(?<username>[\\w-]+)/,\n\n\t\treferenceActions,\n\t\treferenceActionPattern: joinedReferenceActions\n\t\t\t? new RegExp(\n\t\t\t\t\t`(?<action>${joinedReferenceActions})(?:\\\\s+(?<reference>.*?))(?=(?:${joinedReferenceActions})|$)`,\n\t\t\t\t)\n\t\t\t: undefined,\n\n\t\tissuePrefixes,\n\t\tissuePattern: joinedIssuePrefixes\n\t\t\t? new RegExp(\n\t\t\t\t\t`(?:.*?)??\\\\s*(?<repository>[\\\\w-\\\\.\\\\/]*?)??(?<prefix>${joinedIssuePrefixes})(?<issue>[\\\\w-]*\\\\d+)`,\n\t\t\t\t)\n\t\t\t: undefined,\n\n\t\tnoteKeywords,\n\t\tnotePattern: joinedNoteKeywords\n\t\t\t? new RegExp(`^(?<title>${joinedNoteKeywords}):(\\\\s*(?<text>.*))`)\n\t\t\t: undefined,\n\n\t\t// Override defaults with user options\n\t\t...userOptions,\n\t};\n}\n","/* eslint-disable @typescript-eslint/no-explicit-any */\n\n/**\n * Error thrown when commit parser encounters an error.\n */\nexport class ParserError extends Error {\n\tdetail: unknown;\n\n\tconstructor(message: string, detail?: any) {\n\t\tsuper(message);\n\t\tthis.name = \"ParserError\";\n\t\tthis.detail = detail;\n\t}\n}\n","import { createParserOptions, type ParserOptions } from \"./options\";\nimport { ParserError } from \"./parser-error\";\nimport type { Logger } from \"../services/logger\";\nimport type { Commit, CommitNote, CommitReference } from \"./types\";\n\nexport class CommitParser {\n\t#options: ParserOptions;\n\t#logger?: Logger;\n\n\tconstructor(userOptions?: Partial<ParserOptions>) {\n\t\tthis.#options = createParserOptions(userOptions);\n\n\t\tthis.setLogger = this.setLogger.bind(this);\n\t\tthis.createCommit = this.createCommit.bind(this);\n\t\tthis.parseRawCommit = this.parseRawCommit.bind(this);\n\t\tthis.parseSubject = this.parseSubject.bind(this);\n\t\tthis.parseMerge = this.parseMerge.bind(this);\n\t\tthis.parseRevert = this.parseRevert.bind(this);\n\t\tthis.parseMentions = this.parseMentions.bind(this);\n\t\tthis.parseReferenceParts = this.parseReferenceParts.bind(this);\n\t\tthis.parseReferences = this.parseReferences.bind(this);\n\t\tthis.parseNotes = this.parseNotes.bind(this);\n\t\tthis.parseRawLines = this.parseRawLines.bind(this);\n\t\tthis.parse = this.parse.bind(this);\n\t}\n\n\tsetLogger(logger: Logger) {\n\t\tthis.#logger = logger;\n\t\treturn this;\n\t}\n\n\tcreateCommit(): Commit {\n\t\treturn {\n\t\t\traw: \"\",\n\n\t\t\tsubject: \"\",\n\t\t\tbody: \"\",\n\t\t\thash: \"\",\n\t\t\trefNames: \"\",\n\t\t\tdate: \"\",\n\t\t\tname: \"\",\n\t\t\temail: \"\",\n\n\t\t\ttype: \"\",\n\t\t\tscope: \"\",\n\t\t\tbreakingChange: \"\",\n\t\t\ttitle: \"\",\n\n\t\t\tmerge: null,\n\t\t\trevert: null,\n\t\t\tnotes: [],\n\t\t\tmentions: [],\n\t\t\treferences: [],\n\t\t\ttags: [],\n\t\t};\n\t}\n\n\t/**\n\t * Parse the raw commit message into its expected parts\n\t * - subject\n\t * - body\n\t * - hash\n\t * - date\n\t * - name\n\t * - email\n\t *\n\t * @throws {ParserError}\n\t */\n\tparseRawCommit(rawCommit: string): Commit {\n\t\tconst parsedCommit = this.createCommit();\n\n\t\tconst parts = rawCommit.split(/\\r?\\n/);\n\t\tif (parts.length < 6) {\n\t\t\tthrow new ParserError(\"Commit doesn't contain enough parts\", rawCommit);\n\t\t}\n\n\t\t// Walk backwards through the parts array to extract the data in the expected order\n\t\t// - committer email\n\t\t// - committer name\n\t\t// - committer date\n\t\t// - ref names\n\t\t// - hash\n\n\t\tconst email = parts.pop();\n\t\tconst name = parts.pop();\n\t\tconst date = parts.pop();\n\t\tconst refNames = parts.pop();\n\t\tconst hash = parts.pop();\n\n\t\tif (email) parsedCommit.email = email.trim();\n\t\tif (name) parsedCommit.name = name.trim();\n\t\tif (date) {\n\t\t\tparsedCommit.date = date.trim();\n\n\t\t\t// Date is one of the only fields we can properly validate, check to ensure its in the correct position\n\t\t\tif (Number.isNaN(Date.parse(parsedCommit.date))) {\n\t\t\t\tthrow new ParserError(\"Unable to parse commit date\", rawCommit);\n\t\t\t}\n\t\t}\n\t\tif (refNames) {\n\t\t\tparsedCommit.refNames = refNames.trim();\n\n\t\t\tconst TAG_REGEX = /tag:\\s*(?<tag>.+?)[,)]/gi;\n\t\t\tlet tagMatch: RegExpExecArray | null = null;\n\t\t\twhile ((tagMatch = TAG_REGEX.exec(refNames))) {\n\t\t\t\tconst { tag = \"\" } = tagMatch.groups ?? {};\n\n\t\t\t\tif (tag) {\n\t\t\t\t\tparsedCommit.tags.push(tag);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\tif (hash) parsedCommit.hash = hash.trim();\n\n\t\t// Take the subject from the front of the array, the remainder is the commit body\n\n\t\tconst subject = parts.shift()?.trimStart();\n\t\tif (subject) {\n\t\t\tparsedCommit.subject = subject;\n\t\t\tparsedCommit.raw = subject;\n\t\t}\n\n\t\tparsedCommit.body = parts\n\t\t\t.filter((line) => {\n\t\t\t\tif (this.#options.commentPattern) {\n\t\t\t\t\treturn !this.#options.commentPattern.test(line.trim());\n\t\t\t\t}\n\n\t\t\t\treturn true;\n\t\t\t})\n\t\t\t.join(\"\\n\")\n\t\t\t.trim();\n\n\t\tconst raw = parts.join(\"\\n\").trim();\n\t\tif (raw) parsedCommit.raw += \"\\n\" + raw;\n\n\t\treturn parsedCommit;\n\t}\n\n\t/**\n\t * Parse the commit subject into its expected parts\n\t * - type\n\t * - scope (optional)\n\t * - breaking change (optional)\n\t * - title\n\t *\n\t * @throws {ParserError}\n\t */\n\tparseSubject(commit: Commit) {\n\t\tif (!this.#options.subjectPattern) return false;\n\n\t\tconst subjectMatch = new RegExp(this.#options.subjectPattern, \"i\").exec(commit.subject);\n\n\t\tif (subjectMatch?.groups) {\n\t\t\tconst { type = \"\", scope = \"\", breakingChange = \"\", title = \"\" } = subjectMatch.groups;\n\n\t\t\tif (!type || !title) {\n\t\t\t\tthrow new ParserError(\"Unable to parse commit subject\", commit);\n\t\t\t}\n\n\t\t\tcommit.type = type;\n\t\t\tcommit.scope = scope;\n\t\t\tif (breakingChange) commit.breakingChange = breakingChange;\n\t\t\tcommit.title = title;\n\n\t\t\treturn true;\n\t\t}\n\n\t\treturn false;\n\t}\n\n\t/**\n\t * Parse merge information from the commit subject\n\t * @example\n\t * ```txt\n\t * \"Merge pull request #123 from fork-version/feature\"\n\t * ```\n\t */\n\tparseMerge(commit: Commit) {\n\t\tif (!this.#options.mergePattern) return false;\n\n\t\tconst mergeMatch = new RegExp(this.#options.mergePattern).exec(commit.subject);\n\n\t\tif (mergeMatch?.groups) {\n\t\t\tconst { id = \"\", source = \"\" } = mergeMatch.groups;\n\n\t\t\tcommit.merge = {\n\t\t\t\tid,\n\t\t\t\tsource,\n\t\t\t};\n\n\t\t\treturn true;\n\t\t}\n\n\t\treturn false;\n\t}\n\n\t/**\n\t * Parse revert information from the commit body\n\t * @example\n\t * ```txt\n\t * \"Revert \"feat: initial commit\"\n\t *\n\t * This reverts commit 4a79e9e546b4020d2882b7810dc549fa71960f4f.\"\n\t * ```\n\t */\n\tparseRevert(commit: Commit) {\n\t\tif (!this.#options.revertPattern) return false;\n\n\t\tconst revertMatch = new RegExp(this.#options.revertPattern).exec(commit.raw);\n\n\t\tif (revertMatch?.groups) {\n\t\t\tconst { hash = \"\", subject = \"\" } = revertMatch.groups;\n\n\t\t\tcommit.revert = {\n\t\t\t\thash,\n\t\t\t\tsubject,\n\t\t\t};\n\n\t\t\treturn true;\n\t\t}\n\n\t\treturn false;\n\t}\n\n\t/**\n\t * Search for mentions from the commit line\n\t * @example\n\t * ```txt\n\t * \"@fork-version\"\n\t * ```\n\t */\n\tparseMentions(line: string, outMentions: Set<string>) {\n\t\tif (!this.#options.mentionPattern) return false;\n\n\t\tconst mentionRegex = new RegExp(this.#options.mentionPattern, \"g\");\n\n\t\tlet foundMention = false;\n\t\tlet mentionMatch: RegExpExecArray | null;\n\t\twhile ((mentionMatch = mentionRegex.exec(line))) {\n\t\t\tif (!mentionMatch) {\n\t\t\t\tbreak;\n\t\t\t}\n\n\t\t\tconst { username = \"\" } = mentionMatch.groups ?? {};\n\n\t\t\toutMentions.add(username);\n\t\t\tfoundMention = true;\n\t\t}\n\n\t\treturn foundMention;\n\t}\n\n\t/**\n\t * Search for references from the commit line\n\t * @example\n\t * ```txt\n\t * \"#1234\"\n\t * \"owner/repo#1234\"\n\t * ```\n\t */\n\tparseReferenceParts(referenceText: string, action: string | null): CommitReference[] | undefined {\n\t\tif (!this.#options.issuePattern) return undefined;\n\n\t\tconst references: CommitReference[] = [];\n\n\t\tconst issueRegex = new RegExp(this.#options.issuePattern, \"gi\");\n\t\tlet issueMatch: RegExpExecArray | null;\n\t\twhile ((issueMatch = issueRegex.exec(referenceText))) {\n\t\t\tif (!issueMatch) {\n\t\t\t\tbreak;\n\t\t\t}\n\n\t\t\tconst { repository = \"\", prefix = \"\", issue = \"\" } = issueMatch.groups ?? {};\n\n\t\t\tconst reference: CommitReference = {\n\t\t\t\tprefix,\n\t\t\t\tissue,\n\t\t\t\taction,\n\t\t\t\towner: null,\n\t\t\t\trepository: null,\n\t\t\t};\n\n\t\t\tif (repository) {\n\t\t\t\tconst slashIndex = repository.indexOf(\"/\");\n\t\t\t\tif (slashIndex !== -1) {\n\t\t\t\t\treference.owner = repository.slice(0, slashIndex);\n\t\t\t\t\treference.repository = repository.slice(slashIndex + 1);\n\t\t\t\t} else {\n\t\t\t\t\treference.repository = repository;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\treferences.push(reference);\n\t\t}\n\n\t\tif (references.length > 0) {\n\t\t\treturn references;\n\t\t}\n\n\t\treturn undefined;\n\t}\n\n\t/**\n\t * Search for actions and references from the commit line\n\t * @example\n\t * ```txt\n\t * \"Closes #1234\"\n\t * \"fixes owner/repo#1234\"\n\t * ```\n\t */\n\tparseReferences(line: string, outReferences: CommitReference[]) {\n\t\tif (!this.#options.referenceActionPattern || !this.#options.issuePattern) return false;\n\n\t\tconst referenceActionRegex = new RegExp(this.#options.referenceActionPattern, \"gi\").test(line)\n\t\t\t? new RegExp(this.#options.referenceActionPattern, \"gi\")\n\t\t\t: /(?<reference>.*)/g;\n\n\t\tlet foundReference = false;\n\t\tlet referenceActionMatch: RegExpExecArray | null;\n\t\twhile ((referenceActionMatch = referenceActionRegex.exec(line))) {\n\t\t\tif (!referenceActionMatch) {\n\t\t\t\tbreak;\n\t\t\t}\n\n\t\t\tconst { action = \"\", reference = \"\" } = referenceActionMatch.groups ?? {};\n\n\t\t\tconst parsedReferences = this.parseReferenceParts(reference, action || null);\n\t\t\tif (!parsedReferences) {\n\t\t\t\tbreak;\n\t\t\t}\n\n\t\t\tfor (const ref of parsedReferences) {\n\t\t\t\tif (!outReferences.some((r) => r.prefix === ref.prefix && r.issue === ref.issue)) {\n\t\t\t\t\toutReferences.push(ref);\n\t\t\t\t}\n\t\t\t}\n\t\t\tfoundReference = true;\n\t\t}\n\n\t\treturn foundReference;\n\t}\n\n\t/**\n\t * Search for notes from the commit line\n\t * @example\n\t * ```txt\n\t * \"BREAKING CHANGE: this is a breaking change\"\n\t * ```\n\t */\n\tparseNotes(line: string, outNotes: CommitNote[]) {\n\t\tif (!this.#options.notePattern) return false;\n\n\t\tconst noteMatch = new RegExp(this.#options.notePattern, \"ig\").exec(line);\n\n\t\tif (noteMatch?.groups) {\n\t\t\tconst { title = \"\", text = \"\" } = noteMatch.groups;\n\n\t\t\toutNotes.push({\n\t\t\t\ttitle,\n\t\t\t\ttext,\n\t\t\t});\n\n\t\t\treturn true;\n\t\t}\n\n\t\treturn false;\n\t}\n\n\t/**\n\t * Parse the raw commit for mentions, references and notes\n\t */\n\tparseRawLines(commit: Commit) {\n\t\tconst mentions = new Set<string>();\n\t\tconst references: CommitReference[] = [];\n\t\tconst notes: CommitNote[] = [];\n\t\tlet lastNoteLine = -1;\n\n\t\tconst splitMessage = commit.raw.split(\"\\n\");\n\t\tfor (let index = 0; index < splitMessage.length; index++) {\n\t\t\tconst line = splitMessage[index];\n\t\t\tconst trimmedLine = line.trim();\n\n\t\t\tif (this.#options.commentPattern?.test(trimmedLine)) {\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\tthis.parseMentions(trimmedLine, mentions);\n\t\t\tconst foundReference = this.parseReferences(trimmedLine, references);\n\n\t\t\t// If we find a reference, we can assume the previous note is complete.\n\t\t\tif (foundReference) {\n\t\t\t\tlastNoteLine = -1;\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\t// Once we find a note line, we want to keep adding to the last note object\n\t\t\t// until we find a new note line which will create a new note object.\n\t\t\tif (this.parseNotes(trimmedLine, notes)) {\n\t\t\t\tlastNoteLine = index;\n\t\t\t} else if (lastNoteLine !== -1) {\n\t\t\t\tnotes[notes.length - 1].text += `\\n${line}`;\n\t\t\t\tlastNoteLine = index;\n\t\t\t}\n\t\t}\n\n\t\tif (mentions.size > 0) {\n\t\t\tcommit.mentions = Array.from(mentions);\n\t\t}\n\t\tif (references.length > 0) {\n\t\t\tcommit.references = references;\n\t\t}\n\t\tif (notes.length > 0) {\n\t\t\tcommit.notes = notes.map((note) => ({\n\t\t\t\t...note,\n\t\t\t\ttext: note.text.trim(),\n\t\t\t}));\n\t\t}\n\t}\n\n\t/**\n\t * Parse a commit log with the following format separated by new line characters:\n\t * ```txt\n\t * refactor: add test file\n\t * Add a test file to the project\n\t * 4ef2c86d393a9660aa9f753144256b1f200c16bd\n\t * 2024-12-22T17:36:50Z\n\t * Fork Version\n\t * fork-version@example.com\n\t * ```\n\t *\n\t * @example\n\t * ```ts\n\t * parse(\"refactor: add test file\\nAdd a test file to the project\\n4ef2c86d393a9660aa9f753144256b1f200c16bd\\n2024-12-22T17:36:50Z\\nFork Version\\nfork-version@example.com\");\n\t * ```\n\t *\n\t * The expected input value can be generated by running the following command:\n\t * ```sh\n\t * git log --format=\"%s%n%b%n%H%n%cI%n%cN%n%cE%n\"\n\t * ```\n\t * @see {@link https://git-scm.com/docs/pretty-formats|Git Pretty Format Documentation}\n\t */\n\tparse(rawCommit: string): Commit | undefined {\n\t\ttry {\n\t\t\tconst commit = this.parseRawCommit(rawCommit);\n\n\t\t\tthis.parseSubject(commit);\n\t\t\tthis.parseMerge(commit);\n\t\t\tthis.parseRevert(commit);\n\t\t\tthis.parseRawLines(commit);\n\n\t\t\treturn commit;\n\t\t} catch (error) {\n\t\t\tif (this.#logger) {\n\t\t\t\tthis.#logger.debug(\"[Commit Parser] Failed to parse commit\", { error });\n\t\t\t}\n\n\t\t\treturn undefined;\n\t\t}\n\t}\n}\n","import type { Commit } from \"./types\";\n\n/**\n * Filter out revert commits and their corresponding reverted commits,\n * this function expects the input to be sorted by date in descending order\n * from the most recent to the oldest commit.\n *\n * @example\n * ```ts\n * const commits: Commit[] = [...];\n * const filteredCommits = filterRevertedCommits(commits);\n * ```\n */\nexport function filterRevertedCommits(parsedCommits: Commit[]): Commit[] {\n\tconst revertedCommits: Commit[] = [];\n\n\tfor (const commit of parsedCommits) {\n\t\tif (!commit.revert) continue;\n\n\t\t// If this \"revert commit\" has been reverted, skip it\n\t\tif (\n\t\t\trevertedCommits.some(\n\t\t\t\t(r) => r.revert?.hash === commit.hash || r.revert?.subject === commit.subject,\n\t\t\t)\n\t\t) {\n\t\t\tcontinue;\n\t\t}\n\n\t\trevertedCommits.push(commit);\n\t}\n\n\t// If there are no reverts, return the original data\n\tif (revertedCommits.length === 0) {\n\t\treturn parsedCommits;\n\t}\n\n\tconst commitsWithoutReverts: Commit[] = [];\n\n\tfor (const commit of parsedCommits) {\n\t\tif (commit.revert) continue;\n\n\t\tconst revertedIndex = revertedCommits.findIndex(\n\t\t\t(r) => r.revert?.hash === commit.hash || r.revert?.subject === commit.subject,\n\t\t);\n\t\tif (revertedIndex !== -1) {\n\t\t\t// Remove the reverted commit from the list to prevent multiple removals.\n\t\t\trevertedCommits.splice(revertedIndex, 1);\n\t\t\tcontinue;\n\t\t}\n\n\t\tcommitsWithoutReverts.push(commit);\n\t}\n\n\treturn commitsWithoutReverts;\n}\n","import { CommitParser } from \"../commit-parser/commit-parser\";\nimport { filterRevertedCommits } from \"../commit-parser/filter-reverted-commits\";\nimport type { ForkConfig } from \"../config/types\";\nimport type { Logger } from \"../services/logger\";\nimport type { Git } from \"../services/git\";\nimport type { Commit } from \"../commit-parser/types\";\n\nexport interface CommitsSinceTag {\n\tlatestTag: string | undefined;\n\tcommits: Commit[];\n}\n\nexport async function getCommitsSinceTag(\n\tconfig: ForkConfig,\n\tlogger: Logger,\n\tgit: Git,\n): Promise<CommitsSinceTag> {\n\tconst commitParser = new CommitParser();\n\tif (config.debug) commitParser.setLogger(logger);\n\n\tconst latestTag = await git.getMostRecentTag(config.tagPrefix);\n\tif (!latestTag) {\n\t\tlogger.warn(\"No previous tag found, using all commits\");\n\t}\n\n\tconst foundCommits = await git.getCommits(latestTag, \"HEAD\");\n\tlogger.debug(`Found ${foundCommits.length} commits since last tag (${latestTag ?? \"none\"})`);\n\n\tconst commits = foundCommits.reduce((acc, commit) => {\n\t\tconst parsed = commitParser.parse(commit);\n\t\tif (parsed) {\n\t\t\tacc.push(parsed);\n\t\t}\n\t\treturn acc;\n\t}, [] as Commit[]);\n\tlogger.debug(`Parsed ${commits.length} commits after applying commit parser`);\n\n\tconst filteredCommits = filterRevertedCommits(commits);\n\tlogger.debug(`Filtered to ${filteredCommits.length} commits after removing reverts`);\n\n\treturn {\n\t\tlatestTag,\n\t\tcommits: filteredCommits,\n\t};\n}\n","import semver, { type ReleaseType } from \"semver\";\n\n/**\n * Get the priority of given type.\n * @example\n * - \"patch\" => 0\n * - \"minor\" => 1\n * - \"major\" => 2\n */\nfunction getPriority(type?: string): number {\n\treturn [\"patch\", \"minor\", \"major\"].indexOf(type ?? \"\");\n}\n\n/**\n * Get the given versions highest state.\n * @example\n * - \"patch\"\n * - \"minor\"\n * - \"major\"\n */\nfunction getVersionType(version: string): \"patch\" | \"minor\" | \"major\" | undefined {\n\tconst parseVersion = semver.parse(version);\n\n\tif (parseVersion?.major) {\n\t\treturn \"major\";\n\t} else if (parseVersion?.minor) {\n\t\treturn \"minor\";\n\t} else if (parseVersion?.patch) {\n\t\treturn \"patch\";\n\t}\n\n\treturn undefined;\n}\n\n/**\n * Get the recommended release type for the given version depending on if\n * the user asks for a prerelease with or without a tag.\n * ```js\n * getReleaseType(\"patch\", \"1.0.0\", false) => \"patch\"\n * getReleaseType(\"major\", \"0.0.0-beta\", \"beta\") => \"premajor\"\n * ```\n */\nexport function getReleaseType(\n\treleaseType: \"major\" | \"minor\" | \"patch\",\n\tcurrentVersion: string,\n\tpreReleaseTag?: string | boolean,\n): ReleaseType {\n\tif (!preReleaseTag) {\n\t\treturn releaseType;\n\t}\n\n\tconst currentVersionsIsPreRelease = Array.isArray(semver.prerelease(currentVersion));\n\tif (currentVersionsIsPreRelease) {\n\t\tconst currentReleaseType = getVersionType(currentVersion);\n\n\t\tif (\n\t\t\tcurrentReleaseType === releaseType ||\n\t\t\tgetPriority(currentReleaseType) > getPriority(releaseType)\n\t\t) {\n\t\t\treturn \"prerelease\";\n\t\t}\n\t}\n\n\treturn `pre${releaseType}`;\n}\n","import semver, { type ReleaseType } from \"semver\";\n\nimport { getReleaseType } from \"../utils/release-type\";\nimport type { ForkConfig } from \"../config/types\";\nimport type { Logger } from \"../services/logger\";\nimport type { Commit } from \"../commit-parser/types\";\n\nexport interface NextVersion {\n\tversion: string;\n\treleaseType?: ReleaseType;\n\tpreMajor?: boolean;\n\tchanges?: {\n\t\tmajor: number;\n\t\tminor: number;\n\t\tpatch: number;\n\t\tmerges: number;\n\t\treverts: number;\n\t};\n}\n\nexport async function getNextVersion(\n\tconfig: ForkConfig,\n\tlogger: Logger,\n\tcommits: Commit[],\n\tcurrentVersion: string,\n): Promise<NextVersion> {\n\tif (config.skipBump) {\n\t\tlogger.warn(`Skip bump, using ${currentVersion} as the next version`);\n\t\treturn {\n\t\t\tversion: currentVersion,\n\t\t};\n\t}\n\n\tif (config.nextVersion) {\n\t\tif (!semver.valid(config.nextVersion)) {\n\t\t\tthrow new Error(`Invalid Version: ${config.nextVersion}`);\n\t\t}\n\n\t\tlogger.log(`Next version: ${config.nextVersion}`);\n\t\treturn {\n\t\t\tversion: config.nextVersion,\n\t\t};\n\t}\n\n\tconst isPreMajor = semver.lt(currentVersion, \"1.0.0\");\n\tlet releaseType: \"major\" | \"minor\" | \"patch\" = \"patch\";\n\tconst changes = {\n\t\tmajor: 0,\n\t\tminor: 0,\n\t\tpatch: 0,\n\t\tmerges: 0,\n\t\treverts: 0,\n\t} satisfies NextVersion[\"changes\"];\n\n\tif (config.releaseAs) {\n\t\treleaseType = config.releaseAs;\n\t} else {\n\t\t/**\n\t\t * - 0 = major\n\t\t * - 1 = minor\n\t\t * - 2 = patch\n\t\t */\n\t\tlet level = 2;\n\t\tconst MINOR_TYPES = [\"feat\", \"feature\"];\n\n\t\tfor (const commit of commits) {\n\t\t\t// We shouldn't consider merge commits or reverts as changes.\n\t\t\tif (commit.merge) {\n\t\t\t\tchanges.merges += 1;\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\tif (commit.revert) {\n\t\t\t\tchanges.reverts += 1;\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\tif (commit.notes.length > 0 || commit.breakingChange) {\n\t\t\t\tchanges.major += commit.notes.length + (commit.breakingChange ? 1 : 0);\n\t\t\t\tlevel = 0;\n\t\t\t} else if (MINOR_TYPES.includes(commit.type.toLowerCase())) {\n\t\t\t\tchanges.minor += 1;\n\t\t\t\tif (level === 2) {\n\t\t\t\t\tlevel = 1;\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tchanges.patch += 1;\n\t\t\t}\n\t\t}\n\n\t\t// If we are pre 1.0.0, we want to downgrade major bumps to minor, and minor bumps to patch.\n\t\t// This is because 0.x.y versions are considered unstable, and breaking changes are expected.\n\t\tif (isPreMajor && level < 2) {\n\t\t\tlevel++;\n\t\t\tchanges.patch += changes.minor;\n\t\t\tchanges.minor = changes.major;\n\t\t\tchanges.major = 0;\n\t\t}\n\n\t\tif (level === 0) {\n\t\t\treleaseType = \"major\";\n\t\t} else if (level === 1) {\n\t\t\treleaseType = \"minor\";\n\t\t} else {\n\t\t\treleaseType = \"patch\";\n\t\t}\n\t}\n\n\tconst releaseTypeOrPreRelease = getReleaseType(releaseType, currentVersion, config.preRelease);\n\tconst nextVersion =\n\t\tsemver.inc(\n\t\t\tcurrentVersion,\n\t\t\treleaseTypeOrPreRelease,\n\t\t\ttypeof config.preRelease === \"string\" ? config.preRelease : \"\",\n\t\t) ?? \"\";\n\n\tlogger.log(`Next version: ${nextVersion} (${releaseTypeOrPreRelease})`);\n\n\tif (commits.length > 0) {\n\t\tlogger.log(\n\t\t\t` - Commits: ${commits.length}` +\n\t\t\t\t(changes.major > 0 ? `, Majors: ${changes.major}` : \"\") +\n\t\t\t\t(changes.minor > 0 ? `, Minors: ${changes.minor}` : \"\") +\n\t\t\t\t(changes.patch > 0 ? `, Patches: ${changes.patch}` : \"\") +\n\t\t\t\t(changes.reverts > 0 ? `, Reverts: ${changes.reverts}` : \"\") +\n\t\t\t\t(changes.merges > 0 ? `, Merges: ${changes.merges}` : \"\"),\n\t\t);\n\t} else {\n\t\tlogger.log(\" - No commits found.\");\n\t}\n\n\treturn {\n\t\tversion: nextVersion,\n\t\treleaseType: releaseTypeOrPreRelease,\n\t\tpreMajor: isPreMajor,\n\t\tchanges,\n\t};\n}\n","import { resolve } from \"node:path\";\nimport { writeFileSync, readFileSync } from \"node:fs\";\nimport conventionalChangelog from \"conventional-changelog\";\n\nimport { fileExists } from \"../utils/file-state\";\nimport type { ForkConfig } from \"../config/types\";\nimport type { Logger } from \"../services/logger\";\n\n/**\n * Matches the following changelog header formats:\n * - `## [1.2.3]`\n * - `<a name=\"1.2.3\"></a>`\n */\nconst RELEASE_PATTERN = /(^#+ \\[?[0-9]+\\.[0-9]+\\.[0-9]+|<a name=)/m;\n\n/**\n * Get the existing changelog content from the latest release onwards.\n * @see {@link RELEASE_PATTERN}\n */\nfunction getOldReleaseContent(filePath: string, exists: boolean): string {\n\tif (exists) {\n\t\tconst fileContents = readFileSync(filePath, \"utf-8\");\n\t\tconst oldContentStart = fileContents.search(RELEASE_PATTERN);\n\n\t\tif (oldContentStart !== -1) {\n\t\t\treturn fileContents.substring(oldContentStart);\n\t\t}\n\t}\n\n\treturn \"\";\n}\n\n/**\n * Generate the new changelog content for this release.\n */\nfunction getNewReleaseContent(\n\tconfig: ForkConfig,\n\tlogger: Logger,\n\tnextVersion: string,\n): Promise<string> {\n\treturn new Promise<string>((onResolve) => {\n\t\tlet newContent = \"\";\n\n\t\tconventionalChangelog(\n\t\t\t{\n\t\t\t\tpreset: {\n\t\t\t\t\tname: \"conventionalcommits\",\n\t\t\t\t\t...config.changelogPresetConfig,\n\t\t\t\t},\n\t\t\t\ttagPrefix: config.tagPrefix,\n\t\t\t\twarn: (...message: string[]) => logger.debug(\"[conventional-changelog] \", ...message),\n\t\t\t\tcwd: config.path,\n\t\t\t},\n\t\t\t{\n\t\t\t\tversion: nextVersion,\n\t\t\t},\n\t\t\t{\n\t\t\t\tmerges: null,\n\t\t\t\tpath: config.path,\n\t\t\t},\n\t\t)\n\t\t\t.on(\"error\", (cause) => {\n\t\t\t\tthrow new Error(\"[conventional-changelog] Unable to parse changes\", { cause });\n\t\t\t})\n\t\t\t.on(\"data\", (chunk) => {\n\t\t\t\tnewContent += chunk.toString();\n\t\t\t})\n\t\t\t.on(\"end\", () => {\n\t\t\t\tonResolve(newContent);\n\t\t\t});\n\t});\n}\n\nexport async function updateChangelog(\n\tconfig: ForkConfig,\n\tlogger: Logger,\n\tnextVersion: string,\n): Promise<void> {\n\tif (config.skipChangelog) {\n\t\tlogger.warn(\"Skip changelog update\");\n\t\treturn;\n\t}\n\n\tif (config.header.search(RELEASE_PATTERN) !== -1) {\n\t\t// Need to ensure the header doesn't contain the release pattern\n\t\tthrow new Error(\"Header cannot contain release pattern\");\n\t}\n\n\t// Create the changelog file if it doesn't exist\n\tconst changelogPath = resolve(config.path, config.changelog);\n\n\tif (!config.dryRun && !fileExists(changelogPath)) {\n\t\tlogger.log(`Creating changelog: ${changelogPath}`);\n\t\twriteFileSync(changelogPath, \"\\n\", \"utf8\");\n\t} else {\n\t\tlogger.log(`Updating changelog: ${changelogPath}`);\n\t}\n\n\tconst oldContent = getOldReleaseContent(changelogPath, fileExists(changelogPath));\n\tconst newContent = await getNewReleaseContent(config, logger, nextVersion);\n\n\tif (!config.dryRun && newContent) {\n\t\twriteFileSync(\n\t\t\tchangelogPath,\n\t\t\t`${config.header}\n${newContent}\n${oldContent}\n`.trim(),\n\t\t\t\"utf8\",\n\t\t);\n\t}\n}\n","/**\n * Formats the commit message by replacing the `{{currentTag}}` placeholder\n * globally with the new version.\n *\n * Falls back to `chore(release): {{currentTag}}` if message is argument is falsy.\n */\nexport function formatCommitMessage(message: string | undefined, version: string): string {\n\tif (!message) {\n\t\tmessage = \"chore(release): {{currentTag}}\";\n\t}\n\n\treturn message.replace(new RegExp(\"{{currentTag}}\", \"g\"), version);\n}\n","import { resolve } from \"node:path\";\nimport { formatCommitMessage } from \"../utils/format-commit-message\";\nimport { fileExists } from \"../utils/file-state\";\nimport type { ForkConfig } from \"../config/types\";\nimport type { FileState } from \"../files/file-manager\";\nimport type { Logger } from \"../services/logger\";\nimport type { Git } from \"../services/git\";\n\nexport async function commitChanges(\n\tconfig: ForkConfig,\n\tlogger: Logger,\n\tgit: Git,\n\tfiles: FileState[],\n\tnextVersion: string,\n): Promise<void> {\n\tif (config.skipCommit) {\n\t\tlogger.warn(\"Skip commit\");\n\t\treturn;\n\t}\n\n\tlogger.log(\"Committing changes\");\n\n\tconst filesToCommit: string[] = [];\n\tif (fileExists(resolve(config.path, config.changelog))) {\n\t\tfilesToCommit.push(resolve(config.path, config.changelog));\n\t}\n\tfor (const file of files) {\n\t\tfilesToCommit.push(file.path);\n\t}\n\n\t// If there are no files to commit don't continue.\n\tif (filesToCommit.length === 0) {\n\t\treturn;\n\t}\n\n\tif (config.commitAll) {\n\t\tawait git.add(\"--all\");\n\t} else {\n\t\tawait git.add(...filesToCommit);\n\t}\n\n\tconst shouldVerify = config.verify ? undefined : \"--no-verify\";\n\tconst shouldSign = config.sign ? \"--gpg-sign\" : \"--no-gpg-sign\";\n\n\tawait git.commit(\n\t\tshouldVerify,\n\t\tshouldSign,\n\t\t\"--message\",\n\t\tformatCommitMessage(config.changelogPresetConfig?.releaseCommitMessageFormat, nextVersion),\n\t);\n}\n","import { formatCommitMessage } from \"../utils/format-commit-message\";\nimport type { ForkConfig } from \"../config/types\";\nimport type { Logger } from \"../services/logger\";\nimport type { Git } from \"../services/git\";\n\nexport async function tagChanges(\n\tconfig: ForkConfig,\n\tlogger: Logger,\n\tgit: Git,\n\tnextVersion: string,\n): Promise<void> {\n\tif (config.skipTag) {\n\t\tlogger.warn(\"Skip tag creation\");\n\t\treturn;\n\t}\n\n\t/** @example \"v1.2.3\" or \"version/1.2.3\" */\n\tconst tag = `${config.tagPrefix}${nextVersion}`;\n\n\tlogger.log(`Creating tag: ${tag}`);\n\n\tconst shouldSign = config.sign ? \"--sign\" : \"--no-sign\";\n\n\tawait git.tag(\n\t\tshouldSign,\n\t\t\"--annotate\",\n\t\ttag,\n\t\t\"--message\",\n\t\tformatCommitMessage(config.changelogPresetConfig?.releaseCommitMessageFormat, nextVersion),\n\t);\n}\n","import { getCommitsSinceTag } from \"../process/get-commits\";\nimport { getCurrentVersion } from \"../process/get-current-version\";\nimport { getNextVersion } from \"../process/get-next-version\";\nimport { updateChangelog } from \"../process/changelog\";\nimport { commitChanges } from \"../process/commit\";\nimport { tagChanges } from \"../process/tag\";\n\nimport type { ForkConfig } from \"../config/types\";\nimport type { Logger } from \"../services/logger\";\nimport type { FileManager } from \"../files/file-manager\";\nimport type { Git } from \"../services/git\";\n\nexport async function main(config: ForkConfig, logger: Logger, fileManager: FileManager, git: Git) {\n\tlogger.log(`Running fork-version - ${new Date().toUTCString()}`);\n\tlogger.warn(config.dryRun ? \"[Dry Run] No changes will be written to disk.\\n\" : \"\");\n\n\tconst commits = await getCommitsSinceTag(config, logger, git);\n\tconst current = await getCurrentVersion(config, logger, git, fileManager, config.files);\n\tconst next = await getNextVersion(config, logger, commits.commits, current.version);\n\n\tlogger.log(\"Updating files: \");\n\tfor (const outFile of current.files) {\n\t\tlogger.log(` - ${outFile.path}`);\n\n\t\tfileManager.write(outFile, next.version);\n\t}\n\n\tawait updateChangelog(config, logger, next.version);\n\tawait commitChanges(config, logger, git, current.files, next.version);\n\tawait tagChanges(config, logger, git, next.version);\n\n\treturn {\n\t\tconfig,\n\t\tcommits,\n\t\tcurrent,\n\t\tnext,\n\t};\n}\n"]}
|