fork-version 1.4.53 → 1.4.55

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,21 @@
1
1
  # Fork Version
2
2
 
3
+ ## 1.4.55 (2024-04-19)
4
+
5
+
6
+ ### Refactor
7
+
8
+ * adds json config file support ([a09b74e](https://github.com/eglavin/fork-version/commit/a09b74e1a2f2d24fd52f91780b002a9d633a6797))
9
+
10
+
11
+ ## 1.4.54 (2024-04-18)
12
+
13
+
14
+ ### Refactor
15
+
16
+ * logging annotations + split git tag fallback version check ([aceb3b9](https://github.com/eglavin/fork-version/commit/aceb3b98bc6c33135dee2801799980fd09abfb31))
17
+
18
+
3
19
  ## 1.4.53 (2024-04-18)
4
20
 
5
21
 
@@ -1,6 +1,7 @@
1
1
  'use strict';
2
2
 
3
3
  var zod = require('zod');
4
+ var fs = require('fs');
4
5
  var path = require('path');
5
6
  var JoyCon = require('joycon');
6
7
  var bundleRequire = require('bundle-require');
@@ -9,7 +10,6 @@ var conventionalChangelogConfigSpec = require('conventional-changelog-config-spe
9
10
  var semver3 = require('semver');
10
11
  var conventionalRecommendedBump = require('conventional-recommended-bump');
11
12
  var gitSemverTags = require('git-semver-tags');
12
- var fs = require('fs');
13
13
  var conventionalChangelog = require('conventional-changelog');
14
14
  var child_process = require('child_process');
15
15
  var detectIndent = require('detect-indent');
@@ -326,39 +326,49 @@ async function getUserConfig() {
326
326
  const cwd = cliArguments.flags.path ? path.resolve(cliArguments.flags.path) : process.cwd();
327
327
  const joycon = new JoyCon__default.default();
328
328
  const configFilePath = await joycon.resolve({
329
- files: ["fork.config.ts", "fork.config.js", "fork.config.cjs", "fork.config.mjs"],
329
+ files: [
330
+ "fork.config.ts",
331
+ "fork.config.js",
332
+ "fork.config.cjs",
333
+ "fork.config.mjs",
334
+ "fork.config.json"
335
+ ],
330
336
  cwd,
331
337
  stopDir: path.parse(cwd).root
332
338
  });
333
- if (!configFilePath) {
334
- return {
335
- ...DEFAULT_CONFIG,
336
- ...cliArguments.flags,
337
- path: cwd,
338
- files: getFiles([], cliArguments.flags?.files),
339
- changelogPresetConfig: getChangelogPresetConfig()
340
- };
341
- }
342
- const foundConfig = await bundleRequire.bundleRequire({ filepath: configFilePath });
343
- const parsedConfig = ForkConfigSchema.partial().safeParse(
344
- foundConfig.mod.default || foundConfig.mod
345
- );
346
- if (!parsedConfig.success) {
347
- throw parsedConfig.error;
348
- }
349
- const usersConfig = {
339
+ const configFile = await loadConfigFile(configFilePath);
340
+ const mergedConfig = {
350
341
  ...DEFAULT_CONFIG,
351
- ...parsedConfig.data,
342
+ ...configFile,
352
343
  ...cliArguments.flags
353
344
  };
354
345
  return {
355
- ...usersConfig,
346
+ ...mergedConfig,
356
347
  path: cwd,
357
- files: getFiles(parsedConfig.data?.files, cliArguments.flags?.files),
358
- changelogPresetConfig: getChangelogPresetConfig(usersConfig?.changelogPresetConfig)
348
+ files: getFilesList(configFile?.files, cliArguments.flags?.files),
349
+ changelogPresetConfig: getChangelogPresetConfig(mergedConfig?.changelogPresetConfig)
359
350
  };
360
351
  }
361
- function getFiles(configFiles, cliFiles) {
352
+ async function loadConfigFile(configFilePath) {
353
+ if (!configFilePath) {
354
+ return {};
355
+ }
356
+ if (configFilePath.endsWith("json")) {
357
+ const fileContent2 = JSON.parse(fs.readFileSync(configFilePath).toString());
358
+ const parsed2 = ForkConfigSchema.partial().safeParse(fileContent2);
359
+ if (!parsed2.success) {
360
+ throw parsed2.error;
361
+ }
362
+ return parsed2.data;
363
+ }
364
+ const fileContent = await bundleRequire.bundleRequire({ filepath: configFilePath });
365
+ const parsed = ForkConfigSchema.partial().safeParse(fileContent.mod.default || fileContent.mod);
366
+ if (!parsed.success) {
367
+ throw parsed.error;
368
+ }
369
+ return parsed.data;
370
+ }
371
+ function getFilesList(configFiles, cliFiles) {
362
372
  const listOfFiles = /* @__PURE__ */ new Set();
363
373
  if (Array.isArray(configFiles)) {
364
374
  configFiles.forEach((file) => listOfFiles.add(file));
@@ -430,16 +440,13 @@ async function getCurrentVersion(config, logger, fileManager) {
430
440
  if (config.currentVersion) {
431
441
  versions.add(config.currentVersion);
432
442
  }
433
- if (versions.size === 0) {
434
- if (config.gitTagFallback) {
435
- const version = await getLatestGitTagVersion(config.tagPrefix);
436
- if (version) {
437
- return {
438
- files: [],
439
- version
440
- };
441
- }
443
+ if (versions.size === 0 && config.gitTagFallback) {
444
+ const version = await getLatestGitTagVersion(config.tagPrefix);
445
+ if (version) {
446
+ versions.add(version);
442
447
  }
448
+ }
449
+ if (versions.size === 0) {
443
450
  throw new Error("Unable to find current version");
444
451
  } else if (versions.size > 1) {
445
452
  throw new Error("Found multiple versions");
@@ -458,7 +465,9 @@ async function getCurrentVersion(config, logger, fileManager) {
458
465
  async function getNextVersion(config, logger, currentVersion) {
459
466
  if (config.nextVersion && semver3__default.default.valid(config.nextVersion)) {
460
467
  logger.log(`Next version: ${config.nextVersion}`);
461
- return { version: config.nextVersion };
468
+ return {
469
+ version: config.nextVersion
470
+ };
462
471
  }
463
472
  const isPreMajor = semver3__default.default.lt(currentVersion, "1.0.0");
464
473
  let recommendedBump;
@@ -527,7 +536,7 @@ function getNewReleaseContent(config, logger, nextVersion) {
527
536
  ...config.changelogPresetConfig
528
537
  },
529
538
  tagPrefix: config.tagPrefix,
530
- warn: (...message) => logger.error("conventional-changelog: ", ...message),
539
+ warn: (...message) => logger.error("[conventional-changelog] ", ...message),
531
540
  cwd: config.path
532
541
  },
533
542
  {
@@ -538,7 +547,7 @@ function getNewReleaseContent(config, logger, nextVersion) {
538
547
  path: config.path
539
548
  }
540
549
  ).on("error", (error) => {
541
- logger.error("conventional-changelog: Unable to parse changes");
550
+ logger.error("[conventional-changelog] Unable to parse changes");
542
551
  throw error;
543
552
  }).on("data", (chunk) => {
544
553
  newContent += chunk.toString();
@@ -606,7 +615,7 @@ var Git = class {
606
615
  return (await this.execGit("rev-parse", ["--abbrev-ref", "HEAD"])).trim();
607
616
  }
608
617
  execGit(command, args) {
609
- this.logger.debug(`Executing: git ${command} ${args.join(" ")}`);
618
+ this.logger.debug(`[git ${command}] ${args.join(" ")}`);
610
619
  return new Promise((onResolve, onReject) => {
611
620
  child_process.execFile(
612
621
  "git",
@@ -616,7 +625,7 @@ var Git = class {
616
625
  },
617
626
  (error, stdout, stderr) => {
618
627
  if (error) {
619
- this.logger.error(`git ${command}:`);
628
+ this.logger.error(`[git ${command}] `);
620
629
  onReject(error);
621
630
  }
622
631
  onResolve(stdout ? stdout : stderr);
@@ -724,7 +733,7 @@ var JSONPackage = class {
724
733
  isPrivate: typeof parsedJson?.private === "boolean" ? parsedJson.private : true
725
734
  };
726
735
  }
727
- this.logger.warn(`Unable to determine json package file: ${fileName}`);
736
+ this.logger.warn(`[File Manager] Unable to determine json package: ${fileName}`);
728
737
  }
729
738
  }
730
739
  write(filePath, newVersion) {
@@ -756,7 +765,7 @@ var PlainText = class {
756
765
  version: fileContents || ""
757
766
  };
758
767
  }
759
- this.logger.warn(`Unable to determine plain text file: ${fileName}`);
768
+ this.logger.warn(`[File Manager] Unable to determine plain text: ${fileName}`);
760
769
  }
761
770
  write(filePath, newVersion) {
762
771
  fs.writeFileSync(filePath, newVersion, "utf8");
@@ -792,7 +801,7 @@ var FileManager = class {
792
801
  } else if (fileName.toLowerCase().endsWith("version.txt")) {
793
802
  return this.PlainText.read(fileName);
794
803
  }
795
- this.logger.error(`Unsupported file type: ${fileName}`);
804
+ this.logger.error(`[File Manager] Unsupported file: ${fileName}`);
796
805
  }
797
806
  /**
798
807
  * Write the new version to the given file path.
@@ -811,7 +820,7 @@ var FileManager = class {
811
820
  } else if (filePath.toLowerCase().endsWith("version.txt")) {
812
821
  return this.PlainText.write(filePath, newVersion);
813
822
  }
814
- this.logger.error(`Unsupported file type: ${filePath}`);
823
+ this.logger.error(`[File Manager] Unsupported file: ${filePath}`);
815
824
  }
816
825
  };
817
826
 
@@ -826,4 +835,4 @@ exports.getUserConfig = getUserConfig;
826
835
  exports.tagChanges = tagChanges;
827
836
  exports.updateChangelog = updateChangelog;
828
837
  //# sourceMappingURL=out.js.map
829
- //# sourceMappingURL=chunk-JD645RQZ.cjs.map
838
+ //# sourceMappingURL=chunk-4PMSVMKJ.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.ts","../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/file-manager.ts"],"names":["fileContent","parsed","semver","resolve","readFileSync","writeFileSync"],"mappings":"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","sourcesContent":["import { z } from \"zod\";\n\nexport const ChangelogPresetConfigSchema = z.object({\n\t/**\n\t * An array of `type` objects representing the explicitly supported commit message types,\n\t * and whether they should show up in generated `CHANGELOG`s.\n\t */\n\ttypes: z.array(\n\t\tz.object({\n\t\t\ttype: z.string(),\n\t\t\tsection: z.string().optional(),\n\t\t\thidden: z.boolean().optional(),\n\t\t}),\n\t),\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(),\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(),\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(),\n\t/**\n\t * A URL representing the a user's profile URL on GitHub, Gitlab, etc. This URL is used\n\t * for substituting @bcoe with https://github.com/bcoe in commit messages.\n\t * @default \"{{host}}/{{user}}\"\n\t */\n\tuserUrlFormat: z.string(),\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.string(),\n\t/**\n\t * An array of prefixes used to detect references to issues\n\t * @default [\"#\"]\n\t */\n\tissuePrefixes: z.array(z.string()),\n});\n\nexport type ChangelogPresetConfig = z.infer<typeof ChangelogPresetConfigSchema>;\n\nexport const ForkConfigSchema = z.object({\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(),\n\t/**\n\t * Name of the changelog file.\n\t * @default \"CHANGELOG.md\"\n\t */\n\tchangelog: z.string(),\n\t/**\n\t * The header to be used in 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(),\n\t/**\n\t * 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()),\n\t/**\n\t * Specify a prefix for the git tag fork-version will create.\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 * | 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(),\n\t/**\n\t * Make a pre-release with optional label, if value is a string it will be used as the\n\t * pre-release tag.\n\t *\n\t * | Value | 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\tpreReleaseTag: z.string().or(z.boolean()).optional(),\n\n\t/**\n\t * Commit all staged changes, not just files updated by fork-version.\n\t * @default false\n\t */\n\tcommitAll: z.boolean(),\n\t/**\n\t * If set we'll log debug information.\n\t * @default false\n\t */\n\tdebug: z.boolean(),\n\t/**\n\t * If true, no output will be written to disk or committed.\n\t * @default false\n\t */\n\tdryRun: z.boolean(),\n\t/**\n\t * If true and we cant find a version in the list of `files`, we'll fallback\n\t * and attempt to use the latest git tag to get the current version.\n\t * @default true\n\t */\n\tgitTagFallback: z.boolean(),\n\t/**\n\t * If set, we'll gather information about the current version and exit.\n\t * @default false\n\t */\n\tinspectVersion: z.boolean(),\n\t/**\n\t * Should we sign the git commit using GPG?\n\t * @see {@link https://git-scm.com/docs/git-commit#Documentation/git-commit.txt--Sltkeyidgt GPG Sign Commits}\n\t * @default false\n\t */\n\tsign: z.boolean(),\n\t/**\n\t * If true, no output will be written to stdout.\n\t * @default false\n\t */\n\tsilent: z.boolean(),\n\t/**\n\t * If true, allow git to run git commit hooks.\n\t * @default false\n\t */\n\tverify: z.boolean(),\n\n\t/**\n\t * If set, we'll use this version number instead of trying to find a version from the list of `files`.\n\t * @example \"1.0.0\"\n\t * @default undefined\n\t */\n\tcurrentVersion: z.string().optional(),\n\t/**\n\t * If set, we'll attempt to update the version number to this version, instead of incrementing\n\t * using \"conventional-commit\".\n\t * @example \"2.0.0\"\n\t * @default undefined\n\t */\n\tnextVersion: z.string().optional(),\n\n\t/**\n\t * Override the default conventional-changelog preset configuration.\n\t */\n\tchangelogPresetConfig: ChangelogPresetConfigSchema.partial(),\n});\n\nexport type ForkConfig = z.infer<typeof ForkConfigSchema>;\n\nexport function defineConfig(config: Partial<ForkConfig>): Partial<ForkConfig> {\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\";\n\nimport { ForkConfigSchema, type ForkConfig } from \"./schema\";\nimport { DEFAULT_CONFIG } from \"./defaults\";\nimport { getCliArguments } from \"./cli-arguments\";\nimport { getChangelogPresetConfig } from \"./changelog-preset-config\";\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\tconst configFilePath = await joycon.resolve({\n\t\tfiles: [\n\t\t\t\"fork.config.ts\",\n\t\t\t\"fork.config.js\",\n\t\t\t\"fork.config.cjs\",\n\t\t\t\"fork.config.mjs\",\n\t\t\t\"fork.config.json\",\n\t\t],\n\t\tcwd,\n\t\tstopDir: parse(cwd).root,\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\treturn {\n\t\t...mergedConfig,\n\n\t\tpath: cwd,\n\t\tfiles: getFilesList(configFile?.files, cliArguments.flags?.files),\n\t\tchangelogPresetConfig: getChangelogPresetConfig(mergedConfig?.changelogPresetConfig),\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\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(configFiles: string[] | undefined, cliFiles: string[] | undefined): 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// If the user has defined files use them, otherwise use the default list of files.\n\tif (listOfFiles.size) {\n\t\treturn Array.from(listOfFiles);\n\t}\n\n\treturn DEFAULT_CONFIG.files;\n}\n","import type { ForkConfig } from \"./schema\";\n\nexport const DEFAULT_CONFIG: ForkConfig = {\n\tpath: process.cwd(),\n\tchangelog: \"CHANGELOG.md\",\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\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\tcommitAll: false,\n\tdebug: false,\n\tdryRun: false,\n\tgitTagFallback: true,\n\tinspectVersion: false,\n\tsign: false,\n\tsilent: false,\n\tverify: false,\n\n\tchangelogPresetConfig: {},\n};\n","import meow from \"meow\";\n\nexport function getCliArguments() {\n\treturn meow(\n\t\t`\nUsage:\n $ fork-version [options]\n\nOptions:\n --path [Default: process.cwd()]\n The path fork-version will run from.\n --changelog [Default: \"CHANGELOG.md\"]\n Name of the changelog file.\n --header, -H\n The header to be used in the changelog.\n --files, --file, -F [Default: [\"bower.json\", \"manifest.json\", \"npm-shrinkwrap.json\", \"package-lock.json\", \"package.json\"]]\n Files to be updated.\n --tag-prefix [Default: \"v\"]\n Specify a prefix for the git tag \"fork-version\" will create.\n --pre-release-tag [Default: undefined]\n Make a pre-release with optional label, If value is a string it\n will be used as the pre-release tag.\n\n --commit-all\n Commit all staged changes, not just files updated by fork-version.\n --debug\n If true, we'll output debug information.\n --dry-run\n If true, no output will be written to disk or committed.\n --git-tag-fallback [Default: true]\n If true and we cant find a version in the given files, we'll fallback\n and attempt to use the latest git tag for the current version.\n --inspect-version\n If set, we'll gather information about the current version and exit.\n --sign\n Should we sign the git commit using GPG?\n --silent\n If true, no output will be written to stdout.\n --verify\n If true, allow git to run git commit hooks.\n\n --current-version\n If set, we'll use this version number instead of trying to find a\n version in a \"file\".\n --next-version\n If set, we'll attempt to update the version number to this version,\n instead of incrementing using \"conventional-commit\".\n`,\n\t\t{\n\t\t\timportMeta: import.meta,\n\t\t\tflags: {\n\t\t\t\tpath: { type: \"string\", default: process.cwd() },\n\t\t\t\tchangelog: { type: \"string\" },\n\t\t\t\theader: { type: \"string\", shortFlag: \"H\" },\n\t\t\t\tfiles: { type: \"string\", isMultiple: true, aliases: [\"file\"], shortFlag: \"F\" },\n\t\t\t\ttagPrefix: { type: \"string\" },\n\t\t\t\tpreReleaseTag: { type: \"string\" },\n\n\t\t\t\tcommitAll: { type: \"boolean\" },\n\t\t\t\tdebug: { type: \"boolean\" },\n\t\t\t\tdryRun: { type: \"boolean\" },\n\t\t\t\tgitTagFallback: { type: \"boolean\" },\n\t\t\t\tinspectVersion: { type: \"boolean\" },\n\t\t\t\tsign: { type: \"boolean\" },\n\t\t\t\tsilent: { type: \"boolean\" },\n\t\t\t\tverify: { type: \"boolean\" },\n\n\t\t\t\tcurrentVersion: { type: \"string\" },\n\t\t\t\tnextVersion: { type: \"string\" },\n\t\t\t},\n\t\t},\n\t);\n}\n","import conventionalChangelogConfigSpec from \"conventional-changelog-config-spec\";\n\nimport { ChangelogPresetConfigSchema, type ForkConfig } from \"./schema\";\n\nexport function getChangelogPresetConfig(\n\tusersChangelogPresetConfig?: ForkConfig[\"changelogPresetConfig\"],\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 (usersChangelogPresetConfig && typeof usersChangelogPresetConfig === \"object\") {\n\t\tObject.entries(usersChangelogPresetConfig).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\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 { IFileManager, 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: IFileManager,\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\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.preReleaseTag,\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.preReleaseTag === \"string\" ? config.preReleaseTag : 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 \"1.0.0\";\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(filePath: string, newVersion: string) {\n\t\tconst fileContents = readFileSync(filePath, \"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\tfilePath,\n\t\t\tstringifyPackage(parsedJson, detectIndent(fileContents).amount, detectNewline(fileContents)),\n\t\t\t\"utf8\",\n\t\t);\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(filePath: string, newVersion: string) {\n\t\twriteFileSync(filePath, newVersion, \"utf8\");\n\t}\n}\n","import { JSONPackage } from \"./json-package\";\nimport { PlainText } from \"./plain-text\";\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(filePath: string, newVersion: string): void;\n}\n\nexport class FileManager implements IFileManager {\n\tprivate JSONPackage: JSONPackage;\n\tprivate PlainText: PlainText;\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}\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\tif (fileName.toLowerCase().endsWith(\".json\")) {\n\t\t\treturn this.JSONPackage.read(fileName);\n\t\t} else if (fileName.toLowerCase().endsWith(\"version.txt\")) {\n\t\t\treturn this.PlainText.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 path.\n\t *\n\t * @example\n\t * ```ts\n\t * fileManager.write(\"/path/to/package.json\", \"1.2.3\");\n\t * ```\n\t */\n\tpublic write(filePath: string, newVersion: string): void {\n\t\tif (this.config.dryRun) {\n\t\t\treturn;\n\t\t}\n\n\t\tif (filePath.toLowerCase().endsWith(\".json\")) {\n\t\t\treturn this.JSONPackage.write(filePath, newVersion);\n\t\t} else if (filePath.toLowerCase().endsWith(\"version.txt\")) {\n\t\t\treturn this.PlainText.write(filePath, newVersion);\n\t\t}\n\n\t\tthis.logger.error(`[File Manager] Unsupported file: ${filePath}`);\n\t}\n}\n"]}
@@ -1,4 +1,5 @@
1
1
  import { z } from 'zod';
2
+ import { readFileSync, writeFileSync, lstatSync } from 'fs';
2
3
  import { resolve, parse } from 'path';
3
4
  import JoyCon from 'joycon';
4
5
  import { bundleRequire } from 'bundle-require';
@@ -7,7 +8,6 @@ import conventionalChangelogConfigSpec from 'conventional-changelog-config-spec'
7
8
  import semver3 from 'semver';
8
9
  import conventionalRecommendedBump from 'conventional-recommended-bump';
9
10
  import gitSemverTags from 'git-semver-tags';
10
- import { writeFileSync, lstatSync, readFileSync } from 'fs';
11
11
  import conventionalChangelog from 'conventional-changelog';
12
12
  import { execFile } from 'child_process';
13
13
  import detectIndent from 'detect-indent';
@@ -312,39 +312,49 @@ async function getUserConfig() {
312
312
  const cwd = cliArguments.flags.path ? resolve(cliArguments.flags.path) : process.cwd();
313
313
  const joycon = new JoyCon();
314
314
  const configFilePath = await joycon.resolve({
315
- files: ["fork.config.ts", "fork.config.js", "fork.config.cjs", "fork.config.mjs"],
315
+ files: [
316
+ "fork.config.ts",
317
+ "fork.config.js",
318
+ "fork.config.cjs",
319
+ "fork.config.mjs",
320
+ "fork.config.json"
321
+ ],
316
322
  cwd,
317
323
  stopDir: parse(cwd).root
318
324
  });
319
- if (!configFilePath) {
320
- return {
321
- ...DEFAULT_CONFIG,
322
- ...cliArguments.flags,
323
- path: cwd,
324
- files: getFiles([], cliArguments.flags?.files),
325
- changelogPresetConfig: getChangelogPresetConfig()
326
- };
327
- }
328
- const foundConfig = await bundleRequire({ filepath: configFilePath });
329
- const parsedConfig = ForkConfigSchema.partial().safeParse(
330
- foundConfig.mod.default || foundConfig.mod
331
- );
332
- if (!parsedConfig.success) {
333
- throw parsedConfig.error;
334
- }
335
- const usersConfig = {
325
+ const configFile = await loadConfigFile(configFilePath);
326
+ const mergedConfig = {
336
327
  ...DEFAULT_CONFIG,
337
- ...parsedConfig.data,
328
+ ...configFile,
338
329
  ...cliArguments.flags
339
330
  };
340
331
  return {
341
- ...usersConfig,
332
+ ...mergedConfig,
342
333
  path: cwd,
343
- files: getFiles(parsedConfig.data?.files, cliArguments.flags?.files),
344
- changelogPresetConfig: getChangelogPresetConfig(usersConfig?.changelogPresetConfig)
334
+ files: getFilesList(configFile?.files, cliArguments.flags?.files),
335
+ changelogPresetConfig: getChangelogPresetConfig(mergedConfig?.changelogPresetConfig)
345
336
  };
346
337
  }
347
- function getFiles(configFiles, cliFiles) {
338
+ async function loadConfigFile(configFilePath) {
339
+ if (!configFilePath) {
340
+ return {};
341
+ }
342
+ if (configFilePath.endsWith("json")) {
343
+ const fileContent2 = JSON.parse(readFileSync(configFilePath).toString());
344
+ const parsed2 = ForkConfigSchema.partial().safeParse(fileContent2);
345
+ if (!parsed2.success) {
346
+ throw parsed2.error;
347
+ }
348
+ return parsed2.data;
349
+ }
350
+ const fileContent = await bundleRequire({ filepath: configFilePath });
351
+ const parsed = ForkConfigSchema.partial().safeParse(fileContent.mod.default || fileContent.mod);
352
+ if (!parsed.success) {
353
+ throw parsed.error;
354
+ }
355
+ return parsed.data;
356
+ }
357
+ function getFilesList(configFiles, cliFiles) {
348
358
  const listOfFiles = /* @__PURE__ */ new Set();
349
359
  if (Array.isArray(configFiles)) {
350
360
  configFiles.forEach((file) => listOfFiles.add(file));
@@ -416,16 +426,13 @@ async function getCurrentVersion(config, logger, fileManager) {
416
426
  if (config.currentVersion) {
417
427
  versions.add(config.currentVersion);
418
428
  }
419
- if (versions.size === 0) {
420
- if (config.gitTagFallback) {
421
- const version = await getLatestGitTagVersion(config.tagPrefix);
422
- if (version) {
423
- return {
424
- files: [],
425
- version
426
- };
427
- }
429
+ if (versions.size === 0 && config.gitTagFallback) {
430
+ const version = await getLatestGitTagVersion(config.tagPrefix);
431
+ if (version) {
432
+ versions.add(version);
428
433
  }
434
+ }
435
+ if (versions.size === 0) {
429
436
  throw new Error("Unable to find current version");
430
437
  } else if (versions.size > 1) {
431
438
  throw new Error("Found multiple versions");
@@ -444,7 +451,9 @@ async function getCurrentVersion(config, logger, fileManager) {
444
451
  async function getNextVersion(config, logger, currentVersion) {
445
452
  if (config.nextVersion && semver3.valid(config.nextVersion)) {
446
453
  logger.log(`Next version: ${config.nextVersion}`);
447
- return { version: config.nextVersion };
454
+ return {
455
+ version: config.nextVersion
456
+ };
448
457
  }
449
458
  const isPreMajor = semver3.lt(currentVersion, "1.0.0");
450
459
  let recommendedBump;
@@ -513,7 +522,7 @@ function getNewReleaseContent(config, logger, nextVersion) {
513
522
  ...config.changelogPresetConfig
514
523
  },
515
524
  tagPrefix: config.tagPrefix,
516
- warn: (...message) => logger.error("conventional-changelog: ", ...message),
525
+ warn: (...message) => logger.error("[conventional-changelog] ", ...message),
517
526
  cwd: config.path
518
527
  },
519
528
  {
@@ -524,7 +533,7 @@ function getNewReleaseContent(config, logger, nextVersion) {
524
533
  path: config.path
525
534
  }
526
535
  ).on("error", (error) => {
527
- logger.error("conventional-changelog: Unable to parse changes");
536
+ logger.error("[conventional-changelog] Unable to parse changes");
528
537
  throw error;
529
538
  }).on("data", (chunk) => {
530
539
  newContent += chunk.toString();
@@ -592,7 +601,7 @@ var Git = class {
592
601
  return (await this.execGit("rev-parse", ["--abbrev-ref", "HEAD"])).trim();
593
602
  }
594
603
  execGit(command, args) {
595
- this.logger.debug(`Executing: git ${command} ${args.join(" ")}`);
604
+ this.logger.debug(`[git ${command}] ${args.join(" ")}`);
596
605
  return new Promise((onResolve, onReject) => {
597
606
  execFile(
598
607
  "git",
@@ -602,7 +611,7 @@ var Git = class {
602
611
  },
603
612
  (error, stdout, stderr) => {
604
613
  if (error) {
605
- this.logger.error(`git ${command}:`);
614
+ this.logger.error(`[git ${command}] `);
606
615
  onReject(error);
607
616
  }
608
617
  onResolve(stdout ? stdout : stderr);
@@ -710,7 +719,7 @@ var JSONPackage = class {
710
719
  isPrivate: typeof parsedJson?.private === "boolean" ? parsedJson.private : true
711
720
  };
712
721
  }
713
- this.logger.warn(`Unable to determine json package file: ${fileName}`);
722
+ this.logger.warn(`[File Manager] Unable to determine json package: ${fileName}`);
714
723
  }
715
724
  }
716
725
  write(filePath, newVersion) {
@@ -742,7 +751,7 @@ var PlainText = class {
742
751
  version: fileContents || ""
743
752
  };
744
753
  }
745
- this.logger.warn(`Unable to determine plain text file: ${fileName}`);
754
+ this.logger.warn(`[File Manager] Unable to determine plain text: ${fileName}`);
746
755
  }
747
756
  write(filePath, newVersion) {
748
757
  writeFileSync(filePath, newVersion, "utf8");
@@ -778,7 +787,7 @@ var FileManager = class {
778
787
  } else if (fileName.toLowerCase().endsWith("version.txt")) {
779
788
  return this.PlainText.read(fileName);
780
789
  }
781
- this.logger.error(`Unsupported file type: ${fileName}`);
790
+ this.logger.error(`[File Manager] Unsupported file: ${fileName}`);
782
791
  }
783
792
  /**
784
793
  * Write the new version to the given file path.
@@ -797,10 +806,10 @@ var FileManager = class {
797
806
  } else if (filePath.toLowerCase().endsWith("version.txt")) {
798
807
  return this.PlainText.write(filePath, newVersion);
799
808
  }
800
- this.logger.error(`Unsupported file type: ${filePath}`);
809
+ this.logger.error(`[File Manager] Unsupported file: ${filePath}`);
801
810
  }
802
811
  };
803
812
 
804
813
  export { FileManager, ForkConfigSchema, Git, commitChanges, defineConfig, getCurrentVersion, getNextVersion, getUserConfig, tagChanges, updateChangelog };
805
814
  //# sourceMappingURL=out.js.map
806
- //# sourceMappingURL=chunk-KFBD5WZ4.js.map
815
+ //# sourceMappingURL=chunk-BVRK4H3J.js.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.ts","../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/file-manager.ts"],"names":["fileContent","parsed","semver","resolve","readFileSync","writeFileSync"],"mappings":"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","sourcesContent":["import { z } from \"zod\";\n\nexport const ChangelogPresetConfigSchema = z.object({\n\t/**\n\t * An array of `type` objects representing the explicitly supported commit message types,\n\t * and whether they should show up in generated `CHANGELOG`s.\n\t */\n\ttypes: z.array(\n\t\tz.object({\n\t\t\ttype: z.string(),\n\t\t\tsection: z.string().optional(),\n\t\t\thidden: z.boolean().optional(),\n\t\t}),\n\t),\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(),\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(),\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(),\n\t/**\n\t * A URL representing the a user's profile URL on GitHub, Gitlab, etc. This URL is used\n\t * for substituting @bcoe with https://github.com/bcoe in commit messages.\n\t * @default \"{{host}}/{{user}}\"\n\t */\n\tuserUrlFormat: z.string(),\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.string(),\n\t/**\n\t * An array of prefixes used to detect references to issues\n\t * @default [\"#\"]\n\t */\n\tissuePrefixes: z.array(z.string()),\n});\n\nexport type ChangelogPresetConfig = z.infer<typeof ChangelogPresetConfigSchema>;\n\nexport const ForkConfigSchema = z.object({\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(),\n\t/**\n\t * Name of the changelog file.\n\t * @default \"CHANGELOG.md\"\n\t */\n\tchangelog: z.string(),\n\t/**\n\t * The header to be used in 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(),\n\t/**\n\t * 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()),\n\t/**\n\t * Specify a prefix for the git tag fork-version will create.\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 * | 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(),\n\t/**\n\t * Make a pre-release with optional label, if value is a string it will be used as the\n\t * pre-release tag.\n\t *\n\t * | Value | 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\tpreReleaseTag: z.string().or(z.boolean()).optional(),\n\n\t/**\n\t * Commit all staged changes, not just files updated by fork-version.\n\t * @default false\n\t */\n\tcommitAll: z.boolean(),\n\t/**\n\t * If set we'll log debug information.\n\t * @default false\n\t */\n\tdebug: z.boolean(),\n\t/**\n\t * If true, no output will be written to disk or committed.\n\t * @default false\n\t */\n\tdryRun: z.boolean(),\n\t/**\n\t * If true and we cant find a version in the list of `files`, we'll fallback\n\t * and attempt to use the latest git tag to get the current version.\n\t * @default true\n\t */\n\tgitTagFallback: z.boolean(),\n\t/**\n\t * If set, we'll gather information about the current version and exit.\n\t * @default false\n\t */\n\tinspectVersion: z.boolean(),\n\t/**\n\t * Should we sign the git commit using GPG?\n\t * @see {@link https://git-scm.com/docs/git-commit#Documentation/git-commit.txt--Sltkeyidgt GPG Sign Commits}\n\t * @default false\n\t */\n\tsign: z.boolean(),\n\t/**\n\t * If true, no output will be written to stdout.\n\t * @default false\n\t */\n\tsilent: z.boolean(),\n\t/**\n\t * If true, allow git to run git commit hooks.\n\t * @default false\n\t */\n\tverify: z.boolean(),\n\n\t/**\n\t * If set, we'll use this version number instead of trying to find a version from the list of `files`.\n\t * @example \"1.0.0\"\n\t * @default undefined\n\t */\n\tcurrentVersion: z.string().optional(),\n\t/**\n\t * If set, we'll attempt to update the version number to this version, instead of incrementing\n\t * using \"conventional-commit\".\n\t * @example \"2.0.0\"\n\t * @default undefined\n\t */\n\tnextVersion: z.string().optional(),\n\n\t/**\n\t * Override the default conventional-changelog preset configuration.\n\t */\n\tchangelogPresetConfig: ChangelogPresetConfigSchema.partial(),\n});\n\nexport type ForkConfig = z.infer<typeof ForkConfigSchema>;\n\nexport function defineConfig(config: Partial<ForkConfig>): Partial<ForkConfig> {\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\";\n\nimport { ForkConfigSchema, type ForkConfig } from \"./schema\";\nimport { DEFAULT_CONFIG } from \"./defaults\";\nimport { getCliArguments } from \"./cli-arguments\";\nimport { getChangelogPresetConfig } from \"./changelog-preset-config\";\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\tconst configFilePath = await joycon.resolve({\n\t\tfiles: [\n\t\t\t\"fork.config.ts\",\n\t\t\t\"fork.config.js\",\n\t\t\t\"fork.config.cjs\",\n\t\t\t\"fork.config.mjs\",\n\t\t\t\"fork.config.json\",\n\t\t],\n\t\tcwd,\n\t\tstopDir: parse(cwd).root,\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\treturn {\n\t\t...mergedConfig,\n\n\t\tpath: cwd,\n\t\tfiles: getFilesList(configFile?.files, cliArguments.flags?.files),\n\t\tchangelogPresetConfig: getChangelogPresetConfig(mergedConfig?.changelogPresetConfig),\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\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(configFiles: string[] | undefined, cliFiles: string[] | undefined): 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// If the user has defined files use them, otherwise use the default list of files.\n\tif (listOfFiles.size) {\n\t\treturn Array.from(listOfFiles);\n\t}\n\n\treturn DEFAULT_CONFIG.files;\n}\n","import type { ForkConfig } from \"./schema\";\n\nexport const DEFAULT_CONFIG: ForkConfig = {\n\tpath: process.cwd(),\n\tchangelog: \"CHANGELOG.md\",\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\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\tcommitAll: false,\n\tdebug: false,\n\tdryRun: false,\n\tgitTagFallback: true,\n\tinspectVersion: false,\n\tsign: false,\n\tsilent: false,\n\tverify: false,\n\n\tchangelogPresetConfig: {},\n};\n","import meow from \"meow\";\n\nexport function getCliArguments() {\n\treturn meow(\n\t\t`\nUsage:\n $ fork-version [options]\n\nOptions:\n --path [Default: process.cwd()]\n The path fork-version will run from.\n --changelog [Default: \"CHANGELOG.md\"]\n Name of the changelog file.\n --header, -H\n The header to be used in the changelog.\n --files, --file, -F [Default: [\"bower.json\", \"manifest.json\", \"npm-shrinkwrap.json\", \"package-lock.json\", \"package.json\"]]\n Files to be updated.\n --tag-prefix [Default: \"v\"]\n Specify a prefix for the git tag \"fork-version\" will create.\n --pre-release-tag [Default: undefined]\n Make a pre-release with optional label, If value is a string it\n will be used as the pre-release tag.\n\n --commit-all\n Commit all staged changes, not just files updated by fork-version.\n --debug\n If true, we'll output debug information.\n --dry-run\n If true, no output will be written to disk or committed.\n --git-tag-fallback [Default: true]\n If true and we cant find a version in the given files, we'll fallback\n and attempt to use the latest git tag for the current version.\n --inspect-version\n If set, we'll gather information about the current version and exit.\n --sign\n Should we sign the git commit using GPG?\n --silent\n If true, no output will be written to stdout.\n --verify\n If true, allow git to run git commit hooks.\n\n --current-version\n If set, we'll use this version number instead of trying to find a\n version in a \"file\".\n --next-version\n If set, we'll attempt to update the version number to this version,\n instead of incrementing using \"conventional-commit\".\n`,\n\t\t{\n\t\t\timportMeta: import.meta,\n\t\t\tflags: {\n\t\t\t\tpath: { type: \"string\", default: process.cwd() },\n\t\t\t\tchangelog: { type: \"string\" },\n\t\t\t\theader: { type: \"string\", shortFlag: \"H\" },\n\t\t\t\tfiles: { type: \"string\", isMultiple: true, aliases: [\"file\"], shortFlag: \"F\" },\n\t\t\t\ttagPrefix: { type: \"string\" },\n\t\t\t\tpreReleaseTag: { type: \"string\" },\n\n\t\t\t\tcommitAll: { type: \"boolean\" },\n\t\t\t\tdebug: { type: \"boolean\" },\n\t\t\t\tdryRun: { type: \"boolean\" },\n\t\t\t\tgitTagFallback: { type: \"boolean\" },\n\t\t\t\tinspectVersion: { type: \"boolean\" },\n\t\t\t\tsign: { type: \"boolean\" },\n\t\t\t\tsilent: { type: \"boolean\" },\n\t\t\t\tverify: { type: \"boolean\" },\n\n\t\t\t\tcurrentVersion: { type: \"string\" },\n\t\t\t\tnextVersion: { type: \"string\" },\n\t\t\t},\n\t\t},\n\t);\n}\n","import conventionalChangelogConfigSpec from \"conventional-changelog-config-spec\";\n\nimport { ChangelogPresetConfigSchema, type ForkConfig } from \"./schema\";\n\nexport function getChangelogPresetConfig(\n\tusersChangelogPresetConfig?: ForkConfig[\"changelogPresetConfig\"],\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 (usersChangelogPresetConfig && typeof usersChangelogPresetConfig === \"object\") {\n\t\tObject.entries(usersChangelogPresetConfig).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\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 { IFileManager, 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: IFileManager,\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\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.preReleaseTag,\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.preReleaseTag === \"string\" ? config.preReleaseTag : 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 \"1.0.0\";\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(filePath: string, newVersion: string) {\n\t\tconst fileContents = readFileSync(filePath, \"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\tfilePath,\n\t\t\tstringifyPackage(parsedJson, detectIndent(fileContents).amount, detectNewline(fileContents)),\n\t\t\t\"utf8\",\n\t\t);\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(filePath: string, newVersion: string) {\n\t\twriteFileSync(filePath, newVersion, \"utf8\");\n\t}\n}\n","import { JSONPackage } from \"./json-package\";\nimport { PlainText } from \"./plain-text\";\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(filePath: string, newVersion: string): void;\n}\n\nexport class FileManager implements IFileManager {\n\tprivate JSONPackage: JSONPackage;\n\tprivate PlainText: PlainText;\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}\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\tif (fileName.toLowerCase().endsWith(\".json\")) {\n\t\t\treturn this.JSONPackage.read(fileName);\n\t\t} else if (fileName.toLowerCase().endsWith(\"version.txt\")) {\n\t\t\treturn this.PlainText.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 path.\n\t *\n\t * @example\n\t * ```ts\n\t * fileManager.write(\"/path/to/package.json\", \"1.2.3\");\n\t * ```\n\t */\n\tpublic write(filePath: string, newVersion: string): void {\n\t\tif (this.config.dryRun) {\n\t\t\treturn;\n\t\t}\n\n\t\tif (filePath.toLowerCase().endsWith(\".json\")) {\n\t\t\treturn this.JSONPackage.write(filePath, newVersion);\n\t\t} else if (filePath.toLowerCase().endsWith(\"version.txt\")) {\n\t\t\treturn this.PlainText.write(filePath, newVersion);\n\t\t}\n\n\t\tthis.logger.error(`[File Manager] Unsupported file: ${filePath}`);\n\t}\n}\n"]}
package/dist/cli.cjs CHANGED
@@ -1,7 +1,7 @@
1
1
  #!/usr/bin/env node
2
2
  'use strict';
3
3
 
4
- var chunkJD645RQZ_cjs = require('./chunk-JD645RQZ.cjs');
4
+ var chunk4PMSVMKJ_cjs = require('./chunk-4PMSVMKJ.cjs');
5
5
 
6
6
  // src/utils/logger.ts
7
7
  var Logger = class {
@@ -38,7 +38,7 @@ var Logger = class {
38
38
 
39
39
  // src/process/message.ts
40
40
  async function completedMessage(config, logger, files, releaseType) {
41
- const git = new chunkJD645RQZ_cjs.Git(config, logger);
41
+ const git = new chunk4PMSVMKJ_cjs.Git(config, logger);
42
42
  const branchName = await git.currentBranch();
43
43
  logger.log(
44
44
  `
@@ -54,21 +54,21 @@ Run \`git push --follow-tags origin ${branchName}\` to push the changes and the
54
54
 
55
55
  // src/cli.ts
56
56
  async function runFork() {
57
- const config = await chunkJD645RQZ_cjs.getUserConfig();
57
+ const config = await chunk4PMSVMKJ_cjs.getUserConfig();
58
58
  const logger = new Logger(config);
59
- const fileManager = new chunkJD645RQZ_cjs.FileManager(config, logger);
60
- logger.log(`Running fork-version: ${(/* @__PURE__ */ new Date()).toLocaleString()}`);
61
- logger.log(config.dryRun ? "[DRY RUN] No changes will be written to disk.\n" : "\n");
62
- const current = await chunkJD645RQZ_cjs.getCurrentVersion(config, logger, fileManager);
63
- const next = await chunkJD645RQZ_cjs.getNextVersion(config, logger, current.version);
59
+ const fileManager = new chunk4PMSVMKJ_cjs.FileManager(config, logger);
60
+ logger.log(`Running fork-version - ${(/* @__PURE__ */ new Date()).toLocaleString()}`);
61
+ logger.log(config.dryRun ? "[DRY RUN] No changes will be written to disk.\n" : "");
62
+ const current = await chunk4PMSVMKJ_cjs.getCurrentVersion(config, logger, fileManager);
63
+ const next = await chunk4PMSVMKJ_cjs.getNextVersion(config, logger, current.version);
64
64
  logger.log("Updating Files: ");
65
65
  for (const outFile of current.files) {
66
- logger.log(` ${outFile.path}`);
66
+ logger.log(` - ${outFile.path}`);
67
67
  fileManager.write(outFile.path, next.version);
68
68
  }
69
- const changelogResult = await chunkJD645RQZ_cjs.updateChangelog(config, logger, next.version);
70
- const commitResult = await chunkJD645RQZ_cjs.commitChanges(config, logger, current.files, next.version);
71
- const tagResult = await chunkJD645RQZ_cjs.tagChanges(config, logger, next.version);
69
+ const changelogResult = await chunk4PMSVMKJ_cjs.updateChangelog(config, logger, next.version);
70
+ const commitResult = await chunk4PMSVMKJ_cjs.commitChanges(config, logger, current.files, next.version);
71
+ const tagResult = await chunk4PMSVMKJ_cjs.tagChanges(config, logger, next.version);
72
72
  completedMessage(config, logger, current.files, next.releaseType);
73
73
  const result = {
74
74
  config,
package/dist/cli.cjs.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/utils/logger.ts","../src/process/message.ts","../src/cli.ts"],"names":[],"mappings":";;;;;;;;;;;;;AAIO,IAAM,SAAN,MAAa;AAAA,EAGnB,YAAoB,QAAiE;AAAjE;AACnB,SAAK,MAAM,KAAK,IAAI,KAAK,IAAI;AAC7B,SAAK,OAAO,KAAK,KAAK,KAAK,IAAI;AAC/B,SAAK,QAAQ,KAAK,MAAM,KAAK,IAAI;AACjC,SAAK,QAAQ,KAAK,MAAM,KAAK,IAAI;AAGjC,SAAK,cAAc,KAAK,OAAO,UAAU,KAAK,OAAO;AAAA,EACtD;AAAA,EAVA,cAAc;AAAA,EAYP,OAAO,UAAiB;AAC9B,QAAI,CAAC,KAAK,aAAa;AACtB,cAAQ,IAAI,GAAG,QAAQ;AAAA,IACxB;AAAA,EACD;AAAA,EAEO,QAAQ,UAAiB;AAC/B,QAAI,CAAC,KAAK,aAAa;AACtB,cAAQ,KAAK,GAAG,QAAQ;AAAA,IACzB;AAAA,EACD;AAAA,EAEO,SAAS,UAAiB;AAChC,QAAI,CAAC,KAAK,aAAa;AACtB,cAAQ,MAAM,GAAG,QAAQ;AAAA,IAC1B;AAAA,EACD;AAAA,EAEO,SAAS,UAAiB;AAChC,QAAI,KAAK,OAAO,SAAS,CAAC,KAAK,aAAa;AAC3C,cAAQ,MAAM,GAAG,QAAQ;AAAA,IAC1B;AAAA,EACD;AACD;;;ACnCA,eAAsB,iBACrB,QACA,QACA,OACA,aACC;AACD,QAAM,MAAM,IAAI,IAAI,QAAQ,MAAM;AAGlC,QAAM,aAAa,MAAM,IAAI,cAAc;AAE3C,SAAO;AAAA,IACN;AAAA,sCAAyC,UAAU;AAAA,EACpD;AAGA,MAAI,MAAM,KAAK,CAAC,SAAS,KAAK,SAAS,kBAAkB,KAAK,cAAc,KAAK,GAAG;AACnF,UAAM,SAAS,OAAO,OAAO,kBAAkB,WAAW,OAAO,gBAAgB;AAEjF,WAAO;AAAA,MACN,GAAG,WAAW,GAAG,WAAW,KAAK,IAC9B,2BAA2B,MAAM,+BACjC;AAAA,IACJ;AAAA,EACD;AACD;;;AClBA,eAAe,UAAU;AACxB,QAAM,SAAS,MAAM,cAAc;AACnC,QAAM,SAAS,IAAI,OAAO,MAAM;AAChC,QAAM,cAAc,IAAI,YAAY,QAAQ,MAAM;AAElD,SAAO,IAAI,0BAAyB,oBAAI,KAAK,GAAE,eAAe,CAAC,EAAE;AACjE,SAAO,IAAI,OAAO,SAAS,oDAAoD,IAAI;AAEnF,QAAM,UAAU,MAAM,kBAAkB,QAAQ,QAAQ,WAAW;AACnE,QAAM,OAAO,MAAM,eAAe,QAAQ,QAAQ,QAAQ,OAAO;AAEjE,SAAO,IAAI,kBAAkB;AAC7B,aAAW,WAAW,QAAQ,OAAO;AACpC,WAAO,IAAI,IAAK,QAAQ,IAAI,EAAE;AAE9B,gBAAY,MAAM,QAAQ,MAAM,KAAK,OAAO;AAAA,EAC7C;AAEA,QAAM,kBAAkB,MAAM,gBAAgB,QAAQ,QAAQ,KAAK,OAAO;AAC1E,QAAM,eAAe,MAAM,cAAc,QAAQ,QAAQ,QAAQ,OAAO,KAAK,OAAO;AACpF,QAAM,YAAY,MAAM,WAAW,QAAQ,QAAQ,KAAK,OAAO;AAE/D,mBAAiB,QAAQ,QAAQ,QAAQ,OAAO,KAAK,WAAW;AAEhE,QAAM,SAAS;AAAA,IACd;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACD;AAEA,SAAO,MAAM,KAAK,UAAU,QAAQ,MAAM,CAAC,CAAC;AAE5C,SAAO;AACR;AAEA,QAAQ","sourcesContent":["/* 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","import { Git } from \"../utils/git\";\nimport type { ForkConfig } from \"../config/schema\";\nimport type { FileState } from \"../strategies/file-manager\";\nimport type { Logger } from \"../utils/logger\";\n\nexport async function completedMessage(\n\tconfig: ForkConfig,\n\tlogger: Logger,\n\tfiles: FileState[],\n\treleaseType: string | undefined,\n) {\n\tconst git = new Git(config, logger);\n\n\t// Print git push command\n\tconst branchName = await git.currentBranch();\n\n\tlogger.log(\n\t\t`\\nRun \\`git push --follow-tags origin ${branchName}\\` to push the changes and the tag.`,\n\t);\n\n\t// Print npm publish command\n\tif (files.some((file) => file.name === \"package.json\" && file.isPrivate === false)) {\n\t\tconst npmTag = typeof config.preReleaseTag === \"string\" ? config.preReleaseTag : \"prerelease\";\n\n\t\tlogger.log(\n\t\t\t`${releaseType}`.startsWith(\"pre\")\n\t\t\t\t? `Run \\`npm publish --tag ${npmTag}\\` to publish the package.`\n\t\t\t\t: \"Run `npm publish` to publish the package.\",\n\t\t);\n\t}\n}\n","#!/usr/bin/env node\n\nimport { getUserConfig } from \"./config/user-config\";\nimport { Logger } from \"./utils/logger\";\nimport { FileManager } from \"./strategies/file-manager\";\n\nimport { getCurrentVersion, getNextVersion } from \"./process/version\";\nimport { updateChangelog } from \"./process/changelog\";\nimport { commitChanges } from \"./process/commit\";\nimport { tagChanges } from \"./process/tag\";\nimport { completedMessage } from \"./process/message\";\n\nasync function runFork() {\n\tconst config = await getUserConfig();\n\tconst logger = new Logger(config);\n\tconst fileManager = new FileManager(config, logger);\n\n\tlogger.log(`Running fork-version: ${new Date().toLocaleString()}`);\n\tlogger.log(config.dryRun ? \"[DRY RUN] No changes will be written to disk.\\n\" : \"\\n\");\n\n\tconst current = await getCurrentVersion(config, logger, fileManager);\n\tconst next = await getNextVersion(config, logger, current.version);\n\n\tlogger.log(\"Updating Files: \");\n\tfor (const outFile of current.files) {\n\t\tlogger.log(`\\t${outFile.path}`);\n\n\t\tfileManager.write(outFile.path, next.version);\n\t}\n\n\tconst changelogResult = await updateChangelog(config, logger, next.version);\n\tconst commitResult = await commitChanges(config, logger, current.files, next.version);\n\tconst tagResult = await tagChanges(config, logger, next.version);\n\n\tcompletedMessage(config, logger, current.files, next.releaseType);\n\n\tconst result = {\n\t\tconfig,\n\t\tcurrent,\n\t\tnext,\n\t\tchangelogResult,\n\t\tcommitResult,\n\t\ttagResult,\n\t};\n\n\tlogger.debug(JSON.stringify(result, null, 2));\n\n\treturn result;\n}\n\nrunFork();\n"]}
1
+ {"version":3,"sources":["../src/utils/logger.ts","../src/process/message.ts","../src/cli.ts"],"names":[],"mappings":";;;;;;;;;;;;;AAIO,IAAM,SAAN,MAAa;AAAA,EAGnB,YAAoB,QAAiE;AAAjE;AACnB,SAAK,MAAM,KAAK,IAAI,KAAK,IAAI;AAC7B,SAAK,OAAO,KAAK,KAAK,KAAK,IAAI;AAC/B,SAAK,QAAQ,KAAK,MAAM,KAAK,IAAI;AACjC,SAAK,QAAQ,KAAK,MAAM,KAAK,IAAI;AAGjC,SAAK,cAAc,KAAK,OAAO,UAAU,KAAK,OAAO;AAAA,EACtD;AAAA,EAVA,cAAc;AAAA,EAYP,OAAO,UAAiB;AAC9B,QAAI,CAAC,KAAK,aAAa;AACtB,cAAQ,IAAI,GAAG,QAAQ;AAAA,IACxB;AAAA,EACD;AAAA,EAEO,QAAQ,UAAiB;AAC/B,QAAI,CAAC,KAAK,aAAa;AACtB,cAAQ,KAAK,GAAG,QAAQ;AAAA,IACzB;AAAA,EACD;AAAA,EAEO,SAAS,UAAiB;AAChC,QAAI,CAAC,KAAK,aAAa;AACtB,cAAQ,MAAM,GAAG,QAAQ;AAAA,IAC1B;AAAA,EACD;AAAA,EAEO,SAAS,UAAiB;AAChC,QAAI,KAAK,OAAO,SAAS,CAAC,KAAK,aAAa;AAC3C,cAAQ,MAAM,GAAG,QAAQ;AAAA,IAC1B;AAAA,EACD;AACD;;;ACnCA,eAAsB,iBACrB,QACA,QACA,OACA,aACC;AACD,QAAM,MAAM,IAAI,IAAI,QAAQ,MAAM;AAGlC,QAAM,aAAa,MAAM,IAAI,cAAc;AAE3C,SAAO;AAAA,IACN;AAAA,sCAAyC,UAAU;AAAA,EACpD;AAGA,MAAI,MAAM,KAAK,CAAC,SAAS,KAAK,SAAS,kBAAkB,KAAK,cAAc,KAAK,GAAG;AACnF,UAAM,SAAS,OAAO,OAAO,kBAAkB,WAAW,OAAO,gBAAgB;AAEjF,WAAO;AAAA,MACN,GAAG,WAAW,GAAG,WAAW,KAAK,IAC9B,2BAA2B,MAAM,+BACjC;AAAA,IACJ;AAAA,EACD;AACD;;;AClBA,eAAe,UAAU;AACxB,QAAM,SAAS,MAAM,cAAc;AACnC,QAAM,SAAS,IAAI,OAAO,MAAM;AAChC,QAAM,cAAc,IAAI,YAAY,QAAQ,MAAM;AAElD,SAAO,IAAI,2BAA0B,oBAAI,KAAK,GAAE,eAAe,CAAC,EAAE;AAClE,SAAO,IAAI,OAAO,SAAS,oDAAoD,EAAE;AAEjF,QAAM,UAAU,MAAM,kBAAkB,QAAQ,QAAQ,WAAW;AACnE,QAAM,OAAO,MAAM,eAAe,QAAQ,QAAQ,QAAQ,OAAO;AAEjE,SAAO,IAAI,kBAAkB;AAC7B,aAAW,WAAW,QAAQ,OAAO;AACpC,WAAO,IAAI,OAAO,QAAQ,IAAI,EAAE;AAEhC,gBAAY,MAAM,QAAQ,MAAM,KAAK,OAAO;AAAA,EAC7C;AAEA,QAAM,kBAAkB,MAAM,gBAAgB,QAAQ,QAAQ,KAAK,OAAO;AAC1E,QAAM,eAAe,MAAM,cAAc,QAAQ,QAAQ,QAAQ,OAAO,KAAK,OAAO;AACpF,QAAM,YAAY,MAAM,WAAW,QAAQ,QAAQ,KAAK,OAAO;AAE/D,mBAAiB,QAAQ,QAAQ,QAAQ,OAAO,KAAK,WAAW;AAEhE,QAAM,SAAS;AAAA,IACd;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACD;AAEA,SAAO,MAAM,KAAK,UAAU,QAAQ,MAAM,CAAC,CAAC;AAE5C,SAAO;AACR;AAEA,QAAQ","sourcesContent":["/* 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","import { Git } from \"../utils/git\";\nimport type { ForkConfig } from \"../config/schema\";\nimport type { FileState } from \"../strategies/file-manager\";\nimport type { Logger } from \"../utils/logger\";\n\nexport async function completedMessage(\n\tconfig: ForkConfig,\n\tlogger: Logger,\n\tfiles: FileState[],\n\treleaseType: string | undefined,\n) {\n\tconst git = new Git(config, logger);\n\n\t// Print git push command\n\tconst branchName = await git.currentBranch();\n\n\tlogger.log(\n\t\t`\\nRun \\`git push --follow-tags origin ${branchName}\\` to push the changes and the tag.`,\n\t);\n\n\t// Print npm publish command\n\tif (files.some((file) => file.name === \"package.json\" && file.isPrivate === false)) {\n\t\tconst npmTag = typeof config.preReleaseTag === \"string\" ? config.preReleaseTag : \"prerelease\";\n\n\t\tlogger.log(\n\t\t\t`${releaseType}`.startsWith(\"pre\")\n\t\t\t\t? `Run \\`npm publish --tag ${npmTag}\\` to publish the package.`\n\t\t\t\t: \"Run `npm publish` to publish the package.\",\n\t\t);\n\t}\n}\n","#!/usr/bin/env node\n\nimport { getUserConfig } from \"./config/user-config\";\nimport { Logger } from \"./utils/logger\";\nimport { FileManager } from \"./strategies/file-manager\";\n\nimport { getCurrentVersion, getNextVersion } from \"./process/version\";\nimport { updateChangelog } from \"./process/changelog\";\nimport { commitChanges } from \"./process/commit\";\nimport { tagChanges } from \"./process/tag\";\nimport { completedMessage } from \"./process/message\";\n\nasync function runFork() {\n\tconst config = await getUserConfig();\n\tconst logger = new Logger(config);\n\tconst fileManager = new FileManager(config, logger);\n\n\tlogger.log(`Running fork-version - ${new Date().toLocaleString()}`);\n\tlogger.log(config.dryRun ? \"[DRY RUN] No changes will be written to disk.\\n\" : \"\");\n\n\tconst current = await getCurrentVersion(config, logger, fileManager);\n\tconst next = await getNextVersion(config, logger, current.version);\n\n\tlogger.log(\"Updating Files: \");\n\tfor (const outFile of current.files) {\n\t\tlogger.log(` - ${outFile.path}`);\n\n\t\tfileManager.write(outFile.path, next.version);\n\t}\n\n\tconst changelogResult = await updateChangelog(config, logger, next.version);\n\tconst commitResult = await commitChanges(config, logger, current.files, next.version);\n\tconst tagResult = await tagChanges(config, logger, next.version);\n\n\tcompletedMessage(config, logger, current.files, next.releaseType);\n\n\tconst result = {\n\t\tconfig,\n\t\tcurrent,\n\t\tnext,\n\t\tchangelogResult,\n\t\tcommitResult,\n\t\ttagResult,\n\t};\n\n\tlogger.debug(JSON.stringify(result, null, 2));\n\n\treturn result;\n}\n\nrunFork();\n"]}
package/dist/cli.js CHANGED
@@ -1,5 +1,5 @@
1
1
  #!/usr/bin/env node
2
- import { getUserConfig, FileManager, getCurrentVersion, getNextVersion, updateChangelog, commitChanges, tagChanges, Git } from './chunk-KFBD5WZ4.js';
2
+ import { getUserConfig, FileManager, getCurrentVersion, getNextVersion, updateChangelog, commitChanges, tagChanges, Git } from './chunk-BVRK4H3J.js';
3
3
 
4
4
  // src/utils/logger.ts
5
5
  var Logger = class {
@@ -55,13 +55,13 @@ async function runFork() {
55
55
  const config = await getUserConfig();
56
56
  const logger = new Logger(config);
57
57
  const fileManager = new FileManager(config, logger);
58
- logger.log(`Running fork-version: ${(/* @__PURE__ */ new Date()).toLocaleString()}`);
59
- logger.log(config.dryRun ? "[DRY RUN] No changes will be written to disk.\n" : "\n");
58
+ logger.log(`Running fork-version - ${(/* @__PURE__ */ new Date()).toLocaleString()}`);
59
+ logger.log(config.dryRun ? "[DRY RUN] No changes will be written to disk.\n" : "");
60
60
  const current = await getCurrentVersion(config, logger, fileManager);
61
61
  const next = await getNextVersion(config, logger, current.version);
62
62
  logger.log("Updating Files: ");
63
63
  for (const outFile of current.files) {
64
- logger.log(` ${outFile.path}`);
64
+ logger.log(` - ${outFile.path}`);
65
65
  fileManager.write(outFile.path, next.version);
66
66
  }
67
67
  const changelogResult = await updateChangelog(config, logger, next.version);
package/dist/cli.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/utils/logger.ts","../src/process/message.ts","../src/cli.ts"],"names":[],"mappings":";;;;;;;;;;;;;AAIO,IAAM,SAAN,MAAa;AAAA,EAGnB,YAAoB,QAAiE;AAAjE;AACnB,SAAK,MAAM,KAAK,IAAI,KAAK,IAAI;AAC7B,SAAK,OAAO,KAAK,KAAK,KAAK,IAAI;AAC/B,SAAK,QAAQ,KAAK,MAAM,KAAK,IAAI;AACjC,SAAK,QAAQ,KAAK,MAAM,KAAK,IAAI;AAGjC,SAAK,cAAc,KAAK,OAAO,UAAU,KAAK,OAAO;AAAA,EACtD;AAAA,EAVA,cAAc;AAAA,EAYP,OAAO,UAAiB;AAC9B,QAAI,CAAC,KAAK,aAAa;AACtB,cAAQ,IAAI,GAAG,QAAQ;AAAA,IACxB;AAAA,EACD;AAAA,EAEO,QAAQ,UAAiB;AAC/B,QAAI,CAAC,KAAK,aAAa;AACtB,cAAQ,KAAK,GAAG,QAAQ;AAAA,IACzB;AAAA,EACD;AAAA,EAEO,SAAS,UAAiB;AAChC,QAAI,CAAC,KAAK,aAAa;AACtB,cAAQ,MAAM,GAAG,QAAQ;AAAA,IAC1B;AAAA,EACD;AAAA,EAEO,SAAS,UAAiB;AAChC,QAAI,KAAK,OAAO,SAAS,CAAC,KAAK,aAAa;AAC3C,cAAQ,MAAM,GAAG,QAAQ;AAAA,IAC1B;AAAA,EACD;AACD;;;ACnCA,eAAsB,iBACrB,QACA,QACA,OACA,aACC;AACD,QAAM,MAAM,IAAI,IAAI,QAAQ,MAAM;AAGlC,QAAM,aAAa,MAAM,IAAI,cAAc;AAE3C,SAAO;AAAA,IACN;AAAA,sCAAyC,UAAU;AAAA,EACpD;AAGA,MAAI,MAAM,KAAK,CAAC,SAAS,KAAK,SAAS,kBAAkB,KAAK,cAAc,KAAK,GAAG;AACnF,UAAM,SAAS,OAAO,OAAO,kBAAkB,WAAW,OAAO,gBAAgB;AAEjF,WAAO;AAAA,MACN,GAAG,WAAW,GAAG,WAAW,KAAK,IAC9B,2BAA2B,MAAM,+BACjC;AAAA,IACJ;AAAA,EACD;AACD;;;AClBA,eAAe,UAAU;AACxB,QAAM,SAAS,MAAM,cAAc;AACnC,QAAM,SAAS,IAAI,OAAO,MAAM;AAChC,QAAM,cAAc,IAAI,YAAY,QAAQ,MAAM;AAElD,SAAO,IAAI,0BAAyB,oBAAI,KAAK,GAAE,eAAe,CAAC,EAAE;AACjE,SAAO,IAAI,OAAO,SAAS,oDAAoD,IAAI;AAEnF,QAAM,UAAU,MAAM,kBAAkB,QAAQ,QAAQ,WAAW;AACnE,QAAM,OAAO,MAAM,eAAe,QAAQ,QAAQ,QAAQ,OAAO;AAEjE,SAAO,IAAI,kBAAkB;AAC7B,aAAW,WAAW,QAAQ,OAAO;AACpC,WAAO,IAAI,IAAK,QAAQ,IAAI,EAAE;AAE9B,gBAAY,MAAM,QAAQ,MAAM,KAAK,OAAO;AAAA,EAC7C;AAEA,QAAM,kBAAkB,MAAM,gBAAgB,QAAQ,QAAQ,KAAK,OAAO;AAC1E,QAAM,eAAe,MAAM,cAAc,QAAQ,QAAQ,QAAQ,OAAO,KAAK,OAAO;AACpF,QAAM,YAAY,MAAM,WAAW,QAAQ,QAAQ,KAAK,OAAO;AAE/D,mBAAiB,QAAQ,QAAQ,QAAQ,OAAO,KAAK,WAAW;AAEhE,QAAM,SAAS;AAAA,IACd;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACD;AAEA,SAAO,MAAM,KAAK,UAAU,QAAQ,MAAM,CAAC,CAAC;AAE5C,SAAO;AACR;AAEA,QAAQ","sourcesContent":["/* 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","import { Git } from \"../utils/git\";\nimport type { ForkConfig } from \"../config/schema\";\nimport type { FileState } from \"../strategies/file-manager\";\nimport type { Logger } from \"../utils/logger\";\n\nexport async function completedMessage(\n\tconfig: ForkConfig,\n\tlogger: Logger,\n\tfiles: FileState[],\n\treleaseType: string | undefined,\n) {\n\tconst git = new Git(config, logger);\n\n\t// Print git push command\n\tconst branchName = await git.currentBranch();\n\n\tlogger.log(\n\t\t`\\nRun \\`git push --follow-tags origin ${branchName}\\` to push the changes and the tag.`,\n\t);\n\n\t// Print npm publish command\n\tif (files.some((file) => file.name === \"package.json\" && file.isPrivate === false)) {\n\t\tconst npmTag = typeof config.preReleaseTag === \"string\" ? config.preReleaseTag : \"prerelease\";\n\n\t\tlogger.log(\n\t\t\t`${releaseType}`.startsWith(\"pre\")\n\t\t\t\t? `Run \\`npm publish --tag ${npmTag}\\` to publish the package.`\n\t\t\t\t: \"Run `npm publish` to publish the package.\",\n\t\t);\n\t}\n}\n","#!/usr/bin/env node\n\nimport { getUserConfig } from \"./config/user-config\";\nimport { Logger } from \"./utils/logger\";\nimport { FileManager } from \"./strategies/file-manager\";\n\nimport { getCurrentVersion, getNextVersion } from \"./process/version\";\nimport { updateChangelog } from \"./process/changelog\";\nimport { commitChanges } from \"./process/commit\";\nimport { tagChanges } from \"./process/tag\";\nimport { completedMessage } from \"./process/message\";\n\nasync function runFork() {\n\tconst config = await getUserConfig();\n\tconst logger = new Logger(config);\n\tconst fileManager = new FileManager(config, logger);\n\n\tlogger.log(`Running fork-version: ${new Date().toLocaleString()}`);\n\tlogger.log(config.dryRun ? \"[DRY RUN] No changes will be written to disk.\\n\" : \"\\n\");\n\n\tconst current = await getCurrentVersion(config, logger, fileManager);\n\tconst next = await getNextVersion(config, logger, current.version);\n\n\tlogger.log(\"Updating Files: \");\n\tfor (const outFile of current.files) {\n\t\tlogger.log(`\\t${outFile.path}`);\n\n\t\tfileManager.write(outFile.path, next.version);\n\t}\n\n\tconst changelogResult = await updateChangelog(config, logger, next.version);\n\tconst commitResult = await commitChanges(config, logger, current.files, next.version);\n\tconst tagResult = await tagChanges(config, logger, next.version);\n\n\tcompletedMessage(config, logger, current.files, next.releaseType);\n\n\tconst result = {\n\t\tconfig,\n\t\tcurrent,\n\t\tnext,\n\t\tchangelogResult,\n\t\tcommitResult,\n\t\ttagResult,\n\t};\n\n\tlogger.debug(JSON.stringify(result, null, 2));\n\n\treturn result;\n}\n\nrunFork();\n"]}
1
+ {"version":3,"sources":["../src/utils/logger.ts","../src/process/message.ts","../src/cli.ts"],"names":[],"mappings":";;;;;;;;;;;;;AAIO,IAAM,SAAN,MAAa;AAAA,EAGnB,YAAoB,QAAiE;AAAjE;AACnB,SAAK,MAAM,KAAK,IAAI,KAAK,IAAI;AAC7B,SAAK,OAAO,KAAK,KAAK,KAAK,IAAI;AAC/B,SAAK,QAAQ,KAAK,MAAM,KAAK,IAAI;AACjC,SAAK,QAAQ,KAAK,MAAM,KAAK,IAAI;AAGjC,SAAK,cAAc,KAAK,OAAO,UAAU,KAAK,OAAO;AAAA,EACtD;AAAA,EAVA,cAAc;AAAA,EAYP,OAAO,UAAiB;AAC9B,QAAI,CAAC,KAAK,aAAa;AACtB,cAAQ,IAAI,GAAG,QAAQ;AAAA,IACxB;AAAA,EACD;AAAA,EAEO,QAAQ,UAAiB;AAC/B,QAAI,CAAC,KAAK,aAAa;AACtB,cAAQ,KAAK,GAAG,QAAQ;AAAA,IACzB;AAAA,EACD;AAAA,EAEO,SAAS,UAAiB;AAChC,QAAI,CAAC,KAAK,aAAa;AACtB,cAAQ,MAAM,GAAG,QAAQ;AAAA,IAC1B;AAAA,EACD;AAAA,EAEO,SAAS,UAAiB;AAChC,QAAI,KAAK,OAAO,SAAS,CAAC,KAAK,aAAa;AAC3C,cAAQ,MAAM,GAAG,QAAQ;AAAA,IAC1B;AAAA,EACD;AACD;;;ACnCA,eAAsB,iBACrB,QACA,QACA,OACA,aACC;AACD,QAAM,MAAM,IAAI,IAAI,QAAQ,MAAM;AAGlC,QAAM,aAAa,MAAM,IAAI,cAAc;AAE3C,SAAO;AAAA,IACN;AAAA,sCAAyC,UAAU;AAAA,EACpD;AAGA,MAAI,MAAM,KAAK,CAAC,SAAS,KAAK,SAAS,kBAAkB,KAAK,cAAc,KAAK,GAAG;AACnF,UAAM,SAAS,OAAO,OAAO,kBAAkB,WAAW,OAAO,gBAAgB;AAEjF,WAAO;AAAA,MACN,GAAG,WAAW,GAAG,WAAW,KAAK,IAC9B,2BAA2B,MAAM,+BACjC;AAAA,IACJ;AAAA,EACD;AACD;;;AClBA,eAAe,UAAU;AACxB,QAAM,SAAS,MAAM,cAAc;AACnC,QAAM,SAAS,IAAI,OAAO,MAAM;AAChC,QAAM,cAAc,IAAI,YAAY,QAAQ,MAAM;AAElD,SAAO,IAAI,2BAA0B,oBAAI,KAAK,GAAE,eAAe,CAAC,EAAE;AAClE,SAAO,IAAI,OAAO,SAAS,oDAAoD,EAAE;AAEjF,QAAM,UAAU,MAAM,kBAAkB,QAAQ,QAAQ,WAAW;AACnE,QAAM,OAAO,MAAM,eAAe,QAAQ,QAAQ,QAAQ,OAAO;AAEjE,SAAO,IAAI,kBAAkB;AAC7B,aAAW,WAAW,QAAQ,OAAO;AACpC,WAAO,IAAI,OAAO,QAAQ,IAAI,EAAE;AAEhC,gBAAY,MAAM,QAAQ,MAAM,KAAK,OAAO;AAAA,EAC7C;AAEA,QAAM,kBAAkB,MAAM,gBAAgB,QAAQ,QAAQ,KAAK,OAAO;AAC1E,QAAM,eAAe,MAAM,cAAc,QAAQ,QAAQ,QAAQ,OAAO,KAAK,OAAO;AACpF,QAAM,YAAY,MAAM,WAAW,QAAQ,QAAQ,KAAK,OAAO;AAE/D,mBAAiB,QAAQ,QAAQ,QAAQ,OAAO,KAAK,WAAW;AAEhE,QAAM,SAAS;AAAA,IACd;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACD;AAEA,SAAO,MAAM,KAAK,UAAU,QAAQ,MAAM,CAAC,CAAC;AAE5C,SAAO;AACR;AAEA,QAAQ","sourcesContent":["/* 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","import { Git } from \"../utils/git\";\nimport type { ForkConfig } from \"../config/schema\";\nimport type { FileState } from \"../strategies/file-manager\";\nimport type { Logger } from \"../utils/logger\";\n\nexport async function completedMessage(\n\tconfig: ForkConfig,\n\tlogger: Logger,\n\tfiles: FileState[],\n\treleaseType: string | undefined,\n) {\n\tconst git = new Git(config, logger);\n\n\t// Print git push command\n\tconst branchName = await git.currentBranch();\n\n\tlogger.log(\n\t\t`\\nRun \\`git push --follow-tags origin ${branchName}\\` to push the changes and the tag.`,\n\t);\n\n\t// Print npm publish command\n\tif (files.some((file) => file.name === \"package.json\" && file.isPrivate === false)) {\n\t\tconst npmTag = typeof config.preReleaseTag === \"string\" ? config.preReleaseTag : \"prerelease\";\n\n\t\tlogger.log(\n\t\t\t`${releaseType}`.startsWith(\"pre\")\n\t\t\t\t? `Run \\`npm publish --tag ${npmTag}\\` to publish the package.`\n\t\t\t\t: \"Run `npm publish` to publish the package.\",\n\t\t);\n\t}\n}\n","#!/usr/bin/env node\n\nimport { getUserConfig } from \"./config/user-config\";\nimport { Logger } from \"./utils/logger\";\nimport { FileManager } from \"./strategies/file-manager\";\n\nimport { getCurrentVersion, getNextVersion } from \"./process/version\";\nimport { updateChangelog } from \"./process/changelog\";\nimport { commitChanges } from \"./process/commit\";\nimport { tagChanges } from \"./process/tag\";\nimport { completedMessage } from \"./process/message\";\n\nasync function runFork() {\n\tconst config = await getUserConfig();\n\tconst logger = new Logger(config);\n\tconst fileManager = new FileManager(config, logger);\n\n\tlogger.log(`Running fork-version - ${new Date().toLocaleString()}`);\n\tlogger.log(config.dryRun ? \"[DRY RUN] No changes will be written to disk.\\n\" : \"\");\n\n\tconst current = await getCurrentVersion(config, logger, fileManager);\n\tconst next = await getNextVersion(config, logger, current.version);\n\n\tlogger.log(\"Updating Files: \");\n\tfor (const outFile of current.files) {\n\t\tlogger.log(` - ${outFile.path}`);\n\n\t\tfileManager.write(outFile.path, next.version);\n\t}\n\n\tconst changelogResult = await updateChangelog(config, logger, next.version);\n\tconst commitResult = await commitChanges(config, logger, current.files, next.version);\n\tconst tagResult = await tagChanges(config, logger, next.version);\n\n\tcompletedMessage(config, logger, current.files, next.releaseType);\n\n\tconst result = {\n\t\tconfig,\n\t\tcurrent,\n\t\tnext,\n\t\tchangelogResult,\n\t\tcommitResult,\n\t\ttagResult,\n\t};\n\n\tlogger.debug(JSON.stringify(result, null, 2));\n\n\treturn result;\n}\n\nrunFork();\n"]}
package/dist/index.cjs CHANGED
@@ -1,44 +1,44 @@
1
1
  'use strict';
2
2
 
3
- var chunkJD645RQZ_cjs = require('./chunk-JD645RQZ.cjs');
3
+ var chunk4PMSVMKJ_cjs = require('./chunk-4PMSVMKJ.cjs');
4
4
 
5
5
 
6
6
 
7
7
  Object.defineProperty(exports, "FileManager", {
8
8
  enumerable: true,
9
- get: function () { return chunkJD645RQZ_cjs.FileManager; }
9
+ get: function () { return chunk4PMSVMKJ_cjs.FileManager; }
10
10
  });
11
11
  Object.defineProperty(exports, "ForkConfigSchema", {
12
12
  enumerable: true,
13
- get: function () { return chunkJD645RQZ_cjs.ForkConfigSchema; }
13
+ get: function () { return chunk4PMSVMKJ_cjs.ForkConfigSchema; }
14
14
  });
15
15
  Object.defineProperty(exports, "commitChanges", {
16
16
  enumerable: true,
17
- get: function () { return chunkJD645RQZ_cjs.commitChanges; }
17
+ get: function () { return chunk4PMSVMKJ_cjs.commitChanges; }
18
18
  });
19
19
  Object.defineProperty(exports, "defineConfig", {
20
20
  enumerable: true,
21
- get: function () { return chunkJD645RQZ_cjs.defineConfig; }
21
+ get: function () { return chunk4PMSVMKJ_cjs.defineConfig; }
22
22
  });
23
23
  Object.defineProperty(exports, "getCurrentVersion", {
24
24
  enumerable: true,
25
- get: function () { return chunkJD645RQZ_cjs.getCurrentVersion; }
25
+ get: function () { return chunk4PMSVMKJ_cjs.getCurrentVersion; }
26
26
  });
27
27
  Object.defineProperty(exports, "getNextVersion", {
28
28
  enumerable: true,
29
- get: function () { return chunkJD645RQZ_cjs.getNextVersion; }
29
+ get: function () { return chunk4PMSVMKJ_cjs.getNextVersion; }
30
30
  });
31
31
  Object.defineProperty(exports, "getUserConfig", {
32
32
  enumerable: true,
33
- get: function () { return chunkJD645RQZ_cjs.getUserConfig; }
33
+ get: function () { return chunk4PMSVMKJ_cjs.getUserConfig; }
34
34
  });
35
35
  Object.defineProperty(exports, "tagChanges", {
36
36
  enumerable: true,
37
- get: function () { return chunkJD645RQZ_cjs.tagChanges; }
37
+ get: function () { return chunk4PMSVMKJ_cjs.tagChanges; }
38
38
  });
39
39
  Object.defineProperty(exports, "updateChangelog", {
40
40
  enumerable: true,
41
- get: function () { return chunkJD645RQZ_cjs.updateChangelog; }
41
+ get: function () { return chunk4PMSVMKJ_cjs.updateChangelog; }
42
42
  });
43
43
  //# sourceMappingURL=out.js.map
44
44
  //# sourceMappingURL=index.cjs.map
package/dist/index.js CHANGED
@@ -1,3 +1,3 @@
1
- export { FileManager, ForkConfigSchema, commitChanges, defineConfig, getCurrentVersion, getNextVersion, getUserConfig, tagChanges, updateChangelog } from './chunk-KFBD5WZ4.js';
1
+ export { FileManager, ForkConfigSchema, commitChanges, defineConfig, getCurrentVersion, getNextVersion, getUserConfig, tagChanges, updateChangelog } from './chunk-BVRK4H3J.js';
2
2
  //# sourceMappingURL=out.js.map
3
3
  //# sourceMappingURL=index.js.map
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "fork-version",
3
- "version": "1.4.53",
3
+ "version": "1.4.55",
4
4
  "license": "ISC",
5
5
  "description": "Replacement for standard version written with modern syntax",
6
6
  "homepage": "https://github.com/eglavin/fork-version",
@@ -87,6 +87,7 @@
87
87
  "tsup": "8.0.2",
88
88
  "typescript": "5.4.3",
89
89
  "typescript-eslint": "7.4.0",
90
- "vitest": "1.4.0"
90
+ "vitest": "1.4.0",
91
+ "zod-to-json-schema": "3.22.5"
91
92
  }
92
93
  }
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/config/schema.ts","../src/config/user-config.ts","../src/config/defaults.ts","../src/config/cli-arguments.ts","../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/file-manager.ts"],"names":["semver","resolve","readFileSync","writeFileSync"],"mappings":"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","sourcesContent":["import { z } from \"zod\";\n\nexport const ChangelogPresetConfigSchema = z.object({\n\t/**\n\t * An array of `type` objects representing the explicitly supported commit message types,\n\t * and whether they should show up in generated `CHANGELOG`s.\n\t */\n\ttypes: z.array(\n\t\tz.object({\n\t\t\ttype: z.string(),\n\t\t\tsection: z.string().optional(),\n\t\t\thidden: z.boolean().optional(),\n\t\t}),\n\t),\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(),\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(),\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(),\n\t/**\n\t * A URL representing the a user's profile URL on GitHub, Gitlab, etc. This URL is used\n\t * for substituting @bcoe with https://github.com/bcoe in commit messages.\n\t * @default \"{{host}}/{{user}}\"\n\t */\n\tuserUrlFormat: z.string(),\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.string(),\n\t/**\n\t * An array of prefixes used to detect references to issues\n\t * @default [\"#\"]\n\t */\n\tissuePrefixes: z.array(z.string()),\n});\n\nexport type ChangelogPresetConfig = z.infer<typeof ChangelogPresetConfigSchema>;\n\nexport const ForkConfigSchema = z.object({\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(),\n\t/**\n\t * Name of the changelog file.\n\t * @default \"CHANGELOG.md\"\n\t */\n\tchangelog: z.string(),\n\t/**\n\t * The header to be used in 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(),\n\t/**\n\t * 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()),\n\t/**\n\t * Specify a prefix for the git tag fork-version will create.\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 * | 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(),\n\t/**\n\t * Make a pre-release with optional label, if value is a string it will be used as the\n\t * pre-release tag.\n\t *\n\t * | Value | 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\tpreReleaseTag: z.string().or(z.boolean()).optional(),\n\n\t/**\n\t * Commit all staged changes, not just files updated by fork-version.\n\t * @default false\n\t */\n\tcommitAll: z.boolean(),\n\t/**\n\t * If set we'll log debug information.\n\t * @default false\n\t */\n\tdebug: z.boolean(),\n\t/**\n\t * If true, no output will be written to disk or committed.\n\t * @default false\n\t */\n\tdryRun: z.boolean(),\n\t/**\n\t * If true and we cant find a version in the list of `files`, we'll fallback\n\t * and attempt to use the latest git tag to get the current version.\n\t * @default true\n\t */\n\tgitTagFallback: z.boolean(),\n\t/**\n\t * If set, we'll gather information about the current version and exit.\n\t * @default false\n\t */\n\tinspectVersion: z.boolean(),\n\t/**\n\t * Should we sign the git commit using GPG?\n\t * @see {@link https://git-scm.com/docs/git-commit#Documentation/git-commit.txt--Sltkeyidgt GPG Sign Commits}\n\t * @default false\n\t */\n\tsign: z.boolean(),\n\t/**\n\t * If true, no output will be written to stdout.\n\t * @default false\n\t */\n\tsilent: z.boolean(),\n\t/**\n\t * If true, allow git to run git commit hooks.\n\t * @default false\n\t */\n\tverify: z.boolean(),\n\n\t/**\n\t * If set, we'll use this version number instead of trying to find a version from the list of `files`.\n\t * @example \"1.0.0\"\n\t * @default undefined\n\t */\n\tcurrentVersion: z.string().optional(),\n\t/**\n\t * If set, we'll attempt to update the version number to this version, instead of incrementing\n\t * using \"conventional-commit\".\n\t * @example \"2.0.0\"\n\t * @default undefined\n\t */\n\tnextVersion: z.string().optional(),\n\n\t/**\n\t * Override the default conventional-changelog preset configuration.\n\t */\n\tchangelogPresetConfig: ChangelogPresetConfigSchema.partial(),\n});\n\nexport type ForkConfig = z.infer<typeof ForkConfigSchema>;\n\nexport function defineConfig(config: Partial<ForkConfig>): Partial<ForkConfig> {\n\treturn config;\n}\n","import { parse, resolve } from \"node:path\";\nimport JoyCon from \"joycon\";\nimport { bundleRequire } from \"bundle-require\";\n\nimport { ForkConfigSchema, type ForkConfig } from \"./schema\";\nimport { DEFAULT_CONFIG } from \"./defaults\";\nimport { getCliArguments } from \"./cli-arguments\";\nimport { getChangelogPresetConfig } from \"./changelog-preset-config\";\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\tconst configFilePath = await joycon.resolve({\n\t\tfiles: [\"fork.config.ts\", \"fork.config.js\", \"fork.config.cjs\", \"fork.config.mjs\"],\n\t\tcwd,\n\t\tstopDir: parse(cwd).root,\n\t});\n\n\tif (!configFilePath) {\n\t\treturn {\n\t\t\t...DEFAULT_CONFIG,\n\t\t\t...cliArguments.flags,\n\t\t\tpath: cwd,\n\t\t\tfiles: getFiles([], cliArguments.flags?.files),\n\t\t\tchangelogPresetConfig: getChangelogPresetConfig(),\n\t\t} as ForkConfig;\n\t}\n\n\tconst foundConfig = await bundleRequire({ filepath: configFilePath });\n\tconst parsedConfig = ForkConfigSchema.partial().safeParse(\n\t\tfoundConfig.mod.default || foundConfig.mod,\n\t);\n\n\tif (!parsedConfig.success) {\n\t\tthrow parsedConfig.error;\n\t}\n\n\tconst usersConfig = {\n\t\t...DEFAULT_CONFIG,\n\t\t...parsedConfig.data,\n\t\t...cliArguments.flags,\n\t} as ForkConfig;\n\n\treturn {\n\t\t...usersConfig,\n\t\tpath: cwd,\n\t\tfiles: getFiles(parsedConfig.data?.files, cliArguments.flags?.files),\n\t\tchangelogPresetConfig: getChangelogPresetConfig(usersConfig?.changelogPresetConfig),\n\t};\n}\n\nfunction getFiles(configFiles: string[] | undefined, cliFiles: string[] | undefined): 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// If the user has defined files use them, otherwise use the default list of files.\n\tif (listOfFiles.size) {\n\t\treturn Array.from(listOfFiles);\n\t}\n\n\treturn DEFAULT_CONFIG.files;\n}\n","import type { ForkConfig } from \"./schema\";\n\nexport const DEFAULT_CONFIG: ForkConfig = {\n\tpath: process.cwd(),\n\tchangelog: \"CHANGELOG.md\",\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\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\tcommitAll: false,\n\tdebug: false,\n\tdryRun: false,\n\tgitTagFallback: true,\n\tinspectVersion: false,\n\tsign: false,\n\tsilent: false,\n\tverify: false,\n\n\tchangelogPresetConfig: {},\n};\n","import meow from \"meow\";\n\nexport function getCliArguments() {\n\treturn meow(\n\t\t`\nUsage:\n $ fork-version [options]\n\nOptions:\n --path [Default: process.cwd()]\n The path fork-version will run from.\n --changelog [Default: \"CHANGELOG.md\"]\n Name of the changelog file.\n --header, -H\n The header to be used in the changelog.\n --files, --file, -F [Default: [\"bower.json\", \"manifest.json\", \"npm-shrinkwrap.json\", \"package-lock.json\", \"package.json\"]]\n Files to be updated.\n --tag-prefix [Default: \"v\"]\n Specify a prefix for the git tag \"fork-version\" will create.\n --pre-release-tag [Default: undefined]\n Make a pre-release with optional label, If value is a string it\n will be used as the pre-release tag.\n\n --commit-all\n Commit all staged changes, not just files updated by fork-version.\n --debug\n If true, we'll output debug information.\n --dry-run\n If true, no output will be written to disk or committed.\n --git-tag-fallback [Default: true]\n If true and we cant find a version in the given files, we'll fallback\n and attempt to use the latest git tag for the current version.\n --inspect-version\n If set, we'll gather information about the current version and exit.\n --sign\n Should we sign the git commit using GPG?\n --silent\n If true, no output will be written to stdout.\n --verify\n If true, allow git to run git commit hooks.\n\n --current-version\n If set, we'll use this version number instead of trying to find a\n version in a \"file\".\n --next-version\n If set, we'll attempt to update the version number to this version,\n instead of incrementing using \"conventional-commit\".\n`,\n\t\t{\n\t\t\timportMeta: import.meta,\n\t\t\tflags: {\n\t\t\t\tpath: { type: \"string\", default: process.cwd() },\n\t\t\t\tchangelog: { type: \"string\" },\n\t\t\t\theader: { type: \"string\", shortFlag: \"H\" },\n\t\t\t\tfiles: { type: \"string\", isMultiple: true, aliases: [\"file\"], shortFlag: \"F\" },\n\t\t\t\ttagPrefix: { type: \"string\" },\n\t\t\t\tpreReleaseTag: { type: \"string\" },\n\n\t\t\t\tcommitAll: { type: \"boolean\" },\n\t\t\t\tdebug: { type: \"boolean\" },\n\t\t\t\tdryRun: { type: \"boolean\" },\n\t\t\t\tgitTagFallback: { type: \"boolean\" },\n\t\t\t\tinspectVersion: { type: \"boolean\" },\n\t\t\t\tsign: { type: \"boolean\" },\n\t\t\t\tsilent: { type: \"boolean\" },\n\t\t\t\tverify: { type: \"boolean\" },\n\n\t\t\t\tcurrentVersion: { type: \"string\" },\n\t\t\t\tnextVersion: { type: \"string\" },\n\t\t\t},\n\t\t},\n\t);\n}\n","import conventionalChangelogConfigSpec from \"conventional-changelog-config-spec\";\n\nimport { ChangelogPresetConfigSchema, type ForkConfig } from \"./schema\";\n\nexport function getChangelogPresetConfig(\n\tusersChangelogPresetConfig?: ForkConfig[\"changelogPresetConfig\"],\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 (usersChangelogPresetConfig && typeof usersChangelogPresetConfig === \"object\") {\n\t\tObject.entries(usersChangelogPresetConfig).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\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 { IFileManager, 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: IFileManager,\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\tif (versions.size === 0) {\n\t\tif (config.gitTagFallback) {\n\t\t\tconst version = await getLatestGitTagVersion(config.tagPrefix);\n\t\t\tif (version) {\n\t\t\t\treturn {\n\t\t\t\t\tfiles: [],\n\t\t\t\t\tversion: version,\n\t\t\t\t};\n\t\t\t}\n\t\t}\n\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 { version: config.nextVersion };\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.preReleaseTag,\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.preReleaseTag === \"string\" ? config.preReleaseTag : 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 \"1.0.0\";\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(`Executing: 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(`Unable to determine json package file: ${fileName}`);\n\t\t}\n\t}\n\n\tpublic write(filePath: string, newVersion: string) {\n\t\tconst fileContents = readFileSync(filePath, \"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\tfilePath,\n\t\t\tstringifyPackage(parsedJson, detectIndent(fileContents).amount, detectNewline(fileContents)),\n\t\t\t\"utf8\",\n\t\t);\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(`Unable to determine plain text file: ${fileName}`);\n\t}\n\n\tpublic write(filePath: string, newVersion: string) {\n\t\twriteFileSync(filePath, newVersion, \"utf8\");\n\t}\n}\n","import { JSONPackage } from \"./json-package\";\nimport { PlainText } from \"./plain-text\";\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(filePath: string, newVersion: string): void;\n}\n\nexport class FileManager implements IFileManager {\n\tprivate JSONPackage: JSONPackage;\n\tprivate PlainText: PlainText;\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}\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\tif (fileName.toLowerCase().endsWith(\".json\")) {\n\t\t\treturn this.JSONPackage.read(fileName);\n\t\t} else if (fileName.toLowerCase().endsWith(\"version.txt\")) {\n\t\t\treturn this.PlainText.read(fileName);\n\t\t}\n\n\t\tthis.logger.error(`Unsupported file type: ${fileName}`);\n\t}\n\n\t/**\n\t * Write the new version to the given file path.\n\t *\n\t * @example\n\t * ```ts\n\t * fileManager.write(\"/path/to/package.json\", \"1.2.3\");\n\t * ```\n\t */\n\tpublic write(filePath: string, newVersion: string): void {\n\t\tif (this.config.dryRun) {\n\t\t\treturn;\n\t\t}\n\n\t\tif (filePath.toLowerCase().endsWith(\".json\")) {\n\t\t\treturn this.JSONPackage.write(filePath, newVersion);\n\t\t} else if (filePath.toLowerCase().endsWith(\"version.txt\")) {\n\t\t\treturn this.PlainText.write(filePath, newVersion);\n\t\t}\n\n\t\tthis.logger.error(`Unsupported file type: ${filePath}`);\n\t}\n}\n"]}
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/config/schema.ts","../src/config/user-config.ts","../src/config/defaults.ts","../src/config/cli-arguments.ts","../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/file-manager.ts"],"names":["semver","resolve","readFileSync","writeFileSync"],"mappings":"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","sourcesContent":["import { z } from \"zod\";\n\nexport const ChangelogPresetConfigSchema = z.object({\n\t/**\n\t * An array of `type` objects representing the explicitly supported commit message types,\n\t * and whether they should show up in generated `CHANGELOG`s.\n\t */\n\ttypes: z.array(\n\t\tz.object({\n\t\t\ttype: z.string(),\n\t\t\tsection: z.string().optional(),\n\t\t\thidden: z.boolean().optional(),\n\t\t}),\n\t),\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(),\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(),\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(),\n\t/**\n\t * A URL representing the a user's profile URL on GitHub, Gitlab, etc. This URL is used\n\t * for substituting @bcoe with https://github.com/bcoe in commit messages.\n\t * @default \"{{host}}/{{user}}\"\n\t */\n\tuserUrlFormat: z.string(),\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.string(),\n\t/**\n\t * An array of prefixes used to detect references to issues\n\t * @default [\"#\"]\n\t */\n\tissuePrefixes: z.array(z.string()),\n});\n\nexport type ChangelogPresetConfig = z.infer<typeof ChangelogPresetConfigSchema>;\n\nexport const ForkConfigSchema = z.object({\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(),\n\t/**\n\t * Name of the changelog file.\n\t * @default \"CHANGELOG.md\"\n\t */\n\tchangelog: z.string(),\n\t/**\n\t * The header to be used in 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(),\n\t/**\n\t * 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()),\n\t/**\n\t * Specify a prefix for the git tag fork-version will create.\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 * | 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(),\n\t/**\n\t * Make a pre-release with optional label, if value is a string it will be used as the\n\t * pre-release tag.\n\t *\n\t * | Value | 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\tpreReleaseTag: z.string().or(z.boolean()).optional(),\n\n\t/**\n\t * Commit all staged changes, not just files updated by fork-version.\n\t * @default false\n\t */\n\tcommitAll: z.boolean(),\n\t/**\n\t * If set we'll log debug information.\n\t * @default false\n\t */\n\tdebug: z.boolean(),\n\t/**\n\t * If true, no output will be written to disk or committed.\n\t * @default false\n\t */\n\tdryRun: z.boolean(),\n\t/**\n\t * If true and we cant find a version in the list of `files`, we'll fallback\n\t * and attempt to use the latest git tag to get the current version.\n\t * @default true\n\t */\n\tgitTagFallback: z.boolean(),\n\t/**\n\t * If set, we'll gather information about the current version and exit.\n\t * @default false\n\t */\n\tinspectVersion: z.boolean(),\n\t/**\n\t * Should we sign the git commit using GPG?\n\t * @see {@link https://git-scm.com/docs/git-commit#Documentation/git-commit.txt--Sltkeyidgt GPG Sign Commits}\n\t * @default false\n\t */\n\tsign: z.boolean(),\n\t/**\n\t * If true, no output will be written to stdout.\n\t * @default false\n\t */\n\tsilent: z.boolean(),\n\t/**\n\t * If true, allow git to run git commit hooks.\n\t * @default false\n\t */\n\tverify: z.boolean(),\n\n\t/**\n\t * If set, we'll use this version number instead of trying to find a version from the list of `files`.\n\t * @example \"1.0.0\"\n\t * @default undefined\n\t */\n\tcurrentVersion: z.string().optional(),\n\t/**\n\t * If set, we'll attempt to update the version number to this version, instead of incrementing\n\t * using \"conventional-commit\".\n\t * @example \"2.0.0\"\n\t * @default undefined\n\t */\n\tnextVersion: z.string().optional(),\n\n\t/**\n\t * Override the default conventional-changelog preset configuration.\n\t */\n\tchangelogPresetConfig: ChangelogPresetConfigSchema.partial(),\n});\n\nexport type ForkConfig = z.infer<typeof ForkConfigSchema>;\n\nexport function defineConfig(config: Partial<ForkConfig>): Partial<ForkConfig> {\n\treturn config;\n}\n","import { parse, resolve } from \"node:path\";\nimport JoyCon from \"joycon\";\nimport { bundleRequire } from \"bundle-require\";\n\nimport { ForkConfigSchema, type ForkConfig } from \"./schema\";\nimport { DEFAULT_CONFIG } from \"./defaults\";\nimport { getCliArguments } from \"./cli-arguments\";\nimport { getChangelogPresetConfig } from \"./changelog-preset-config\";\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\tconst configFilePath = await joycon.resolve({\n\t\tfiles: [\"fork.config.ts\", \"fork.config.js\", \"fork.config.cjs\", \"fork.config.mjs\"],\n\t\tcwd,\n\t\tstopDir: parse(cwd).root,\n\t});\n\n\tif (!configFilePath) {\n\t\treturn {\n\t\t\t...DEFAULT_CONFIG,\n\t\t\t...cliArguments.flags,\n\t\t\tpath: cwd,\n\t\t\tfiles: getFiles([], cliArguments.flags?.files),\n\t\t\tchangelogPresetConfig: getChangelogPresetConfig(),\n\t\t} as ForkConfig;\n\t}\n\n\tconst foundConfig = await bundleRequire({ filepath: configFilePath });\n\tconst parsedConfig = ForkConfigSchema.partial().safeParse(\n\t\tfoundConfig.mod.default || foundConfig.mod,\n\t);\n\n\tif (!parsedConfig.success) {\n\t\tthrow parsedConfig.error;\n\t}\n\n\tconst usersConfig = {\n\t\t...DEFAULT_CONFIG,\n\t\t...parsedConfig.data,\n\t\t...cliArguments.flags,\n\t} as ForkConfig;\n\n\treturn {\n\t\t...usersConfig,\n\t\tpath: cwd,\n\t\tfiles: getFiles(parsedConfig.data?.files, cliArguments.flags?.files),\n\t\tchangelogPresetConfig: getChangelogPresetConfig(usersConfig?.changelogPresetConfig),\n\t};\n}\n\nfunction getFiles(configFiles: string[] | undefined, cliFiles: string[] | undefined): 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// If the user has defined files use them, otherwise use the default list of files.\n\tif (listOfFiles.size) {\n\t\treturn Array.from(listOfFiles);\n\t}\n\n\treturn DEFAULT_CONFIG.files;\n}\n","import type { ForkConfig } from \"./schema\";\n\nexport const DEFAULT_CONFIG: ForkConfig = {\n\tpath: process.cwd(),\n\tchangelog: \"CHANGELOG.md\",\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\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\tcommitAll: false,\n\tdebug: false,\n\tdryRun: false,\n\tgitTagFallback: true,\n\tinspectVersion: false,\n\tsign: false,\n\tsilent: false,\n\tverify: false,\n\n\tchangelogPresetConfig: {},\n};\n","import meow from \"meow\";\n\nexport function getCliArguments() {\n\treturn meow(\n\t\t`\nUsage:\n $ fork-version [options]\n\nOptions:\n --path [Default: process.cwd()]\n The path fork-version will run from.\n --changelog [Default: \"CHANGELOG.md\"]\n Name of the changelog file.\n --header, -H\n The header to be used in the changelog.\n --files, --file, -F [Default: [\"bower.json\", \"manifest.json\", \"npm-shrinkwrap.json\", \"package-lock.json\", \"package.json\"]]\n Files to be updated.\n --tag-prefix [Default: \"v\"]\n Specify a prefix for the git tag \"fork-version\" will create.\n --pre-release-tag [Default: undefined]\n Make a pre-release with optional label, If value is a string it\n will be used as the pre-release tag.\n\n --commit-all\n Commit all staged changes, not just files updated by fork-version.\n --debug\n If true, we'll output debug information.\n --dry-run\n If true, no output will be written to disk or committed.\n --git-tag-fallback [Default: true]\n If true and we cant find a version in the given files, we'll fallback\n and attempt to use the latest git tag for the current version.\n --inspect-version\n If set, we'll gather information about the current version and exit.\n --sign\n Should we sign the git commit using GPG?\n --silent\n If true, no output will be written to stdout.\n --verify\n If true, allow git to run git commit hooks.\n\n --current-version\n If set, we'll use this version number instead of trying to find a\n version in a \"file\".\n --next-version\n If set, we'll attempt to update the version number to this version,\n instead of incrementing using \"conventional-commit\".\n`,\n\t\t{\n\t\t\timportMeta: import.meta,\n\t\t\tflags: {\n\t\t\t\tpath: { type: \"string\", default: process.cwd() },\n\t\t\t\tchangelog: { type: \"string\" },\n\t\t\t\theader: { type: \"string\", shortFlag: \"H\" },\n\t\t\t\tfiles: { type: \"string\", isMultiple: true, aliases: [\"file\"], shortFlag: \"F\" },\n\t\t\t\ttagPrefix: { type: \"string\" },\n\t\t\t\tpreReleaseTag: { type: \"string\" },\n\n\t\t\t\tcommitAll: { type: \"boolean\" },\n\t\t\t\tdebug: { type: \"boolean\" },\n\t\t\t\tdryRun: { type: \"boolean\" },\n\t\t\t\tgitTagFallback: { type: \"boolean\" },\n\t\t\t\tinspectVersion: { type: \"boolean\" },\n\t\t\t\tsign: { type: \"boolean\" },\n\t\t\t\tsilent: { type: \"boolean\" },\n\t\t\t\tverify: { type: \"boolean\" },\n\n\t\t\t\tcurrentVersion: { type: \"string\" },\n\t\t\t\tnextVersion: { type: \"string\" },\n\t\t\t},\n\t\t},\n\t);\n}\n","import conventionalChangelogConfigSpec from \"conventional-changelog-config-spec\";\n\nimport { ChangelogPresetConfigSchema, type ForkConfig } from \"./schema\";\n\nexport function getChangelogPresetConfig(\n\tusersChangelogPresetConfig?: ForkConfig[\"changelogPresetConfig\"],\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 (usersChangelogPresetConfig && typeof usersChangelogPresetConfig === \"object\") {\n\t\tObject.entries(usersChangelogPresetConfig).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\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 { IFileManager, 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: IFileManager,\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\tif (versions.size === 0) {\n\t\tif (config.gitTagFallback) {\n\t\t\tconst version = await getLatestGitTagVersion(config.tagPrefix);\n\t\t\tif (version) {\n\t\t\t\treturn {\n\t\t\t\t\tfiles: [],\n\t\t\t\t\tversion: version,\n\t\t\t\t};\n\t\t\t}\n\t\t}\n\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 { version: config.nextVersion };\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.preReleaseTag,\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.preReleaseTag === \"string\" ? config.preReleaseTag : 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 \"1.0.0\";\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(`Executing: 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(`Unable to determine json package file: ${fileName}`);\n\t\t}\n\t}\n\n\tpublic write(filePath: string, newVersion: string) {\n\t\tconst fileContents = readFileSync(filePath, \"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\tfilePath,\n\t\t\tstringifyPackage(parsedJson, detectIndent(fileContents).amount, detectNewline(fileContents)),\n\t\t\t\"utf8\",\n\t\t);\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(`Unable to determine plain text file: ${fileName}`);\n\t}\n\n\tpublic write(filePath: string, newVersion: string) {\n\t\twriteFileSync(filePath, newVersion, \"utf8\");\n\t}\n}\n","import { JSONPackage } from \"./json-package\";\nimport { PlainText } from \"./plain-text\";\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(filePath: string, newVersion: string): void;\n}\n\nexport class FileManager implements IFileManager {\n\tprivate JSONPackage: JSONPackage;\n\tprivate PlainText: PlainText;\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}\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\tif (fileName.toLowerCase().endsWith(\".json\")) {\n\t\t\treturn this.JSONPackage.read(fileName);\n\t\t} else if (fileName.toLowerCase().endsWith(\"version.txt\")) {\n\t\t\treturn this.PlainText.read(fileName);\n\t\t}\n\n\t\tthis.logger.error(`Unsupported file type: ${fileName}`);\n\t}\n\n\t/**\n\t * Write the new version to the given file path.\n\t *\n\t * @example\n\t * ```ts\n\t * fileManager.write(\"/path/to/package.json\", \"1.2.3\");\n\t * ```\n\t */\n\tpublic write(filePath: string, newVersion: string): void {\n\t\tif (this.config.dryRun) {\n\t\t\treturn;\n\t\t}\n\n\t\tif (filePath.toLowerCase().endsWith(\".json\")) {\n\t\t\treturn this.JSONPackage.write(filePath, newVersion);\n\t\t} else if (filePath.toLowerCase().endsWith(\"version.txt\")) {\n\t\t\treturn this.PlainText.write(filePath, newVersion);\n\t\t}\n\n\t\tthis.logger.error(`Unsupported file type: ${filePath}`);\n\t}\n}\n"]}