From c89a90763b7640d3610481013a22a49327dbe9a1 Mon Sep 17 00:00:00 2001 From: Ben Asher Date: Fri, 6 May 2022 23:04:42 +0200 Subject: [PATCH] fix(transformers): use `Array.sort` in hoisting transformer (#3498) fixes #3476 --- e2e/transform-js/package-lock.json | 26 ++++++++++++------- package-lock.json | 26 ++++++++++++------- .../__snapshots__/config-set.spec.ts.snap | 12 ++++----- src/transformers/hoist-jest.spec.ts | 2 +- src/transformers/hoist-jest.ts | 22 +++++----------- 5 files changed, 46 insertions(+), 42 deletions(-) diff --git a/e2e/transform-js/package-lock.json b/e2e/transform-js/package-lock.json index 767e1539c3..4c59da6569 100644 --- a/e2e/transform-js/package-lock.json +++ b/e2e/transform-js/package-lock.json @@ -1540,13 +1540,19 @@ } }, "node_modules/caniuse-lite": { - "version": "1.0.30001283", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001283.tgz", - "integrity": "sha512-9RoKo841j1GQFSJz/nCXOj0sD7tHBtlowjYlrqIUS812x9/emfBLBt6IyMz1zIaYc/eRL8Cs6HPUVi2Hzq4sIg==", - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/browserslist" - } + "version": "1.0.30001341", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001341.tgz", + "integrity": "sha512-2SodVrFFtvGENGCv0ChVJIDQ0KPaS1cg7/qtfMaICgeMolDdo/Z2OD32F0Aq9yl6F4YFwGPBS5AaPqNYiW4PoA==", + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/caniuse-lite" + } + ] }, "node_modules/chalk": { "version": "2.4.2", @@ -3018,9 +3024,9 @@ } }, "caniuse-lite": { - "version": "1.0.30001283", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001283.tgz", - "integrity": "sha512-9RoKo841j1GQFSJz/nCXOj0sD7tHBtlowjYlrqIUS812x9/emfBLBt6IyMz1zIaYc/eRL8Cs6HPUVi2Hzq4sIg==" + "version": "1.0.30001341", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001341.tgz", + "integrity": "sha512-2SodVrFFtvGENGCv0ChVJIDQ0KPaS1cg7/qtfMaICgeMolDdo/Z2OD32F0Aq9yl6F4YFwGPBS5AaPqNYiW4PoA==" }, "chalk": { "version": "2.4.2", diff --git a/package-lock.json b/package-lock.json index 2de27054aa..0a72180cb8 100644 --- a/package-lock.json +++ b/package-lock.json @@ -2741,14 +2741,20 @@ } }, "node_modules/caniuse-lite": { - "version": "1.0.30001278", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001278.tgz", - "integrity": "sha512-mpF9KeH8u5cMoEmIic/cr7PNS+F5LWBk0t2ekGT60lFf0Wq+n9LspAj0g3P+o7DQhD3sUdlMln4YFAWhFYn9jg==", + "version": "1.0.30001341", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001341.tgz", + "integrity": "sha512-2SodVrFFtvGENGCv0ChVJIDQ0KPaS1cg7/qtfMaICgeMolDdo/Z2OD32F0Aq9yl6F4YFwGPBS5AaPqNYiW4PoA==", "devOptional": true, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/browserslist" - } + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/caniuse-lite" + } + ] }, "node_modules/chalk": { "version": "4.1.2", @@ -11730,9 +11736,9 @@ } }, "caniuse-lite": { - "version": "1.0.30001278", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001278.tgz", - "integrity": "sha512-mpF9KeH8u5cMoEmIic/cr7PNS+F5LWBk0t2ekGT60lFf0Wq+n9LspAj0g3P+o7DQhD3sUdlMln4YFAWhFYn9jg==", + "version": "1.0.30001341", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001341.tgz", + "integrity": "sha512-2SodVrFFtvGENGCv0ChVJIDQ0KPaS1cg7/qtfMaICgeMolDdo/Z2OD32F0Aq9yl6F4YFwGPBS5AaPqNYiW4PoA==", "devOptional": true }, "chalk": { diff --git a/src/config/__snapshots__/config-set.spec.ts.snap b/src/config/__snapshots__/config-set.spec.ts.snap index d1714a384e..5f44bf8bf8 100644 --- a/src/config/__snapshots__/config-set.spec.ts.snap +++ b/src/config/__snapshots__/config-set.spec.ts.snap @@ -60,7 +60,7 @@ Object { Object { "factory": [Function], "name": "hoist-jest", - "version": 3, + "version": 4, }, ], } @@ -74,7 +74,7 @@ Object { Object { "factory": [Function], "name": "hoist-jest", - "version": 3, + "version": 4, }, Object { "factory": [Function], @@ -93,7 +93,7 @@ Object { Object { "factory": [Function], "name": "hoist-jest", - "version": 3, + "version": 4, }, Object { "factory": [Function], @@ -118,7 +118,7 @@ Object { Object { "factory": [Function], "name": "hoist-jest", - "version": 3, + "version": 4, }, ], } @@ -138,7 +138,7 @@ Object { Object { "factory": [Function], "name": "hoist-jest", - "version": 3, + "version": 4, }, ], } @@ -152,7 +152,7 @@ Object { Object { "factory": [Function], "name": "hoist-jest", - "version": 3, + "version": 4, }, Object { "factory": [Function], diff --git a/src/transformers/hoist-jest.spec.ts b/src/transformers/hoist-jest.spec.ts index 60531c943c..41c4b479f4 100644 --- a/src/transformers/hoist-jest.spec.ts +++ b/src/transformers/hoist-jest.spec.ts @@ -168,7 +168,7 @@ const printer = ts.createPrinter() describe('hoist-jest', () => { test('should have correct transformer name and version', () => { expect(name).toBe('hoist-jest') - expect(version).toBe(3) + expect(version).toBe(4) }) test('should hoist correctly when not using @jest/globals', () => { diff --git a/src/transformers/hoist-jest.ts b/src/transformers/hoist-jest.ts index fe24f41c54..713ead2356 100644 --- a/src/transformers/hoist-jest.ts +++ b/src/transformers/hoist-jest.ts @@ -8,7 +8,7 @@ import type { TsCompilerInstance } from '../types' * Remember to increase the version whenever transformer's content is changed. This is to inform Jest to not reuse * the previous cache which contains old transformer's content */ -export const version = 3 +export const version = 4 // Used for constructing cache key export const name = 'hoist-jest' @@ -87,21 +87,13 @@ export function factory({ configSet }: TsCompilerInstance) { if (statements.length <= 1) { return statements } - const pivot = statements[0] - const leftPart: _ts.Statement[] = [] - const rightPart: _ts.Statement[] = [] - for (let i = 1; i < statements.length; i++) { - const currentStatement = statements[i] - if (isJestGlobalImport(currentStatement)) { - leftPart.push(currentStatement) - } else { - isHoistableStatement(currentStatement) && !isHoistableStatement(pivot) && !isJestGlobalImport(pivot) - ? leftPart.push(currentStatement) - : rightPart.push(currentStatement) - } - } - return sortStatements(leftPart).concat(pivot, sortStatements(rightPart)) + return statements.sort((stmtA, stmtB) => + isJestGlobalImport(stmtA) || + (isHoistableStatement(stmtA) && !isHoistableStatement(stmtB) && !isJestGlobalImport(stmtB)) + ? -1 + : 1, + ) } const createVisitor = (ctx: _ts.TransformationContext, _: _ts.SourceFile) => {