Add rudimentary implementation
This commit is contained in:
parent
e56d5acc93
commit
bfa70a3b39
18 changed files with 573 additions and 0 deletions
12
.editorconfig
Normal file
12
.editorconfig
Normal file
|
|
@ -0,0 +1,12 @@
|
|||
root = true
|
||||
|
||||
[*]
|
||||
indent_style = tab
|
||||
end_of_line = lf
|
||||
charset = utf-8
|
||||
trim_trailing_whitespace = true
|
||||
insert_final_newline = true
|
||||
|
||||
[*.yml]
|
||||
indent_style = space
|
||||
indent_size = 2
|
||||
76
.github/CODE_OF_CONDUCT.md
vendored
Normal file
76
.github/CODE_OF_CONDUCT.md
vendored
Normal file
|
|
@ -0,0 +1,76 @@
|
|||
# Contributor Covenant Code of Conduct
|
||||
|
||||
Translations: [Español](https://github.com/avajs/ava-docs/blob/master/es_ES/code-of-conduct.md), [Français](https://github.com/avajs/ava-docs/blob/master/fr_FR/code-of-conduct.md), [Italiano](https://github.com/avajs/ava-docs/blob/master/it_IT/code-of-conduct.md), [日本語](https://github.com/avajs/ava-docs/blob/master/ja_JP/code-of-conduct.md), [Português](https://github.com/avajs/ava-docs/blob/master/pt_BR/code-of-conduct.md), [Русский](https://github.com/avajs/ava-docs/blob/master/ru_RU/code-of-conduct.md), [简体中文](https://github.com/avajs/ava-docs/blob/master/zh_CN/code-of-conduct.md)
|
||||
|
||||
## Our Pledge
|
||||
|
||||
In the interest of fostering an open and welcoming environment, we as
|
||||
contributors and maintainers pledge to making participation in our project and
|
||||
our community a harassment-free experience for everyone, regardless of age, body
|
||||
size, disability, ethnicity, gender identity and expression, level of experience,
|
||||
nationality, personal appearance, race, religion, or sexual identity and
|
||||
orientation.
|
||||
|
||||
## Our Standards
|
||||
|
||||
Examples of behavior that contributes to creating a positive environment
|
||||
include:
|
||||
|
||||
* Using welcoming and inclusive language
|
||||
* Being respectful of differing viewpoints and experiences
|
||||
* Gracefully accepting constructive criticism
|
||||
* Focusing on what is best for the community
|
||||
* Showing empathy towards other community members
|
||||
|
||||
Examples of unacceptable behavior by participants include:
|
||||
|
||||
* The use of sexualized language or imagery and unwelcome sexual attention or
|
||||
advances
|
||||
* Trolling, insulting/derogatory comments, and personal or political attacks
|
||||
* Public or private harassment
|
||||
* Publishing others' private information, such as a physical or electronic
|
||||
address, without explicit permission
|
||||
* Other conduct which could reasonably be considered inappropriate in a
|
||||
professional setting
|
||||
|
||||
## Our Responsibilities
|
||||
|
||||
Project maintainers are responsible for clarifying the standards of acceptable
|
||||
behavior and are expected to take appropriate and fair corrective action in
|
||||
response to any instances of unacceptable behavior.
|
||||
|
||||
Project maintainers have the right and responsibility to remove, edit, or
|
||||
reject comments, commits, code, wiki edits, issues, and other contributions
|
||||
that are not aligned to this Code of Conduct, or to ban temporarily or
|
||||
permanently any contributor for other behaviors that they deem inappropriate,
|
||||
threatening, offensive, or harmful.
|
||||
|
||||
## Scope
|
||||
|
||||
This Code of Conduct applies both within project spaces and in public spaces
|
||||
when an individual is representing the project or its community. Examples of
|
||||
representing a project or community include using an official project e-mail
|
||||
address, posting via an official social media account, or acting as an appointed
|
||||
representative at an online or offline event. Representation of a project may be
|
||||
further defined and clarified by project maintainers.
|
||||
|
||||
## Enforcement
|
||||
|
||||
Instances of abusive, harassing, or otherwise unacceptable behavior may be
|
||||
reported by contacting the project team at sindresorhus@gmail.com. All
|
||||
complaints will be reviewed and investigated and will result in a response that
|
||||
is deemed necessary and appropriate to the circumstances. The project team is
|
||||
obligated to maintain confidentiality with regard to the reporter of an incident.
|
||||
Further details of specific enforcement policies may be posted separately.
|
||||
|
||||
Project maintainers who do not follow or enforce the Code of Conduct in good
|
||||
faith may face temporary or permanent repercussions as determined by other
|
||||
members of the project's leadership.
|
||||
|
||||
## Attribution
|
||||
|
||||
This Code of Conduct is adapted from the [Contributor Covenant][homepage], version 1.4,
|
||||
available at [http://contributor-covenant.org/version/1/4][version]
|
||||
|
||||
[homepage]: http://contributor-covenant.org
|
||||
[version]: http://contributor-covenant.org/version/1/4/
|
||||
7
.github/CONTRIBUTING.md
vendored
Normal file
7
.github/CONTRIBUTING.md
vendored
Normal file
|
|
@ -0,0 +1,7 @@
|
|||
# Contributing to AVA
|
||||
|
||||
✨ Thanks for contributing to AVA! ✨
|
||||
|
||||
Please note that this project is released with a [Contributor Code of Conduct](CODE_OF_CONDUCT.md). By participating in this project you agree to abide by its terms.
|
||||
|
||||
This repository is a part of AVA. Start with reading AVA's [contributing guide](https://github.com/avajs/ava/blob/master/.github/CONTRIBUTING.md). Issue labels may be a little different in this repository but otherwise the same applies.
|
||||
15
.github/ISSUE_TEMPLATE/bug.md
vendored
Normal file
15
.github/ISSUE_TEMPLATE/bug.md
vendored
Normal file
|
|
@ -0,0 +1,15 @@
|
|||
---
|
||||
name: Bug Report
|
||||
about: If something isn't working the way you expect it to
|
||||
labels: needs triage
|
||||
---
|
||||
|
||||
Please provide details about:
|
||||
|
||||
* What you're trying to do
|
||||
* What happened
|
||||
* What you expected to happen
|
||||
|
||||
Please share relevant sample code. Or better yet, provide a link to a [minimal reproducible example](https://stackoverflow.com/help/minimal-reproducible-example).
|
||||
|
||||
We'll also need your AVA configuration (in `package.json` or `ava.config.*` configuration files) and how you're invoking AVA. Share the installed AVA version (get it by running `npx ava --version`) and `@ava/babel` version (from your `package.json` file).
|
||||
8
.github/ISSUE_TEMPLATE/config.yml
vendored
Normal file
8
.github/ISSUE_TEMPLATE/config.yml
vendored
Normal file
|
|
@ -0,0 +1,8 @@
|
|||
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
|
||||
11
.github/ISSUE_TEMPLATE/feature.md
vendored
Normal file
11
.github/ISSUE_TEMPLATE/feature.md
vendored
Normal file
|
|
@ -0,0 +1,11 @@
|
|||
---
|
||||
name: Feature Request
|
||||
about: Suggestions for new or different behavior
|
||||
labels: question
|
||||
---
|
||||
|
||||
Please provide details about:
|
||||
|
||||
* What you're trying to do
|
||||
* Why you can't use AVA's Babel support for this
|
||||
* And maybe how you think AVA could handle this
|
||||
29
.github/workflows/ci.yml
vendored
Normal file
29
.github/workflows/ci.yml
vendored
Normal file
|
|
@ -0,0 +1,29 @@
|
|||
name: Install and test @ava/typescript
|
||||
on:
|
||||
push:
|
||||
branches:
|
||||
- master
|
||||
pull_request:
|
||||
paths-ignore:
|
||||
- '*.md'
|
||||
jobs:
|
||||
nodejs:
|
||||
name: Node.js
|
||||
runs-on: ${{ matrix.os }}
|
||||
strategy:
|
||||
fail-fast: false
|
||||
matrix:
|
||||
node-version: [^10.18.0, ^12.14.0, ^13.5.0]
|
||||
os: [ubuntu-latest, windows-latest]
|
||||
steps:
|
||||
- uses: actions/checkout@v1
|
||||
with:
|
||||
fetch-depth: 1
|
||||
- uses: actions/setup-node@v1
|
||||
with:
|
||||
node-version: ${{ matrix.node-version }}
|
||||
- run: npm install --no-audit
|
||||
- run: npm test
|
||||
- uses: codecov/codecov-action@v1
|
||||
with:
|
||||
token: ${{ secrets.CODECOV_TOKEN }}
|
||||
3
.gitignore
vendored
Normal file
3
.gitignore
vendored
Normal file
|
|
@ -0,0 +1,3 @@
|
|||
/.nyc_output
|
||||
/coverage
|
||||
/node_modules
|
||||
1
.npmrc
Normal file
1
.npmrc
Normal file
|
|
@ -0,0 +1 @@
|
|||
package-lock=false
|
||||
61
README.md
Normal file
61
README.md
Normal file
|
|
@ -0,0 +1,61 @@
|
|||
# @ava/typescript
|
||||
|
||||
Adds rudimentary [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.
|
||||
|
||||
In other words, say you have a test file at `src/test.ts`. You've configured TypeScript to output to `build/`. Using `@ava/typescript` you can run the test using `npx ava src/test.ts`.
|
||||
|
||||
## Enabling TypeScript support
|
||||
|
||||
Add this package to your project:
|
||||
|
||||
```console
|
||||
npm install --save-dev @ava/typescript
|
||||
```
|
||||
|
||||
Then, enable TypeScript support either in `package.json` or `ava.config.*`:
|
||||
|
||||
**`package.json`:**
|
||||
|
||||
```json
|
||||
{
|
||||
"ava": {
|
||||
"typescript": {
|
||||
"rewritePaths": {
|
||||
"src/": "build/"
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
Both keys and values of the `rewritePaths` object must end with a `/`. Paths are relative to your project directory.
|
||||
|
||||
Output files are expected to have the `.js` extension.
|
||||
|
||||
## Add additional extensions
|
||||
|
||||
You can configure AVA to recognize additional file extensions. To add (partial†) JSX support:
|
||||
|
||||
**`package.json`:**
|
||||
|
||||
```json
|
||||
{
|
||||
"ava": {
|
||||
"typescript": {
|
||||
"extensions": [
|
||||
"ts",
|
||||
"tsx"
|
||||
],
|
||||
"rewritePaths": {
|
||||
"src/": "build/"
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
See also AVA's [`extensions` option](https://github.com/avajs/ava/blob/master/docs/06-configuration.md#options).
|
||||
|
||||
† Note that the [*preserve* mode for JSX](https://www.typescriptlang.org/docs/handbook/jsx.html) is not (yet) supported.
|
||||
93
index.js
Normal file
93
index.js
Normal file
|
|
@ -0,0 +1,93 @@
|
|||
'use strict';
|
||||
const path = require('path');
|
||||
|
||||
const escapeStringRegexp = require('escape-string-regexp');
|
||||
const isPlainObject = require('is-plain-object');
|
||||
|
||||
const pkg = require('./package.json');
|
||||
|
||||
function isValidExtensions(extensions) {
|
||||
return Array.isArray(extensions) &&
|
||||
extensions.length > 0 &&
|
||||
extensions.every(ext => typeof ext === 'string' && ext !== '') &&
|
||||
new Set(extensions).size === extensions.length;
|
||||
}
|
||||
|
||||
function isValidRewritePaths(rewritePaths) {
|
||||
if (!isPlainObject(rewritePaths)) {
|
||||
return false;
|
||||
}
|
||||
|
||||
return Object.entries(rewritePaths).every(([from, to]) => {
|
||||
return from.endsWith('/') && typeof to === 'string' && to.endsWith('/');
|
||||
});
|
||||
}
|
||||
|
||||
module.exports = ({negotiateProtocol}) => {
|
||||
const protocol = negotiateProtocol(['ava-3'], {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 (!valid) {
|
||||
throw new Error(`Unexpected Typescript configuration for AVA. See https://github.com/avajs/typescript/blob/v${pkg.version}/README.md for allowed values.`);
|
||||
}
|
||||
|
||||
const {
|
||||
extensions = ['ts'],
|
||||
rewritePaths
|
||||
} = config;
|
||||
|
||||
return {
|
||||
async compile() {
|
||||
return {
|
||||
extensions: extensions.slice(),
|
||||
rewritePaths: Object.entries(rewritePaths).map(([from, to]) => [
|
||||
path.join(protocol.projectDir, from),
|
||||
path.join(protocol.projectDir, to)
|
||||
])
|
||||
};
|
||||
},
|
||||
|
||||
get extensions() {
|
||||
return extensions.slice();
|
||||
}
|
||||
};
|
||||
},
|
||||
|
||||
worker({extensionsToLoadAsModules, state: {extensions, rewritePaths}}) {
|
||||
const testFileExtension = new RegExp(`\\.(${extensions.map(ext => escapeStringRegexp(ext)).join('|')})$`);
|
||||
|
||||
return {
|
||||
canLoad(ref) {
|
||||
return testFileExtension.test(ref) && rewritePaths.some(([from]) => ref.startsWith(from));
|
||||
},
|
||||
|
||||
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);
|
||||
}
|
||||
};
|
||||
}
|
||||
};
|
||||
};
|
||||
38
package.json
Normal file
38
package.json
Normal file
|
|
@ -0,0 +1,38 @@
|
|||
{
|
||||
"name": "@ava/typescript",
|
||||
"version": "0.0.0",
|
||||
"description": "TypeScript provider for AVA",
|
||||
"engines": {
|
||||
"node": ">=10.18.0 <11 || >=12.14.0 <13 || >=13.5.0"
|
||||
},
|
||||
"files": [
|
||||
"index.js"
|
||||
],
|
||||
"author": "Mark Wubben (https://novemberborn.net)",
|
||||
"repository": "avajs/typescript",
|
||||
"license": "MIT",
|
||||
"keywords": [
|
||||
"ava",
|
||||
"typescript"
|
||||
],
|
||||
"scripts": {
|
||||
"test": "xo && nyc ava"
|
||||
},
|
||||
"dependencies": {
|
||||
"escape-string-regexp": "^2.0.0",
|
||||
"is-plain-object": "^3.0.0"
|
||||
},
|
||||
"devDependencies": {
|
||||
"ava": "^3.0.0",
|
||||
"execa": "^4.0.0",
|
||||
"nyc": "^15.0.0",
|
||||
"xo": "^0.25.3"
|
||||
},
|
||||
"nyc": {
|
||||
"reporter": [
|
||||
"html",
|
||||
"lcov",
|
||||
"text"
|
||||
]
|
||||
}
|
||||
}
|
||||
7
test/base.js
Normal file
7
test/base.js
Normal file
|
|
@ -0,0 +1,7 @@
|
|||
const test = require('ava');
|
||||
const makeProvider = require('..');
|
||||
|
||||
test('bails when negotiating protocol returns `null`', t => {
|
||||
const provider = makeProvider({negotiateProtocol: () => null});
|
||||
t.is(provider, undefined);
|
||||
});
|
||||
1
test/fixtures/file.js
vendored
Normal file
1
test/fixtures/file.js
vendored
Normal file
|
|
@ -0,0 +1 @@
|
|||
console.log('logged in file.js');
|
||||
19
test/fixtures/install-and-load.js
vendored
Normal file
19
test/fixtures/install-and-load.js
vendored
Normal file
|
|
@ -0,0 +1,19 @@
|
|||
const path = require('path');
|
||||
const makeProvider = require('../..');
|
||||
|
||||
const provider = makeProvider({
|
||||
negotiateProtocol() {
|
||||
return {identifier: process.argv[2], ava: {version: '3.0.0'}, projectDir: path.resolve(__dirname, '..')};
|
||||
}
|
||||
});
|
||||
|
||||
const worker = provider.worker({
|
||||
extensionsToLoadAsModules: [],
|
||||
state: JSON.parse(process.argv[3])
|
||||
});
|
||||
|
||||
const ref = path.resolve(process.argv[4]);
|
||||
|
||||
if (worker.canLoad(ref)) {
|
||||
worker.load(ref, {requireFn: require});
|
||||
}
|
||||
101
test/protocol-ava-3.js
Normal file
101
test/protocol-ava-3.js
Normal file
|
|
@ -0,0 +1,101 @@
|
|||
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);
|
||||
});
|
||||
91
test/snapshots/protocol-ava-3.js.md
Normal file
91
test/snapshots/protocol-ava-3.js.md
Normal file
|
|
@ -0,0 +1,91 @@
|
|||
# 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'
|
||||
BIN
test/snapshots/protocol-ava-3.js.snap
Normal file
BIN
test/snapshots/protocol-ava-3.js.snap
Normal file
Binary file not shown.
Loading…
Reference in a new issue