fork-version 1.4.79 → 1.4.82

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.4.82 (2024-05-13)
4
+
5
+
6
+ ### Refactor
7
+
8
+ * add conventional changelog overrides to cli ([#56](https://github.com/eglavin/fork-version/issues/56)) ([cddeda6](https://github.com/eglavin/fork-version/commit/cddeda6c81c50682329f4a44d9036b72a6045055))
9
+
10
+
11
+ ## 1.4.81 (2024-05-08)
12
+
13
+
14
+ ### Docs
15
+
16
+ * improve documentation ([#55](https://github.com/eglavin/fork-version/issues/55)) ([0cdea27](https://github.com/eglavin/fork-version/commit/0cdea276a4913b15d00b611171d7bfd71f809846))
17
+
18
+
19
+ ## 1.4.80 (2024-05-07)
20
+
21
+
22
+ ### Refactor
23
+
24
+ * export partial config for external use instead of internal config type ([#54](https://github.com/eglavin/fork-version/issues/54)) ([d7e16e8](https://github.com/eglavin/fork-version/commit/d7e16e8e03f43d9fedcc648f6b926030a9e2a9ec))
25
+
26
+
3
27
  ## 1.4.79 (2024-05-06)
4
28
 
5
29
 
package/README.md CHANGED
@@ -27,6 +27,8 @@ By following the [conventional commit](https://www.conventionalcommits.org) stan
27
27
  1. Commit the changed files
28
28
  1. Create a tag for the new version
29
29
 
30
+ Fork-Version won't attempt to push changes to git or to a package manager, this allows you to decide how you publish your changes.
31
+
30
32
  ## Using Fork-Version
31
33
 
32
34
  Primarily designed to be used with `npx`, Fork-Version can also be installed globally or directly to the node package you're working on. The only software prerequisites you need are [git](https://git-scm.com) and [node](https://nodejs.org).
@@ -34,7 +36,7 @@ Primarily designed to be used with `npx`, Fork-Version can also be installed glo
34
36
  Fork-Version can be configured either through a config file or by passing options to the tool when ran, see the [Configuration File](#configuration-file) and [Command Line Options](#command-line-options) sections below for details on the supported options.
35
37
 
36
38
  > [!NOTE]
37
- > Command line options override defined config file options.
39
+ > Command line options get merged with config file options, any options that are declared through the cli will override options that are also in the config file (Except for the list of [files](#configfiles) which get merged).
38
40
 
39
41
  ### Using `npx` (Recommended)
40
42
 
@@ -108,6 +110,27 @@ Flags:
108
110
  --verify If true, git will run user defined git hooks before committing.
109
111
 
110
112
  To negate a flag you can prefix it with "no-", for example "--no-git-tag-fallback" will not fallback to the latest git tag.
113
+
114
+ Conventional Changelog Overrides:
115
+ --commit-url-format Override the default commit URL format.
116
+ --compare-url-format Override the default compare URL format.
117
+ --issue-url-format Override the default issue URL format.
118
+ --user-url-format Override the default user URL format.
119
+ --release-commit-message-format Override the default release commit message format.
120
+ --release-message-suffix Add a suffix to the end of the release message.
121
+
122
+ Examples:
123
+ $ fork-version
124
+ Run fork-version in the current directory with default options.
125
+
126
+ $ fork-version --path ./packages/my-package
127
+ Run fork-version in the "./packages/my-package" directory.
128
+
129
+ $ fork-version --file package.json --file MyApi.csproj
130
+ Run fork-version and update the "package.json" and "MyApi.csproj" files.
131
+
132
+ $ fork-version --glob "*/package.json"
133
+ Run fork-version and update all "package.json" files in subdirectories.
111
134
  ```
112
135
 
113
136
  <!-- END COMMAND LINE OPTIONS -->
@@ -127,7 +150,7 @@ You can configure Fork-Version using one of the following files:
127
150
 
128
151
  #### Javascript Config
129
152
 
130
- Configuring using a javascript file is the most flexible option. You can use any javascript file type you prefer including typescript, both commonjs and esm exports styles are supported. The `defineConfig` function in the following snippet is optional, though using it gives you intellisense information.
153
+ Configuring using a javascript file is the most flexible option. You can use any javascript file type you prefer including typescript. Both commonjs and esm exports styles are supported. The `defineConfig` function in the following snippet is optional, using it will give you intellisense information in your code editor of choice.
131
154
 
132
155
  ```js
133
156
  import { defineConfig } from 'fork-version';
@@ -138,12 +161,12 @@ export default defineConfig({
138
161
  });
139
162
  ```
140
163
 
141
- Alternatively you can use typescript type annotations:
164
+ Alternatively you can use typescript type annotations in a typescript file:
142
165
 
143
166
  ```ts
144
- import type { ForkConfig } from 'fork-version';
167
+ import type { Config } from 'fork-version';
145
168
 
146
- const config: ForkConfig = {
169
+ const config: Config = {
147
170
  header: `# My Changelog`,
148
171
  files: ["package.json", "package-lock.json"],
149
172
  };
@@ -151,10 +174,10 @@ const config: ForkConfig = {
151
174
  export default config;
152
175
  ```
153
176
 
154
- Or jsdocs:
177
+ Or jsdocs in a javascript file:
155
178
 
156
179
  ```js
157
- /** @type {import("fork-version").ForkConfig} */
180
+ /** @type {import("fork-version").Config} */
158
181
  export default {
159
182
  header: `# My Changelog`,
160
183
  files: ["package.json", "package-lock.json"],
@@ -220,6 +243,7 @@ Alternatively you can define your config using a key in your `package.json` file
220
243
  | sign | boolean | false | Sign the commit with the systems GPG key |
221
244
  | verify | boolean | false | Run user defined git hooks before committing |
222
245
  | [changelogPresetConfig](#configchangelogpresetconfig) | object | {} | Override defaults from the "conventional-changelog-conventionalcommits" preset configuration |
246
+ | releaseMessageSuffix | string | - | Add a suffix to the end of the release message |
223
247
 
224
248
  ##### config.files
225
249
 
@@ -250,14 +274,14 @@ Web/
250
274
 
251
275
  Running `npx fork-version -G "{*/*.csproj,*/package.json}"` will update both csproj files and the package.json file.
252
276
 
253
- Internally we're using [isaacs glob](https://github.com/isaacs/node-glob) to match files, read more about the pattern syntax [here](https://github.com/isaacs/node-glob/tree/v10.3.12?tab=readme-ov-file#glob-primer).
277
+ Internally Fork-Version uses [isaacs glob](https://github.com/isaacs/node-glob) to match files. Read more about the pattern syntax [here](https://github.com/isaacs/node-glob/tree/v10.3.12?tab=readme-ov-file#glob-primer).
254
278
 
255
279
  > [!WARNING]
256
280
  > Ensure you wrap your glob pattern in quotes to prevent shell expansion.
257
281
 
258
282
  ##### config.tagPrefix
259
283
 
260
- Allows you to control the prefix for the created tag. This is useful if your using a mono repo in which you version multiple projects separately or simply want to use a different prefix for your tags.
284
+ Allows you to control the prefix for the created tag. This is useful if your using a mono-repo in which you version multiple projects separately or simply want to use a different prefix for your tags.
261
285
 
262
286
  | Example Value | Tag Created |
263
287
  |:-------------------------|:------------------------------|
@@ -284,15 +308,45 @@ Fork-Version uses [meow](https://github.com/sindresorhus/meow) to parse cli argu
284
308
 
285
309
  ##### config.changelogPresetConfig
286
310
 
287
- `TODO`
311
+ Fork-Version uses the [conventional changelog config spec](https://github.com/conventional-changelog/conventional-changelog-config-spec). The following is an excerpt of the configurable options.
312
+
313
+ | Property | Type | Default | Description |
314
+ |:-------------------------------------------|:---------------|:-----------------------------------------------------------------------------|:------------------------------------------------------------------------|
315
+ | [types](#configchangelogpresetconfigtypes) | Array\<Type> | {} | List of explicitly supported commit message types |
316
+ | commitUrlFormat | string | `{{host}}/{{owner}}/{{repository}}/commit/{{hash}}` | A URL representing a specific commit at a hash |
317
+ | compareUrlFormat | string | `{{host}}/{{owner}}/{{repository}}/compare/{{previousTag}}...{{currentTag}}` | A URL representing the comparison between two git SHAs |
318
+ | issueUrlFormat | string | `{{host}}/{{owner}}/{{repository}}/issues/{{id}}` | A URL representing the issue format |
319
+ | userUrlFormat | string | `{{host}}/{{user}}` | A URL representing a user's profile |
320
+ | releaseCommitMessageFormat | string | `chore(release): {{currentTag}}` | A string to be used to format the auto-generated release commit message |
321
+ | issuePrefixes | Array\<string> | `["#"]` | List of prefixes used to detect references to issues |
322
+
323
+ ###### config.changelogPresetConfig.types
324
+
325
+ By default only `feat` and `fix` commits are added to your changelog, you can configure extra sections to show by modifying this section.
326
+
327
+ Checkout the `fork.config.js` file [here](./fork.config.js) to see an example of modifying the types.
328
+
329
+ | Property | Type | Description |
330
+ |:---------|:--------|:-------------------------------------------------------------------------|
331
+ | type | string | The type of commit message. "feat", "fix", "chore", etc.. |
332
+ | scope | string | The scope of the commit message. |
333
+ | section | string | The name of the section in the `CHANGELOG` the commit should show up in. |
334
+ | hidden | boolean | Should show in the generated changelog message? |
335
+
336
+ ###### config.releaseMessageSuffix
337
+
338
+ Adds a suffix to the end of the release message, useful to add a `[skip ci]` message to the end of the created commit.
339
+
340
+ - [GitHub Actions - Skipping workflow runs](https://docs.github.com/en/actions/managing-workflow-runs/skipping-workflow-runs)
341
+ - [Azure Devops - Skipping CI for individual pushes](https://learn.microsoft.com/en-us/azure/devops/pipelines/repos/azure-repos-git?view=azure-devops&tabs=yaml#skipping-ci-for-individual-pushes)
288
342
 
289
- #### Supported File Types
343
+ ### Supported File Types
290
344
 
291
345
  - [Json Package](#json-package)
292
346
  - [Plain Text](#plain-text)
293
347
  - [MS Build](#ms-build)
294
348
 
295
- ##### Json Package
349
+ #### Json Package
296
350
 
297
351
  A json package is a json file which contains a version property, such as a npm package.json file.
298
352
 
@@ -304,7 +358,7 @@ A json package is a json file which contains a version property, such as a npm p
304
358
  }
305
359
  ```
306
360
 
307
- ##### Plain Text
361
+ #### Plain Text
308
362
 
309
363
  A plain text file will have just the version as the content.
310
364
 
@@ -312,7 +366,7 @@ A plain text file will have just the version as the content.
312
366
  1.2.3
313
367
  ```
314
368
 
315
- ##### MS Build
369
+ #### MS Build
316
370
 
317
371
  A MS build project is an xml file with with a `Version` property under the `Project > PropertyGroup` node group.
318
372
 
@@ -324,7 +378,7 @@ A MS build project is an xml file with with a `Version` property under the `Proj
324
378
  </Project>
325
379
  ```
326
380
 
327
- We currently support reading and updating the following file extensions: `.csproj` `.dbproj` `.esproj` `.fsproj` `.props` `.vbproj` `.vcxproj`
381
+ Fork-Version currently supports reading and updating the following file extensions: `.csproj` `.dbproj` `.esproj` `.fsproj` `.props` `.vbproj` `.vcxproj`
328
382
 
329
383
  #### Custom File Updater's
330
384
 
@@ -333,6 +387,6 @@ We currently support reading and updating the following file extensions: `.cspro
333
387
  ### Code Usage
334
388
 
335
389
  > [!WARNING]
336
- > Code usage is not recommended, as the api is not stable and may change between versions.
390
+ > Code usage is not recommended as the public api is not stable and may change between versions.
337
391
  >
338
- > In the future this might be stabilized and documented but this is not a focus at this time.
392
+ > In the future the api may be stabilized and documented but this is not a focus at this time.
@@ -57,6 +57,10 @@ var ChangelogPresetConfigTypeSchema = zod.z.object({
57
57
  * @example "feat", "fix", "chore", etc..
58
58
  */
59
59
  type: zod.z.string().describe('The type of commit message, such as "feat", "fix", "chore".'),
60
+ /**
61
+ * The scope of the commit message.
62
+ */
63
+ scope: zod.z.string().optional().describe("The scope of the commit message."),
60
64
  /**
61
65
  * The section of the `CHANGELOG` the commit should show up in.
62
66
  */
@@ -248,7 +252,12 @@ var ForkConfigSchema = zod.z.object({
248
252
  */
249
253
  changelogPresetConfig: ChangelogPresetConfigSchema.partial().describe(
250
254
  'Override the default "conventional-changelog-conventionalcommits" preset configuration.'
251
- )
255
+ ),
256
+ /**
257
+ * Add a suffix to the release commit message.
258
+ * @example "[skip ci]"
259
+ */
260
+ releaseMessageSuffix: zod.z.string().optional().describe("Add a suffix to the release commit message.")
252
261
  });
253
262
  function defineConfig(config) {
254
263
  return config;
@@ -313,7 +322,28 @@ Flags:
313
322
  --sign If true, git will sign the commit with the systems GPG key.
314
323
  --verify If true, git will run user defined git hooks before committing.
315
324
 
316
- To negate a flag you can prefix it with "no-", for example "--no-git-tag-fallback" will not fallback to the latest git tag.`;
325
+ To negate a flag you can prefix it with "no-", for example "--no-git-tag-fallback" will not fallback to the latest git tag.
326
+
327
+ Conventional Changelog Overrides:
328
+ --commit-url-format Override the default commit URL format.
329
+ --compare-url-format Override the default compare URL format.
330
+ --issue-url-format Override the default issue URL format.
331
+ --user-url-format Override the default user URL format.
332
+ --release-commit-message-format Override the default release commit message format.
333
+ --release-message-suffix Add a suffix to the end of the release message.
334
+
335
+ Examples:
336
+ $ fork-version
337
+ Run fork-version in the current directory with default options.
338
+
339
+ $ fork-version --path ./packages/my-package
340
+ Run fork-version in the "./packages/my-package" directory.
341
+
342
+ $ fork-version --file package.json --file MyApi.csproj
343
+ Run fork-version and update the "package.json" and "MyApi.csproj" files.
344
+
345
+ $ fork-version --glob "*/package.json"
346
+ Run fork-version and update all "package.json" files in subdirectories.`;
317
347
  function getCliArguments() {
318
348
  return meow__default.default(helperText, {
319
349
  importMeta: ({ url: (typeof document === 'undefined' ? require('u' + 'rl').pathToFileURL(__filename).href : (_documentCurrentScript && _documentCurrentScript.src || new URL('out.js', document.baseURI).href)) }),
@@ -340,11 +370,18 @@ function getCliArguments() {
340
370
  silent: { type: "boolean" },
341
371
  gitTagFallback: { type: "boolean" },
342
372
  sign: { type: "boolean" },
343
- verify: { type: "boolean" }
373
+ verify: { type: "boolean" },
374
+ // Changelog Overrides
375
+ commitUrlFormat: { type: "string" },
376
+ compareUrlFormat: { type: "string" },
377
+ issueUrlFormat: { type: "string" },
378
+ userUrlFormat: { type: "string" },
379
+ releaseCommitMessageFormat: { type: "string" },
380
+ releaseMessageSuffix: { type: "string" }
344
381
  }
345
382
  });
346
383
  }
347
- function getChangelogPresetConfig(usersChangelogPresetConfig) {
384
+ function getChangelogPresetConfig(mergedConfig, cliArgumentsFlags) {
348
385
  const preset = {
349
386
  name: "conventionalcommits"
350
387
  };
@@ -355,13 +392,34 @@ function getChangelogPresetConfig(usersChangelogPresetConfig) {
355
392
  }
356
393
  });
357
394
  }
358
- if (usersChangelogPresetConfig && typeof usersChangelogPresetConfig === "object") {
359
- Object.entries(usersChangelogPresetConfig).forEach(([key, value]) => {
395
+ if (mergedConfig?.changelogPresetConfig && typeof mergedConfig.changelogPresetConfig === "object") {
396
+ Object.entries(mergedConfig.changelogPresetConfig).forEach(([key, value]) => {
360
397
  if (value !== void 0) {
361
398
  preset[key] = value;
362
399
  }
363
400
  });
364
401
  }
402
+ if (mergedConfig?.releaseMessageSuffix && !cliArgumentsFlags?.releaseMessageSuffix) {
403
+ preset.releaseCommitMessageFormat = `${preset.releaseCommitMessageFormat} ${mergedConfig.releaseMessageSuffix}`;
404
+ }
405
+ if (cliArgumentsFlags?.commitUrlFormat) {
406
+ preset.commitUrlFormat = cliArgumentsFlags.commitUrlFormat;
407
+ }
408
+ if (cliArgumentsFlags?.compareUrlFormat) {
409
+ preset.compareUrlFormat = cliArgumentsFlags.compareUrlFormat;
410
+ }
411
+ if (cliArgumentsFlags?.issueUrlFormat) {
412
+ preset.issueUrlFormat = cliArgumentsFlags.issueUrlFormat;
413
+ }
414
+ if (cliArgumentsFlags?.userUrlFormat) {
415
+ preset.userUrlFormat = cliArgumentsFlags.userUrlFormat;
416
+ }
417
+ if (cliArgumentsFlags?.releaseCommitMessageFormat) {
418
+ preset.releaseCommitMessageFormat = cliArgumentsFlags.releaseCommitMessageFormat;
419
+ }
420
+ if (cliArgumentsFlags?.releaseMessageSuffix) {
421
+ preset.releaseCommitMessageFormat = `${preset.releaseCommitMessageFormat} ${cliArgumentsFlags.releaseMessageSuffix}`;
422
+ }
365
423
  return ChangelogPresetConfigSchema.passthrough().parse(preset);
366
424
  }
367
425
 
@@ -408,7 +466,7 @@ async function getUserConfig() {
408
466
  // Meow doesn't support multiple flags with the same name, so we need to check both.
409
467
  cliArguments.flags.preReleaseTag ?? cliArguments.flags.preRelease ?? configFile.preRelease
410
468
  ),
411
- changelogPresetConfig: getChangelogPresetConfig(mergedConfig?.changelogPresetConfig)
469
+ changelogPresetConfig: getChangelogPresetConfig(mergedConfig, cliArguments.flags)
412
470
  };
413
471
  }
414
472
  async function loadConfigFile(configFilePath) {
@@ -957,9 +1015,43 @@ var FileManager = class {
957
1015
  }
958
1016
  };
959
1017
 
1018
+ // src/utils/logger.ts
1019
+ var Logger = class {
1020
+ constructor(config) {
1021
+ this.config = config;
1022
+ this.log = this.log.bind(this);
1023
+ this.warn = this.warn.bind(this);
1024
+ this.error = this.error.bind(this);
1025
+ this.debug = this.debug.bind(this);
1026
+ this.disableLogs = this.config.silent || this.config.inspectVersion;
1027
+ }
1028
+ disableLogs = false;
1029
+ log(...messages) {
1030
+ if (!this.disableLogs) {
1031
+ console.log(...messages);
1032
+ }
1033
+ }
1034
+ warn(...messages) {
1035
+ if (!this.disableLogs) {
1036
+ console.warn(...messages);
1037
+ }
1038
+ }
1039
+ error(...messages) {
1040
+ if (!this.disableLogs) {
1041
+ console.error(...messages);
1042
+ }
1043
+ }
1044
+ debug(...messages) {
1045
+ if (this.config.debug && !this.disableLogs) {
1046
+ console.debug(...messages);
1047
+ }
1048
+ }
1049
+ };
1050
+
960
1051
  exports.FileManager = FileManager;
961
1052
  exports.ForkConfigSchema = ForkConfigSchema;
962
1053
  exports.Git = Git;
1054
+ exports.Logger = Logger;
963
1055
  exports.commitChanges = commitChanges;
964
1056
  exports.defineConfig = defineConfig;
965
1057
  exports.getCurrentVersion = getCurrentVersion;
@@ -968,4 +1060,4 @@ exports.getUserConfig = getUserConfig;
968
1060
  exports.tagChanges = tagChanges;
969
1061
  exports.updateChangelog = updateChangelog;
970
1062
  //# sourceMappingURL=out.js.map
971
- //# sourceMappingURL=chunk-XRFBIMVN.cjs.map
1063
+ //# sourceMappingURL=chunk-AKU2Z6YZ.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/config/schema.ts","../src/config/user-config.ts","../src/config/defaults.ts","../src/config/cli-arguments.js","../src/config/changelog-preset-config.ts","../src/process/version.ts","../src/utils/git-tag-version.ts","../src/utils/release-type.ts","../src/process/changelog.ts","../src/utils/file-state.ts","../src/process/commit.ts","../src/utils/git.ts","../src/utils/format-commit-message.ts","../src/process/tag.ts","../src/strategies/json-package.ts","../src/libs/stringify-package.ts","../src/strategies/plain-text.ts","../src/strategies/ms-build-project.ts","../src/strategies/file-manager.ts","../src/utils/logger.ts"],"names":["fileContent","parsed","semver","resolve","readFileSync","writeFileSync"],"mappings":"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","sourcesContent":["import { z } from \"zod\";\n\nconst 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\", \"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\n\t// Flags\n\t//\n\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 * 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/**\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\nexport type ForkConfig = z.infer<typeof ForkConfigSchema>;\n\nexport type Config = Partial<ForkConfig>;\n\nexport function defineConfig(config: Config): Config {\n\treturn config;\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\";\nimport dotgitignore from \"dotgitignore\";\n\nimport { ForkConfigSchema, type ForkConfig } from \"./schema\";\nimport { DEFAULT_CONFIG } from \"./defaults\";\nimport { getCliArguments } from \"./cli-arguments\";\nimport { getChangelogPresetConfig } from \"./changelog-preset-config\";\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\treturn {\n\t\t...mergedConfig,\n\n\t\tfiles: filterGitIgnoredFiles(\n\t\t\tcwd,\n\t\t\tgetFilesList(configFile?.files, cliArguments.flags?.files, globResults),\n\t\t),\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(mergedConfig, cliArguments.flags),\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 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 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 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\nfunction filterGitIgnoredFiles(cwd: string, files: string[]) {\n\tconst dotgit = dotgitignore({ cwd });\n\n\treturn files.filter((file) => !dotgit.ignore(file));\n}\n","import type { ForkConfig } from \"./schema\";\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\"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\tcommitAll: false,\n\tdebug: false,\n\tdryRun: false,\n\tsilent: false,\n\tgitTagFallback: true,\n\tsign: false,\n\tverify: 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\", \"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\nFlags:\n --commit-all Commit all changes, not just files updated by fork-version.\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\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\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\n\t\t\t// Flags\n\t\t\tcommitAll: { 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// 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 conventionalChangelogConfigSpec from \"conventional-changelog-config-spec\";\n\nimport { ChangelogPresetConfigSchema, type ForkConfig } from \"./schema\";\nimport type { getCliArguments } from \"./cli-arguments\";\n\nexport function getChangelogPresetConfig(\n\tmergedConfig: Partial<ForkConfig> | undefined,\n\tcliArgumentsFlags: ReturnType<typeof getCliArguments>[\"flags\"],\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\tpreset[key] = value.default;\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 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/schema\";\nimport type { FileManager, FileState } from \"../strategies/file-manager\";\nimport type { Logger } from \"../utils/logger\";\n\nexport interface CurrentVersion {\n\tversion: string;\n\tfiles: FileState[];\n}\n\nexport async function getCurrentVersion(\n\tconfig: ForkConfig,\n\tlogger: Logger,\n\tfileManager: FileManager,\n): Promise<CurrentVersion> {\n\tconst files: FileState[] = [];\n\tconst versions = new Set<string>();\n\n\tfor (const file of config.files) {\n\t\tconst fileState = fileManager.read(file);\n\n\t\tif (fileState) {\n\t\t\tfiles.push(fileState);\n\n\t\t\tif (config.currentVersion) {\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\tversions.add(fileState.version);\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.log(`[Version] Using 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\tthrow new Error(\"Found multiple versions\");\n\t}\n\n\tconst currentVersion = versions.entries().next().value[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.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\ttry {\n\t\trecommendedBump = await conventionalRecommendedBump({\n\t\t\tpreset: {\n\t\t\t\tname: \"conventionalcommits\",\n\t\t\t\t...config.changelogPresetConfig,\n\t\t\t\tpreMajor: isPreMajor,\n\t\t\t},\n\t\t\tpath: config.path,\n\t\t\ttagPrefix: config.tagPrefix,\n\t\t\tcwd: config.path,\n\t\t});\n\t} catch (error) {\n\t\tthrow new Error(`[conventional-recommended-bump] Unable to determine next version`);\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\n\t\tconst state: NextVersion = {\n\t\t\t...recommendedBump,\n\t\t\tpreMajor: isPreMajor,\n\t\t\treleaseType,\n\t\t\tversion:\n\t\t\t\tsemver.inc(\n\t\t\t\t\tcurrentVersion,\n\t\t\t\t\treleaseType,\n\t\t\t\t\ttypeof config.preRelease === \"string\" ? config.preRelease : undefined,\n\t\t\t\t) ?? \"\",\n\t\t};\n\n\t\tlogger.log(`Next version: ${state.version} (${state.releaseType})`);\n\t\treturn state;\n\t}\n\n\tthrow new Error(\"Unable to find next version\");\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 { 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/schema\";\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.error(\"[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\", (error) => {\n\t\t\t\tlogger.error(\"[conventional-changelog] Unable to parse changes\");\n\t\t\t\tthrow error;\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\ninterface UpdateChangelog {\n\tchangelogPath: string;\n\toldContent: string;\n\tnewContent: string;\n}\n\nexport async function updateChangelog(\n\tconfig: ForkConfig,\n\tlogger: Logger,\n\tnextVersion: string,\n): Promise<UpdateChangelog> {\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\tif (!config.dryRun && !fileExists(changelogPath)) {\n\t\tlogger.log(`Creating Changelog file: ${changelogPath}`);\n\t\twriteFileSync(changelogPath, \"\\n\", \"utf8\");\n\t}\n\n\tconst oldContent = getOldReleaseContent(changelogPath, fileExists(changelogPath));\n\tconst newContent = await getNewReleaseContent(config, logger, nextVersion);\n\n\tlogger.log(`Updating Changelog: ${changelogPath}`);\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\treturn {\n\t\tchangelogPath,\n\t\toldContent,\n\t\tnewContent,\n\t};\n}\n","import { lstatSync } from \"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 (e) {\n\t\treturn false;\n\t}\n}\n","import { resolve } from \"node:path\";\nimport { Git } from \"../utils/git\";\nimport { formatCommitMessage } from \"../utils/format-commit-message\";\nimport { fileExists } from \"../utils/file-state\";\nimport type { ForkConfig } from \"../config/schema\";\nimport type { FileState } from \"../strategies/file-manager\";\nimport type { Logger } from \"../utils/logger\";\n\ninterface CommitChanges {\n\tfilesToCommit: string[];\n\tgitAddOutput?: string;\n\tgitCommitOutput?: string;\n}\n\nexport async function commitChanges(\n\tconfig: ForkConfig,\n\tlogger: Logger,\n\tfiles: FileState[],\n\tnextVersion: string,\n): Promise<CommitChanges> {\n\tconst git = new Git(config, logger);\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\t\tfilesToCommit,\n\t\t};\n\t}\n\n\tconst shouldVerify = config.verify ? undefined : \"--no-verify\";\n\tconst shouldSign = config.sign ? \"--gpg-sign\" : undefined;\n\n\t// If commitAll is set, commit all changed files.\n\tif (config.commitAll) {\n\t\treturn {\n\t\t\tfilesToCommit,\n\t\t\tgitAddOutput: await git.add(\"--all\"),\n\t\t\tgitCommitOutput: await git.commit(\n\t\t\t\tshouldVerify,\n\t\t\t\tshouldSign,\n\t\t\t\t\"--message\",\n\t\t\t\tformatCommitMessage(config.changelogPresetConfig?.releaseCommitMessageFormat, nextVersion),\n\t\t\t),\n\t\t};\n\t}\n\n\treturn {\n\t\tfilesToCommit,\n\t\tgitAddOutput: await git.add(...filesToCommit),\n\t\tgitCommitOutput: await git.commit(\n\t\t\tshouldVerify,\n\t\t\tshouldSign,\n\t\t\t...filesToCommit,\n\t\t\t\"--message\",\n\t\t\tformatCommitMessage(config.changelogPresetConfig?.releaseCommitMessageFormat, nextVersion),\n\t\t),\n\t};\n}\n","import { execFile } from \"node:child_process\";\nimport type { ForkConfig } from \"../config/schema\";\nimport type { Logger } from \"./logger\";\n\nexport class Git {\n\tconstructor(\n\t\tprivate config: ForkConfig,\n\t\tprivate logger: Logger,\n\t) {\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.currentBranch = this.currentBranch.bind(this);\n\t}\n\n\tpublic add(...args: (string | undefined)[]) {\n\t\tif (this.config.dryRun) {\n\t\t\treturn Promise.resolve(\"\");\n\t\t}\n\n\t\treturn this.execGit(\"add\", args.filter(Boolean) as string[]);\n\t}\n\n\tpublic commit(...args: (string | undefined)[]) {\n\t\tif (this.config.dryRun) {\n\t\t\treturn Promise.resolve(\"\");\n\t\t}\n\n\t\treturn this.execGit(\"commit\", args.filter(Boolean) as string[]);\n\t}\n\n\tpublic tag(...args: (string | undefined)[]) {\n\t\tif (this.config.dryRun) {\n\t\t\treturn Promise.resolve(\"\");\n\t\t}\n\n\t\treturn this.execGit(\"tag\", args.filter(Boolean) as string[]);\n\t}\n\n\tpublic async currentBranch() {\n\t\treturn (await this.execGit(\"rev-parse\", [\"--abbrev-ref\", \"HEAD\"])).trim();\n\t}\n\n\tprivate execGit(command: string, args: string[]): Promise<string> {\n\t\tthis.logger.debug(`[git ${command}] ${args.join(\" \")}`);\n\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},\n\t\t\t\t(error, stdout, stderr) => {\n\t\t\t\t\tif (error) {\n\t\t\t\t\t\tthis.logger.error(`[git ${command}] `);\n\t\t\t\t\t\tonReject(error);\n\t\t\t\t\t}\n\n\t\t\t\t\tonResolve(stdout ? stdout : stderr);\n\t\t\t\t},\n\t\t\t);\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 { Git } from \"../utils/git\";\nimport { formatCommitMessage } from \"../utils/format-commit-message\";\nimport type { ForkConfig } from \"../config/schema\";\nimport type { Logger } from \"../utils/logger\";\n\ninterface TagChanges {\n\tgitTagOutput: string;\n}\n\nexport async function tagChanges(\n\tconfig: ForkConfig,\n\tlogger: Logger,\n\tnextVersion: string,\n): Promise<TagChanges> {\n\tconst git = new Git(config, logger);\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 gitTagOutput = await 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\treturn {\n\t\tgitTagOutput,\n\t};\n}\n","import { resolve } from \"node:path\";\nimport { readFileSync, writeFileSync } from \"node:fs\";\nimport detectIndent from \"detect-indent\";\nimport { detectNewline } from \"detect-newline\";\n\nimport { stringifyPackage } from \"../libs/stringify-package\";\nimport { fileExists } from \"../utils/file-state\";\nimport type { ForkConfig } from \"../config/schema\";\nimport type { Logger } from \"../utils/logger\";\nimport type { FileState, IFileManager } from \"./file-manager\";\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 parsedJson = JSON.parse(fileContents);\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 package: ${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 parsedJson = JSON.parse(fileContents);\n\n\t\tparsedJson.version = newVersion;\n\t\tif (parsedJson.packages?.[\"\"]) {\n\t\t\tparsedJson.packages[\"\"].version = newVersion; // package-lock v2 stores version here too.\n\t\t}\n\n\t\twriteFileSync(\n\t\t\tfileState.path,\n\t\t\tstringifyPackage(parsedJson, detectIndent(fileContents).indent, detectNewline(fileContents)),\n\t\t\t\"utf8\",\n\t\t);\n\t}\n\n\tpublic isSupportedFile(fileName: string): boolean {\n\t\treturn fileName.endsWith(\".json\");\n\t}\n}\n","// https://github.com/npm/stringify-package/blob/main/LICENSE\n// Extracted from npm/stringify-package\n//\n// Copyright npm, Inc\n//\n// Permission to use, copy, modify, and/or distribute this software for any\n// purpose with or without fee is hereby granted, provided that the above\n// copyright notice and this permission notice appear in all copies.\n//\n// THE SOFTWARE IS PROVIDED \"AS IS\" AND THE AUTHOR DISCLAIMS ALL WARRANTIES\n// WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF\n// MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR\n// ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES\n// WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN\n// ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF\n// OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.\n\nconst DEFAULT_INDENT = 2;\nconst CRLF = \"\\r\\n\";\nconst LF = \"\\n\";\n\n/**\n * @param data The object to stringify\n * @param indent `2, 4, \" \", \"\\t\"` Number of spaces a string of spaces or tab character, defaults to 2\n * @param newline `\"\\r\\n\", \"\\n\"` Windows or Unix line endings, defaults to Unix\n */\nexport function stringifyPackage(\n\tdata: object,\n\tindent?: string | number,\n\tnewline?: typeof CRLF | typeof LF,\n): string {\n\tconst stringified = JSON.stringify(data, null, indent ?? DEFAULT_INDENT);\n\n\tif (newline === CRLF) {\n\t\treturn stringified.replace(new RegExp(LF, \"g\"), CRLF);\n\t}\n\n\treturn stringified;\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/schema\";\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: ${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/lib/slim\";\n\nimport { fileExists } from \"../utils/file-state\";\nimport type { ForkConfig } from \"../config/schema\";\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, { xmlMode: true, decodeEntities: false });\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 package: ${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, { xmlMode: true, decodeEntities: false });\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 { PlainText } from \"./plain-text\";\nimport { MSBuildProject } from \"./ms-build-project\";\n\nimport type { ForkConfig } from \"../config/schema\";\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 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.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.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.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","/* eslint-disable @typescript-eslint/no-explicit-any */\n\nimport type { ForkConfig } from \"../config/schema\";\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"]}