tap-producing test harness for node and browsers

Related tags

Testing tape
Overview

tape

tap-producing test harness for node and browsers

build status

tape

example

var test = require('tape');

test('timing test', function (t) {
    t.plan(2);

    t.equal(typeof Date.now, 'function');
    var start = Date.now();

    setTimeout(function () {
        t.equal(Date.now() - start, 100);
    }, 100);
});

test('test using promises', async function (t) {
    const result = await someAsyncThing();
    t.ok(result);
});
$ node example/timing.js
TAP version 13
# timing test
ok 1 should be strictly equal
not ok 2 should be strictly equal
  ---
    operator: equal
    expected: 100
    actual:   107
  ...

1..2
# tests 2
# pass  1
# fail  1

usage

You always need to require('tape') in test files. You can run the tests by usual node means (require('test-file.js') or node test-file.js). You can also run tests using the tape binary to utilize globbing, on Windows for example:

$ tape tests/**/*.js

tape's arguments are passed to the glob module. If you want glob to perform the expansion on a system where the shell performs such expansion, quote the arguments as necessary:

$ tape 'tests/**/*.js'
$ tape "tests/**/*.js"

Preloading modules

Additionally, it is possible to make tape load one or more modules before running any tests, by using the -r or --require flag. Here's an example that loads babel-register before running any tests, to allow for JIT compilation:

$ tape -r babel-register tests/**/*.js

Depending on the module you're loading, you may be able to parameterize it using environment variables or auxiliary files. Babel, for instance, will load options from .babelrc at runtime.

The -r flag behaves exactly like node's require, and uses the same module resolution algorithm. This means that if you need to load local modules, you have to prepend their path with ./ or ../ accordingly.

For example:

$ tape -r ./my/local/module tests/**/*.js

Please note that all modules loaded using the -r flag will run before any tests, regardless of when they are specified. For example, tape -r a b -r c will actually load a and c before loading b, since they are flagged as required modules.

things that go well with tape

tape maintains a fairly minimal core. Additional features are usually added by using another module alongside tape.

pretty reporters

The default TAP output is good for machines and humans that are robots.

If you want a more colorful / pretty output there are lots of modules on npm that will output something pretty if you pipe TAP into them:

To use them, try node test/index.js | tap-spec or pipe it into one of the modules of your choice!

uncaught exceptions

By default, uncaught exceptions in your tests will not be intercepted, and will cause tape to crash. If you find this behavior undesirable, use tape-catch to report any exceptions as TAP errors.

other

methods

The assertion methods in tape are heavily influenced or copied from the methods in node-tap.

var test = require('tape')

test([name], [opts], cb)

Create a new test with an optional name string and optional opts object. cb(t) fires with the new test object t once all preceding tests have finished. Tests execute serially.

Available opts options are:

  • opts.skip = true/false. See test.skip.
  • opts.timeout = 500. Set a timeout for the test, after which it will fail. See test.timeoutAfter.
  • opts.objectPrintDepth = 5. Configure max depth of expected / actual object printing. Environmental variable NODE_TAPE_OBJECT_PRINT_DEPTH can set the desired default depth for all tests; locally-set values will take precedence.
  • opts.todo = true/false. Test will be allowed to fail.

If you forget to t.plan() out how many assertions you are going to run and you don't call t.end() explicitly, or return a Promise that eventually settles, your test will hang.

If cb returns a Promise, it will be implicitly awaited. If that promise rejects, the test will be failed; if it fulfills, the test will end. Explicitly calling t.end() while also returning a Promise that fulfills is an error.

test.skip([name], [opts], cb)

Generate a new test that will be skipped over.

test.teardown(cb)

Register a callback to run after the individual test has completed. Multiple registered teardown callbacks will run in order. Useful for undoing side effects, closing network connections, etc.

test.onFinish(fn)

The onFinish hook will get invoked when ALL tape tests have finished right before tape is about to print the test summary.

fn is called with no arguments, and its return value is ignored.

test.onFailure(fn)

The onFailure hook will get invoked whenever any tape tests has failed.

fn is called with no arguments, and its return value is ignored.

t.plan(n)

Declare that n assertions should be run. t.end() will be called automatically after the nth assertion. If there are any more assertions after the nth, or after t.end() is called, they will generate errors.

t.end(err)

Declare the end of a test explicitly. If err is passed in t.end will assert that it is falsy.

Do not call t.end() if your test callback returns a Promise.

t.fail(msg)

Generate a failing assertion with a message msg.

t.pass(msg)

Generate a passing assertion with a message msg.

t.timeoutAfter(ms)

Automatically timeout the test after X ms.

t.skip(msg)

Generate an assertion that will be skipped over.

t.ok(value, msg)

Assert that value is truthy with an optional description of the assertion msg.

Aliases: t.true(), t.assert()

t.notOk(value, msg)

Assert that value is falsy with an optional description of the assertion msg.

Aliases: t.false(), t.notok()

t.error(err, msg)

Assert that err is falsy. If err is non-falsy, use its err.message as the description message.

Aliases: t.ifError(), t.ifErr(), t.iferror()

t.equal(actual, expected, msg)

Assert that Object.is(actual, expected) with an optional description of the assertion msg.

Aliases: t.equals(), t.isEqual(), t.strictEqual(), t.strictEquals(), t.is()

t.notEqual(actual, expected, msg)

Assert that !Object.is(actual, expected) with an optional description of the assertion msg.

Aliases: t.notEquals(), t.isNotEqual(), t.doesNotEqual(), t.isInequal(), t.notStrictEqual(), t.notStrictEquals(), t.isNot(), t.not()

t.looseEqual(actual, expected, msg)

Assert that actual == expected with an optional description of the assertion msg.

Aliases: t.looseEquals()

t.notLooseEqual(actual, expected, msg)

Assert that actual != expected with an optional description of the assertion msg.

Aliases: t.notLooseEquals()

t.deepEqual(actual, expected, msg)

Assert that actual and expected have the same structure and nested values using node's deepEqual() algorithm with strict comparisons (===) on leaf nodes and an optional description of the assertion msg.

Aliases: t.deepEquals(), t.isEquivalent(), t.same()

t.notDeepEqual(actual, expected, msg)

Assert that actual and expected do not have the same structure and nested values using node's deepEqual() algorithm with strict comparisons (===) on leaf nodes and an optional description of the assertion msg.

Aliases: t.notDeepEquals, t.notEquivalent(), t.notDeeply(), t.notSame(), t.isNotDeepEqual(), t.isNotDeeply(), t.isNotEquivalent(), t.isInequivalent()

t.deepLooseEqual(actual, expected, msg)

Assert that actual and expected have the same structure and nested values using node's deepEqual() algorithm with loose comparisons (==) on leaf nodes and an optional description of the assertion msg.

t.notDeepLooseEqual(actual, expected, msg)

Assert that actual and expected do not have the same structure and nested values using node's deepEqual() algorithm with loose comparisons (==) on leaf nodes and an optional description of the assertion msg.

Aliases: t.notLooseEqual(), t.notLooseEquals()

t.throws(fn, expected, msg)

Assert that the function call fn() throws an exception. expected, if present, must be a RegExp, Function, or Object. The RegExp matches the string representation of the exception, as generated by err.toString(). For example, if you set expected to /user/, the test will pass only if the string representation of the exception contains the word user. Any other exception will result in a failed test. The Function is the exception thrown (e.g. Error). Object in this case corresponds to a so-called validation object, in which each property is tested for strict deep equality. As an example, see the following two tests--each passes a validation object to t.throws() as the second parameter. The first test will pass, because all property values in the actual error object are deeply strictly equal to the property values in the validation object.

    const err = new TypeError("Wrong value");
    err.code = 404;
    err.check = true;

    // Passing test.
    t.throws(
        () => {
            throw err;
        },
        {
            code: 404,
            check: true
        },
        "Test message."
    );

This next test will fail, because all property values in the actual error object are not deeply strictly equal to the property values in the validation object.

    const err = new TypeError("Wrong value");
    err.code = 404;
    err.check = "true";

    // Failing test.
    t.throws(
        () => {
            throw err;
        },
        {
            code: 404,
            check: true // This is not deeply strictly equal to err.check.
        },
        "Test message."
    );

This is very similar to how Node's assert.throws() method tests validation objects (please see the Node assert.throws() documentation for more information).

If expected is not of type RegExp, Function, or Object, or omitted entirely, any exception will result in a passed test. msg is an optional description of the assertion.

Please note that the second parameter, expected, cannot be of type string. If a value of type string is provided for expected, then t.throws(fn, expected, msg) will execute, but the value of expected will be set to undefined, and the specified string will be set as the value for the msg parameter (regardless of what actually passed as the third parameter). This can cause unexpected results, so please be mindful.

t.doesNotThrow(fn, expected, msg)

Assert that the function call fn() does not throw an exception. expected, if present, limits what should not be thrown, and must be a RegExp or Function. The RegExp matches the string representation of the exception, as generated by err.toString(). For example, if you set expected to /user/, the test will fail only if the string representation of the exception contains the word user. Any other exception will result in a passed test. The Function is the exception thrown (e.g. Error). If expected is not of type RegExp or Function, or omitted entirely, any exception will result in a failed test. msg is an optional description of the assertion.

Please note that the second parameter, expected, cannot be of type string. If a value of type string is provided for expected, then t.doesNotThrows(fn, expected, msg) will execute, but the value of expected will be set to undefined, and the specified string will be set as the value for the msg parameter (regardless of what actually passed as the third parameter). This can cause unexpected results, so please be mindful.

t.test(name, [opts], cb)

Create a subtest with a new test handle st from cb(st) inside the current test t. cb(st) will only fire when t finishes. Additional tests queued up after t will not be run until all subtests finish.

You may pass the same options that test() accepts.

t.comment(message)

Print a message without breaking the tap output. (Useful when using e.g. tap-colorize where output is buffered & console.log will print in incorrect order vis-a-vis tap output.)

Multiline output will be split by \n characters, and each one printed as a comment.

t.match(string, regexp, message)

Assert that string matches the RegExp regexp. Will throw (not just fail) when the first two arguments are the wrong type.

t.doesNotMatch(string, regexp, message)

Assert that string does not match the RegExp regexp. Will throw (not just fail) when the first two arguments are the wrong type.

var htest = test.createHarness()

Create a new test harness instance, which is a function like test(), but with a new pending stack and test state.

By default the TAP output goes to console.log(). You can pipe the output to someplace else if you htest.createStream().pipe() to a destination stream on the first tick.

test.only([name], [opts], cb)

Like test([name], [opts], cb) except if you use .only this is the only test case that will run for the entire process, all other test cases using tape will be ignored.

var stream = test.createStream(opts)

Create a stream of output, bypassing the default output stream that writes messages to console.log(). By default stream will be a text stream of TAP output, but you can get an object stream instead by setting opts.objectMode to true.

tap stream reporter

You can create your own custom test reporter using this createStream() api:

var test = require('tape');
var path = require('path');

test.createStream().pipe(process.stdout);

process.argv.slice(2).forEach(function (file) {
    require(path.resolve(file));
});

You could substitute process.stdout for whatever other output stream you want, like a network connection or a file.

Pass in test files to run as arguments:

$ node tap.js test/x.js test/y.js
TAP version 13
# (anonymous)
not ok 1 should be strictly equal
  ---
    operator: equal
    expected: "boop"
    actual:   "beep"
  ...
# (anonymous)
ok 2 should be strictly equal
ok 3 (unnamed assert)
# wheee
ok 4 (unnamed assert)

1..4
# tests 4
# pass  3
# fail  1

object stream reporter

Here's how you can render an object stream instead of TAP:

var test = require('tape');
var path = require('path');

test.createStream({ objectMode: true }).on('data', function (row) {
    console.log(JSON.stringify(row))
});

process.argv.slice(2).forEach(function (file) {
    require(path.resolve(file));
});

The output for this runner is:

$ node object.js test/x.js test/y.js
{"type":"test","name":"(anonymous)","id":0}
{"id":0,"ok":false,"name":"should be strictly equal","operator":"equal","actual":"beep","expected":"boop","error":{},"test":0,"type":"assert"}
{"type":"end","test":0}
{"type":"test","name":"(anonymous)","id":1}
{"id":0,"ok":true,"name":"should be strictly equal","operator":"equal","actual":2,"expected":2,"test":1,"type":"assert"}
{"id":1,"ok":true,"name":"(unnamed assert)","operator":"ok","actual":true,"expected":true,"test":1,"type":"assert"}
{"type":"end","test":1}
{"type":"test","name":"wheee","id":2}
{"id":0,"ok":true,"name":"(unnamed assert)","operator":"ok","actual":true,"expected":true,"test":2,"type":"assert"}
{"type":"end","test":2}

install

With npm do:

npm install tape --save-dev

troubleshooting

Sometimes t.end() doesn’t preserve the expected output ordering.

For instance the following:

var test = require('tape');

test('first', function (t) {

  setTimeout(function () {
    t.ok(1, 'first test');
    t.end();
  }, 200);

  t.test('second', function (t) {
    t.ok(1, 'second test');
    t.end();
  });
});

test('third', function (t) {
  setTimeout(function () {
    t.ok(1, 'third test');
    t.end();
  }, 100);
});

will output:

ok 1 second test
ok 2 third test
ok 3 first test

because second and third assume first has ended before it actually does.

Use t.plan() instead to let other tests know they should wait:

var test = require('tape');

test('first', function (t) {

+  t.plan(2);

  setTimeout(function () {
    t.ok(1, 'first test');
-    t.end();
  }, 200);

  t.test('second', function (t) {
    t.ok(1, 'second test');
    t.end();
  });
});

test('third', function (t) {
  setTimeout(function () {
    t.ok(1, 'third test');
    t.end();
  }, 100);
});

license

MIT

Comments
  • "test exited without ending"

    Hi!

    Probabilistically, I get the following:

    not ok 95 test exited without ending
      ---
        operator: fail
      ...
    not ok 96 test exited without ending
      ---
        operator: fail
      ...
    
    (more of the same)
    
        operator: fail
      ...
    not ok 112 test exited without ending
      ---
        operator: fail
      ...
    not ok 113 test exited without ending
      ---
        operator: fail
      ...
    
    1..113
    # tests 113
    # pass  94
    # fail  19
    

    19 out of 20 runs are OK. I am mostly annoyed by the fact I can not localize/attribute the error.

    opened by gritzko 65
  • author tape itself as ES Modules

    author tape itself as ES Modules

    I'm wondering if plans could be made to convert tape to use ES modules, which finally bring a universal module format to JavaScript engines, both in the browser and in Node.js. Right now I am personally having difficulties using tape in the browser because of its use of require statements, and my use of a build system that assumes ES modules. Ideally no build system would be necessary and ES modules seems like a great candidate for allowing that.

    opened by lastmjs 52
  • [Breaking] support passing in an async function for the test callback

    [Breaking] support passing in an async function for the test callback

    This PR adds rudimentary support for async/await in a fashion that breaks back compat as little as possible.

    Currently tape has no opinions about exception handling. If you throw in a test block it will go straight to the uncaught handler and exit the process.

    However newer versions of node & v8 added async functions. These functions when thrown return a rejected promise.

    Currently node logs unhandled rejections with a warning and in future versions of node, unhandled rejections may get forwarded to uncaught exceptions.

    This patch modifies tape so that an unhandled rejection will be marked as a TAP failure and fails the tests with exit code 1.

    Previously on master it would log to STDERR and then continue onwards running the rests of the tests.

    For example :

    var tape = require('tape')
    
    tape('my test', function (t) {
      // this causes the tests to fail with exit code 1
      t.oktypo(true, 'my bad')
    })
    
    tape('my async test', async function (t) {
      // on master : this causes the tests to pass with exit code 0 
      //     and STDERR noise about unhandled rejections
      // in this PR : this causes the tests to fail with exit code 1
      t.oktypo(true, 'my bad')
    })
    

    This patch is optional, there is a different work around you can do

    process.on('unhandledRejection', function (err) { throw err })
    
    var tape = require('tape')
    
    tape('my async test', async function (t) {
      // on master : this causes the tests to fail with exit code 1
      t.oktypo(true, 'my bad')
    })
    

    But adding that one liner to the top of every test file can get quite annoying and EASY to forget :(

    Back compat is broken for some cases, only when the user of tape mixes promises & callbacks & async functions in a single test block. If the async function returns before you call t.end() ( aka you do not await the code that calls t.end()

    However no back compat breaks for users that

    • do not use async/await
    • do not use promises
    • uses async/await but only with promises
    • uses promises and no callbacks
    • uses async/await, promises & callbacks but always does await util.promisify((cb) { ...; t.end() }
    semver-major: breaking change 
    opened by Raynos 42
  • number of tests do not match up

    number of tests do not match up

    tape -- tests/*.js core/tests/*.js plugins/*/tests/*.js
    # tests 115
    

    and

    tape -- tests/*.js
    # tests 34
    
    tape -- core/tests/*.js
    # tests 89
    
    tape -- plugins/*/tests/*.js
    # tests 81
    
    34 + 89 + 81 = 204
    

    115 != 204 WTF?

    question pull request wanted 
    opened by tcurdt 42
  • `tape` runner does not support ESM files

    `tape` runner does not support ESM files

    Reading https://github.com/substack/tape/issues/414 — which I realize is about writing Tape with ES modules, not testing ES modules — I found this suggestion:

    https://github.com/substack/tape/issues/414#issuecomment-433579912

    In case someone stumbles upon this, passing --experimental-modules to tape works fine on windows (nix not available or I'd test). Even in a context such as this: npx tape --experimental-modules test/**/.mjs.

    Testing now, in node.js v12.9.1 and macOS, I'm getting a silent failure when trying to use that. For example:

    import test from 'tape';
    // import * as test from 'tape';
    // import { test } from 'tape';
    
    test('test', function (t) {
      t.equal( 'test', 'test', 'it is a test' );
      t.end();
    });
    
    tape --experimental-modules my-test.js
    

    Should this be supported? It may be worth noting that I also get no output running tape -v or tape -h. I'm not sure if that indicates a problem with my environment.

    opened by donmccurdy 33
  • The execution never ends

    The execution never ends

    When I run the test, the execution never ends and what I have to do is in the last test put a process.exit(1)

    My package.json looks like this:

    "scripts": {
        "test": "tape ./test/*.js | tap-spec"
      }
    

    there a better way?

    opened by emilioriosvz 33
  • Add beforeAll(), afterAll(), beforeEach(), afterEach()

    Add beforeAll(), afterAll(), beforeEach(), afterEach()

    Hello! I author and maintain many tape tests, and have found over the years that I frequently find a lot of setup, teardown, and repeat boilerplate code in these test suites. This could be greatly mitigated with the addition of optional beforeAll(), afterAll(), beforeEach(), afterEach() methods. (Happy to point to some examples if use cases are desired, although these kinds of features have become increasingly popular in other test libs.)

    I'd propose that each of those methods run like any other test, but (as their names imply) be automatically inserted into the test flow before/after all tests in a given file (beforeAll(), afterAll()), and before/after each test in a given file (beforeEach(), afterEach()).

    Unlike the module preloader and t.onFinish(), which are nice pre/post-run lifecycle hooks, I'd propose beforeAll(), afterAll(), beforeEach(), and afterEach() be incorporated into userland testing, and perform their own assertions, etc.

    Example (pseudo):

    test.beforeAll('Set up & test env')
    test.afterAll('Tear down & test env')
    test.beforeEach('Start service for each test')
    test.afterEach('End service for each test')
    test('Run a test')
    test('Run another test')
    test.onFinish('Run onFinish hook')
    // Runs:
    // - Set up & test env
    // - Start service for each test
    // - Run a test
    // - End service for each test
    // - Start service for each test
    // - Run another test
    // - End service for each test
    // - Tear down & test env
    // - Run onFinish hook
    

    As alluded to in the example above, another reason I'd toss out in favor of adding this functionality is difficulty in maintaining large test suites where services or environments need to be set up and torn down at the beginning/end of the run. In that scenario, should one need to debug and isolate a single test, t.only() is not usable, because you still rely on the env setup/teardown tests; in such cases, I often find myself commenting out large blocks of code above and below the test I'm isolating, which is time consuming, error prone, and feels like a generally kind of janky workflow. (I assume I'm not completely alone in that, but who knows!)

    Anyhow, happy to take a look at a PR with some guidance about if / how y'all would like to see it executed. Given that this is kind of out of band with how tape works today, would definitely want to get some feedback on how this would be best implemented.

    pull request wanted semver-minor: new stuff 
    opened by ryanblock 31
  • Command line option -n to run a test by number

    Command line option -n to run a test by number

    I've written this and having it working but can't seem to get a test suite running. UPDATE: It's now working at the link below. Just waiting for decision on PR.

    I absolutely love the simplicity of tape, but it asks me to do something that I find anathema: modify code to run a particular test and remember to remove my modifications when I'm done. If I forgot to remove the .only constraint, I may check it in. That's easy to fix. The worst scenario is unwittingly changing something in the test while it's in the editor. This happens.

    So while I respect that some people are really comfortable with the .only feature, I suspect I'm not the only one who is really uncomfortable with it. Fortunately, there's an easy fix.

    All we need is a -n command line option. If you leave the option off, everything runs as it has. If you include a simple -n, all the tests run as usual, except that a test number is prefixed to the title of each test.

    To run a particular test, just place -nN on the command line, where N is the test number shown in the title.

    This approach allows tape to satisfy die-hards like me who prefer not to make edits that shouldn't be checked in.

    opened by jtlapp 31
  • Use import() on esm files in supported node versions

    Use import() on esm files in supported node versions

    This is a proof-of-concept of using import() to load ESM files in supported node versions (>= 14, >= 13.2.0, >= 12.17.0). The syntax breaking import() call is located in a separate file from bin/tape.js that is conditionally loaded, preventing older Node versions from crashing.

    This is currently an unfinished draft. I'm mainly curious to see if you are interested in something like this.

    Currently this branch does not use promises to sequentially load the imported files. I have a separate branch, https://github.com/lohfu/tape/blob/esm-support-promises/bin/load-module-esm-support.js#L27-L29, where I have implemented sequential loading but this causes a test repo with a couple of simple test files to fail.

    Questions / Caveats

    1. What is needed for the sequential loading to work? It seems like tape finishes before all tests are run properly. In a very simple repo with 2 test files all tests in the second file error with not ok 2 test exited without ending: file 2 test 1. The tests simply contain a single t.pass and a t.end. All tests in the tape repo pass.
    2. Currently only ${cwd}/package.json is loaded as I was a little reluctant to add a new dependency to find closest package.json... Is this ok? Do you have any preferences?
    3. Is there a better way to determine ESM support than checking the node version?
    4. nyc instrumentation fails: failed to instrument /home/lohfu/dev/tape/bin/load-module-esm-support.js with error: SyntaxError: 'import' and 'export' may only appear at the top level (14:8)... Can I update tap to get a newer nyc?
    5. Currently only .mjs and .js files are loaded using import(). This prevents the use of loaders on other file extensions. In the future an --extension argument will probably be needed in the cli to allow for loaders on custom extensions.
    6. Is the bin file ever bundled into browsers? I presume bundlers will add the file with the import to the bundle, which will cause older browsers to SyntaxError.
    opened by lohfu 29
  • Add flag to require modules before running tests

    Add flag to require modules before running tests

    By adding the --require flag (and -r alias) we allow users to require modules before running their tests. An example of this might be adding source-map-support, like so:

    $ tape -r source-map-support/register test/*.js
    

    Another example might be to install the babel require hook:

    $ tape -r babel-register test/*.js
    

    Another potential benefit is the ability to more easily run external test suites:

    $ npm install test-suite-rfc1337
    $ tape -r test-suite-rfc1337
    

    Modules are found using the node module resolution algorithm, so if one wants to load a local module it is necessary to prepend ./ or ../, like so:

    $ tape -r ./my/local/module
    
    opened by mstade 26
  • tape-catch

    tape-catch

    It's a bit unfortunate that one has to resort to use tape-catch to have all test throwing exception to fail (why isn't that the default?). Given that I am using blue-tape I can only seem to use either or.

    opened by tcurdt 26
  • [Ignore] Introduce --ignorePattern flag

    [Ignore] Introduce --ignorePattern flag

    This PR introduces the --ignorePattern flag as a shorthand for ignoring test files.

    The flag may be used together with --ignore; the input will be concatenated in that case. I figured this behavior would make the most sense, since users may want to ignore everything in .gitignore and some other files on top.

    Let me know if this looks good, then I'll also add some documentation :)

    Fixes https://github.com/ljharb/tape/issues/586

    semver-minor: new stuff 
    opened by ppati000 0
  • Suggestion: Ignore pattern directly instead of pointing to a file?

    Suggestion: Ignore pattern directly instead of pointing to a file?

    The --ignore flag does not take a glob pattern, but a path to a file that contains the ignored patterns. This level of indirection is not always needed. For example, I'd love to have a simple command that runs all *.test.ts files except for files in a specific directory (e.g., a directory that contains end-to-end tests).

    @ljharb what do you think about adding an --ignorePattern or similar option that takes a glob pattern? Would be willing to raise a PR :)

    enhancement pull request wanted 
    opened by ppati000 3
  • `.only()` fails with asynchronous tests

    `.only()` fails with asynchronous tests

    If tests are added with <script> (which is the case with karma), the nextTick() callback may be processed before loading a test that has the .only property. In such case, the first tests will be executed.

    E.g.

    <script type="text/javascript" src="test1.js" ></script>
    <script type="text/javascript" src="test2.js" ></script>
    <script type="text/javascript" src="test3.js" ></script>
    ...
    <script type="text/javascript" src="test23.js" ></script>
    // at this time, maybe JRE is processing the timeouts, hence first tests are ran
    <script type="text/javascript" src="test24.js" ></script>
    <script type="text/javascript" src="test25.js" ></script>
    ...
    <script type="text/javascript" src="test53.js" ></script>
    <script type="text/javascript" src="testwith.only().js" ></script> // by the time, this script is parsed, many tests have already been executed
    ...
    <script type="module">window.__karma__.loaded()</script>
    

    Adding defer or async does not change anything.

    opened by finetjul 11
  • tests seem to fail on windows.

    tests seem to fail on windows.

    Tried running tape tests on windows. Got errors. Tried a bunch of stuff so just putting console output here:

    PS C:\dev> git clone https://github.com/ljharb/tape.git
    Cloning into 'tape'...
    remote: Enumerating objects: 4492, done.
    remote: Counting objects: 100% (1130/1130), done.
    remote: Compressing objects: 100% (417/417), done.
    remote: Total 4492 (delta 706), reused 1103 (delta 690), pack-reused 3362
    Receiving objects: 100% (4492/4492), 1.17 MiB | 3.73 MiB/s, done.
    Resolving deltas: 100% (2804/2804), done.
    PS C:\dev> cd tape
    PS C:\dev\tape> npm -v
    8.19.2
    PS C:\dev\tape> npm install
    npm WARN deprecated [email protected]: 0.x is no longer supported. Please upgrade to 4.x or higher.
    npm WARN deprecated [email protected]: This version has been deprecated in accordance with the hapi support policy (hapi.im/support). Please upgrade to the latest version to get the best features, bug fixes, and security patches. If you are unable to upgrade at this time, paid support is available for older versions (hapi.im/commercial).
    npm WARN deprecated [email protected]: This module moved to @hapi/sntp. Please make sure to switch over as this distribution is no longer supported and may contain bugs and critical security issues.
    npm WARN deprecated [email protected]: This version has been deprecated in accordance with the hapi support policy (hapi.im/support). Please upgrade to the latest version to get the best features, bug fixes, and security patches. If you are unable to upgrade at this time, paid support is available for older versions (hapi.im/commercial).
    npm WARN deprecated [email protected]: Please upgrade  to version 7 or higher.  Older versions may use Math.random() in certain circumstances, which is known to be problematic.  See https://v8.dev/blog/math-random for details.
    npm WARN deprecated [email protected]: request has been deprecated, see https://github.com/request/request/issues/3142
    npm WARN deprecated [email protected]: this library is no longer supported
    npm WARN deprecated [email protected]: This version has been deprecated in accordance with the hapi support policy (hapi.im/support). Please upgrade to the latest version to get the best features, bug fixes, and security patches. If you are unable to upgrade at this time, paid support is available for older versions (hapi.im/commercial).
    npm WARN deprecated [email protected]: This module moved to @hapi/hawk. Please make sure to switch over as this distribution isnpm WARN deprecated [email protected]: Critical security vulnerability fixed in v0.21.1. For more information, see https://github.com/axios/axios/pull/3410
    npm WARN deprecated [email protected]: This package is unmaintained and deprecated. See the GH Issue 259.
    npm WARN deprecated [email protected]: Version no longer supported. Upgrade to @latest
    > [email protected] prepublish
    > !(type not-in-publish) || not-in-publish || npm run prepublishOnly
    
    '!' is not recognized as an internal or external command,
    
    added 812 packages, and audited 995 packages in 39s
    
    90 packages are looking for funding
      run `npm fund` for details
    
    50 vulnerabilities (5 low, 23 moderate, 17 high, 5 critical)
    
    To address issues that do not require attention, run:
      npm audit fix
    
    To address all issues possible (including breaking changes), run:
      npm audit fix --force
    
    Some issues need review, and may require choosing
    a different dependency.
    
    Run `npm audit` for details.
    PS C:\dev\tape> npm run tests-only
    
    > [email protected] tests-only
    > nyc tap 'test/*.js'
    
    internal/modules/cjs/loader.js:905
      throw err;
      ^
    
    Error: Cannot find module 'C:\dev\tape\node'
        at Function.Module._resolveFilename (internal/modules/cjs/loader.js:902:15)
        at Function.Module._load (internal/modules/cjs/loader.js:746:27)
        at Function.executeUserEntryPoint [as runMain] (internal/modules/run_main.js:76:12)
        at internal/main/run_main_module.js:17:47 {
      code: 'MODULE_NOT_FOUND',
      requireStack: []
    }
    
    =============================== Coverage summary ===============================
    Statements   : 0% ( 0/611 )
    Branches     : 0% ( 0/360 )
    Functions    : 0% ( 0/99 )
    Lines        : 0% ( 0/585 )
    ================================================================================
    --------------------|----------|----------|----------|----------|----------------|
    File                |  % Stmts | % Branch |  % Funcs |  % Lines |Uncovered Lines |
    --------------------|----------|----------|----------|----------|----------------|
    All files           |        0 |        0 |        0 |        0 |                |
     tape               |        0 |        0 |        0 |        0 |                |
      index.js          |        0 |        0 |        0 |        0 |... 179,180,181 |
     tape/lib           |        0 |        0 |        0 |        0 |                |
      default_stream.js |        0 |        0 |        0 |        0 |... 32,33,35,38 |
      results.js        |        0 |        0 |        0 |        0 |... 228,231,234 |
      test.js           |        0 |        0 |        0 |        0 |... 777,778,781 |
    --------------------|----------|----------|----------|----------|----------------|
    PS C:\dev\tape> npm i -g tape
    
    added 75 packages, and audited 76 packages in 2s
    
      run `npm fund` for details
    
    found 0 vulnerabilities
    PS C:\dev\tape> **npm run tests-only**
    
    > [email protected] tests-only
    > nyc tap 'test/*.js'
    
    internal/modules/cjs/loader.js:905
      throw err;
      ^
    
    Error: Cannot find module 'C:\dev\tape\node'
        at Function.Module._resolveFilename (internal/modules/cjs/loader.js:902:15)
        at Function.Module._load (internal/modules/cjs/loader.js:746:27)
        at Function.executeUserEntryPoint [as runMain] (internal/modules/run_main.js:76:12)
        at internal/main/run_main_module.js:17:47 {
      code: 'MODULE_NOT_FOUND',
      requireStack: []
    }
    
    =============================== Coverage summary ===============================
    Statements   : 0% ( 0/611 )
    Branches     : 0% ( 0/360 )
    Functions    : 0% ( 0/99 )
    Lines        : 0% ( 0/585 )
    ================================================================================
    --------------------|----------|----------|----------|----------|----------------|
    File                |  % Stmts | % Branch |  % Funcs |  % Lines |Uncovered Lines |
    --------------------|----------|----------|----------|----------|----------------|
    All files           |        0 |        0 |        0 |        0 |                |
     tape               |        0 |        0 |        0 |        0 |                |
      index.js          |        0 |        0 |        0 |        0 |... 179,180,181 |
     tape/lib           |        0 |        0 |        0 |        0 |                |
      default_stream.js |        0 |        0 |        0 |        0 |... 32,33,35,38 |
      results.js        |        0 |        0 |        0 |        0 |... 228,231,234 |
      test.js           |        0 |        0 |        0 |        0 |... 777,778,781 |
    --------------------|----------|----------|----------|----------|----------------|
    PS C:\dev\tape> npm run test
    
    > [email protected] pretest
    > npm run lint
    
    
    > [email protected] prelint
    > npm-run-posix-or-windows eclint
    
    
    > [email protected] eclint:windows
    > eclint check *.js
    
    index.js
        001:14 ❌ invalid newline: crlf, expected: lf       (EditorConfig end_of_line  https://goo.gl/te3t0s)
        002:01 ❌ invalid newline: crlf, expected: lf       (EditorConfig end_of_line  https://goo.gl/te3t0s)
        003:34 ❌ invalid newline: crlf, expected: lf       (EditorConfig end_of_line  https://goo.gl/te3t0s)
        004:59 ❌ invalid newline: crlf, expected: lf       (EditorConfig end_of_line  https://goo.gl/te3t0s)
        005:34 ❌ invalid newline: crlf, expected: lf       (EditorConfig end_of_line  https://goo.gl/te3t0s)
        006:45 ❌ invalid newline: crlf, expected: lf       (EditorConfig end_of_line  https://goo.gl/te3t0s)
        007:34 ❌ invalid newline: crlf, expected: lf       (EditorConfig end_of_line  https://goo.gl/te3t0s)
        008:01 ❌ invalid newline: crlf, expected: lf       (EditorConfig end_of_line  https://goo.gl/te3t0s)
        009:60 ❌ invalid newline: crlf, expected: lf       (EditorConfig end_of_line  https://goo.gl/te3t0s)
        010:69 ❌ invalid newline: crlf, expected: lf       (EditorConfig end_of_line  https://goo.gl/te3t0s)
        011:56 ❌ invalid newline: crlf, expected: lf       (EditorConfig end_of_line  https://goo.gl/te3t0s)
        012:43 ❌ invalid newline: crlf, expected: lf       (EditorConfig end_of_line  https://goo.gl/te3t0s)
        013:01 ❌ invalid newline: crlf, expected: lf       (EditorConfig end_of_line  https://goo.gl/te3t0s)
        014:32 ❌ invalid newline: crlf, expected: lf       (EditorConfig end_of_line  https://goo.gl/te3t0s)
        015:01 ❌ invalid indent style: tab, expected: space
                                                             (EditorConfig indent_style https://goo.gl/8Qkrbr)
        015:19 ❌ invalid newline: crlf, expected: lf       (EditorConfig end_of_line  https://goo.gl/te3t0s)
        016:01 ❌ invalid indent style: tab, expected: space
                                                             (EditorConfig indent_style https://goo.gl/8Qkrbr)
        016:14 ❌ invalid newline: crlf, expected: lf       (EditorConfig end_of_line  https://goo.gl/te3t0s)
        017:01 ❌ invalid newline: crlf, expected: lf       (EditorConfig end_of_line  https://goo.gl/te3t0s)
        018:01 ❌ invalid indent style: tab, expected: space
                                                             (EditorConfig indent_style https://goo.gl/8Qkrbr)
        018:29 ❌ invalid newline: crlf, expected: lf       (EditorConfig end_of_line  https://goo.gl/te3t0s)
        019:01 ❌ invalid indent style: tab, expected: space
                                                             (EditorConfig indent_style https://goo.gl/8Qkrbr)
        019:28 ❌ invalid newline: crlf, expected: lf       (EditorConfig end_of_line  https://goo.gl/te3t0s)
        020:01 ❌ invalid indent style: tab, expected: space
                                                             (EditorConfig indent_style https://goo.gl/8Qkrbr)
        020:33 ❌ invalid newline: crlf, expected: lf       (EditorConfig end_of_line  https://goo.gl/te3t0s)
        021:01 ❌ invalid indent style: tab, expected: space
                                                             (EditorConfig indent_style https://goo.gl/8Qkrbr)
        021:86 ❌ invalid newline: crlf, expected: lf       (EditorConfig end_of_line  https://goo.gl/te3t0s)
        022:01 ❌ invalid indent style: tab, expected: space
                                                             (EditorConfig indent_style https://goo.gl/8Qkrbr)
        022:51 ❌ invalid newline: crlf, expected: lf       (EditorConfig end_of_line  https://goo.gl/te3t0s)
        023:01 ❌ invalid indent style: tab, expected: space
                                                             (EditorConfig indent_style https://goo.gl/8Qkrbr)
        023:61 ❌ invalid newline: crlf, expected: lf       (EditorConfig end_of_line  https://goo.gl/te3t0s)
        024:01 ❌ invalid indent style: tab, expected: space
                                                             (EditorConfig indent_style https://goo.gl/8Qkrbr)
        024:18 ❌ invalid newline: crlf, expected: lf       (EditorConfig end_of_line  https://goo.gl/te3t0s)
        025:01 ❌ invalid indent style: tab, expected: space
                                                             (EditorConfig indent_style https://goo.gl/8Qkrbr)
        025:03 ❌ invalid newline: crlf, expected: lf       (EditorConfig end_of_line  https://goo.gl/te3t0s)
        026:01 ❌ invalid newline: crlf, expected: lf       (EditorConfig end_of_line  https://goo.gl/te3t0s)
        027:01 ❌ invalid indent style: tab, expected: space
                                                             (EditorConfig indent_style https://goo.gl/8Qkrbr)
        027:23 ❌ invalid newline: crlf, expected: lf       (EditorConfig end_of_line  https://goo.gl/te3t0s)
        028:01 ❌ invalid indent style: tab, expected: space
                                                             (EditorConfig indent_style https://goo.gl/8Qkrbr)
        028:46 ❌ invalid newline: crlf, expected: lf       (EditorConfig end_of_line  https://goo.gl/te3t0s)
        029:01 ❌ invalid indent style: tab, expected: space
                                                             (EditorConfig indent_style https://goo.gl/8Qkrbr)
        029:46 ❌ invalid newline: crlf, expected: lf       (EditorConfig end_of_line  https://goo.gl/te3t0s)
        030:01 ❌ invalid indent style: tab, expected: space
                                                             (EditorConfig indent_style https://goo.gl/8Qkrbr)
        030:03 ❌ invalid newline: crlf, expected: lf       (EditorConfig end_of_line  https://goo.gl/te3t0s)
        031:01 ❌ invalid newline: crlf, expected: lf       (EditorConfig end_of_line  https://goo.gl/te3t0s)
        032:01 ❌ invalid indent style: tab, expected: space
                                                             (EditorConfig indent_style https://goo.gl/8Qkrbr)
        032:31 ❌ invalid newline: crlf, expected: lf       (EditorConfig end_of_line  https://goo.gl/te3t0s)
        033:01 ❌ invalid indent style: tab, expected: space
                                                             (EditorConfig indent_style https://goo.gl/8Qkrbr)
        033:15 ❌ invalid newline: crlf, expected: lf       (EditorConfig end_of_line  https://goo.gl/te3t0s)
        034:01 ❌ invalid indent style: tab, expected: space
                                                             (EditorConfig indent_style https://goo.gl/8Qkrbr)
        034:04 ❌ invalid newline: crlf, expected: lf       (EditorConfig end_of_line  https://goo.gl/te3t0s)
        035:01 ❌ invalid newline: crlf, expected: lf       (EditorConfig end_of_line  https://goo.gl/te3t0s)
        036:01 ❌ invalid indent style: tab, expected: space
                                                             (EditorConfig indent_style https://goo.gl/8Qkrbr)
        036:30 ❌ invalid newline: crlf, expected: lf       (EditorConfig end_of_line  https://goo.gl/te3t0s)
        037:01 ❌ invalid indent style: tab, expected: space
                                                             (EditorConfig indent_style https://goo.gl/8Qkrbr)
        037:30 ❌ invalid newline: crlf, expected: lf       (EditorConfig end_of_line  https://goo.gl/te3t0s)
        038:01 ❌ invalid newline: crlf, expected: lf       (EditorConfig end_of_line  https://goo.gl/te3t0s)
        039:01 ❌ invalid indent style: tab, expected: space
                                                             (EditorConfig indent_style https://goo.gl/8Qkrbr)
        039:22 ❌ invalid newline: crlf, expected: lf       (EditorConfig end_of_line  https://goo.gl/te3t0s)
        040:01 ❌ invalid indent style: tab, expected: space
                                                             (EditorConfig indent_style https://goo.gl/8Qkrbr)
        040:04 ❌ invalid newline: crlf, expected: lf       (EditorConfig end_of_line  https://goo.gl/te3t0s)
        041:01 ❌ invalid newline: crlf, expected: lf       (EditorConfig end_of_line  https://goo.gl/te3t0s)
        042:01 ❌ invalid indent style: tab, expected: space
                                                             (EditorConfig indent_style https://goo.gl/8Qkrbr)
        042:31 ❌ invalid newline: crlf, expected: lf       (EditorConfig end_of_line  https://goo.gl/te3t0s)
        043:01 ❌ invalid indent style: tab, expected: space
                                                             (EditorConfig indent_style https://goo.gl/8Qkrbr)
        043:51 ❌ invalid newline: crlf, expected: lf       (EditorConfig end_of_line  https://goo.gl/te3t0s)
        044:01 ❌ invalid indent style: tab, expected: space
                                                             (EditorConfig indent_style https://goo.gl/8Qkrbr)
        044:04 ❌ invalid newline: crlf, expected: lf       (EditorConfig end_of_line  https://goo.gl/te3t0s)
        045:01 ❌ invalid newline: crlf, expected: lf       (EditorConfig end_of_line  https://goo.gl/te3t0s)
        046:01 ❌ invalid indent style: tab, expected: space
                                                             (EditorConfig indent_style https://goo.gl/8Qkrbr)
        046:43 ❌ invalid newline: crlf, expected: lf       (EditorConfig end_of_line  https://goo.gl/te3t0s)
        047:01 ❌ invalid indent style: tab, expected: space
                                                             (EditorConfig indent_style https://goo.gl/8Qkrbr)
        047:28 ❌ invalid newline: crlf, expected: lf       (EditorConfig end_of_line  https://goo.gl/te3t0s)
        048:01 ❌ invalid indent style: tab, expected: space
                                                             (EditorConfig indent_style https://goo.gl/8Qkrbr)
        048:18 ❌ invalid newline: crlf, expected: lf       (EditorConfig end_of_line  https://goo.gl/te3t0s)
        049:01 ❌ invalid indent style: tab, expected: space
                                                             (EditorConfig indent_style https://goo.gl/8Qkrbr)
        049:27 ❌ invalid newline: crlf, expected: lf       (EditorConfig end_of_line  https://goo.gl/te3t0s)
        050:01 ❌ invalid indent style: tab, expected: space
                                                             (EditorConfig indent_style https://goo.gl/8Qkrbr)
        050:67 ❌ invalid newline: crlf, expected: lf       (EditorConfig end_of_line  https://goo.gl/te3t0s)
        051:01 ❌ invalid indent style: tab, expected: space
                                                             (EditorConfig indent_style https://goo.gl/8Qkrbr)
        051:18 ❌ invalid newline: crlf, expected: lf       (EditorConfig end_of_line  https://goo.gl/te3t0s)
        052:01 ❌ invalid indent style: tab, expected: space
                                                             (EditorConfig indent_style https://goo.gl/8Qkrbr)
        052:04 ❌ invalid newline: crlf, expected: lf       (EditorConfig end_of_line  https://goo.gl/te3t0s)
        053:01 ❌ invalid indent style: tab, expected: space
                                                             (EditorConfig indent_style https://goo.gl/8Qkrbr)
        053:40 ❌ invalid newline: crlf, expected: lf       (EditorConfig end_of_line  https://goo.gl/te3t0s)
        054:01 ❌ invalid indent style: tab, expected: space
                                                             (EditorConfig indent_style https://goo.gl/8Qkrbr)
        054:04 ❌ invalid newline: crlf, expected: lf       (EditorConfig end_of_line  https://goo.gl/te3t0s)
        055:01 ❌ invalid newline: crlf, expected: lf       (EditorConfig end_of_line  https://goo.gl/te3t0s)
        056:01 ❌ invalid indent style: tab, expected: space
                                                             (EditorConfig indent_style https://goo.gl/8Qkrbr)
        056:35 ❌ invalid newline: crlf, expected: lf       (EditorConfig end_of_line  https://goo.gl/te3t0s)
        057:01 ❌ invalid indent style: tab, expected: space
                                                             (EditorConfig indent_style https://goo.gl/8Qkrbr)
        057:55 ❌ invalid newline: crlf, expected: lf       (EditorConfig end_of_line  https://goo.gl/te3t0s)
        058:01 ❌ invalid indent style: tab, expected: space
                                                             (EditorConfig indent_style https://goo.gl/8Qkrbr)
        058:04 ❌ invalid newline: crlf, expected: lf       (EditorConfig end_of_line  https://goo.gl/te3t0s)
        059:01 ❌ invalid newline: crlf, expected: lf       (EditorConfig end_of_line  https://goo.gl/te3t0s)
        060:01 ❌ invalid indent style: tab, expected: space
                                                             (EditorConfig indent_style https://goo.gl/8Qkrbr)
        060:36 ❌ invalid newline: crlf, expected: lf       (EditorConfig end_of_line  https://goo.gl/te3t0s)
        061:01 ❌ invalid indent style: tab, expected: space
                                                             (EditorConfig indent_style https://goo.gl/8Qkrbr)
        061:56 ❌ invalid newline: crlf, expected: lf       (EditorConfig end_of_line  https://goo.gl/te3t0s)
        062:01 ❌ invalid indent style: tab, expected: space
                                                             (EditorConfig indent_style https://goo.gl/8Qkrbr)
        062:04 ❌ invalid newline: crlf, expected: lf       (EditorConfig end_of_line  https://goo.gl/te3t0s)
        063:01 ❌ invalid newline: crlf, expected: lf       (EditorConfig end_of_line  https://goo.gl/te3t0s)
        064:01 ❌ invalid indent style: tab, expected: space
                                                             (EditorConfig indent_style https://goo.gl/8Qkrbr)
        064:35 ❌ invalid newline: crlf, expected: lf       (EditorConfig end_of_line  https://goo.gl/te3t0s)
        065:01 ❌ invalid newline: crlf, expected: lf       (EditorConfig end_of_line  https://goo.gl/te3t0s)
        066:01 ❌ invalid indent style: tab, expected: space
                                                             (EditorConfig indent_style https://goo.gl/8Qkrbr)
        066:18 ❌ invalid newline: crlf, expected: lf       (EditorConfig end_of_line  https://goo.gl/te3t0s)
        067:06 ❌ invalid newline: crlf, expected: lf       (EditorConfig end_of_line  https://goo.gl/te3t0s)
        068:01 ❌ invalid newline: crlf, expected: lf       (EditorConfig end_of_line  https://goo.gl/te3t0s)
        069:32 ❌ invalid newline: crlf, expected: lf       (EditorConfig end_of_line  https://goo.gl/te3t0s)
        070:01 ❌ invalid indent style: tab, expected: space
                                                             (EditorConfig indent_style https://goo.gl/8Qkrbr)
        070:31 ❌ invalid newline: crlf, expected: lf       (EditorConfig end_of_line  https://goo.gl/te3t0s)
        071:01 ❌ invalid indent style: tab, expected: space
                                                             (EditorConfig indent_style https://goo.gl/8Qkrbr)
        071:44 ❌ invalid newline: crlf, expected: lf       (EditorConfig end_of_line  https://goo.gl/te3t0s)
        072:01 ❌ invalid indent style: tab, expected: space
                                                             (EditorConfig indent_style https://goo.gl/8Qkrbr)
        072:58 ❌ invalid newline: crlf, expected: lf       (EditorConfig end_of_line  https://goo.gl/te3t0s)
        073:01 ❌ invalid indent style: tab, expected: space
                                                             (EditorConfig indent_style https://goo.gl/8Qkrbr)
        073:03 ❌ invalid newline: crlf, expected: lf       (EditorConfig end_of_line  https://goo.gl/te3t0s)
        074:01 ❌ invalid newline: crlf, expected: lf       (EditorConfig end_of_line  https://goo.gl/te3t0s)
        075:01 ❌ invalid indent style: tab, expected: space
                                                             (EditorConfig indent_style https://goo.gl/8Qkrbr)
        075:33 ❌ invalid newline: crlf, expected: lf       (EditorConfig end_of_line  https://goo.gl/te3t0s)
        076:01 ❌ invalid indent style: tab, expected: space
                                                             (EditorConfig indent_style https://goo.gl/8Qkrbr)
        076:36 ❌ invalid newline: crlf, expected: lf       (EditorConfig end_of_line  https://goo.gl/te3t0s)
        077:01 ❌ invalid indent style: tab, expected: space
                                                             (EditorConfig indent_style https://goo.gl/8Qkrbr)
        077:23 ❌ invalid newline: crlf, expected: lf       (EditorConfig end_of_line  https://goo.gl/te3t0s)
        078:01 ❌ invalid newline: crlf, expected: lf       (EditorConfig end_of_line  https://goo.gl/te3t0s)
        079:01 ❌ invalid indent style: tab, expected: space
                                                             (EditorConfig indent_style https://goo.gl/8Qkrbr)
        079:30 ❌ invalid newline: crlf, expected: lf       (EditorConfig end_of_line  https://goo.gl/te3t0s)
        080:01 ❌ invalid indent style: tab, expected: space
                                                             (EditorConfig indent_style https://goo.gl/8Qkrbr)
        080:37 ❌ invalid newline: crlf, expected: lf       (EditorConfig end_of_line  https://goo.gl/te3t0s)
        081:01 ❌ invalid indent style: tab, expected: space
                                                             (EditorConfig indent_style https://goo.gl/8Qkrbr)
        081:22 ❌ invalid newline: crlf, expected: lf       (EditorConfig end_of_line  https://goo.gl/te3t0s)
        082:01 ❌ invalid indent style: tab, expected: space
                                                             (EditorConfig indent_style https://goo.gl/8Qkrbr)
        082:07 ❌ invalid newline: crlf, expected: lf       (EditorConfig end_of_line  https://goo.gl/te3t0s)
        083:01 ❌ invalid indent style: tab, expected: space
                                                             (EditorConfig indent_style https://goo.gl/8Qkrbr)
        083:34 ❌ invalid newline: crlf, expected: lf       (EditorConfig end_of_line  https://goo.gl/te3t0s)
        084:01 ❌ invalid indent style: tab, expected: space
                                                             (EditorConfig indent_style https://goo.gl/8Qkrbr)
        084:75 ❌ invalid newline: crlf, expected: lf       (EditorConfig end_of_line  https://goo.gl/te3t0s)
        085:01 ❌ invalid indent style: tab, expected: space
                                                             (EditorConfig indent_style https://goo.gl/8Qkrbr)
        085:07 ❌ invalid newline: crlf, expected: lf       (EditorConfig end_of_line  https://goo.gl/te3t0s)
        086:01 ❌ invalid indent style: tab, expected: space
                                                             (EditorConfig indent_style https://goo.gl/8Qkrbr)
        086:09 ❌ invalid newline: crlf, expected: lf       (EditorConfig end_of_line  https://goo.gl/te3t0s)
        087:01 ❌ invalid newline: crlf, expected: lf       (EditorConfig end_of_line  https://goo.gl/te3t0s)
        088:01 ❌ invalid indent style: tab, expected: space
                                                             (EditorConfig indent_style https://goo.gl/8Qkrbr)
        088:19 ❌ invalid newline: crlf, expected: lf       (EditorConfig end_of_line  https://goo.gl/te3t0s)
        089:01 ❌ invalid indent style: tab, expected: space
                                                             (EditorConfig indent_style https://goo.gl/8Qkrbr)
        089:12 ❌ invalid newline: crlf, expected: lf       (EditorConfig end_of_line  https://goo.gl/te3t0s)
        090:01 ❌ invalid indent style: tab, expected: space
                                                             (EditorConfig indent_style https://goo.gl/8Qkrbr)
        090:03 ❌ invalid newline: crlf, expected: lf       (EditorConfig end_of_line  https://goo.gl/te3t0s)
        091:01 ❌ invalid indent style: tab, expected: space
                                                             (EditorConfig indent_style https://goo.gl/8Qkrbr)
        091:26 ❌ invalid newline: crlf, expected: lf       (EditorConfig end_of_line  https://goo.gl/te3t0s)
        092:01 ❌ invalid newline: crlf, expected: lf       (EditorConfig end_of_line  https://goo.gl/te3t0s)
        093:01 ❌ invalid indent style: tab, expected: space
                                                             (EditorConfig indent_style https://goo.gl/8Qkrbr)
        093:19 ❌ invalid newline: crlf, expected: lf       (EditorConfig end_of_line  https://goo.gl/te3t0s)
        094:01 ❌ invalid newline: crlf, expected: lf       (EditorConfig end_of_line  https://goo.gl/te3t0s)
        095:01 ❌ invalid indent style: tab, expected: space
                                                             (EditorConfig indent_style https://goo.gl/8Qkrbr)
        095:39 ❌ invalid newline: crlf, expected: lf       (EditorConfig end_of_line  https://goo.gl/te3t0s)
        096:01 ❌ invalid indent style: tab, expected: space
                                                             (EditorConfig indent_style https://goo.gl/8Qkrbr)
        096:37 ❌ invalid newline: crlf, expected: lf       (EditorConfig end_of_line  https://goo.gl/te3t0s)
        097:01 ❌ invalid indent style: tab, expected: space
                                                             (EditorConfig indent_style https://goo.gl/8Qkrbr)
        097:04 ❌ invalid newline: crlf, expected: lf       (EditorConfig end_of_line  https://goo.gl/te3t0s)
        098:01 ❌ invalid newline: crlf, expected: lf       (EditorConfig end_of_line  https://goo.gl/te3t0s)
        099:01 ❌ invalid indent style: tab, expected: space
                                                             (EditorConfig indent_style https://goo.gl/8Qkrbr)
        099:33 ❌ invalid newline: crlf, expected: lf       (EditorConfig end_of_line  https://goo.gl/te3t0s)
        100:01 ❌ invalid indent style: tab, expected: space
                                                             (EditorConfig indent_style https://goo.gl/8Qkrbr)
        100:26 ❌ invalid newline: crlf, expected: lf       (EditorConfig end_of_line  https://goo.gl/te3t0s)
        101:01 ❌ invalid indent style: tab, expected: space
                                                             (EditorConfig indent_style https://goo.gl/8Qkrbr)
        101:04 ❌ invalid newline: crlf, expected: lf       (EditorConfig end_of_line  https://goo.gl/te3t0s)
        102:01 ❌ invalid newline: crlf, expected: lf       (EditorConfig end_of_line  https://goo.gl/te3t0s)
        103:01 ❌ invalid indent style: tab, expected: space
                                                             (EditorConfig indent_style https://goo.gl/8Qkrbr)
        103:34 ❌ invalid newline: crlf, expected: lf       (EditorConfig end_of_line  https://goo.gl/te3t0s)
        104:01 ❌ invalid indent style: tab, expected: space
                                                             (EditorConfig indent_style https://goo.gl/8Qkrbr)
        104:26 ❌ invalid newline: crlf, expected: lf       (EditorConfig end_of_line  https://goo.gl/te3t0s)
        105:01 ❌ invalid indent style: tab, expected: space
                                                             (EditorConfig indent_style https://goo.gl/8Qkrbr)
        105:04 ❌ invalid newline: crlf, expected: lf       (EditorConfig end_of_line  https://goo.gl/te3t0s)
        106:01 ❌ invalid newline: crlf, expected: lf       (EditorConfig end_of_line  https://goo.gl/te3t0s)
        107:01 ❌ invalid indent style: tab, expected: space
                                                             (EditorConfig indent_style https://goo.gl/8Qkrbr)
        107:19 ❌ invalid newline: crlf, expected: lf       (EditorConfig end_of_line  https://goo.gl/te3t0s)
        108:01 ❌ invalid indent style: tab, expected: space
                                                             (EditorConfig indent_style https://goo.gl/8Qkrbr)
        108:27 ❌ invalid newline: crlf, expected: lf       (EditorConfig end_of_line  https://goo.gl/te3t0s)
        109:01 ❌ invalid indent style: tab, expected: space
                                                             (EditorConfig indent_style https://goo.gl/8Qkrbr)
        109:68 ❌ invalid newline: crlf, expected: lf       (EditorConfig end_of_line  https://goo.gl/te3t0s)
        110:01 ❌ invalid indent style: tab, expected: space
                                                             (EditorConfig indent_style https://goo.gl/8Qkrbr)
        110:72 ❌ invalid newline: crlf, expected: lf       (EditorConfig end_of_line  https://goo.gl/te3t0s)
        111:01 ❌ invalid indent style: tab, expected: space
                                                             (EditorConfig indent_style https://goo.gl/8Qkrbr)
        111:15 ❌ invalid newline: crlf, expected: lf       (EditorConfig end_of_line  https://goo.gl/te3t0s)
        112:01 ❌ invalid indent style: tab, expected: space
                                                             (EditorConfig indent_style https://goo.gl/8Qkrbr)
        112:39 ❌ invalid newline: crlf, expected: lf       (EditorConfig end_of_line  https://goo.gl/te3t0s)
        113:01 ❌ invalid indent style: tab, expected: space
                                                             (EditorConfig indent_style https://goo.gl/8Qkrbr)
        113:19 ❌ invalid newline: crlf, expected: lf       (EditorConfig end_of_line  https://goo.gl/te3t0s)
        114:01 ❌ invalid indent style: tab, expected: space
                                                             (EditorConfig indent_style https://goo.gl/8Qkrbr)
        114:12 ❌ invalid newline: crlf, expected: lf       (EditorConfig end_of_line  https://goo.gl/te3t0s)
        115:01 ❌ invalid indent style: tab, expected: space
                                                             (EditorConfig indent_style https://goo.gl/8Qkrbr)
        115:04 ❌ invalid newline: crlf, expected: lf       (EditorConfig end_of_line  https://goo.gl/te3t0s)
        116:01 ❌ invalid indent style: tab, expected: space
                                                             (EditorConfig indent_style https://goo.gl/8Qkrbr)
        116:21 ❌ invalid newline: crlf, expected: lf       (EditorConfig end_of_line  https://goo.gl/te3t0s)
        117:01 ❌ invalid newline: crlf, expected: lf       (EditorConfig end_of_line  https://goo.gl/te3t0s)
        118:01 ❌ invalid indent style: tab, expected: space
                                                             (EditorConfig indent_style https://goo.gl/8Qkrbr)
        118:48 ❌ invalid newline: crlf, expected: lf       (EditorConfig end_of_line  https://goo.gl/te3t0s)
        119:01 ❌ invalid newline: crlf, expected: lf       (EditorConfig end_of_line  https://goo.gl/te3t0s)
        120:01 ❌ invalid indent style: tab, expected: space
                                                             (EditorConfig indent_style https://goo.gl/8Qkrbr)
        120:14 ❌ invalid newline: crlf, expected: lf       (EditorConfig end_of_line  https://goo.gl/te3t0s)
        121:02 ❌ invalid newline: crlf, expected: lf       (EditorConfig end_of_line  https://goo.gl/te3t0s)
        122:01 ❌ invalid newline: crlf, expected: lf       (EditorConfig end_of_line  https://goo.gl/te3t0s)
        123:41 ❌ invalid newline: crlf, expected: lf       (EditorConfig end_of_line  https://goo.gl/te3t0s)
        124:01 ❌ invalid indent style: tab, expected: space
                                                             (EditorConfig indent_style https://goo.gl/8Qkrbr)
        124:26 ❌ invalid newline: crlf, expected: lf       (EditorConfig end_of_line  https://goo.gl/te3t0s)
        125:01 ❌ invalid indent style: tab, expected: space
                                                             (EditorConfig indent_style https://goo.gl/8Qkrbr)
        125:31 ❌ invalid newline: crlf, expected: lf       (EditorConfig end_of_line  https://goo.gl/te3t0s)
        126:01 ❌ invalid indent style: tab, expected: space
                                                             (EditorConfig indent_style https://goo.gl/8Qkrbr)
        126:47 ❌ invalid newline: crlf, expected: lf       (EditorConfig end_of_line  https://goo.gl/te3t0s)
        127:01 ❌ invalid indent style: tab, expected: space
                                                             (EditorConfig indent_style https://goo.gl/8Qkrbr)
        127:83 ❌ invalid newline: crlf, expected: lf       (EditorConfig end_of_line  https://goo.gl/te3t0s)
        128:01 ❌ invalid indent style: tab, expected: space
                                                             (EditorConfig indent_style https://goo.gl/8Qkrbr)
        128:05 ❌ invalid newline: crlf, expected: lf       (EditorConfig end_of_line  https://goo.gl/te3t0s)
        129:01 ❌ invalid indent style: tab, expected: space
                                                             (EditorConfig indent_style https://goo.gl/8Qkrbr)
        129:22 ❌ invalid newline: crlf, expected: lf       (EditorConfig end_of_line  https://goo.gl/te3t0s)
        130:01 ❌ invalid indent style: tab, expected: space
                                                             (EditorConfig indent_style https://goo.gl/8Qkrbr)
        130:20 ❌ invalid newline: crlf, expected: lf       (EditorConfig end_of_line  https://goo.gl/te3t0s)
        131:01 ❌ invalid newline: crlf, expected: lf       (EditorConfig end_of_line  https://goo.gl/te3t0s)
        132:01 ❌ invalid indent style: tab, expected: space
                                                             (EditorConfig indent_style https://goo.gl/8Qkrbr)
        132:18 ❌ invalid newline: crlf, expected: lf       (EditorConfig end_of_line  https://goo.gl/te3t0s)
        133:01 ❌ invalid indent style: tab, expected: space
                                                             (EditorConfig indent_style https://goo.gl/8Qkrbr)
        133:27 ❌ invalid newline: crlf, expected: lf       (EditorConfig end_of_line  https://goo.gl/te3t0s)
        134:01 ❌ invalid indent style: tab, expected: space
                                                             (EditorConfig indent_style https://goo.gl/8Qkrbr)
        134:18 ❌ invalid newline: crlf, expected: lf       (EditorConfig end_of_line  https://goo.gl/te3t0s)
        135:01 ❌ invalid indent style: tab, expected: space
                                                             (EditorConfig indent_style https://goo.gl/8Qkrbr)
        135:72 ❌ invalid newline: crlf, expected: lf       (EditorConfig end_of_line  https://goo.gl/te3t0s)
        136:01 ❌ invalid indent style: tab, expected: space
                                                             (EditorConfig indent_style https://goo.gl/8Qkrbr)
        136:64 ❌ invalid newline: crlf, expected: lf       (EditorConfig end_of_line  https://goo.gl/te3t0s)
        137:01 ❌ invalid indent style: tab, expected: space
                                                             (EditorConfig indent_style https://goo.gl/8Qkrbr)
        137:64 ❌ invalid newline: crlf, expected: lf       (EditorConfig end_of_line  https://goo.gl/te3t0s)
        138:01 ❌ invalid indent style: tab, expected: space
                                                             (EditorConfig indent_style https://goo.gl/8Qkrbr)
        138:27 ❌ invalid newline: crlf, expected: lf       (EditorConfig end_of_line  https://goo.gl/te3t0s)
        139:01 ❌ invalid indent style: tab, expected: space
                                                             (EditorConfig indent_style https://goo.gl/8Qkrbr)
        139:46 ❌ invalid newline: crlf, expected: lf       (EditorConfig end_of_line  https://goo.gl/te3t0s)
        140:01 ❌ invalid indent style: tab, expected: space
                                                             (EditorConfig indent_style https://goo.gl/8Qkrbr)
        140:62 ❌ invalid newline: crlf, expected: lf       (EditorConfig end_of_line  https://goo.gl/te3t0s)
        141:01 ❌ invalid indent style: tab, expected: space
                                                             (EditorConfig indent_style https://goo.gl/8Qkrbr)
        141:04 ❌ invalid newline: crlf, expected: lf       (EditorConfig end_of_line  https://goo.gl/te3t0s)
        142:01 ❌ invalid indent style: tab, expected: space
                                                             (EditorConfig indent_style https://goo.gl/8Qkrbr)
        142:51 ❌ invalid newline: crlf, expected: lf       (EditorConfig end_of_line  https://goo.gl/te3t0s)
        143:01 ❌ invalid indent style: tab, expected: space
                                                             (EditorConfig indent_style https://goo.gl/8Qkrbr)
        143:03 ❌ invalid newline: crlf, expected: lf       (EditorConfig end_of_line  https://goo.gl/te3t0s)
        144:01 ❌ invalid newline: crlf, expected: lf       (EditorConfig end_of_line  https://goo.gl/te3t0s)
        145:01 ❌ invalid indent style: tab, expected: space
                                                             (EditorConfig indent_style https://goo.gl/8Qkrbr)
        145:13 ❌ invalid newline: crlf, expected: lf       (EditorConfig end_of_line  https://goo.gl/te3t0s)
        146:01 ❌ invalid indent style: tab, expected: space
                                                             (EditorConfig indent_style https://goo.gl/8Qkrbr)
        146:21 ❌ invalid newline: crlf, expected: lf       (EditorConfig end_of_line  https://goo.gl/te3t0s)
        147:01 ❌ invalid indent style: tab, expected: space
                                                             (EditorConfig indent_style https://goo.gl/8Qkrbr)
        147:10 ❌ invalid newline: crlf, expected: lf       (EditorConfig end_of_line  https://goo.gl/te3t0s)
        148:01 ❌ invalid indent style: tab, expected: space
                                                             (EditorConfig indent_style https://goo.gl/8Qkrbr)
        148:09 ❌ invalid newline: crlf, expected: lf       (EditorConfig end_of_line  https://goo.gl/te3t0s)
        149:01 ❌ invalid indent style: tab, expected: space
                                                             (EditorConfig indent_style https://goo.gl/8Qkrbr)
        149:03 ❌ invalid newline: crlf, expected: lf       (EditorConfig end_of_line  https://goo.gl/te3t0s)
        150:01 ❌ invalid newline: crlf, expected: lf       (EditorConfig end_of_line  https://goo.gl/te3t0s)
        151:01 ❌ invalid indent style: tab, expected: space
                                                             (EditorConfig indent_style https://goo.gl/8Qkrbr)
        151:48 ❌ invalid newline: crlf, expected: lf       (EditorConfig end_of_line  https://goo.gl/te3t0s)
        152:01 ❌ invalid indent style: tab, expected: space
                                                             (EditorConfig indent_style https://goo.gl/8Qkrbr)
        152:51 ❌ invalid newline: crlf, expected: lf       (EditorConfig end_of_line  https://goo.gl/te3t0s)
        153:01 ❌ invalid newline: crlf, expected: lf       (EditorConfig end_of_line  https://goo.gl/te3t0s)
        154:01 ❌ invalid indent style: tab, expected: space
                                                             (EditorConfig indent_style https://goo.gl/8Qkrbr)
        154:38 ❌ invalid newline: crlf, expected: lf       (EditorConfig end_of_line  https://goo.gl/te3t0s)
        155:01 ❌ invalid indent style: tab, expected: space
                                                             (EditorConfig indent_style https://goo.gl/8Qkrbr)
        155:35 ❌ invalid newline: crlf, expected: lf       (EditorConfig end_of_line  https://goo.gl/te3t0s)
        156:01 ❌ invalid indent style: tab, expected: space
                                                             (EditorConfig indent_style https://goo.gl/8Qkrbr)
        156:48 ❌ invalid newline: crlf, expected: lf       (EditorConfig end_of_line  https://goo.gl/te3t0s)
        157:01 ❌ invalid indent style: tab, expected: space
                                                             (EditorConfig indent_style https://goo.gl/8Qkrbr)
        157:11 ❌ invalid newline: crlf, expected: lf       (EditorConfig end_of_line  https://goo.gl/te3t0s)
        158:01 ❌ invalid indent style: tab, expected: space
                                                             (EditorConfig indent_style https://goo.gl/8Qkrbr)
        158:04 ❌ invalid newline: crlf, expected: lf       (EditorConfig end_of_line  https://goo.gl/te3t0s)
        159:01 ❌ invalid newline: crlf, expected: lf       (EditorConfig end_of_line  https://goo.gl/te3t0s)
        160:01 ❌ invalid indent style: tab, expected: space
                                                             (EditorConfig indent_style https://goo.gl/8Qkrbr)
        160:16 ❌ invalid newline: crlf, expected: lf       (EditorConfig end_of_line  https://goo.gl/te3t0s)
        161:01 ❌ invalid indent style: tab, expected: space
                                                             (EditorConfig indent_style https://goo.gl/8Qkrbr)
        161:38 ❌ invalid newline: crlf, expected: lf       (EditorConfig end_of_line  https://goo.gl/te3t0s)
        162:01 ❌ invalid indent style: tab, expected: space
                                                             (EditorConfig indent_style https://goo.gl/8Qkrbr)
        162:53 ❌ invalid newline: crlf, expected: lf       (EditorConfig end_of_line  https://goo.gl/te3t0s)
        163:01 ❌ invalid indent style: tab, expected: space
                                                             (EditorConfig indent_style https://goo.gl/8Qkrbr)
        163:31 ❌ invalid newline: crlf, expected: lf       (EditorConfig end_of_line  https://goo.gl/te3t0s)
        164:01 ❌ invalid indent style: tab, expected: space
                                                             (EditorConfig indent_style https://goo.gl/8Qkrbr)
        164:31 ❌ invalid newline: crlf, expected: lf       (EditorConfig end_of_line  https://goo.gl/te3t0s)
        165:01 ❌ invalid indent style: tab, expected: space
                                                             (EditorConfig indent_style https://goo.gl/8Qkrbr)
        165:16 ❌ invalid newline: crlf, expected: lf       (EditorConfig end_of_line  https://goo.gl/te3t0s)
        166:01 ❌ invalid indent style: tab, expected: space
                                                             (EditorConfig indent_style https://goo.gl/8Qkrbr)
        166:06 ❌ invalid newline: crlf, expected: lf       (EditorConfig end_of_line  https://goo.gl/te3t0s)
        167:01 ❌ invalid indent style: tab, expected: space
                                                             (EditorConfig indent_style https://goo.gl/8Qkrbr)
        167:05 ❌ invalid newline: crlf, expected: lf       (EditorConfig end_of_line  https://goo.gl/te3t0s)
        168:01 ❌ invalid indent style: tab, expected: space
                                                             (EditorConfig indent_style https://goo.gl/8Qkrbr)
        168:04 ❌ invalid newline: crlf, expected: lf       (EditorConfig end_of_line  https://goo.gl/te3t0s)
        169:01 ❌ invalid indent style: tab, expected: space
                                                             (EditorConfig indent_style https://goo.gl/8Qkrbr)
        169:19 ❌ invalid newline: crlf, expected: lf       (EditorConfig end_of_line  https://goo.gl/te3t0s)
        170:01 ❌ invalid newline: crlf, expected: lf       (EditorConfig end_of_line  https://goo.gl/te3t0s)
        171:01 ❌ invalid indent style: tab, expected: space
                                                             (EditorConfig indent_style https://goo.gl/8Qkrbr)
        171:65 ❌ invalid newline: crlf, expected: lf       (EditorConfig end_of_line  https://goo.gl/te3t0s)
        172:01 ❌ invalid indent style: tab, expected: space
                                                             (EditorConfig indent_style https://goo.gl/8Qkrbr)
        172:82 ❌ invalid newline: crlf, expected: lf       (EditorConfig end_of_line  https://goo.gl/te3t0s)
        173:01 ❌ invalid indent style: tab, expected: space
                                                             (EditorConfig indent_style https://goo.gl/8Qkrbr)
        173:05 ❌ invalid newline: crlf, expected: lf       (EditorConfig end_of_line  https://goo.gl/te3t0s)
        174:01 ❌ invalid newline: crlf, expected: lf       (EditorConfig end_of_line  https://goo.gl/te3t0s)
        175:01 ❌ invalid indent style: tab, expected: space
                                                             (EditorConfig indent_style https://goo.gl/8Qkrbr)
        175:17 ❌ invalid newline: crlf, expected: lf       (EditorConfig end_of_line  https://goo.gl/te3t0s)
        176:02 ❌ invalid newline: crlf, expected: lf       (EditorConfig end_of_line  https://goo.gl/te3t0s)
        177:01 ❌ invalid newline: crlf, expected: lf       (EditorConfig end_of_line  https://goo.gl/te3t0s)
        178:46 ❌ invalid newline: crlf, expected: lf       (EditorConfig end_of_line  https://goo.gl/te3t0s)
        179:28 ❌ invalid newline: crlf, expected: lf       (EditorConfig end_of_line  https://goo.gl/te3t0s)
        180:52 ❌ invalid newline: crlf, expected: lf       (EditorConfig end_of_line  https://goo.gl/te3t0s)
        181:38 ❌ invalid newline: crlf, expected: lf       (EditorConfig end_of_line  https://goo.gl/te3t0s)
    Error: Command failed: npm run eclint:windows
        at checkExecSyncError (child_process.js:790:11)
        at Object.execSync (child_process.js:863:15)
        at Object.<anonymous> (C:\dev\tape\node_modules\npm-run-posix-or-windows\bin\cli.js:18:19)
        at Module._compile (internal/modules/cjs/loader.js:1085:14)
        at Object.Module._extensions..js (internal/modules/cjs/loader.js:1114:10)
        at Module.load (internal/modules/cjs/loader.js:950:32)
        at Function.Module._load (internal/modules/cjs/loader.js:790:12)
        at Function.executeUserEntryPoint [as runMain] (internal/modules/run_main.js:76:12)
        at internal/main/run_main_module.js:17:47 {
      status: 4294967295,
      signal: null,
      output: [ null, null, null ],
      pid: 5244,
      stdout: null,
      stderr: null
    }
    
    opened by 0xorial 5
  • README syntax highlighting

    README syntax highlighting

    • shconsole as these are shell sessions on the console and not shell scripts. This syntax highlighting, especially with the stdout being reduced in emphasis, reads more clearly
    • All console blocks now start with $ instead of most of them
    • js on a few missing blocks
    opened by toastal 0
  • Looking for a tap reporter

    Looking for a tap reporter

    I'm looking for a tap reporter that will give me output similar to ava. I.e. it concatanetes all the test names into one long string and displays either a green tick or cross next to it.

    opened by avin-kavish 4
Owner
James Halliday
James Halliday
☕️ simple, flexible, fun javascript test framework for node.js & the browser

☕️ Simple, flexible, fun JavaScript test framework for Node.js & The Browser ☕️ Links Documentation Release Notes / History / Changes Code of Conduct

Mocha 21.8k Nov 23, 2022
Node.js test runner that lets you develop with confidence 🚀

AVA is a test runner for Node.js with a concise API, detailed error output, embrace of new language features and process isolation that lets you devel

AVA 20.1k Nov 29, 2022
Test runner based on Tape and Browserify

prova Node & Browser Test runner based on Tape and Browserify. Screencasts: node.gif, browser.gif, both.gif, headless browser Slides: slides.com/azer/

Azer Koçulu 335 Oct 28, 2022
Cypress Playback is a plugin and a set of commands that allows Cypress to automatically record responses to network requests made during a test run.

Cypress Playback ?? Automatically record and playback HTTP requests made in Cypress tests. Cypress Playback is a plugin and a set of commands that all

O’Reilly Media, Inc. 4 May 3, 2022
E2E test framework for Angular apps

Protractor Protractor is an end-to-end test framework for Angular and AngularJS applications. Protractor is a Node.js program built on top of WebDrive

Angular 8.8k Nov 27, 2022
Politik Test

Politik Test Netlify Live Installation and Setup Instructions Clone down this repository. You will need node and npm installed globally on your machin

Yavuz Selim Şerifoğlu 6 Jun 13, 2021
A Node.js tool to automate end-to-end web testing.

A Node.js tool to automate end-to-end web testing. Write tests in JS or TypeScript, run them and view results. Homepage • Documentation • FAQ • Suppor

Developer Express Inc. 9.5k Nov 24, 2022
blanket.js is a simple code coverage library for javascript. Designed to be easy to install and use, for both browser and nodejs.

Blanket.js A seamless JavaScript code coverage library. FYI: Please note that this repo is not actively maintained If you're looking for a more active

Alex Seville 1.4k Nov 8, 2022
Playwright is a framework for Web Testing and Automation. It allows testing Chromium, Firefox and WebKit with a single API.

?? Playwright Documentation | API reference Playwright is a framework for Web Testing and Automation. It allows testing Chromium, Firefox and WebKit w

Microsoft 44.8k Nov 25, 2022
JSCover is a JavaScript Code Coverage Tool that measures line, branch and function coverage

JSCover - A JavaScript code coverage measurement tool. JSCover is an easy-to-use JavaScript code coverage measuring tool. It is an enhanced version of

null 392 Nov 20, 2022
A quickstart AWS Lambda function code generator. Downloads a template function code file, test harness file, sample SAM deffiniation and appropriate file structure.

Welcome to function-stencil ?? A quickstart AWS Lambda function code generator. Downloads a template function code file, test harness file, sample SAM

Ben Smith 21 Jun 20, 2022
Brittle TAP test framework

brittle tap à la mode A fullstack TAP test runner built for modern times. API Initializers To create a test the exported test method can be used in a

David Mark Clements 70 Nov 21, 2022
A simple tap test runner that can be used by any javascript interpreter.

just-tap A simple tap test runner that can be used in any client/server javascript app. Installation npm install --save-dev just-tap Usage import cre

Mark Wylde 58 Nov 7, 2022
An API for producing and validating ActivityPub objects.

ActivityHelper A library that exports an API for producing and validating ActivityPub objects. In a federated system bound together by protocols, it's

Diana Thayer 6 May 2, 2022
Full dynamic tool kit that is capable of deobfuscating and producing a javascript representation of Shape's Virtual Machine obfuscation

Shape Security Decompiler Tool-Kit This tool kit is capable of dynamically deobfuscating all versions of shape security's virtual machine interpreter

null 23 Nov 22, 2022
Grupprojekt för kurserna 'Javascript med Ramverk' och 'Agil Utveckling'

JavaScript-med-Ramverk-Laboration-3 Grupprojektet för kurserna Javascript med Ramverk och Agil Utveckling. Utvecklingsguide För information om hur utv

Svante Jonsson IT-Högskolan 3 May 18, 2022
Hemsida för personer i Sverige som kan och vill erbjuda boende till människor på flykt

Getting Started with Create React App This project was bootstrapped with Create React App. Available Scripts In the project directory, you can run: np

null 4 May 3, 2022
Kurs-repo för kursen Webbserver och Databaser

Webbserver och databaser This repository is meant for CME students to access exercises and codealongs that happen throughout the course. I hope you wi

null 13 Jul 1, 2022
Javascript client for Sanity. Works in node.js and modern browsers (older browsers needs a Promise polyfill).

@sanity/client Javascript client for Sanity. Works in node.js and modern browsers (older browsers needs a Promise polyfill). Requirements Sanity Clien

Sanity 24 Nov 4, 2022