From 01d22e2807d00bfddc3f8e1867b7cd6c1f506aa3 Mon Sep 17 00:00:00 2001 From: Mark Wubben Date: Mon, 1 Nov 2021 20:50:17 +0100 Subject: [PATCH 1/9] Simplify issue template --- .github/ISSUE_TEMPLATE/config.yml | 7 ------- 1 file changed, 7 deletions(-) diff --git a/.github/ISSUE_TEMPLATE/config.yml b/.github/ISSUE_TEMPLATE/config.yml index 6f91954..0086358 100644 --- a/.github/ISSUE_TEMPLATE/config.yml +++ b/.github/ISSUE_TEMPLATE/config.yml @@ -1,8 +1 @@ blank_issues_enabled: true -contact_links: - - name: AVA on Spectrum - url: https://spectrum.chat/ava - about: Ask questions and discuss in our Spectrum community - - name: Stack Overflow - url: https://stackoverflow.com/questions/tagged/ava - about: Tag your question on Stack Overflow From d508fb6673a3ab75cf3aba678c217f9c6ce5d606 Mon Sep 17 00:00:00 2001 From: Mark Wubben Date: Mon, 1 Nov 2021 20:52:34 +0100 Subject: [PATCH 2/9] Upgrade XO and apply changes --- index.js | 42 +++++++++++++++---------------- package.json | 6 +++-- test/_with-provider.js | 32 +++++++++++------------ test/compilation.js | 28 ++++++++++----------- test/fixtures/install-and-load.js | 5 ++-- test/protocol-ava-3.2.js | 2 +- 6 files changed, 56 insertions(+), 59 deletions(-) diff --git a/index.js b/index.js index 8fc5369..1a027ea 100644 --- a/index.js +++ b/index.js @@ -44,7 +44,7 @@ const configProperties = { required: true, isValid(compile) { return compile === false || compile === 'tsc'; - } + }, }, rewritePaths: { required: true, @@ -53,20 +53,18 @@ const configProperties = { return false; } - return Object.entries(rewritePaths).every(([from, to]) => { - return from.endsWith('/') && typeof to === 'string' && to.endsWith('/'); - }); - } + return Object.entries(rewritePaths).every(([from, to]) => from.endsWith('/') && typeof to === 'string' && to.endsWith('/')); + }, }, extensions: { required: false, isValid(extensions) { - return Array.isArray(extensions) && - extensions.length > 0 && - extensions.every(ext => typeof ext === 'string' && ext !== '') && - new Set(extensions).size === extensions.length; - } - } + return Array.isArray(extensions) + && extensions.length > 0 + && extensions.every(ext => typeof ext === 'string' && ext !== '') + && new Set(extensions).size === extensions.length; + }, + }, }; module.exports = ({negotiateProtocol}) => { @@ -86,12 +84,12 @@ module.exports = ({negotiateProtocol}) => { const { extensions = ['ts'], rewritePaths: relativeRewritePaths, - compile + compile, } = config; const rewritePaths = Object.entries(relativeRewritePaths).map(([from, to]) => [ path.join(protocol.projectDir, from), - path.join(protocol.projectDir, to) + path.join(protocol.projectDir, to), ]); const testFileExtension = new RegExp(`\\.(${extensions.map(ext => escapeStringRegexp(ext)).join('|')})$`); @@ -102,13 +100,13 @@ module.exports = ({negotiateProtocol}) => { } return { - extensions: extensions.slice(), - rewritePaths: rewritePaths.slice() + extensions: [...extensions], + rewritePaths: [...rewritePaths], }; }, get extensions() { - return extensions.slice(); + return [...extensions]; }, ignoreChange(filePath) { @@ -139,14 +137,14 @@ module.exports = ({negotiateProtocol}) => { filePatterns: [ ...filePatterns, '!**/*.d.ts', - ...Object.values(relativeRewritePaths).map(to => `!${to}**`) + ...Object.values(relativeRewritePaths).map(to => `!${to}**`), ], ignoredByWatcherPatterns: [ ...ignoredByWatcherPatterns, - ...Object.values(relativeRewritePaths).map(to => `${to}**/*.js.map`) - ] + ...Object.values(relativeRewritePaths).map(to => `${to}**/*.js.map`), + ], }; - } + }, }; }, @@ -169,8 +167,8 @@ module.exports = ({negotiateProtocol}) => { // TODO: Support JSX preserve mode — https://www.typescriptlang.org/docs/handbook/jsx.html const rewritten = `${to}${ref.slice(from.length)}`.replace(testFileExtension, '.js'); return requireFn(rewritten); - } + }, }; - } + }, }; }; diff --git a/package.json b/package.json index c88c33c..cc83afa 100644 --- a/package.json +++ b/package.json @@ -27,7 +27,7 @@ "c8": "^7.7.1", "del": "^6.0.0", "typescript": "^4.2.4", - "xo": "^0.38.2" + "xo": "^0.46.3" }, "c8": { "reporter": [ @@ -47,7 +47,9 @@ "test/broken-fixtures" ], "rules": { - "import/order": "off" + "import/extensions": "off", + "import/order": "off", + "unicorn/prefer-module": "off" } } } diff --git a/test/_with-provider.js b/test/_with-provider.js index 9bc8089..39e6b2e 100644 --- a/test/_with-provider.js +++ b/test/_with-provider.js @@ -2,22 +2,20 @@ const path = require('path'); const pkg = require('../package.json'); const makeProvider = require('..'); -const createProviderMacro = (identifier, avaVersion, projectDir = __dirname) => { - return (t, run) => run(t, makeProvider({ - negotiateProtocol(identifiers, {version}) { - t.true(identifiers.includes(identifier)); - t.is(version, pkg.version); - return { - ava: {avaVersion}, - identifier, - normalizeGlobPatterns: patterns => patterns, - async findFiles({patterns}) { - return patterns.map(file => path.join(projectDir, file)); - }, - projectDir - }; - } - })); -}; +const createProviderMacro = (identifier, avaVersion, projectDir = __dirname) => (t, run) => run(t, makeProvider({ + negotiateProtocol(identifiers, {version}) { + t.true(identifiers.includes(identifier)); + t.is(version, pkg.version); + return { + ava: {avaVersion}, + identifier, + normalizeGlobPatterns: patterns => patterns, + async findFiles({patterns}) { + return patterns.map(file => path.join(projectDir, file)); + }, + projectDir, + }; + }, +})); module.exports = createProviderMacro; diff --git a/test/compilation.js b/test/compilation.js index 0a791dd..3be563c 100644 --- a/test/compilation.js +++ b/test/compilation.js @@ -12,26 +12,24 @@ test.before('deleting compiled files', async t => { t.log(await del('test/broken-fixtures/typescript/compiled')); }); -const compile = async provider => { - return { - state: await provider.main({ - config: { - rewritePaths: { - 'ts/': 'typescript/', - 'compiled/': 'typescript/compiled/' - }, - compile: 'tsc' - } - }).compile() - }; -}; +const compile = async provider => ({ + state: await provider.main({ + config: { + rewritePaths: { + 'ts/': 'typescript/', + 'compiled/': 'typescript/compiled/', + }, + compile: 'tsc', + }, + }).compile(), +}); test('worker(): load rewritten paths files', withProvider, async (t, provider) => { const {state} = await compile(provider); const {stdout, stderr} = await execa.node( path.join(__dirname, 'fixtures/install-and-load'), [JSON.stringify(state), path.join(__dirname, 'fixtures/ts', 'file.ts')], - {cwd: path.join(__dirname, 'fixtures')} + {cwd: path.join(__dirname, 'fixtures')}, ); if (stderr.length > 0) { t.log(stderr); @@ -45,7 +43,7 @@ test('worker(): runs compiled files', withProvider, async (t, provider) => { const {stdout, stderr} = await execa.node( path.join(__dirname, 'fixtures/install-and-load'), [JSON.stringify(state), path.join(__dirname, 'fixtures/compiled', 'index.ts')], - {cwd: path.join(__dirname, 'fixtures')} + {cwd: path.join(__dirname, 'fixtures')}, ); if (stderr.length > 0) { t.log(stderr); diff --git a/test/fixtures/install-and-load.js b/test/fixtures/install-and-load.js index 5e1f26c..d95ec87 100644 --- a/test/fixtures/install-and-load.js +++ b/test/fixtures/install-and-load.js @@ -1,15 +1,16 @@ const path = require('path'); +const process = require('process'); const makeProvider = require('../..'); const provider = makeProvider({ negotiateProtocol() { return {identifier: 'ava-3.2', ava: {version: '3.15.0'}, projectDir: __dirname}; - } + }, }); const worker = provider.worker({ extensionsToLoadAsModules: [], - state: JSON.parse(process.argv[2]) + state: JSON.parse(process.argv[2]), }); const ref = path.resolve(process.argv[3]); diff --git a/test/protocol-ava-3.2.js b/test/protocol-ava-3.2.js index 476895f..fa4281b 100644 --- a/test/protocol-ava-3.2.js +++ b/test/protocol-ava-3.2.js @@ -81,6 +81,6 @@ test('main() updateGlobs()', withProvider, (t, provider) => { const main = provider.main({config: {rewritePaths: {'src/': 'build/'}, compile: false}}); t.snapshot(main.updateGlobs({ filePatterns: ['src/test.ts'], - ignoredByWatcherPatterns: ['assets/**'] + ignoredByWatcherPatterns: ['assets/**'], })); }); From 5560c2518065c9c7c086299f5329bae61c68468f Mon Sep 17 00:00:00 2001 From: Mark Wubben Date: Mon, 1 Nov 2021 20:53:37 +0100 Subject: [PATCH 3/9] Update dependencies --- package.json | 8 ++++---- test/snapshots/compilation.js.snap | Bin 284 -> 303 bytes test/snapshots/protocol-ava-3.2.js.snap | Bin 738 -> 756 bytes 3 files changed, 4 insertions(+), 4 deletions(-) diff --git a/package.json b/package.json index cc83afa..4c88f5c 100644 --- a/package.json +++ b/package.json @@ -20,13 +20,13 @@ }, "dependencies": { "escape-string-regexp": "^4.0.0", - "execa": "^5.0.0" + "execa": "^5.1.1" }, "devDependencies": { - "ava": "^3.15.0", - "c8": "^7.7.1", + "ava": "4.0.0-rc.1", + "c8": "^7.10.0", "del": "^6.0.0", - "typescript": "^4.2.4", + "typescript": "^4.4.4", "xo": "^0.46.3" }, "c8": { diff --git a/test/snapshots/compilation.js.snap b/test/snapshots/compilation.js.snap index 1d4c4eda42693aee7cdbddc2638609b68826f39e..9171aa333cc64d20e81c90be6ea85a5bbb0f8d9e 100644 GIT binary patch literal 303 zcmV+~0nq+IRzV2N>pHq$E-VIrYjX=)vpQ9q7t-w%M7c z^=SAK{8HCO0>n6{IZWPrbJ)B&U+iT6MQYVich~x`qmWK>a2^c=YJ*iJh8ndL*jPtm zg|U{>t9%}eLB-ecRdSvD%wU*|1|#RUTQXp|zt7&~h`&AIL&E}vuj+VV{^PDLxcBGW zPMbh7*N>W{2)5R_WkX%2N16YHr&FL1eE3V>U(lPiuPWr&f_+kJwFK&{#!5r5%t57q z+01egs3KN$H)rmQ2<000000009E zVPIfjX7DZG_h>lz^`yk==h7;_AHHW~009#quFJABdvy0#)aO7O=8IE4XflFDgMoPE zxvtXB_X7B~Tdj6jbo}T}MzH8LuzBoY{fw*(f{bc8`RVDYDGHf+3Tc@YC8b5F#rh?c z1*yf!MVSR9`k8qtsTF!9#VC3Nk@e)H>SduympbR?<|gK)D5NC6iSMd6?Ano^OB2Fb5rw55_7natVA$@_G%dF7;0K6q!tzB7b%1U8yOpz iSSdIs=H=y=0PP0ak(Zd8s-T{zt_J`Mn{bIL0RR9UyMMj_ diff --git a/test/snapshots/protocol-ava-3.2.js.snap b/test/snapshots/protocol-ava-3.2.js.snap index 1e9982c6d786e2920d8fc33c830852e8b9ff307d..df5d750c263db1c2bb8361d6bada36e5e552c2a5 100644 GIT binary patch literal 756 zcmVnHiq z7=qt#lpl)-00000000B+mfdRW->FsOmef^sK+YU zfv?}V6*lJGTEc`}TBd=L4bh}+7K@Nsq2wyHkx?DmiMTAJ0;p7$GOA;=qN={l11mr> z4Uw|&X*Wb$_WDQJnQ+n%Ssl*YXJ;L9#UaEYl~nl} zDLZ6rj!YyRfHisX9bQV_)##Up^hHl|2#nA+kFaI3*l9x)ghAkb7fLT83B<~(hGXE)Iy{z-8bBYh=-i03Sent}A{i76N z9&y@63Yn=6=zTmLdXM+~o-w^q%C)GJmBT9~?>wkZTMwGFz)~*5G)PAMQ!kP8alu9@ z*Sth*ULh@wsq;r@0!zyW-q$z8^qEYO@-3Y2;MmHzAdK;i>|IW2d5?+( zkeLSNj18~lMnWe2zE8R!no=1aKIpw-Ho&%dpgBn{{Y1@QIR0i9x%07_F|3yzPqwO5 zDp{01D%{4gF{D`jPjT8wJBVZ*uX^D=S^u!77V9k$ mhkmu1ZCo1Oc!~jV3z>Xq+quFL_ud9CVfr6`iB?@V5C8yMZFbQB literal 738 zcmV<80v-K9RzVj?;UkBm^u!n(^p$jIx&*9QE2e>E!;tfMT4nLI|zbI90uzv=NCF)K9rc>9U# zM;7G=l3tzR>tzt^R3$<+ zIx$vy8MA1Es>XHJ+ZPT*%#^C7wFFfeFQ=kh4JXa8nywwNPR0XiOek-1M(t<~?rm!g zq@sV);xKB{Db Date: Mon, 1 Nov 2021 21:07:39 +0100 Subject: [PATCH 4/9] Upgrade to ESM --- index.js | 14 +++++++------- package.json | 13 ++++++------- test/_with-provider.js | 12 ++++++++---- test/base.js | 4 ++-- test/compilation.js | 14 ++++++++------ test/fixtures/install-and-load.js | 12 ++++++++---- test/fixtures/typescript/package.json | 3 +++ test/protocol-ava-3.2.js | 13 ++++++++----- 8 files changed, 50 insertions(+), 35 deletions(-) create mode 100644 test/fixtures/typescript/package.json diff --git a/index.js b/index.js index 1a027ea..c3c66c0 100644 --- a/index.js +++ b/index.js @@ -1,9 +1,9 @@ -'use strict'; -const path = require('path'); -const escapeStringRegexp = require('escape-string-regexp'); -const execa = require('execa'); -const pkg = require('./package.json'); +import fs from 'node:fs'; +import path from 'node:path'; +import escapeStringRegexp from 'escape-string-regexp'; +import execa from 'execa'; +const pkg = fs.readFileSync(new URL('package.json', import.meta.url)); const help = `See https://github.com/avajs/typescript/blob/v${pkg.version}/README.md`; function isPlainObject(x) { @@ -67,7 +67,7 @@ const configProperties = { }, }; -module.exports = ({negotiateProtocol}) => { +export default function typescriptProvider({negotiateProtocol}) { const protocol = negotiateProtocol(['ava-3.2'], {version: pkg.version}); if (protocol === null) { return; @@ -171,4 +171,4 @@ module.exports = ({negotiateProtocol}) => { }; }, }; -}; +} diff --git a/package.json b/package.json index 4c88f5c..9cd4823 100644 --- a/package.json +++ b/package.json @@ -8,6 +8,10 @@ "files": [ "index.js" ], + "exports": { + ".": "./index.js" + }, + "type": "module", "author": "Mark Wubben (https://novemberborn.net)", "repository": "avajs/typescript", "license": "MIT", @@ -19,7 +23,7 @@ "test": "xo && c8 ava" }, "dependencies": { - "escape-string-regexp": "^4.0.0", + "escape-string-regexp": "^5.0.0", "execa": "^5.1.1" }, "devDependencies": { @@ -45,11 +49,6 @@ "xo": { "ignores": [ "test/broken-fixtures" - ], - "rules": { - "import/extensions": "off", - "import/order": "off", - "unicorn/prefer-module": "off" - } + ] } } diff --git a/test/_with-provider.js b/test/_with-provider.js index 39e6b2e..673be3f 100644 --- a/test/_with-provider.js +++ b/test/_with-provider.js @@ -1,6 +1,10 @@ -const path = require('path'); -const pkg = require('../package.json'); -const makeProvider = require('..'); +import fs from 'node:fs'; +import path from 'node:path'; +import {fileURLToPath} from 'node:url'; +import makeProvider from '@ava/typescript'; + +const __dirname = path.dirname(fileURLToPath(import.meta.url)); +const pkg = fs.readFileSync(new URL('../package.json', import.meta.url)); const createProviderMacro = (identifier, avaVersion, projectDir = __dirname) => (t, run) => run(t, makeProvider({ negotiateProtocol(identifiers, {version}) { @@ -18,4 +22,4 @@ const createProviderMacro = (identifier, avaVersion, projectDir = __dirname) => }, })); -module.exports = createProviderMacro; +export default createProviderMacro; diff --git a/test/base.js b/test/base.js index d3344e5..1fb0df1 100644 --- a/test/base.js +++ b/test/base.js @@ -1,5 +1,5 @@ -const test = require('ava'); -const makeProvider = require('..'); +import test from 'ava'; +import makeProvider from '@ava/typescript'; test('bails when negotiating protocol returns `null`', t => { const provider = makeProvider({negotiateProtocol: () => null}); diff --git a/test/compilation.js b/test/compilation.js index 3be563c..dddb2da 100644 --- a/test/compilation.js +++ b/test/compilation.js @@ -1,9 +1,11 @@ -const path = require('path'); -const test = require('ava'); -const del = require('del'); -const execa = require('execa'); -const createProviderMacro = require('./_with-provider'); - +import path from 'node:path'; +import {fileURLToPath} from 'node:url'; +import test from 'ava'; +import del from 'del'; +import execa from 'execa'; +import createProviderMacro from './_with-provider.js'; + +const __dirname = path.dirname(fileURLToPath(import.meta.url)); const withProvider = createProviderMacro('ava-3.2', '3.2.0', path.join(__dirname, 'fixtures')); const withAltProvider = createProviderMacro('ava-3.2', '3.2.0', path.join(__dirname, 'broken-fixtures')); diff --git a/test/fixtures/install-and-load.js b/test/fixtures/install-and-load.js index d95ec87..08217bb 100644 --- a/test/fixtures/install-and-load.js +++ b/test/fixtures/install-and-load.js @@ -1,6 +1,10 @@ -const path = require('path'); -const process = require('process'); -const makeProvider = require('../..'); +import {createRequire} from 'node:module'; +import path from 'node:path'; +import process from 'node:process'; +import {fileURLToPath} from 'node:url'; +import makeProvider from '@ava/typescript'; + +const __dirname = path.dirname(fileURLToPath(import.meta.url)); const provider = makeProvider({ negotiateProtocol() { @@ -16,5 +20,5 @@ const worker = provider.worker({ const ref = path.resolve(process.argv[3]); if (worker.canLoad(ref)) { - worker.load(ref, {requireFn: require}); + worker.load(ref, {requireFn: createRequire(import.meta.url)}); } diff --git a/test/fixtures/typescript/package.json b/test/fixtures/typescript/package.json new file mode 100644 index 0000000..5bbefff --- /dev/null +++ b/test/fixtures/typescript/package.json @@ -0,0 +1,3 @@ +{ + "type": "commonjs" +} diff --git a/test/protocol-ava-3.2.js b/test/protocol-ava-3.2.js index fa4281b..366ba1b 100644 --- a/test/protocol-ava-3.2.js +++ b/test/protocol-ava-3.2.js @@ -1,8 +1,11 @@ -const path = require('path'); -const test = require('ava'); -const pkg = require('../package.json'); -const createProviderMacro = require('./_with-provider'); - +import fs from 'node:fs'; +import path from 'node:path'; +import {fileURLToPath} from 'node:url'; +import test from 'ava'; +import createProviderMacro from './_with-provider.js'; + +const __dirname = path.dirname(fileURLToPath(import.meta.url)); +const pkg = fs.readFileSync(new URL('../package.json', import.meta.url)); const withProvider = createProviderMacro('ava-3.2', '3.15.0'); const validateConfig = (t, provider, config) => { From 8b22ed3ed24b9acc278505208d3df15d5cebb88a Mon Sep 17 00:00:00 2001 From: Mark Wubben Date: Mon, 1 Nov 2021 21:08:49 +0100 Subject: [PATCH 5/9] Match AVA 4 Node.js versions --- .github/workflows/ci.yml | 2 +- package.json | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 4c247ee..250a51d 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -13,7 +13,7 @@ jobs: strategy: fail-fast: false matrix: - node-version: [^12.22, ^14.16, ^15] + node-version: [^12.22, ^14.17, ^16.4, ^17] os: [ubuntu-latest, windows-latest] steps: - uses: actions/checkout@v1 diff --git a/package.json b/package.json index 9cd4823..c064fcb 100644 --- a/package.json +++ b/package.json @@ -3,7 +3,7 @@ "version": "2.0.0", "description": "TypeScript provider for AVA", "engines": { - "node": ">=12.22 <13 || >=14.16 <15 || >=15" + "node": ">=12.22 <13 || >=14.17 <15 || >=16.4 <17 || >=17" }, "files": [ "index.js" From 3debd9d8e81367c6949fe290944fb38d9296a879 Mon Sep 17 00:00:00 2001 From: Mark Wubben Date: Mon, 1 Nov 2021 21:08:55 +0100 Subject: [PATCH 6/9] Update CI --- .github/workflows/ci.yml | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 250a51d..cd5d2cd 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -16,12 +16,13 @@ jobs: node-version: [^12.22, ^14.17, ^16.4, ^17] os: [ubuntu-latest, windows-latest] steps: - - uses: actions/checkout@v1 - with: - fetch-depth: 1 - - uses: actions/setup-node@v1 + - uses: actions/checkout@v2 + - uses: actions/setup-node@v2 with: node-version: ${{ matrix.node-version }} - run: npm install --no-audit - run: npm test - - uses: codecov/codecov-action@v1 + - uses: codecov/codecov-action@v2 + with: + files: coverage/lcov.info + name: ${{ matrix.os }}/${{ matrix.node-version }} From 407378175469625ec77d51d6416975feff38bcde Mon Sep 17 00:00:00 2001 From: Mark Wubben Date: Mon, 1 Nov 2021 21:39:57 +0100 Subject: [PATCH 7/9] Support ESM files Fixes #5. --- README.md | 4 ++++ index.js | 10 +++------ package.json | 4 ++++ test/compilation.js | 4 ++-- test/esm.js | 33 ++++++++++++++++++++++++++++++ test/fixtures/esm/index.js | 1 + test/fixtures/esm/index.ts | 1 + test/fixtures/esm/tsconfig.json | 8 ++++++++ test/fixtures/install-and-load.js | 3 ++- test/snapshots/esm.js.md | 11 ++++++++++ test/snapshots/esm.js.snap | Bin 0 -> 169 bytes 11 files changed, 69 insertions(+), 10 deletions(-) create mode 100644 test/esm.js create mode 100644 test/fixtures/esm/index.js create mode 100644 test/fixtures/esm/index.ts create mode 100644 test/fixtures/esm/tsconfig.json create mode 100644 test/snapshots/esm.js.md create mode 100644 test/snapshots/esm.js.snap diff --git a/README.md b/README.md index 4466038..c0452b5 100644 --- a/README.md +++ b/README.md @@ -39,6 +39,10 @@ Output files are expected to have the `.js` extension. AVA searches your entire project for `*.js`, `*.cjs`, `*.mjs` and `*.ts` files (or other extensions you've configured). It will ignore such files found in the `rewritePaths` targets (e.g. `build/`). If you use more specific paths, for instance `build/main/`, you may need to change AVA's `files` configuration to ignore other directories. +## ES Modules + +When used with AVA 4, if your `package.json` has configured `"type": "module"`, or you've configured AVA to treat the `js` extension as `module`, then `@ava/typescript` will import the output file as an ES module. Note that this is based on the *output file*, not the `ts` extension. + ## Add additional extensions You can configure AVA to recognize additional file extensions. To add (partial†) JSX support: diff --git a/index.js b/index.js index c3c66c0..d27d1b0 100644 --- a/index.js +++ b/index.js @@ -1,5 +1,6 @@ import fs from 'node:fs'; import path from 'node:path'; +import {pathToFileURL} from 'node:url'; import escapeStringRegexp from 'escape-string-regexp'; import execa from 'execa'; @@ -149,6 +150,7 @@ export default function typescriptProvider({negotiateProtocol}) { }, worker({extensionsToLoadAsModules, state: {extensions, rewritePaths}}) { + const useImport = extensionsToLoadAsModules.includes('js'); const testFileExtension = new RegExp(`\\.(${extensions.map(ext => escapeStringRegexp(ext)).join('|')})$`); return { @@ -157,16 +159,10 @@ export default function typescriptProvider({negotiateProtocol}) { }, async load(ref, {requireFn}) { - for (const extension of extensionsToLoadAsModules) { - if (ref.endsWith(`.${extension}`)) { - throw new Error('@ava/typescript cannot yet load ESM files'); - } - } - const [from, to] = rewritePaths.find(([from]) => ref.startsWith(from)); // TODO: Support JSX preserve mode — https://www.typescriptlang.org/docs/handbook/jsx.html const rewritten = `${to}${ref.slice(from.length)}`.replace(testFileExtension, '.js'); - return requireFn(rewritten); + return useImport ? import(pathToFileURL(rewritten)) : requireFn(rewritten); // eslint-disable-line node/no-unsupported-features/es-syntax }, }; }, diff --git a/package.json b/package.json index c064fcb..35fb797 100644 --- a/package.json +++ b/package.json @@ -44,6 +44,10 @@ "files": [ "!test/broken-fixtures/**" ], + "ignoredByWatcher": [ + "test/fixtures/**", + "test/broken-fixtures/**" + ], "timeout": "60s" }, "xo": { diff --git a/test/compilation.js b/test/compilation.js index dddb2da..6cf9257 100644 --- a/test/compilation.js +++ b/test/compilation.js @@ -30,7 +30,7 @@ test('worker(): load rewritten paths files', withProvider, async (t, provider) = const {state} = await compile(provider); const {stdout, stderr} = await execa.node( path.join(__dirname, 'fixtures/install-and-load'), - [JSON.stringify(state), path.join(__dirname, 'fixtures/ts', 'file.ts')], + [JSON.stringify({state}), path.join(__dirname, 'fixtures/ts', 'file.ts')], {cwd: path.join(__dirname, 'fixtures')}, ); if (stderr.length > 0) { @@ -44,7 +44,7 @@ test('worker(): runs compiled files', withProvider, async (t, provider) => { const {state} = await compile(provider); const {stdout, stderr} = await execa.node( path.join(__dirname, 'fixtures/install-and-load'), - [JSON.stringify(state), path.join(__dirname, 'fixtures/compiled', 'index.ts')], + [JSON.stringify({state}), path.join(__dirname, 'fixtures/compiled', 'index.ts')], {cwd: path.join(__dirname, 'fixtures')}, ); if (stderr.length > 0) { diff --git a/test/esm.js b/test/esm.js new file mode 100644 index 0000000..4d9d5e3 --- /dev/null +++ b/test/esm.js @@ -0,0 +1,33 @@ +import path from 'node:path'; +import {fileURLToPath} from 'node:url'; +import test from 'ava'; +import execa from 'execa'; +import createProviderMacro from './_with-provider.js'; + +const __dirname = path.dirname(fileURLToPath(import.meta.url)); +const withProvider = createProviderMacro('ava-3.2', '3.2.0', path.join(__dirname, 'fixtures')); + +const setup = async provider => ({ + state: await provider.main({ + config: { + rewritePaths: { + 'esm/': 'esm/', + }, + compile: false, + }, + }).compile(), +}); + +test('worker(): import ESM', withProvider, async (t, provider) => { + const {state} = await setup(provider); + const {stdout, stderr} = await execa.node( + path.join(__dirname, 'fixtures/install-and-load'), + [JSON.stringify({extensionsToLoadAsModules: ['js'], state}), path.join(__dirname, 'fixtures/esm', 'index.ts')], + {cwd: path.join(__dirname, 'fixtures')}, + ); + if (stderr.length > 0) { + t.log(stderr); + } + + t.snapshot(stdout); +}); diff --git a/test/fixtures/esm/index.js b/test/fixtures/esm/index.js new file mode 100644 index 0000000..b8a2e5c --- /dev/null +++ b/test/fixtures/esm/index.js @@ -0,0 +1 @@ +console.log('logged in fixtures/esm/index.js'); diff --git a/test/fixtures/esm/index.ts b/test/fixtures/esm/index.ts new file mode 100644 index 0000000..ed203aa --- /dev/null +++ b/test/fixtures/esm/index.ts @@ -0,0 +1 @@ +console.log('logged in fixtures/esm/index.ts'); diff --git a/test/fixtures/esm/tsconfig.json b/test/fixtures/esm/tsconfig.json new file mode 100644 index 0000000..41da438 --- /dev/null +++ b/test/fixtures/esm/tsconfig.json @@ -0,0 +1,8 @@ +{ + "compilerOptions": { + "outDir": "compiled" + }, + "include": [ + "." + ] +} diff --git a/test/fixtures/install-and-load.js b/test/fixtures/install-and-load.js index 08217bb..c92a633 100644 --- a/test/fixtures/install-and-load.js +++ b/test/fixtures/install-and-load.js @@ -14,7 +14,8 @@ const provider = makeProvider({ const worker = provider.worker({ extensionsToLoadAsModules: [], - state: JSON.parse(process.argv[2]), + state: {}, + ...JSON.parse(process.argv[2]), }); const ref = path.resolve(process.argv[3]); diff --git a/test/snapshots/esm.js.md b/test/snapshots/esm.js.md new file mode 100644 index 0000000..1642bed --- /dev/null +++ b/test/snapshots/esm.js.md @@ -0,0 +1,11 @@ +# Snapshot report for `test/esm.js` + +The actual snapshot is saved in `esm.js.snap`. + +Generated by [AVA](https://avajs.dev). + +## worker(): import ESM + +> Snapshot 1 + + 'logged in fixtures/esm/index.js' diff --git a/test/snapshots/esm.js.snap b/test/snapshots/esm.js.snap new file mode 100644 index 0000000000000000000000000000000000000000..d31fee50dc3c121aa0c9c8c46f7238150160a77f GIT binary patch literal 169 zcmV;a09OA&RzV Date: Tue, 2 Nov 2021 20:34:57 +0100 Subject: [PATCH 8/9] Test using npm@8 --- .github/workflows/ci.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index cd5d2cd..0800452 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -20,6 +20,7 @@ jobs: - uses: actions/setup-node@v2 with: node-version: ${{ matrix.node-version }} + - run: npm install --global npm@8 - run: npm install --no-audit - run: npm test - uses: codecov/codecov-action@v2 From cebe60bd8a6ef36b2ca4efd7020a9854d7665090 Mon Sep 17 00:00:00 2001 From: Mark Wubben Date: Tue, 2 Nov 2021 20:35:08 +0100 Subject: [PATCH 9/9] Fix branch reference --- .github/workflows/ci.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 0800452..c336669 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -2,7 +2,7 @@ name: Install and test @ava/typescript on: push: branches: - - master + - main pull_request: paths-ignore: - '*.md'