Skip to content

Commit

Permalink
feat: add support for jest 26, log warnings with legacy configs
Browse files Browse the repository at this point in the history
  • Loading branch information
DylanPiercey committed May 13, 2020
1 parent 8f70a2a commit 46ef443
Show file tree
Hide file tree
Showing 14 changed files with 86 additions and 32 deletions.
3 changes: 2 additions & 1 deletion .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,8 @@
npm-debug.log

# Build
dist
/transform
/preset

# Coverage
coverage
Expand Down
3 changes: 2 additions & 1 deletion .prettierignore
Original file line number Diff line number Diff line change
Expand Up @@ -5,5 +5,6 @@ package-lock.json
CHANGELOG.md
node_modules
coverage
dist
/preset
/transform
*.actual.*
33 changes: 14 additions & 19 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -50,26 +50,24 @@ npm install @marko/jest -D

```javascript
module.exports = {
preset: "@marko/jest",
browser: true
preset: "@marko/jest/preset/browser"
};
```

The above is equivalent to:
The above is roughly equivalent to:

```javascript
const { defaults } = require("jest-config");

module.exports = {
// uses a webpack style resolver, the default one has many issues.
resolver: "enhanced-resolve-jest",
// uses a webpack style resolver
resolver: "...",
// allows for stuff like file watching of `.marko` files
moduleFileExtensions: defaults.moduleFileExtensions.concat("marko"),
// preprocesses Marko files.
transform: { "\\.marko$": "@marko/jest" },
transform: { "\\.marko$": "@marko/jest/transform/browser" },
// transforms `.marko` files in node_modules as well
transformIgnorePatterns: ["node_modules/.*(?<!\\.marko)$"]
browser: true
transformIgnorePatterns: ["node_modules/.*(?<!\\.marko)$"
};
```

Expand All @@ -81,18 +79,17 @@ Jest presets are extensible by default, meaning you should be able to continue t

```javascript
module.exports = {
preset: "@marko/jest",
preset: "@marko/jest/preset/browser",
transform: {
"\\.ts$": "ts-jest"
},
browser: true
}
};
```

You can also get access to the preset configuration manually by importing `@marko/jest/jest-preset` and use it like so:
You can also get access to the preset configuration manually by importing `@marko/jest/preset/browser/jest-preset` and use it like so:

```javascript
const markoJest = require("@marko/jest/jest-preset");
const markoJest = require("@marko/jest/preset/browser/jest-preset");
module.exports = {
transform: markoJest.transform,
transformIgnorePatterns: markoJest.transformIgnorePatterns,
Expand All @@ -104,7 +101,7 @@ module.exports = {

## Test both server & browser

The above configurations all set `browser: true`, for many Marko projects you may have a mix of server and browser components. You can test all of these with Jest by using the [projects configuration](https://jestjs.io/docs/en/configuration#projects-array-string-projectconfig) [like this project does](./blob/master/jest.config.js)!
For many Marko projects you may have a mix of server and browser components. You can test all of these with Jest by using the [projects configuration](https://jestjs.io/docs/en/configuration#projects-array-string-projectconfig) [like this project does](./blob/master/jest.config.js)! Simply make sure to use `@marko/jest/preset/node` and `@marko/jest/preset/browser` according to the test environment.

**jest.config.js**

Expand All @@ -113,14 +110,12 @@ module.exports = {
projects: [
{
displayName: "browser",
preset: "@marko/jest",
browser: true,
preset: "@marko/jest/preset/browser",
testMatch: ["**/__tests__/**/*.browser.js"]
},
{
displayName: "server",
preset: "@marko/jest",
testEnvironment: "node",
preset: "@marko/jest/preset/node",
testMatch: ["**/__tests__/**/*.server.js"]
}
]
Expand All @@ -133,7 +128,7 @@ In the above example config, any tests with `*.browser.js` will run in a JSDOM c

By default Jest will not transform any `.marko` files within your `node_modules` folder. Marko recommends publishing the original source Marko files when publishing to npm. To get around this you can use the [`transformIgnorePatterns`](https://jestjs.io/docs/en/tutorial-react-native#transformignorepatterns-customization) option in Jest and whitelist `.marko` files.

The `@marko/jest` preset sets the ignore pattern for you. If you are just using the `@marko/jest` transformer standalone then you will have to do this yourself, like so:
The `@marko/jest/preset/*` helpers set the ignore pattern for you. If you are using the `@marko/jest/transform/*` directly then you will have to do this yourself, like so:

**jest.config.js**

Expand Down
11 changes: 10 additions & 1 deletion jest-preset.js
Original file line number Diff line number Diff line change
@@ -1,4 +1,13 @@
const { defaults } = require("jest-config");
const { version } = require("jest/package.json");
const warning =
"@marko/jest preset will not work with jest@26 and above. Instead use @marko/jest/preset/browser or @marko/jest/preset/node.";

if (parseInt(version.split(".")[0], 10) >= 26) {
throw new Error(warning);
} else {
console.warn(warning);
}

module.exports = {
// uses a webpack style resolver, the default one has many issues.
Expand All @@ -7,7 +16,7 @@ module.exports = {
moduleFileExtensions: defaults.moduleFileExtensions.concat("marko"),
// preprocesses Marko files.
transform: {
"\\.marko$": require.resolve("."),
"\\.marko$": require.resolve("./transform/node"),
"\\.[tj]s$": "babel-jest"
},
// Jest ignores node_module transforms by default.
Expand Down
6 changes: 3 additions & 3 deletions jest.config.js
Original file line number Diff line number Diff line change
@@ -1,5 +1,4 @@
const base = {
preset: "./jest-preset",
transform: {
"\\.ts$": "ts-jest",
"\\.css$": "jest-transform-css"
Expand All @@ -10,14 +9,15 @@ module.exports = {
projects: [
{
...base,
displayName: "server",
preset: "./preset/node/jest-preset.js",
displayName: "node",
testEnvironment: "node",
testMatch: ["<rootDir>/test/server.test.ts"]
},
{
...base,
preset: "./preset/browser/jest-preset.js",
displayName: "browser",
browser: true,
testMatch: ["<rootDir>/test/browser.test.ts"]
}
]
Expand Down
5 changes: 3 additions & 2 deletions package.json
Original file line number Diff line number Diff line change
Expand Up @@ -32,7 +32,8 @@
"typescript": "^3.5.3"
},
"files": [
"dist",
"preset",
"transform",
"jest-preset.js"
],
"homepage": "https://github.com/marko-js/jest",
Expand All @@ -42,7 +43,7 @@
"test"
],
"license": "MIT",
"main": "dist/index.js",
"main": "transform/node.js",
"peerDependencies": {
"marko": "^3 || ^4"
},
Expand Down
12 changes: 12 additions & 0 deletions src/preset/browser/jest-preset.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
import sharedPreset from "../shared-preset";

export = {
...sharedPreset,
// uses a webpack style resolver, the default one has many issues.
resolver: require.resolve("./resolver"),
// preprocesses Marko files.
transform: {
"\\.marko$": require.resolve("../../transform/browser"),
...sharedPreset.transform
}
};
8 changes: 8 additions & 0 deletions src/preset/browser/resolver.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
import { create, getDefaultConfig } from "enhanced-resolve-jest";

export = create(jestConfig => {
const baseConfig = getDefaultConfig(jestConfig);
baseConfig.aliasFields = ["browser"];
baseConfig.mainFields = ["browser", "main"];
return baseConfig;
});
12 changes: 12 additions & 0 deletions src/preset/node/jest-preset.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
import sharedPreset from "../shared-preset";

export = {
...sharedPreset,
// avoid loading jsdom.
testEnvironment: "node",
// preprocesses Marko files.
transform: {
"\\.marko$": require.resolve("../../transform/node"),
...sharedPreset.transform
}
};
10 changes: 10 additions & 0 deletions src/preset/shared-preset.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
import { defaults } from "jest-config";

export = {
// allows for stuff like file watching of `.marko` files
moduleFileExtensions: defaults.moduleFileExtensions.concat("marko"),
transform: { "\\.[tj]s$": "babel-jest" },
// Jest ignores node_module transforms by default.
// Here we whitelist all `.marko` files.
transformIgnorePatterns: ["node_modules/.*(?<!\\.marko)$"]
};
2 changes: 2 additions & 0 deletions src/transform/browser.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,2 @@
import createTransform from "./create-transform";
export = createTransform({ browser: true });
6 changes: 3 additions & 3 deletions src/index.ts → src/transform/create-transform.ts
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,7 @@ import ConcatMap from "concat-with-sourcemaps";
import { Transformer } from "@jest/transform";
const THIS_FILE = fs.readFileSync(__filename);

export = {
export = ({ browser }: { browser: boolean }) => ({
getCacheKey(fileData, filename, configString, { instrument, rootDir }) {
return crypto
.createHash("md5")
Expand All @@ -25,7 +25,7 @@ export = {
},
process(src, filename, config) {
const result = compiler[
config.browser &&
(browser || config.browser) &&
compiler.compileForBrowser /** Only Marko 4 supports compileForBrowser, otherwise use compile */
? "compileForBrowser"
: "compile"
Expand Down Expand Up @@ -98,4 +98,4 @@ export = {
};
},
canInstrument: false
} as Transformer;
} as Transformer);
2 changes: 2 additions & 0 deletions src/transform/node.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,2 @@
import createTransform from "./create-transform";
export = createTransform({ browser: false });
5 changes: 3 additions & 2 deletions tsconfig.json
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@
"lib": ["dom", "es2015", "scripthost"],
"pretty": true,
"target": "es5",
"outDir": "./dist",
"outDir": ".",
"sourceMap": true,
"declaration": true,
"stripInternal": true,
Expand All @@ -14,5 +14,6 @@
"moduleResolution": "node",
"forceConsistentCasingInFileNames": true
},
"include": ["./src/**/*"]
"include": ["./src/**/*"],
"exclude": []
}

0 comments on commit 46ef443

Please sign in to comment.