diff --git a/.eslintrc b/.eslintrc index 50f403c..d7f22aa 100644 --- a/.eslintrc +++ b/.eslintrc @@ -1,4 +1,7 @@ { - "extends": "important-stuff", - "parser": "@babel/eslint-parser" + "extends": "node-important-stuff", + "parser": "@babel/eslint-parser", + "rules": { + "node/no-unpublished-import": "off" + } } diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml index 3e962c0..3bc4633 100644 --- a/.github/workflows/test.yml +++ b/.github/workflows/test.yml @@ -1,8 +1,12 @@ name: Build and Test on: - - push - - pull_request + push: + branches: + - main + pull_request: + branches: + - "*" jobs: build: @@ -12,10 +16,11 @@ jobs: - uses: actions/checkout@v2 - uses: actions/setup-node@v2 with: - node-version: "16" - - uses: pnpm/action-setup@v1.2.1 + node-version: "16.12" + - uses: pnpm/action-setup@v2.0.1 with: - version: 6.9.1 + version: 6.20.3 - run: pnpm install --frozen-lockfile - run: pnpm test + - run: pnpm run check-format - run: pnpm run lint diff --git a/.husky/pre-commit b/.husky/pre-commit index 8ef6b5f..8918844 100755 --- a/.husky/pre-commit +++ b/.husky/pre-commit @@ -1,4 +1,4 @@ #!/bin/sh . "$(dirname "$0")/_/husky.sh" -pnpm test +pnpm exec pretty-quick -- --staged && pnpm test diff --git a/README.md b/README.md index 08c1a26..2af1ee1 100644 --- a/README.md +++ b/README.md @@ -13,6 +13,8 @@ npm install --save @node-loader/babel yarn add --save @node-loader/babel ``` +If using Node<16.12, use `@node-loader/babel@1`. Otherwise, use `@node-loader/babel@latest` + ## Usage Run node with the `--experimental-loader` flag: diff --git a/lib/node-loader-babel.js b/lib/node-loader-babel.js index 10a7a01..e41a59b 100644 --- a/lib/node-loader-babel.js +++ b/lib/node-loader-babel.js @@ -1,6 +1,6 @@ import babel from "@babel/core"; import path from "path"; -import url from "url"; +import urlModule from "url"; const { loadOptionsAsync, transformAsync } = babel; @@ -17,25 +17,41 @@ function isBabelConfigFile(filename) { ); } -export async function transformSource(source, context, defaultGetSource) { - const filename = url.fileURLToPath(context.url); - // Babel config files can themselves be ES modules, - // but we cannot transform those since doing so would cause an infinite loop. - if (isBabelConfigFile(filename)) { - return { source }; - } +export async function load(url, context, defaultLoad) { + if (useLoader(url)) { + const { source } = await defaultLoad(url, context, defaultLoad); + + const filename = urlModule.fileURLToPath(url); + // Babel config files can themselves be ES modules, + // but we cannot transform those since doing so would cause an infinite loop. + if (isBabelConfigFile(filename)) { + return { + source, + format: /\.(c|m)?js$/.test(filename) ? "module" : "json", + }; + } + + const options = await loadOptionsAsync({ + sourceType: "module", + root: process.cwd(), + rootMode: "root", + filename: filename, + configFile: true, + }); - const options = await loadOptionsAsync({ - sourceType: "module", - root: process.cwd(), - rootMode: "root", - filename: filename, - configFile: true, - }); + const transformed = await transformAsync(source, options); - const transformed = await transformAsync(source, options); + return { + source: transformed.code, + // Maybe a shaky assumption + // TODO: look at babel config to see whether it will output ESM/CJS or other formats + format: "module", + }; + } else { + return defaultLoad(url, context, defaultLoad); + } +} - return { - source: transformed.code, - }; +function useLoader(url) { + return !/node_modules/.test(url) && !/node:/.test(url); } diff --git a/package.json b/package.json index 70544e8..79c5325 100644 --- a/package.json +++ b/package.json @@ -6,7 +6,8 @@ "type": "module", "scripts": { "format": "prettier --write .", - "lint": "prettier --check . && eslint lib", + "lint": "eslint lib", + "check-format": "prettier --check .", "test": "node --experimental-loader ./lib/node-loader-babel.js ./test/run-tests.js", "prepare": "husky install" }, @@ -28,8 +29,7 @@ "@babel/eslint-parser": "^7.14.7", "@babel/plugin-transform-react-jsx": "^7.10.4", "eslint": "^7.30.0", - "eslint-config-important-stuff": "^1.1.0", - "eslint-config-node-important-stuff": "^1.1.0", + "eslint-config-node-important-stuff": "^2.0.0", "husky": "^7.0.0", "mocha": "^9.0.2", "prettier": "^2.1.2", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 0167adf..75b183e 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -5,8 +5,7 @@ specifiers: '@babel/eslint-parser': ^7.14.7 '@babel/plugin-transform-react-jsx': ^7.10.4 eslint: ^7.30.0 - eslint-config-important-stuff: ^1.1.0 - eslint-config-node-important-stuff: ^1.1.0 + eslint-config-node-important-stuff: ^2.0.0 husky: ^7.0.0 mocha: ^9.0.2 prettier: ^2.1.2 @@ -17,8 +16,7 @@ devDependencies: '@babel/eslint-parser': 7.14.7_@babel+core@7.14.6+eslint@7.30.0 '@babel/plugin-transform-react-jsx': 7.14.5_@babel+core@7.14.6 eslint: 7.30.0 - eslint-config-important-stuff: 1.1.0 - eslint-config-node-important-stuff: 1.1.0_eslint@7.30.0 + eslint-config-node-important-stuff: 2.0.0_eslint@7.30.0 husky: 7.0.0 mocha: 9.0.2 prettier: 2.3.2 @@ -665,8 +663,8 @@ packages: resolution: {integrity: sha512-CsV6QFsjNDTZTDEgE1XxhTKph4YJUh5XFMdsWv3p+9DuMyvfy40fsnZiwqXZHBVEUNMHf+zfPGk6s6b4fS9Erw==} dev: true - /eslint-config-node-important-stuff/1.1.0_eslint@7.30.0: - resolution: {integrity: sha512-bG6bnD0P81rWYIU2yY3RUxnjz7BoDushsTsDUfg0tZlujXHqApaR2tN1AskHk/FEOYOB7hObY9NxmPdiT8jctA==} + /eslint-config-node-important-stuff/2.0.0_eslint@7.30.0: + resolution: {integrity: sha512-UU6Cn5R29dduIcngYzAAuK2BdKRXioKn0VBzdFUTW2XLUkYJBiqq6QRFzzX2Me3y5vczjoYe1h/8tJ3cbPaB3A==} dependencies: eslint-config-important-stuff: 1.1.0 eslint-plugin-node: 11.1.0_eslint@7.30.0