Skip to content

Commit 4ec638c

Browse files
committed
Support .cts and .mts
1 parent 34da7bf commit 4ec638c

21 files changed

+132
-58
lines changed

README.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -47,7 +47,7 @@ You can enable compilation via the `compile` property. If `false`, AVA will assu
4747

4848
Output files are expected to have the `.js` extension.
4949

50-
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.
50+
AVA searches your entire project for `*.js`, `*.cjs`, `*.mjs`, `*.ts`, `*.cts` and `*.mts` 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.
5151

5252
## ES Modules
5353

index.js

Lines changed: 28 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -83,7 +83,7 @@ export default function typescriptProvider({negotiateProtocol}) {
8383
validate(config, configProperties);
8484

8585
const {
86-
extensions = ['ts'],
86+
extensions = ['ts', 'cts', 'mts'],
8787
rewritePaths: relativeRewritePaths,
8888
compile,
8989
} = config;
@@ -118,7 +118,7 @@ export default function typescriptProvider({negotiateProtocol}) {
118118
return rewritePaths.some(([from]) => filePath.startsWith(from));
119119
},
120120

121-
resolveTestFile(testfile) {
121+
resolveTestFile(testfile) { // Used under AVA 3.2 protocol by legacy watcher implementation.
122122
if (!testFileExtension.test(testfile)) {
123123
return testfile;
124124
}
@@ -129,8 +129,14 @@ export default function typescriptProvider({negotiateProtocol}) {
129129
}
130130

131131
const [from, to] = rewrite;
132-
// TODO: Support JSX preserve mode — https://www.typescriptlang.org/docs/handbook/jsx.html
133-
return `${to}${testfile.slice(from.length)}`.replace(testFileExtension, '.js');
132+
let newExtension = '.js';
133+
if (testfile.endsWith('.cts')) {
134+
newExtension = '.cjs';
135+
} else if (testfile.endsWith('.mts')) {
136+
newExtension = '.mjs';
137+
}
138+
139+
return `${to}${testfile.slice(from.length)}`.replace(testFileExtension, newExtension);
134140
},
135141

136142
updateGlobs({filePatterns, ignoredByWatcherPatterns}) {
@@ -142,15 +148,19 @@ export default function typescriptProvider({negotiateProtocol}) {
142148
],
143149
ignoredByWatcherPatterns: [
144150
...ignoredByWatcherPatterns,
145-
...Object.values(relativeRewritePaths).map(to => `${to}**/*.js.map`),
151+
...Object.values(relativeRewritePaths).flatMap(to => [
152+
`${to}**/*.js.map`,
153+
`${to}**/*.cjs.map`,
154+
`${to}**/*.mjs.map`,
155+
]),
146156
],
147157
};
148158
},
149159
};
150160
},
151161

152162
worker({extensionsToLoadAsModules, state: {extensions, rewritePaths}}) {
153-
const useImport = extensionsToLoadAsModules.includes('js');
163+
const importJs = extensionsToLoadAsModules.includes('js');
154164
const testFileExtension = new RegExp(`\\.(${extensions.map(ext => escapeStringRegexp(ext)).join('|')})$`);
155165

156166
return {
@@ -160,8 +170,18 @@ export default function typescriptProvider({negotiateProtocol}) {
160170

161171
async load(ref, {requireFn}) {
162172
const [from, to] = rewritePaths.find(([from]) => ref.startsWith(from));
163-
// TODO: Support JSX preserve mode — https://www.typescriptlang.org/docs/handbook/jsx.html
164-
const rewritten = `${to}${ref.slice(from.length)}`.replace(testFileExtension, '.js');
173+
let rewritten = `${to}${ref.slice(from.length)}`;
174+
let useImport = true;
175+
if (ref.endsWith('.cts')) {
176+
rewritten = rewritten.replace(/\.cts$/, '.cjs');
177+
useImport = false;
178+
} else if (ref.endsWith('.mts')) {
179+
rewritten = rewritten.replace(/\.mts$/, '.mjs');
180+
} else {
181+
rewritten = rewritten.replace(testFileExtension, '.js');
182+
useImport = importJs;
183+
}
184+
165185
return useImport ? import(pathToFileURL(rewritten)) : requireFn(rewritten); // eslint-disable-line node/no-unsupported-features/es-syntax
166186
},
167187
};

package.json

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -52,7 +52,8 @@
5252
},
5353
"xo": {
5454
"ignores": [
55-
"test/broken-fixtures"
55+
"test/broken-fixtures",
56+
"test/fixtures/**/compiled/**"
5657
]
5758
}
5859
}

test/esm.js

Lines changed: 0 additions & 33 deletions
This file was deleted.

test/fixtures/esm/index.js

Lines changed: 0 additions & 1 deletion
This file was deleted.

test/fixtures/esm/index.ts

Lines changed: 0 additions & 1 deletion
This file was deleted.

test/fixtures/load/compiled/index.cjs

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
"use strict";
2+
Object.defineProperty(exports, "__esModule", { value: true });
3+
console.log('logged in fixtures/load/index.cts');

test/fixtures/load/compiled/index.js

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,2 @@
1+
console.log('logged in fixtures/load/index.ts');
2+
export {};

test/fixtures/load/compiled/index.mjs

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,2 @@
1+
console.log('logged in fixtures/load/index.mts');
2+
export {};

test/fixtures/load/index.cts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
console.log('logged in fixtures/load/index.cts');

0 commit comments

Comments
 (0)