From c272f65e903e6e835edbf3a087def0aded796b30 Mon Sep 17 00:00:00 2001 From: Rhys Evans Date: Sat, 14 Sep 2024 19:07:19 +0100 Subject: [PATCH] feat: codemod fro fallbackToNetwork option --- .../src/__test__/option-codemods.test.js | 23 +++++++++- packages/codemods/src/codemods/options.js | 43 +++++++++++++------ packages/codemods/try.js | 2 +- 3 files changed, 52 insertions(+), 16 deletions(-) diff --git a/packages/codemods/src/__test__/option-codemods.test.js b/packages/codemods/src/__test__/option-codemods.test.js index bab1658f..a9dbb29f 100644 --- a/packages/codemods/src/__test__/option-codemods.test.js +++ b/packages/codemods/src/__test__/option-codemods.test.js @@ -194,6 +194,27 @@ describe('codemods operating on options', () => { }); }); describe('fallbackToNetwork', () => { - // try to replace fallbackToNetwork: always with spyGlobal()... but probably just insert an error / comment that points at the docs + const errorString = + 'throw new Error("fallbackToNetwork option is deprecated. Use the `spyGlobal()` method instead")'; + it('Removes fallbackToNetwork as global option when setting directly as property', () => { + expectCodemodResult( + `fetchMock.config.fallbackToNetwork = true`, + errorString, + ); + }); + it('Removes fallbackToNetwork as global option when using Object.assign', () => { + expectCodemodResult( + `Object.assign(fetchMock.config, {fallbackToNetwork: true})`, + errorString, + ); + }); + it('Removes fallbackToNetwork as global option when using Object.assign alongside other options', () => { + expectCodemodResult( + `Object.assign(fetchMock.config, {fallbackToNetwork: true, other: 'value'})`, + `Object.assign(fetchMock.config, { + other: 'value' +})${errorString}`, + ); + }); }); }); diff --git a/packages/codemods/src/codemods/options.js b/packages/codemods/src/codemods/options.js index daf63672..a95e6606 100644 --- a/packages/codemods/src/codemods/options.js +++ b/packages/codemods/src/codemods/options.js @@ -1,5 +1,13 @@ import { getAllChainedMethodCalls } from './methods.js'; const simpleOptionNames = ['overwriteRoutes', 'warnOnFallback', 'sendAsJson']; + +function appendError(message, path, j) { + path + .closest(j.ExpressionStatement) + .insertAfter( + j(`throw new Error("${message}")`).find(j.ThrowStatement).get().value, + ); +} export function simpleOptions(fetchMockVariableName, root, j) { const configSets = root .find(j.CallExpression, { @@ -22,24 +30,31 @@ export function simpleOptions(fetchMockVariableName, root, j) { secondArg.type === 'ObjectExpression' ); }); - simpleOptionNames.forEach((name) => { - root - .find(j.AssignmentExpression, { - left: { + [...simpleOptionNames, 'fallbackToNetwork'].forEach((name) => { + const propertyAssignments = root.find(j.AssignmentExpression, { + left: { + type: 'MemberExpression', + property: { name }, + object: { type: 'MemberExpression', - property: { name }, + property: { name: 'config' }, object: { - type: 'MemberExpression', - property: { name: 'config' }, - object: { - type: 'Identifier', - name: fetchMockVariableName, - }, + type: 'Identifier', + name: fetchMockVariableName, }, }, - }) - .remove(); - configSets.find(j.Property, { key: { name } }).remove(); + }, + }); + const objectAssignments = configSets.find(j.Property, { key: { name } }); + + if (name === 'fallbackToNetwork') { + const errorMessage = + 'fallbackToNetwork option is deprecated. Use the `spyGlobal()` method instead'; + appendError(errorMessage, propertyAssignments, j); + appendError(errorMessage, objectAssignments, j); + } + propertyAssignments.remove(); + objectAssignments.remove(); }); configSets diff --git a/packages/codemods/try.js b/packages/codemods/try.js index 3ac6622d..0b97c1d9 100644 --- a/packages/codemods/try.js +++ b/packages/codemods/try.js @@ -5,7 +5,7 @@ console.log( codemod( ` import fetchMock from 'fetch-mock'; -fetchMock.getAnyOnce(200, {sendAsJson: true}) +Object.assign(fetchMock.config, {fallbackToNetwork: true}) `, jscodeshift, ),