diff --git a/.editorconfig b/.editorconfig index 1c6314a..c888938 100644 --- a/.editorconfig +++ b/.editorconfig @@ -10,3 +10,6 @@ insert_final_newline = true [*.yml] indent_style = space indent_size = 2 + +[package.json] +indent_style = space diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 02e439e..4c247ee 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -13,7 +13,7 @@ jobs: strategy: fail-fast: false matrix: - node-version: [^10.18.0, ^12.14.0, ^13.5.0] + node-version: [^12.22, ^14.16, ^15] os: [ubuntu-latest, windows-latest] steps: - uses: actions/checkout@v1 @@ -25,5 +25,3 @@ jobs: - run: npm install --no-audit - run: npm test - uses: codecov/codecov-action@v1 - with: - token: ${{ secrets.CODECOV_TOKEN }} diff --git a/.gitignore b/.gitignore index 4f52d76..ff9a350 100644 --- a/.gitignore +++ b/.gitignore @@ -1,3 +1,4 @@ -/.nyc_output /coverage /node_modules +/test/fixtures/typescript/compiled +/test/broken-fixtures/typescript/compiled diff --git a/README.md b/README.md index c403a50..4466038 100644 --- a/README.md +++ b/README.md @@ -1,6 +1,6 @@ # @ava/typescript -Adds rudimentary [TypeScript](https://www.typescriptlang.org/) support to [AVA](https://avajs.dev). +Adds [TypeScript](https://www.typescriptlang.org/) support to [AVA](https://avajs.dev). This is designed to work for projects that precompile TypeScript. It allows AVA to load the compiled JavaScript, while configuring AVA to treat the TypeScript files as test files. @@ -24,7 +24,8 @@ Then, enable TypeScript support either in `package.json` or `ava.config.*`: "typescript": { "rewritePaths": { "src/": "build/" - } + }, + "compile": false } } } @@ -32,6 +33,8 @@ Then, enable TypeScript support either in `package.json` or `ava.config.*`: Both keys and values of the `rewritePaths` object must end with a `/`. Paths are relative to your project directory. +You can enable compilation via the `compile` property. If `false`, AVA will assume you have already compiled your project. If set to `'tsc'`, AVA will run the TypeScript compiler before running your tests. This can be inefficient when using AVA in watch mode. + 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. diff --git a/index.js b/index.js index c054114..8fc5369 100644 --- a/index.js +++ b/index.js @@ -1,56 +1,92 @@ 'use strict'; const path = require('path'); - const escapeStringRegexp = require('escape-string-regexp'); - +const execa = require('execa'); const pkg = require('./package.json'); +const help = `See https://github.com/avajs/typescript/blob/v${pkg.version}/README.md`; + function isPlainObject(x) { return x !== null && typeof x === 'object' && Reflect.getPrototypeOf(x) === Object.prototype; } -function isValidExtensions(extensions) { - return Array.isArray(extensions) && - extensions.length > 0 && - extensions.every(ext => typeof ext === 'string' && ext !== '') && - new Set(extensions).size === extensions.length; -} +function validate(target, properties) { + for (const key of Object.keys(properties)) { + const {required, isValid} = properties[key]; + const missing = !Reflect.has(target, key); -function isValidRewritePaths(rewritePaths) { - if (!isPlainObject(rewritePaths)) { - return false; + if (missing) { + if (required) { + throw new Error(`Missing '${key}' property in TypeScript configuration for AVA. ${help}`); + } + + continue; + } + + if (!isValid(target[key])) { + throw new Error(`Invalid '${key}' property in TypeScript configuration for AVA. ${help}`); + } + } + + for (const key of Object.keys(target)) { + if (!Reflect.has(properties, key)) { + throw new Error(`Unexpected '${key}' property in TypeScript configuration for AVA. ${help}`); + } } +} - return Object.entries(rewritePaths).every(([from, to]) => { - return from.endsWith('/') && typeof to === 'string' && to.endsWith('/'); - }); +async function compileTypeScript(projectDir) { + return execa('tsc', ['--incremental'], {preferLocal: true, cwd: projectDir}); } +const configProperties = { + compile: { + required: true, + isValid(compile) { + return compile === false || compile === 'tsc'; + } + }, + rewritePaths: { + required: true, + isValid(rewritePaths) { + if (!isPlainObject(rewritePaths)) { + return false; + } + + return Object.entries(rewritePaths).every(([from, to]) => { + return 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; + } + } +}; + module.exports = ({negotiateProtocol}) => { - const protocol = negotiateProtocol(['ava-3.2', 'ava-3'], {version: pkg.version}); + const protocol = negotiateProtocol(['ava-3.2'], {version: pkg.version}); if (protocol === null) { return; } return { main({config}) { - let valid = false; - if (isPlainObject(config)) { - const keys = Object.keys(config); - if (keys.every(key => key === 'extensions' || key === 'rewritePaths')) { - valid = - (config.extensions === undefined || isValidExtensions(config.extensions)) && - isValidRewritePaths(config.rewritePaths); - } + if (!isPlainObject(config)) { + throw new Error(`Unexpected Typescript configuration for AVA. ${help}`); } - if (!valid) { - throw new Error(`Unexpected Typescript configuration for AVA. See https://github.com/avajs/typescript/blob/v${pkg.version}/README.md for allowed values.`); - } + validate(config, configProperties); const { extensions = ['ts'], - rewritePaths: relativeRewritePaths + rewritePaths: relativeRewritePaths, + compile } = config; const rewritePaths = Object.entries(relativeRewritePaths).map(([from, to]) => [ @@ -61,6 +97,10 @@ module.exports = ({negotiateProtocol}) => { return { async compile() { + if (compile === 'tsc') { + await compileTypeScript(protocol.projectDir); + } + return { extensions: extensions.slice(), rewritePaths: rewritePaths.slice() diff --git a/package.json b/package.json index 7e1ac53..c88c33c 100644 --- a/package.json +++ b/package.json @@ -1,9 +1,9 @@ { "name": "@ava/typescript", - "version": "1.1.1", + "version": "2.0.0", "description": "TypeScript provider for AVA", "engines": { - "node": ">=10.18.0 <11 || >=12.14.0 <13 || >=13.5.0" + "node": ">=12.22 <13 || >=14.16 <15 || >=15" }, "files": [ "index.js" @@ -16,25 +16,36 @@ "typescript" ], "scripts": { - "test": "xo && nyc ava" + "test": "xo && c8 ava" }, "dependencies": { - "escape-string-regexp": "^2.0.0" + "escape-string-regexp": "^4.0.0", + "execa": "^5.0.0" }, "devDependencies": { - "ava": "^3.0.0", - "execa": "^4.0.0", - "nyc": "^15.0.0", - "xo": "^0.25.3" + "ava": "^3.15.0", + "c8": "^7.7.1", + "del": "^6.0.0", + "typescript": "^4.2.4", + "xo": "^0.38.2" }, - "nyc": { + "c8": { "reporter": [ "html", "lcov", "text" ] }, + "ava": { + "files": [ + "!test/broken-fixtures/**" + ], + "timeout": "60s" + }, "xo": { + "ignores": [ + "test/broken-fixtures" + ], "rules": { "import/order": "off" } diff --git a/test/_with-provider.js b/test/_with-provider.js new file mode 100644 index 0000000..9bc8089 --- /dev/null +++ b/test/_with-provider.js @@ -0,0 +1,23 @@ +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 + }; + } + })); +}; + +module.exports = createProviderMacro; diff --git a/test/broken-fixtures/tsconfig.json b/test/broken-fixtures/tsconfig.json new file mode 100644 index 0000000..47d862c --- /dev/null +++ b/test/broken-fixtures/tsconfig.json @@ -0,0 +1,8 @@ +{ + "compilerOptions": { + "outDir": "typescript/compiled" + }, + "include": [ + "typescript" + ] +} diff --git a/test/broken-fixtures/typescript/typescript.ts b/test/broken-fixtures/typescript/typescript.ts new file mode 100644 index 0000000..7898192 --- /dev/null +++ b/test/broken-fixtures/typescript/typescript.ts @@ -0,0 +1 @@ +a diff --git a/test/compilation.js b/test/compilation.js new file mode 100644 index 0000000..0a791dd --- /dev/null +++ b/test/compilation.js @@ -0,0 +1,61 @@ +const path = require('path'); +const test = require('ava'); +const del = require('del'); +const execa = require('execa'); +const createProviderMacro = require('./_with-provider'); + +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')); + +test.before('deleting compiled files', async t => { + t.log(await del('test/fixtures/typescript/compiled')); + 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() + }; +}; + +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')} + ); + if (stderr.length > 0) { + t.log(stderr); + } + + t.snapshot(stdout); +}); + +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')], + {cwd: path.join(__dirname, 'fixtures')} + ); + if (stderr.length > 0) { + t.log(stderr); + } + + t.snapshot(stdout); +}); + +test('compile() error', withAltProvider, async (t, provider) => { + const {message} = await t.throwsAsync(compile(provider)); + + t.snapshot(message); +}); diff --git a/test/fixtures/install-and-load.js b/test/fixtures/install-and-load.js index fce29b1..5e1f26c 100644 --- a/test/fixtures/install-and-load.js +++ b/test/fixtures/install-and-load.js @@ -3,16 +3,16 @@ const makeProvider = require('../..'); const provider = makeProvider({ negotiateProtocol() { - return {identifier: process.argv[2], ava: {version: '3.0.0'}, projectDir: path.resolve(__dirname, '..')}; + return {identifier: 'ava-3.2', ava: {version: '3.15.0'}, projectDir: __dirname}; } }); const worker = provider.worker({ extensionsToLoadAsModules: [], - state: JSON.parse(process.argv[3]) + state: JSON.parse(process.argv[2]) }); -const ref = path.resolve(process.argv[4]); +const ref = path.resolve(process.argv[3]); if (worker.canLoad(ref)) { worker.load(ref, {requireFn: require}); diff --git a/test/fixtures/tsconfig.json b/test/fixtures/tsconfig.json new file mode 100644 index 0000000..47d862c --- /dev/null +++ b/test/fixtures/tsconfig.json @@ -0,0 +1,8 @@ +{ + "compilerOptions": { + "outDir": "typescript/compiled" + }, + "include": [ + "typescript" + ] +} diff --git a/test/fixtures/file.js b/test/fixtures/typescript/file.js similarity index 100% rename from test/fixtures/file.js rename to test/fixtures/typescript/file.js diff --git a/test/fixtures/typescript/index.ts b/test/fixtures/typescript/index.ts new file mode 100644 index 0000000..1bc76e0 --- /dev/null +++ b/test/fixtures/typescript/index.ts @@ -0,0 +1 @@ +console.log('logged in fixtures/typescript/index.ts'); diff --git a/test/protocol-ava-3.2.js b/test/protocol-ava-3.2.js index 8400002..476895f 100644 --- a/test/protocol-ava-3.2.js +++ b/test/protocol-ava-3.2.js @@ -1,41 +1,84 @@ const path = require('path'); const test = require('ava'); const pkg = require('../package.json'); -const makeProvider = require('..'); - -const withProvider = (t, run) => run(t, makeProvider({ - negotiateProtocol(identifiers, {version}) { - t.true(identifiers.includes('ava-3.2')); - t.is(version, pkg.version); - return { - ava: {version: '3.2.0'}, - identifier: 'ava-3.2', - normalizeGlobPatterns: patterns => patterns, - async findFiles({patterns}) { - return patterns.map(file => path.join(__dirname, file)); - }, - projectDir: __dirname - }; - } -})); +const createProviderMacro = require('./_with-provider'); + +const withProvider = createProviderMacro('ava-3.2', '3.15.0'); + +const validateConfig = (t, provider, config) => { + const error = t.throws(() => provider.main({config})); + error.message = error.message.replace(`v${pkg.version}`, 'v${pkg.version}'); // eslint-disable-line no-template-curly-in-string + t.snapshot(error); +}; test('negotiates ava-3.2 protocol', withProvider, t => t.plan(2)); +test('main() config validation: throw when config is not a plain object', withProvider, (t, provider) => { + validateConfig(t, provider, false); + validateConfig(t, provider, true); + validateConfig(t, provider, null); + validateConfig(t, provider, []); +}); + +test('main() config validation: throw when config contains keys other than \'extensions\', \'rewritePaths\' or \'compile\'', withProvider, (t, provider) => { + validateConfig(t, provider, {compile: false, foo: 1, rewritePaths: {'src/': 'build/'}}); +}); + +test('main() config validation: throw when config.extensions contains empty strings', withProvider, (t, provider) => { + validateConfig(t, provider, {extensions: ['']}); +}); + +test('main() config validation: throw when config.extensions contains non-strings', withProvider, (t, provider) => { + validateConfig(t, provider, {extensions: [1]}); +}); + +test('main() config validation: throw when config.extensions contains duplicates', withProvider, (t, provider) => { + validateConfig(t, provider, {extensions: ['ts', 'ts']}); +}); + +test('main() config validation: config may not be an empty object', withProvider, (t, provider) => { + validateConfig(t, provider, {}); +}); + +test('main() config validation: throw when config.compile is invalid', withProvider, (t, provider) => { + validateConfig(t, provider, {rewritePaths: {'src/': 'build/'}, compile: 1}); + validateConfig(t, provider, {rewritePaths: {'src/': 'build/'}, compile: undefined}); +}); + +test('main() config validation: rewrite paths must end in a /', withProvider, (t, provider) => { + validateConfig(t, provider, {rewritePaths: {src: 'build/', compile: false}}); + validateConfig(t, provider, {rewritePaths: {'src/': 'build', compile: false}}); +}); + +test('main() extensions: defaults to [\'ts\']', withProvider, (t, provider) => { + t.deepEqual(provider.main({config: {rewritePaths: {'src/': 'build/'}, compile: false}}).extensions, ['ts']); +}); + +test('main() extensions: returns configured extensions', withProvider, (t, provider) => { + const extensions = ['tsx']; + t.deepEqual(provider.main({config: {extensions, rewritePaths: {'src/': 'build/'}, compile: false}}).extensions, extensions); +}); + +test('main() extensions: always returns new arrays', withProvider, (t, provider) => { + const main = provider.main({config: {rewritePaths: {'src/': 'build/'}, compile: false}}); + t.not(main.extensions, main.extensions); +}); + test('main() ignoreChange()', withProvider, (t, provider) => { - const main = provider.main({config: {rewritePaths: {'src/': 'build/'}}}); + const main = provider.main({config: {rewritePaths: {'src/': 'build/'}, compile: false}}); t.true(main.ignoreChange(path.join(__dirname, 'src/foo.ts'))); t.false(main.ignoreChange(path.join(__dirname, 'build/foo.js'))); }); test('main() resolveTestfile()', withProvider, (t, provider) => { - const main = provider.main({config: {rewritePaths: {'src/': 'build/'}}}); + const main = provider.main({config: {rewritePaths: {'src/': 'build/'}, compile: false}}); t.is(main.resolveTestFile(path.join(__dirname, 'src/foo.ts')), path.join(__dirname, 'build/foo.js')); t.is(main.resolveTestFile(path.join(__dirname, 'build/foo.js')), path.join(__dirname, 'build/foo.js')); t.is(main.resolveTestFile(path.join(__dirname, 'foo/bar.ts')), path.join(__dirname, 'foo/bar.ts')); }); test('main() updateGlobs()', withProvider, (t, provider) => { - const main = provider.main({config: {rewritePaths: {'src/': 'build/'}}}); + const main = provider.main({config: {rewritePaths: {'src/': 'build/'}, compile: false}}); t.snapshot(main.updateGlobs({ filePatterns: ['src/test.ts'], ignoredByWatcherPatterns: ['assets/**'] diff --git a/test/protocol-ava-3.js b/test/protocol-ava-3.js deleted file mode 100644 index 5839f6e..0000000 --- a/test/protocol-ava-3.js +++ /dev/null @@ -1,101 +0,0 @@ -const path = require('path'); -const test = require('ava'); -const execa = require('execa'); -const pkg = require('../package.json'); -const makeProvider = require('..'); - -const withProvider = (t, run) => run(t, makeProvider({ - negotiateProtocol(identifiers, {version}) { - t.true(identifiers.includes('ava-3')); - t.is(version, pkg.version); - return { - ava: {version: '3.0.0'}, - identifier: 'ava-3', - normalizeGlobPatterns: patterns => patterns, - async findFiles({patterns}) { - return patterns.map(file => path.join(__dirname, file)); - }, - projectDir: __dirname - }; - } -})); - -const validateConfig = (t, provider, config) => { - const error = t.throws(() => provider.main({config})); - error.message = error.message.replace(`v${pkg.version}`, 'v${pkg.version}'); // eslint-disable-line no-template-curly-in-string - t.snapshot(error); -}; - -test('negotiates ava-3 protocol', withProvider, t => t.plan(2)); - -test('main() config validation: throw when config is not a plain object', withProvider, (t, provider) => { - validateConfig(t, provider, false); - validateConfig(t, provider, true); - validateConfig(t, provider, null); - validateConfig(t, provider, []); -}); - -test('main() config validation: throw when config contains keys other than \'extensions\' or \'rewritePaths\'', withProvider, (t, provider) => { - validateConfig(t, provider, {foo: 1}); -}); - -test('main() config validation: throw when config.extensions contains empty strings', withProvider, (t, provider) => { - validateConfig(t, provider, {extensions: ['']}); -}); - -test('main() config validation: throw when config.extensions contains non-strings', withProvider, (t, provider) => { - validateConfig(t, provider, {extensions: [1]}); -}); - -test('main() config validation: throw when config.extensions contains duplicates', withProvider, (t, provider) => { - validateConfig(t, provider, {extensions: ['ts', 'ts']}); -}); - -test('main() config validation: config may not be an empty object', withProvider, (t, provider) => { - validateConfig(t, provider, {}); -}); - -test('main() config validation: rewrite paths must end in a /', withProvider, (t, provider) => { - validateConfig(t, provider, {rewritePaths: {src: 'build/'}}); - validateConfig(t, provider, {rewritePaths: {'src/': 'build'}}); -}); - -test('main() extensions: defaults to [\'ts\']', withProvider, (t, provider) => { - t.deepEqual(provider.main({config: {rewritePaths: {'src/': 'build/'}}}).extensions, ['ts']); -}); - -test('main() extensions: returns configured extensions', withProvider, (t, provider) => { - const extensions = ['tsx']; - t.deepEqual(provider.main({config: {extensions, rewritePaths: {'src/': 'build/'}}}).extensions, extensions); -}); - -test('main() extensions: always returns new arrays', withProvider, (t, provider) => { - const main = provider.main({config: {rewritePaths: {'src/': 'build/'}}}); - t.not(main.extensions, main.extensions); -}); - -const compile = async provider => { - return { - state: await provider.main({ - config: { - rewritePaths: { - 'typescript/': 'fixtures/' - } - } - }).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'), - ['ava-3', JSON.stringify(state), path.join(__dirname, 'typescript', 'file.ts')], - {cwd: path.join(__dirname, 'fixtures')} - ); - if (stderr.length > 0) { - t.log(stderr); - } - - t.snapshot(stdout); -}); diff --git a/test/snapshots/compilation.js.md b/test/snapshots/compilation.js.md new file mode 100644 index 0000000..1b54123 --- /dev/null +++ b/test/snapshots/compilation.js.md @@ -0,0 +1,24 @@ +# Snapshot report for `test/compilation.js` + +The actual snapshot is saved in `compilation.js.snap`. + +Generated by [AVA](https://avajs.dev). + +## worker(): load rewritten paths files + +> Snapshot 1 + + 'logged in file.js' + +## worker(): runs compiled files + +> Snapshot 1 + + 'logged in fixtures/typescript/index.ts' + +## compile() error + +> Snapshot 1 + + `Command failed with exit code 2: tsc --incremental␊ + typescript/typescript.ts(1,1): error TS2304: Cannot find name 'a'.` diff --git a/test/snapshots/compilation.js.snap b/test/snapshots/compilation.js.snap new file mode 100644 index 0000000..1d4c4ed Binary files /dev/null and b/test/snapshots/compilation.js.snap differ diff --git a/test/snapshots/protocol-ava-3.2.js.md b/test/snapshots/protocol-ava-3.2.js.md index 121606e..89878f9 100644 --- a/test/snapshots/protocol-ava-3.2.js.md +++ b/test/snapshots/protocol-ava-3.2.js.md @@ -4,6 +4,100 @@ The actual snapshot is saved in `protocol-ava-3.2.js.snap`. Generated by [AVA](https://avajs.dev). +## main() config validation: throw when config is not a plain object + +> Snapshot 1 + + Error { + message: 'Unexpected Typescript configuration for AVA. See https://github.com/avajs/typescript/blob/v${pkg.version}/README.md', + } + +> Snapshot 2 + + Error { + message: 'Unexpected Typescript configuration for AVA. See https://github.com/avajs/typescript/blob/v${pkg.version}/README.md', + } + +> Snapshot 3 + + Error { + message: 'Unexpected Typescript configuration for AVA. See https://github.com/avajs/typescript/blob/v${pkg.version}/README.md', + } + +> Snapshot 4 + + Error { + message: 'Unexpected Typescript configuration for AVA. See https://github.com/avajs/typescript/blob/v${pkg.version}/README.md', + } + +## main() config validation: throw when config contains keys other than 'extensions', 'rewritePaths' or 'compile' + +> Snapshot 1 + + Error { + message: 'Unexpected \'foo\' property in TypeScript configuration for AVA. See https://github.com/avajs/typescript/blob/v${pkg.version}/README.md', + } + +## main() config validation: throw when config.extensions contains empty strings + +> Snapshot 1 + + Error { + message: 'Missing \'compile\' property in TypeScript configuration for AVA. See https://github.com/avajs/typescript/blob/v${pkg.version}/README.md', + } + +## main() config validation: throw when config.extensions contains non-strings + +> Snapshot 1 + + Error { + message: 'Missing \'compile\' property in TypeScript configuration for AVA. See https://github.com/avajs/typescript/blob/v${pkg.version}/README.md', + } + +## main() config validation: throw when config.extensions contains duplicates + +> Snapshot 1 + + Error { + message: 'Missing \'compile\' property in TypeScript configuration for AVA. See https://github.com/avajs/typescript/blob/v${pkg.version}/README.md', + } + +## main() config validation: config may not be an empty object + +> Snapshot 1 + + Error { + message: 'Missing \'compile\' property in TypeScript configuration for AVA. See https://github.com/avajs/typescript/blob/v${pkg.version}/README.md', + } + +## main() config validation: throw when config.compile is invalid + +> Snapshot 1 + + Error { + message: 'Invalid \'compile\' property in TypeScript configuration for AVA. See https://github.com/avajs/typescript/blob/v${pkg.version}/README.md', + } + +> Snapshot 2 + + Error { + message: 'Invalid \'compile\' property in TypeScript configuration for AVA. See https://github.com/avajs/typescript/blob/v${pkg.version}/README.md', + } + +## main() config validation: rewrite paths must end in a / + +> Snapshot 1 + + Error { + message: 'Missing \'compile\' property in TypeScript configuration for AVA. See https://github.com/avajs/typescript/blob/v${pkg.version}/README.md', + } + +> Snapshot 2 + + Error { + message: 'Missing \'compile\' property in TypeScript configuration for AVA. See https://github.com/avajs/typescript/blob/v${pkg.version}/README.md', + } + ## main() updateGlobs() > Snapshot 1 diff --git a/test/snapshots/protocol-ava-3.2.js.snap b/test/snapshots/protocol-ava-3.2.js.snap index d5b6a0d..1e9982c 100644 Binary files a/test/snapshots/protocol-ava-3.2.js.snap and b/test/snapshots/protocol-ava-3.2.js.snap differ diff --git a/test/snapshots/protocol-ava-3.js.md b/test/snapshots/protocol-ava-3.js.md deleted file mode 100644 index 43ba7b2..0000000 --- a/test/snapshots/protocol-ava-3.js.md +++ /dev/null @@ -1,91 +0,0 @@ -# Snapshot report for `test/protocol-ava-3.js` - -The actual snapshot is saved in `protocol-ava-3.js.snap`. - -Generated by [AVA](https://avajs.dev). - -## main() config validation: config may not be an empty object - -> Snapshot 1 - - Error { - message: 'Unexpected Typescript configuration for AVA. See https://github.com/avajs/typescript/blob/v${pkg.version}/README.md for allowed values.', - } - -## main() config validation: rewrite paths must end in a / - -> Snapshot 1 - - Error { - message: 'Unexpected Typescript configuration for AVA. See https://github.com/avajs/typescript/blob/v${pkg.version}/README.md for allowed values.', - } - -> Snapshot 2 - - Error { - message: 'Unexpected Typescript configuration for AVA. See https://github.com/avajs/typescript/blob/v${pkg.version}/README.md for allowed values.', - } - -## main() config validation: throw when config contains keys other than 'extensions' or 'rewritePaths' - -> Snapshot 1 - - Error { - message: 'Unexpected Typescript configuration for AVA. See https://github.com/avajs/typescript/blob/v${pkg.version}/README.md for allowed values.', - } - -## main() config validation: throw when config is not a plain object - -> Snapshot 1 - - Error { - message: 'Unexpected Typescript configuration for AVA. See https://github.com/avajs/typescript/blob/v${pkg.version}/README.md for allowed values.', - } - -> Snapshot 2 - - Error { - message: 'Unexpected Typescript configuration for AVA. See https://github.com/avajs/typescript/blob/v${pkg.version}/README.md for allowed values.', - } - -> Snapshot 3 - - Error { - message: 'Unexpected Typescript configuration for AVA. See https://github.com/avajs/typescript/blob/v${pkg.version}/README.md for allowed values.', - } - -> Snapshot 4 - - Error { - message: 'Unexpected Typescript configuration for AVA. See https://github.com/avajs/typescript/blob/v${pkg.version}/README.md for allowed values.', - } - -## main() config validation: throw when config.extensions contains duplicates - -> Snapshot 1 - - Error { - message: 'Unexpected Typescript configuration for AVA. See https://github.com/avajs/typescript/blob/v${pkg.version}/README.md for allowed values.', - } - -## main() config validation: throw when config.extensions contains empty strings - -> Snapshot 1 - - Error { - message: 'Unexpected Typescript configuration for AVA. See https://github.com/avajs/typescript/blob/v${pkg.version}/README.md for allowed values.', - } - -## main() config validation: throw when config.extensions contains non-strings - -> Snapshot 1 - - Error { - message: 'Unexpected Typescript configuration for AVA. See https://github.com/avajs/typescript/blob/v${pkg.version}/README.md for allowed values.', - } - -## worker(): load rewritten paths files - -> Snapshot 1 - - 'logged in file.js' diff --git a/test/snapshots/protocol-ava-3.js.snap b/test/snapshots/protocol-ava-3.js.snap deleted file mode 100644 index 35da63a..0000000 Binary files a/test/snapshots/protocol-ava-3.js.snap and /dev/null differ