diff --git a/.gitignore b/.gitignore index 40b0228..1af0b80 100755 --- a/.gitignore +++ b/.gitignore @@ -10,7 +10,8 @@ npm-debug.log # Build -dist +/transform +/preset # Coverage coverage diff --git a/.prettierignore b/.prettierignore index f95f741..16a9278 100644 --- a/.prettierignore +++ b/.prettierignore @@ -5,5 +5,6 @@ package-lock.json CHANGELOG.md node_modules coverage -dist +/preset +/transform *.actual.* \ No newline at end of file diff --git a/README.md b/README.md index b665dc4..7b010cd 100644 --- a/README.md +++ b/README.md @@ -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/.*(?= 26) { + throw new Error(warning); +} else { + console.warn(warning); +} module.exports = { // uses a webpack style resolver, the default one has many issues. @@ -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. diff --git a/jest.config.js b/jest.config.js index 5adb33a..743e575 100644 --- a/jest.config.js +++ b/jest.config.js @@ -1,5 +1,4 @@ const base = { - preset: "./jest-preset", transform: { "\\.ts$": "ts-jest", "\\.css$": "jest-transform-css" @@ -10,14 +9,15 @@ module.exports = { projects: [ { ...base, - displayName: "server", + preset: "./preset/node/jest-preset.js", + displayName: "node", testEnvironment: "node", testMatch: ["/test/server.test.ts"] }, { ...base, + preset: "./preset/browser/jest-preset.js", displayName: "browser", - browser: true, testMatch: ["/test/browser.test.ts"] } ] diff --git a/package.json b/package.json index 04cc645..44228a8 100644 --- a/package.json +++ b/package.json @@ -32,7 +32,8 @@ "typescript": "^3.5.3" }, "files": [ - "dist", + "preset", + "transform", "jest-preset.js" ], "homepage": "https://github.com/marko-js/jest", @@ -42,7 +43,7 @@ "test" ], "license": "MIT", - "main": "dist/index.js", + "main": "transform/node.js", "peerDependencies": { "marko": "^3 || ^4" }, diff --git a/src/preset/browser/jest-preset.ts b/src/preset/browser/jest-preset.ts new file mode 100644 index 0000000..c5fd62f --- /dev/null +++ b/src/preset/browser/jest-preset.ts @@ -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 + } +}; diff --git a/src/preset/browser/resolver.ts b/src/preset/browser/resolver.ts new file mode 100644 index 0000000..f469938 --- /dev/null +++ b/src/preset/browser/resolver.ts @@ -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; +}); diff --git a/src/preset/node/jest-preset.ts b/src/preset/node/jest-preset.ts new file mode 100644 index 0000000..6776758 --- /dev/null +++ b/src/preset/node/jest-preset.ts @@ -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 + } +}; diff --git a/src/preset/shared-preset.ts b/src/preset/shared-preset.ts new file mode 100644 index 0000000..f6d3267 --- /dev/null +++ b/src/preset/shared-preset.ts @@ -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/.*(? ({ getCacheKey(fileData, filename, configString, { instrument, rootDir }) { return crypto .createHash("md5") @@ -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" @@ -98,4 +98,4 @@ export = { }; }, canInstrument: false -} as Transformer; +} as Transformer); diff --git a/src/transform/node.ts b/src/transform/node.ts new file mode 100644 index 0000000..d6e459b --- /dev/null +++ b/src/transform/node.ts @@ -0,0 +1,2 @@ +import createTransform from "./create-transform"; +export = createTransform({ browser: false }); diff --git a/tsconfig.json b/tsconfig.json index 550cd91..6e47f2e 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -3,7 +3,7 @@ "lib": ["dom", "es2015", "scripthost"], "pretty": true, "target": "es5", - "outDir": "./dist", + "outDir": ".", "sourceMap": true, "declaration": true, "stripInternal": true, @@ -14,5 +14,6 @@ "moduleResolution": "node", "forceConsistentCasingInFileNames": true }, - "include": ["./src/**/*"] + "include": ["./src/**/*"], + "exclude": [] }