Skip to content
This repository has been archived by the owner on Sep 9, 2024. It is now read-only.

feat: allow custom fields inside git commit message #1105

Merged
merged 2 commits into from
Apr 25, 2024
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions packages/core/src/backend.ts
Original file line number Diff line number Diff line change
Expand Up @@ -1118,6 +1118,7 @@ export class Backend<EF extends BaseField = UnknownField, BC extends BackendClas
path,
authorLogin: user.login,
authorName: user.name,
data: entryDraft.entry.data,
},
user.useOpenAuthoring,
);
Expand Down
10 changes: 8 additions & 2 deletions packages/core/src/lib/formatters.ts
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,7 @@ import { isEmpty } from './util/string.util';
import {
addFileTemplateFields,
compileStringTemplate,
getExplicitFieldReplacement,
keyToPathArray,
parseDateFromEntry,
} from './widgets/stringTemplate';
Expand Down Expand Up @@ -41,16 +42,17 @@ type Options<EF extends BaseField> = {
collection?: CollectionWithDefaults<EF>;
authorLogin?: string;
authorName?: string;
data?: EntryData;
};

export function commitMessageFormatter<EF extends BaseField>(
type: keyof typeof commitMessageTemplates,
config: ConfigWithDefaults<EF>,
{ slug, path, collection, authorLogin, authorName }: Options<EF>,
{ slug, path, collection, authorLogin, authorName, data }: Options<EF>,
isOpenAuthoring?: boolean,
) {
const templates = { ...commitMessageTemplates, ...(config.backend.commit_messages || {}) };

let explicitReplacement;
const commitMessage = templates[type].replace(variableRegex, (_, variable) => {
switch (variable) {
case 'slug':
Expand All @@ -64,6 +66,10 @@ export function commitMessageFormatter<EF extends BaseField>(
case 'author-name':
return authorName || '';
default:
explicitReplacement = getExplicitFieldReplacement(variable, data);
if (explicitReplacement) {
return explicitReplacement;
}
console.warn(
`[StaticCMS] Ignoring unknown variable “${variable}” in commit message template.`,
);
Expand Down
2 changes: 1 addition & 1 deletion packages/core/src/lib/widgets/stringTemplate.ts
Original file line number Diff line number Diff line change
Expand Up @@ -187,7 +187,7 @@ export function expandPath({

// Allow `fields.` prefix in placeholder to override built in replacements
// like "slug" and "year" with values from fields of the same name.
function getExplicitFieldReplacement(key: string, data: ObjectValue | undefined | null) {
export function getExplicitFieldReplacement(key: string, data: ObjectValue | undefined | null) {
if (!key.startsWith(FIELD_PREFIX)) {
return;
}
Expand Down
5 changes: 3 additions & 2 deletions packages/docs/content/docs/configuration-options.mdx
Original file line number Diff line number Diff line change
Expand Up @@ -68,8 +68,8 @@ Static CMS generates the following commit types:

| Commit type | When is it triggered? | Available template tags |
| ------------- | ---------------------------- | ----------------------------------------------------------- |
| `create` | A new entry is created | `slug`, `path`, `collection`, `author-login`, `author-name` |
| `update` | An existing entry is changed | `slug`, `path`, `collection`, `author-login`, `author-name` |
| `create` | A new entry is created | `slug`, `path`, `collection`, `author-login`, `author-name`, `fields` |
| `update` | An existing entry is changed | `slug`, `path`, `collection`, `author-login`, `author-name`, `fields` |
| `delete` | An existing entry is deleted | `slug`, `path`, `collection`, `author-login`, `author-name` |
| `uploadMedia` | A media file is uploaded | `path`, `author-login`, `author-name` |
| `deleteMedia` | A media file is deleted | `path`, `author-login`, `author-name` |
Expand All @@ -83,6 +83,7 @@ Template tags produce the following output:
- `{{path}}`: full path to the changed file
- `{{author-login}}`: login/username of the author
- `{{author-name}}`: full name of the author (might be empty based on the user's profile)
- `{{fields.[FIELD_NAME]}}`: A custom fields value

## Publish Mode

Expand Down
Loading