fork-version 1.7.0 → 1.7.3

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 CHANGED
@@ -1,5 +1,29 @@
1
1
  # Fork Version
2
2
 
3
+ ## 1.7.3 (2024-11-03)
4
+
5
+
6
+ ### Refactor
7
+
8
+ * general cleanup of error message handling ([#78](https://github.com/eglavin/fork-version/issues/78)) ([a83ff13](https://github.com/eglavin/fork-version/commit/a83ff13443d50edfba18c5502d9c38e834e3236d))
9
+
10
+
11
+ ## 1.7.2 (2024-11-02)
12
+
13
+
14
+ ### Chore
15
+
16
+ * bump pnpm dependency ([#77](https://github.com/eglavin/fork-version/issues/77)) ([158c70c](https://github.com/eglavin/fork-version/commit/158c70c06311fb624be03b522c06730f8f314d37))
17
+
18
+
19
+ ## 1.7.1 (2024-11-01)
20
+
21
+
22
+ ### Docs
23
+
24
+ * update using npx section of readme ([737a72a](https://github.com/eglavin/fork-version/commit/737a72a8485a5e1035543245c498e9f76ce1050b))
25
+
26
+
3
27
  ## 1.7.0 (2024-10-31)
4
28
 
5
29
 
package/README.md CHANGED
@@ -41,19 +41,28 @@ Fork-Version can be configured either through a config file or by passing option
41
41
 
42
42
  ### Using `npx` (Recommended)
43
43
 
44
- To use Fork-Version with `npx` you can use the following command, by using `npx` you can also use Fork-Version without installation and on other projects including non node projects.
44
+ To use Fork-Version without installation you can use `npx`:
45
45
 
46
46
  ```sh
47
47
  npx fork-version
48
48
  ```
49
49
 
50
+ `npx` is a package runner which allows you to execute npm packages without installation, this can be useful when working on projects outside of the Node ecosystem.
51
+
50
52
  > [!NOTE]
51
- > If you want to use a specific version you can add a version tag to the end of the name.
53
+ > By default `npx` will use the latest release, if you want to use a specific version you can add a version tag to the end of the name.
52
54
  >
53
- > Example: `npx fork-version@1.4.67`
55
+ > Example: `npx fork-version@1.7.0`
54
56
  >
55
57
  > The version tag needs to match against one of the [published versions on npm](https://www.npmjs.com/package/fork-version?activeTab=versions).
56
58
 
59
+ Alternatively you can use other npm compatible javascript runtime's:
60
+
61
+ | Runner | Command |
62
+ | ------ | -------------------------- |
63
+ | bun | `bunx fork-version` |
64
+ | deno | `deno -A npm:fork-version` |
65
+
57
66
  ### Install Locally
58
67
 
59
68
  To install the package locally to your project you can use one of the following commands:
@@ -63,6 +72,7 @@ To install the package locally to your project you can use one of the following
63
72
  | npm | `npm install fork-version --save-dev` |
64
73
  | yarn | `yarn add fork-version --dev` |
65
74
  | pnpm | `pnpm add fork-version --save-dev` |
75
+ | bun | `bun install fork-version --dev` |
66
76
 
67
77
  You can then add the following entry to your package.json scripts section and use it like any other script you already use in your project.
68
78
 
@@ -76,6 +86,16 @@ You can then add the following entry to your package.json scripts section and us
76
86
 
77
87
  For example if you use npm you can now use `npm run release` to run Fork-Version.
78
88
 
89
+ ### Exit Codes
90
+
91
+ When ran as a cli tool Fork-Version will exit with one of the following exit codes:
92
+
93
+ | Exit Code | Description |
94
+ | --------- | ---------------------------- |
95
+ | 0 | Success |
96
+ | 1 | General Error |
97
+ | 3 | Config File Validation Error |
98
+
79
99
  ### Command Line Options
80
100
 
81
101
  <!-- START COMMAND LINE OPTIONS -->
@@ -129,6 +149,11 @@ Conventional Changelog Overrides:
129
149
  --release-commit-message-format Override the default release commit message format.
130
150
  --release-message-suffix Add a suffix to the end of the release message.
131
151
 
152
+ Exit Codes:
153
+ 0: Success
154
+ 1: General Error
155
+ 3: Config File Validation Error
156
+
132
157
  Examples:
133
158
  $ fork-version
134
159
  Run fork-version in the current directory with default options.
@@ -390,6 +390,11 @@ Conventional Changelog Overrides:
390
390
  --release-commit-message-format Override the default release commit message format.
391
391
  --release-message-suffix Add a suffix to the end of the release message.
392
392
 
393
+ Exit Codes:
394
+ 0: Success
395
+ 1: General Error
396
+ 3: Config File Validation Error
397
+
393
398
  Examples:
394
399
  $ fork-version
395
400
  Run fork-version in the current directory with default options.
@@ -404,7 +409,7 @@ Examples:
404
409
  Run fork-version and update all "package.json" files in subdirectories.`;
405
410
  function getCliArguments() {
406
411
  return meow__default.default(helperText, {
407
- importMeta: ({ url: (typeof document === 'undefined' ? require('u' + 'rl').pathToFileURL(__filename).href : (_documentCurrentScript && _documentCurrentScript.tagName.toUpperCase() === 'SCRIPT' && _documentCurrentScript.src || new URL('chunk-U3KD6MC3.cjs', document.baseURI).href)) }),
412
+ importMeta: ({ url: (typeof document === 'undefined' ? require('u' + 'rl').pathToFileURL(__filename).href : (_documentCurrentScript && _documentCurrentScript.tagName.toUpperCase() === 'SCRIPT' && _documentCurrentScript.src || new URL('chunk-PKSCXRF2.cjs', document.baseURI).href)) }),
408
413
  booleanDefault: void 0,
409
414
  helpIndent: 0,
410
415
  flags: {
@@ -602,7 +607,7 @@ async function loadConfigFile(configFilePath) {
602
607
  if (fileContent2[PACKAGE_JSON_CONFIG_KEY] && typeof fileContent2[PACKAGE_JSON_CONFIG_KEY] === "object") {
603
608
  const parsed3 = ForkConfigSchema.partial().safeParse(fileContent2[PACKAGE_JSON_CONFIG_KEY]);
604
609
  if (!parsed3.success) {
605
- throw parsed3.error;
610
+ throw new Error(`Validation error in: ${configFilePath}`, { cause: parsed3.error });
606
611
  }
607
612
  return parsed3.data;
608
613
  }
@@ -610,14 +615,14 @@ async function loadConfigFile(configFilePath) {
610
615
  }
611
616
  const parsed2 = ForkConfigSchema.partial().safeParse(fileContent2);
612
617
  if (!parsed2.success) {
613
- throw parsed2.error;
618
+ throw new Error(`Validation error in: ${configFilePath}`, { cause: parsed2.error });
614
619
  }
615
620
  return parsed2.data;
616
621
  }
617
622
  const fileContent = await bundleRequire.bundleRequire({ filepath: configFilePath });
618
623
  const parsed = ForkConfigSchema.partial().safeParse(fileContent.mod.default || fileContent.mod);
619
624
  if (!parsed.success) {
620
- throw parsed.error;
625
+ throw new Error(`Validation error in: ${configFilePath}`, { cause: parsed.error });
621
626
  }
622
627
  return parsed.data;
623
628
  }
@@ -708,7 +713,7 @@ var JSONPackage = class {
708
713
  isPrivate: typeof parsedJson?.private === "boolean" ? parsedJson.private : true
709
714
  };
710
715
  }
711
- this.logger.warn(`[File Manager] Unable to determine json package: ${fileName}`);
716
+ this.logger.warn(`[File Manager] Unable to determine json version: ${fileName}`);
712
717
  }
713
718
  }
714
719
  write(fileState, newVersion) {
@@ -770,7 +775,7 @@ var YAMLPackage = class {
770
775
  };
771
776
  }
772
777
  }
773
- this.logger.warn(`[File Manager] Unable to determine PubSpec file: ${fileName}`);
778
+ this.logger.warn(`[File Manager] Unable to determine yaml version: ${fileName}`);
774
779
  }
775
780
  write(fileState, newVersion) {
776
781
  const fileContents = fs.readFileSync(fileState.path, "utf8");
@@ -801,7 +806,7 @@ var PlainText = class {
801
806
  version: fileContents || ""
802
807
  };
803
808
  }
804
- this.logger.warn(`[File Manager] Unable to determine plain text: ${fileName}`);
809
+ this.logger.warn(`[File Manager] Unable to determine plain text version: ${fileName}`);
805
810
  }
806
811
  write(fileState, newVersion) {
807
812
  fs.writeFileSync(fileState.path, newVersion, "utf8");
@@ -831,7 +836,7 @@ var MSBuildProject = class {
831
836
  version
832
837
  };
833
838
  }
834
- this.logger.warn(`[File Manager] Unable to determine ms-build package: ${fileName}`);
839
+ this.logger.warn(`[File Manager] Unable to determine ms-build version: ${fileName}`);
835
840
  }
836
841
  }
837
842
  write(fileState, newVersion) {
@@ -968,17 +973,20 @@ function getReleaseType(releaseType, currentVersion, preReleaseTag) {
968
973
  }
969
974
 
970
975
  // src/process/version.ts
971
- async function getCurrentVersion(config, logger, fileManager, filesToUpdate) {
976
+ async function getCurrentVersion(config, logger, git, fileManager, filesToUpdate) {
972
977
  const files = [];
973
978
  const versions = /* @__PURE__ */ new Set();
974
979
  for (const file of filesToUpdate) {
980
+ if (await git.shouldIgnore(file)) {
981
+ logger.debug(`[Git Ignored] ${file}`);
982
+ continue;
983
+ }
975
984
  const fileState = fileManager.read(file);
976
985
  if (fileState) {
977
986
  files.push(fileState);
978
- if (config.currentVersion) {
979
- continue;
987
+ if (!config.currentVersion) {
988
+ versions.add(fileState.version);
980
989
  }
981
- versions.add(fileState.version);
982
990
  }
983
991
  }
984
992
  if (config.currentVersion) {
@@ -987,7 +995,7 @@ async function getCurrentVersion(config, logger, fileManager, filesToUpdate) {
987
995
  if (versions.size === 0 && config.gitTagFallback) {
988
996
  const version = await getLatestGitTagVersion(config.tagPrefix);
989
997
  if (version) {
990
- logger.log(`[Version] Using git tag fallback.`);
998
+ logger.warn(`Using latest git tag fallback`);
991
999
  versions.add(version);
992
1000
  }
993
1001
  }
@@ -997,8 +1005,9 @@ async function getCurrentVersion(config, logger, fileManager, filesToUpdate) {
997
1005
  if (!config.allowMultipleVersions) {
998
1006
  throw new Error("Found multiple versions");
999
1007
  }
1000
- logger.warn("[WARNING] Found multiple versions, using the first one.");
1001
- logger.log(`Versions: ${Array.from(versions).join(", ")}`);
1008
+ logger.warn(
1009
+ `Found multiple versions (${Array.from(versions).join(", ")}), using the higher semver version`
1010
+ );
1002
1011
  }
1003
1012
  const currentVersion = semver3__default.default.rsort(Array.from(versions))[0];
1004
1013
  if (config.inspectVersion) {
@@ -1013,7 +1022,7 @@ async function getCurrentVersion(config, logger, fileManager, filesToUpdate) {
1013
1022
  }
1014
1023
  async function getNextVersion(config, logger, currentVersion) {
1015
1024
  if (config.skipBump) {
1016
- logger.log("Skip bump, using current version as next version");
1025
+ logger.warn(`Skip bump, using ${currentVersion} as the next version`);
1017
1026
  return {
1018
1027
  version: currentVersion
1019
1028
  };
@@ -1026,14 +1035,14 @@ async function getNextVersion(config, logger, currentVersion) {
1026
1035
  }
1027
1036
  const isPreMajor = semver3__default.default.lt(currentVersion, "1.0.0");
1028
1037
  let recommendedBump;
1029
- try {
1030
- if (config.releaseAs) {
1031
- recommendedBump = {
1032
- releaseType: config.releaseAs,
1033
- level: -1,
1034
- reason: "User defined"
1035
- };
1036
- } else {
1038
+ if (config.releaseAs) {
1039
+ recommendedBump = {
1040
+ releaseType: config.releaseAs,
1041
+ level: -1,
1042
+ reason: "User defined"
1043
+ };
1044
+ } else {
1045
+ try {
1037
1046
  recommendedBump = await conventionalRecommendedBump__default.default({
1038
1047
  preset: {
1039
1048
  name: "conventionalcommits",
@@ -1044,9 +1053,11 @@ async function getNextVersion(config, logger, currentVersion) {
1044
1053
  tagPrefix: config.tagPrefix,
1045
1054
  cwd: config.path
1046
1055
  });
1056
+ } catch (cause) {
1057
+ throw new Error(`[conventional-recommended-bump] Unable to determine next version`, {
1058
+ cause
1059
+ });
1047
1060
  }
1048
- } catch (_error) {
1049
- throw new Error(`[conventional-recommended-bump] Unable to determine next version`);
1050
1061
  }
1051
1062
  if (recommendedBump.releaseType) {
1052
1063
  const releaseType = getReleaseType(
@@ -1054,18 +1065,18 @@ async function getNextVersion(config, logger, currentVersion) {
1054
1065
  currentVersion,
1055
1066
  config.preRelease
1056
1067
  );
1057
- const state = {
1068
+ const nextVersion = semver3__default.default.inc(
1069
+ currentVersion,
1070
+ releaseType,
1071
+ typeof config.preRelease === "string" ? config.preRelease : void 0
1072
+ ) ?? "";
1073
+ logger.log(`Next version: ${nextVersion} (${releaseType})`);
1074
+ return {
1058
1075
  ...recommendedBump,
1059
1076
  preMajor: isPreMajor,
1060
1077
  releaseType,
1061
- version: semver3__default.default.inc(
1062
- currentVersion,
1063
- releaseType,
1064
- typeof config.preRelease === "string" ? config.preRelease : void 0
1065
- ) ?? ""
1078
+ version: nextVersion
1066
1079
  };
1067
- logger.log(`Next version: ${state.version} (${state.releaseType})`);
1068
- return state;
1069
1080
  }
1070
1081
  throw new Error("Unable to find next version");
1071
1082
  }
@@ -1100,9 +1111,8 @@ function getNewReleaseContent(config, logger, nextVersion) {
1100
1111
  merges: null,
1101
1112
  path: config.path
1102
1113
  }
1103
- ).on("error", (error) => {
1104
- logger.error("[conventional-changelog] Unable to parse changes");
1105
- throw error;
1114
+ ).on("error", (cause) => {
1115
+ throw new Error("[conventional-changelog] Unable to parse changes", { cause });
1106
1116
  }).on("data", (chunk) => {
1107
1117
  newContent += chunk.toString();
1108
1118
  }).on("end", () => {
@@ -1112,7 +1122,7 @@ function getNewReleaseContent(config, logger, nextVersion) {
1112
1122
  }
1113
1123
  async function updateChangelog(config, logger, nextVersion) {
1114
1124
  if (config.skipChangelog) {
1115
- logger.log("Skip changelog update");
1125
+ logger.warn("Skip changelog update");
1116
1126
  return;
1117
1127
  }
1118
1128
  if (config.header.search(RELEASE_PATTERN) !== -1) {
@@ -1120,12 +1130,13 @@ async function updateChangelog(config, logger, nextVersion) {
1120
1130
  }
1121
1131
  const changelogPath = path.resolve(config.path, config.changelog);
1122
1132
  if (!config.dryRun && !fileExists(changelogPath)) {
1123
- logger.log(`Creating Changelog file: ${changelogPath}`);
1133
+ logger.log(`Creating Changelog: ${changelogPath}`);
1124
1134
  fs.writeFileSync(changelogPath, "\n", "utf8");
1135
+ } else {
1136
+ logger.log(`Updating Changelog: ${changelogPath}`);
1125
1137
  }
1126
1138
  const oldContent = getOldReleaseContent(changelogPath, fileExists(changelogPath));
1127
1139
  const newContent = await getNewReleaseContent(config, logger, nextVersion);
1128
- logger.log(`Updating Changelog: ${changelogPath}`);
1129
1140
  if (!config.dryRun && newContent) {
1130
1141
  fs.writeFileSync(
1131
1142
  changelogPath,
@@ -1149,7 +1160,7 @@ function formatCommitMessage(message, version) {
1149
1160
  // src/process/commit.ts
1150
1161
  async function commitChanges(config, logger, git, files, nextVersion) {
1151
1162
  if (config.skipCommit) {
1152
- logger.log("Skip commit");
1163
+ logger.warn("Skip commit");
1153
1164
  return;
1154
1165
  }
1155
1166
  logger.log("Committing changes");
@@ -1181,7 +1192,7 @@ async function commitChanges(config, logger, git, files, nextVersion) {
1181
1192
  // src/process/tag.ts
1182
1193
  async function tagChanges(config, logger, git, nextVersion) {
1183
1194
  if (config.skipTag) {
1184
- logger.log("Skip tag creation");
1195
+ logger.warn("Skip tag creation");
1185
1196
  return;
1186
1197
  }
1187
1198
  const tag = `${config.tagPrefix}${nextVersion}`;
@@ -1204,5 +1215,5 @@ exports.getNextVersion = getNextVersion;
1204
1215
  exports.getUserConfig = getUserConfig;
1205
1216
  exports.tagChanges = tagChanges;
1206
1217
  exports.updateChangelog = updateChangelog;
1207
- //# sourceMappingURL=chunk-U3KD6MC3.cjs.map
1208
- //# sourceMappingURL=chunk-U3KD6MC3.cjs.map
1218
+ //# sourceMappingURL=chunk-PKSCXRF2.cjs.map
1219
+ //# sourceMappingURL=chunk-PKSCXRF2.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/config/schema.js","../src/config/defaults.ts","../src/config/cli-arguments.js","../src/config/changelog-preset-config.ts","../src/config/detect-git-host.ts","../src/config/user-config.ts","../src/utils/logger.ts","../src/utils/file-state.ts","../src/strategies/json-package.ts","../src/strategies/yaml-package.ts","../src/strategies/plain-text.ts","../src/strategies/ms-build-project.ts","../src/strategies/file-manager.ts","../src/utils/git-tag-version.ts","../src/utils/release-type.ts","../src/process/version.ts","../src/process/changelog.ts","../src/utils/format-commit-message.ts","../src/process/commit.ts","../src/process/tag.ts"],"names":["z","meow","conventionalChangelogConfigSpec","execFile","resolve","JoyCon","parse","glob","fileContent","readFileSync","parsed","bundleRequire","lstatSync","writeFileSync","modify","applyEdits","parseDocument","cheerio","gitSemverTags","semver","conventionalRecommendedBump","conventionalChangelog"],"mappings":"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","file":"chunk-PKSCXRF2.cjs","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 * If set, Fork-Version will print the current version and exit.\n\t * @default false\n\t */\n\tinspectVersion: z\n\t\t.boolean()\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 * @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","import type { ForkConfig } from \"./types\";\n\nexport const DEFAULT_CONFIG: ForkConfig = {\n\t// Commands\n\tinspectVersion: false,\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 meow from \"meow\";\n//@ts-check\n\n// This file is javascript so the following helper text can be extracted to the readme\n// without the need for a build step, otherwise it would also be typescript...\n\nexport const helperText = `Usage:\n $ fork-version [options]\n\nCommands:\n --help Show this help message.\n --version Show the current version of Fork-Version.\n --inspect-version If set, Fork-Version will print the current project version and exit.\n\nOptions:\n --file, -F List of the files to be updated. [Default: [\"bower.json\", \"deno.json\", \"deno.jsonc\", \"jsr.json\", \"jsr.jsonc\", \"manifest.json\", \"npm-shrinkwrap.json\", \"package-lock.json\", \"package.json\"]]\n --glob, -G Glob pattern to match files to be updated.\n --path, -P The path Fork-Version will run from. [Default: process.cwd()]\n --changelog Name of the changelog file. [Default: \"CHANGELOG.md\"]\n --header The header text for the changelog.\n --tag-prefix Specify a prefix for the created tag. [Default: \"v\"]\n --pre-release Mark this release as a pre-release.\n --pre-release-tag Mark this release with a tagged pre-release. [Example: \"alpha\", \"beta\", \"rc\"]\n --current-version If set, Fork-Version will use this version instead of trying to determine one.\n --next-version If set, Fork-Version will attempt to update to this version, instead of incrementing using \"conventional-commit\".\n --release-as Release as increments the version by the specified level. [Choices: \"major\", \"minor\", \"patch\"]\n\nFlags:\n --allow-multiple-versions Don't throw an error if multiple versions are found in the given files. [Default: true]\n --commit-all Commit all changes, not just files updated by Fork-Version.\n --changelog-all If this flag is set, all default commit types will be added to the changelog.\n --debug Output debug information.\n --dry-run No output will be written to disk or committed.\n --silent Run without logging to the terminal.\n --git-tag-fallback If unable to find a version in the given files, fallback and attempt to use the latest git tag. [Default: true]\n --sign If true, git will sign the commit with the systems GPG key.\n --verify If true, git will run user defined git hooks before committing.\n\n To negate a flag you can prefix it with \"no-\", for example \"--no-git-tag-fallback\" will not fallback to the latest git tag.\n\nSkip Steps:\n --skip-bump Skip the version bump step.\n --skip-changelog Skip updating the changelog.\n --skip-commit Skip committing the changes.\n --skip-tag Skip tagging the commit.\n\nConventional Changelog Overrides:\n --commit-url-format Override the default commit URL format.\n --compare-url-format Override the default compare URL format.\n --issue-url-format Override the default issue URL format.\n --user-url-format Override the default user URL format.\n --release-commit-message-format Override the default release commit message format.\n --release-message-suffix Add a suffix to the end of the release message.\n\nExit Codes:\n 0: Success\n 1: General Error\n 3: Config File Validation Error\n\nExamples:\n $ fork-version\n Run fork-version in the current directory with default options.\n\n $ fork-version --path ./packages/my-package\n Run fork-version in the \"./packages/my-package\" directory.\n\n $ fork-version --file package.json --file MyApi.csproj\n Run fork-version and update the \"package.json\" and \"MyApi.csproj\" files.\n\n $ fork-version --glob \"*/package.json\"\n Run fork-version and update all \"package.json\" files in subdirectories.`;\n\nexport function getCliArguments() {\n\treturn meow(helperText, {\n\t\timportMeta: import.meta,\n\t\tbooleanDefault: undefined,\n\t\thelpIndent: 0,\n\t\tflags: {\n\t\t\t// Commands\n\t\t\tinspectVersion: { type: \"boolean\" },\n\n\t\t\t// Options\n\t\t\tfiles: { type: \"string\", isMultiple: true, aliases: [\"file\"], shortFlag: \"F\" },\n\t\t\tglob: { type: \"string\", shortFlag: \"G\" },\n\t\t\tpath: { type: \"string\", shortFlag: \"P\" },\n\t\t\tchangelog: { type: \"string\" },\n\t\t\theader: { type: \"string\" },\n\t\t\ttagPrefix: { type: \"string\" },\n\t\t\tpreRelease: { type: \"boolean\" },\n\t\t\tpreReleaseTag: { type: \"string\" },\n\t\t\tcurrentVersion: { type: \"string\" },\n\t\t\tnextVersion: { type: \"string\" },\n\t\t\treleaseAs: { type: \"string\", choices: [\"major\", \"minor\", \"patch\"] },\n\n\t\t\t// Flags\n\t\t\tallowMultipleVersions: { type: \"boolean\" },\n\t\t\tcommitAll: { type: \"boolean\" },\n\t\t\tchangelogAll: { type: \"boolean\" },\n\t\t\tdebug: { type: \"boolean\" },\n\t\t\tdryRun: { type: \"boolean\" },\n\t\t\tsilent: { type: \"boolean\" },\n\t\t\tgitTagFallback: { type: \"boolean\" },\n\t\t\tsign: { type: \"boolean\" },\n\t\t\tverify: { type: \"boolean\" },\n\n\t\t\t// Skip Steps\n\t\t\tskipBump: { type: \"boolean\" },\n\t\t\tskipChangelog: { type: \"boolean\" },\n\t\t\tskipCommit: { type: \"boolean\" },\n\t\t\tskipTag: { type: \"boolean\" },\n\n\t\t\t// Changelog Overrides\n\t\t\tcommitUrlFormat: { type: \"string\" },\n\t\t\tcompareUrlFormat: { type: \"string\" },\n\t\t\tissueUrlFormat: { type: \"string\" },\n\t\t\tuserUrlFormat: { type: \"string\" },\n\t\t\treleaseCommitMessageFormat: { type: \"string\" },\n\t\t\treleaseMessageSuffix: { type: \"string\" },\n\t\t},\n\t});\n}\n","import { z } from \"zod\";\nimport conventionalChangelogConfigSpec from \"conventional-changelog-config-spec\";\n\nimport { ChangelogPresetConfigTypeSchema, ChangelogPresetConfigSchema } from \"./schema\";\nimport type { ForkConfig } from \"./types\";\nimport type { getCliArguments } from \"./cli-arguments\";\nimport type { DetectedGitHost } from \"./detect-git-host\";\n\nexport function getChangelogPresetConfig(\n\tmergedConfig: Partial<ForkConfig> | undefined,\n\tcliArgumentsFlags: ReturnType<typeof getCliArguments>[\"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 && !cliArgumentsFlags?.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 (cliArgumentsFlags?.commitUrlFormat) {\n\t\tpreset.commitUrlFormat = cliArgumentsFlags.commitUrlFormat;\n\t}\n\tif (cliArgumentsFlags?.compareUrlFormat) {\n\t\tpreset.compareUrlFormat = cliArgumentsFlags.compareUrlFormat;\n\t}\n\tif (cliArgumentsFlags?.issueUrlFormat) {\n\t\tpreset.issueUrlFormat = cliArgumentsFlags.issueUrlFormat;\n\t}\n\tif (cliArgumentsFlags?.userUrlFormat) {\n\t\tpreset.userUrlFormat = cliArgumentsFlags.userUrlFormat;\n\t}\n\tif (cliArgumentsFlags?.releaseCommitMessageFormat) {\n\t\tpreset.releaseCommitMessageFormat = cliArgumentsFlags.releaseCommitMessageFormat;\n\t}\n\tif (cliArgumentsFlags?.releaseMessageSuffix) {\n\t\tpreset.releaseCommitMessageFormat = `${preset.releaseCommitMessageFormat} ${cliArgumentsFlags.releaseMessageSuffix}`;\n\t}\n\n\treturn ChangelogPresetConfigSchema.passthrough().parse(preset);\n}\n","import { execFile } from \"node:child_process\";\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 Promise((onResolve) => {\n\t\texecFile(\"git\", [\"config\", \"--get\", \"remote.origin.url\"], { cwd }, (_error, stdout) => {\n\t\t\tonResolve(stdout ? stdout.trim() : \"\");\n\t\t});\n\t})) as string;\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 { readFileSync } from \"node:fs\";\nimport { parse, resolve } from \"node:path\";\nimport JoyCon from \"joycon\";\nimport { bundleRequire } from \"bundle-require\";\nimport { glob } from \"glob\";\n\nimport { ForkConfigSchema } from \"./schema\";\nimport { DEFAULT_CONFIG } from \"./defaults\";\nimport { getCliArguments } from \"./cli-arguments\";\nimport { getChangelogPresetConfig } from \"./changelog-preset-config\";\nimport { detectGitHost } from \"./detect-git-host\";\nimport type { Config, ForkConfig } from \"./types\";\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 getUserConfig(): Promise<ForkConfig> {\n\tconst cliArguments = getCliArguments();\n\n\tconst cwd = cliArguments.flags.path ? resolve(cliArguments.flags.path) : process.cwd();\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\tconst configFile = await loadConfigFile(configFilePath);\n\n\tconst mergedConfig = {\n\t\t...DEFAULT_CONFIG,\n\t\t...configFile,\n\t\t...cliArguments.flags,\n\t} as ForkConfig;\n\n\t// If the user has defined a glob pattern, use it to find the requested files.\n\tlet globResults: string[] = [];\n\tif (mergedConfig.glob) {\n\t\tglobResults = await glob(mergedConfig.glob, {\n\t\t\tcwd: cwd,\n\t\t\tignore: [\"node_modules/**\"],\n\t\t\tnodir: true,\n\t\t});\n\t}\n\n\tconst detectedGitHost = await detectGitHost(cwd);\n\n\treturn {\n\t\t...mergedConfig,\n\n\t\tfiles: getFilesList(configFile?.files, cliArguments.flags?.files, globResults),\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\tchangelogPresetConfig: getChangelogPresetConfig(\n\t\t\tmergedConfig,\n\t\t\tcliArguments.flags,\n\t\t\tdetectedGitHost,\n\t\t),\n\t};\n}\n\nasync function loadConfigFile(configFilePath: string | null) {\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\nfunction getFilesList(\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\nexport function defineConfig(config: Config): Config {\n\treturn config;\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\" | \"inspectVersion\">) {\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 or inspectVersion is set\n\t\tthis.disableLogs = this.config.silent || this.config.inspectVersion;\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 EditResult,\n\ttype JSONPath,\n\tmodify,\n\tparse,\n\ttype ParseError,\n} from \"jsonc-parser\";\n\nimport { fileExists } from \"../utils/file-state\";\nimport type { ForkConfig } from \"../config/types\";\nimport type { Logger } from \"../utils/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/** Options for parsing JSON and JSONC files. */\nconst PARSE_OPTIONS = {\n\tallowTrailingComma: true,\n\tallowEmptyContent: false,\n\tdisallowComments: false,\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\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 parseErrors: ParseError[] = [];\n\t\t\tconst parsedJson: PackageJsonish = parse(fileContents, parseErrors, 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, 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 = setStringInJsonc(fileContents, [\"version\"], newVersion);\n\t\tif (parsedJson?.packages?.[\"\"]) {\n\t\t\t// package-lock v2 stores version here too.\n\t\t\tfileContents = 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\n/**\n * Sets a new string value at the given path in a JSON or JSONC string.\n * @param jsonc the JSON or JSONC string (the contents of a file)\n * @param jsonPath path to the value to set, as an array of segments\n * @param newString string to set the value to\n * @returns the JSON or JSONC string with the value set\n */\nfunction setStringInJsonc(jsonc: string, jsonPath: JSONPath, newString: string): string {\n\tconst edits: EditResult = modify(jsonc, jsonPath, newString, {});\n\treturn applyEdits(jsonc, edits);\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 \"../utils/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 \"../utils/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 \"../utils/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 { JSONPackage } from \"./json-package\";\nimport { YAMLPackage } from \"./yaml-package\";\nimport { PlainText } from \"./plain-text\";\nimport { MSBuildProject } from \"./ms-build-project\";\n\nimport type { ForkConfig } from \"../config/types\";\nimport type { Logger } from \"../utils/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\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}\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\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\tthis.logger.error(`[File Manager] Unsupported file: ${fileState.path}`);\n\t}\n}\n","import gitSemverTags from \"git-semver-tags\";\nimport semver from \"semver\";\n\n/**\n * Get the latest git tag version.\n *\n * @example\n * ```ts\n * const tagPrefix = \"v\";\n * await getLatestGitTagVersion(tagPrefix); // 1.2.3\n * ```\n */\nexport async function getLatestGitTagVersion(tagPrefix: string | undefined): Promise<string> {\n\tconst gitTags = await gitSemverTags({ tagPrefix });\n\tif (!gitTags.length) {\n\t\treturn \"\";\n\t}\n\n\tconst cleanedTags = [];\n\n\tfor (const tag of gitTags) {\n\t\tconst cleanedTag = semver.clean(tag.replace(new RegExp(`^${tagPrefix}`), \"\"));\n\n\t\tif (cleanedTag) {\n\t\t\tcleanedTags.push(cleanedTag);\n\t\t}\n\t}\n\n\treturn cleanedTags.sort(semver.rcompare)[0];\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\";\nimport conventionalRecommendedBump from \"conventional-recommended-bump\";\n\nimport { getLatestGitTagVersion } from \"../utils/git-tag-version\";\nimport { getReleaseType } from \"../utils/release-type\";\nimport type { ForkConfig } from \"../config/types\";\nimport type { FileManager, FileState } from \"../strategies/file-manager\";\nimport type { Logger } from \"../utils/logger\";\nimport type { Git } from \"../utils/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.shouldIgnore(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 latest git tag\n\tif (versions.size === 0 && config.gitTagFallback) {\n\t\tconst version = await getLatestGitTagVersion(config.tagPrefix);\n\t\tif (version) {\n\t\t\tlogger.warn(`Using latest git tag 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\t// If we're just inspecting the version, output the version and exit\n\tif (config.inspectVersion) {\n\t\tconsole.log(currentVersion);\n\t\tprocess.exit(0);\n\t}\n\n\tlogger.log(`Current version: ${currentVersion}`);\n\treturn {\n\t\tfiles,\n\t\tversion: currentVersion,\n\t};\n}\n\nexport interface NextVersion {\n\tversion: string;\n\tlevel?: number;\n\tpreMajor?: boolean;\n\treason?: string;\n\treleaseType?: ReleaseType;\n}\n\nexport async function getNextVersion(\n\tconfig: ForkConfig,\n\tlogger: Logger,\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 && semver.valid(config.nextVersion)) {\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\n\tlet recommendedBump: Awaited<ReturnType<typeof conventionalRecommendedBump>>;\n\tif (config.releaseAs) {\n\t\trecommendedBump = {\n\t\t\treleaseType: config.releaseAs,\n\t\t\tlevel: -1,\n\t\t\treason: \"User defined\",\n\t\t};\n\t} else {\n\t\ttry {\n\t\t\trecommendedBump = await conventionalRecommendedBump({\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\tpreMajor: isPreMajor,\n\t\t\t\t},\n\t\t\t\tpath: config.path,\n\t\t\t\ttagPrefix: config.tagPrefix,\n\t\t\t\tcwd: config.path,\n\t\t\t});\n\t\t} catch (cause) {\n\t\t\tthrow new Error(`[conventional-recommended-bump] Unable to determine next version`, {\n\t\t\t\tcause,\n\t\t\t});\n\t\t}\n\t}\n\n\tif (recommendedBump.releaseType) {\n\t\tconst releaseType = getReleaseType(\n\t\t\trecommendedBump.releaseType,\n\t\t\tcurrentVersion,\n\t\t\tconfig.preRelease,\n\t\t);\n\t\tconst nextVersion =\n\t\t\tsemver.inc(\n\t\t\t\tcurrentVersion,\n\t\t\t\treleaseType,\n\t\t\t\ttypeof config.preRelease === \"string\" ? config.preRelease : undefined,\n\t\t\t) ?? \"\";\n\n\t\tlogger.log(`Next version: ${nextVersion} (${releaseType})`);\n\t\treturn {\n\t\t\t...recommendedBump,\n\t\t\tpreMajor: isPreMajor,\n\t\t\treleaseType,\n\t\t\tversion: nextVersion,\n\t\t};\n\t}\n\n\tthrow new Error(\"Unable to find next version\");\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 \"../utils/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 \"../strategies/file-manager\";\nimport type { Logger } from \"../utils/logger\";\nimport type { Git } from \"../utils/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\" : undefined;\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 \"../utils/logger\";\nimport type { Git } from \"../utils/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\tawait git.tag(\n\t\tconfig.sign ? \"--sign\" : \"--annotate\",\n\t\ttag,\n\t\t\"--message\",\n\t\tformatCommitMessage(config.changelogPresetConfig?.releaseCommitMessageFormat, nextVersion),\n\t);\n}\n"]}