Skip to content

Commit ef24c34

Browse files
committed
fix(6801): slugFormatter uses date from entry if it exists
1 parent 0c7d327 commit ef24c34

File tree

3 files changed

+34
-4
lines changed

3 files changed

+34
-4
lines changed

packages/decap-cms-core/src/lib/__tests__/formatters.spec.js

Lines changed: 16 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -274,8 +274,8 @@ describe('formatters', () => {
274274
};
275275

276276
describe('slugFormatter', () => {
277-
const date = new Date('2020-01-01');
278-
jest.spyOn(global, 'Date').mockImplementation(() => date);
277+
const date = new Date('2020-01-01').valueOf();
278+
Date.now = jest.spyOn(Date, 'now').mockImplementation(() => date);
279279

280280
const { selectIdentifier } = require('../../reducers/collections');
281281

@@ -312,6 +312,20 @@ describe('formatters', () => {
312312
).toBe('entry-slug');
313313
});
314314

315+
it('should see date filters applied to date from entry if it exists', () => {
316+
const { selectInferredField } = require('../../reducers/collections');
317+
selectInferredField.mockReturnValue('date');
318+
const entryDate = new Date('2026-10-20');
319+
320+
expect(
321+
slugFormatter(
322+
Map({ slug: '{{year}}-{{month}}-{{day}}-{{title}}' }),
323+
Map({ date: entryDate, title: 'post title' }),
324+
slugConfig,
325+
),
326+
).toBe('2026-10-20-post-title');
327+
});
328+
315329
it('should return slug', () => {
316330
selectIdentifier.mockReturnValueOnce('title');
317331

packages/decap-cms-core/src/lib/formatters.ts

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,7 @@ import type { Map } from 'immutable';
2121
const {
2222
compileStringTemplate,
2323
parseDateFromEntry,
24+
parseDateFromEntryData,
2425
SLUG_MISSING_REQUIRED_DATE,
2526
keyToPathArray,
2627
addFileTemplateFields,
@@ -129,7 +130,11 @@ export function slugFormatter(
129130
}
130131

131132
const processSegment = getProcessSegment(slugConfig);
132-
const date = new Date();
133+
const date =
134+
parseDateFromEntryData(
135+
entryData as unknown as Map<string, unknown>,
136+
selectInferredField(collection, 'date'),
137+
) || new Date(Date.now());
133138
const slug = compileStringTemplate(slugTemplate, date, identifier, entryData, processSegment);
134139

135140
if (!collection.has('path')) {

packages/decap-cms-lib-widgets/src/stringTemplate.ts

Lines changed: 12 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -61,7 +61,18 @@ export function parseDateFromEntry(entry: Map<string, unknown>, dateFieldName?:
6161
return;
6262
}
6363

64-
const dateValue = entry.getIn(['data', dateFieldName]);
64+
const entryData = entry.getIn(['data']);
65+
return parseDateFromEntryData(entryData, dateFieldName);
66+
}
67+
68+
export function parseDateFromEntryData(
69+
entryData: Map<string, unknown>,
70+
dateFieldName?: string | null,
71+
) {
72+
if (!dateFieldName) {
73+
return;
74+
}
75+
const dateValue = entryData.getIn([dateFieldName]);
6576
const dateDayjs = dateValue && dayjs(dateValue);
6677
if (dateDayjs && dateDayjs.isValid()) {
6778
return dateDayjs.toDate();

0 commit comments

Comments
 (0)