fork-version 1.4.72 → 1.4.73
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 +8 -0
- package/dist/{chunk-VGCQTPXR.js → chunk-B3CLPRGG.js} +2 -3
- package/dist/chunk-B3CLPRGG.js.map +1 -0
- package/dist/{chunk-SVBPQXFI.cjs → chunk-UCNX6MBY.cjs} +2 -3
- package/dist/chunk-UCNX6MBY.cjs.map +1 -0
- package/dist/cli.cjs +9 -9
- package/dist/cli.js +1 -1
- package/dist/index.cjs +10 -10
- package/dist/index.js +1 -1
- package/package.json +1 -1
- package/dist/chunk-SVBPQXFI.cjs.map +0 -1
- package/dist/chunk-VGCQTPXR.js.map +0 -1
package/CHANGELOG.md
CHANGED
|
@@ -1,5 +1,13 @@
|
|
|
1
1
|
# Fork Version
|
|
2
2
|
|
|
3
|
+
## 1.4.73 (2024-05-03)
|
|
4
|
+
|
|
5
|
+
|
|
6
|
+
### Bug Fixes
|
|
7
|
+
|
|
8
|
+
* change indentation type in json packages to respect tabs ([#45](https://github.com/eglavin/fork-version/issues/45)) ([c885395](https://github.com/eglavin/fork-version/commit/c88539508718d56fe7e5b7ec6bdeb91d39718d5d))
|
|
9
|
+
|
|
10
|
+
|
|
3
11
|
## 1.4.72 (2024-05-02)
|
|
4
12
|
|
|
5
13
|
|
|
@@ -279,7 +279,6 @@ Options:
|
|
|
279
279
|
If set, fork-version will attempt to update to this version, instead of incrementing using "conventional-commit".
|
|
280
280
|
|
|
281
281
|
Flags:
|
|
282
|
-
|
|
283
282
|
--commit-all
|
|
284
283
|
Commit all staged changes, not just files updated by fork-version.
|
|
285
284
|
--debug
|
|
@@ -798,7 +797,7 @@ var JSONPackage = class {
|
|
|
798
797
|
}
|
|
799
798
|
writeFileSync(
|
|
800
799
|
fileState.path,
|
|
801
|
-
stringifyPackage(parsedJson, detectIndent(fileContents).
|
|
800
|
+
stringifyPackage(parsedJson, detectIndent(fileContents).indent, detectNewline(fileContents)),
|
|
802
801
|
"utf8"
|
|
803
802
|
);
|
|
804
803
|
}
|
|
@@ -923,4 +922,4 @@ var FileManager = class {
|
|
|
923
922
|
|
|
924
923
|
export { FileManager, ForkConfigSchema, Git, commitChanges, defineConfig, getCurrentVersion, getNextVersion, getUserConfig, tagChanges, updateChangelog };
|
|
925
924
|
//# sourceMappingURL=out.js.map
|
|
926
|
-
//# sourceMappingURL=chunk-
|
|
925
|
+
//# sourceMappingURL=chunk-B3CLPRGG.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.js","../src/config/changelog-preset-config.ts","../src/process/version.ts","../src/utils/git-tag-version.ts","../src/utils/release-type.ts","../src/process/changelog.ts","../src/utils/file-state.ts","../src/process/commit.ts","../src/utils/git.ts","../src/utils/format-commit-message.ts","../src/process/tag.ts","../src/strategies/json-package.ts","../src/libs/stringify-package.ts","../src/strategies/plain-text.ts","../src/strategies/csharp-project.ts","../src/strategies/file-manager.ts"],"names":["fileContent","parsed","semver","resolve","readFileSync","writeFileSync"],"mappings":"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","sourcesContent":["import { z } from \"zod\";\n\nconst ChangelogPresetConfigTypeSchema = z.object({\n\t/**\n\t * The type of commit message.\n\t * @example \"feat\", \"fix\", \"chore\", etc..\n\t */\n\ttype: z.string().describe('The type of commit message, such as \"feat\", \"fix\", \"chore\".'),\n\t/**\n\t * The section of the `CHANGELOG` the commit should show up in.\n\t */\n\tsection: z\n\t\t.string()\n\t\t.optional()\n\t\t.describe(\"The section of the `CHANGELOG` the commit should show up in.\"),\n\t/**\n\t * Should show in the generated changelog message?\n\t */\n\thidden: z.boolean().optional().describe(\"Should show in the generated changelog message?\"),\n});\n\nexport const ChangelogPresetConfigSchema = z.object({\n\t/**\n\t * List of explicitly supported commit message types.\n\t */\n\ttypes: z\n\t\t.array(ChangelogPresetConfigTypeSchema)\n\t\t.describe(\"List of explicitly supported commit message types.\"),\n\t/**\n\t * A URL representing a specific commit at a hash.\n\t * @default \"{{host}}/{{owner}}/{{repository}}/commit/{{hash}}\"\n\t */\n\tcommitUrlFormat: z.string().describe(\"A URL representing a specific commit at a hash.\"),\n\t/**\n\t * A URL representing the comparison between two git SHAs.\n\t * @default \"{{host}}/{{owner}}/{{repository}}/compare/{{previousTag}}...{{currentTag}}\"\n\t */\n\tcompareUrlFormat: z.string().describe(\"A URL representing the comparison between two git SHAs.\"),\n\t/**\n\t * A URL representing the issue format (allowing a different URL format to be swapped in\n\t * for Gitlab, Bitbucket, etc).\n\t * @default \"{{host}}/{{owner}}/{{repository}}/issues/{{id}}\"\n\t */\n\tissueUrlFormat: z.string().describe(\"A URL representing the issue format.\"),\n\t/**\n\t * A URL representing a user's profile on GitHub, Gitlab, etc. This URL is used\n\t * for substituting @eglavin with https://github.com/eglavin in commit messages.\n\t * @default \"{{host}}/{{user}}\"\n\t */\n\tuserUrlFormat: z.string().describe(\"A URL representing a user's profile on GitHub, Gitlab, etc.\"),\n\t/**\n\t * A string to be used to format the auto-generated release commit message.\n\t * @default \"chore(release): {{currentTag}}\"\n\t */\n\treleaseCommitMessageFormat: z\n\t\t.string()\n\t\t.describe(\"A string to be used to format the auto-generated release commit message.\"),\n\t/**\n\t * List of prefixes used to detect references to issues.\n\t * @default [\"#\"]\n\t */\n\tissuePrefixes: z\n\t\t.array(z.string())\n\t\t.describe(\"List of prefixes used to detect references to issues.\"),\n});\n\nexport const ForkConfigSchema = z.object({\n\t// Commands\n\t//\n\n\t/**\n\t * If set, fork-version will print the current version and exit.\n\t * @default false\n\t */\n\tinspectVersion: z\n\t\t.boolean()\n\t\t.describe(\"If set, fork-version will print the current version and exit.\"),\n\n\t// Options\n\t//\n\n\t/**\n\t * List of the files to be updated.\n\t * @default\n\t * ```js\n\t * [\"bower.json\", \"manifest.json\", \"npm-shrinkwrap.json\", \"package-lock.json\", \"package.json\"]\n\t * ```\n\t */\n\tfiles: z.array(z.string()).describe(\"List of the files to be updated.\"),\n\t/**\n\t * Glob pattern to match files to be updated.\n\t *\n\t * Internally we're using [glob](https://github.com/isaacs/node-glob) to match files.\n\t *\n\t * Read more about the pattern syntax [here](https://github.com/isaacs/node-glob/tree/v10.3.12?tab=readme-ov-file#glob-primer).\n\t *\n\t * @default undefined\n\t * @example \"*.json\"\n\t */\n\tglob: z.string().optional().describe(\"Glob pattern to match files to be updated.\"),\n\t/**\n\t * The path fork-version will run from.\n\t * @default\n\t * ```js\n\t * process.cwd()\n\t * ```\n\t */\n\tpath: z.string().describe('The path fork-version will run from. Defaults to \"process.cwd()\".'),\n\t/**\n\t * Name of the changelog file.\n\t * @default \"CHANGELOG.md\"\n\t */\n\tchangelog: z.string().describe('Name of the changelog file. Defaults to \"CHANGELOG.md\".'),\n\t/**\n\t * The header text for the changelog.\n\t * @default\n\t * ```markdown\n\t * # Changelog\n\t *\n\t * All notable changes to this project will be documented in this file. See [fork-version](https://github.com/eglavin/fork-version) for commit guidelines.\n\t * ```\n\t */\n\theader: z.string().describe(\"The header text for the changelog.\"),\n\t/**\n\t * Specify a prefix for the created tag.\n\t *\n\t * For instance if your version tag is prefixed by \"version/\" instead of \"v\" you have to specify\n\t * `tagPrefix: \"version/\"`.\n\t *\n\t * `tagPrefix` can also be used for a monorepo environment where you might want to deploy\n\t * multiple package from the same repository. In this case you can specify a prefix for\n\t * each package:\n\t *\n\t * | Example Value | Tag Created |\n\t * |:-------------------------|:------------------------------|\n\t * | \"\" | `1.2.3` |\n\t * | \"version/\" | `version/1.2.3` |\n\t * | \"@eglavin/fork-version-\" | `@eglavin/fork-version-1.2.3` |\n\t *\n\t * @example \"\", \"version/\", \"@eglavin/fork-version-\"\n\t * @default \"v\"\n\t */\n\ttagPrefix: z.string().describe('Specify a prefix for the created tag. Defaults to \"v\".'),\n\t/**\n\t * Make a pre-release with optional label if given value is a string.\n\t *\n\t * | Example Value | Produced Version |\n\t * |:--------------|:-----------------|\n\t * | true | `1.2.3-0` |\n\t * | \"alpha\" | `1.2.3-alpha-0` |\n\t * | \"beta\" | `1.2.3-beta-0` |\n\t *\n\t * @example true, \"alpha\", \"beta\", \"rc\"\n\t * @default undefined\n\t */\n\tpreReleaseTag: z\n\t\t.string()\n\t\t.or(z.boolean())\n\t\t.optional()\n\t\t.describe(\"Make a pre-release with optional label if given value is a string.\"),\n\t/**\n\t * If set, fork-version will use this version instead of trying to determine one.\n\t * @example \"1.0.0\"\n\t * @default undefined\n\t */\n\tcurrentVersion: z\n\t\t.string()\n\t\t.optional()\n\t\t.describe(\"If set, fork-version will use this version instead of trying to determine one.\"),\n\t/**\n\t * If set, fork-version will attempt to update to this version, instead of incrementing using \"conventional-commit\".\n\t * @example \"2.0.0\"\n\t * @default undefined\n\t */\n\tnextVersion: z\n\t\t.string()\n\t\t.optional()\n\t\t.describe(\n\t\t\t'If set, fork-version will attempt to update to this version, instead of incrementing using \"conventional-commit\".',\n\t\t),\n\n\t// Flags\n\t//\n\n\t/**\n\t * Commit all staged changes, not just files updated by fork-version.\n\t * @default false\n\t */\n\tcommitAll: z\n\t\t.boolean()\n\t\t.describe(\"Commit all staged changes, not just files updated by fork-version.\"),\n\t/**\n\t * Output debug information.\n\t * @default false\n\t */\n\tdebug: z.boolean().describe(\"Output debug information.\"),\n\t/**\n\t * No output will be written to disk or committed.\n\t * @default false\n\t */\n\tdryRun: z.boolean().describe(\"No output will be written to disk or committed.\"),\n\t/**\n\t * Run without logging to the terminal.\n\t * @default false\n\t */\n\tsilent: z.boolean().describe(\"Run without logging to the terminal.\"),\n\t/**\n\t * If unable to find a version in the given files, fallback and attempt to use the latest git tag.\n\t * @default true\n\t */\n\tgitTagFallback: z\n\t\t.boolean()\n\t\t.describe(\n\t\t\t\"If unable to find a version in the given files, fallback and attempt to use the latest git tag. Defaults to true.\",\n\t\t),\n\t/**\n\t * If true, git will sign the commit with the systems GPG key.\n\t * @see {@link https://git-scm.com/docs/git-commit#Documentation/git-commit.txt--Sltkeyidgt Git - GPG Sign Commits}\n\t * @default false\n\t */\n\tsign: z.boolean().describe(\"If true, git will sign the commit with the systems GPG key.\"),\n\t/**\n\t * If true, git will run user defined git hooks before committing.\n\t * @default false\n\t */\n\tverify: z.boolean().describe(\"If true, git will run user defined git hooks before committing.\"),\n\n\t/**\n\t * Override the default \"conventional-changelog-conventionalcommits\" preset configuration.\n\t */\n\tchangelogPresetConfig: ChangelogPresetConfigSchema.partial().describe(\n\t\t'Override the default \"conventional-changelog-conventionalcommits\" preset configuration.',\n\t),\n});\n\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\";\nimport { glob } from \"glob\";\nimport dotgitignore from \"dotgitignore\";\n\nimport { ForkConfigSchema, type ForkConfig } from \"./schema\";\nimport { DEFAULT_CONFIG } from \"./defaults\";\nimport { getCliArguments } from \"./cli-arguments\";\nimport { getChangelogPresetConfig } from \"./changelog-preset-config\";\n\n/**\n * Name of the key in the package.json file that contains the users configuration.\n */\nconst PACKAGE_JSON_CONFIG_KEY = \"fork-version\";\n\nexport async function getUserConfig(): Promise<ForkConfig> {\n\tconst cliArguments = getCliArguments();\n\n\tconst cwd = cliArguments.flags.path ? resolve(cliArguments.flags.path) : process.cwd();\n\tconst joycon = new JoyCon({\n\t\tcwd,\n\t\tpackageKey: PACKAGE_JSON_CONFIG_KEY,\n\t\tstopDir: parse(cwd).root,\n\t});\n\tconst configFilePath = await joycon.resolve([\n\t\t\"fork.config.ts\",\n\t\t\"fork.config.js\",\n\t\t\"fork.config.cjs\",\n\t\t\"fork.config.mjs\",\n\t\t\"fork.config.json\",\n\t\t\"package.json\",\n\t]);\n\n\tconst configFile = await loadConfigFile(configFilePath);\n\n\tconst mergedConfig = {\n\t\t...DEFAULT_CONFIG,\n\t\t...configFile,\n\t\t...cliArguments.flags,\n\t} as ForkConfig;\n\n\t// If the user has defined a glob pattern, use it to find the requested files.\n\tlet globResults: string[] = [];\n\tif (mergedConfig.glob) {\n\t\tglobResults = await glob(mergedConfig.glob, {\n\t\t\tcwd: cwd,\n\t\t\tignore: [\"node_modules/**\"],\n\t\t\tnodir: true,\n\t\t});\n\t}\n\n\treturn {\n\t\t...mergedConfig,\n\n\t\tpath: cwd,\n\t\tfiles: filterGitIgnoredFiles(\n\t\t\tcwd,\n\t\t\tgetFilesList(configFile?.files, cliArguments.flags?.files, globResults),\n\t\t),\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\t// Handle package.json config file.\n\t\tif (configFilePath.endsWith(\"package.json\")) {\n\t\t\tif (\n\t\t\t\tfileContent[PACKAGE_JSON_CONFIG_KEY] &&\n\t\t\t\ttypeof fileContent[PACKAGE_JSON_CONFIG_KEY] === \"object\"\n\t\t\t) {\n\t\t\t\tconst parsed = ForkConfigSchema.partial().safeParse(fileContent[PACKAGE_JSON_CONFIG_KEY]);\n\t\t\t\tif (!parsed.success) {\n\t\t\t\t\tthrow parsed.error;\n\t\t\t\t}\n\t\t\t\treturn parsed.data;\n\t\t\t}\n\n\t\t\treturn {};\n\t\t}\n\n\t\tconst parsed = ForkConfigSchema.partial().safeParse(fileContent);\n\t\tif (!parsed.success) {\n\t\t\tthrow parsed.error;\n\t\t}\n\t\treturn parsed.data;\n\t}\n\n\t// Otherwise expect config file to use js or ts.\n\tconst fileContent = await bundleRequire({ filepath: configFilePath });\n\n\tconst parsed = ForkConfigSchema.partial().safeParse(fileContent.mod.default || fileContent.mod);\n\tif (!parsed.success) {\n\t\tthrow parsed.error;\n\t}\n\treturn parsed.data;\n}\n\nfunction getFilesList(\n\tconfigFiles: string[] | undefined,\n\tcliFiles: string[] | undefined,\n\tglobResults: string[],\n): string[] {\n\tconst listOfFiles = new Set<string>();\n\n\t// Add files from the users config file\n\tif (Array.isArray(configFiles)) {\n\t\tconfigFiles.forEach((file) => listOfFiles.add(file));\n\t}\n\n\t// Add files from the cli arguments\n\tif (Array.isArray(cliFiles)) {\n\t\tcliFiles.forEach((file) => listOfFiles.add(file));\n\t}\n\n\t// Add files from glob results\n\tglobResults.forEach((file) => listOfFiles.add(file));\n\n\t// If the user has defined files use them, otherwise use the default list of files.\n\tif (listOfFiles.size) {\n\t\treturn Array.from(listOfFiles);\n\t}\n\n\treturn DEFAULT_CONFIG.files;\n}\n\nfunction filterGitIgnoredFiles(cwd: string, files: string[]) {\n\tconst dotgit = dotgitignore({ cwd });\n\n\treturn files.filter((file) => !dotgit.ignore(file));\n}\n","import type { ForkConfig } from \"./schema\";\n\nexport const DEFAULT_CONFIG: ForkConfig = {\n\t// Commands\n\tinspectVersion: false,\n\n\t// Options\n\tfiles: [\n\t\t\"package.json\",\n\t\t\"package-lock.json\",\n\t\t\"npm-shrinkwrap.json\",\n\t\t\"manifest.json\", // Chrome extensions\n\t\t\"bower.json\",\n\t],\n\tpath: process.cwd(),\n\tchangelog: \"CHANGELOG.md\",\n\theader: `# Changelog\n\nAll notable changes to this project will be documented in this file. See [fork-version](https://github.com/eglavin/fork-version) for commit guidelines.\n`,\n\ttagPrefix: \"v\",\n\n\t// Flags\n\tcommitAll: false,\n\tdebug: false,\n\tdryRun: false,\n\tsilent: false,\n\tgitTagFallback: true,\n\tsign: false,\n\tverify: false,\n\n\tchangelogPresetConfig: {},\n};\n","import meow from \"meow\";\n//@ts-check\n\n// This file is javascript so the following helper text can be extracted to the readme\n// without the need for a build step, otherwise it would also be typescript...\n\nexport const helperText = `Usage:\n $ fork-version [options]\n\nCommands:\n --help Show this help message.\n\n --inspect-version If set, fork-version will print the current version and exit.\n\nOptions:\n --files, --file, -F [Default: [\"bower.json\", \"manifest.json\", \"npm-shrinkwrap.json\", \"package-lock.json\", \"package.json\"]]\n List of the files to be updated.\n --glob, -G\n Glob pattern to match files to be updated.\n --path, -P [Default: process.cwd()]\n The path fork-version will run from.\n --changelog [Default: \"CHANGELOG.md\"]\n Name of the changelog file.\n --header\n The header text for the changelog.\n --tag-prefix [Default: \"v\"]\n Specify a prefix for the created tag.\n --pre-release-tag [Default: undefined]\n Make a pre-release with optional label if given value is a string.\n --current-version\n If set, fork-version will use this version instead of trying to determine one.\n --next-version\n If set, fork-version will attempt to update to this version, instead of incrementing using \"conventional-commit\".\n\nFlags:\n --commit-all\n Commit all staged changes, not just files updated by fork-version.\n --debug\n Output debug information.\n --dry-run\n No output will be written to disk or committed.\n --silent\n Run without logging to the terminal.\n --git-tag-fallback [Default: true]\n If unable to find a version in the given files, fallback and attempt to use the latest git tag.\n --sign\n If true, git will sign the commit with the systems GPG key.\n --verify\n If true, git will run user defined git hooks before committing.`;\n\nexport function getCliArguments() {\n\treturn meow(helperText, {\n\t\timportMeta: import.meta,\n\t\tbooleanDefault: undefined,\n\t\thelpIndent: 0,\n\t\tflags: {\n\t\t\t// Commands\n\t\t\tinspectVersion: { type: \"boolean\" },\n\n\t\t\t// Options\n\t\t\tfiles: { type: \"string\", isMultiple: true, aliases: [\"file\"], shortFlag: \"F\" },\n\t\t\tglob: { type: \"string\", shortFlag: \"G\" },\n\t\t\tpath: { type: \"string\", shortFlag: \"P\" },\n\t\t\tchangelog: { type: \"string\" },\n\t\t\theader: { type: \"string\" },\n\t\t\ttagPrefix: { type: \"string\" },\n\t\t\tpreReleaseTag: { type: \"string\" },\n\t\t\tcurrentVersion: { type: \"string\" },\n\t\t\tnextVersion: { type: \"string\" },\n\n\t\t\t// Flags\n\t\t\tcommitAll: { type: \"boolean\" },\n\t\t\tdebug: { type: \"boolean\" },\n\t\t\tdryRun: { type: \"boolean\" },\n\t\t\tsilent: { type: \"boolean\" },\n\t\t\tgitTagFallback: { type: \"boolean\" },\n\t\t\tsign: { type: \"boolean\" },\n\t\t\tverify: { type: \"boolean\" },\n\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\tlogger.log(`[Version] Using git tag fallback.`);\n\t\t\tversions.add(version);\n\t\t}\n\t}\n\n\tif (versions.size === 0) {\n\t\tthrow new Error(\"Unable to find current version\");\n\t} else if (versions.size > 1) {\n\t\tthrow new Error(\"Found multiple versions\");\n\t}\n\n\tconst currentVersion = versions.entries().next().value[0];\n\n\t// If we're just inspecting the version, output the version and exit\n\tif (config.inspectVersion) {\n\t\tconsole.log(currentVersion);\n\t\tprocess.exit(0);\n\t}\n\n\tlogger.log(`Current version: ${currentVersion}`);\n\treturn {\n\t\tfiles,\n\t\tversion: currentVersion,\n\t};\n}\n\nexport interface NextVersion {\n\tversion: string;\n\tlevel?: number;\n\tpreMajor?: boolean;\n\treason?: string;\n\treleaseType?: ReleaseType;\n}\n\nexport async function getNextVersion(\n\tconfig: ForkConfig,\n\tlogger: Logger,\n\tcurrentVersion: string,\n): Promise<NextVersion> {\n\tif (config.nextVersion && semver.valid(config.nextVersion)) {\n\t\tlogger.log(`Next version: ${config.nextVersion}`);\n\t\treturn {\n\t\t\tversion: config.nextVersion,\n\t\t};\n\t}\n\n\tconst isPreMajor = semver.lt(currentVersion, \"1.0.0\");\n\n\tlet recommendedBump: Awaited<ReturnType<typeof conventionalRecommendedBump>>;\n\ttry {\n\t\trecommendedBump = await conventionalRecommendedBump({\n\t\t\tpreset: {\n\t\t\t\tname: \"conventionalcommits\",\n\t\t\t\t...config.changelogPresetConfig,\n\t\t\t\tpreMajor: isPreMajor,\n\t\t\t},\n\t\t\tpath: config.path,\n\t\t\ttagPrefix: config.tagPrefix,\n\t\t\tcwd: config.path,\n\t\t});\n\t} catch (error) {\n\t\tthrow new Error(`[conventional-recommended-bump] Unable to determine next version`);\n\t}\n\n\tif (recommendedBump.releaseType) {\n\t\tconst releaseType = getReleaseType(\n\t\t\trecommendedBump.releaseType,\n\t\t\tcurrentVersion,\n\t\t\tconfig.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 \"\";\n\t}\n\n\tconst cleanedTags = [];\n\n\tfor (const tag of gitTags) {\n\t\tconst cleanedTag = semver.clean(tag.replace(new RegExp(`^${tagPrefix}`), \"\"));\n\n\t\tif (cleanedTag) {\n\t\t\tcleanedTags.push(cleanedTag);\n\t\t}\n\t}\n\n\treturn cleanedTags.sort(semver.rcompare)[0];\n}\n","import semver, { type ReleaseType } from \"semver\";\n\n/**\n * Get the priority of given type.\n * @example\n * - \"patch\" => 0\n * - \"minor\" => 1\n * - \"major\" => 2\n */\nfunction getPriority(type?: string): number {\n\treturn [\"patch\", \"minor\", \"major\"].indexOf(type ?? \"\");\n}\n\n/**\n * Get the given versions highest state.\n * @example\n * - \"patch\"\n * - \"minor\"\n * - \"major\"\n */\nfunction getVersionType(version: string): \"patch\" | \"minor\" | \"major\" | undefined {\n\tconst parseVersion = semver.parse(version);\n\n\tif (parseVersion?.major) {\n\t\treturn \"major\";\n\t} else if (parseVersion?.minor) {\n\t\treturn \"minor\";\n\t} else if (parseVersion?.patch) {\n\t\treturn \"patch\";\n\t}\n\n\treturn undefined;\n}\n\n/**\n * Get the recommended release type for the given version depending on if\n * the user asks for a prerelease with or without a tag.\n * ```js\n * getReleaseType(\"patch\", \"1.0.0\", false) => \"patch\"\n * getReleaseType(\"major\", \"0.0.0-beta\", \"beta\") => \"premajor\"\n * ```\n */\nexport function getReleaseType(\n\treleaseType: \"major\" | \"minor\" | \"patch\",\n\tcurrentVersion: string,\n\tpreReleaseTag?: string | boolean,\n): ReleaseType {\n\tif (!preReleaseTag) {\n\t\treturn releaseType;\n\t}\n\n\tconst currentVersionsIsPreRelease = Array.isArray(semver.prerelease(currentVersion));\n\tif (currentVersionsIsPreRelease) {\n\t\tconst currentReleaseType = getVersionType(currentVersion);\n\n\t\tif (\n\t\t\tcurrentReleaseType === releaseType ||\n\t\t\tgetPriority(currentReleaseType) > getPriority(releaseType)\n\t\t) {\n\t\t\treturn \"prerelease\";\n\t\t}\n\t}\n\n\treturn `pre${releaseType}`;\n}\n","import { resolve } from \"node:path\";\nimport { writeFileSync, readFileSync } from \"node:fs\";\nimport conventionalChangelog from \"conventional-changelog\";\n\nimport { fileExists } from \"../utils/file-state\";\nimport type { ForkConfig } from \"../config/schema\";\nimport type { Logger } from \"../utils/logger\";\n\n/**\n * Matches the following changelog header formats:\n * - `## [1.2.3]`\n * - `<a name=\"1.2.3\"></a>`\n */\nconst RELEASE_PATTERN = /(^#+ \\[?[0-9]+\\.[0-9]+\\.[0-9]+|<a name=)/m;\n\n/**\n * Get the existing changelog content from the latest release onwards.\n * @see {@link RELEASE_PATTERN}\n */\nfunction getOldReleaseContent(filePath: string, exists: boolean): string {\n\tif (exists) {\n\t\tconst fileContents = readFileSync(filePath, \"utf-8\");\n\t\tconst oldContentStart = fileContents.search(RELEASE_PATTERN);\n\n\t\tif (oldContentStart !== -1) {\n\t\t\treturn fileContents.substring(oldContentStart);\n\t\t}\n\t}\n\n\treturn \"\";\n}\n\n/**\n * Generate the new changelog content for this release.\n */\nfunction getNewReleaseContent(\n\tconfig: ForkConfig,\n\tlogger: Logger,\n\tnextVersion: string,\n): Promise<string> {\n\treturn new Promise<string>((onResolve) => {\n\t\tlet newContent = \"\";\n\n\t\tconventionalChangelog(\n\t\t\t{\n\t\t\t\tpreset: {\n\t\t\t\t\tname: \"conventionalcommits\",\n\t\t\t\t\t...config.changelogPresetConfig,\n\t\t\t\t},\n\t\t\t\ttagPrefix: config.tagPrefix,\n\t\t\t\twarn: (...message: string[]) => logger.error(\"[conventional-changelog] \", ...message),\n\t\t\t\tcwd: config.path,\n\t\t\t},\n\t\t\t{\n\t\t\t\tversion: nextVersion,\n\t\t\t},\n\t\t\t{\n\t\t\t\tmerges: null,\n\t\t\t\tpath: config.path,\n\t\t\t},\n\t\t)\n\t\t\t.on(\"error\", (error) => {\n\t\t\t\tlogger.error(\"[conventional-changelog] Unable to parse changes\");\n\t\t\t\tthrow error;\n\t\t\t})\n\t\t\t.on(\"data\", (chunk) => {\n\t\t\t\tnewContent += chunk.toString();\n\t\t\t})\n\t\t\t.on(\"end\", () => {\n\t\t\t\tonResolve(newContent);\n\t\t\t});\n\t});\n}\n\ninterface UpdateChangelog {\n\tchangelogPath: string;\n\toldContent: string;\n\tnewContent: string;\n}\n\nexport async function updateChangelog(\n\tconfig: ForkConfig,\n\tlogger: Logger,\n\tnextVersion: string,\n): Promise<UpdateChangelog> {\n\tif (config.header.search(RELEASE_PATTERN) !== -1) {\n\t\t// Need to ensure the header doesn't contain the release pattern\n\t\tthrow new Error(\"Header cannot contain release pattern\");\n\t}\n\n\t// Create the changelog file if it doesn't exist\n\tconst changelogPath = resolve(config.path, config.changelog);\n\tif (!config.dryRun && !fileExists(changelogPath)) {\n\t\tlogger.log(`Creating Changelog file: ${changelogPath}`);\n\t\twriteFileSync(changelogPath, \"\\n\", \"utf8\");\n\t}\n\n\tconst oldContent = getOldReleaseContent(changelogPath, fileExists(changelogPath));\n\tconst newContent = await getNewReleaseContent(config, logger, nextVersion);\n\n\tlogger.log(`Updating Changelog: ${changelogPath}`);\n\tif (!config.dryRun && newContent) {\n\t\twriteFileSync(\n\t\t\tchangelogPath,\n\t\t\t`${config.header}\n${newContent}\n${oldContent}\n`.trim(),\n\t\t\t\"utf8\",\n\t\t);\n\t}\n\n\treturn {\n\t\tchangelogPath,\n\t\toldContent,\n\t\tnewContent,\n\t};\n}\n","import { lstatSync } from \"fs\";\n\n/**\n * Determine if a file exists.\n * @example\n * ```ts\n * fileExists(\"~/.bashrc\"); // true\n * fileExists(\"~/missing-file.txt\"); // false\n * ```\n */\nexport function fileExists(filePath: string): boolean {\n\ttry {\n\t\treturn lstatSync(filePath).isFile();\n\t} catch (e) {\n\t\treturn false;\n\t}\n}\n","import { resolve } from \"node:path\";\nimport { Git } from \"../utils/git\";\nimport { formatCommitMessage } from \"../utils/format-commit-message\";\nimport { fileExists } from \"../utils/file-state\";\nimport type { ForkConfig } from \"../config/schema\";\nimport type { FileState } from \"../strategies/file-manager\";\nimport type { Logger } from \"../utils/logger\";\n\ninterface CommitChanges {\n\tfilesToCommit: string[];\n\tgitAddOutput?: string;\n\tgitCommitOutput?: string;\n}\n\nexport async function commitChanges(\n\tconfig: ForkConfig,\n\tlogger: Logger,\n\tfiles: FileState[],\n\tnextVersion: string,\n): Promise<CommitChanges> {\n\tconst git = new Git(config, logger);\n\n\tlogger.log(\"Committing changes\");\n\n\tconst filesToCommit: string[] = [];\n\tif (fileExists(resolve(config.path, config.changelog))) {\n\t\tfilesToCommit.push(resolve(config.path, config.changelog));\n\t}\n\tfor (const file of files) {\n\t\tfilesToCommit.push(file.path);\n\t}\n\n\t// If there are no files to commit don't continue.\n\tif (filesToCommit.length === 0) {\n\t\treturn {\n\t\t\tfilesToCommit,\n\t\t};\n\t}\n\n\tconst shouldVerify = config.verify ? undefined : \"--no-verify\";\n\tconst shouldSign = config.sign ? \"--gpg-sign\" : undefined;\n\n\t// If commitAll is set, commit all changed files.\n\tif (config.commitAll) {\n\t\treturn {\n\t\t\tfilesToCommit,\n\t\t\tgitAddOutput: await git.add(\"--all\"),\n\t\t\tgitCommitOutput: await git.commit(\n\t\t\t\tshouldVerify,\n\t\t\t\tshouldSign,\n\t\t\t\t\"--message\",\n\t\t\t\tformatCommitMessage(config.changelogPresetConfig?.releaseCommitMessageFormat, nextVersion),\n\t\t\t),\n\t\t};\n\t}\n\n\treturn {\n\t\tfilesToCommit,\n\t\tgitAddOutput: await git.add(...filesToCommit),\n\t\tgitCommitOutput: await git.commit(\n\t\t\tshouldVerify,\n\t\t\tshouldSign,\n\t\t\t...filesToCommit,\n\t\t\t\"--message\",\n\t\t\tformatCommitMessage(config.changelogPresetConfig?.releaseCommitMessageFormat, nextVersion),\n\t\t),\n\t};\n}\n","import { execFile } from \"node:child_process\";\nimport type { ForkConfig } from \"../config/schema\";\nimport type { Logger } from \"./logger\";\n\nexport class Git {\n\tconstructor(\n\t\tprivate config: ForkConfig,\n\t\tprivate logger: Logger,\n\t) {\n\t\tthis.add = this.add.bind(this);\n\t\tthis.commit = this.commit.bind(this);\n\t\tthis.tag = this.tag.bind(this);\n\t\tthis.currentBranch = this.currentBranch.bind(this);\n\t}\n\n\tpublic add(...args: (string | undefined)[]) {\n\t\tif (this.config.dryRun) {\n\t\t\treturn Promise.resolve(\"\");\n\t\t}\n\n\t\treturn this.execGit(\"add\", args.filter(Boolean) as string[]);\n\t}\n\n\tpublic commit(...args: (string | undefined)[]) {\n\t\tif (this.config.dryRun) {\n\t\t\treturn Promise.resolve(\"\");\n\t\t}\n\n\t\treturn this.execGit(\"commit\", args.filter(Boolean) as string[]);\n\t}\n\n\tpublic tag(...args: (string | undefined)[]) {\n\t\tif (this.config.dryRun) {\n\t\t\treturn Promise.resolve(\"\");\n\t\t}\n\n\t\treturn this.execGit(\"tag\", args.filter(Boolean) as string[]);\n\t}\n\n\tpublic async currentBranch() {\n\t\treturn (await this.execGit(\"rev-parse\", [\"--abbrev-ref\", \"HEAD\"])).trim();\n\t}\n\n\tprivate execGit(command: string, args: string[]): Promise<string> {\n\t\tthis.logger.debug(`[git ${command}] ${args.join(\" \")}`);\n\n\t\treturn new Promise((onResolve, onReject) => {\n\t\t\texecFile(\n\t\t\t\t\"git\",\n\t\t\t\t[command, ...args],\n\t\t\t\t{\n\t\t\t\t\tcwd: this.config.path,\n\t\t\t\t},\n\t\t\t\t(error, stdout, stderr) => {\n\t\t\t\t\tif (error) {\n\t\t\t\t\t\tthis.logger.error(`[git ${command}] `);\n\t\t\t\t\t\tonReject(error);\n\t\t\t\t\t}\n\n\t\t\t\t\tonResolve(stdout ? stdout : stderr);\n\t\t\t\t},\n\t\t\t);\n\t\t});\n\t}\n}\n","/**\n * Formats the commit message by replacing the `{{currentTag}}` placeholder\n * globally with the new version.\n *\n * Falls back to `chore(release): {{currentTag}}` if message is argument is falsy.\n */\nexport function formatCommitMessage(message: string | undefined, version: string): string {\n\tif (!message) {\n\t\tmessage = \"chore(release): {{currentTag}}\";\n\t}\n\n\treturn message.replace(new RegExp(\"{{currentTag}}\", \"g\"), version);\n}\n","import { Git } from \"../utils/git\";\nimport { formatCommitMessage } from \"../utils/format-commit-message\";\nimport type { ForkConfig } from \"../config/schema\";\nimport type { Logger } from \"../utils/logger\";\n\ninterface TagChanges {\n\tgitTagOutput: string;\n}\n\nexport async function tagChanges(\n\tconfig: ForkConfig,\n\tlogger: Logger,\n\tnextVersion: string,\n): Promise<TagChanges> {\n\tconst git = new Git(config, logger);\n\n\t/** @example \"v1.2.3\" or \"version/1.2.3\" */\n\tconst tag = `${config.tagPrefix}${nextVersion}`;\n\n\tlogger.log(`Creating Tag: ${tag}`);\n\n\tconst gitTagOutput = await git.tag(\n\t\tconfig.sign ? \"--sign\" : \"--annotate\",\n\t\ttag,\n\t\t\"--message\",\n\t\tformatCommitMessage(config.changelogPresetConfig?.releaseCommitMessageFormat, nextVersion),\n\t);\n\n\treturn {\n\t\tgitTagOutput,\n\t};\n}\n","import { resolve } from \"node:path\";\nimport { readFileSync, writeFileSync } from \"node:fs\";\nimport detectIndent from \"detect-indent\";\nimport { detectNewline } from \"detect-newline\";\n\nimport { stringifyPackage } from \"../libs/stringify-package\";\nimport { fileExists } from \"../utils/file-state\";\nimport type { ForkConfig } from \"../config/schema\";\nimport type { Logger } from \"../utils/logger\";\nimport type { FileState, IFileManager } from \"./file-manager\";\n\n/**\n * A json package file should have a version property, like what can be seen\n * in the package.json file in the root of this project.\n *\n * @example\n * ```json\n * {\n * \"name\": \"fork-version\",\n * \"version\": \"1.2.3\",\n * \"private\": true,\n * }\n * ```\n */\nexport class JSONPackage implements IFileManager {\n\tconstructor(\n\t\tprivate config: ForkConfig,\n\t\tprivate logger: Logger,\n\t) {}\n\n\tpublic read(fileName: string): FileState | undefined {\n\t\tconst filePath = resolve(this.config.path, fileName);\n\n\t\tif (fileExists(filePath)) {\n\t\t\tconst fileContents = readFileSync(filePath, \"utf8\");\n\t\t\tconst parsedJson = JSON.parse(fileContents);\n\n\t\t\tif (parsedJson.version) {\n\t\t\t\treturn {\n\t\t\t\t\tname: fileName,\n\t\t\t\t\tpath: filePath,\n\t\t\t\t\tversion: parsedJson.version,\n\n\t\t\t\t\tisPrivate: typeof parsedJson?.private === \"boolean\" ? parsedJson.private : true,\n\t\t\t\t};\n\t\t\t}\n\n\t\t\tthis.logger.warn(`[File Manager] Unable to determine json package: ${fileName}`);\n\t\t}\n\t}\n\n\tpublic write(fileState: FileState, newVersion: string) {\n\t\tconst fileContents = readFileSync(fileState.path, \"utf8\");\n\t\tconst parsedJson = JSON.parse(fileContents);\n\n\t\tparsedJson.version = newVersion;\n\t\tif (parsedJson.packages?.[\"\"]) {\n\t\t\tparsedJson.packages[\"\"].version = newVersion; // package-lock v2 stores version here too.\n\t\t}\n\n\t\twriteFileSync(\n\t\t\tfileState.path,\n\t\t\tstringifyPackage(parsedJson, detectIndent(fileContents).indent, detectNewline(fileContents)),\n\t\t\t\"utf8\",\n\t\t);\n\t}\n}\n","// https://github.com/npm/stringify-package/blob/main/LICENSE\n// Extracted from npm/stringify-package\n//\n// Copyright npm, Inc\n//\n// Permission to use, copy, modify, and/or distribute this software for any\n// purpose with or without fee is hereby granted, provided that the above\n// copyright notice and this permission notice appear in all copies.\n//\n// THE SOFTWARE IS PROVIDED \"AS IS\" AND THE AUTHOR DISCLAIMS ALL WARRANTIES\n// WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF\n// MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR\n// ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES\n// WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN\n// ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF\n// OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.\n\nconst DEFAULT_INDENT = 2;\nconst CRLF = \"\\r\\n\";\nconst LF = \"\\n\";\n\n/**\n * @param data The object to stringify\n * @param indent `2, 4, \" \", \"\\t\"` Number of spaces a string of spaces or tab character, defaults to 2\n * @param newline `\"\\r\\n\", \"\\n\"` Windows or Unix line endings, defaults to Unix\n */\nexport function stringifyPackage(\n\tdata: object,\n\tindent?: string | number,\n\tnewline?: typeof CRLF | typeof LF,\n): string {\n\tconst stringified = JSON.stringify(data, null, indent ?? DEFAULT_INDENT);\n\n\tif (newline === CRLF) {\n\t\treturn stringified.replace(new RegExp(LF, \"g\"), CRLF);\n\t}\n\n\treturn stringified;\n}\n","import { resolve } from \"node:path\";\nimport { readFileSync, writeFileSync } from \"node:fs\";\n\nimport { fileExists } from \"../utils/file-state\";\nimport type { ForkConfig } from \"../config/schema\";\nimport type { Logger } from \"../utils/logger\";\nimport type { FileState, IFileManager } from \"./file-manager\";\n\n/**\n * A plain text file will have just the version as the content.\n *\n * @example\n * ```txt\n * 1.2.3\n * ```\n */\nexport class PlainText implements IFileManager {\n\tconstructor(\n\t\tprivate config: ForkConfig,\n\t\tprivate logger: Logger,\n\t) {}\n\n\tpublic read(fileName: string): FileState | undefined {\n\t\tconst filePath = resolve(this.config.path, fileName);\n\n\t\tif (fileExists(filePath)) {\n\t\t\tconst fileContents = readFileSync(filePath, \"utf8\");\n\n\t\t\treturn {\n\t\t\t\tname: fileName,\n\t\t\t\tpath: filePath,\n\t\t\t\tversion: fileContents || \"\",\n\t\t\t};\n\t\t}\n\n\t\tthis.logger.warn(`[File Manager] Unable to determine plain text: ${fileName}`);\n\t}\n\n\tpublic write(fileState: FileState, newVersion: string) {\n\t\twriteFileSync(fileState.path, newVersion, \"utf8\");\n\t}\n}\n","import { resolve } from \"node:path\";\nimport { readFileSync, writeFileSync } from \"node:fs\";\nimport * as cheerio from \"cheerio/lib/slim\";\n\nimport { fileExists } from \"../utils/file-state\";\nimport type { ForkConfig } from \"../config/schema\";\nimport type { Logger } from \"../utils/logger\";\nimport type { FileState, IFileManager } from \"./file-manager\";\n\n/**\n * A csproj file is an xml file with a version property under the Project > PropertyGroup node.\n *\n * @example\n * ```xml\n * <Project Sdk=\"Microsoft.NET.Sdk\">\n * <PropertyGroup>\n * <Version>1.2.3</Version>\n * </PropertyGroup>\n * </Project>\n * ```\n */\nexport class CSharpProject implements IFileManager {\n\tconstructor(\n\t\tprivate config: ForkConfig,\n\t\tprivate logger: Logger,\n\t) {}\n\n\tpublic read(fileName: string): FileState | undefined {\n\t\tconst filePath = resolve(this.config.path, fileName);\n\n\t\tif (fileExists(filePath)) {\n\t\t\tconst fileContents = readFileSync(filePath, \"utf8\");\n\t\t\tconst $ = cheerio.load(fileContents, { xmlMode: true, decodeEntities: false });\n\n\t\t\tconst version = $(\"Project > PropertyGroup > Version\").text();\n\t\t\tif (version) {\n\t\t\t\treturn {\n\t\t\t\t\tname: fileName,\n\t\t\t\t\tpath: filePath,\n\t\t\t\t\tversion: version,\n\t\t\t\t};\n\t\t\t}\n\n\t\t\tthis.logger.warn(`[File Manager] Unable to determine csproj package: ${fileName}`);\n\t\t}\n\t}\n\n\tpublic write(fileState: FileState, newVersion: string) {\n\t\tconst fileContents = readFileSync(fileState.path, \"utf8\");\n\t\tconst $ = cheerio.load(fileContents, { xmlMode: true, decodeEntities: false });\n\n\t\t$(\"Project > PropertyGroup > Version\").text(newVersion);\n\n\t\t// Cheerio doesn't handle self-closing tags well,\n\t\t// so we're manually adding a space before the closing tag.\n\t\tconst updatedContent = $.xml().replaceAll('\"/>', '\" />');\n\n\t\twriteFileSync(fileState.path, updatedContent, \"utf8\");\n\t}\n}\n","import { JSONPackage } from \"./json-package\";\nimport { PlainText } from \"./plain-text\";\nimport { CSharpProject } from \"./csharp-project\";\n\nimport type { ForkConfig } from \"../config/schema\";\nimport type { Logger } from \"../utils/logger\";\n\nexport interface FileState {\n\tname: string;\n\tpath: string;\n\tversion: string;\n\n\t[other: string]: unknown;\n}\n\nexport interface IFileManager {\n\tread(fileName: string): FileState | undefined;\n\twrite(fileState: FileState, newVersion: string): void;\n}\n\nexport class FileManager implements IFileManager {\n\tprivate JSONPackage: JSONPackage;\n\tprivate PlainText: PlainText;\n\tprivate CSharpProject: CSharpProject;\n\n\tconstructor(\n\t\tprivate config: ForkConfig,\n\t\tprivate logger: Logger,\n\t) {\n\t\tthis.JSONPackage = new JSONPackage(config, logger);\n\t\tthis.PlainText = new PlainText(config, logger);\n\t\tthis.CSharpProject = new CSharpProject(config, logger);\n\t}\n\n\t/**\n\t * Get the state from the given file name.\n\t *\n\t * @example\n\t * ```ts\n\t * fileManager.read(\"package.json\");\n\t * ```\n\t *\n\t * @returns\n\t * ```json\n\t * { \"name\": \"package.json\", \"path\": \"/path/to/package.json\", \"version\": \"1.2.3\", \"isPrivate\": true }\n\t * ```\n\t */\n\tpublic read(fileName: string): FileState | undefined {\n\t\tconst _fileName = fileName.toLowerCase();\n\n\t\tif (_fileName.endsWith(\".json\")) {\n\t\t\treturn this.JSONPackage.read(fileName);\n\t\t}\n\n\t\tif (_fileName.endsWith(\"version.txt\")) {\n\t\t\treturn this.PlainText.read(fileName);\n\t\t}\n\n\t\tif (_fileName.endsWith(\".csproj\")) {\n\t\t\treturn this.CSharpProject.read(fileName);\n\t\t}\n\n\t\tthis.logger.error(`[File Manager] Unsupported file: ${fileName}`);\n\t}\n\n\t/**\n\t * Write the new version to the given file.\n\t *\n\t * @example\n\t * ```ts\n\t * fileManager.write(\n\t * { name: \"package.json\", path: \"/path/to/package.json\", version: \"1.2.2\" },\n\t * \"1.2.3\"\n\t * );\n\t * ```\n\t */\n\tpublic write(fileState: FileState, newVersion: string): void {\n\t\tif (this.config.dryRun) {\n\t\t\treturn;\n\t\t}\n\t\tconst _fileName = fileState.name.toLowerCase();\n\n\t\tif (_fileName.endsWith(\".json\")) {\n\t\t\treturn this.JSONPackage.write(fileState, newVersion);\n\t\t}\n\n\t\tif (_fileName.endsWith(\"version.txt\")) {\n\t\t\treturn this.PlainText.write(fileState, newVersion);\n\t\t}\n\n\t\tif (_fileName.endsWith(\".csproj\")) {\n\t\t\treturn this.CSharpProject.write(fileState, newVersion);\n\t\t}\n\n\t\tthis.logger.error(`[File Manager] Unsupported file: ${fileState.path}`);\n\t}\n}\n"]}
|
|
@@ -313,7 +313,6 @@ Options:
|
|
|
313
313
|
If set, fork-version will attempt to update to this version, instead of incrementing using "conventional-commit".
|
|
314
314
|
|
|
315
315
|
Flags:
|
|
316
|
-
|
|
317
316
|
--commit-all
|
|
318
317
|
Commit all staged changes, not just files updated by fork-version.
|
|
319
318
|
--debug
|
|
@@ -832,7 +831,7 @@ var JSONPackage = class {
|
|
|
832
831
|
}
|
|
833
832
|
fs.writeFileSync(
|
|
834
833
|
fileState.path,
|
|
835
|
-
stringifyPackage(parsedJson, detectIndent__default.default(fileContents).
|
|
834
|
+
stringifyPackage(parsedJson, detectIndent__default.default(fileContents).indent, detectNewline.detectNewline(fileContents)),
|
|
836
835
|
"utf8"
|
|
837
836
|
);
|
|
838
837
|
}
|
|
@@ -966,4 +965,4 @@ exports.getUserConfig = getUserConfig;
|
|
|
966
965
|
exports.tagChanges = tagChanges;
|
|
967
966
|
exports.updateChangelog = updateChangelog;
|
|
968
967
|
//# sourceMappingURL=out.js.map
|
|
969
|
-
//# sourceMappingURL=chunk-
|
|
968
|
+
//# sourceMappingURL=chunk-UCNX6MBY.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/config/schema.ts","../src/config/user-config.ts","../src/config/defaults.ts","../src/config/cli-arguments.js","../src/config/changelog-preset-config.ts","../src/process/version.ts","../src/utils/git-tag-version.ts","../src/utils/release-type.ts","../src/process/changelog.ts","../src/utils/file-state.ts","../src/process/commit.ts","../src/utils/git.ts","../src/utils/format-commit-message.ts","../src/process/tag.ts","../src/strategies/json-package.ts","../src/libs/stringify-package.ts","../src/strategies/plain-text.ts","../src/strategies/csharp-project.ts","../src/strategies/file-manager.ts"],"names":["fileContent","parsed","semver","resolve","readFileSync","writeFileSync"],"mappings":"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","sourcesContent":["import { z } from \"zod\";\n\nconst ChangelogPresetConfigTypeSchema = z.object({\n\t/**\n\t * The type of commit message.\n\t * @example \"feat\", \"fix\", \"chore\", etc..\n\t */\n\ttype: z.string().describe('The type of commit message, such as \"feat\", \"fix\", \"chore\".'),\n\t/**\n\t * The section of the `CHANGELOG` the commit should show up in.\n\t */\n\tsection: z\n\t\t.string()\n\t\t.optional()\n\t\t.describe(\"The section of the `CHANGELOG` the commit should show up in.\"),\n\t/**\n\t * Should show in the generated changelog message?\n\t */\n\thidden: z.boolean().optional().describe(\"Should show in the generated changelog message?\"),\n});\n\nexport const ChangelogPresetConfigSchema = z.object({\n\t/**\n\t * List of explicitly supported commit message types.\n\t */\n\ttypes: z\n\t\t.array(ChangelogPresetConfigTypeSchema)\n\t\t.describe(\"List of explicitly supported commit message types.\"),\n\t/**\n\t * A URL representing a specific commit at a hash.\n\t * @default \"{{host}}/{{owner}}/{{repository}}/commit/{{hash}}\"\n\t */\n\tcommitUrlFormat: z.string().describe(\"A URL representing a specific commit at a hash.\"),\n\t/**\n\t * A URL representing the comparison between two git SHAs.\n\t * @default \"{{host}}/{{owner}}/{{repository}}/compare/{{previousTag}}...{{currentTag}}\"\n\t */\n\tcompareUrlFormat: z.string().describe(\"A URL representing the comparison between two git SHAs.\"),\n\t/**\n\t * A URL representing the issue format (allowing a different URL format to be swapped in\n\t * for Gitlab, Bitbucket, etc).\n\t * @default \"{{host}}/{{owner}}/{{repository}}/issues/{{id}}\"\n\t */\n\tissueUrlFormat: z.string().describe(\"A URL representing the issue format.\"),\n\t/**\n\t * A URL representing a user's profile on GitHub, Gitlab, etc. This URL is used\n\t * for substituting @eglavin with https://github.com/eglavin in commit messages.\n\t * @default \"{{host}}/{{user}}\"\n\t */\n\tuserUrlFormat: z.string().describe(\"A URL representing a user's profile on GitHub, Gitlab, etc.\"),\n\t/**\n\t * A string to be used to format the auto-generated release commit message.\n\t * @default \"chore(release): {{currentTag}}\"\n\t */\n\treleaseCommitMessageFormat: z\n\t\t.string()\n\t\t.describe(\"A string to be used to format the auto-generated release commit message.\"),\n\t/**\n\t * List of prefixes used to detect references to issues.\n\t * @default [\"#\"]\n\t */\n\tissuePrefixes: z\n\t\t.array(z.string())\n\t\t.describe(\"List of prefixes used to detect references to issues.\"),\n});\n\nexport const ForkConfigSchema = z.object({\n\t// Commands\n\t//\n\n\t/**\n\t * If set, fork-version will print the current version and exit.\n\t * @default false\n\t */\n\tinspectVersion: z\n\t\t.boolean()\n\t\t.describe(\"If set, fork-version will print the current version and exit.\"),\n\n\t// Options\n\t//\n\n\t/**\n\t * List of the files to be updated.\n\t * @default\n\t * ```js\n\t * [\"bower.json\", \"manifest.json\", \"npm-shrinkwrap.json\", \"package-lock.json\", \"package.json\"]\n\t * ```\n\t */\n\tfiles: z.array(z.string()).describe(\"List of the files to be updated.\"),\n\t/**\n\t * Glob pattern to match files to be updated.\n\t *\n\t * Internally we're using [glob](https://github.com/isaacs/node-glob) to match files.\n\t *\n\t * Read more about the pattern syntax [here](https://github.com/isaacs/node-glob/tree/v10.3.12?tab=readme-ov-file#glob-primer).\n\t *\n\t * @default undefined\n\t * @example \"*.json\"\n\t */\n\tglob: z.string().optional().describe(\"Glob pattern to match files to be updated.\"),\n\t/**\n\t * The path fork-version will run from.\n\t * @default\n\t * ```js\n\t * process.cwd()\n\t * ```\n\t */\n\tpath: z.string().describe('The path fork-version will run from. Defaults to \"process.cwd()\".'),\n\t/**\n\t * Name of the changelog file.\n\t * @default \"CHANGELOG.md\"\n\t */\n\tchangelog: z.string().describe('Name of the changelog file. Defaults to \"CHANGELOG.md\".'),\n\t/**\n\t * The header text for the changelog.\n\t * @default\n\t * ```markdown\n\t * # Changelog\n\t *\n\t * All notable changes to this project will be documented in this file. See [fork-version](https://github.com/eglavin/fork-version) for commit guidelines.\n\t * ```\n\t */\n\theader: z.string().describe(\"The header text for the changelog.\"),\n\t/**\n\t * Specify a prefix for the created tag.\n\t *\n\t * For instance if your version tag is prefixed by \"version/\" instead of \"v\" you have to specify\n\t * `tagPrefix: \"version/\"`.\n\t *\n\t * `tagPrefix` can also be used for a monorepo environment where you might want to deploy\n\t * multiple package from the same repository. In this case you can specify a prefix for\n\t * each package:\n\t *\n\t * | Example Value | Tag Created |\n\t * |:-------------------------|:------------------------------|\n\t * | \"\" | `1.2.3` |\n\t * | \"version/\" | `version/1.2.3` |\n\t * | \"@eglavin/fork-version-\" | `@eglavin/fork-version-1.2.3` |\n\t *\n\t * @example \"\", \"version/\", \"@eglavin/fork-version-\"\n\t * @default \"v\"\n\t */\n\ttagPrefix: z.string().describe('Specify a prefix for the created tag. Defaults to \"v\".'),\n\t/**\n\t * Make a pre-release with optional label if given value is a string.\n\t *\n\t * | Example Value | Produced Version |\n\t * |:--------------|:-----------------|\n\t * | true | `1.2.3-0` |\n\t * | \"alpha\" | `1.2.3-alpha-0` |\n\t * | \"beta\" | `1.2.3-beta-0` |\n\t *\n\t * @example true, \"alpha\", \"beta\", \"rc\"\n\t * @default undefined\n\t */\n\tpreReleaseTag: z\n\t\t.string()\n\t\t.or(z.boolean())\n\t\t.optional()\n\t\t.describe(\"Make a pre-release with optional label if given value is a string.\"),\n\t/**\n\t * If set, fork-version will use this version instead of trying to determine one.\n\t * @example \"1.0.0\"\n\t * @default undefined\n\t */\n\tcurrentVersion: z\n\t\t.string()\n\t\t.optional()\n\t\t.describe(\"If set, fork-version will use this version instead of trying to determine one.\"),\n\t/**\n\t * If set, fork-version will attempt to update to this version, instead of incrementing using \"conventional-commit\".\n\t * @example \"2.0.0\"\n\t * @default undefined\n\t */\n\tnextVersion: z\n\t\t.string()\n\t\t.optional()\n\t\t.describe(\n\t\t\t'If set, fork-version will attempt to update to this version, instead of incrementing using \"conventional-commit\".',\n\t\t),\n\n\t// Flags\n\t//\n\n\t/**\n\t * Commit all staged changes, not just files updated by fork-version.\n\t * @default false\n\t */\n\tcommitAll: z\n\t\t.boolean()\n\t\t.describe(\"Commit all staged changes, not just files updated by fork-version.\"),\n\t/**\n\t * Output debug information.\n\t * @default false\n\t */\n\tdebug: z.boolean().describe(\"Output debug information.\"),\n\t/**\n\t * No output will be written to disk or committed.\n\t * @default false\n\t */\n\tdryRun: z.boolean().describe(\"No output will be written to disk or committed.\"),\n\t/**\n\t * Run without logging to the terminal.\n\t * @default false\n\t */\n\tsilent: z.boolean().describe(\"Run without logging to the terminal.\"),\n\t/**\n\t * If unable to find a version in the given files, fallback and attempt to use the latest git tag.\n\t * @default true\n\t */\n\tgitTagFallback: z\n\t\t.boolean()\n\t\t.describe(\n\t\t\t\"If unable to find a version in the given files, fallback and attempt to use the latest git tag. Defaults to true.\",\n\t\t),\n\t/**\n\t * If true, git will sign the commit with the systems GPG key.\n\t * @see {@link https://git-scm.com/docs/git-commit#Documentation/git-commit.txt--Sltkeyidgt Git - GPG Sign Commits}\n\t * @default false\n\t */\n\tsign: z.boolean().describe(\"If true, git will sign the commit with the systems GPG key.\"),\n\t/**\n\t * If true, git will run user defined git hooks before committing.\n\t * @default false\n\t */\n\tverify: z.boolean().describe(\"If true, git will run user defined git hooks before committing.\"),\n\n\t/**\n\t * Override the default \"conventional-changelog-conventionalcommits\" preset configuration.\n\t */\n\tchangelogPresetConfig: ChangelogPresetConfigSchema.partial().describe(\n\t\t'Override the default \"conventional-changelog-conventionalcommits\" preset configuration.',\n\t),\n});\n\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\";\nimport { glob } from \"glob\";\nimport dotgitignore from \"dotgitignore\";\n\nimport { ForkConfigSchema, type ForkConfig } from \"./schema\";\nimport { DEFAULT_CONFIG } from \"./defaults\";\nimport { getCliArguments } from \"./cli-arguments\";\nimport { getChangelogPresetConfig } from \"./changelog-preset-config\";\n\n/**\n * Name of the key in the package.json file that contains the users configuration.\n */\nconst PACKAGE_JSON_CONFIG_KEY = \"fork-version\";\n\nexport async function getUserConfig(): Promise<ForkConfig> {\n\tconst cliArguments = getCliArguments();\n\n\tconst cwd = cliArguments.flags.path ? resolve(cliArguments.flags.path) : process.cwd();\n\tconst joycon = new JoyCon({\n\t\tcwd,\n\t\tpackageKey: PACKAGE_JSON_CONFIG_KEY,\n\t\tstopDir: parse(cwd).root,\n\t});\n\tconst configFilePath = await joycon.resolve([\n\t\t\"fork.config.ts\",\n\t\t\"fork.config.js\",\n\t\t\"fork.config.cjs\",\n\t\t\"fork.config.mjs\",\n\t\t\"fork.config.json\",\n\t\t\"package.json\",\n\t]);\n\n\tconst configFile = await loadConfigFile(configFilePath);\n\n\tconst mergedConfig = {\n\t\t...DEFAULT_CONFIG,\n\t\t...configFile,\n\t\t...cliArguments.flags,\n\t} as ForkConfig;\n\n\t// If the user has defined a glob pattern, use it to find the requested files.\n\tlet globResults: string[] = [];\n\tif (mergedConfig.glob) {\n\t\tglobResults = await glob(mergedConfig.glob, {\n\t\t\tcwd: cwd,\n\t\t\tignore: [\"node_modules/**\"],\n\t\t\tnodir: true,\n\t\t});\n\t}\n\n\treturn {\n\t\t...mergedConfig,\n\n\t\tpath: cwd,\n\t\tfiles: filterGitIgnoredFiles(\n\t\t\tcwd,\n\t\t\tgetFilesList(configFile?.files, cliArguments.flags?.files, globResults),\n\t\t),\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\t// Handle package.json config file.\n\t\tif (configFilePath.endsWith(\"package.json\")) {\n\t\t\tif (\n\t\t\t\tfileContent[PACKAGE_JSON_CONFIG_KEY] &&\n\t\t\t\ttypeof fileContent[PACKAGE_JSON_CONFIG_KEY] === \"object\"\n\t\t\t) {\n\t\t\t\tconst parsed = ForkConfigSchema.partial().safeParse(fileContent[PACKAGE_JSON_CONFIG_KEY]);\n\t\t\t\tif (!parsed.success) {\n\t\t\t\t\tthrow parsed.error;\n\t\t\t\t}\n\t\t\t\treturn parsed.data;\n\t\t\t}\n\n\t\t\treturn {};\n\t\t}\n\n\t\tconst parsed = ForkConfigSchema.partial().safeParse(fileContent);\n\t\tif (!parsed.success) {\n\t\t\tthrow parsed.error;\n\t\t}\n\t\treturn parsed.data;\n\t}\n\n\t// Otherwise expect config file to use js or ts.\n\tconst fileContent = await bundleRequire({ filepath: configFilePath });\n\n\tconst parsed = ForkConfigSchema.partial().safeParse(fileContent.mod.default || fileContent.mod);\n\tif (!parsed.success) {\n\t\tthrow parsed.error;\n\t}\n\treturn parsed.data;\n}\n\nfunction getFilesList(\n\tconfigFiles: string[] | undefined,\n\tcliFiles: string[] | undefined,\n\tglobResults: string[],\n): string[] {\n\tconst listOfFiles = new Set<string>();\n\n\t// Add files from the users config file\n\tif (Array.isArray(configFiles)) {\n\t\tconfigFiles.forEach((file) => listOfFiles.add(file));\n\t}\n\n\t// Add files from the cli arguments\n\tif (Array.isArray(cliFiles)) {\n\t\tcliFiles.forEach((file) => listOfFiles.add(file));\n\t}\n\n\t// Add files from glob results\n\tglobResults.forEach((file) => listOfFiles.add(file));\n\n\t// If the user has defined files use them, otherwise use the default list of files.\n\tif (listOfFiles.size) {\n\t\treturn Array.from(listOfFiles);\n\t}\n\n\treturn DEFAULT_CONFIG.files;\n}\n\nfunction filterGitIgnoredFiles(cwd: string, files: string[]) {\n\tconst dotgit = dotgitignore({ cwd });\n\n\treturn files.filter((file) => !dotgit.ignore(file));\n}\n","import type { ForkConfig } from \"./schema\";\n\nexport const DEFAULT_CONFIG: ForkConfig = {\n\t// Commands\n\tinspectVersion: false,\n\n\t// Options\n\tfiles: [\n\t\t\"package.json\",\n\t\t\"package-lock.json\",\n\t\t\"npm-shrinkwrap.json\",\n\t\t\"manifest.json\", // Chrome extensions\n\t\t\"bower.json\",\n\t],\n\tpath: process.cwd(),\n\tchangelog: \"CHANGELOG.md\",\n\theader: `# Changelog\n\nAll notable changes to this project will be documented in this file. See [fork-version](https://github.com/eglavin/fork-version) for commit guidelines.\n`,\n\ttagPrefix: \"v\",\n\n\t// Flags\n\tcommitAll: false,\n\tdebug: false,\n\tdryRun: false,\n\tsilent: false,\n\tgitTagFallback: true,\n\tsign: false,\n\tverify: false,\n\n\tchangelogPresetConfig: {},\n};\n","import meow from \"meow\";\n//@ts-check\n\n// This file is javascript so the following helper text can be extracted to the readme\n// without the need for a build step, otherwise it would also be typescript...\n\nexport const helperText = `Usage:\n $ fork-version [options]\n\nCommands:\n --help Show this help message.\n\n --inspect-version If set, fork-version will print the current version and exit.\n\nOptions:\n --files, --file, -F [Default: [\"bower.json\", \"manifest.json\", \"npm-shrinkwrap.json\", \"package-lock.json\", \"package.json\"]]\n List of the files to be updated.\n --glob, -G\n Glob pattern to match files to be updated.\n --path, -P [Default: process.cwd()]\n The path fork-version will run from.\n --changelog [Default: \"CHANGELOG.md\"]\n Name of the changelog file.\n --header\n The header text for the changelog.\n --tag-prefix [Default: \"v\"]\n Specify a prefix for the created tag.\n --pre-release-tag [Default: undefined]\n Make a pre-release with optional label if given value is a string.\n --current-version\n If set, fork-version will use this version instead of trying to determine one.\n --next-version\n If set, fork-version will attempt to update to this version, instead of incrementing using \"conventional-commit\".\n\nFlags:\n --commit-all\n Commit all staged changes, not just files updated by fork-version.\n --debug\n Output debug information.\n --dry-run\n No output will be written to disk or committed.\n --silent\n Run without logging to the terminal.\n --git-tag-fallback [Default: true]\n If unable to find a version in the given files, fallback and attempt to use the latest git tag.\n --sign\n If true, git will sign the commit with the systems GPG key.\n --verify\n If true, git will run user defined git hooks before committing.`;\n\nexport function getCliArguments() {\n\treturn meow(helperText, {\n\t\timportMeta: import.meta,\n\t\tbooleanDefault: undefined,\n\t\thelpIndent: 0,\n\t\tflags: {\n\t\t\t// Commands\n\t\t\tinspectVersion: { type: \"boolean\" },\n\n\t\t\t// Options\n\t\t\tfiles: { type: \"string\", isMultiple: true, aliases: [\"file\"], shortFlag: \"F\" },\n\t\t\tglob: { type: \"string\", shortFlag: \"G\" },\n\t\t\tpath: { type: \"string\", shortFlag: \"P\" },\n\t\t\tchangelog: { type: \"string\" },\n\t\t\theader: { type: \"string\" },\n\t\t\ttagPrefix: { type: \"string\" },\n\t\t\tpreReleaseTag: { type: \"string\" },\n\t\t\tcurrentVersion: { type: \"string\" },\n\t\t\tnextVersion: { type: \"string\" },\n\n\t\t\t// Flags\n\t\t\tcommitAll: { type: \"boolean\" },\n\t\t\tdebug: { type: \"boolean\" },\n\t\t\tdryRun: { type: \"boolean\" },\n\t\t\tsilent: { type: \"boolean\" },\n\t\t\tgitTagFallback: { type: \"boolean\" },\n\t\t\tsign: { type: \"boolean\" },\n\t\t\tverify: { type: \"boolean\" },\n\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\tlogger.log(`[Version] Using git tag fallback.`);\n\t\t\tversions.add(version);\n\t\t}\n\t}\n\n\tif (versions.size === 0) {\n\t\tthrow new Error(\"Unable to find current version\");\n\t} else if (versions.size > 1) {\n\t\tthrow new Error(\"Found multiple versions\");\n\t}\n\n\tconst currentVersion = versions.entries().next().value[0];\n\n\t// If we're just inspecting the version, output the version and exit\n\tif (config.inspectVersion) {\n\t\tconsole.log(currentVersion);\n\t\tprocess.exit(0);\n\t}\n\n\tlogger.log(`Current version: ${currentVersion}`);\n\treturn {\n\t\tfiles,\n\t\tversion: currentVersion,\n\t};\n}\n\nexport interface NextVersion {\n\tversion: string;\n\tlevel?: number;\n\tpreMajor?: boolean;\n\treason?: string;\n\treleaseType?: ReleaseType;\n}\n\nexport async function getNextVersion(\n\tconfig: ForkConfig,\n\tlogger: Logger,\n\tcurrentVersion: string,\n): Promise<NextVersion> {\n\tif (config.nextVersion && semver.valid(config.nextVersion)) {\n\t\tlogger.log(`Next version: ${config.nextVersion}`);\n\t\treturn {\n\t\t\tversion: config.nextVersion,\n\t\t};\n\t}\n\n\tconst isPreMajor = semver.lt(currentVersion, \"1.0.0\");\n\n\tlet recommendedBump: Awaited<ReturnType<typeof conventionalRecommendedBump>>;\n\ttry {\n\t\trecommendedBump = await conventionalRecommendedBump({\n\t\t\tpreset: {\n\t\t\t\tname: \"conventionalcommits\",\n\t\t\t\t...config.changelogPresetConfig,\n\t\t\t\tpreMajor: isPreMajor,\n\t\t\t},\n\t\t\tpath: config.path,\n\t\t\ttagPrefix: config.tagPrefix,\n\t\t\tcwd: config.path,\n\t\t});\n\t} catch (error) {\n\t\tthrow new Error(`[conventional-recommended-bump] Unable to determine next version`);\n\t}\n\n\tif (recommendedBump.releaseType) {\n\t\tconst releaseType = getReleaseType(\n\t\t\trecommendedBump.releaseType,\n\t\t\tcurrentVersion,\n\t\t\tconfig.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 \"\";\n\t}\n\n\tconst cleanedTags = [];\n\n\tfor (const tag of gitTags) {\n\t\tconst cleanedTag = semver.clean(tag.replace(new RegExp(`^${tagPrefix}`), \"\"));\n\n\t\tif (cleanedTag) {\n\t\t\tcleanedTags.push(cleanedTag);\n\t\t}\n\t}\n\n\treturn cleanedTags.sort(semver.rcompare)[0];\n}\n","import semver, { type ReleaseType } from \"semver\";\n\n/**\n * Get the priority of given type.\n * @example\n * - \"patch\" => 0\n * - \"minor\" => 1\n * - \"major\" => 2\n */\nfunction getPriority(type?: string): number {\n\treturn [\"patch\", \"minor\", \"major\"].indexOf(type ?? \"\");\n}\n\n/**\n * Get the given versions highest state.\n * @example\n * - \"patch\"\n * - \"minor\"\n * - \"major\"\n */\nfunction getVersionType(version: string): \"patch\" | \"minor\" | \"major\" | undefined {\n\tconst parseVersion = semver.parse(version);\n\n\tif (parseVersion?.major) {\n\t\treturn \"major\";\n\t} else if (parseVersion?.minor) {\n\t\treturn \"minor\";\n\t} else if (parseVersion?.patch) {\n\t\treturn \"patch\";\n\t}\n\n\treturn undefined;\n}\n\n/**\n * Get the recommended release type for the given version depending on if\n * the user asks for a prerelease with or without a tag.\n * ```js\n * getReleaseType(\"patch\", \"1.0.0\", false) => \"patch\"\n * getReleaseType(\"major\", \"0.0.0-beta\", \"beta\") => \"premajor\"\n * ```\n */\nexport function getReleaseType(\n\treleaseType: \"major\" | \"minor\" | \"patch\",\n\tcurrentVersion: string,\n\tpreReleaseTag?: string | boolean,\n): ReleaseType {\n\tif (!preReleaseTag) {\n\t\treturn releaseType;\n\t}\n\n\tconst currentVersionsIsPreRelease = Array.isArray(semver.prerelease(currentVersion));\n\tif (currentVersionsIsPreRelease) {\n\t\tconst currentReleaseType = getVersionType(currentVersion);\n\n\t\tif (\n\t\t\tcurrentReleaseType === releaseType ||\n\t\t\tgetPriority(currentReleaseType) > getPriority(releaseType)\n\t\t) {\n\t\t\treturn \"prerelease\";\n\t\t}\n\t}\n\n\treturn `pre${releaseType}`;\n}\n","import { resolve } from \"node:path\";\nimport { writeFileSync, readFileSync } from \"node:fs\";\nimport conventionalChangelog from \"conventional-changelog\";\n\nimport { fileExists } from \"../utils/file-state\";\nimport type { ForkConfig } from \"../config/schema\";\nimport type { Logger } from \"../utils/logger\";\n\n/**\n * Matches the following changelog header formats:\n * - `## [1.2.3]`\n * - `<a name=\"1.2.3\"></a>`\n */\nconst RELEASE_PATTERN = /(^#+ \\[?[0-9]+\\.[0-9]+\\.[0-9]+|<a name=)/m;\n\n/**\n * Get the existing changelog content from the latest release onwards.\n * @see {@link RELEASE_PATTERN}\n */\nfunction getOldReleaseContent(filePath: string, exists: boolean): string {\n\tif (exists) {\n\t\tconst fileContents = readFileSync(filePath, \"utf-8\");\n\t\tconst oldContentStart = fileContents.search(RELEASE_PATTERN);\n\n\t\tif (oldContentStart !== -1) {\n\t\t\treturn fileContents.substring(oldContentStart);\n\t\t}\n\t}\n\n\treturn \"\";\n}\n\n/**\n * Generate the new changelog content for this release.\n */\nfunction getNewReleaseContent(\n\tconfig: ForkConfig,\n\tlogger: Logger,\n\tnextVersion: string,\n): Promise<string> {\n\treturn new Promise<string>((onResolve) => {\n\t\tlet newContent = \"\";\n\n\t\tconventionalChangelog(\n\t\t\t{\n\t\t\t\tpreset: {\n\t\t\t\t\tname: \"conventionalcommits\",\n\t\t\t\t\t...config.changelogPresetConfig,\n\t\t\t\t},\n\t\t\t\ttagPrefix: config.tagPrefix,\n\t\t\t\twarn: (...message: string[]) => logger.error(\"[conventional-changelog] \", ...message),\n\t\t\t\tcwd: config.path,\n\t\t\t},\n\t\t\t{\n\t\t\t\tversion: nextVersion,\n\t\t\t},\n\t\t\t{\n\t\t\t\tmerges: null,\n\t\t\t\tpath: config.path,\n\t\t\t},\n\t\t)\n\t\t\t.on(\"error\", (error) => {\n\t\t\t\tlogger.error(\"[conventional-changelog] Unable to parse changes\");\n\t\t\t\tthrow error;\n\t\t\t})\n\t\t\t.on(\"data\", (chunk) => {\n\t\t\t\tnewContent += chunk.toString();\n\t\t\t})\n\t\t\t.on(\"end\", () => {\n\t\t\t\tonResolve(newContent);\n\t\t\t});\n\t});\n}\n\ninterface UpdateChangelog {\n\tchangelogPath: string;\n\toldContent: string;\n\tnewContent: string;\n}\n\nexport async function updateChangelog(\n\tconfig: ForkConfig,\n\tlogger: Logger,\n\tnextVersion: string,\n): Promise<UpdateChangelog> {\n\tif (config.header.search(RELEASE_PATTERN) !== -1) {\n\t\t// Need to ensure the header doesn't contain the release pattern\n\t\tthrow new Error(\"Header cannot contain release pattern\");\n\t}\n\n\t// Create the changelog file if it doesn't exist\n\tconst changelogPath = resolve(config.path, config.changelog);\n\tif (!config.dryRun && !fileExists(changelogPath)) {\n\t\tlogger.log(`Creating Changelog file: ${changelogPath}`);\n\t\twriteFileSync(changelogPath, \"\\n\", \"utf8\");\n\t}\n\n\tconst oldContent = getOldReleaseContent(changelogPath, fileExists(changelogPath));\n\tconst newContent = await getNewReleaseContent(config, logger, nextVersion);\n\n\tlogger.log(`Updating Changelog: ${changelogPath}`);\n\tif (!config.dryRun && newContent) {\n\t\twriteFileSync(\n\t\t\tchangelogPath,\n\t\t\t`${config.header}\n${newContent}\n${oldContent}\n`.trim(),\n\t\t\t\"utf8\",\n\t\t);\n\t}\n\n\treturn {\n\t\tchangelogPath,\n\t\toldContent,\n\t\tnewContent,\n\t};\n}\n","import { lstatSync } from \"fs\";\n\n/**\n * Determine if a file exists.\n * @example\n * ```ts\n * fileExists(\"~/.bashrc\"); // true\n * fileExists(\"~/missing-file.txt\"); // false\n * ```\n */\nexport function fileExists(filePath: string): boolean {\n\ttry {\n\t\treturn lstatSync(filePath).isFile();\n\t} catch (e) {\n\t\treturn false;\n\t}\n}\n","import { resolve } from \"node:path\";\nimport { Git } from \"../utils/git\";\nimport { formatCommitMessage } from \"../utils/format-commit-message\";\nimport { fileExists } from \"../utils/file-state\";\nimport type { ForkConfig } from \"../config/schema\";\nimport type { FileState } from \"../strategies/file-manager\";\nimport type { Logger } from \"../utils/logger\";\n\ninterface CommitChanges {\n\tfilesToCommit: string[];\n\tgitAddOutput?: string;\n\tgitCommitOutput?: string;\n}\n\nexport async function commitChanges(\n\tconfig: ForkConfig,\n\tlogger: Logger,\n\tfiles: FileState[],\n\tnextVersion: string,\n): Promise<CommitChanges> {\n\tconst git = new Git(config, logger);\n\n\tlogger.log(\"Committing changes\");\n\n\tconst filesToCommit: string[] = [];\n\tif (fileExists(resolve(config.path, config.changelog))) {\n\t\tfilesToCommit.push(resolve(config.path, config.changelog));\n\t}\n\tfor (const file of files) {\n\t\tfilesToCommit.push(file.path);\n\t}\n\n\t// If there are no files to commit don't continue.\n\tif (filesToCommit.length === 0) {\n\t\treturn {\n\t\t\tfilesToCommit,\n\t\t};\n\t}\n\n\tconst shouldVerify = config.verify ? undefined : \"--no-verify\";\n\tconst shouldSign = config.sign ? \"--gpg-sign\" : undefined;\n\n\t// If commitAll is set, commit all changed files.\n\tif (config.commitAll) {\n\t\treturn {\n\t\t\tfilesToCommit,\n\t\t\tgitAddOutput: await git.add(\"--all\"),\n\t\t\tgitCommitOutput: await git.commit(\n\t\t\t\tshouldVerify,\n\t\t\t\tshouldSign,\n\t\t\t\t\"--message\",\n\t\t\t\tformatCommitMessage(config.changelogPresetConfig?.releaseCommitMessageFormat, nextVersion),\n\t\t\t),\n\t\t};\n\t}\n\n\treturn {\n\t\tfilesToCommit,\n\t\tgitAddOutput: await git.add(...filesToCommit),\n\t\tgitCommitOutput: await git.commit(\n\t\t\tshouldVerify,\n\t\t\tshouldSign,\n\t\t\t...filesToCommit,\n\t\t\t\"--message\",\n\t\t\tformatCommitMessage(config.changelogPresetConfig?.releaseCommitMessageFormat, nextVersion),\n\t\t),\n\t};\n}\n","import { execFile } from \"node:child_process\";\nimport type { ForkConfig } from \"../config/schema\";\nimport type { Logger } from \"./logger\";\n\nexport class Git {\n\tconstructor(\n\t\tprivate config: ForkConfig,\n\t\tprivate logger: Logger,\n\t) {\n\t\tthis.add = this.add.bind(this);\n\t\tthis.commit = this.commit.bind(this);\n\t\tthis.tag = this.tag.bind(this);\n\t\tthis.currentBranch = this.currentBranch.bind(this);\n\t}\n\n\tpublic add(...args: (string | undefined)[]) {\n\t\tif (this.config.dryRun) {\n\t\t\treturn Promise.resolve(\"\");\n\t\t}\n\n\t\treturn this.execGit(\"add\", args.filter(Boolean) as string[]);\n\t}\n\n\tpublic commit(...args: (string | undefined)[]) {\n\t\tif (this.config.dryRun) {\n\t\t\treturn Promise.resolve(\"\");\n\t\t}\n\n\t\treturn this.execGit(\"commit\", args.filter(Boolean) as string[]);\n\t}\n\n\tpublic tag(...args: (string | undefined)[]) {\n\t\tif (this.config.dryRun) {\n\t\t\treturn Promise.resolve(\"\");\n\t\t}\n\n\t\treturn this.execGit(\"tag\", args.filter(Boolean) as string[]);\n\t}\n\n\tpublic async currentBranch() {\n\t\treturn (await this.execGit(\"rev-parse\", [\"--abbrev-ref\", \"HEAD\"])).trim();\n\t}\n\n\tprivate execGit(command: string, args: string[]): Promise<string> {\n\t\tthis.logger.debug(`[git ${command}] ${args.join(\" \")}`);\n\n\t\treturn new Promise((onResolve, onReject) => {\n\t\t\texecFile(\n\t\t\t\t\"git\",\n\t\t\t\t[command, ...args],\n\t\t\t\t{\n\t\t\t\t\tcwd: this.config.path,\n\t\t\t\t},\n\t\t\t\t(error, stdout, stderr) => {\n\t\t\t\t\tif (error) {\n\t\t\t\t\t\tthis.logger.error(`[git ${command}] `);\n\t\t\t\t\t\tonReject(error);\n\t\t\t\t\t}\n\n\t\t\t\t\tonResolve(stdout ? stdout : stderr);\n\t\t\t\t},\n\t\t\t);\n\t\t});\n\t}\n}\n","/**\n * Formats the commit message by replacing the `{{currentTag}}` placeholder\n * globally with the new version.\n *\n * Falls back to `chore(release): {{currentTag}}` if message is argument is falsy.\n */\nexport function formatCommitMessage(message: string | undefined, version: string): string {\n\tif (!message) {\n\t\tmessage = \"chore(release): {{currentTag}}\";\n\t}\n\n\treturn message.replace(new RegExp(\"{{currentTag}}\", \"g\"), version);\n}\n","import { Git } from \"../utils/git\";\nimport { formatCommitMessage } from \"../utils/format-commit-message\";\nimport type { ForkConfig } from \"../config/schema\";\nimport type { Logger } from \"../utils/logger\";\n\ninterface TagChanges {\n\tgitTagOutput: string;\n}\n\nexport async function tagChanges(\n\tconfig: ForkConfig,\n\tlogger: Logger,\n\tnextVersion: string,\n): Promise<TagChanges> {\n\tconst git = new Git(config, logger);\n\n\t/** @example \"v1.2.3\" or \"version/1.2.3\" */\n\tconst tag = `${config.tagPrefix}${nextVersion}`;\n\n\tlogger.log(`Creating Tag: ${tag}`);\n\n\tconst gitTagOutput = await git.tag(\n\t\tconfig.sign ? \"--sign\" : \"--annotate\",\n\t\ttag,\n\t\t\"--message\",\n\t\tformatCommitMessage(config.changelogPresetConfig?.releaseCommitMessageFormat, nextVersion),\n\t);\n\n\treturn {\n\t\tgitTagOutput,\n\t};\n}\n","import { resolve } from \"node:path\";\nimport { readFileSync, writeFileSync } from \"node:fs\";\nimport detectIndent from \"detect-indent\";\nimport { detectNewline } from \"detect-newline\";\n\nimport { stringifyPackage } from \"../libs/stringify-package\";\nimport { fileExists } from \"../utils/file-state\";\nimport type { ForkConfig } from \"../config/schema\";\nimport type { Logger } from \"../utils/logger\";\nimport type { FileState, IFileManager } from \"./file-manager\";\n\n/**\n * A json package file should have a version property, like what can be seen\n * in the package.json file in the root of this project.\n *\n * @example\n * ```json\n * {\n * \"name\": \"fork-version\",\n * \"version\": \"1.2.3\",\n * \"private\": true,\n * }\n * ```\n */\nexport class JSONPackage implements IFileManager {\n\tconstructor(\n\t\tprivate config: ForkConfig,\n\t\tprivate logger: Logger,\n\t) {}\n\n\tpublic read(fileName: string): FileState | undefined {\n\t\tconst filePath = resolve(this.config.path, fileName);\n\n\t\tif (fileExists(filePath)) {\n\t\t\tconst fileContents = readFileSync(filePath, \"utf8\");\n\t\t\tconst parsedJson = JSON.parse(fileContents);\n\n\t\t\tif (parsedJson.version) {\n\t\t\t\treturn {\n\t\t\t\t\tname: fileName,\n\t\t\t\t\tpath: filePath,\n\t\t\t\t\tversion: parsedJson.version,\n\n\t\t\t\t\tisPrivate: typeof parsedJson?.private === \"boolean\" ? parsedJson.private : true,\n\t\t\t\t};\n\t\t\t}\n\n\t\t\tthis.logger.warn(`[File Manager] Unable to determine json package: ${fileName}`);\n\t\t}\n\t}\n\n\tpublic write(fileState: FileState, newVersion: string) {\n\t\tconst fileContents = readFileSync(fileState.path, \"utf8\");\n\t\tconst parsedJson = JSON.parse(fileContents);\n\n\t\tparsedJson.version = newVersion;\n\t\tif (parsedJson.packages?.[\"\"]) {\n\t\t\tparsedJson.packages[\"\"].version = newVersion; // package-lock v2 stores version here too.\n\t\t}\n\n\t\twriteFileSync(\n\t\t\tfileState.path,\n\t\t\tstringifyPackage(parsedJson, detectIndent(fileContents).indent, detectNewline(fileContents)),\n\t\t\t\"utf8\",\n\t\t);\n\t}\n}\n","// https://github.com/npm/stringify-package/blob/main/LICENSE\n// Extracted from npm/stringify-package\n//\n// Copyright npm, Inc\n//\n// Permission to use, copy, modify, and/or distribute this software for any\n// purpose with or without fee is hereby granted, provided that the above\n// copyright notice and this permission notice appear in all copies.\n//\n// THE SOFTWARE IS PROVIDED \"AS IS\" AND THE AUTHOR DISCLAIMS ALL WARRANTIES\n// WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF\n// MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR\n// ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES\n// WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN\n// ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF\n// OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.\n\nconst DEFAULT_INDENT = 2;\nconst CRLF = \"\\r\\n\";\nconst LF = \"\\n\";\n\n/**\n * @param data The object to stringify\n * @param indent `2, 4, \" \", \"\\t\"` Number of spaces a string of spaces or tab character, defaults to 2\n * @param newline `\"\\r\\n\", \"\\n\"` Windows or Unix line endings, defaults to Unix\n */\nexport function stringifyPackage(\n\tdata: object,\n\tindent?: string | number,\n\tnewline?: typeof CRLF | typeof LF,\n): string {\n\tconst stringified = JSON.stringify(data, null, indent ?? DEFAULT_INDENT);\n\n\tif (newline === CRLF) {\n\t\treturn stringified.replace(new RegExp(LF, \"g\"), CRLF);\n\t}\n\n\treturn stringified;\n}\n","import { resolve } from \"node:path\";\nimport { readFileSync, writeFileSync } from \"node:fs\";\n\nimport { fileExists } from \"../utils/file-state\";\nimport type { ForkConfig } from \"../config/schema\";\nimport type { Logger } from \"../utils/logger\";\nimport type { FileState, IFileManager } from \"./file-manager\";\n\n/**\n * A plain text file will have just the version as the content.\n *\n * @example\n * ```txt\n * 1.2.3\n * ```\n */\nexport class PlainText implements IFileManager {\n\tconstructor(\n\t\tprivate config: ForkConfig,\n\t\tprivate logger: Logger,\n\t) {}\n\n\tpublic read(fileName: string): FileState | undefined {\n\t\tconst filePath = resolve(this.config.path, fileName);\n\n\t\tif (fileExists(filePath)) {\n\t\t\tconst fileContents = readFileSync(filePath, \"utf8\");\n\n\t\t\treturn {\n\t\t\t\tname: fileName,\n\t\t\t\tpath: filePath,\n\t\t\t\tversion: fileContents || \"\",\n\t\t\t};\n\t\t}\n\n\t\tthis.logger.warn(`[File Manager] Unable to determine plain text: ${fileName}`);\n\t}\n\n\tpublic write(fileState: FileState, newVersion: string) {\n\t\twriteFileSync(fileState.path, newVersion, \"utf8\");\n\t}\n}\n","import { resolve } from \"node:path\";\nimport { readFileSync, writeFileSync } from \"node:fs\";\nimport * as cheerio from \"cheerio/lib/slim\";\n\nimport { fileExists } from \"../utils/file-state\";\nimport type { ForkConfig } from \"../config/schema\";\nimport type { Logger } from \"../utils/logger\";\nimport type { FileState, IFileManager } from \"./file-manager\";\n\n/**\n * A csproj file is an xml file with a version property under the Project > PropertyGroup node.\n *\n * @example\n * ```xml\n * <Project Sdk=\"Microsoft.NET.Sdk\">\n * <PropertyGroup>\n * <Version>1.2.3</Version>\n * </PropertyGroup>\n * </Project>\n * ```\n */\nexport class CSharpProject implements IFileManager {\n\tconstructor(\n\t\tprivate config: ForkConfig,\n\t\tprivate logger: Logger,\n\t) {}\n\n\tpublic read(fileName: string): FileState | undefined {\n\t\tconst filePath = resolve(this.config.path, fileName);\n\n\t\tif (fileExists(filePath)) {\n\t\t\tconst fileContents = readFileSync(filePath, \"utf8\");\n\t\t\tconst $ = cheerio.load(fileContents, { xmlMode: true, decodeEntities: false });\n\n\t\t\tconst version = $(\"Project > PropertyGroup > Version\").text();\n\t\t\tif (version) {\n\t\t\t\treturn {\n\t\t\t\t\tname: fileName,\n\t\t\t\t\tpath: filePath,\n\t\t\t\t\tversion: version,\n\t\t\t\t};\n\t\t\t}\n\n\t\t\tthis.logger.warn(`[File Manager] Unable to determine csproj package: ${fileName}`);\n\t\t}\n\t}\n\n\tpublic write(fileState: FileState, newVersion: string) {\n\t\tconst fileContents = readFileSync(fileState.path, \"utf8\");\n\t\tconst $ = cheerio.load(fileContents, { xmlMode: true, decodeEntities: false });\n\n\t\t$(\"Project > PropertyGroup > Version\").text(newVersion);\n\n\t\t// Cheerio doesn't handle self-closing tags well,\n\t\t// so we're manually adding a space before the closing tag.\n\t\tconst updatedContent = $.xml().replaceAll('\"/>', '\" />');\n\n\t\twriteFileSync(fileState.path, updatedContent, \"utf8\");\n\t}\n}\n","import { JSONPackage } from \"./json-package\";\nimport { PlainText } from \"./plain-text\";\nimport { CSharpProject } from \"./csharp-project\";\n\nimport type { ForkConfig } from \"../config/schema\";\nimport type { Logger } from \"../utils/logger\";\n\nexport interface FileState {\n\tname: string;\n\tpath: string;\n\tversion: string;\n\n\t[other: string]: unknown;\n}\n\nexport interface IFileManager {\n\tread(fileName: string): FileState | undefined;\n\twrite(fileState: FileState, newVersion: string): void;\n}\n\nexport class FileManager implements IFileManager {\n\tprivate JSONPackage: JSONPackage;\n\tprivate PlainText: PlainText;\n\tprivate CSharpProject: CSharpProject;\n\n\tconstructor(\n\t\tprivate config: ForkConfig,\n\t\tprivate logger: Logger,\n\t) {\n\t\tthis.JSONPackage = new JSONPackage(config, logger);\n\t\tthis.PlainText = new PlainText(config, logger);\n\t\tthis.CSharpProject = new CSharpProject(config, logger);\n\t}\n\n\t/**\n\t * Get the state from the given file name.\n\t *\n\t * @example\n\t * ```ts\n\t * fileManager.read(\"package.json\");\n\t * ```\n\t *\n\t * @returns\n\t * ```json\n\t * { \"name\": \"package.json\", \"path\": \"/path/to/package.json\", \"version\": \"1.2.3\", \"isPrivate\": true }\n\t * ```\n\t */\n\tpublic read(fileName: string): FileState | undefined {\n\t\tconst _fileName = fileName.toLowerCase();\n\n\t\tif (_fileName.endsWith(\".json\")) {\n\t\t\treturn this.JSONPackage.read(fileName);\n\t\t}\n\n\t\tif (_fileName.endsWith(\"version.txt\")) {\n\t\t\treturn this.PlainText.read(fileName);\n\t\t}\n\n\t\tif (_fileName.endsWith(\".csproj\")) {\n\t\t\treturn this.CSharpProject.read(fileName);\n\t\t}\n\n\t\tthis.logger.error(`[File Manager] Unsupported file: ${fileName}`);\n\t}\n\n\t/**\n\t * Write the new version to the given file.\n\t *\n\t * @example\n\t * ```ts\n\t * fileManager.write(\n\t * { name: \"package.json\", path: \"/path/to/package.json\", version: \"1.2.2\" },\n\t * \"1.2.3\"\n\t * );\n\t * ```\n\t */\n\tpublic write(fileState: FileState, newVersion: string): void {\n\t\tif (this.config.dryRun) {\n\t\t\treturn;\n\t\t}\n\t\tconst _fileName = fileState.name.toLowerCase();\n\n\t\tif (_fileName.endsWith(\".json\")) {\n\t\t\treturn this.JSONPackage.write(fileState, newVersion);\n\t\t}\n\n\t\tif (_fileName.endsWith(\"version.txt\")) {\n\t\t\treturn this.PlainText.write(fileState, newVersion);\n\t\t}\n\n\t\tif (_fileName.endsWith(\".csproj\")) {\n\t\t\treturn this.CSharpProject.write(fileState, newVersion);\n\t\t}\n\n\t\tthis.logger.error(`[File Manager] Unsupported file: ${fileState.path}`);\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
|
|
4
|
+
var chunkUCNX6MBY_cjs = require('./chunk-UCNX6MBY.cjs');
|
|
5
5
|
var fs = require('fs');
|
|
6
6
|
var path = require('path');
|
|
7
7
|
|
|
@@ -40,7 +40,7 @@ var Logger = class {
|
|
|
40
40
|
|
|
41
41
|
// src/process/message.ts
|
|
42
42
|
async function completedMessage(config, logger, files, releaseType) {
|
|
43
|
-
const git = new
|
|
43
|
+
const git = new chunkUCNX6MBY_cjs.Git(config, logger);
|
|
44
44
|
const branchName = await git.currentBranch();
|
|
45
45
|
logger.log(
|
|
46
46
|
`
|
|
@@ -57,21 +57,21 @@ Run \`git push --follow-tags origin ${branchName}\` to push the changes and the
|
|
|
57
57
|
// src/cli.ts
|
|
58
58
|
async function runFork() {
|
|
59
59
|
const startTime = Date.now();
|
|
60
|
-
const config = await
|
|
60
|
+
const config = await chunkUCNX6MBY_cjs.getUserConfig();
|
|
61
61
|
const logger = new Logger(config);
|
|
62
|
-
const fileManager = new
|
|
62
|
+
const fileManager = new chunkUCNX6MBY_cjs.FileManager(config, logger);
|
|
63
63
|
logger.log(`Running fork-version - ${(/* @__PURE__ */ new Date()).toUTCString()}`);
|
|
64
64
|
logger.log(config.dryRun ? "[DRY RUN] No changes will be written to disk.\n" : "");
|
|
65
|
-
const current = await
|
|
66
|
-
const next = await
|
|
65
|
+
const current = await chunkUCNX6MBY_cjs.getCurrentVersion(config, logger, fileManager);
|
|
66
|
+
const next = await chunkUCNX6MBY_cjs.getNextVersion(config, logger, current.version);
|
|
67
67
|
logger.log("Updating Files: ");
|
|
68
68
|
for (const outFile of current.files) {
|
|
69
69
|
logger.log(` - ${outFile.path}`);
|
|
70
70
|
fileManager.write(outFile, next.version);
|
|
71
71
|
}
|
|
72
|
-
const changelogResult = await
|
|
73
|
-
const commitResult = await
|
|
74
|
-
const tagResult = await
|
|
72
|
+
const changelogResult = await chunkUCNX6MBY_cjs.updateChangelog(config, logger, next.version);
|
|
73
|
+
const commitResult = await chunkUCNX6MBY_cjs.commitChanges(config, logger, current.files, next.version);
|
|
74
|
+
const tagResult = await chunkUCNX6MBY_cjs.tagChanges(config, logger, next.version);
|
|
75
75
|
await completedMessage(config, logger, current.files, next.releaseType);
|
|
76
76
|
logger.debug(`Completed in ${Date.now() - startTime} ms`);
|
|
77
77
|
const result = {
|
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-
|
|
2
|
+
import { getUserConfig, FileManager, getCurrentVersion, getNextVersion, updateChangelog, commitChanges, tagChanges, Git } from './chunk-B3CLPRGG.js';
|
|
3
3
|
import { writeFileSync } from 'fs';
|
|
4
4
|
import { join } from 'path';
|
|
5
5
|
|
package/dist/index.cjs
CHANGED
|
@@ -1,44 +1,44 @@
|
|
|
1
1
|
'use strict';
|
|
2
2
|
|
|
3
|
-
var
|
|
3
|
+
var chunkUCNX6MBY_cjs = require('./chunk-UCNX6MBY.cjs');
|
|
4
4
|
|
|
5
5
|
|
|
6
6
|
|
|
7
7
|
Object.defineProperty(exports, "FileManager", {
|
|
8
8
|
enumerable: true,
|
|
9
|
-
get: function () { return
|
|
9
|
+
get: function () { return chunkUCNX6MBY_cjs.FileManager; }
|
|
10
10
|
});
|
|
11
11
|
Object.defineProperty(exports, "ForkConfigSchema", {
|
|
12
12
|
enumerable: true,
|
|
13
|
-
get: function () { return
|
|
13
|
+
get: function () { return chunkUCNX6MBY_cjs.ForkConfigSchema; }
|
|
14
14
|
});
|
|
15
15
|
Object.defineProperty(exports, "commitChanges", {
|
|
16
16
|
enumerable: true,
|
|
17
|
-
get: function () { return
|
|
17
|
+
get: function () { return chunkUCNX6MBY_cjs.commitChanges; }
|
|
18
18
|
});
|
|
19
19
|
Object.defineProperty(exports, "defineConfig", {
|
|
20
20
|
enumerable: true,
|
|
21
|
-
get: function () { return
|
|
21
|
+
get: function () { return chunkUCNX6MBY_cjs.defineConfig; }
|
|
22
22
|
});
|
|
23
23
|
Object.defineProperty(exports, "getCurrentVersion", {
|
|
24
24
|
enumerable: true,
|
|
25
|
-
get: function () { return
|
|
25
|
+
get: function () { return chunkUCNX6MBY_cjs.getCurrentVersion; }
|
|
26
26
|
});
|
|
27
27
|
Object.defineProperty(exports, "getNextVersion", {
|
|
28
28
|
enumerable: true,
|
|
29
|
-
get: function () { return
|
|
29
|
+
get: function () { return chunkUCNX6MBY_cjs.getNextVersion; }
|
|
30
30
|
});
|
|
31
31
|
Object.defineProperty(exports, "getUserConfig", {
|
|
32
32
|
enumerable: true,
|
|
33
|
-
get: function () { return
|
|
33
|
+
get: function () { return chunkUCNX6MBY_cjs.getUserConfig; }
|
|
34
34
|
});
|
|
35
35
|
Object.defineProperty(exports, "tagChanges", {
|
|
36
36
|
enumerable: true,
|
|
37
|
-
get: function () { return
|
|
37
|
+
get: function () { return chunkUCNX6MBY_cjs.tagChanges; }
|
|
38
38
|
});
|
|
39
39
|
Object.defineProperty(exports, "updateChangelog", {
|
|
40
40
|
enumerable: true,
|
|
41
|
-
get: function () { return
|
|
41
|
+
get: function () { return chunkUCNX6MBY_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-
|
|
1
|
+
export { FileManager, ForkConfigSchema, commitChanges, defineConfig, getCurrentVersion, getNextVersion, getUserConfig, tagChanges, updateChangelog } from './chunk-B3CLPRGG.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.
|
|
3
|
+
"version": "1.4.73",
|
|
4
4
|
"license": "MIT",
|
|
5
5
|
"description": "Fork-Version automates version control tasks such as determining, updating, and committing versions, files, and changelogs, simplifying the process when adhering to the conventional commit standard.",
|
|
6
6
|
"keywords": [
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/config/schema.ts","../src/config/user-config.ts","../src/config/defaults.ts","../src/config/cli-arguments.js","../src/config/changelog-preset-config.ts","../src/process/version.ts","../src/utils/git-tag-version.ts","../src/utils/release-type.ts","../src/process/changelog.ts","../src/utils/file-state.ts","../src/process/commit.ts","../src/utils/git.ts","../src/utils/format-commit-message.ts","../src/process/tag.ts","../src/strategies/json-package.ts","../src/libs/stringify-package.ts","../src/strategies/plain-text.ts","../src/strategies/csharp-project.ts","../src/strategies/file-manager.ts"],"names":["fileContent","parsed","semver","resolve","readFileSync","writeFileSync"],"mappings":"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","sourcesContent":["import { z } from \"zod\";\n\nconst ChangelogPresetConfigTypeSchema = z.object({\n\t/**\n\t * The type of commit message.\n\t * @example \"feat\", \"fix\", \"chore\", etc..\n\t */\n\ttype: z.string().describe('The type of commit message, such as \"feat\", \"fix\", \"chore\".'),\n\t/**\n\t * The section of the `CHANGELOG` the commit should show up in.\n\t */\n\tsection: z\n\t\t.string()\n\t\t.optional()\n\t\t.describe(\"The section of the `CHANGELOG` the commit should show up in.\"),\n\t/**\n\t * Should show in the generated changelog message?\n\t */\n\thidden: z.boolean().optional().describe(\"Should show in the generated changelog message?\"),\n});\n\nexport const ChangelogPresetConfigSchema = z.object({\n\t/**\n\t * List of explicitly supported commit message types.\n\t */\n\ttypes: z\n\t\t.array(ChangelogPresetConfigTypeSchema)\n\t\t.describe(\"List of explicitly supported commit message types.\"),\n\t/**\n\t * A URL representing a specific commit at a hash.\n\t * @default \"{{host}}/{{owner}}/{{repository}}/commit/{{hash}}\"\n\t */\n\tcommitUrlFormat: z.string().describe(\"A URL representing a specific commit at a hash.\"),\n\t/**\n\t * A URL representing the comparison between two git SHAs.\n\t * @default \"{{host}}/{{owner}}/{{repository}}/compare/{{previousTag}}...{{currentTag}}\"\n\t */\n\tcompareUrlFormat: z.string().describe(\"A URL representing the comparison between two git SHAs.\"),\n\t/**\n\t * A URL representing the issue format (allowing a different URL format to be swapped in\n\t * for Gitlab, Bitbucket, etc).\n\t * @default \"{{host}}/{{owner}}/{{repository}}/issues/{{id}}\"\n\t */\n\tissueUrlFormat: z.string().describe(\"A URL representing the issue format.\"),\n\t/**\n\t * A URL representing a user's profile on GitHub, Gitlab, etc. This URL is used\n\t * for substituting @eglavin with https://github.com/eglavin in commit messages.\n\t * @default \"{{host}}/{{user}}\"\n\t */\n\tuserUrlFormat: z.string().describe(\"A URL representing a user's profile on GitHub, Gitlab, etc.\"),\n\t/**\n\t * A string to be used to format the auto-generated release commit message.\n\t * @default \"chore(release): {{currentTag}}\"\n\t */\n\treleaseCommitMessageFormat: z\n\t\t.string()\n\t\t.describe(\"A string to be used to format the auto-generated release commit message.\"),\n\t/**\n\t * List of prefixes used to detect references to issues.\n\t * @default [\"#\"]\n\t */\n\tissuePrefixes: z\n\t\t.array(z.string())\n\t\t.describe(\"List of prefixes used to detect references to issues.\"),\n});\n\nexport type ChangelogPresetConfig = z.infer<typeof ChangelogPresetConfigSchema>;\n\nexport const ForkConfigSchema = z.object({\n\t// Commands\n\t//\n\n\t/**\n\t * If set, fork-version will print the current version and exit.\n\t * @default false\n\t */\n\tinspectVersion: z\n\t\t.boolean()\n\t\t.describe(\"If set, fork-version will print the current version and exit.\"),\n\n\t// Options\n\t//\n\n\t/**\n\t * List of the files to be updated.\n\t * @default\n\t * ```js\n\t * [\"bower.json\", \"manifest.json\", \"npm-shrinkwrap.json\", \"package-lock.json\", \"package.json\"]\n\t * ```\n\t */\n\tfiles: z.array(z.string()).describe(\"List of the files to be updated.\"),\n\t/**\n\t * Glob pattern to match files to be updated.\n\t *\n\t * Internally we're using [glob](https://github.com/isaacs/node-glob) to match files.\n\t *\n\t * Read more about the pattern syntax [here](https://github.com/isaacs/node-glob/tree/v10.3.12?tab=readme-ov-file#glob-primer).\n\t *\n\t * @default undefined\n\t * @example \"*.json\"\n\t */\n\tglob: z.string().optional().describe(\"Glob pattern to match files to be updated.\"),\n\t/**\n\t * The path fork-version will run from.\n\t * @default\n\t * ```js\n\t * process.cwd()\n\t * ```\n\t */\n\tpath: z.string().describe('The path fork-version will run from. Defaults to \"process.cwd()\".'),\n\t/**\n\t * Name of the changelog file.\n\t * @default \"CHANGELOG.md\"\n\t */\n\tchangelog: z.string().describe('Name of the changelog file. Defaults to \"CHANGELOG.md\".'),\n\t/**\n\t * The header text for the changelog.\n\t * @default\n\t * ```markdown\n\t * # Changelog\n\t *\n\t * All notable changes to this project will be documented in this file. See [fork-version](https://github.com/eglavin/fork-version) for commit guidelines.\n\t * ```\n\t */\n\theader: z.string().describe(\"The header text for the changelog.\"),\n\t/**\n\t * Specify a prefix for the created tag.\n\t *\n\t * For instance if your version tag is prefixed by \"version/\" instead of \"v\" you have to specify\n\t * `tagPrefix: \"version/\"`.\n\t *\n\t * `tagPrefix` can also be used for a monorepo environment where you might want to deploy\n\t * multiple package from the same repository. In this case you can specify a prefix for\n\t * each package:\n\t *\n\t * | Example Value | Tag Created |\n\t * |:-------------------------|:------------------------------|\n\t * | \"\" | `1.2.3` |\n\t * | \"version/\" | `version/1.2.3` |\n\t * | \"@eglavin/fork-version-\" | `@eglavin/fork-version-1.2.3` |\n\t *\n\t * @example \"\", \"version/\", \"@eglavin/fork-version-\"\n\t * @default \"v\"\n\t */\n\ttagPrefix: z.string().describe('Specify a prefix for the created tag. Defaults to \"v\".'),\n\t/**\n\t * Make a pre-release with optional label if given value is a string.\n\t *\n\t * | Example Value | Produced Version |\n\t * |:--------------|:-----------------|\n\t * | true | `1.2.3-0` |\n\t * | \"alpha\" | `1.2.3-alpha-0` |\n\t * | \"beta\" | `1.2.3-beta-0` |\n\t *\n\t * @example true, \"alpha\", \"beta\", \"rc\"\n\t * @default undefined\n\t */\n\tpreReleaseTag: z\n\t\t.string()\n\t\t.or(z.boolean())\n\t\t.optional()\n\t\t.describe(\"Make a pre-release with optional label if given value is a string.\"),\n\t/**\n\t * If set, fork-version will use this version instead of trying to determine one.\n\t * @example \"1.0.0\"\n\t * @default undefined\n\t */\n\tcurrentVersion: z\n\t\t.string()\n\t\t.optional()\n\t\t.describe(\"If set, fork-version will use this version instead of trying to determine one.\"),\n\t/**\n\t * If set, fork-version will attempt to update to this version, instead of incrementing using \"conventional-commit\".\n\t * @example \"2.0.0\"\n\t * @default undefined\n\t */\n\tnextVersion: z\n\t\t.string()\n\t\t.optional()\n\t\t.describe(\n\t\t\t'If set, fork-version will attempt to update to this version, instead of incrementing using \"conventional-commit\".',\n\t\t),\n\n\t// Flags\n\t//\n\n\t/**\n\t * Commit all staged changes, not just files updated by fork-version.\n\t * @default false\n\t */\n\tcommitAll: z\n\t\t.boolean()\n\t\t.describe(\"Commit all staged changes, not just files updated by fork-version.\"),\n\t/**\n\t * Output debug information.\n\t * @default false\n\t */\n\tdebug: z.boolean().describe(\"Output debug information.\"),\n\t/**\n\t * No output will be written to disk or committed.\n\t * @default false\n\t */\n\tdryRun: z.boolean().describe(\"No output will be written to disk or committed.\"),\n\t/**\n\t * Run without logging to the terminal.\n\t * @default false\n\t */\n\tsilent: z.boolean().describe(\"Run without logging to the terminal.\"),\n\t/**\n\t * If unable to find a version in the given files, fallback and attempt to use the latest git tag.\n\t * @default true\n\t */\n\tgitTagFallback: z\n\t\t.boolean()\n\t\t.describe(\n\t\t\t\"If unable to find a version in the given files, fallback and attempt to use the latest git tag. Defaults to true.\",\n\t\t),\n\t/**\n\t * If true, git will sign the commit with the systems GPG key.\n\t * @see {@link https://git-scm.com/docs/git-commit#Documentation/git-commit.txt--Sltkeyidgt Git - GPG Sign Commits}\n\t * @default false\n\t */\n\tsign: z.boolean().describe(\"If true, git will sign the commit with the systems GPG key.\"),\n\t/**\n\t * If true, git will run user defined git hooks before committing.\n\t * @default false\n\t */\n\tverify: z.boolean().describe(\"If true, git will run user defined git hooks before committing.\"),\n\n\t/**\n\t * Override the default \"conventional-changelog-conventionalcommits\" preset configuration.\n\t */\n\tchangelogPresetConfig: ChangelogPresetConfigSchema.partial().describe(\n\t\t'Override the default \"conventional-changelog-conventionalcommits\" preset configuration.',\n\t),\n});\n\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\";\nimport { glob } from \"glob\";\nimport dotgitignore from \"dotgitignore\";\n\nimport { ForkConfigSchema, type ForkConfig } from \"./schema\";\nimport { DEFAULT_CONFIG } from \"./defaults\";\nimport { getCliArguments } from \"./cli-arguments\";\nimport { getChangelogPresetConfig } from \"./changelog-preset-config\";\n\n/**\n * Name of the key in the package.json file that contains the users configuration.\n */\nconst PACKAGE_JSON_CONFIG_KEY = \"fork-version\";\n\nexport async function getUserConfig(): Promise<ForkConfig> {\n\tconst cliArguments = getCliArguments();\n\n\tconst cwd = cliArguments.flags.path ? resolve(cliArguments.flags.path) : process.cwd();\n\tconst joycon = new JoyCon({\n\t\tcwd,\n\t\tpackageKey: PACKAGE_JSON_CONFIG_KEY,\n\t\tstopDir: parse(cwd).root,\n\t});\n\tconst configFilePath = await joycon.resolve([\n\t\t\"fork.config.ts\",\n\t\t\"fork.config.js\",\n\t\t\"fork.config.cjs\",\n\t\t\"fork.config.mjs\",\n\t\t\"fork.config.json\",\n\t\t\"package.json\",\n\t]);\n\n\tconst configFile = await loadConfigFile(configFilePath);\n\n\tconst mergedConfig = {\n\t\t...DEFAULT_CONFIG,\n\t\t...configFile,\n\t\t...cliArguments.flags,\n\t} as ForkConfig;\n\n\t// If the user has defined a glob pattern, use it to find the requested files.\n\tlet globResults: string[] = [];\n\tif (mergedConfig.glob) {\n\t\tglobResults = await glob(mergedConfig.glob, {\n\t\t\tcwd: cwd,\n\t\t\tignore: [\"node_modules/**\"],\n\t\t\tnodir: true,\n\t\t});\n\t}\n\n\treturn {\n\t\t...mergedConfig,\n\n\t\tpath: cwd,\n\t\tfiles: filterGitIgnoredFiles(\n\t\t\tcwd,\n\t\t\tgetFilesList(configFile?.files, cliArguments.flags?.files, globResults),\n\t\t),\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\t// Handle package.json config file.\n\t\tif (configFilePath.endsWith(\"package.json\")) {\n\t\t\tif (\n\t\t\t\tfileContent[PACKAGE_JSON_CONFIG_KEY] &&\n\t\t\t\ttypeof fileContent[PACKAGE_JSON_CONFIG_KEY] === \"object\"\n\t\t\t) {\n\t\t\t\tconst parsed = ForkConfigSchema.partial().safeParse(fileContent[PACKAGE_JSON_CONFIG_KEY]);\n\t\t\t\tif (!parsed.success) {\n\t\t\t\t\tthrow parsed.error;\n\t\t\t\t}\n\t\t\t\treturn parsed.data;\n\t\t\t}\n\n\t\t\treturn {};\n\t\t}\n\n\t\tconst parsed = ForkConfigSchema.partial().safeParse(fileContent);\n\t\tif (!parsed.success) {\n\t\t\tthrow parsed.error;\n\t\t}\n\t\treturn parsed.data;\n\t}\n\n\t// Otherwise expect config file to use js or ts.\n\tconst fileContent = await bundleRequire({ filepath: configFilePath });\n\n\tconst parsed = ForkConfigSchema.partial().safeParse(fileContent.mod.default || fileContent.mod);\n\tif (!parsed.success) {\n\t\tthrow parsed.error;\n\t}\n\treturn parsed.data;\n}\n\nfunction getFilesList(\n\tconfigFiles: string[] | undefined,\n\tcliFiles: string[] | undefined,\n\tglobResults: string[],\n): string[] {\n\tconst listOfFiles = new Set<string>();\n\n\t// Add files from the users config file\n\tif (Array.isArray(configFiles)) {\n\t\tconfigFiles.forEach((file) => listOfFiles.add(file));\n\t}\n\n\t// Add files from the cli arguments\n\tif (Array.isArray(cliFiles)) {\n\t\tcliFiles.forEach((file) => listOfFiles.add(file));\n\t}\n\n\t// Add files from glob results\n\tglobResults.forEach((file) => listOfFiles.add(file));\n\n\t// If the user has defined files use them, otherwise use the default list of files.\n\tif (listOfFiles.size) {\n\t\treturn Array.from(listOfFiles);\n\t}\n\n\treturn DEFAULT_CONFIG.files;\n}\n\nfunction filterGitIgnoredFiles(cwd: string, files: string[]) {\n\tconst dotgit = dotgitignore({ cwd });\n\n\treturn files.filter((file) => !dotgit.ignore(file));\n}\n","import type { ForkConfig } from \"./schema\";\n\nexport const DEFAULT_CONFIG: ForkConfig = {\n\t// Commands\n\tinspectVersion: false,\n\n\t// Options\n\tfiles: [\n\t\t\"package.json\",\n\t\t\"package-lock.json\",\n\t\t\"npm-shrinkwrap.json\",\n\t\t\"manifest.json\", // Chrome extensions\n\t\t\"bower.json\",\n\t],\n\tpath: process.cwd(),\n\tchangelog: \"CHANGELOG.md\",\n\theader: `# Changelog\n\nAll notable changes to this project will be documented in this file. See [fork-version](https://github.com/eglavin/fork-version) for commit guidelines.\n`,\n\ttagPrefix: \"v\",\n\n\t// Flags\n\tcommitAll: false,\n\tdebug: false,\n\tdryRun: false,\n\tsilent: false,\n\tgitTagFallback: true,\n\tsign: false,\n\tverify: false,\n\n\tchangelogPresetConfig: {},\n};\n","import meow from \"meow\";\n//@ts-check\n\n// This file is javascript so the following helper text can be extracted to the readme\n// without the need for a build step, otherwise it would also be typescript...\n\nexport const helperText = `Usage:\n $ fork-version [options]\n\nCommands:\n --help Show this help message.\n\n --inspect-version If set, fork-version will print the current version and exit.\n\nOptions:\n --files, --file, -F [Default: [\"bower.json\", \"manifest.json\", \"npm-shrinkwrap.json\", \"package-lock.json\", \"package.json\"]]\n List of the files to be updated.\n --glob, -G\n Glob pattern to match files to be updated.\n --path, -P [Default: process.cwd()]\n The path fork-version will run from.\n --changelog [Default: \"CHANGELOG.md\"]\n Name of the changelog file.\n --header\n The header text for the changelog.\n --tag-prefix [Default: \"v\"]\n Specify a prefix for the created tag.\n --pre-release-tag [Default: undefined]\n Make a pre-release with optional label if given value is a string.\n --current-version\n If set, fork-version will use this version instead of trying to determine one.\n --next-version\n If set, fork-version will attempt to update to this version, instead of incrementing using \"conventional-commit\".\n\nFlags:\n\n --commit-all\n Commit all staged changes, not just files updated by fork-version.\n --debug\n Output debug information.\n --dry-run\n No output will be written to disk or committed.\n --silent\n Run without logging to the terminal.\n --git-tag-fallback [Default: true]\n If unable to find a version in the given files, fallback and attempt to use the latest git tag.\n --sign\n If true, git will sign the commit with the systems GPG key.\n --verify\n If true, git will run user defined git hooks before committing.`;\n\nexport function getCliArguments() {\n\treturn meow(helperText, {\n\t\timportMeta: import.meta,\n\t\tbooleanDefault: undefined,\n\t\thelpIndent: 0,\n\t\tflags: {\n\t\t\t// Commands\n\t\t\tinspectVersion: { type: \"boolean\" },\n\n\t\t\t// Options\n\t\t\tfiles: { type: \"string\", isMultiple: true, aliases: [\"file\"], shortFlag: \"F\" },\n\t\t\tglob: { type: \"string\", shortFlag: \"G\" },\n\t\t\tpath: { type: \"string\", shortFlag: \"P\" },\n\t\t\tchangelog: { type: \"string\" },\n\t\t\theader: { type: \"string\" },\n\t\t\ttagPrefix: { type: \"string\" },\n\t\t\tpreReleaseTag: { type: \"string\" },\n\t\t\tcurrentVersion: { type: \"string\" },\n\t\t\tnextVersion: { type: \"string\" },\n\n\t\t\t// Flags\n\t\t\tcommitAll: { type: \"boolean\" },\n\t\t\tdebug: { type: \"boolean\" },\n\t\t\tdryRun: { type: \"boolean\" },\n\t\t\tsilent: { type: \"boolean\" },\n\t\t\tgitTagFallback: { type: \"boolean\" },\n\t\t\tsign: { type: \"boolean\" },\n\t\t\tverify: { type: \"boolean\" },\n\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\tlogger.log(`[Version] Using git tag fallback.`);\n\t\t\tversions.add(version);\n\t\t}\n\t}\n\n\tif (versions.size === 0) {\n\t\tthrow new Error(\"Unable to find current version\");\n\t} else if (versions.size > 1) {\n\t\tthrow new Error(\"Found multiple versions\");\n\t}\n\n\tconst currentVersion = versions.entries().next().value[0];\n\n\t// If we're just inspecting the version, output the version and exit\n\tif (config.inspectVersion) {\n\t\tconsole.log(currentVersion);\n\t\tprocess.exit(0);\n\t}\n\n\tlogger.log(`Current version: ${currentVersion}`);\n\treturn {\n\t\tfiles,\n\t\tversion: currentVersion,\n\t};\n}\n\nexport interface NextVersion {\n\tversion: string;\n\tlevel?: number;\n\tpreMajor?: boolean;\n\treason?: string;\n\treleaseType?: ReleaseType;\n}\n\nexport async function getNextVersion(\n\tconfig: ForkConfig,\n\tlogger: Logger,\n\tcurrentVersion: string,\n): Promise<NextVersion> {\n\tif (config.nextVersion && semver.valid(config.nextVersion)) {\n\t\tlogger.log(`Next version: ${config.nextVersion}`);\n\t\treturn {\n\t\t\tversion: config.nextVersion,\n\t\t};\n\t}\n\n\tconst isPreMajor = semver.lt(currentVersion, \"1.0.0\");\n\n\tlet recommendedBump: Awaited<ReturnType<typeof conventionalRecommendedBump>>;\n\ttry {\n\t\trecommendedBump = await conventionalRecommendedBump({\n\t\t\tpreset: {\n\t\t\t\tname: \"conventionalcommits\",\n\t\t\t\t...config.changelogPresetConfig,\n\t\t\t\tpreMajor: isPreMajor,\n\t\t\t},\n\t\t\tpath: config.path,\n\t\t\ttagPrefix: config.tagPrefix,\n\t\t\tcwd: config.path,\n\t\t});\n\t} catch (error) {\n\t\tthrow new Error(`[conventional-recommended-bump] Unable to determine next version`);\n\t}\n\n\tif (recommendedBump.releaseType) {\n\t\tconst releaseType = getReleaseType(\n\t\t\trecommendedBump.releaseType,\n\t\t\tcurrentVersion,\n\t\t\tconfig.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 \"\";\n\t}\n\n\tconst cleanedTags = [];\n\n\tfor (const tag of gitTags) {\n\t\tconst cleanedTag = semver.clean(tag.replace(new RegExp(`^${tagPrefix}`), \"\"));\n\n\t\tif (cleanedTag) {\n\t\t\tcleanedTags.push(cleanedTag);\n\t\t}\n\t}\n\n\treturn cleanedTags.sort(semver.rcompare)[0];\n}\n","import semver, { type ReleaseType } from \"semver\";\n\n/**\n * Get the priority of given type.\n * @example\n * - \"patch\" => 0\n * - \"minor\" => 1\n * - \"major\" => 2\n */\nfunction getPriority(type?: string): number {\n\treturn [\"patch\", \"minor\", \"major\"].indexOf(type ?? \"\");\n}\n\n/**\n * Get the given versions highest state.\n * @example\n * - \"patch\"\n * - \"minor\"\n * - \"major\"\n */\nfunction getVersionType(version: string): \"patch\" | \"minor\" | \"major\" | undefined {\n\tconst parseVersion = semver.parse(version);\n\n\tif (parseVersion?.major) {\n\t\treturn \"major\";\n\t} else if (parseVersion?.minor) {\n\t\treturn \"minor\";\n\t} else if (parseVersion?.patch) {\n\t\treturn \"patch\";\n\t}\n\n\treturn undefined;\n}\n\n/**\n * Get the recommended release type for the given version depending on if\n * the user asks for a prerelease with or without a tag.\n * ```js\n * getReleaseType(\"patch\", \"1.0.0\", false) => \"patch\"\n * getReleaseType(\"major\", \"0.0.0-beta\", \"beta\") => \"premajor\"\n * ```\n */\nexport function getReleaseType(\n\treleaseType: \"major\" | \"minor\" | \"patch\",\n\tcurrentVersion: string,\n\tpreReleaseTag?: string | boolean,\n): ReleaseType {\n\tif (!preReleaseTag) {\n\t\treturn releaseType;\n\t}\n\n\tconst currentVersionsIsPreRelease = Array.isArray(semver.prerelease(currentVersion));\n\tif (currentVersionsIsPreRelease) {\n\t\tconst currentReleaseType = getVersionType(currentVersion);\n\n\t\tif (\n\t\t\tcurrentReleaseType === releaseType ||\n\t\t\tgetPriority(currentReleaseType) > getPriority(releaseType)\n\t\t) {\n\t\t\treturn \"prerelease\";\n\t\t}\n\t}\n\n\treturn `pre${releaseType}`;\n}\n","import { resolve } from \"node:path\";\nimport { writeFileSync, readFileSync } from \"node:fs\";\nimport conventionalChangelog from \"conventional-changelog\";\n\nimport { fileExists } from \"../utils/file-state\";\nimport type { ForkConfig } from \"../config/schema\";\nimport type { Logger } from \"../utils/logger\";\n\n/**\n * Matches the following changelog header formats:\n * - `## [1.2.3]`\n * - `<a name=\"1.2.3\"></a>`\n */\nconst RELEASE_PATTERN = /(^#+ \\[?[0-9]+\\.[0-9]+\\.[0-9]+|<a name=)/m;\n\n/**\n * Get the existing changelog content from the latest release onwards.\n * @see {@link RELEASE_PATTERN}\n */\nfunction getOldReleaseContent(filePath: string, exists: boolean): string {\n\tif (exists) {\n\t\tconst fileContents = readFileSync(filePath, \"utf-8\");\n\t\tconst oldContentStart = fileContents.search(RELEASE_PATTERN);\n\n\t\tif (oldContentStart !== -1) {\n\t\t\treturn fileContents.substring(oldContentStart);\n\t\t}\n\t}\n\n\treturn \"\";\n}\n\n/**\n * Generate the new changelog content for this release.\n */\nfunction getNewReleaseContent(\n\tconfig: ForkConfig,\n\tlogger: Logger,\n\tnextVersion: string,\n): Promise<string> {\n\treturn new Promise<string>((onResolve) => {\n\t\tlet newContent = \"\";\n\n\t\tconventionalChangelog(\n\t\t\t{\n\t\t\t\tpreset: {\n\t\t\t\t\tname: \"conventionalcommits\",\n\t\t\t\t\t...config.changelogPresetConfig,\n\t\t\t\t},\n\t\t\t\ttagPrefix: config.tagPrefix,\n\t\t\t\twarn: (...message: string[]) => logger.error(\"[conventional-changelog] \", ...message),\n\t\t\t\tcwd: config.path,\n\t\t\t},\n\t\t\t{\n\t\t\t\tversion: nextVersion,\n\t\t\t},\n\t\t\t{\n\t\t\t\tmerges: null,\n\t\t\t\tpath: config.path,\n\t\t\t},\n\t\t)\n\t\t\t.on(\"error\", (error) => {\n\t\t\t\tlogger.error(\"[conventional-changelog] Unable to parse changes\");\n\t\t\t\tthrow error;\n\t\t\t})\n\t\t\t.on(\"data\", (chunk) => {\n\t\t\t\tnewContent += chunk.toString();\n\t\t\t})\n\t\t\t.on(\"end\", () => {\n\t\t\t\tonResolve(newContent);\n\t\t\t});\n\t});\n}\n\ninterface UpdateChangelog {\n\tchangelogPath: string;\n\toldContent: string;\n\tnewContent: string;\n}\n\nexport async function updateChangelog(\n\tconfig: ForkConfig,\n\tlogger: Logger,\n\tnextVersion: string,\n): Promise<UpdateChangelog> {\n\tif (config.header.search(RELEASE_PATTERN) !== -1) {\n\t\t// Need to ensure the header doesn't contain the release pattern\n\t\tthrow new Error(\"Header cannot contain release pattern\");\n\t}\n\n\t// Create the changelog file if it doesn't exist\n\tconst changelogPath = resolve(config.path, config.changelog);\n\tif (!config.dryRun && !fileExists(changelogPath)) {\n\t\tlogger.log(`Creating Changelog file: ${changelogPath}`);\n\t\twriteFileSync(changelogPath, \"\\n\", \"utf8\");\n\t}\n\n\tconst oldContent = getOldReleaseContent(changelogPath, fileExists(changelogPath));\n\tconst newContent = await getNewReleaseContent(config, logger, nextVersion);\n\n\tlogger.log(`Updating Changelog: ${changelogPath}`);\n\tif (!config.dryRun && newContent) {\n\t\twriteFileSync(\n\t\t\tchangelogPath,\n\t\t\t`${config.header}\n${newContent}\n${oldContent}\n`.trim(),\n\t\t\t\"utf8\",\n\t\t);\n\t}\n\n\treturn {\n\t\tchangelogPath,\n\t\toldContent,\n\t\tnewContent,\n\t};\n}\n","import { lstatSync } from \"fs\";\n\n/**\n * Determine if a file exists.\n * @example\n * ```ts\n * fileExists(\"~/.bashrc\"); // true\n * fileExists(\"~/missing-file.txt\"); // false\n * ```\n */\nexport function fileExists(filePath: string): boolean {\n\ttry {\n\t\treturn lstatSync(filePath).isFile();\n\t} catch (e) {\n\t\treturn false;\n\t}\n}\n","import { resolve } from \"node:path\";\nimport { Git } from \"../utils/git\";\nimport { formatCommitMessage } from \"../utils/format-commit-message\";\nimport { fileExists } from \"../utils/file-state\";\nimport type { ForkConfig } from \"../config/schema\";\nimport type { FileState } from \"../strategies/file-manager\";\nimport type { Logger } from \"../utils/logger\";\n\ninterface CommitChanges {\n\tfilesToCommit: string[];\n\tgitAddOutput?: string;\n\tgitCommitOutput?: string;\n}\n\nexport async function commitChanges(\n\tconfig: ForkConfig,\n\tlogger: Logger,\n\tfiles: FileState[],\n\tnextVersion: string,\n): Promise<CommitChanges> {\n\tconst git = new Git(config, logger);\n\n\tlogger.log(\"Committing changes\");\n\n\tconst filesToCommit: string[] = [];\n\tif (fileExists(resolve(config.path, config.changelog))) {\n\t\tfilesToCommit.push(resolve(config.path, config.changelog));\n\t}\n\tfor (const file of files) {\n\t\tfilesToCommit.push(file.path);\n\t}\n\n\t// If there are no files to commit don't continue.\n\tif (filesToCommit.length === 0) {\n\t\treturn {\n\t\t\tfilesToCommit,\n\t\t};\n\t}\n\n\tconst shouldVerify = config.verify ? undefined : \"--no-verify\";\n\tconst shouldSign = config.sign ? \"--gpg-sign\" : undefined;\n\n\t// If commitAll is set, commit all changed files.\n\tif (config.commitAll) {\n\t\treturn {\n\t\t\tfilesToCommit,\n\t\t\tgitAddOutput: await git.add(\"--all\"),\n\t\t\tgitCommitOutput: await git.commit(\n\t\t\t\tshouldVerify,\n\t\t\t\tshouldSign,\n\t\t\t\t\"--message\",\n\t\t\t\tformatCommitMessage(config.changelogPresetConfig?.releaseCommitMessageFormat, nextVersion),\n\t\t\t),\n\t\t};\n\t}\n\n\treturn {\n\t\tfilesToCommit,\n\t\tgitAddOutput: await git.add(...filesToCommit),\n\t\tgitCommitOutput: await git.commit(\n\t\t\tshouldVerify,\n\t\t\tshouldSign,\n\t\t\t...filesToCommit,\n\t\t\t\"--message\",\n\t\t\tformatCommitMessage(config.changelogPresetConfig?.releaseCommitMessageFormat, nextVersion),\n\t\t),\n\t};\n}\n","import { execFile } from \"node:child_process\";\nimport type { ForkConfig } from \"../config/schema\";\nimport type { Logger } from \"./logger\";\n\nexport class Git {\n\tconstructor(\n\t\tprivate config: ForkConfig,\n\t\tprivate logger: Logger,\n\t) {\n\t\tthis.add = this.add.bind(this);\n\t\tthis.commit = this.commit.bind(this);\n\t\tthis.tag = this.tag.bind(this);\n\t\tthis.currentBranch = this.currentBranch.bind(this);\n\t}\n\n\tpublic add(...args: (string | undefined)[]) {\n\t\tif (this.config.dryRun) {\n\t\t\treturn Promise.resolve(\"\");\n\t\t}\n\n\t\treturn this.execGit(\"add\", args.filter(Boolean) as string[]);\n\t}\n\n\tpublic commit(...args: (string | undefined)[]) {\n\t\tif (this.config.dryRun) {\n\t\t\treturn Promise.resolve(\"\");\n\t\t}\n\n\t\treturn this.execGit(\"commit\", args.filter(Boolean) as string[]);\n\t}\n\n\tpublic tag(...args: (string | undefined)[]) {\n\t\tif (this.config.dryRun) {\n\t\t\treturn Promise.resolve(\"\");\n\t\t}\n\n\t\treturn this.execGit(\"tag\", args.filter(Boolean) as string[]);\n\t}\n\n\tpublic async currentBranch() {\n\t\treturn (await this.execGit(\"rev-parse\", [\"--abbrev-ref\", \"HEAD\"])).trim();\n\t}\n\n\tprivate execGit(command: string, args: string[]): Promise<string> {\n\t\tthis.logger.debug(`[git ${command}] ${args.join(\" \")}`);\n\n\t\treturn new Promise((onResolve, onReject) => {\n\t\t\texecFile(\n\t\t\t\t\"git\",\n\t\t\t\t[command, ...args],\n\t\t\t\t{\n\t\t\t\t\tcwd: this.config.path,\n\t\t\t\t},\n\t\t\t\t(error, stdout, stderr) => {\n\t\t\t\t\tif (error) {\n\t\t\t\t\t\tthis.logger.error(`[git ${command}] `);\n\t\t\t\t\t\tonReject(error);\n\t\t\t\t\t}\n\n\t\t\t\t\tonResolve(stdout ? stdout : stderr);\n\t\t\t\t},\n\t\t\t);\n\t\t});\n\t}\n}\n","/**\n * Formats the commit message by replacing the `{{currentTag}}` placeholder\n * globally with the new version.\n *\n * Falls back to `chore(release): {{currentTag}}` if message is argument is falsy.\n */\nexport function formatCommitMessage(message: string | undefined, version: string): string {\n\tif (!message) {\n\t\tmessage = \"chore(release): {{currentTag}}\";\n\t}\n\n\treturn message.replace(new RegExp(\"{{currentTag}}\", \"g\"), version);\n}\n","import { Git } from \"../utils/git\";\nimport { formatCommitMessage } from \"../utils/format-commit-message\";\nimport type { ForkConfig } from \"../config/schema\";\nimport type { Logger } from \"../utils/logger\";\n\ninterface TagChanges {\n\tgitTagOutput: string;\n}\n\nexport async function tagChanges(\n\tconfig: ForkConfig,\n\tlogger: Logger,\n\tnextVersion: string,\n): Promise<TagChanges> {\n\tconst git = new Git(config, logger);\n\n\t/** @example \"v1.2.3\" or \"version/1.2.3\" */\n\tconst tag = `${config.tagPrefix}${nextVersion}`;\n\n\tlogger.log(`Creating Tag: ${tag}`);\n\n\tconst gitTagOutput = await git.tag(\n\t\tconfig.sign ? \"--sign\" : \"--annotate\",\n\t\ttag,\n\t\t\"--message\",\n\t\tformatCommitMessage(config.changelogPresetConfig?.releaseCommitMessageFormat, nextVersion),\n\t);\n\n\treturn {\n\t\tgitTagOutput,\n\t};\n}\n","import { resolve } from \"node:path\";\nimport { readFileSync, writeFileSync } from \"node:fs\";\nimport detectIndent from \"detect-indent\";\nimport { detectNewline } from \"detect-newline\";\n\nimport { stringifyPackage } from \"../libs/stringify-package\";\nimport { fileExists } from \"../utils/file-state\";\nimport type { ForkConfig } from \"../config/schema\";\nimport type { Logger } from \"../utils/logger\";\nimport type { FileState, IFileManager } from \"./file-manager\";\n\n/**\n * A json package file should have a version property, like what can be seen\n * in the package.json file in the root of this project.\n *\n * @example\n * ```json\n * {\n * \"name\": \"fork-version\",\n * \"version\": \"1.2.3\",\n * \"private\": true,\n * }\n * ```\n */\nexport class JSONPackage implements IFileManager {\n\tconstructor(\n\t\tprivate config: ForkConfig,\n\t\tprivate logger: Logger,\n\t) {}\n\n\tpublic read(fileName: string): FileState | undefined {\n\t\tconst filePath = resolve(this.config.path, fileName);\n\n\t\tif (fileExists(filePath)) {\n\t\t\tconst fileContents = readFileSync(filePath, \"utf8\");\n\t\t\tconst parsedJson = JSON.parse(fileContents);\n\n\t\t\tif (parsedJson.version) {\n\t\t\t\treturn {\n\t\t\t\t\tname: fileName,\n\t\t\t\t\tpath: filePath,\n\t\t\t\t\tversion: parsedJson.version,\n\n\t\t\t\t\tisPrivate: typeof parsedJson?.private === \"boolean\" ? parsedJson.private : true,\n\t\t\t\t};\n\t\t\t}\n\n\t\t\tthis.logger.warn(`[File Manager] Unable to determine json package: ${fileName}`);\n\t\t}\n\t}\n\n\tpublic write(fileState: FileState, newVersion: string) {\n\t\tconst fileContents = readFileSync(fileState.path, \"utf8\");\n\t\tconst parsedJson = JSON.parse(fileContents);\n\n\t\tparsedJson.version = newVersion;\n\t\tif (parsedJson.packages?.[\"\"]) {\n\t\t\tparsedJson.packages[\"\"].version = newVersion; // package-lock v2 stores version here too.\n\t\t}\n\n\t\twriteFileSync(\n\t\t\tfileState.path,\n\t\t\tstringifyPackage(parsedJson, detectIndent(fileContents).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(fileState: FileState, newVersion: string) {\n\t\twriteFileSync(fileState.path, newVersion, \"utf8\");\n\t}\n}\n","import { resolve } from \"node:path\";\nimport { readFileSync, writeFileSync } from \"node:fs\";\nimport * as cheerio from \"cheerio/lib/slim\";\n\nimport { fileExists } from \"../utils/file-state\";\nimport type { ForkConfig } from \"../config/schema\";\nimport type { Logger } from \"../utils/logger\";\nimport type { FileState, IFileManager } from \"./file-manager\";\n\n/**\n * A csproj file is an xml file with a version property under the Project > PropertyGroup node.\n *\n * @example\n * ```xml\n * <Project Sdk=\"Microsoft.NET.Sdk\">\n * <PropertyGroup>\n * <Version>1.2.3</Version>\n * </PropertyGroup>\n * </Project>\n * ```\n */\nexport class CSharpProject implements IFileManager {\n\tconstructor(\n\t\tprivate config: ForkConfig,\n\t\tprivate logger: Logger,\n\t) {}\n\n\tpublic read(fileName: string): FileState | undefined {\n\t\tconst filePath = resolve(this.config.path, fileName);\n\n\t\tif (fileExists(filePath)) {\n\t\t\tconst fileContents = readFileSync(filePath, \"utf8\");\n\t\t\tconst $ = cheerio.load(fileContents, { xmlMode: true, decodeEntities: false });\n\n\t\t\tconst version = $(\"Project > PropertyGroup > Version\").text();\n\t\t\tif (version) {\n\t\t\t\treturn {\n\t\t\t\t\tname: fileName,\n\t\t\t\t\tpath: filePath,\n\t\t\t\t\tversion: version,\n\t\t\t\t};\n\t\t\t}\n\n\t\t\tthis.logger.warn(`[File Manager] Unable to determine csproj package: ${fileName}`);\n\t\t}\n\t}\n\n\tpublic write(fileState: FileState, newVersion: string) {\n\t\tconst fileContents = readFileSync(fileState.path, \"utf8\");\n\t\tconst $ = cheerio.load(fileContents, { xmlMode: true, decodeEntities: false });\n\n\t\t$(\"Project > PropertyGroup > Version\").text(newVersion);\n\n\t\t// Cheerio doesn't handle self-closing tags well,\n\t\t// so we're manually adding a space before the closing tag.\n\t\tconst updatedContent = $.xml().replaceAll('\"/>', '\" />');\n\n\t\twriteFileSync(fileState.path, updatedContent, \"utf8\");\n\t}\n}\n","import { JSONPackage } from \"./json-package\";\nimport { PlainText } from \"./plain-text\";\nimport { CSharpProject } from \"./csharp-project\";\n\nimport type { ForkConfig } from \"../config/schema\";\nimport type { Logger } from \"../utils/logger\";\n\nexport interface FileState {\n\tname: string;\n\tpath: string;\n\tversion: string;\n\n\t[other: string]: unknown;\n}\n\nexport interface IFileManager {\n\tread(fileName: string): FileState | undefined;\n\twrite(fileState: FileState, newVersion: string): void;\n}\n\nexport class FileManager implements IFileManager {\n\tprivate JSONPackage: JSONPackage;\n\tprivate PlainText: PlainText;\n\tprivate CSharpProject: CSharpProject;\n\n\tconstructor(\n\t\tprivate config: ForkConfig,\n\t\tprivate logger: Logger,\n\t) {\n\t\tthis.JSONPackage = new JSONPackage(config, logger);\n\t\tthis.PlainText = new PlainText(config, logger);\n\t\tthis.CSharpProject = new CSharpProject(config, logger);\n\t}\n\n\t/**\n\t * Get the state from the given file name.\n\t *\n\t * @example\n\t * ```ts\n\t * fileManager.read(\"package.json\");\n\t * ```\n\t *\n\t * @returns\n\t * ```json\n\t * { \"name\": \"package.json\", \"path\": \"/path/to/package.json\", \"version\": \"1.2.3\", \"isPrivate\": true }\n\t * ```\n\t */\n\tpublic read(fileName: string): FileState | undefined {\n\t\tconst _fileName = fileName.toLowerCase();\n\n\t\tif (_fileName.endsWith(\".json\")) {\n\t\t\treturn this.JSONPackage.read(fileName);\n\t\t}\n\n\t\tif (_fileName.endsWith(\"version.txt\")) {\n\t\t\treturn this.PlainText.read(fileName);\n\t\t}\n\n\t\tif (_fileName.endsWith(\".csproj\")) {\n\t\t\treturn this.CSharpProject.read(fileName);\n\t\t}\n\n\t\tthis.logger.error(`[File Manager] Unsupported file: ${fileName}`);\n\t}\n\n\t/**\n\t * Write the new version to the given file.\n\t *\n\t * @example\n\t * ```ts\n\t * fileManager.write(\n\t * { name: \"package.json\", path: \"/path/to/package.json\", version: \"1.2.2\" },\n\t * \"1.2.3\"\n\t * );\n\t * ```\n\t */\n\tpublic write(fileState: FileState, newVersion: string): void {\n\t\tif (this.config.dryRun) {\n\t\t\treturn;\n\t\t}\n\t\tconst _fileName = fileState.name.toLowerCase();\n\n\t\tif (_fileName.endsWith(\".json\")) {\n\t\t\treturn this.JSONPackage.write(fileState, newVersion);\n\t\t}\n\n\t\tif (_fileName.endsWith(\"version.txt\")) {\n\t\t\treturn this.PlainText.write(fileState, newVersion);\n\t\t}\n\n\t\tif (_fileName.endsWith(\".csproj\")) {\n\t\t\treturn this.CSharpProject.write(fileState, newVersion);\n\t\t}\n\n\t\tthis.logger.error(`[File Manager] Unsupported file: ${fileState.path}`);\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.js","../src/config/changelog-preset-config.ts","../src/process/version.ts","../src/utils/git-tag-version.ts","../src/utils/release-type.ts","../src/process/changelog.ts","../src/utils/file-state.ts","../src/process/commit.ts","../src/utils/git.ts","../src/utils/format-commit-message.ts","../src/process/tag.ts","../src/strategies/json-package.ts","../src/libs/stringify-package.ts","../src/strategies/plain-text.ts","../src/strategies/csharp-project.ts","../src/strategies/file-manager.ts"],"names":["fileContent","parsed","semver","resolve","readFileSync","writeFileSync"],"mappings":"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","sourcesContent":["import { z } from \"zod\";\n\nconst ChangelogPresetConfigTypeSchema = z.object({\n\t/**\n\t * The type of commit message.\n\t * @example \"feat\", \"fix\", \"chore\", etc..\n\t */\n\ttype: z.string().describe('The type of commit message, such as \"feat\", \"fix\", \"chore\".'),\n\t/**\n\t * The section of the `CHANGELOG` the commit should show up in.\n\t */\n\tsection: z\n\t\t.string()\n\t\t.optional()\n\t\t.describe(\"The section of the `CHANGELOG` the commit should show up in.\"),\n\t/**\n\t * Should show in the generated changelog message?\n\t */\n\thidden: z.boolean().optional().describe(\"Should show in the generated changelog message?\"),\n});\n\nexport const ChangelogPresetConfigSchema = z.object({\n\t/**\n\t * List of explicitly supported commit message types.\n\t */\n\ttypes: z\n\t\t.array(ChangelogPresetConfigTypeSchema)\n\t\t.describe(\"List of explicitly supported commit message types.\"),\n\t/**\n\t * A URL representing a specific commit at a hash.\n\t * @default \"{{host}}/{{owner}}/{{repository}}/commit/{{hash}}\"\n\t */\n\tcommitUrlFormat: z.string().describe(\"A URL representing a specific commit at a hash.\"),\n\t/**\n\t * A URL representing the comparison between two git SHAs.\n\t * @default \"{{host}}/{{owner}}/{{repository}}/compare/{{previousTag}}...{{currentTag}}\"\n\t */\n\tcompareUrlFormat: z.string().describe(\"A URL representing the comparison between two git SHAs.\"),\n\t/**\n\t * A URL representing the issue format (allowing a different URL format to be swapped in\n\t * for Gitlab, Bitbucket, etc).\n\t * @default \"{{host}}/{{owner}}/{{repository}}/issues/{{id}}\"\n\t */\n\tissueUrlFormat: z.string().describe(\"A URL representing the issue format.\"),\n\t/**\n\t * A URL representing a user's profile on GitHub, Gitlab, etc. This URL is used\n\t * for substituting @eglavin with https://github.com/eglavin in commit messages.\n\t * @default \"{{host}}/{{user}}\"\n\t */\n\tuserUrlFormat: z.string().describe(\"A URL representing a user's profile on GitHub, Gitlab, etc.\"),\n\t/**\n\t * A string to be used to format the auto-generated release commit message.\n\t * @default \"chore(release): {{currentTag}}\"\n\t */\n\treleaseCommitMessageFormat: z\n\t\t.string()\n\t\t.describe(\"A string to be used to format the auto-generated release commit message.\"),\n\t/**\n\t * List of prefixes used to detect references to issues.\n\t * @default [\"#\"]\n\t */\n\tissuePrefixes: z\n\t\t.array(z.string())\n\t\t.describe(\"List of prefixes used to detect references to issues.\"),\n});\n\nexport type ChangelogPresetConfig = z.infer<typeof ChangelogPresetConfigSchema>;\n\nexport const ForkConfigSchema = z.object({\n\t// Commands\n\t//\n\n\t/**\n\t * If set, fork-version will print the current version and exit.\n\t * @default false\n\t */\n\tinspectVersion: z\n\t\t.boolean()\n\t\t.describe(\"If set, fork-version will print the current version and exit.\"),\n\n\t// Options\n\t//\n\n\t/**\n\t * List of the files to be updated.\n\t * @default\n\t * ```js\n\t * [\"bower.json\", \"manifest.json\", \"npm-shrinkwrap.json\", \"package-lock.json\", \"package.json\"]\n\t * ```\n\t */\n\tfiles: z.array(z.string()).describe(\"List of the files to be updated.\"),\n\t/**\n\t * Glob pattern to match files to be updated.\n\t *\n\t * Internally we're using [glob](https://github.com/isaacs/node-glob) to match files.\n\t *\n\t * Read more about the pattern syntax [here](https://github.com/isaacs/node-glob/tree/v10.3.12?tab=readme-ov-file#glob-primer).\n\t *\n\t * @default undefined\n\t * @example \"*.json\"\n\t */\n\tglob: z.string().optional().describe(\"Glob pattern to match files to be updated.\"),\n\t/**\n\t * The path fork-version will run from.\n\t * @default\n\t * ```js\n\t * process.cwd()\n\t * ```\n\t */\n\tpath: z.string().describe('The path fork-version will run from. Defaults to \"process.cwd()\".'),\n\t/**\n\t * Name of the changelog file.\n\t * @default \"CHANGELOG.md\"\n\t */\n\tchangelog: z.string().describe('Name of the changelog file. Defaults to \"CHANGELOG.md\".'),\n\t/**\n\t * The header text for the changelog.\n\t * @default\n\t * ```markdown\n\t * # Changelog\n\t *\n\t * All notable changes to this project will be documented in this file. See [fork-version](https://github.com/eglavin/fork-version) for commit guidelines.\n\t * ```\n\t */\n\theader: z.string().describe(\"The header text for the changelog.\"),\n\t/**\n\t * Specify a prefix for the created tag.\n\t *\n\t * For instance if your version tag is prefixed by \"version/\" instead of \"v\" you have to specify\n\t * `tagPrefix: \"version/\"`.\n\t *\n\t * `tagPrefix` can also be used for a monorepo environment where you might want to deploy\n\t * multiple package from the same repository. In this case you can specify a prefix for\n\t * each package:\n\t *\n\t * | Example Value | Tag Created |\n\t * |:-------------------------|:------------------------------|\n\t * | \"\" | `1.2.3` |\n\t * | \"version/\" | `version/1.2.3` |\n\t * | \"@eglavin/fork-version-\" | `@eglavin/fork-version-1.2.3` |\n\t *\n\t * @example \"\", \"version/\", \"@eglavin/fork-version-\"\n\t * @default \"v\"\n\t */\n\ttagPrefix: z.string().describe('Specify a prefix for the created tag. Defaults to \"v\".'),\n\t/**\n\t * Make a pre-release with optional label if given value is a string.\n\t *\n\t * | Example Value | Produced Version |\n\t * |:--------------|:-----------------|\n\t * | true | `1.2.3-0` |\n\t * | \"alpha\" | `1.2.3-alpha-0` |\n\t * | \"beta\" | `1.2.3-beta-0` |\n\t *\n\t * @example true, \"alpha\", \"beta\", \"rc\"\n\t * @default undefined\n\t */\n\tpreReleaseTag: z\n\t\t.string()\n\t\t.or(z.boolean())\n\t\t.optional()\n\t\t.describe(\"Make a pre-release with optional label if given value is a string.\"),\n\t/**\n\t * If set, fork-version will use this version instead of trying to determine one.\n\t * @example \"1.0.0\"\n\t * @default undefined\n\t */\n\tcurrentVersion: z\n\t\t.string()\n\t\t.optional()\n\t\t.describe(\"If set, fork-version will use this version instead of trying to determine one.\"),\n\t/**\n\t * If set, fork-version will attempt to update to this version, instead of incrementing using \"conventional-commit\".\n\t * @example \"2.0.0\"\n\t * @default undefined\n\t */\n\tnextVersion: z\n\t\t.string()\n\t\t.optional()\n\t\t.describe(\n\t\t\t'If set, fork-version will attempt to update to this version, instead of incrementing using \"conventional-commit\".',\n\t\t),\n\n\t// Flags\n\t//\n\n\t/**\n\t * Commit all staged changes, not just files updated by fork-version.\n\t * @default false\n\t */\n\tcommitAll: z\n\t\t.boolean()\n\t\t.describe(\"Commit all staged changes, not just files updated by fork-version.\"),\n\t/**\n\t * Output debug information.\n\t * @default false\n\t */\n\tdebug: z.boolean().describe(\"Output debug information.\"),\n\t/**\n\t * No output will be written to disk or committed.\n\t * @default false\n\t */\n\tdryRun: z.boolean().describe(\"No output will be written to disk or committed.\"),\n\t/**\n\t * Run without logging to the terminal.\n\t * @default false\n\t */\n\tsilent: z.boolean().describe(\"Run without logging to the terminal.\"),\n\t/**\n\t * If unable to find a version in the given files, fallback and attempt to use the latest git tag.\n\t * @default true\n\t */\n\tgitTagFallback: z\n\t\t.boolean()\n\t\t.describe(\n\t\t\t\"If unable to find a version in the given files, fallback and attempt to use the latest git tag. Defaults to true.\",\n\t\t),\n\t/**\n\t * If true, git will sign the commit with the systems GPG key.\n\t * @see {@link https://git-scm.com/docs/git-commit#Documentation/git-commit.txt--Sltkeyidgt Git - GPG Sign Commits}\n\t * @default false\n\t */\n\tsign: z.boolean().describe(\"If true, git will sign the commit with the systems GPG key.\"),\n\t/**\n\t * If true, git will run user defined git hooks before committing.\n\t * @default false\n\t */\n\tverify: z.boolean().describe(\"If true, git will run user defined git hooks before committing.\"),\n\n\t/**\n\t * Override the default \"conventional-changelog-conventionalcommits\" preset configuration.\n\t */\n\tchangelogPresetConfig: ChangelogPresetConfigSchema.partial().describe(\n\t\t'Override the default \"conventional-changelog-conventionalcommits\" preset configuration.',\n\t),\n});\n\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\";\nimport { glob } from \"glob\";\nimport dotgitignore from \"dotgitignore\";\n\nimport { ForkConfigSchema, type ForkConfig } from \"./schema\";\nimport { DEFAULT_CONFIG } from \"./defaults\";\nimport { getCliArguments } from \"./cli-arguments\";\nimport { getChangelogPresetConfig } from \"./changelog-preset-config\";\n\n/**\n * Name of the key in the package.json file that contains the users configuration.\n */\nconst PACKAGE_JSON_CONFIG_KEY = \"fork-version\";\n\nexport async function getUserConfig(): Promise<ForkConfig> {\n\tconst cliArguments = getCliArguments();\n\n\tconst cwd = cliArguments.flags.path ? resolve(cliArguments.flags.path) : process.cwd();\n\tconst joycon = new JoyCon({\n\t\tcwd,\n\t\tpackageKey: PACKAGE_JSON_CONFIG_KEY,\n\t\tstopDir: parse(cwd).root,\n\t});\n\tconst configFilePath = await joycon.resolve([\n\t\t\"fork.config.ts\",\n\t\t\"fork.config.js\",\n\t\t\"fork.config.cjs\",\n\t\t\"fork.config.mjs\",\n\t\t\"fork.config.json\",\n\t\t\"package.json\",\n\t]);\n\n\tconst configFile = await loadConfigFile(configFilePath);\n\n\tconst mergedConfig = {\n\t\t...DEFAULT_CONFIG,\n\t\t...configFile,\n\t\t...cliArguments.flags,\n\t} as ForkConfig;\n\n\t// If the user has defined a glob pattern, use it to find the requested files.\n\tlet globResults: string[] = [];\n\tif (mergedConfig.glob) {\n\t\tglobResults = await glob(mergedConfig.glob, {\n\t\t\tcwd: cwd,\n\t\t\tignore: [\"node_modules/**\"],\n\t\t\tnodir: true,\n\t\t});\n\t}\n\n\treturn {\n\t\t...mergedConfig,\n\n\t\tpath: cwd,\n\t\tfiles: filterGitIgnoredFiles(\n\t\t\tcwd,\n\t\t\tgetFilesList(configFile?.files, cliArguments.flags?.files, globResults),\n\t\t),\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\t// Handle package.json config file.\n\t\tif (configFilePath.endsWith(\"package.json\")) {\n\t\t\tif (\n\t\t\t\tfileContent[PACKAGE_JSON_CONFIG_KEY] &&\n\t\t\t\ttypeof fileContent[PACKAGE_JSON_CONFIG_KEY] === \"object\"\n\t\t\t) {\n\t\t\t\tconst parsed = ForkConfigSchema.partial().safeParse(fileContent[PACKAGE_JSON_CONFIG_KEY]);\n\t\t\t\tif (!parsed.success) {\n\t\t\t\t\tthrow parsed.error;\n\t\t\t\t}\n\t\t\t\treturn parsed.data;\n\t\t\t}\n\n\t\t\treturn {};\n\t\t}\n\n\t\tconst parsed = ForkConfigSchema.partial().safeParse(fileContent);\n\t\tif (!parsed.success) {\n\t\t\tthrow parsed.error;\n\t\t}\n\t\treturn parsed.data;\n\t}\n\n\t// Otherwise expect config file to use js or ts.\n\tconst fileContent = await bundleRequire({ filepath: configFilePath });\n\n\tconst parsed = ForkConfigSchema.partial().safeParse(fileContent.mod.default || fileContent.mod);\n\tif (!parsed.success) {\n\t\tthrow parsed.error;\n\t}\n\treturn parsed.data;\n}\n\nfunction getFilesList(\n\tconfigFiles: string[] | undefined,\n\tcliFiles: string[] | undefined,\n\tglobResults: string[],\n): string[] {\n\tconst listOfFiles = new Set<string>();\n\n\t// Add files from the users config file\n\tif (Array.isArray(configFiles)) {\n\t\tconfigFiles.forEach((file) => listOfFiles.add(file));\n\t}\n\n\t// Add files from the cli arguments\n\tif (Array.isArray(cliFiles)) {\n\t\tcliFiles.forEach((file) => listOfFiles.add(file));\n\t}\n\n\t// Add files from glob results\n\tglobResults.forEach((file) => listOfFiles.add(file));\n\n\t// If the user has defined files use them, otherwise use the default list of files.\n\tif (listOfFiles.size) {\n\t\treturn Array.from(listOfFiles);\n\t}\n\n\treturn DEFAULT_CONFIG.files;\n}\n\nfunction filterGitIgnoredFiles(cwd: string, files: string[]) {\n\tconst dotgit = dotgitignore({ cwd });\n\n\treturn files.filter((file) => !dotgit.ignore(file));\n}\n","import type { ForkConfig } from \"./schema\";\n\nexport const DEFAULT_CONFIG: ForkConfig = {\n\t// Commands\n\tinspectVersion: false,\n\n\t// Options\n\tfiles: [\n\t\t\"package.json\",\n\t\t\"package-lock.json\",\n\t\t\"npm-shrinkwrap.json\",\n\t\t\"manifest.json\", // Chrome extensions\n\t\t\"bower.json\",\n\t],\n\tpath: process.cwd(),\n\tchangelog: \"CHANGELOG.md\",\n\theader: `# Changelog\n\nAll notable changes to this project will be documented in this file. See [fork-version](https://github.com/eglavin/fork-version) for commit guidelines.\n`,\n\ttagPrefix: \"v\",\n\n\t// Flags\n\tcommitAll: false,\n\tdebug: false,\n\tdryRun: false,\n\tsilent: false,\n\tgitTagFallback: true,\n\tsign: false,\n\tverify: false,\n\n\tchangelogPresetConfig: {},\n};\n","import meow from \"meow\";\n//@ts-check\n\n// This file is javascript so the following helper text can be extracted to the readme\n// without the need for a build step, otherwise it would also be typescript...\n\nexport const helperText = `Usage:\n $ fork-version [options]\n\nCommands:\n --help Show this help message.\n\n --inspect-version If set, fork-version will print the current version and exit.\n\nOptions:\n --files, --file, -F [Default: [\"bower.json\", \"manifest.json\", \"npm-shrinkwrap.json\", \"package-lock.json\", \"package.json\"]]\n List of the files to be updated.\n --glob, -G\n Glob pattern to match files to be updated.\n --path, -P [Default: process.cwd()]\n The path fork-version will run from.\n --changelog [Default: \"CHANGELOG.md\"]\n Name of the changelog file.\n --header\n The header text for the changelog.\n --tag-prefix [Default: \"v\"]\n Specify a prefix for the created tag.\n --pre-release-tag [Default: undefined]\n Make a pre-release with optional label if given value is a string.\n --current-version\n If set, fork-version will use this version instead of trying to determine one.\n --next-version\n If set, fork-version will attempt to update to this version, instead of incrementing using \"conventional-commit\".\n\nFlags:\n\n --commit-all\n Commit all staged changes, not just files updated by fork-version.\n --debug\n Output debug information.\n --dry-run\n No output will be written to disk or committed.\n --silent\n Run without logging to the terminal.\n --git-tag-fallback [Default: true]\n If unable to find a version in the given files, fallback and attempt to use the latest git tag.\n --sign\n If true, git will sign the commit with the systems GPG key.\n --verify\n If true, git will run user defined git hooks before committing.`;\n\nexport function getCliArguments() {\n\treturn meow(helperText, {\n\t\timportMeta: import.meta,\n\t\tbooleanDefault: undefined,\n\t\thelpIndent: 0,\n\t\tflags: {\n\t\t\t// Commands\n\t\t\tinspectVersion: { type: \"boolean\" },\n\n\t\t\t// Options\n\t\t\tfiles: { type: \"string\", isMultiple: true, aliases: [\"file\"], shortFlag: \"F\" },\n\t\t\tglob: { type: \"string\", shortFlag: \"G\" },\n\t\t\tpath: { type: \"string\", shortFlag: \"P\" },\n\t\t\tchangelog: { type: \"string\" },\n\t\t\theader: { type: \"string\" },\n\t\t\ttagPrefix: { type: \"string\" },\n\t\t\tpreReleaseTag: { type: \"string\" },\n\t\t\tcurrentVersion: { type: \"string\" },\n\t\t\tnextVersion: { type: \"string\" },\n\n\t\t\t// Flags\n\t\t\tcommitAll: { type: \"boolean\" },\n\t\t\tdebug: { type: \"boolean\" },\n\t\t\tdryRun: { type: \"boolean\" },\n\t\t\tsilent: { type: \"boolean\" },\n\t\t\tgitTagFallback: { type: \"boolean\" },\n\t\t\tsign: { type: \"boolean\" },\n\t\t\tverify: { type: \"boolean\" },\n\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\tlogger.log(`[Version] Using git tag fallback.`);\n\t\t\tversions.add(version);\n\t\t}\n\t}\n\n\tif (versions.size === 0) {\n\t\tthrow new Error(\"Unable to find current version\");\n\t} else if (versions.size > 1) {\n\t\tthrow new Error(\"Found multiple versions\");\n\t}\n\n\tconst currentVersion = versions.entries().next().value[0];\n\n\t// If we're just inspecting the version, output the version and exit\n\tif (config.inspectVersion) {\n\t\tconsole.log(currentVersion);\n\t\tprocess.exit(0);\n\t}\n\n\tlogger.log(`Current version: ${currentVersion}`);\n\treturn {\n\t\tfiles,\n\t\tversion: currentVersion,\n\t};\n}\n\nexport interface NextVersion {\n\tversion: string;\n\tlevel?: number;\n\tpreMajor?: boolean;\n\treason?: string;\n\treleaseType?: ReleaseType;\n}\n\nexport async function getNextVersion(\n\tconfig: ForkConfig,\n\tlogger: Logger,\n\tcurrentVersion: string,\n): Promise<NextVersion> {\n\tif (config.nextVersion && semver.valid(config.nextVersion)) {\n\t\tlogger.log(`Next version: ${config.nextVersion}`);\n\t\treturn {\n\t\t\tversion: config.nextVersion,\n\t\t};\n\t}\n\n\tconst isPreMajor = semver.lt(currentVersion, \"1.0.0\");\n\n\tlet recommendedBump: Awaited<ReturnType<typeof conventionalRecommendedBump>>;\n\ttry {\n\t\trecommendedBump = await conventionalRecommendedBump({\n\t\t\tpreset: {\n\t\t\t\tname: \"conventionalcommits\",\n\t\t\t\t...config.changelogPresetConfig,\n\t\t\t\tpreMajor: isPreMajor,\n\t\t\t},\n\t\t\tpath: config.path,\n\t\t\ttagPrefix: config.tagPrefix,\n\t\t\tcwd: config.path,\n\t\t});\n\t} catch (error) {\n\t\tthrow new Error(`[conventional-recommended-bump] Unable to determine next version`);\n\t}\n\n\tif (recommendedBump.releaseType) {\n\t\tconst releaseType = getReleaseType(\n\t\t\trecommendedBump.releaseType,\n\t\t\tcurrentVersion,\n\t\t\tconfig.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 \"\";\n\t}\n\n\tconst cleanedTags = [];\n\n\tfor (const tag of gitTags) {\n\t\tconst cleanedTag = semver.clean(tag.replace(new RegExp(`^${tagPrefix}`), \"\"));\n\n\t\tif (cleanedTag) {\n\t\t\tcleanedTags.push(cleanedTag);\n\t\t}\n\t}\n\n\treturn cleanedTags.sort(semver.rcompare)[0];\n}\n","import semver, { type ReleaseType } from \"semver\";\n\n/**\n * Get the priority of given type.\n * @example\n * - \"patch\" => 0\n * - \"minor\" => 1\n * - \"major\" => 2\n */\nfunction getPriority(type?: string): number {\n\treturn [\"patch\", \"minor\", \"major\"].indexOf(type ?? \"\");\n}\n\n/**\n * Get the given versions highest state.\n * @example\n * - \"patch\"\n * - \"minor\"\n * - \"major\"\n */\nfunction getVersionType(version: string): \"patch\" | \"minor\" | \"major\" | undefined {\n\tconst parseVersion = semver.parse(version);\n\n\tif (parseVersion?.major) {\n\t\treturn \"major\";\n\t} else if (parseVersion?.minor) {\n\t\treturn \"minor\";\n\t} else if (parseVersion?.patch) {\n\t\treturn \"patch\";\n\t}\n\n\treturn undefined;\n}\n\n/**\n * Get the recommended release type for the given version depending on if\n * the user asks for a prerelease with or without a tag.\n * ```js\n * getReleaseType(\"patch\", \"1.0.0\", false) => \"patch\"\n * getReleaseType(\"major\", \"0.0.0-beta\", \"beta\") => \"premajor\"\n * ```\n */\nexport function getReleaseType(\n\treleaseType: \"major\" | \"minor\" | \"patch\",\n\tcurrentVersion: string,\n\tpreReleaseTag?: string | boolean,\n): ReleaseType {\n\tif (!preReleaseTag) {\n\t\treturn releaseType;\n\t}\n\n\tconst currentVersionsIsPreRelease = Array.isArray(semver.prerelease(currentVersion));\n\tif (currentVersionsIsPreRelease) {\n\t\tconst currentReleaseType = getVersionType(currentVersion);\n\n\t\tif (\n\t\t\tcurrentReleaseType === releaseType ||\n\t\t\tgetPriority(currentReleaseType) > getPriority(releaseType)\n\t\t) {\n\t\t\treturn \"prerelease\";\n\t\t}\n\t}\n\n\treturn `pre${releaseType}`;\n}\n","import { resolve } from \"node:path\";\nimport { writeFileSync, readFileSync } from \"node:fs\";\nimport conventionalChangelog from \"conventional-changelog\";\n\nimport { fileExists } from \"../utils/file-state\";\nimport type { ForkConfig } from \"../config/schema\";\nimport type { Logger } from \"../utils/logger\";\n\n/**\n * Matches the following changelog header formats:\n * - `## [1.2.3]`\n * - `<a name=\"1.2.3\"></a>`\n */\nconst RELEASE_PATTERN = /(^#+ \\[?[0-9]+\\.[0-9]+\\.[0-9]+|<a name=)/m;\n\n/**\n * Get the existing changelog content from the latest release onwards.\n * @see {@link RELEASE_PATTERN}\n */\nfunction getOldReleaseContent(filePath: string, exists: boolean): string {\n\tif (exists) {\n\t\tconst fileContents = readFileSync(filePath, \"utf-8\");\n\t\tconst oldContentStart = fileContents.search(RELEASE_PATTERN);\n\n\t\tif (oldContentStart !== -1) {\n\t\t\treturn fileContents.substring(oldContentStart);\n\t\t}\n\t}\n\n\treturn \"\";\n}\n\n/**\n * Generate the new changelog content for this release.\n */\nfunction getNewReleaseContent(\n\tconfig: ForkConfig,\n\tlogger: Logger,\n\tnextVersion: string,\n): Promise<string> {\n\treturn new Promise<string>((onResolve) => {\n\t\tlet newContent = \"\";\n\n\t\tconventionalChangelog(\n\t\t\t{\n\t\t\t\tpreset: {\n\t\t\t\t\tname: \"conventionalcommits\",\n\t\t\t\t\t...config.changelogPresetConfig,\n\t\t\t\t},\n\t\t\t\ttagPrefix: config.tagPrefix,\n\t\t\t\twarn: (...message: string[]) => logger.error(\"[conventional-changelog] \", ...message),\n\t\t\t\tcwd: config.path,\n\t\t\t},\n\t\t\t{\n\t\t\t\tversion: nextVersion,\n\t\t\t},\n\t\t\t{\n\t\t\t\tmerges: null,\n\t\t\t\tpath: config.path,\n\t\t\t},\n\t\t)\n\t\t\t.on(\"error\", (error) => {\n\t\t\t\tlogger.error(\"[conventional-changelog] Unable to parse changes\");\n\t\t\t\tthrow error;\n\t\t\t})\n\t\t\t.on(\"data\", (chunk) => {\n\t\t\t\tnewContent += chunk.toString();\n\t\t\t})\n\t\t\t.on(\"end\", () => {\n\t\t\t\tonResolve(newContent);\n\t\t\t});\n\t});\n}\n\ninterface UpdateChangelog {\n\tchangelogPath: string;\n\toldContent: string;\n\tnewContent: string;\n}\n\nexport async function updateChangelog(\n\tconfig: ForkConfig,\n\tlogger: Logger,\n\tnextVersion: string,\n): Promise<UpdateChangelog> {\n\tif (config.header.search(RELEASE_PATTERN) !== -1) {\n\t\t// Need to ensure the header doesn't contain the release pattern\n\t\tthrow new Error(\"Header cannot contain release pattern\");\n\t}\n\n\t// Create the changelog file if it doesn't exist\n\tconst changelogPath = resolve(config.path, config.changelog);\n\tif (!config.dryRun && !fileExists(changelogPath)) {\n\t\tlogger.log(`Creating Changelog file: ${changelogPath}`);\n\t\twriteFileSync(changelogPath, \"\\n\", \"utf8\");\n\t}\n\n\tconst oldContent = getOldReleaseContent(changelogPath, fileExists(changelogPath));\n\tconst newContent = await getNewReleaseContent(config, logger, nextVersion);\n\n\tlogger.log(`Updating Changelog: ${changelogPath}`);\n\tif (!config.dryRun && newContent) {\n\t\twriteFileSync(\n\t\t\tchangelogPath,\n\t\t\t`${config.header}\n${newContent}\n${oldContent}\n`.trim(),\n\t\t\t\"utf8\",\n\t\t);\n\t}\n\n\treturn {\n\t\tchangelogPath,\n\t\toldContent,\n\t\tnewContent,\n\t};\n}\n","import { lstatSync } from \"fs\";\n\n/**\n * Determine if a file exists.\n * @example\n * ```ts\n * fileExists(\"~/.bashrc\"); // true\n * fileExists(\"~/missing-file.txt\"); // false\n * ```\n */\nexport function fileExists(filePath: string): boolean {\n\ttry {\n\t\treturn lstatSync(filePath).isFile();\n\t} catch (e) {\n\t\treturn false;\n\t}\n}\n","import { resolve } from \"node:path\";\nimport { Git } from \"../utils/git\";\nimport { formatCommitMessage } from \"../utils/format-commit-message\";\nimport { fileExists } from \"../utils/file-state\";\nimport type { ForkConfig } from \"../config/schema\";\nimport type { FileState } from \"../strategies/file-manager\";\nimport type { Logger } from \"../utils/logger\";\n\ninterface CommitChanges {\n\tfilesToCommit: string[];\n\tgitAddOutput?: string;\n\tgitCommitOutput?: string;\n}\n\nexport async function commitChanges(\n\tconfig: ForkConfig,\n\tlogger: Logger,\n\tfiles: FileState[],\n\tnextVersion: string,\n): Promise<CommitChanges> {\n\tconst git = new Git(config, logger);\n\n\tlogger.log(\"Committing changes\");\n\n\tconst filesToCommit: string[] = [];\n\tif (fileExists(resolve(config.path, config.changelog))) {\n\t\tfilesToCommit.push(resolve(config.path, config.changelog));\n\t}\n\tfor (const file of files) {\n\t\tfilesToCommit.push(file.path);\n\t}\n\n\t// If there are no files to commit don't continue.\n\tif (filesToCommit.length === 0) {\n\t\treturn {\n\t\t\tfilesToCommit,\n\t\t};\n\t}\n\n\tconst shouldVerify = config.verify ? undefined : \"--no-verify\";\n\tconst shouldSign = config.sign ? \"--gpg-sign\" : undefined;\n\n\t// If commitAll is set, commit all changed files.\n\tif (config.commitAll) {\n\t\treturn {\n\t\t\tfilesToCommit,\n\t\t\tgitAddOutput: await git.add(\"--all\"),\n\t\t\tgitCommitOutput: await git.commit(\n\t\t\t\tshouldVerify,\n\t\t\t\tshouldSign,\n\t\t\t\t\"--message\",\n\t\t\t\tformatCommitMessage(config.changelogPresetConfig?.releaseCommitMessageFormat, nextVersion),\n\t\t\t),\n\t\t};\n\t}\n\n\treturn {\n\t\tfilesToCommit,\n\t\tgitAddOutput: await git.add(...filesToCommit),\n\t\tgitCommitOutput: await git.commit(\n\t\t\tshouldVerify,\n\t\t\tshouldSign,\n\t\t\t...filesToCommit,\n\t\t\t\"--message\",\n\t\t\tformatCommitMessage(config.changelogPresetConfig?.releaseCommitMessageFormat, nextVersion),\n\t\t),\n\t};\n}\n","import { execFile } from \"node:child_process\";\nimport type { ForkConfig } from \"../config/schema\";\nimport type { Logger } from \"./logger\";\n\nexport class Git {\n\tconstructor(\n\t\tprivate config: ForkConfig,\n\t\tprivate logger: Logger,\n\t) {\n\t\tthis.add = this.add.bind(this);\n\t\tthis.commit = this.commit.bind(this);\n\t\tthis.tag = this.tag.bind(this);\n\t\tthis.currentBranch = this.currentBranch.bind(this);\n\t}\n\n\tpublic add(...args: (string | undefined)[]) {\n\t\tif (this.config.dryRun) {\n\t\t\treturn Promise.resolve(\"\");\n\t\t}\n\n\t\treturn this.execGit(\"add\", args.filter(Boolean) as string[]);\n\t}\n\n\tpublic commit(...args: (string | undefined)[]) {\n\t\tif (this.config.dryRun) {\n\t\t\treturn Promise.resolve(\"\");\n\t\t}\n\n\t\treturn this.execGit(\"commit\", args.filter(Boolean) as string[]);\n\t}\n\n\tpublic tag(...args: (string | undefined)[]) {\n\t\tif (this.config.dryRun) {\n\t\t\treturn Promise.resolve(\"\");\n\t\t}\n\n\t\treturn this.execGit(\"tag\", args.filter(Boolean) as string[]);\n\t}\n\n\tpublic async currentBranch() {\n\t\treturn (await this.execGit(\"rev-parse\", [\"--abbrev-ref\", \"HEAD\"])).trim();\n\t}\n\n\tprivate execGit(command: string, args: string[]): Promise<string> {\n\t\tthis.logger.debug(`[git ${command}] ${args.join(\" \")}`);\n\n\t\treturn new Promise((onResolve, onReject) => {\n\t\t\texecFile(\n\t\t\t\t\"git\",\n\t\t\t\t[command, ...args],\n\t\t\t\t{\n\t\t\t\t\tcwd: this.config.path,\n\t\t\t\t},\n\t\t\t\t(error, stdout, stderr) => {\n\t\t\t\t\tif (error) {\n\t\t\t\t\t\tthis.logger.error(`[git ${command}] `);\n\t\t\t\t\t\tonReject(error);\n\t\t\t\t\t}\n\n\t\t\t\t\tonResolve(stdout ? stdout : stderr);\n\t\t\t\t},\n\t\t\t);\n\t\t});\n\t}\n}\n","/**\n * Formats the commit message by replacing the `{{currentTag}}` placeholder\n * globally with the new version.\n *\n * Falls back to `chore(release): {{currentTag}}` if message is argument is falsy.\n */\nexport function formatCommitMessage(message: string | undefined, version: string): string {\n\tif (!message) {\n\t\tmessage = \"chore(release): {{currentTag}}\";\n\t}\n\n\treturn message.replace(new RegExp(\"{{currentTag}}\", \"g\"), version);\n}\n","import { Git } from \"../utils/git\";\nimport { formatCommitMessage } from \"../utils/format-commit-message\";\nimport type { ForkConfig } from \"../config/schema\";\nimport type { Logger } from \"../utils/logger\";\n\ninterface TagChanges {\n\tgitTagOutput: string;\n}\n\nexport async function tagChanges(\n\tconfig: ForkConfig,\n\tlogger: Logger,\n\tnextVersion: string,\n): Promise<TagChanges> {\n\tconst git = new Git(config, logger);\n\n\t/** @example \"v1.2.3\" or \"version/1.2.3\" */\n\tconst tag = `${config.tagPrefix}${nextVersion}`;\n\n\tlogger.log(`Creating Tag: ${tag}`);\n\n\tconst gitTagOutput = await git.tag(\n\t\tconfig.sign ? \"--sign\" : \"--annotate\",\n\t\ttag,\n\t\t\"--message\",\n\t\tformatCommitMessage(config.changelogPresetConfig?.releaseCommitMessageFormat, nextVersion),\n\t);\n\n\treturn {\n\t\tgitTagOutput,\n\t};\n}\n","import { resolve } from \"node:path\";\nimport { readFileSync, writeFileSync } from \"node:fs\";\nimport detectIndent from \"detect-indent\";\nimport { detectNewline } from \"detect-newline\";\n\nimport { stringifyPackage } from \"../libs/stringify-package\";\nimport { fileExists } from \"../utils/file-state\";\nimport type { ForkConfig } from \"../config/schema\";\nimport type { Logger } from \"../utils/logger\";\nimport type { FileState, IFileManager } from \"./file-manager\";\n\n/**\n * A json package file should have a version property, like what can be seen\n * in the package.json file in the root of this project.\n *\n * @example\n * ```json\n * {\n * \"name\": \"fork-version\",\n * \"version\": \"1.2.3\",\n * \"private\": true,\n * }\n * ```\n */\nexport class JSONPackage implements IFileManager {\n\tconstructor(\n\t\tprivate config: ForkConfig,\n\t\tprivate logger: Logger,\n\t) {}\n\n\tpublic read(fileName: string): FileState | undefined {\n\t\tconst filePath = resolve(this.config.path, fileName);\n\n\t\tif (fileExists(filePath)) {\n\t\t\tconst fileContents = readFileSync(filePath, \"utf8\");\n\t\t\tconst parsedJson = JSON.parse(fileContents);\n\n\t\t\tif (parsedJson.version) {\n\t\t\t\treturn {\n\t\t\t\t\tname: fileName,\n\t\t\t\t\tpath: filePath,\n\t\t\t\t\tversion: parsedJson.version,\n\n\t\t\t\t\tisPrivate: typeof parsedJson?.private === \"boolean\" ? parsedJson.private : true,\n\t\t\t\t};\n\t\t\t}\n\n\t\t\tthis.logger.warn(`[File Manager] Unable to determine json package: ${fileName}`);\n\t\t}\n\t}\n\n\tpublic write(fileState: FileState, newVersion: string) {\n\t\tconst fileContents = readFileSync(fileState.path, \"utf8\");\n\t\tconst parsedJson = JSON.parse(fileContents);\n\n\t\tparsedJson.version = newVersion;\n\t\tif (parsedJson.packages?.[\"\"]) {\n\t\t\tparsedJson.packages[\"\"].version = newVersion; // package-lock v2 stores version here too.\n\t\t}\n\n\t\twriteFileSync(\n\t\t\tfileState.path,\n\t\t\tstringifyPackage(parsedJson, detectIndent(fileContents).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(fileState: FileState, newVersion: string) {\n\t\twriteFileSync(fileState.path, newVersion, \"utf8\");\n\t}\n}\n","import { resolve } from \"node:path\";\nimport { readFileSync, writeFileSync } from \"node:fs\";\nimport * as cheerio from \"cheerio/lib/slim\";\n\nimport { fileExists } from \"../utils/file-state\";\nimport type { ForkConfig } from \"../config/schema\";\nimport type { Logger } from \"../utils/logger\";\nimport type { FileState, IFileManager } from \"./file-manager\";\n\n/**\n * A csproj file is an xml file with a version property under the Project > PropertyGroup node.\n *\n * @example\n * ```xml\n * <Project Sdk=\"Microsoft.NET.Sdk\">\n * <PropertyGroup>\n * <Version>1.2.3</Version>\n * </PropertyGroup>\n * </Project>\n * ```\n */\nexport class CSharpProject implements IFileManager {\n\tconstructor(\n\t\tprivate config: ForkConfig,\n\t\tprivate logger: Logger,\n\t) {}\n\n\tpublic read(fileName: string): FileState | undefined {\n\t\tconst filePath = resolve(this.config.path, fileName);\n\n\t\tif (fileExists(filePath)) {\n\t\t\tconst fileContents = readFileSync(filePath, \"utf8\");\n\t\t\tconst $ = cheerio.load(fileContents, { xmlMode: true, decodeEntities: false });\n\n\t\t\tconst version = $(\"Project > PropertyGroup > Version\").text();\n\t\t\tif (version) {\n\t\t\t\treturn {\n\t\t\t\t\tname: fileName,\n\t\t\t\t\tpath: filePath,\n\t\t\t\t\tversion: version,\n\t\t\t\t};\n\t\t\t}\n\n\t\t\tthis.logger.warn(`[File Manager] Unable to determine csproj package: ${fileName}`);\n\t\t}\n\t}\n\n\tpublic write(fileState: FileState, newVersion: string) {\n\t\tconst fileContents = readFileSync(fileState.path, \"utf8\");\n\t\tconst $ = cheerio.load(fileContents, { xmlMode: true, decodeEntities: false });\n\n\t\t$(\"Project > PropertyGroup > Version\").text(newVersion);\n\n\t\t// Cheerio doesn't handle self-closing tags well,\n\t\t// so we're manually adding a space before the closing tag.\n\t\tconst updatedContent = $.xml().replaceAll('\"/>', '\" />');\n\n\t\twriteFileSync(fileState.path, updatedContent, \"utf8\");\n\t}\n}\n","import { JSONPackage } from \"./json-package\";\nimport { PlainText } from \"./plain-text\";\nimport { CSharpProject } from \"./csharp-project\";\n\nimport type { ForkConfig } from \"../config/schema\";\nimport type { Logger } from \"../utils/logger\";\n\nexport interface FileState {\n\tname: string;\n\tpath: string;\n\tversion: string;\n\n\t[other: string]: unknown;\n}\n\nexport interface IFileManager {\n\tread(fileName: string): FileState | undefined;\n\twrite(fileState: FileState, newVersion: string): void;\n}\n\nexport class FileManager implements IFileManager {\n\tprivate JSONPackage: JSONPackage;\n\tprivate PlainText: PlainText;\n\tprivate CSharpProject: CSharpProject;\n\n\tconstructor(\n\t\tprivate config: ForkConfig,\n\t\tprivate logger: Logger,\n\t) {\n\t\tthis.JSONPackage = new JSONPackage(config, logger);\n\t\tthis.PlainText = new PlainText(config, logger);\n\t\tthis.CSharpProject = new CSharpProject(config, logger);\n\t}\n\n\t/**\n\t * Get the state from the given file name.\n\t *\n\t * @example\n\t * ```ts\n\t * fileManager.read(\"package.json\");\n\t * ```\n\t *\n\t * @returns\n\t * ```json\n\t * { \"name\": \"package.json\", \"path\": \"/path/to/package.json\", \"version\": \"1.2.3\", \"isPrivate\": true }\n\t * ```\n\t */\n\tpublic read(fileName: string): FileState | undefined {\n\t\tconst _fileName = fileName.toLowerCase();\n\n\t\tif (_fileName.endsWith(\".json\")) {\n\t\t\treturn this.JSONPackage.read(fileName);\n\t\t}\n\n\t\tif (_fileName.endsWith(\"version.txt\")) {\n\t\t\treturn this.PlainText.read(fileName);\n\t\t}\n\n\t\tif (_fileName.endsWith(\".csproj\")) {\n\t\t\treturn this.CSharpProject.read(fileName);\n\t\t}\n\n\t\tthis.logger.error(`[File Manager] Unsupported file: ${fileName}`);\n\t}\n\n\t/**\n\t * Write the new version to the given file.\n\t *\n\t * @example\n\t * ```ts\n\t * fileManager.write(\n\t * { name: \"package.json\", path: \"/path/to/package.json\", version: \"1.2.2\" },\n\t * \"1.2.3\"\n\t * );\n\t * ```\n\t */\n\tpublic write(fileState: FileState, newVersion: string): void {\n\t\tif (this.config.dryRun) {\n\t\t\treturn;\n\t\t}\n\t\tconst _fileName = fileState.name.toLowerCase();\n\n\t\tif (_fileName.endsWith(\".json\")) {\n\t\t\treturn this.JSONPackage.write(fileState, newVersion);\n\t\t}\n\n\t\tif (_fileName.endsWith(\"version.txt\")) {\n\t\t\treturn this.PlainText.write(fileState, newVersion);\n\t\t}\n\n\t\tif (_fileName.endsWith(\".csproj\")) {\n\t\t\treturn this.CSharpProject.write(fileState, newVersion);\n\t\t}\n\n\t\tthis.logger.error(`[File Manager] Unsupported file: ${fileState.path}`);\n\t}\n}\n"]}
|