From ad7622f4895c03041a7f0447eca59a5ab623036c Mon Sep 17 00:00:00 2001 From: Jeff Date: Thu, 9 Feb 2023 21:21:52 -0700 Subject: [PATCH] feat(slugs): allow filters in template strings Process template filters first, then strip `'` and `.` characters from slug strings. Fixes #4783 --- .../src/lib/__tests__/formatters.spec.js | 14 +++++++++++++- .../netlify-cms-lib-widgets/src/stringTemplate.ts | 12 ++++++------ 2 files changed, 19 insertions(+), 7 deletions(-) diff --git a/packages/netlify-cms-core/src/lib/__tests__/formatters.spec.js b/packages/netlify-cms-core/src/lib/__tests__/formatters.spec.js index 283f5d499686..f1b2afbdb17c 100644 --- a/packages/netlify-cms-core/src/lib/__tests__/formatters.spec.js +++ b/packages/netlify-cms-core/src/lib/__tests__/formatters.spec.js @@ -274,7 +274,7 @@ describe('formatters', () => { }; describe('slugFormatter', () => { - const date = new Date('2020-01-01'); + const date = new Date('2020-01-01T13:28:27.679Z'); jest.spyOn(global, 'Date').mockImplementation(() => date); const { selectIdentifier } = require('../../reducers/collections'); @@ -312,6 +312,18 @@ describe('formatters', () => { ).toBe('entry-slug'); }); + it('should allow filters in slug templates', () => { + selectIdentifier.mockReturnValueOnce('published'); + + expect( + slugFormatter( + Map({ slug: "{{published | date('MM-DD')}}" }), + Map({ title: 'Post Title', published: date }), + slugConfig, + ), + ).toBe('01-01'); + }); + it('should return slug', () => { selectIdentifier.mockReturnValueOnce('title'); diff --git a/packages/netlify-cms-lib-widgets/src/stringTemplate.ts b/packages/netlify-cms-lib-widgets/src/stringTemplate.ts index 43f16a16d866..50839dc11679 100644 --- a/packages/netlify-cms-lib-widgets/src/stringTemplate.ts +++ b/packages/netlify-cms-lib-widgets/src/stringTemplate.ts @@ -190,13 +190,13 @@ export function compileStringTemplate( replacement = data.getIn(keyToPathArray(key), '') as string; } + const filterFunction = getFilterFunction(filter); + if (filterFunction) { + replacement = filterFunction(replacement); + } + if (processor) { - return processor(replacement); - } else { - const filterFunction = getFilterFunction(filter); - if (filterFunction) { - replacement = filterFunction(replacement); - } + replacement = processor(replacement); } return replacement;