diff --git a/e2e/__tests__/ast-transformers.test.ts b/e2e/__tests__/ast-transformers.test.ts index 204d4c29f6..5ec38f3fe3 100644 --- a/e2e/__tests__/ast-transformers.test.ts +++ b/e2e/__tests__/ast-transformers.test.ts @@ -1,8 +1,14 @@ import path from 'path' +import execa from 'execa' + import { json as runWithJson } from '../run-jest' import { runNpmInstall } from '../utils' +const { createBundle } = require('../../scripts/lib/bundle') + +const AST_TRANSFORMERS_DIR_NAME = 'ast-transformers' + const executeTest = (testDir: string): void => { test(`successfully runs the tests inside ${testDir} with isolatedModules: false`, () => { const { json } = runWithJson(testDir) @@ -18,15 +24,56 @@ const executeTest = (testDir: string): void => { } describe('path-mapping', () => { - executeTest('ast-transformers/path-mapping') + executeTest(`${AST_TRANSFORMERS_DIR_NAME}/path-mapping`) }) -const TRANSFORM_OPT_DIR_NAME = 'transformer-options' - describe('transformer-options', () => { + const TRANSFORM_OPT_DIR_NAME = 'transformer-options' + beforeAll(() => { - runNpmInstall(path.join(__dirname, '..', 'ast-transformers', TRANSFORM_OPT_DIR_NAME)) + runNpmInstall(path.join(__dirname, '..', AST_TRANSFORMERS_DIR_NAME, TRANSFORM_OPT_DIR_NAME)) + }) + + test(`successfully runs the tests inside ${AST_TRANSFORMERS_DIR_NAME}/${TRANSFORM_OPT_DIR_NAME}`, () => { + const { json } = runWithJson(`${AST_TRANSFORMERS_DIR_NAME}/${TRANSFORM_OPT_DIR_NAME}`) + + expect(json.success).toBe(true) }) +}) + +describe('hoist-jest', () => { + const NON_TS_FACTORY_DIR_NAME = 'non-ts-factory' + const TS_FACTORY_DIR_NAME = 'ts-factory' + + describe('non-ts-factory', () => { + const DIR = path.resolve(__dirname, '..', AST_TRANSFORMERS_DIR_NAME, 'hoist-jest', NON_TS_FACTORY_DIR_NAME) - executeTest(`ast-transformers/${TRANSFORM_OPT_DIR_NAME}`) + beforeAll(() => { + runNpmInstall(DIR) + const bundle = createBundle() + execa.sync('npm', ['install', '--no-package-lock', '--no-shrinkwrap', '--no-save', bundle], { + cwd: DIR, + }) + }) + + executeTest(`${AST_TRANSFORMERS_DIR_NAME}/hoist-jest/${NON_TS_FACTORY_DIR_NAME}`) + }) + + describe('ts-factory', () => { + beforeAll(() => { + runNpmInstall(path.resolve(__dirname, '..', AST_TRANSFORMERS_DIR_NAME, 'hoist-jest', TS_FACTORY_DIR_NAME)) + }) + + executeTest(`${AST_TRANSFORMERS_DIR_NAME}/hoist-jest/${TS_FACTORY_DIR_NAME}`) + }) +}) + +describe('transformer-in-ts', () => { + const TRANSFORMER_IN_TS_DIR_NAME = `${AST_TRANSFORMERS_DIR_NAME}/transformer-in-ts` + + test(`successfully runs the tests inside ${TRANSFORMER_IN_TS_DIR_NAME}`, () => { + const { json } = runWithJson(TRANSFORMER_IN_TS_DIR_NAME) + + expect(json.success).toBe(true) + }) }) diff --git a/e2e/__tests__/hoist-jest.test.ts b/e2e/__tests__/hoist-jest.test.ts deleted file mode 100644 index 4ee5e157d0..0000000000 --- a/e2e/__tests__/hoist-jest.test.ts +++ /dev/null @@ -1,48 +0,0 @@ -import path from 'path' - -import execa from 'execa' - -import { json as runWithJson } from '../run-jest' -import { runNpmInstall } from '../utils' - -const { createBundle } = require('../../scripts/lib/bundle') - -const executeTest = (dirName: string): void => { - test(`successfully runs the tests inside ${dirName} with isolatedModules: false`, () => { - const { json } = runWithJson(dirName) - - expect(json.success).toBe(true) - }) - - test(`successfully runs the tests inside ${dirName} with isolatedModules true`, () => { - const { json } = runWithJson(dirName, ['-c=jest-isolated.config.js']) - - expect(json.success).toBe(true) - }) -} - -const NON_TS_FACTORY_DIR_NAME = 'non-ts-factory' - -describe('non-ts-factory', () => { - const DIR = path.resolve(__dirname, '..', 'hoist-jest', 'non-ts-factory') - - beforeAll(() => { - runNpmInstall(DIR) - const bundle = createBundle() - execa.sync('npm', ['install', '--no-package-lock', '--no-shrinkwrap', '--no-save', bundle], { - cwd: DIR, - }) - }) - - executeTest(`hoist-jest/${NON_TS_FACTORY_DIR_NAME}`) -}) - -const TS_FACTORY_DIR_NAME = 'ts-factory' - -describe('ts-factory', () => { - beforeAll(() => { - runNpmInstall(path.resolve(__dirname, '..', 'hoist-jest', TS_FACTORY_DIR_NAME)) - }) - - executeTest(`hoist-jest/${TS_FACTORY_DIR_NAME}`) -}) diff --git a/e2e/hoist-jest/__test_modules__/__mocks__/jest-backticks.js b/e2e/ast-transformers/hoist-jest/__test_modules__/__mocks__/jest-backticks.js similarity index 100% rename from e2e/hoist-jest/__test_modules__/__mocks__/jest-backticks.js rename to e2e/ast-transformers/hoist-jest/__test_modules__/__mocks__/jest-backticks.js diff --git a/e2e/hoist-jest/__test_modules__/a.js b/e2e/ast-transformers/hoist-jest/__test_modules__/a.js similarity index 100% rename from e2e/hoist-jest/__test_modules__/a.js rename to e2e/ast-transformers/hoist-jest/__test_modules__/a.js diff --git a/e2e/hoist-jest/__test_modules__/b.js b/e2e/ast-transformers/hoist-jest/__test_modules__/b.js similarity index 100% rename from e2e/hoist-jest/__test_modules__/b.js rename to e2e/ast-transformers/hoist-jest/__test_modules__/b.js diff --git a/e2e/hoist-jest/__test_modules__/c.js b/e2e/ast-transformers/hoist-jest/__test_modules__/c.js similarity index 100% rename from e2e/hoist-jest/__test_modules__/c.js rename to e2e/ast-transformers/hoist-jest/__test_modules__/c.js diff --git a/e2e/hoist-jest/__test_modules__/d.js b/e2e/ast-transformers/hoist-jest/__test_modules__/d.js similarity index 100% rename from e2e/hoist-jest/__test_modules__/d.js rename to e2e/ast-transformers/hoist-jest/__test_modules__/d.js diff --git a/e2e/hoist-jest/__test_modules__/e.js b/e2e/ast-transformers/hoist-jest/__test_modules__/e.js similarity index 100% rename from e2e/hoist-jest/__test_modules__/e.js rename to e2e/ast-transformers/hoist-jest/__test_modules__/e.js diff --git a/e2e/hoist-jest/__test_modules__/f.js b/e2e/ast-transformers/hoist-jest/__test_modules__/f.js similarity index 100% rename from e2e/hoist-jest/__test_modules__/f.js rename to e2e/ast-transformers/hoist-jest/__test_modules__/f.js diff --git a/e2e/hoist-jest/__test_modules__/g.js b/e2e/ast-transformers/hoist-jest/__test_modules__/g.js similarity index 100% rename from e2e/hoist-jest/__test_modules__/g.js rename to e2e/ast-transformers/hoist-jest/__test_modules__/g.js diff --git a/e2e/hoist-jest/__test_modules__/jest-backticks.js b/e2e/ast-transformers/hoist-jest/__test_modules__/jest-backticks.js similarity index 100% rename from e2e/hoist-jest/__test_modules__/jest-backticks.js rename to e2e/ast-transformers/hoist-jest/__test_modules__/jest-backticks.js diff --git a/e2e/hoist-jest/__test_modules__/mocked.js b/e2e/ast-transformers/hoist-jest/__test_modules__/mocked.js similarity index 100% rename from e2e/hoist-jest/__test_modules__/mocked.js rename to e2e/ast-transformers/hoist-jest/__test_modules__/mocked.js diff --git a/e2e/hoist-jest/__test_modules__/unmocked.js b/e2e/ast-transformers/hoist-jest/__test_modules__/unmocked.js similarity index 100% rename from e2e/hoist-jest/__test_modules__/unmocked.js rename to e2e/ast-transformers/hoist-jest/__test_modules__/unmocked.js diff --git a/e2e/hoist-jest/__tests__/import-jest.test.js b/e2e/ast-transformers/hoist-jest/__tests__/import-jest.test.js similarity index 100% rename from e2e/hoist-jest/__tests__/import-jest.test.js rename to e2e/ast-transformers/hoist-jest/__tests__/import-jest.test.js diff --git a/e2e/hoist-jest/__tests__/integration-automock-off.test.js b/e2e/ast-transformers/hoist-jest/__tests__/integration-automock-off.test.js similarity index 100% rename from e2e/hoist-jest/__tests__/integration-automock-off.test.js rename to e2e/ast-transformers/hoist-jest/__tests__/integration-automock-off.test.js diff --git a/e2e/hoist-jest/__tests__/integration.test.js b/e2e/ast-transformers/hoist-jest/__tests__/integration.test.js similarity index 100% rename from e2e/hoist-jest/__tests__/integration.test.js rename to e2e/ast-transformers/hoist-jest/__tests__/integration.test.js diff --git a/e2e/hoist-jest/__tests__/typescript.test.ts b/e2e/ast-transformers/hoist-jest/__tests__/typescript.test.ts similarity index 100% rename from e2e/hoist-jest/__tests__/typescript.test.ts rename to e2e/ast-transformers/hoist-jest/__tests__/typescript.test.ts diff --git a/e2e/hoist-jest/banana.js b/e2e/ast-transformers/hoist-jest/banana.js similarity index 100% rename from e2e/hoist-jest/banana.js rename to e2e/ast-transformers/hoist-jest/banana.js diff --git a/e2e/hoist-jest/entry.ts b/e2e/ast-transformers/hoist-jest/entry.ts similarity index 100% rename from e2e/hoist-jest/entry.ts rename to e2e/ast-transformers/hoist-jest/entry.ts diff --git a/e2e/hoist-jest/mock-file.js b/e2e/ast-transformers/hoist-jest/mock-file.js similarity index 100% rename from e2e/hoist-jest/mock-file.js rename to e2e/ast-transformers/hoist-jest/mock-file.js diff --git a/e2e/hoist-jest/non-ts-factory/jest-isolated.config.js b/e2e/ast-transformers/hoist-jest/non-ts-factory/jest-isolated.config.js similarity index 100% rename from e2e/hoist-jest/non-ts-factory/jest-isolated.config.js rename to e2e/ast-transformers/hoist-jest/non-ts-factory/jest-isolated.config.js diff --git a/e2e/hoist-jest/non-ts-factory/package-lock.json b/e2e/ast-transformers/hoist-jest/non-ts-factory/package-lock.json similarity index 100% rename from e2e/hoist-jest/non-ts-factory/package-lock.json rename to e2e/ast-transformers/hoist-jest/non-ts-factory/package-lock.json diff --git a/e2e/hoist-jest/non-ts-factory/package.json b/e2e/ast-transformers/hoist-jest/non-ts-factory/package.json similarity index 100% rename from e2e/hoist-jest/non-ts-factory/package.json rename to e2e/ast-transformers/hoist-jest/non-ts-factory/package.json diff --git a/e2e/hoist-jest/ts-factory/jest-isolated.config.js b/e2e/ast-transformers/hoist-jest/ts-factory/jest-isolated.config.js similarity index 86% rename from e2e/hoist-jest/ts-factory/jest-isolated.config.js rename to e2e/ast-transformers/hoist-jest/ts-factory/jest-isolated.config.js index 1740190159..1d2f43f93e 100644 --- a/e2e/hoist-jest/ts-factory/jest-isolated.config.js +++ b/e2e/ast-transformers/hoist-jest/ts-factory/jest-isolated.config.js @@ -14,6 +14,6 @@ module.exports = { react$: '/node_modules/react', }, transform: { - '^.+.[tj]sx?$': '/../../../dist/index.js', + '^.+.[tj]sx?$': '/../../../../dist/index.js', }, } diff --git a/e2e/hoist-jest/ts-factory/package-lock.json b/e2e/ast-transformers/hoist-jest/ts-factory/package-lock.json similarity index 100% rename from e2e/hoist-jest/ts-factory/package-lock.json rename to e2e/ast-transformers/hoist-jest/ts-factory/package-lock.json diff --git a/e2e/hoist-jest/ts-factory/package.json b/e2e/ast-transformers/hoist-jest/ts-factory/package.json similarity index 86% rename from e2e/hoist-jest/ts-factory/package.json rename to e2e/ast-transformers/hoist-jest/ts-factory/package.json index 9ca97b7a7c..8e7d546fe9 100644 --- a/e2e/hoist-jest/ts-factory/package.json +++ b/e2e/ast-transformers/hoist-jest/ts-factory/package.json @@ -17,7 +17,7 @@ "react$": "/node_modules/react" }, "transform": { - "^.+\\.[tj]sx?$": "/../../../dist/index.js" + "^.+\\.[tj]sx?$": "/../../../../dist/index.js" } } } diff --git a/e2e/hoist-jest/types.ts b/e2e/ast-transformers/hoist-jest/types.ts similarity index 100% rename from e2e/hoist-jest/types.ts rename to e2e/ast-transformers/hoist-jest/types.ts diff --git a/e2e/ast-transformers/transformer-in-ts/__tests__/typescript.test.ts b/e2e/ast-transformers/transformer-in-ts/__tests__/typescript.test.ts new file mode 100644 index 0000000000..afe1c13a54 --- /dev/null +++ b/e2e/ast-transformers/transformer-in-ts/__tests__/typescript.test.ts @@ -0,0 +1,9 @@ +import { color } from '../entry' + +jest.mock('../entry', () => { + return { color: 'blue' } +}) + +test('should use custom AST transformer written in ts', () => { + expect(color).toBe('blue') +}) diff --git a/e2e/ast-transformers/transformer-in-ts/entry.ts b/e2e/ast-transformers/transformer-in-ts/entry.ts new file mode 100644 index 0000000000..bf0e0fbb4b --- /dev/null +++ b/e2e/ast-transformers/transformer-in-ts/entry.ts @@ -0,0 +1,3 @@ +type Color = 'red' | 'blue' + +export const color: Color = 'red' diff --git a/e2e/ast-transformers/transformer-in-ts/package-lock.json b/e2e/ast-transformers/transformer-in-ts/package-lock.json new file mode 100644 index 0000000000..f174c47028 --- /dev/null +++ b/e2e/ast-transformers/transformer-in-ts/package-lock.json @@ -0,0 +1,43 @@ +{ + "name": "ts-transformer", + "lockfileVersion": 2, + "requires": true, + "packages": { + "": { + "dependencies": { + "bs-logger": "^0.2.6" + } + }, + "node_modules/bs-logger": { + "version": "0.2.6", + "resolved": "https://registry.npmjs.org/bs-logger/-/bs-logger-0.2.6.tgz", + "integrity": "sha512-pd8DCoxmbgc7hyPKOvxtqNcjYoOsABPQdcCUjGp3d42VR2CX1ORhk2A87oqqu5R1kk+76nsxZupkmyd+MVtCog==", + "dependencies": { + "fast-json-stable-stringify": "2.x" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/fast-json-stable-stringify": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", + "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==" + } + }, + "dependencies": { + "bs-logger": { + "version": "0.2.6", + "resolved": "https://registry.npmjs.org/bs-logger/-/bs-logger-0.2.6.tgz", + "integrity": "sha512-pd8DCoxmbgc7hyPKOvxtqNcjYoOsABPQdcCUjGp3d42VR2CX1ORhk2A87oqqu5R1kk+76nsxZupkmyd+MVtCog==", + "requires": { + "fast-json-stable-stringify": "2.x" + } + }, + "fast-json-stable-stringify": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", + "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==" + } + } +} diff --git a/e2e/ast-transformers/transformer-in-ts/package.json b/e2e/ast-transformers/transformer-in-ts/package.json new file mode 100644 index 0000000000..042ee7f52f --- /dev/null +++ b/e2e/ast-transformers/transformer-in-ts/package.json @@ -0,0 +1,14 @@ +{ + "jest": { + "globals": { + "ts-jest": { + "astTransformers": { + "before": ["/../../../src/transformers/hoist-jest.ts"] + } + } + }, + "transform": { + "^.+\\.[tj]sx?$": "/../../../dist/index.js" + } + } +} diff --git a/package-lock.json b/package-lock.json index 596802f9dd..634f2cef73 100644 --- a/package-lock.json +++ b/package-lock.json @@ -10,6 +10,7 @@ "license": "MIT", "dependencies": { "bs-logger": "0.x", + "esbuild": "~0.13.13", "fast-json-stable-stringify": "2.x", "jest-util": "^27.0.0", "json5": "2.x", @@ -27,10 +28,10 @@ "@jest/transform": "^27.1.1", "@jest/types": "^27.1.1", "@types/babel__core": "7.x", - "@types/cross-spawn": "*", - "@types/fs-extra": "*", - "@types/jest": "*", - "@types/js-yaml": "*", + "@types/cross-spawn": "latest", + "@types/fs-extra": "latest", + "@types/jest": "latest", + "@types/js-yaml": "latest", "@types/lodash.camelcase": "4.x", "@types/lodash.memoize": "4.x", "@types/lodash.set": "4.x", @@ -39,28 +40,28 @@ "@types/node-fetch": "^3.0.3", "@types/react": "17.x", "@types/rimraf": "^3.0.2", - "@types/semver": "*", - "@types/yargs": "*", + "@types/semver": "latest", + "@types/yargs": "latest", "@types/yargs-parser": "20.x", "@typescript-eslint/eslint-plugin": "^5.3.0", "@typescript-eslint/parser": "^5.3.0", "conventional-changelog-cli": "2.x", - "cross-spawn": "*", + "cross-spawn": "latest", "eslint": "8.1.0", - "eslint-config-prettier": "*", - "eslint-plugin-import": "*", - "eslint-plugin-jest": "*", - "eslint-plugin-jsdoc": "*", - "eslint-plugin-prefer-arrow": "*", - "eslint-plugin-prettier": "*", - "execa": "*", + "eslint-config-prettier": "latest", + "eslint-plugin-import": "latest", + "eslint-plugin-jest": "latest", + "eslint-plugin-jsdoc": "latest", + "eslint-plugin-prefer-arrow": "latest", + "eslint-plugin-prettier": "latest", + "execa": "latest", "fs-extra": "10.x", "glob": "^7.1.7", - "glob-gitignore": "*", + "glob-gitignore": "latest", "husky": "4.x", "jest": "^27.1.1", "jest-snapshot-serializer-raw": "^1.2.0", - "js-yaml": "*", + "js-yaml": "latest", "json-schema-to-typescript": "^10.1.4", "lint-staged": "latest", "lodash.camelcase": "^4.3.0", @@ -5349,6 +5350,238 @@ "es6-symbol": "^3.1.1" } }, + "node_modules/esbuild": { + "version": "0.13.13", + "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.13.13.tgz", + "integrity": "sha512-Z17A/R6D0b4s3MousytQ/5i7mTCbaF+Ua/yPfoe71vdTv4KBvVAvQ/6ytMngM2DwGJosl8WxaD75NOQl2QF26Q==", + "hasInstallScript": true, + "bin": { + "esbuild": "bin/esbuild" + }, + "optionalDependencies": { + "esbuild-android-arm64": "0.13.13", + "esbuild-darwin-64": "0.13.13", + "esbuild-darwin-arm64": "0.13.13", + "esbuild-freebsd-64": "0.13.13", + "esbuild-freebsd-arm64": "0.13.13", + "esbuild-linux-32": "0.13.13", + "esbuild-linux-64": "0.13.13", + "esbuild-linux-arm": "0.13.13", + "esbuild-linux-arm64": "0.13.13", + "esbuild-linux-mips64le": "0.13.13", + "esbuild-linux-ppc64le": "0.13.13", + "esbuild-netbsd-64": "0.13.13", + "esbuild-openbsd-64": "0.13.13", + "esbuild-sunos-64": "0.13.13", + "esbuild-windows-32": "0.13.13", + "esbuild-windows-64": "0.13.13", + "esbuild-windows-arm64": "0.13.13" + } + }, + "node_modules/esbuild-android-arm64": { + "version": "0.13.13", + "resolved": "https://registry.npmjs.org/esbuild-android-arm64/-/esbuild-android-arm64-0.13.13.tgz", + "integrity": "sha512-T02aneWWguJrF082jZworjU6vm8f4UQ+IH2K3HREtlqoY9voiJUwHLRL6khRlsNLzVglqgqb7a3HfGx7hAADCQ==", + "cpu": [ + "arm64" + ], + "optional": true, + "os": [ + "android" + ] + }, + "node_modules/esbuild-darwin-64": { + "version": "0.13.13", + "resolved": "https://registry.npmjs.org/esbuild-darwin-64/-/esbuild-darwin-64-0.13.13.tgz", + "integrity": "sha512-wkaiGAsN/09X9kDlkxFfbbIgR78SNjMOfUhoel3CqKBDsi9uZhw7HBNHNxTzYUK8X8LAKFpbODgcRB3b/I8gHA==", + "cpu": [ + "x64" + ], + "optional": true, + "os": [ + "darwin" + ] + }, + "node_modules/esbuild-darwin-arm64": { + "version": "0.13.13", + "resolved": "https://registry.npmjs.org/esbuild-darwin-arm64/-/esbuild-darwin-arm64-0.13.13.tgz", + "integrity": "sha512-b02/nNKGSV85Gw9pUCI5B48AYjk0vFggDeom0S6QMP/cEDtjSh1WVfoIFNAaLA0MHWfue8KBwoGVsN7rBshs4g==", + "cpu": [ + "arm64" + ], + "optional": true, + "os": [ + "darwin" + ] + }, + "node_modules/esbuild-freebsd-64": { + "version": "0.13.13", + "resolved": "https://registry.npmjs.org/esbuild-freebsd-64/-/esbuild-freebsd-64-0.13.13.tgz", + "integrity": "sha512-ALgXYNYDzk9YPVk80A+G4vz2D22Gv4j4y25exDBGgqTcwrVQP8rf/rjwUjHoh9apP76oLbUZTmUmvCMuTI1V9A==", + "cpu": [ + "x64" + ], + "optional": true, + "os": [ + "freebsd" + ] + }, + "node_modules/esbuild-freebsd-arm64": { + "version": "0.13.13", + "resolved": "https://registry.npmjs.org/esbuild-freebsd-arm64/-/esbuild-freebsd-arm64-0.13.13.tgz", + "integrity": "sha512-uFvkCpsZ1yqWQuonw5T1WZ4j59xP/PCvtu6I4pbLejhNo4nwjW6YalqnBvBSORq5/Ifo9S/wsIlVHzkzEwdtlw==", + "cpu": [ + "arm64" + ], + "optional": true, + "os": [ + "freebsd" + ] + }, + "node_modules/esbuild-linux-32": { + "version": "0.13.13", + "resolved": "https://registry.npmjs.org/esbuild-linux-32/-/esbuild-linux-32-0.13.13.tgz", + "integrity": "sha512-yxR9BBwEPs9acVEwTrEE2JJNHYVuPQC9YGjRfbNqtyfK/vVBQYuw8JaeRFAvFs3pVJdQD0C2BNP4q9d62SCP4w==", + "cpu": [ + "ia32" + ], + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/esbuild-linux-64": { + "version": "0.13.13", + "resolved": "https://registry.npmjs.org/esbuild-linux-64/-/esbuild-linux-64-0.13.13.tgz", + "integrity": "sha512-kzhjlrlJ+6ESRB/n12WTGll94+y+HFeyoWsOrLo/Si0s0f+Vip4b8vlnG0GSiS6JTsWYAtGHReGczFOaETlKIw==", + "cpu": [ + "x64" + ], + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/esbuild-linux-arm": { + "version": "0.13.13", + "resolved": "https://registry.npmjs.org/esbuild-linux-arm/-/esbuild-linux-arm-0.13.13.tgz", + "integrity": "sha512-hXub4pcEds+U1TfvLp1maJ+GHRw7oizvzbGRdUvVDwtITtjq8qpHV5Q5hWNNn6Q+b3b2UxF03JcgnpzCw96nUQ==", + "cpu": [ + "arm" + ], + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/esbuild-linux-arm64": { + "version": "0.13.13", + "resolved": "https://registry.npmjs.org/esbuild-linux-arm64/-/esbuild-linux-arm64-0.13.13.tgz", + "integrity": "sha512-KMrEfnVbmmJxT3vfTnPv/AiXpBFbbyExH13BsUGy1HZRPFMi5Gev5gk8kJIZCQSRfNR17aqq8sO5Crm2KpZkng==", + "cpu": [ + "arm64" + ], + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/esbuild-linux-mips64le": { + "version": "0.13.13", + "resolved": "https://registry.npmjs.org/esbuild-linux-mips64le/-/esbuild-linux-mips64le-0.13.13.tgz", + "integrity": "sha512-cJT9O1LYljqnnqlHaS0hdG73t7hHzF3zcN0BPsjvBq+5Ad47VJun+/IG4inPhk8ta0aEDK6LdP+F9299xa483w==", + "cpu": [ + "mips64el" + ], + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/esbuild-linux-ppc64le": { + "version": "0.13.13", + "resolved": "https://registry.npmjs.org/esbuild-linux-ppc64le/-/esbuild-linux-ppc64le-0.13.13.tgz", + "integrity": "sha512-+rghW8st6/7O6QJqAjVK3eXzKkZqYAw6LgHv7yTMiJ6ASnNvghSeOcIvXFep3W2oaJc35SgSPf21Ugh0o777qQ==", + "cpu": [ + "ppc64" + ], + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/esbuild-netbsd-64": { + "version": "0.13.13", + "resolved": "https://registry.npmjs.org/esbuild-netbsd-64/-/esbuild-netbsd-64-0.13.13.tgz", + "integrity": "sha512-A/B7rwmzPdzF8c3mht5TukbnNwY5qMJqes09ou0RSzA5/jm7Jwl/8z853ofujTFOLhkNHUf002EAgokzSgEMpQ==", + "cpu": [ + "x64" + ], + "optional": true, + "os": [ + "netbsd" + ] + }, + "node_modules/esbuild-openbsd-64": { + "version": "0.13.13", + "resolved": "https://registry.npmjs.org/esbuild-openbsd-64/-/esbuild-openbsd-64-0.13.13.tgz", + "integrity": "sha512-szwtuRA4rXKT3BbwoGpsff6G7nGxdKgUbW9LQo6nm0TVCCjDNDC/LXxT994duIW8Tyq04xZzzZSW7x7ttDiw1w==", + "cpu": [ + "x64" + ], + "optional": true, + "os": [ + "openbsd" + ] + }, + "node_modules/esbuild-sunos-64": { + "version": "0.13.13", + "resolved": "https://registry.npmjs.org/esbuild-sunos-64/-/esbuild-sunos-64-0.13.13.tgz", + "integrity": "sha512-ihyds9O48tVOYF48iaHYUK/boU5zRaLOXFS+OOL3ceD39AyHo46HVmsJLc7A2ez0AxNZCxuhu+P9OxfPfycTYQ==", + "cpu": [ + "x64" + ], + "optional": true, + "os": [ + "sunos" + ] + }, + "node_modules/esbuild-windows-32": { + "version": "0.13.13", + "resolved": "https://registry.npmjs.org/esbuild-windows-32/-/esbuild-windows-32-0.13.13.tgz", + "integrity": "sha512-h2RTYwpG4ldGVJlbmORObmilzL8EECy8BFiF8trWE1ZPHLpECE9//J3Bi+W3eDUuv/TqUbiNpGrq4t/odbayUw==", + "cpu": [ + "ia32" + ], + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/esbuild-windows-64": { + "version": "0.13.13", + "resolved": "https://registry.npmjs.org/esbuild-windows-64/-/esbuild-windows-64-0.13.13.tgz", + "integrity": "sha512-oMrgjP4CjONvDHe7IZXHrMk3wX5Lof/IwFEIbwbhgbXGBaN2dke9PkViTiXC3zGJSGpMvATXVplEhlInJ0drHA==", + "cpu": [ + "x64" + ], + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/esbuild-windows-arm64": { + "version": "0.13.13", + "resolved": "https://registry.npmjs.org/esbuild-windows-arm64/-/esbuild-windows-arm64-0.13.13.tgz", + "integrity": "sha512-6fsDfTuTvltYB5k+QPah/x7LrI2+OLAJLE3bWLDiZI6E8wXMQU+wLqtEO/U/RvJgVY1loPs5eMpUBpVajczh1A==", + "cpu": [ + "arm64" + ], + "optional": true, + "os": [ + "win32" + ] + }, "node_modules/escalade": { "version": "3.1.1", "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz", @@ -18614,6 +18847,132 @@ "es6-symbol": "^3.1.1" } }, + "esbuild": { + "version": "0.13.13", + "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.13.13.tgz", + "integrity": "sha512-Z17A/R6D0b4s3MousytQ/5i7mTCbaF+Ua/yPfoe71vdTv4KBvVAvQ/6ytMngM2DwGJosl8WxaD75NOQl2QF26Q==", + "requires": { + "esbuild-android-arm64": "0.13.13", + "esbuild-darwin-64": "0.13.13", + "esbuild-darwin-arm64": "0.13.13", + "esbuild-freebsd-64": "0.13.13", + "esbuild-freebsd-arm64": "0.13.13", + "esbuild-linux-32": "0.13.13", + "esbuild-linux-64": "0.13.13", + "esbuild-linux-arm": "0.13.13", + "esbuild-linux-arm64": "0.13.13", + "esbuild-linux-mips64le": "0.13.13", + "esbuild-linux-ppc64le": "0.13.13", + "esbuild-netbsd-64": "0.13.13", + "esbuild-openbsd-64": "0.13.13", + "esbuild-sunos-64": "0.13.13", + "esbuild-windows-32": "0.13.13", + "esbuild-windows-64": "0.13.13", + "esbuild-windows-arm64": "0.13.13" + } + }, + "esbuild-android-arm64": { + "version": "0.13.13", + "resolved": "https://registry.npmjs.org/esbuild-android-arm64/-/esbuild-android-arm64-0.13.13.tgz", + "integrity": "sha512-T02aneWWguJrF082jZworjU6vm8f4UQ+IH2K3HREtlqoY9voiJUwHLRL6khRlsNLzVglqgqb7a3HfGx7hAADCQ==", + "optional": true + }, + "esbuild-darwin-64": { + "version": "0.13.13", + "resolved": "https://registry.npmjs.org/esbuild-darwin-64/-/esbuild-darwin-64-0.13.13.tgz", + "integrity": "sha512-wkaiGAsN/09X9kDlkxFfbbIgR78SNjMOfUhoel3CqKBDsi9uZhw7HBNHNxTzYUK8X8LAKFpbODgcRB3b/I8gHA==", + "optional": true + }, + "esbuild-darwin-arm64": { + "version": "0.13.13", + "resolved": "https://registry.npmjs.org/esbuild-darwin-arm64/-/esbuild-darwin-arm64-0.13.13.tgz", + "integrity": "sha512-b02/nNKGSV85Gw9pUCI5B48AYjk0vFggDeom0S6QMP/cEDtjSh1WVfoIFNAaLA0MHWfue8KBwoGVsN7rBshs4g==", + "optional": true + }, + "esbuild-freebsd-64": { + "version": "0.13.13", + "resolved": "https://registry.npmjs.org/esbuild-freebsd-64/-/esbuild-freebsd-64-0.13.13.tgz", + "integrity": "sha512-ALgXYNYDzk9YPVk80A+G4vz2D22Gv4j4y25exDBGgqTcwrVQP8rf/rjwUjHoh9apP76oLbUZTmUmvCMuTI1V9A==", + "optional": true + }, + "esbuild-freebsd-arm64": { + "version": "0.13.13", + "resolved": "https://registry.npmjs.org/esbuild-freebsd-arm64/-/esbuild-freebsd-arm64-0.13.13.tgz", + "integrity": "sha512-uFvkCpsZ1yqWQuonw5T1WZ4j59xP/PCvtu6I4pbLejhNo4nwjW6YalqnBvBSORq5/Ifo9S/wsIlVHzkzEwdtlw==", + "optional": true + }, + "esbuild-linux-32": { + "version": "0.13.13", + "resolved": "https://registry.npmjs.org/esbuild-linux-32/-/esbuild-linux-32-0.13.13.tgz", + "integrity": "sha512-yxR9BBwEPs9acVEwTrEE2JJNHYVuPQC9YGjRfbNqtyfK/vVBQYuw8JaeRFAvFs3pVJdQD0C2BNP4q9d62SCP4w==", + "optional": true + }, + "esbuild-linux-64": { + "version": "0.13.13", + "resolved": "https://registry.npmjs.org/esbuild-linux-64/-/esbuild-linux-64-0.13.13.tgz", + "integrity": "sha512-kzhjlrlJ+6ESRB/n12WTGll94+y+HFeyoWsOrLo/Si0s0f+Vip4b8vlnG0GSiS6JTsWYAtGHReGczFOaETlKIw==", + "optional": true + }, + "esbuild-linux-arm": { + "version": "0.13.13", + "resolved": "https://registry.npmjs.org/esbuild-linux-arm/-/esbuild-linux-arm-0.13.13.tgz", + "integrity": "sha512-hXub4pcEds+U1TfvLp1maJ+GHRw7oizvzbGRdUvVDwtITtjq8qpHV5Q5hWNNn6Q+b3b2UxF03JcgnpzCw96nUQ==", + "optional": true + }, + "esbuild-linux-arm64": { + "version": "0.13.13", + "resolved": "https://registry.npmjs.org/esbuild-linux-arm64/-/esbuild-linux-arm64-0.13.13.tgz", + "integrity": "sha512-KMrEfnVbmmJxT3vfTnPv/AiXpBFbbyExH13BsUGy1HZRPFMi5Gev5gk8kJIZCQSRfNR17aqq8sO5Crm2KpZkng==", + "optional": true + }, + "esbuild-linux-mips64le": { + "version": "0.13.13", + "resolved": "https://registry.npmjs.org/esbuild-linux-mips64le/-/esbuild-linux-mips64le-0.13.13.tgz", + "integrity": "sha512-cJT9O1LYljqnnqlHaS0hdG73t7hHzF3zcN0BPsjvBq+5Ad47VJun+/IG4inPhk8ta0aEDK6LdP+F9299xa483w==", + "optional": true + }, + "esbuild-linux-ppc64le": { + "version": "0.13.13", + "resolved": "https://registry.npmjs.org/esbuild-linux-ppc64le/-/esbuild-linux-ppc64le-0.13.13.tgz", + "integrity": "sha512-+rghW8st6/7O6QJqAjVK3eXzKkZqYAw6LgHv7yTMiJ6ASnNvghSeOcIvXFep3W2oaJc35SgSPf21Ugh0o777qQ==", + "optional": true + }, + "esbuild-netbsd-64": { + "version": "0.13.13", + "resolved": "https://registry.npmjs.org/esbuild-netbsd-64/-/esbuild-netbsd-64-0.13.13.tgz", + "integrity": "sha512-A/B7rwmzPdzF8c3mht5TukbnNwY5qMJqes09ou0RSzA5/jm7Jwl/8z853ofujTFOLhkNHUf002EAgokzSgEMpQ==", + "optional": true + }, + "esbuild-openbsd-64": { + "version": "0.13.13", + "resolved": "https://registry.npmjs.org/esbuild-openbsd-64/-/esbuild-openbsd-64-0.13.13.tgz", + "integrity": "sha512-szwtuRA4rXKT3BbwoGpsff6G7nGxdKgUbW9LQo6nm0TVCCjDNDC/LXxT994duIW8Tyq04xZzzZSW7x7ttDiw1w==", + "optional": true + }, + "esbuild-sunos-64": { + "version": "0.13.13", + "resolved": "https://registry.npmjs.org/esbuild-sunos-64/-/esbuild-sunos-64-0.13.13.tgz", + "integrity": "sha512-ihyds9O48tVOYF48iaHYUK/boU5zRaLOXFS+OOL3ceD39AyHo46HVmsJLc7A2ez0AxNZCxuhu+P9OxfPfycTYQ==", + "optional": true + }, + "esbuild-windows-32": { + "version": "0.13.13", + "resolved": "https://registry.npmjs.org/esbuild-windows-32/-/esbuild-windows-32-0.13.13.tgz", + "integrity": "sha512-h2RTYwpG4ldGVJlbmORObmilzL8EECy8BFiF8trWE1ZPHLpECE9//J3Bi+W3eDUuv/TqUbiNpGrq4t/odbayUw==", + "optional": true + }, + "esbuild-windows-64": { + "version": "0.13.13", + "resolved": "https://registry.npmjs.org/esbuild-windows-64/-/esbuild-windows-64-0.13.13.tgz", + "integrity": "sha512-oMrgjP4CjONvDHe7IZXHrMk3wX5Lof/IwFEIbwbhgbXGBaN2dke9PkViTiXC3zGJSGpMvATXVplEhlInJ0drHA==", + "optional": true + }, + "esbuild-windows-arm64": { + "version": "0.13.13", + "resolved": "https://registry.npmjs.org/esbuild-windows-arm64/-/esbuild-windows-arm64-0.13.13.tgz", + "integrity": "sha512-6fsDfTuTvltYB5k+QPah/x7LrI2+OLAJLE3bWLDiZI6E8wXMQU+wLqtEO/U/RvJgVY1loPs5eMpUBpVajczh1A==", + "optional": true + }, "escalade": { "version": "3.1.1", "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz", diff --git a/package.json b/package.json index cafab1c3af..da0b879311 100644 --- a/package.json +++ b/package.json @@ -52,6 +52,7 @@ "homepage": "https://kulshekhar.github.io/ts-jest", "dependencies": { "bs-logger": "0.x", + "esbuild": "~0.13.13", "fast-json-stable-stringify": "2.x", "jest-util": "^27.0.0", "json5": "2.x", diff --git a/src/__mocks__/dummy-transformer.js b/src/__mocks__/dummy-transformer.js index a8fe0146e4..cc02f10a10 100644 --- a/src/__mocks__/dummy-transformer.js +++ b/src/__mocks__/dummy-transformer.js @@ -1,19 +1,15 @@ -const { LogContexts, LogLevels } = require('bs-logger') - -function factory(tsCompiler) { - const logger = tsCompiler.configSet.logger.child({ namespace: 'dummy-transformer' }) - const ts = tsCompiler.configSet.compilerModule - // eslint-disable-next-line no-console - console.log(tsCompiler.program) - - function createVisitor() { - return (node) => node +const version = 1 +const name = 'dummy-transformer' +function factory() { + return () => { + return (sf) => { + return sf + } } - - return () => - logger.wrap({ [LogContexts.logLevel]: LogLevels.debug, call: null }, 'visitSourceFileNode(): dummy', (sf) => - ts.visitNode(sf, createVisitor()) - ) } -exports.factory = factory +module.exports = { + factory, + version, + name, +} diff --git a/src/__mocks__/funny-transformer.ts b/src/__mocks__/funny-transformer.ts new file mode 100644 index 0000000000..b931b0b06f --- /dev/null +++ b/src/__mocks__/funny-transformer.ts @@ -0,0 +1,11 @@ +import type { SourceFile, TransformerFactory } from 'typescript' + +export const version = 1 +export const name = 'funny-transformer' +export function factory(): TransformerFactory { + return () => { + return (sf: SourceFile) => { + return sf + } + } +} diff --git a/src/__mocks__/hummy-transformer.js b/src/__mocks__/hummy-transformer.js index b9fe60f64e..a40fbe10eb 100644 --- a/src/__mocks__/hummy-transformer.js +++ b/src/__mocks__/hummy-transformer.js @@ -1,19 +1,11 @@ -const { LogContexts, LogLevels } = require('bs-logger') - -function factory(tsCompiler) { - const logger = tsCompiler.configSet.logger.child({ namespace: 'hummy-transformer' }) - const ts = tsCompiler.configSet.compilerModule - function createVisitor() { - return (node) => node +function factory() { + return () => { + return (sf) => { + return sf + } } - - return () => - logger.wrap({ [LogContexts.logLevel]: LogLevels.debug, call: null }, 'visitSourceFileNode(): dummy', (sf) => - ts.visitNode(sf, createVisitor()) - ) } module.exports = { factory, - version: 1, } diff --git a/src/config/__snapshots__/config-set.spec.ts.snap b/src/config/__snapshots__/config-set.spec.ts.snap index 008755afbd..d1714a384e 100644 --- a/src/config/__snapshots__/config-set.spec.ts.snap +++ b/src/config/__snapshots__/config-set.spec.ts.snap @@ -78,16 +78,39 @@ Object { }, Object { "factory": [Function], + "name": "dummy-transformer", + "version": 1, }, ], } `; exports[`customTransformers should return an object containing all resolved transformers 3`] = ` +Object { + "after": Array [], + "afterDeclarations": Array [], + "before": Array [ + Object { + "factory": [Function], + "name": "hoist-jest", + "version": 3, + }, + Object { + "factory": [Function], + "name": "funny-transformer", + "version": 1, + }, + ], +} +`; + +exports[`customTransformers should return an object containing all resolved transformers 4`] = ` Object { "after": Array [ Object { "factory": [Function], + "name": "dummy-transformer", + "version": 1, }, ], "afterDeclarations": Array [], @@ -101,12 +124,14 @@ Object { } `; -exports[`customTransformers should return an object containing all resolved transformers 4`] = ` +exports[`customTransformers should return an object containing all resolved transformers 5`] = ` Object { "after": Array [], "afterDeclarations": Array [ Object { "factory": [Function], + "name": "dummy-transformer", + "version": 1, }, ], "before": Array [ @@ -119,7 +144,7 @@ Object { } `; -exports[`customTransformers should return an object containing all resolved transformers 5`] = ` +exports[`customTransformers should return an object containing all resolved transformers 6`] = ` Object { "after": Array [], "afterDeclarations": Array [], @@ -131,36 +156,15 @@ Object { }, Object { "factory": [Function], + "name": "dummy-transformer", "options": Object {}, + "version": 1, }, ], } `; -exports[`customTransformers should return an object containing all resolved transformers: warning-log 1`] = `Array []`; - -exports[`customTransformers should return an object containing all resolved transformers: warning-log 2`] = ` -Array [ - "[level:40] The AST transformer {{file}} must have an \`export const version = ", - "[level:40] The AST transformer {{file}} must have an \`export const name = ", -] -`; - -exports[`customTransformers should return an object containing all resolved transformers: warning-log 3`] = ` -Array [ - "[level:40] The AST transformer {{file}} must have an \`export const version = ", - "[level:40] The AST transformer {{file}} must have an \`export const name = ", -] -`; - -exports[`customTransformers should return an object containing all resolved transformers: warning-log 4`] = ` -Array [ - "[level:40] The AST transformer {{file}} must have an \`export const version = ", - "[level:40] The AST transformer {{file}} must have an \`export const name = ", -] -`; - -exports[`customTransformers should return an object containing all resolved transformers: warning-log 5`] = ` +exports[`customTransformers should show warning log when missing version and name 1`] = ` Array [ "[level:40] The AST transformer {{file}} must have an \`export const version = ", "[level:40] The AST transformer {{file}} must have an \`export const name = ", diff --git a/src/config/config-set.spec.ts b/src/config/config-set.spec.ts index dc72b77b64..884750218a 100644 --- a/src/config/config-set.spec.ts +++ b/src/config/config-set.spec.ts @@ -140,11 +140,35 @@ describe('compilerModule', () => { }) // compilerModule describe('customTransformers', () => { - it.each([ + test('should show warning log when missing version and name', () => { + const logger = testing.createLoggerMock() + createConfigSet({ + logger, + jestConfig: { + rootDir: 'src', + cwd: 'src', + } as any, // eslint-disable-line @typescript-eslint/no-explicit-any + tsJestConfig: { + astTransformers: { + before: ['hummy-transformer'], + }, + }, + resolve: null, + }) + + expect( + logger.target.filteredLines(LogLevels.warn).map((logLine) => logLine.substring(0, logLine.indexOf('>') + 1)), + ).toMatchSnapshot() + }) + + test.each([ {}, { before: ['dummy-transformer'], }, + { + before: ['__mocks__/funny-transformer.ts'], + }, { after: ['dummy-transformer'], }, @@ -173,9 +197,6 @@ describe('customTransformers', () => { resolve: null, }) - expect( - logger.target.filteredLines(LogLevels.warn).map((logLine) => logLine.substring(0, logLine.indexOf('>') + 1)), - ).toMatchSnapshot('warning-log') expect(cs.resolvedTransformers).toMatchSnapshot() }) }) diff --git a/src/config/config-set.ts b/src/config/config-set.ts index fe8a0fb6a8..6d430b9576 100644 --- a/src/config/config-set.ts +++ b/src/config/config-set.ts @@ -9,9 +9,11 @@ * with the complete, object version of it. */ import { existsSync, readFileSync } from 'fs' +import Module from 'module' import { dirname, extname, isAbsolute, join, normalize, resolve } from 'path' import { LogContexts, Logger } from 'bs-logger' +import { transformSync } from 'esbuild' import { globsToMatcher } from 'jest-util' import json5 from 'json5' import type { CompilerOptions, Diagnostic, FormatDiagnosticsHost, ParsedCommandLine } from 'typescript' @@ -90,6 +92,21 @@ const toDiagnosticCodeList = (items: Array, into: number[] = [] return into } +const requireFromString = (code: string, fileName: string) => { + // @ts-expect-error `_nodeModulePaths` is not exposed in typing + const paths = Module._nodeModulePaths(dirname(fileName)) + const parent = module.parent as Module | undefined + const m = new Module(fileName, parent) + m.filename = fileName + m.paths = [].concat(paths) + // @ts-expect-error `_compile` is not exposed in typing + m._compile(code, fileName) + const exports = m.exports + parent && parent.children && parent.children.splice(parent.children.indexOf(m), 1) + + return exports +} + export class ConfigSet { /** * Use by e2e, don't mark as internal @@ -300,7 +317,17 @@ export class ConfigSet { const { astTransformers } = options if (astTransformers) { const resolveTransformerFunc = (transformerPath: string) => { - const transformerFunc = require(transformerPath) + let transformerFunc + if (extname(transformerPath) === '.ts') { + const compiledTransformer = transformSync(readFileSync(transformerPath, 'utf-8'), { + loader: 'ts', + format: 'cjs', + target: 'es2015', + }).code + transformerFunc = requireFromString(compiledTransformer, transformerPath.replace('.ts', '.js')) + } else { + transformerFunc = require(transformerPath) + } if (!transformerFunc.version) { this.logger.warn(Errors.MissingTransformerVersion, { file: transformerPath }) } diff --git a/tsconfig.build.json b/tsconfig.build.json index 7e125212d2..5d64d0fd00 100644 --- a/tsconfig.build.json +++ b/tsconfig.build.json @@ -9,5 +9,5 @@ "outDir": "dist" }, "include": ["src"], - "exclude": ["**/*.spec.ts", "src/__mocks__", "src/__helpers__"] + "exclude": ["**/*.spec.ts", "**/__mocks__", "src/__helpers__"] }