diff --git a/docs/Supported-File-Managers.md b/docs/Supported-File-Managers.md index 1a67502..3574d34 100644 --- a/docs/Supported-File-Managers.md +++ b/docs/Supported-File-Managers.md @@ -154,4 +154,4 @@ export default defineConfig({ }); ``` -> [See `IFileManager` interface to see the required methods and properties for a custom file manager.](../src/files/file-manager.ts) +> [See `IFileManager` interface to see the required methods and properties for a custom file manager.](../src/services/file-manager.ts) diff --git a/examples/custom-file-manager/README.md b/examples/custom-file-manager/README.md index 2b36f02..26893fe 100644 --- a/examples/custom-file-manager/README.md +++ b/examples/custom-file-manager/README.md @@ -26,4 +26,4 @@ You can define a custom file manager either by implementing the `IFileManager` i - [custom-file-manager-function.ts](./custom-file-manager-function.ts) - defines a custom file manager using the `defineFileManager` function. > [!NOTE] -> Have a look at the [files folder](../../src/files) within the fork-version source code for example on how to work with different file types. +> Have a look at the [file-managers folder](../../src/file-managers) within the fork-version source code for example on how to work with different file types. diff --git a/src/cli.ts b/src/cli.ts index 2bf1cc9..e388e0b 100644 --- a/src/cli.ts +++ b/src/cli.ts @@ -7,7 +7,7 @@ import { ZodError } from "zod"; import { getCliArguments } from "./config/cli-arguments"; import { getUserConfig } from "./config/user-config"; import { Logger } from "./services/logger"; -import { FileManager } from "./files/file-manager"; +import { FileManager } from "./services/file-manager"; import { Git } from "./services/git"; import { validateConfig } from "./commands/validate-config"; diff --git a/src/commands/__tests__/inspect.test.ts b/src/commands/__tests__/inspect.test.ts index 9015054..ec37d7b 100644 --- a/src/commands/__tests__/inspect.test.ts +++ b/src/commands/__tests__/inspect.test.ts @@ -1,5 +1,5 @@ import { setupTest } from "../../../tests/setup-tests"; -import { FileManager } from "../../files/file-manager"; +import { FileManager } from "../../services/file-manager"; import { inspect } from "../inspect"; describe("inspect", () => { diff --git a/src/commands/inspect.ts b/src/commands/inspect.ts index 0fc9a05..c100552 100644 --- a/src/commands/inspect.ts +++ b/src/commands/inspect.ts @@ -4,7 +4,7 @@ import { getCurrentVersion } from "../process/get-current-version"; import type { ForkConfig } from "../config/types"; import type { Logger } from "../services/logger"; -import type { FileManager } from "../files/file-manager"; +import type { FileManager } from "../services/file-manager"; import type { Git } from "../services/git"; export async function inspect( diff --git a/src/commands/main.ts b/src/commands/main.ts index d9d9863..d07a3ba 100644 --- a/src/commands/main.ts +++ b/src/commands/main.ts @@ -7,7 +7,7 @@ import { tagChanges } from "../process/tag"; import type { ForkConfig } from "../config/types"; import type { Logger } from "../services/logger"; -import type { FileManager } from "../files/file-manager"; +import type { FileManager } from "../services/file-manager"; import type { Git } from "../services/git"; export async function main(config: ForkConfig, logger: Logger, fileManager: FileManager, git: Git) { diff --git a/src/config/__tests__/define-file-manager.test.ts b/src/config/__tests__/define-file-manager.test.ts new file mode 100644 index 0000000..9a4fef7 --- /dev/null +++ b/src/config/__tests__/define-file-manager.test.ts @@ -0,0 +1,23 @@ +import { defineFileManager } from "../define-file-manager"; +import type { IFileManager } from "../../services/file-manager"; + +describe("define-file-manager", () => { + it("should return the given file manager", () => { + const TEST_FILE_MANAGER: IFileManager = { + read: async (filePath) => { + return { + path: filePath, + version: "1.2.3", + }; + }, + write: async (_fileState, _newVersion) => { + // no-op + }, + isSupportedFile: (filePath) => { + return filePath.endsWith(".test"); + }, + }; + + expect(defineFileManager(TEST_FILE_MANAGER)).toStrictEqual(TEST_FILE_MANAGER); + }); +}); diff --git a/src/config/define-config.ts b/src/config/define-config.ts index 562a483..514d750 100644 --- a/src/config/define-config.ts +++ b/src/config/define-config.ts @@ -1,7 +1,22 @@ import type { Config } from "./types"; /** - * [Fork-Version - Config Properties](https://github.com/eglavin/fork-version/blob/main/README.md#config-properties) + * Optional helper function to enable intellisense and type checking when defining a Fork-Version configuration object. + * + * [Fork-Version - Config Options](https://github.com/eglavin/fork-version/blob/main/docs/Configuration.md#config-options) + * + * @example + * ```ts + * // File: fork.config.ts + * import { defineConfig } from "fork-version"; + * + * export default defineConfig({ + * header: "# Changelog\n\nMy Custom Changelog Header", + * }); + * ``` + * + * @param config The configuration object to be defined. + * @returns The same configuration object that was passed in. */ export function defineConfig(config: Config): Config { return config; diff --git a/src/config/define-file-manager.ts b/src/config/define-file-manager.ts new file mode 100644 index 0000000..24eef11 --- /dev/null +++ b/src/config/define-file-manager.ts @@ -0,0 +1,41 @@ +import type { IFileManager } from "../services/file-manager"; + +/** + * Optional helper function to enable intellisense and type checking when defining a custom file manager. + * + * [Fork-Version - Custom File Managers](https://github.com/eglavin/fork-version/blob/main/docs/Supported-File-Managers.md#custom-file-updaters) + * + * + * @example + * ```ts + * // File: fork.config.ts + * import { defineFileManager } from "fork-version"; + * + * const myFileManager = defineFileManager({ + * async read(filePath) { + * // Logic to read the file and extract the version. + * return { + * path: "/path/to/file", + * version: "1.2.3", + * }; + * }, + * async write(fileState, newVersion) { + * // Logic to write the updated version. + * }, + * isSupportedFile(fileName) { + * // Logic to determine if the file is supported by this file manager. + * return fileName.endsWith(".custom"); + * }, + * }); + * + * export default { + * customFileManagers: [myFileManager], + * } + * ``` + * + * @param fileManager The custom file manager to be defined. + * @returns The same file manager object that was passed in. + */ +export function defineFileManager(fileManager: IFileManager): IFileManager { + return fileManager; +} diff --git a/src/config/types.ts b/src/config/types.ts index 7173175..9c46eba 100644 --- a/src/config/types.ts +++ b/src/config/types.ts @@ -1,6 +1,6 @@ import type { getCliArguments } from "./cli-arguments"; import type { ParserOptions } from "../commit-parser/options"; -import type { IFileManager } from "../files/file-manager"; +import type { IFileManager } from "../services/file-manager"; export interface ChangelogPresetConfigType { /** diff --git a/src/files/__tests__/arm-bicep.test.ts b/src/file-managers/__tests__/arm-bicep.test.ts similarity index 98% rename from src/files/__tests__/arm-bicep.test.ts rename to src/file-managers/__tests__/arm-bicep.test.ts index 3c77289..ab9119e 100644 --- a/src/files/__tests__/arm-bicep.test.ts +++ b/src/file-managers/__tests__/arm-bicep.test.ts @@ -1,7 +1,7 @@ import { readFileSync } from "node:fs"; import { setupTest } from "../../../tests/setup-tests"; -import { MissingPropertyException } from "../file-manager"; +import { MissingPropertyException } from "../../services/file-manager"; import { ARMBicep } from "../arm-bicep"; describe("files arm-bicep", () => { diff --git a/src/files/__tests__/install-shield-ism.test.ts b/src/file-managers/__tests__/install-shield-ism.test.ts similarity index 97% rename from src/files/__tests__/install-shield-ism.test.ts rename to src/file-managers/__tests__/install-shield-ism.test.ts index 1692136..f12749a 100644 --- a/src/files/__tests__/install-shield-ism.test.ts +++ b/src/file-managers/__tests__/install-shield-ism.test.ts @@ -1,5 +1,5 @@ import { setupTest } from "../../../tests/setup-tests"; -import { MissingPropertyException } from "../file-manager"; +import { MissingPropertyException } from "../../services/file-manager"; import { InstallShieldISM } from "../install-shield-ism"; describe("files install-shield-ism", () => { diff --git a/src/files/__tests__/json-package.test.ts b/src/file-managers/__tests__/json-package.test.ts similarity index 98% rename from src/files/__tests__/json-package.test.ts rename to src/file-managers/__tests__/json-package.test.ts index c84a3ea..eb57283 100644 --- a/src/files/__tests__/json-package.test.ts +++ b/src/file-managers/__tests__/json-package.test.ts @@ -1,7 +1,7 @@ import { readFileSync } from "node:fs"; import { setupTest } from "../../../tests/setup-tests"; -import { MissingPropertyException } from "../file-manager"; +import { MissingPropertyException } from "../../services/file-manager"; import { JSONPackage } from "../json-package"; describe("files json-package", () => { diff --git a/src/files/__tests__/ms-build-project.test.ts b/src/file-managers/__tests__/ms-build-project.test.ts similarity index 98% rename from src/files/__tests__/ms-build-project.test.ts rename to src/file-managers/__tests__/ms-build-project.test.ts index ff3bc6c..15231a2 100644 --- a/src/files/__tests__/ms-build-project.test.ts +++ b/src/file-managers/__tests__/ms-build-project.test.ts @@ -1,7 +1,7 @@ import { readFileSync } from "node:fs"; import { setupTest } from "../../../tests/setup-tests"; -import { MissingPropertyException } from "../file-manager"; +import { MissingPropertyException } from "../../services/file-manager"; import { MSBuildProject } from "../ms-build-project"; describe("files ms-build-project", () => { diff --git a/src/files/__tests__/plain-text.test.ts b/src/file-managers/__tests__/plain-text.test.ts similarity index 95% rename from src/files/__tests__/plain-text.test.ts rename to src/file-managers/__tests__/plain-text.test.ts index 179ffd1..99f09eb 100644 --- a/src/files/__tests__/plain-text.test.ts +++ b/src/file-managers/__tests__/plain-text.test.ts @@ -1,7 +1,7 @@ import { readFileSync } from "node:fs"; import { setupTest } from "../../../tests/setup-tests"; -import { MissingPropertyException } from "../file-manager"; +import { MissingPropertyException } from "../../services/file-manager"; import { PlainText } from "../plain-text"; describe("files plain-text", () => { diff --git a/src/files/__tests__/yaml-package.test.ts b/src/file-managers/__tests__/yaml-package.test.ts similarity index 97% rename from src/files/__tests__/yaml-package.test.ts rename to src/file-managers/__tests__/yaml-package.test.ts index b07570f..3796875 100644 --- a/src/files/__tests__/yaml-package.test.ts +++ b/src/file-managers/__tests__/yaml-package.test.ts @@ -1,5 +1,5 @@ import { setupTest } from "../../../tests/setup-tests"; -import { MissingPropertyException } from "../file-manager"; +import { MissingPropertyException } from "../../services/file-manager"; import { YAMLPackage } from "../yaml-package"; describe("files yaml-package", () => { diff --git a/src/files/arm-bicep.ts b/src/file-managers/arm-bicep.ts similarity index 92% rename from src/files/arm-bicep.ts rename to src/file-managers/arm-bicep.ts index 1baa1ff..5e6f6f9 100644 --- a/src/files/arm-bicep.ts +++ b/src/file-managers/arm-bicep.ts @@ -1,6 +1,10 @@ import { readFile, writeFile } from "node:fs/promises"; -import { MissingPropertyException, type FileState, type IFileManager } from "./file-manager"; +import { + MissingPropertyException, + type FileState, + type IFileManager, +} from "../services/file-manager"; /** * An ARM bicep file with metadata and variable called contentVersion. diff --git a/src/files/install-shield-ism.ts b/src/file-managers/install-shield-ism.ts similarity index 94% rename from src/files/install-shield-ism.ts rename to src/file-managers/install-shield-ism.ts index 0cf1d2a..9c6aada 100644 --- a/src/files/install-shield-ism.ts +++ b/src/file-managers/install-shield-ism.ts @@ -1,7 +1,11 @@ import { readFile, writeFile } from "node:fs/promises"; import * as cheerio from "cheerio/slim"; -import { MissingPropertyException, type FileState, type IFileManager } from "./file-manager"; +import { + MissingPropertyException, + type FileState, + type IFileManager, +} from "../services/file-manager"; /** * An InstallShield ISM file can be either XML or binary, only the XML format is supported diff --git a/src/files/json-package.ts b/src/file-managers/json-package.ts similarity index 96% rename from src/files/json-package.ts rename to src/file-managers/json-package.ts index ebfbcad..8c27ad8 100644 --- a/src/files/json-package.ts +++ b/src/file-managers/json-package.ts @@ -8,7 +8,11 @@ import { type ParseOptions, } from "jsonc-parser"; -import { MissingPropertyException, type FileState, type IFileManager } from "./file-manager"; +import { + MissingPropertyException, + type FileState, + type IFileManager, +} from "../services/file-manager"; /** The things we are interested in, in package.json-like files. */ interface PackageJsonish { diff --git a/src/files/ms-build-project.ts b/src/file-managers/ms-build-project.ts similarity index 94% rename from src/files/ms-build-project.ts rename to src/file-managers/ms-build-project.ts index 18c0134..a59fd2a 100644 --- a/src/files/ms-build-project.ts +++ b/src/file-managers/ms-build-project.ts @@ -1,7 +1,11 @@ import { readFile, writeFile } from "node:fs/promises"; import * as cheerio from "cheerio/slim"; -import { MissingPropertyException, type FileState, type IFileManager } from "./file-manager"; +import { + MissingPropertyException, + type FileState, + type IFileManager, +} from "../services/file-manager"; /** * A ms-build file is an xml file with a version property under the Project > PropertyGroup node. diff --git a/src/files/plain-text.ts b/src/file-managers/plain-text.ts similarity index 87% rename from src/files/plain-text.ts rename to src/file-managers/plain-text.ts index fc1ecd1..1fc6967 100644 --- a/src/files/plain-text.ts +++ b/src/file-managers/plain-text.ts @@ -1,6 +1,10 @@ import { readFile, writeFile } from "node:fs/promises"; -import { MissingPropertyException, type FileState, type IFileManager } from "./file-manager"; +import { + MissingPropertyException, + type FileState, + type IFileManager, +} from "../services/file-manager"; /** * A plain text file will have just the version as the content. diff --git a/src/files/yaml-package.ts b/src/file-managers/yaml-package.ts similarity index 92% rename from src/files/yaml-package.ts rename to src/file-managers/yaml-package.ts index 5d23ab5..410c9f9 100644 --- a/src/files/yaml-package.ts +++ b/src/file-managers/yaml-package.ts @@ -1,7 +1,11 @@ import { readFile, writeFile } from "node:fs/promises"; import { parse, parseDocument } from "yaml"; -import { MissingPropertyException, type FileState, type IFileManager } from "./file-manager"; +import { + MissingPropertyException, + type FileState, + type IFileManager, +} from "../services/file-manager"; /** * A yaml package file should have a version property on the top level, like what can be seen diff --git a/src/index.ts b/src/index.ts index 23ef61b..adf301c 100644 --- a/src/index.ts +++ b/src/index.ts @@ -21,6 +21,7 @@ export type { Config, } from "./config/types"; export { defineConfig } from "./config/define-config"; +export { defineFileManager } from "./config/define-file-manager"; export { getUserConfig } from "./config/user-config"; export { getCommitsSinceTag, type CommitsSinceTag } from "./process/get-commits"; @@ -31,12 +32,10 @@ export { commitChanges } from "./process/commit"; export { tagChanges } from "./process/tag"; export { - defineFileManager, FileManager, MissingPropertyException, type FileState, type IFileManager, -} from "./files/file-manager"; - +} from "./services/file-manager"; export { Logger } from "./services/logger"; export { Git } from "./services/git"; diff --git a/src/process/__tests__/get-current-version.test.ts b/src/process/__tests__/get-current-version.test.ts index 92b4ad6..b0be909 100644 --- a/src/process/__tests__/get-current-version.test.ts +++ b/src/process/__tests__/get-current-version.test.ts @@ -1,7 +1,7 @@ import { setupTest } from "../../../tests/setup-tests"; import { getCommitsSinceTag } from "../get-commits"; import { getCurrentVersion } from "../get-current-version"; -import { FileManager } from "../../files/file-manager"; +import { FileManager } from "../../services/file-manager"; describe("getCurrentVersion", () => { it("should be able to read package.json", async () => { diff --git a/src/process/commit.ts b/src/process/commit.ts index 08140a6..1813845 100644 --- a/src/process/commit.ts +++ b/src/process/commit.ts @@ -2,7 +2,7 @@ import { resolve } from "node:path"; import { formatCommitMessage } from "../utils/format-commit-message"; import { fileExists } from "../utils/file-state"; import type { ForkConfig } from "../config/types"; -import type { FileState } from "../files/file-manager"; +import type { FileState } from "../services/file-manager"; import type { Logger } from "../services/logger"; import type { Git } from "../services/git"; diff --git a/src/process/get-current-version.ts b/src/process/get-current-version.ts index 0de137d..6bb254a 100644 --- a/src/process/get-current-version.ts +++ b/src/process/get-current-version.ts @@ -1,7 +1,7 @@ import semver from "semver"; import type { ForkConfig } from "../config/types"; -import type { FileManager, FileState } from "../files/file-manager"; +import type { FileManager, FileState } from "../services/file-manager"; import type { Logger } from "../services/logger"; import type { Git } from "../services/git"; diff --git a/src/files/__tests__/file-manager.test.ts b/src/services/__tests__/file-manager.test.ts similarity index 99% rename from src/files/__tests__/file-manager.test.ts rename to src/services/__tests__/file-manager.test.ts index 45b154b..aea7084 100644 --- a/src/files/__tests__/file-manager.test.ts +++ b/src/services/__tests__/file-manager.test.ts @@ -5,12 +5,12 @@ import { readFileSync } from "node:fs"; import { setupTest } from "../../../tests/setup-tests"; import { - defineFileManager, FileManager, MissingPropertyException, type FileState, type IFileManager, -} from "../file-manager"; +} from "../../services/file-manager"; +import { defineFileManager } from "../../config/define-file-manager"; describe("files file-manager", () => { describe("json file", () => { diff --git a/src/files/file-manager.ts b/src/services/file-manager.ts similarity index 90% rename from src/files/file-manager.ts rename to src/services/file-manager.ts index 0aa1986..3f42bbb 100644 --- a/src/files/file-manager.ts +++ b/src/services/file-manager.ts @@ -1,16 +1,16 @@ import { isAbsolute, relative, resolve } from "node:path"; import { fileExists } from "../utils/file-state"; -import { JSONPackage } from "./json-package"; -import { YAMLPackage } from "./yaml-package"; -import { PlainText } from "./plain-text"; -import { MSBuildProject } from "./ms-build-project"; -import { ARMBicep } from "./arm-bicep"; -import { InstallShieldISM } from "./install-shield-ism"; +import { JSONPackage } from "../file-managers/json-package"; +import { YAMLPackage } from "../file-managers/yaml-package"; +import { PlainText } from "../file-managers/plain-text"; +import { MSBuildProject } from "../file-managers/ms-build-project"; +import { ARMBicep } from "../file-managers/arm-bicep"; +import { InstallShieldISM } from "../file-managers/install-shield-ism"; import { extractBuildMetadata } from "../utils/extract-build-metadata"; import type { ForkConfig } from "../config/types"; -import type { Logger } from "../services/logger"; +import type { Logger } from "./logger"; /** * Exception thrown if a file manager encounters a file missing a required property, @@ -79,15 +79,6 @@ export interface IFileManager { isSupportedFile(filePath: string): boolean; } -/** - * Helper function to define a custom file manager with proper typing. - * - * [Fork-Version - Custom File Managers](https://github.com/eglavin/fork-version#custom-file-updaters) - */ -export function defineFileManager(fileManager: IFileManager): IFileManager { - return fileManager; -} - export class FileManager { #config: ForkConfig; #logger: Logger;