From 8c323968610df3b26ba64e11293ff4abdb3d45cf Mon Sep 17 00:00:00 2001 From: Jean-Marc FIASCHI Date: Wed, 5 Jun 2024 10:45:25 +0200 Subject: [PATCH 1/4] fix(i18n): allow to store the new entry in the draft after a pre save --- packages/decap-cms-core/src/backend.ts | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/packages/decap-cms-core/src/backend.ts b/packages/decap-cms-core/src/backend.ts index 49e668d042ef..bcb8881de045 100644 --- a/packages/decap-cms-core/src/backend.ts +++ b/packages/decap-cms-core/src/backend.ts @@ -1091,8 +1091,14 @@ export class Backend { unpublished = false, status, }: PersistArgs) { - const modifiedData = await this.invokePreSaveEvent(draft.get('entry')); - const entryDraft = (modifiedData && draft.setIn(['entry', 'data'], modifiedData)) || draft; + const updatedEntity = await this.invokePreSaveEvent(draft.get('entry')); + + let entryDraft; + if (updatedEntity.get('data') === undefined) { + entryDraft = (updatedEntity && draft.setIn(['entry', 'data'], updatedEntity)) || draft; + } else { + entryDraft = (updatedEntity && draft.setIn(['entry'], updatedEntity)) || draft; + } const newEntry = entryDraft.getIn(['entry', 'newRecord']) || false; From f5c03b9f1714628c2fe9c159909492a101326ae2 Mon Sep 17 00:00:00 2001 From: Jean-Marc FIASCHI Date: Mon, 15 Jul 2024 23:54:41 +0200 Subject: [PATCH 2/4] feat(persistEntry): test preSave that return data or entry map --- .../src/__tests__/backend.spec.js | 73 +++++++++++++++++++ 1 file changed, 73 insertions(+) diff --git a/packages/decap-cms-core/src/__tests__/backend.spec.js b/packages/decap-cms-core/src/__tests__/backend.spec.js index 9b69519ff1dc..b53b4eadc8ec 100644 --- a/packages/decap-cms-core/src/__tests__/backend.spec.js +++ b/packages/decap-cms-core/src/__tests__/backend.spec.js @@ -318,6 +318,79 @@ describe('Backend', () => { }); }); + describe('persistEntry', () => { + it('should update the draft with the new entry returned by preSave event', async () => { + const implementation = { + init: jest.fn(() => implementation), + persistEntry: jest.fn(() => implementation), + }; + + const config = { + backend: { + commit_messages:"commit-messages" + } }; + const collection = Map({ + name: 'posts', + }); + const entry = Map({ + data: 'old_data' + }); + const newEntry = Map({ + data: 'new_data' + }); + const entryDraft = Map({ + entry: entry + }); + const user = { login: 'login', name: 'name' }; + const backend = new Backend(implementation, { config, backendName: 'github' }); + + backend.currentUser = jest.fn().mockResolvedValue(user); + backend.entryToRaw = jest.fn().mockReturnValue('content'); + backend.invokePreSaveEvent = jest.fn().mockReturnValueOnce(newEntry); + + await backend.persistEntry({ config, collection, entryDraft }); + + expect(backend.entryToRaw).toHaveBeenCalledTimes(1); + expect(backend.entryToRaw).toHaveBeenCalledWith(collection, newEntry); + }); + + it('should update the draft with the new data returned by preSave event', async () => { + const implementation = { + init: jest.fn(() => implementation), + persistEntry: jest.fn(() => implementation), + }; + + const config = { + backend: { + commit_messages:"commit-messages" + } }; + const collection = Map({ + name: 'posts', + }); + const entry = Map({ + data: Map({}) + }); + const newData = Map({}); + const newEntry = Map({ + data: newData + }); + const entryDraft = Map({ + entry: entry + }); + const user = { login: 'login', name: 'name' }; + const backend = new Backend(implementation, { config, backendName: 'github' }); + + backend.currentUser = jest.fn().mockResolvedValue(user); + backend.entryToRaw = jest.fn().mockReturnValue('content'); + backend.invokePreSaveEvent = jest.fn().mockReturnValueOnce(newData); + + await backend.persistEntry({ config, collection, entryDraft }); + + expect(backend.entryToRaw).toHaveBeenCalledTimes(1); + expect(backend.entryToRaw).toHaveBeenCalledWith(collection, newEntry); + }); + }); + describe('persistMedia', () => { it('should persist media', async () => { const persistMediaResult = {}; From ec463e560f5511b65f7c1f22b01504598cc25dbd Mon Sep 17 00:00:00 2001 From: Jean-Marc FIASCHI Date: Fri, 2 Aug 2024 09:46:28 +0200 Subject: [PATCH 3/4] fix(linter): expected property shorthand object-shorthand --- packages/decap-cms-core/src/__tests__/backend.spec.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/packages/decap-cms-core/src/__tests__/backend.spec.js b/packages/decap-cms-core/src/__tests__/backend.spec.js index b53b4eadc8ec..afc465b4df86 100644 --- a/packages/decap-cms-core/src/__tests__/backend.spec.js +++ b/packages/decap-cms-core/src/__tests__/backend.spec.js @@ -339,7 +339,7 @@ describe('Backend', () => { data: 'new_data' }); const entryDraft = Map({ - entry: entry + entry }); const user = { login: 'login', name: 'name' }; const backend = new Backend(implementation, { config, backendName: 'github' }); @@ -375,7 +375,7 @@ describe('Backend', () => { data: newData }); const entryDraft = Map({ - entry: entry + entry }); const user = { login: 'login', name: 'name' }; const backend = new Backend(implementation, { config, backendName: 'github' }); From 1185790f0336b38133389133964c6db56535a5a4 Mon Sep 17 00:00:00 2001 From: Martin Jagodic Date: Fri, 2 Aug 2024 12:26:41 +0200 Subject: [PATCH 4/4] fix: format backend spec, update caniuse-lite --- package-lock.json | 6 ++-- .../src/__tests__/backend.spec.js | 34 ++++++++++--------- 2 files changed, 21 insertions(+), 19 deletions(-) diff --git a/package-lock.json b/package-lock.json index 99943a78922a..763499462cfb 100644 --- a/package-lock.json +++ b/package-lock.json @@ -10264,9 +10264,9 @@ } }, "node_modules/caniuse-lite": { - "version": "1.0.30001587", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001587.tgz", - "integrity": "sha512-HMFNotUmLXn71BQxg8cijvqxnIAofforZOwGsxyXJ0qugTdspUF4sPSJ2vhgprHCB996tIDzEq1ubumPDV8ULA==", + "version": "1.0.30001646", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001646.tgz", + "integrity": "sha512-dRg00gudiBDDTmUhClSdv3hqRfpbOnU28IpI1T6PBTLWa+kOj0681C8uML3PifYfREuBrVjDGhL3adYpBT6spw==", "dev": true, "funding": [ { diff --git a/packages/decap-cms-core/src/__tests__/backend.spec.js b/packages/decap-cms-core/src/__tests__/backend.spec.js index afc465b4df86..c673c19a01c4 100644 --- a/packages/decap-cms-core/src/__tests__/backend.spec.js +++ b/packages/decap-cms-core/src/__tests__/backend.spec.js @@ -327,27 +327,28 @@ describe('Backend', () => { const config = { backend: { - commit_messages:"commit-messages" - } }; + commit_messages: 'commit-messages', + }, + }; const collection = Map({ name: 'posts', }); const entry = Map({ - data: 'old_data' + data: 'old_data', }); const newEntry = Map({ - data: 'new_data' + data: 'new_data', }); const entryDraft = Map({ - entry + entry, }); const user = { login: 'login', name: 'name' }; const backend = new Backend(implementation, { config, backendName: 'github' }); - - backend.currentUser = jest.fn().mockResolvedValue(user); + + backend.currentUser = jest.fn().mockResolvedValue(user); backend.entryToRaw = jest.fn().mockReturnValue('content'); backend.invokePreSaveEvent = jest.fn().mockReturnValueOnce(newEntry); - + await backend.persistEntry({ config, collection, entryDraft }); expect(backend.entryToRaw).toHaveBeenCalledTimes(1); @@ -362,28 +363,29 @@ describe('Backend', () => { const config = { backend: { - commit_messages:"commit-messages" - } }; + commit_messages: 'commit-messages', + }, + }; const collection = Map({ name: 'posts', }); const entry = Map({ - data: Map({}) + data: Map({}), }); const newData = Map({}); const newEntry = Map({ - data: newData + data: newData, }); const entryDraft = Map({ - entry + entry, }); const user = { login: 'login', name: 'name' }; const backend = new Backend(implementation, { config, backendName: 'github' }); - - backend.currentUser = jest.fn().mockResolvedValue(user); + + backend.currentUser = jest.fn().mockResolvedValue(user); backend.entryToRaw = jest.fn().mockReturnValue('content'); backend.invokePreSaveEvent = jest.fn().mockReturnValueOnce(newData); - + await backend.persistEntry({ config, collection, entryDraft }); expect(backend.entryToRaw).toHaveBeenCalledTimes(1);