Package detail

@power-doctest/markdown

azu1.8kMIT5.3.4

A Markdown parser for power-doctest.

doctest, javascript, markdown

readme

power-doctest Actions Status: test

A monorepo for power-doctest.

power-doctest is a project that provide doctest system for JavaScript.

Features

  • Run Comments as Assertions
  • Support JavaScript, Markdown Code Block, Asciidoctor Code Block
  • Control doctest behavior from comments

Packages

power-doctest

power-doctest is consisted of two parts.

  • Comment Assertion Syntax
  • Doctest Control Annotation

Comment Assertion Syntax

You can write following comment in your JavaScript code. These comment will be canistered to assertion.

Syntax Transformed
1; // => 2 assert.strictEqual(1, 2)
console.log(1); // => 2 assert.strictEqual(1, 2)
a; // => b assert.deepStrictEqual(a, b)
[1, 2, 3]; // => [3, 4, 5] assert.deepStrictEqual([1, 2, 3], [3, 4, 5])
console.log({ a: 1 }): // => { b: 2 } assert.deepStrictEqual({ a: 1 }, { b: 2 })
throw new Error("message"); // => Error: "message" assert.throws(function() {throw new Error("message"); });"
Promise.resolve(1); // Resolve: 2 Promise.resolve(Promise.resolve(1)).then(v => { assert.strictEqual(1, 2) })
Promise.reject(1); // Reject: 2 assert.rejects(Promise.reject(1))

For more details, see comment-to-assert.

Doctest Control Annotation

Doctest Control Annotation is defined in Language specific plugin. For more details, see following package's README.

Recipes

Doctest JavaScript Code

Use @power-doctest/tester and @power-doctest/javascript in Mocha.

import { test } from "@power-doctest/tester";
import { parse } from "@power-doctest/javascript";
const globby = require("globby");
const fs = require("fs");
const path = require("path");
// doctest for source/**/*.js
describe("doctest:js", function() {
    const sourceDir = path.join(__dirname, "..", "source");
    const files = globby.sync([
        `${sourceDir}/**/*.js`,
        `!${sourceDir}/**/node_modules{,/**}`
    ]);
    files.forEach(filePath => {
        const normalizeFilePath = filePath.replace(sourceDir, "");
        it(`doctest:js ${normalizeFilePath}`, function() {
            const content = fs.readFileSync(filePath, "utf-8");
            const parsedResults = parse({
                content,
                filePath
            });
            const parsedCode = parsedResults[0];
            return test(parsedCode).catch(error => {
                // Stack Trace like
                console.error(`StrictEvalError: strict eval is failed
    at strictEval (${filePath}:1:1)`);
                return Promise.reject(error);
            });
        });
    });
});

Example

Doctest JavaScript Code in Markdown

Use @power-doctest/tester and @power-doctest/markdown in Mocha.

import { test } from "@power-doctest/tester";
import { parse } from "@power-doctest/markdown";
const globby = require("globby");
const fs = require("fs");
const path = require("path");
const transform = (code) => {
    return code; // you need pre transform for the code if needed.
};
// doctest for source/**/*.md
describe("doctest:md", function() {
    const sourceDir = path.join(__dirname, "..", "source");
    const files = globby.sync([
        `${sourceDir}/**/*.md`,
        `!${sourceDir}/**/node_modules{,/**}`,
    ]);
    files.forEach(filePath => {
        const normalizeFilePath = filePath.replace(sourceDir, "");
        describe(`${normalizeFilePath}`, function() {
            const content = fs.readFileSync(filePath, "utf-8");
            const parsedCodes = parse({
                filePath,
                content
            });
            // try to eval
            const dirName = path.dirname(filePath).split(path.sep).pop();
            parsedCodes.forEach((parsedCode, index) => {
                const codeValue = parsedCode.code;
                const testCaseName = codeValue.slice(0, 32).replace(/[\r\n]/g, "_");
                it(dirName + ": " + testCaseName, function() {
                    return test({
                        ...parsedCode,
                        code: transform(parsedCode.code)
                    }, {
                        defaultDoctestRunnerOptions: {
                            // Default timeout: 2sec
                            timeout: 1000 * 2
                        }
                    }).catch(error => {
                        const filePathLineColumn = `${error.fileName}:${error.lineNumber}:${error.columnNumber}`;
                        console.error(`Markdown Doctest is failed
  at ${filePathLineColumn}

----------
${codeValue}
----------
`);
                        return Promise.reject(error);
                    });
                });
            });
        });
    });
});

Example

Doctest JavaScript in Asciidoctor

Use @power-doctest/tester and @power-doctest/asciidoctor in Mocha.

const { test } = require("@power-doctest/tester");
const { parse } = require("@power-doctest/asciidoctor");
const globby = require("globby");
const fs = require("fs");
const path = require("path");
// Avoid "do not support nested sections" Error
// Replace Header with Dummy text
const replaceDummyHeader = (content) => {
    return content.split("\n").map(line => {
        return line.replace(/^(=+)/g, (all, match) => {
            return "♪".repeat(match.length);
        });
    }).join("\n");
};
// doctest for source/**/*.adoc
describe("doctest:adoc", function () {
    const sourceDir = path.join(__dirname, "..", "source");
    const files = globby.sync([
        `${sourceDir}/**/*.adoc`,
        `!**/node_modules{,/**}`,
    ]);
    files.forEach(filePath => {
        const normalizeFilePath = filePath.replace(sourceDir, "");
        describe(`${normalizeFilePath}`, function () {
            const content = fs.readFileSync(filePath, "utf-8");
            const parsedCodes = parse({
                filePath,
                content: replaceDummyHeader(content)
            });
            console.log("parsedCodes", parsedCodes);
            // try to eval
            const dirName = path.dirname(filePath).split(path.sep).pop();
            parsedCodes.forEach((parsedCode, index) => {
                const codeValue = parsedCode.code;
                const testCaseName = codeValue.slice(0, 32).replace(/[\r\n]/g, "_");
                it(dirName + ": " + testCaseName, function () {
                    return test(parsedCode).catch(error => {
                        const filePathLineColumn = `${error.fileName}:${error.lineNumber}:${error.columnNumber}`;
                        console.error(`Asciidoc Doctest is failed
  at ${filePathLineColumn}

----------
${codeValue}
----------
`);
                        return Promise.reject(error);
                    });
                });
            });
        });
    });
});

Example

Development

Require pnpm

Install project

pnpm install
pnpm boostrap

Build

pnpm run build

Test

pnpm test

Release: use npm

npm run versionup
# GH_TOKEN="${GITHUB_TOKEN}" npm run versionup:patch --create-release=github
# prepare release note
npm relase

changelog

Change Log

All notable changes to this project will be documented in this file. See Conventional Commits for commit guidelines.

5.3.3 (2023-07-15)

Bug Fixes

5.3.2 (2022-05-05)

Bug Fixes

5.3.1 (2022-01-05)

Bug Fixes

  • deps: Update babel dependencies to ^7.16.7 (#28) (92d68cd)

5.3.0 (2021-05-07)

Features

5.2.2 (2020-06-20)

Note: Version bump only for package root

5.2.1 (2020-06-20)

Bug Fixes

  • power-doctest: fix error Cannot access 'totalAssertionCount' before initialization (10b7e73)

5.2.0 (2020-06-20)

Bug Fixes

Features

  • power-doctest: support ES2020 (ef624cb)

5.1.3 (2019-09-01)

Bug Fixes

  • power-doctest: allow built-in modules (cd6a4ed)

5.1.2 (2019-09-01)

Bug Fixes

  • core: use module instead of file path (bf65ac3)
  • power-assert: fix README test (e6af70e)

5.1.1 (2019-09-01)

Bug Fixes

  • cli: rename @power-doctest/cli to power-doctest (1c5060b)

5.1.0 (2019-09-01)

Features

  • cli: support asciidoctor (4db0637)

5.0.1 (2019-09-01)

Note: Version bump only for package root

5.0.0 (2019-09-01)

Note: Version bump only for package root

4.1.2 (2019-09-01)

Note: Version bump only for package root

4.1.1 (2019-09-01)

Bug Fixes

  • asciidoctor: compute position form string match (7eedda1)

4.1.0 (2019-09-01)

Features

  • tester: add defaultDoctestRunnerOptions (3bcf8ed)

4.0.1 (2019-09-01)

Bug Fixes

4.0.0 (2019-09-01)

Bug Fixes

  • power-doctest: add try-catch (5e5e8da)
  • tester: remove preTransform options (c5fb80a)
  • fix tester requireMock (a4e0574)

Features

  • @power-doctest/asciidoctor: add asciidoctor parser (ffb3a9e)
  • @power-doctest/javascript: add package (79927f5)
  • cli: add CLI (4bb1f7a)
  • tester: add default state (9fc3aa8)

3.3.3 (2019-08-25)

Bug Fixes

  • power-doctest: support Node.js 8 (b2d63f0)

3.3.2 (2019-08-25)

Bug Fixes

  • power-doctest: disable babelrc (d0a49b7)

3.3.1 (2019-08-25)

Bug Fixes

  • power-doctest: disable config file (f610d2d)

3.3.0 (2019-08-25)

Features

  • power-doctes: support power-assert again (09632ec)

3.2.1 (2019-08-25)

Bug Fixes

  • power-doctest/javascript: add filepath to run method (40678bb)

3.2.0 (2019-08-25)

Features

  • markdown: support runCodeBlockNode function (657b1ed)

3.1.1 (2019-08-25)

Bug Fixes

  • @power-doctest/javascript: release event listener (47d4c04)

3.1.0 (2019-08-25)

Bug Fixes

  • @power-doctest/javascript: support No assertion code (b00d3e3)

Features

  • @power-doctest/markdown: add lineNumber and columnNumber (bbc3186)

3.0.1 (2019-08-25)

Bug Fixes

  • @power-doctest: fix main (c2baef9)

3.0.0 (2019-08-25)

Bug Fixes

  • assert: fix handling of undefined or null (#3) (daed652)
  • ast: generate code with comment (d950164)
  • error: can handle `// => *Error (628a26a)
  • example: run example then exit 0 (c1348bc)
  • example: use disableSourceMap option (04c1e32)
  • lib: fix TypeScript definition (d32b124)
  • node: console.assert does not throw on Node.js 10 (6a9a74a)
  • npm: fix npm test script (a90ed9f)
  • test: remove undefined method (333c81c)
  • util: #toAST return AST not Node (308dbe8)
  • utils: add missing extractionBody (3bca03e)
  • array and directive string expression support (1a6efcd)
  • update node types (6ad0195)

Features

  • @power-doctest/javascript: support preTransform options (20eacb1)
  • @power-doctest/markdown: add @power-doctest/markdown (d2c8014)
  • assert: use strictEqual and deepStrictEqual (#9) (85a4bed), closes #6
  • ast: implement replace comment with assert (8925ada)
  • ast: support asyncCallbackName option (#11) (a24e4ec)
  • ast: support block comment (16f3cb2)
  • ast: support console api (e1c7067)
  • bin: add cli (73701eb)
  • comment: Support object literal as comment (9c138c7)
  • error: support handling Error: message (33f1b70)
  • support context, console option (b868904)
  • example: add example (de07e6a)
  • lib: Resolve: and Reject: support (1169542)
  • options: support assertBeforeCallbackName and assertAfterCallbackName (2466b17)
  • src: support Promise comment (#4) (b7882b5)
  • util: add #wrapNode function (36baa81)
  • support NaN assert (117daeb)

BREAKING CHANGES

  • assert: assertion is strict by default

2.2.0 (2019-08-24)

Features

  • support assertBeforeCallbackName and assertAfterCallbackName options (32f5ade)

2.1.0 (2019-01-19)

Features

  • option: support asyncCallbackName option (0516ad5)

2.0.0 (2019-01-19)

Features

1.4.0 (2018-10-14)

Features

  • depsO: upgrade ast-source@3.0 (5bc4f71)

1.3.2 (2018-02-27)

Bug Fixes

  • pacakge: fix build script (6c498ab)

1.3.1 (2017-11-23)

1.3.0 (2017-09-10)

Features

1.2.0 (2016-11-19)

Features

  • npm: update to espower@2.0 (41afee6)

1.1.1 (2016-07-29)

Bug Fixes

1.1.0 (2016-06-16)

Features

  • ast: support module type (7e63fa0)

1.0.1 (2015-08-09)

Bug Fixes

  • bin: fix path to lib (2f99c82)
  • npm: add esprima to dependencies (e5529f3)

1.0.0 (2015-08-09)

Bug Fixes

Features

  • cli: add cli for power-doctest (d9e1a7c)

0.3.4 (2014-08-12)

0.3.3 (2014-07-21)

Bug Fixes

  • show pass when assert failed (402fe98)

0.3.2 (2014-03-22)

Bug Fixes

  • memory-leak: remove listeners when finished (4b98531)

0.3.0 (2014-03-22)

Bug Fixes

  • error: add domain error handling (324b87e)
  • reporter: change default reporter. (c3720d6), closes #8
  • travis: update node.js on travis (606f268)

0.2.5 (2014-03-02)

0.2.4 (2014-03-02)

Features

  • option: add extractConsole option (b7a76dc)

0.2.1 (2013-12-08)

0.2.0 (2013-12-08)

0.1.4 (2013-12-04)

0.1.3 (2013-12-04)

0.1.2 (2013-12-04)

0.1.1 (2013-12-04)

0.1.0 (2013-12-01)

0.0.1 (2013-12-01)