diff --git a/CHANGELOG.md b/CHANGELOG.md index 1848d0a..e62cf2a 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,11 @@ # commitsmile +## 0.5.0 + +### Minor Changes + +- FEAT: Add Breaking Changes stage in commiting. + ## 0.4.0 ### Minor Changes diff --git a/package.json b/package.json index ce58438..4cee1e0 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "commitsmile", - "version": "0.4.0", + "version": "0.5.0", "description": "Make smile on your commits", "keywords": [], "homepage": "", diff --git a/src/cli/default.ts b/src/cli/default.ts index 97310e4..fab423a 100644 --- a/src/cli/default.ts +++ b/src/cli/default.ts @@ -22,13 +22,15 @@ program { changes: async () => select(config.CHANGES), scopes: async () => select(config.SCOPES), + breakingChanges: async () => prompter.confirm(config.BREAKING_CHANGES), commitShort: async () => prompter.text(config.COMMIT_SHORT), commitDescription: async () => prompter.text(config.COMMIT_DESCRIPTION), commit: async ({ results }) => { - const { changes, scopes, commitShort } = results; + const { changes, scopes, commitShort, breakingChanges } = results; const commit = (): string => { const scopesFormat = scopes ? `(${scopes})` : ""; - return `${changes}${scopesFormat}: ${commitShort}`; + const breakingChangesFormat = breakingChanges ? "!" : ""; + return `${changes}${scopesFormat}${breakingChangesFormat}: ${commitShort}`; }; prompter.note(commit()); let agree = await prompter.confirm({ message: "Commit message is correct?" }); diff --git a/src/defaultConfig.ts b/src/defaultConfig.ts index d1c2192..04d5d6e 100644 --- a/src/defaultConfig.ts +++ b/src/defaultConfig.ts @@ -70,6 +70,12 @@ export const defaultConfig: z.infer = { { label: "🍃 API", value: "api" } ] }, + BREAKING_CHANGES: { + message: "Are there any breaking changes?", + active: "Yes", + inactive: "No", + initialValue: false + }, COMMIT_SHORT: { message: "Write short description of commit", validate(input: string) { diff --git a/src/utils/types.ts b/src/utils/types.ts index d2ae339..cff751e 100644 --- a/src/utils/types.ts +++ b/src/utils/types.ts @@ -1,11 +1,14 @@ import defaultConfig from "@/defaultConfig"; -import type { multiselect, text } from "@clack/prompts"; +import type { multiselect, text, confirm } from "@clack/prompts"; import z from "zod"; export type flatMultipleClack = FlatArray, 0>; const flatMultipleClackZod = z.custom(() => true); +export type TConfirmFlat = FlatArray, 0>; +export const TConfirmScheme = z.custom(() => true); + export const TSelectScheme = z .object({ custom: z.object({ @@ -30,6 +33,7 @@ export type TStages = "CHANGES" | "COMMIT_DESCRIPTION" | "COMMIT_SHORT" | "SCOPE export const configSchema = z.object({ CHANGES: TSelectScheme, SCOPES: TSelectScheme, + BREAKING_CHANGES: TConfirmScheme, COMMIT_SHORT: TOptionTextZod, COMMIT_DESCRIPTION: TOptionTextZod }) satisfies TStagesZod; @@ -37,6 +41,7 @@ export const configSchema = z.object({ export const UserConfigSchema = z.object({ CHANGES: TSelectScheme.default(defaultConfig.CHANGES), SCOPES: TSelectScheme.default(defaultConfig.SCOPES), + BREAKING_CHANGES: TConfirmScheme.default(defaultConfig.BREAKING_CHANGES), COMMIT_SHORT: TOptionTextZod.default(defaultConfig.COMMIT_SHORT), COMMIT_DESCRIPTION: TOptionTextZod.default(defaultConfig.COMMIT_DESCRIPTION) });