πŸš€ Big News: Socket Acquires Coana to Bring Reachability Analysis to Every Appsec Team.Learn more β†’
Socket
Book a DemoInstallSign in
Socket

generate-jsdoc-example-tests

Package Overview
Dependencies
Maintainers
1
Versions
8
Alerts
File Explorer

Advanced tools

Socket logo

Install Socket

Detect and block malicious and high-risk dependencies

Install

generate-jsdoc-example-tests - npm Package Compare versions

Comparing version

to
0.1.1

2

lib/app.d.ts

@@ -15,3 +15,3 @@ export interface GenerateOptions {

/**
* Only generate test files for examples including one of the given strings
* Keywords the example body must contain to be included in the generated tests.
* @default ['assert', 'expect']

@@ -18,0 +18,0 @@ */

@@ -1,17 +0,1 @@

var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
return new (P || (P = Promise))(function (resolve, reject) {
function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
step((generator = generator.apply(thisArg, _arguments || [])).next());
});
};
var __asyncValues = (this && this.__asyncValues) || function (o) {
if (!Symbol.asyncIterator) throw new TypeError("Symbol.asyncIterator is not defined.");
var m = o[Symbol.asyncIterator], i;
return m ? m.call(o) : (o = typeof __values === "function" ? __values(o) : o[Symbol.iterator](), i = {}, verb("next"), verb("throw"), verb("return"), i[Symbol.asyncIterator] = function () { return this; }, i);
function verb(n) { i[n] = o[n] && function (v) { return new Promise(function (resolve, reject) { v = o[n](v), settle(resolve, reject, v.done, v.value); }); }; }
function settle(resolve, reject, d, v) { Promise.resolve(v).then(function(v) { resolve({ value: v, done: d }); }, reject); }
};
import { glob, readFile, writeFile } from 'node:fs/promises';

@@ -54,79 +38,69 @@ import * as path from "node:path";

*/
export function generateTests(pattern, providedOptions) {
return __awaiter(this, void 0, void 0, function* () {
var _a, e_1, _b, _c;
const options = Object.assign(Object.assign({}, defaultOptions), providedOptions);
try {
for (var _d = true, _e = __asyncValues(glob(pattern)), _f; _f = yield _e.next(), _a = _f.done, !_a; _d = true) {
_c = _f.value;
_d = false;
const fileName = _c;
if (fileName.includes(options.testFileExtension))
continue;
yield generateTestFile(fileName, options);
}
}
catch (e_1_1) { e_1 = { error: e_1_1 }; }
finally {
try {
if (!_d && !_a && (_b = _e.return)) yield _b.call(_e);
}
finally { if (e_1) throw e_1.error; }
}
});
export async function generateTests(pattern, providedOptions) {
const options = { ...defaultOptions, ...providedOptions };
for await (const fileName of glob(pattern)) {
if (fileName.includes(options.testFileExtension))
continue;
await generateTestFile(fileName, options);
}
}
function generateTestFile(filePath, options) {
return __awaiter(this, void 0, void 0, function* () {
const { ext, name, dir } = path.parse(filePath);
let kind;
switch (ext.toUpperCase()) {
case ".TS":
kind = ts.ScriptKind.TS;
break;
case ".JS":
kind = ts.ScriptKind.JS;
break;
case ".TSX":
case ".JSX":
console.log("currently unsupported tsx ", filePath);
return;
default:
return;
}
const source = ts.createSourceFile(filePath, yield readFile(filePath, 'utf-8'), ts.ScriptTarget.Latest, false, kind);
const foundComments = extractComments(source);
if (foundComments.length === 0) {
// console.debug(`${filePath} comments not found`)
async function generateTestFile(filePath, options) {
const { ext, name, dir } = path.parse(filePath);
let kind;
switch (ext.toUpperCase()) {
case ".TS":
kind = ts.ScriptKind.TS;
break;
case ".JS":
kind = ts.ScriptKind.JS;
break;
case ".TSX":
case ".JSX":
console.log("currently unsupported tsx ", filePath);
return;
}
const { imports, testBody } = foundComments
.map((f) => {
return { docNode: parseTSDoc(f), node: f.compilerNode };
})
.map(({ docNode, node }) => {
return collectExampleCodes(node, source, docNode, options);
})
.flat()
.map((example) => {
return Object.assign(Object.assign({}, example), { exampleSource: ts.createSourceFile(example.name, example.code, ts.ScriptTarget.Latest, false, kind) });
})
.reduce((acc, { /* source, */ exampleSource, name }) => {
const { imports, body } = splitImport(exampleSource);
// const fileName = path.relative(process.cwd(), source.fileName)
const funcName = name || `Example ${++acc.counter}`;
const testBody = wrapTestFunction(funcName, body, options);
return Object.assign(Object.assign({}, acc), { imports: [...acc.imports, ...imports], testBody: [...acc.testBody, testBody] });
}, { imports: [], testBody: [], counter: 0 });
const mergedImports = mergeImports(imports);
if (testBody.length === 0)
return; // do not generate an empty test file.
const ast = ts.factory.updateSourceFile(ts.createSourceFile(filePath + options.testFileExtension, "", ts.ScriptTarget.Latest, false, kind), [...mergedImports, ...testBody]);
const banner = `// DO NOT EDIT: Code generated by "generate-jsdoc-example-tests".`;
if (options.headers.length > 0)
options.headers.push(''); // add empty line.
const header = [banner, ...options.headers].join("\n");
const printed = yield print(ast, options);
yield writeFile(`${dir}/${name}${options.testFileExtension}${ext}`, `${header}\n${printed}`);
});
default:
return;
}
const source = ts.createSourceFile(filePath, await readFile(filePath, 'utf-8'), ts.ScriptTarget.Latest, false, kind);
const foundComments = extractComments(source);
if (foundComments.length === 0) {
// console.debug(`${filePath} comments not found`)
return;
}
const { imports, testBody } = foundComments
.map((f) => {
return { docNode: parseTSDoc(f), node: f.compilerNode };
})
.map(({ docNode, node }) => {
return collectExampleCodes(node, source, docNode, options);
})
.flat()
.map((example) => {
return {
...example,
exampleSource: ts.createSourceFile(example.name, example.code, ts.ScriptTarget.Latest, false, kind),
};
})
.reduce((acc, { /* source, */ exampleSource, name }) => {
const { imports, body } = splitImport(exampleSource);
// const fileName = path.relative(process.cwd(), source.fileName)
const funcName = name || `Example ${++acc.counter}`;
const testBody = wrapTestFunction(funcName, body, options);
return {
...acc,
imports: [...acc.imports, ...imports],
testBody: [...acc.testBody, testBody],
};
}, { imports: [], testBody: [], counter: 0 });
const mergedImports = mergeImports(imports);
if (testBody.length === 0)
return; // do not generate an empty test file.
const ast = ts.factory.updateSourceFile(ts.createSourceFile(filePath + options.testFileExtension, "", ts.ScriptTarget.Latest, false, kind), [...mergedImports, ...testBody]);
const banner = `// DO NOT EDIT: Code generated by "generate-jsdoc-example-tests".`;
if (options.headers.length > 0)
options.headers.push(''); // add empty line.
const header = [banner, ...options.headers].join("\n");
const printed = await print(ast, options);
await writeFile(`${dir}/${name}${options.testFileExtension}${ext}`, `${header}\n${printed}`);
}
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXBwLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vc3JjL2FwcC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7O0FBQUEsT0FBTyxFQUFFLElBQUksRUFBRSxRQUFRLEVBQUUsU0FBUyxFQUFFLE1BQU0sa0JBQWtCLENBQUE7QUFDNUQsT0FBTyxLQUFLLElBQUksTUFBTSxXQUFXLENBQUE7QUFDakMsT0FBTyxLQUFLLEVBQUUsTUFBTSxZQUFZLENBQUE7QUFDaEMsT0FBTyxFQUFFLGdCQUFnQixFQUFFLE1BQU0sa0JBQWtCLENBQUE7QUFDbkQsT0FBTyxFQUFFLFlBQVksRUFBRSxXQUFXLEVBQUUsTUFBTSxhQUFhLENBQUE7QUFDdkQsT0FBTyxFQUFFLG1CQUFtQixFQUFFLGVBQWUsRUFBRSxVQUFVLEVBQUUsTUFBTSxhQUFhLENBQUE7QUFDOUUsT0FBTyxFQUFFLEtBQUssRUFBRSxNQUFNLGNBQWMsQ0FBQTtBQXFCcEMsTUFBTSxjQUFjLEdBQW9CO0lBQ3RDLGdCQUFnQixFQUFFLE1BQU07SUFDeEIsaUJBQWlCLEVBQUUsZUFBZTtJQUNsQyxPQUFPLEVBQUUsRUFBRTtJQUNYLHdCQUF3QixFQUFFLENBQUMsUUFBUSxFQUFFLFFBQVEsQ0FBQztDQUMvQyxDQUFBO0FBRUQ7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBdUJHO0FBQ0gsTUFBTSxVQUFnQixhQUFhLENBQUMsT0FBTyxFQUFFLGVBQTBDOzs7UUFDckYsTUFBTSxPQUFPLG1DQUFRLGNBQWMsR0FBSyxlQUFlLENBQUUsQ0FBQTs7WUFDekQsS0FBNkIsZUFBQSxLQUFBLGNBQUEsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFBLElBQUEsc0RBQUUsQ0FBQztnQkFBaEIsY0FBYTtnQkFBYixXQUFhO2dCQUEvQixNQUFNLFFBQVEsS0FBQSxDQUFBO2dCQUN2QixJQUFJLFFBQVEsQ0FBQyxRQUFRLENBQUMsT0FBTyxDQUFDLGlCQUFpQixDQUFDO29CQUFFLFNBQVE7Z0JB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
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXBwLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vc3JjL2FwcC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsSUFBSSxFQUFFLFFBQVEsRUFBRSxTQUFTLEVBQUUsTUFBTSxrQkFBa0IsQ0FBQTtBQUM1RCxPQUFPLEtBQUssSUFBSSxNQUFNLFdBQVcsQ0FBQTtBQUNqQyxPQUFPLEtBQUssRUFBRSxNQUFNLFlBQVksQ0FBQTtBQUNoQyxPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSxrQkFBa0IsQ0FBQTtBQUNuRCxPQUFPLEVBQUUsWUFBWSxFQUFFLFdBQVcsRUFBRSxNQUFNLGFBQWEsQ0FBQTtBQUN2RCxPQUFPLEVBQUUsbUJBQW1CLEVBQUUsZUFBZSxFQUFFLFVBQVUsRUFBRSxNQUFNLGFBQWEsQ0FBQTtBQUM5RSxPQUFPLEVBQUUsS0FBSyxFQUFFLE1BQU0sY0FBYyxDQUFBO0FBcUJwQyxNQUFNLGNBQWMsR0FBb0I7SUFDdEMsZ0JBQWdCLEVBQUUsTUFBTTtJQUN4QixpQkFBaUIsRUFBRSxlQUFlO0lBQ2xDLE9BQU8sRUFBRSxFQUFFO0lBQ1gsd0JBQXdCLEVBQUUsQ0FBQyxRQUFRLEVBQUUsUUFBUSxDQUFDO0NBQy9DLENBQUE7QUFFRDs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7R0F1Qkc7QUFDSCxNQUFNLENBQUMsS0FBSyxVQUFVLGFBQWEsQ0FBQyxPQUFPLEVBQUUsZUFBMEM7SUFDckYsTUFBTSxPQUFPLEdBQUcsRUFBRSxHQUFHLGNBQWMsRUFBRSxHQUFHLGVBQWUsRUFBRSxDQUFBO0lBQ3pELElBQUksS0FBSyxFQUFFLE1BQU0sUUFBUSxJQUFJLElBQUksQ0FBQyxPQUFPLENBQUMsRUFBRSxDQUFDO1FBQzNDLElBQUksUUFBUSxDQUFDLFFBQVEsQ0FBQyxPQUFPLENBQUMsaUJBQWlCLENBQUM7WUFBRSxTQUFRO1FBQzFELE1BQU0sZ0JBQWdCLENBQUMsUUFBUSxFQUFFLE9BQU8sQ0FBQyxDQUFBO0lBQzND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
#!/usr/bin/env node
var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
return new (P || (P = Promise))(function (resolve, reject) {
function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
step((generator = generator.apply(thisArg, _arguments || [])).next());
});
};
import { cac } from 'cac';

@@ -28,3 +19,3 @@ import { readFileSync } from 'node:fs';

.option("--include-example-containing <strings>", 'Only generate test files for examples including one of the given strings', { type: [String], default: ['assert', 'expect'] })
.action((pattern, options) => __awaiter(void 0, void 0, void 0, function* () {
.action(async (pattern, options) => {
if (!pattern) {

@@ -37,3 +28,3 @@ console.error('Error: Missing required glob pattern');

try {
yield generateTests(pattern, {
await generateTests(pattern, {
headers: options.header,

@@ -48,5 +39,5 @@ includeExampleContaining: options.includeExampleContaining,

}
}));
});
cli.help();
cli.parse();
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2xpLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vc3JjL2NsaS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7O0FBQ0EsT0FBTyxFQUFFLEdBQUcsRUFBRSxNQUFNLEtBQUssQ0FBQTtBQUN6QixPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0sU0FBUyxDQUFBO0FBQ3RDLE9BQU8sS0FBSyxJQUFJLE1BQU0sV0FBVyxDQUFBO0FBQ2pDLE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBTSxVQUFVLENBQUE7QUFDeEMsT0FBTyxFQUFFLGFBQWEsRUFBRSxNQUFNLFVBQVUsQ0FBQTtBQUV4QyxNQUFNLGVBQWUsR0FBRyxhQUFhLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQTtBQUN0RCxNQUFNLGVBQWUsR0FBRyxJQUFJLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsZUFBZSxDQUFDLEVBQUUsaUJBQWlCLENBQUMsQ0FBQTtBQUN0RixNQUFNLEdBQUcsR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLFlBQVksQ0FBQyxlQUFlLEVBQUUsT0FBTyxDQUFDLENBQUMsQ0FBQTtBQUU5RCxNQUFNLEdBQUcsR0FBRyxHQUFHLENBQUMsU0FBUyxDQUFDLENBQUE7QUFFMUIsR0FBRztLQUNBLE9BQU8sQ0FBQyxHQUFHLENBQUMsT0FBTyxDQUFDO0tBQ3BCLE9BQU8sQ0FBQyxXQUFXLEVBQUUsb0NBQW9DLENBQUM7S0FDMUQsS0FBSyxDQUFDLHdCQUF3QixDQUFDO0tBQy9CLE1BQU0sQ0FDTCw2QkFBNkIsRUFDN0IseUNBQXlDLEVBQ3pDLEVBQUUsT0FBTyxFQUFFLE1BQU0sRUFBRSxDQUNwQjtLQUNBLE1BQU0sQ0FDTCw2QkFBNkIsRUFDN0IsZ0RBQWdELEVBQ2hELEVBQUUsT0FBTyxFQUFFLGVBQWUsRUFBRSxDQUM3QjtLQUNBLE1BQU0sQ0FDTCxrQkFBa0IsRUFDbEIsNkdBQTZHLEVBQzdHLEVBQUUsSUFBSSxFQUFFLENBQUMsTUFBTSxDQUFDLEVBQUUsT0FBTyxFQUFFLEVBQUUsRUFBRSxDQUNoQztLQUNBLE1BQU0sQ0FDTCx3Q0FBd0MsRUFDeEMsMEVBQTBFLEVBQzFFLEVBQUUsSUFBSSxFQUFFLENBQUMsTUFBTSxDQUFDLEVBQUUsT0FBTyxFQUFFLENBQUMsUUFBUSxFQUFFLFFBQVEsQ0FBQyxFQUFFLENBQ2xEO0tBQ0EsTUFBTSxDQUFDLENBQU8sT0FBTyxFQUFFLE9BQU8sRUFBRSxFQUFFO0lBQ2pDLElBQUksQ0FBQyxPQUFPLEVBQUUsQ0FBQztRQUNiLE9BQU8sQ0FBQyxLQUFLLENBQUMsc0NBQXNDLENBQUMsQ0FBQTtRQUNyRCxHQUFHLENBQUMsVUFBVSxFQUFFLENBQUE7UUFDaEIsT0FBTyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQTtJQUNqQixDQUFDO0lBQ0QsT0FBTyxDQUFDLEtBQUssQ0FBQyxzQ0FBc0MsQ0FBQyxDQUFBO0lBQ3JELElBQUksQ0FBQztRQUNILE1BQU0sYUFBYSxDQUFDLE9BQU8sRUFBRTtZQUMzQixPQUFPLEVBQUUsT0FBTyxDQUFDLE1BQU07WUFDdkIsd0JBQXdCLEVBQUUsT0FBTyxDQUFDLHdCQUF3QjtZQUMxRCxpQkFBaUIsRUFBRSxPQUFPLENBQUMsaUJBQWlCO1lBQzVDLGdCQUFnQixFQUFFLE9BQU8sQ0FBQyxnQkFBZ0I7U0FDM0MsQ0FBQyxDQUFBO0lBQ0osQ0FBQztJQUFDLE9BQU8sS0FBSyxFQUFFLENBQUM7UUFDZixPQUFPLENBQUMsS0FBSyxDQUFDLEtBQUssQ0FBQyxDQUFBO0lBQ3RCLENBQUM7QUFDSCxDQUFDLENBQUEsQ0FBQyxDQUFBO0FBRUosR0FBRyxDQUFDLElBQUksRUFBRSxDQUFBO0FBQ1YsR0FBRyxDQUFDLEtBQUssRUFBRSxDQUFBIn0=
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2xpLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vc3JjL2NsaS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiO0FBQ0EsT0FBTyxFQUFFLEdBQUcsRUFBRSxNQUFNLEtBQUssQ0FBQTtBQUN6QixPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0sU0FBUyxDQUFBO0FBQ3RDLE9BQU8sS0FBSyxJQUFJLE1BQU0sV0FBVyxDQUFBO0FBQ2pDLE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBTSxVQUFVLENBQUE7QUFDeEMsT0FBTyxFQUFFLGFBQWEsRUFBRSxNQUFNLFVBQVUsQ0FBQTtBQUV4QyxNQUFNLGVBQWUsR0FBRyxhQUFhLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQTtBQUN0RCxNQUFNLGVBQWUsR0FBRyxJQUFJLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsZUFBZSxDQUFDLEVBQUUsaUJBQWlCLENBQUMsQ0FBQTtBQUN0RixNQUFNLEdBQUcsR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLFlBQVksQ0FBQyxlQUFlLEVBQUUsT0FBTyxDQUFDLENBQUMsQ0FBQTtBQUU5RCxNQUFNLEdBQUcsR0FBRyxHQUFHLENBQUMsU0FBUyxDQUFDLENBQUE7QUFFMUIsR0FBRztLQUNBLE9BQU8sQ0FBQyxHQUFHLENBQUMsT0FBTyxDQUFDO0tBQ3BCLE9BQU8sQ0FBQyxXQUFXLEVBQUUsb0NBQW9DLENBQUM7S0FDMUQsS0FBSyxDQUFDLHdCQUF3QixDQUFDO0tBQy9CLE1BQU0sQ0FDTCw2QkFBNkIsRUFDN0IseUNBQXlDLEVBQ3pDLEVBQUUsT0FBTyxFQUFFLE1BQU0sRUFBRSxDQUNwQjtLQUNBLE1BQU0sQ0FDTCw2QkFBNkIsRUFDN0IsZ0RBQWdELEVBQ2hELEVBQUUsT0FBTyxFQUFFLGVBQWUsRUFBRSxDQUM3QjtLQUNBLE1BQU0sQ0FDTCxrQkFBa0IsRUFDbEIsNkdBQTZHLEVBQzdHLEVBQUUsSUFBSSxFQUFFLENBQUMsTUFBTSxDQUFDLEVBQUUsT0FBTyxFQUFFLEVBQUUsRUFBRSxDQUNoQztLQUNBLE1BQU0sQ0FDTCx3Q0FBd0MsRUFDeEMsMEVBQTBFLEVBQzFFLEVBQUUsSUFBSSxFQUFFLENBQUMsTUFBTSxDQUFDLEVBQUUsT0FBTyxFQUFFLENBQUMsUUFBUSxFQUFFLFFBQVEsQ0FBQyxFQUFFLENBQ2xEO0tBQ0EsTUFBTSxDQUFDLEtBQUssRUFBRSxPQUFPLEVBQUUsT0FBTyxFQUFFLEVBQUU7SUFDakMsSUFBSSxDQUFDLE9BQU8sRUFBRSxDQUFDO1FBQ2IsT0FBTyxDQUFDLEtBQUssQ0FBQyxzQ0FBc0MsQ0FBQyxDQUFBO1FBQ3JELEdBQUcsQ0FBQyxVQUFVLEVBQUUsQ0FBQTtRQUNoQixPQUFPLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFBO0lBQ2pCLENBQUM7SUFDRCxPQUFPLENBQUMsS0FBSyxDQUFDLHNDQUFzQyxDQUFDLENBQUE7SUFDckQsSUFBSSxDQUFDO1FBQ0gsTUFBTSxhQUFhLENBQUMsT0FBTyxFQUFFO1lBQzNCLE9BQU8sRUFBRSxPQUFPLENBQUMsTUFBTTtZQUN2Qix3QkFBd0IsRUFBRSxPQUFPLENBQUMsd0JBQXdCO1lBQzFELGlCQUFpQixFQUFFLE9BQU8sQ0FBQyxpQkFBaUI7WUFDNUMsZ0JBQWdCLEVBQUUsT0FBTyxDQUFDLGdCQUFnQjtTQUMzQyxDQUFDLENBQUE7SUFDSixDQUFDO0lBQUMsT0FBTyxLQUFLLEVBQUUsQ0FBQztRQUNmLE9BQU8sQ0FBQyxLQUFLLENBQUMsS0FBSyxDQUFDLENBQUE7SUFDdEIsQ0FBQztBQUNILENBQUMsQ0FBQyxDQUFBO0FBRUosR0FBRyxDQUFDLElBQUksRUFBRSxDQUFBO0FBQ1YsR0FBRyxDQUFDLEtBQUssRUFBRSxDQUFBIn0=

@@ -20,5 +20,4 @@ import * as ts from "typescript";

const reduced = imports.reduce((acc, i) => {
var _a, _b;
if (ts.isNamedImports(i.importClause.namedBindings)) {
const moduleSpecifier = (_a = i === null || i === void 0 ? void 0 : i.moduleSpecifier) === null || _a === void 0 ? void 0 : _a.text;
const moduleSpecifier = i?.moduleSpecifier?.text;
if (!moduleSpecifier) {

@@ -34,3 +33,3 @@ return acc;

if (ts.isNamespaceImport(i.importClause.namedBindings)) {
const moduleSpecifier = (_b = i === null || i === void 0 ? void 0 : i.moduleSpecifier) === null || _b === void 0 ? void 0 : _b.text;
const moduleSpecifier = i?.moduleSpecifier?.text;
if (!moduleSpecifier) {

@@ -51,11 +50,12 @@ return acc;

const names = r.reduce((acc, i) => {
var _a, _b, _c;
const idents = ((_a = i.importClause) === null || _a === void 0 ? void 0 : _a.name)
const idents = i.importClause?.name
? unique([...acc.idents, i.importClause.name.escapedText])
: acc.idents;
const namedImports = (_b = i.importClause) === null || _b === void 0 ? void 0 : _b.namedBindings;
const namedImports = i.importClause?.namedBindings;
if (!namedImports) {
return Object.assign(Object.assign({}, acc), { idents });
return { ...acc, idents };
}
const specifiers = (_c = namedImports.elements) === null || _c === void 0 ? void 0 : _c.filter(e => e).map(s => {
const specifiers = namedImports.elements
?.filter(e => e)
.map(s => {
if (s.propertyName) {

@@ -85,2 +85,2 @@ return `${s.propertyName.text} as ${s.name.escapedText}`;

}
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW1wb3J0LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vc3JjL2ltcG9ydC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEtBQUssRUFBRSxNQUFNLFlBQVksQ0FBQTtBQUVoQyxNQUFNLFVBQVUsV0FBVyxDQUN6QixNQUFxQjtJQUVyQixNQUFNLE9BQU8sR0FBRyxFQUFpQyxDQUFDO0lBQ2xELE1BQU0sS0FBSyxHQUFHLEVBQXlCLENBQUM7SUFFeEMsTUFBTSxDQUFDLFVBQVUsQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLEVBQUU7UUFDL0IsSUFBSSxFQUFFLENBQUMsbUJBQW1CLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQztZQUNqQyxPQUFPLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDO1FBQ3JCLENBQUM7YUFBTSxDQUFDO1lBQ04sS0FBSyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUNuQixDQUFDO0lBQ0gsQ0FBQyxDQUFDLENBQUM7SUFFSCxPQUFPLEVBQUUsT0FBTyxFQUFFLElBQUksRUFBRSxLQUFLLEVBQUUsQ0FBQztBQUNsQyxDQUFDO0FBRUQsU0FBUyxNQUFNLENBQUksR0FBYTtJQUM5QixPQUFPLEtBQUssQ0FBQyxJQUFJLENBQUMsSUFBSSxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQztBQUNsQyxDQUFDO0FBRUQsTUFBTSxVQUFVLFlBQVksQ0FBQyxPQUErQjtJQUMxRCxNQUFNLE9BQU8sR0FBRyxPQUFPLENBQUMsTUFBTSxDQUM1QixDQUFDLEdBQUcsRUFBRSxDQUFDLEVBQUUsRUFBRTs7UUFDVCxJQUFJLEVBQUUsQ0FBQyxjQUFjLENBQUMsQ0FBQyxDQUFDLFlBQVksQ0FBQyxhQUFhLENBQUMsRUFBRSxDQUFDO1lBQ3BELE1BQU0sZUFBZSxHQUFHLE1BQUMsQ0FBQyxhQUFELENBQUMsdUJBQUQsQ0FBQyxDQUFFLGVBQW9DLDBDQUFFLElBQUksQ0FBQztZQUN2RSxJQUFJLENB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
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW1wb3J0LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vc3JjL2ltcG9ydC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEtBQUssRUFBRSxNQUFNLFlBQVksQ0FBQTtBQUVoQyxNQUFNLFVBQVUsV0FBVyxDQUN6QixNQUFxQjtJQUVyQixNQUFNLE9BQU8sR0FBRyxFQUFpQyxDQUFDO0lBQ2xELE1BQU0sS0FBSyxHQUFHLEVBQXlCLENBQUM7SUFFeEMsTUFBTSxDQUFDLFVBQVUsQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLEVBQUU7UUFDL0IsSUFBSSxFQUFFLENBQUMsbUJBQW1CLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQztZQUNqQyxPQUFPLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDO1FBQ3JCLENBQUM7YUFBTSxDQUFDO1lBQ04sS0FBSyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUNuQixDQUFDO0lBQ0gsQ0FBQyxDQUFDLENBQUM7SUFFSCxPQUFPLEVBQUUsT0FBTyxFQUFFLElBQUksRUFBRSxLQUFLLEVBQUUsQ0FBQztBQUNsQyxDQUFDO0FBRUQsU0FBUyxNQUFNLENBQUksR0FBYTtJQUM5QixPQUFPLEtBQUssQ0FBQyxJQUFJLENBQUMsSUFBSSxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQztBQUNsQyxDQUFDO0FBRUQsTUFBTSxVQUFVLFlBQVksQ0FBQyxPQUErQjtJQUMxRCxNQUFNLE9BQU8sR0FBRyxPQUFPLENBQUMsTUFBTSxDQUM1QixDQUFDLEdBQUcsRUFBRSxDQUFDLEVBQUUsRUFBRTtRQUNULElBQUksRUFBRSxDQUFDLGNBQWMsQ0FBQyxDQUFDLENBQUMsWUFBWSxDQUFDLGFBQWEsQ0FBQyxFQUFFLENBQUM7WUFDcEQsTUFBTSxlQUFlLEdBQUksQ0FBQyxFQUFFLGVBQW9DLEVBQUUsSUFBSSxDQUFDO1lBQ3ZFLElBQUksQ0FBQyxlQUFlLEVBQUUsQ0FBQztnQkFDckIsT0FB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

@@ -1,40 +0,30 @@

var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
return new (P || (P = Promise))(function (resolve, reject) {
function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
step((generator = generator.apply(thisArg, _arguments || [])).next());
});
};
import * as path from 'node:path';
import * as prettier from "prettier";
import * as ts from "typescript";
export function print(ast, options) {
return __awaiter(this, void 0, void 0, function* () {
const resultFile = ts.createSourceFile("result.ts", "", ts.ScriptTarget.Latest, false, ts.ScriptKind.TS);
const printer = ts.createPrinter({
newLine: ts.NewLineKind.LineFeed,
omitTrailingSemicolon: true,
});
const result = printer
.printNode(ts.EmitHint.Unspecified, ast, resultFile)
.replaceAll(`\n${options.testFunctionName}(`, `\n\n${options.testFunctionName}(`);
const prettierConfig = yield resolvePrettierConfig();
const formatted = yield prettier.format(result, Object.assign({ parser: "typescript" }, prettierConfig));
return formatted;
export async function print(ast, options) {
const resultFile = ts.createSourceFile("result.ts", "", ts.ScriptTarget.Latest, false, ts.ScriptKind.TS);
const printer = ts.createPrinter({
newLine: ts.NewLineKind.LineFeed,
omitTrailingSemicolon: true,
});
const result = printer
.printNode(ts.EmitHint.Unspecified, ast, resultFile)
.replaceAll(`\n${options.testFunctionName}(`, `\n\n${options.testFunctionName}(`);
const prettierConfig = await resolvePrettierConfig();
const formatted = await prettier.format(result, {
parser: "typescript",
...prettierConfig,
});
return formatted;
}
function resolvePrettierConfig() {
return __awaiter(this, void 0, void 0, function* () {
// NOTE: I am using readme instead of just `process.cwd()` because
// `prettier.resolveConfig` inspects the directory of a file, not the directory directly.
const pathOfReadme = path.resolve(process.cwd(), 'README.md');
const maybeConfig = yield prettier.resolveConfig(pathOfReadme);
return (maybeConfig !== null && maybeConfig !== void 0 ? maybeConfig : {
semi: false,
singleQuote: true,
});
async function resolvePrettierConfig() {
// NOTE: I am using readme instead of just `process.cwd()` because
// `prettier.resolveConfig` inspects the directory of a file, not the directory directly.
const pathOfReadme = path.resolve(process.cwd(), 'README.md');
const maybeConfig = await prettier.resolveConfig(pathOfReadme);
return (maybeConfig ?? {
semi: false,
singleQuote: true,
});
}
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicHJpbnRlci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uL3NyYy9wcmludGVyLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7Ozs7OztBQUFBLE9BQU8sS0FBSyxJQUFJLE1BQU0sV0FBVyxDQUFBO0FBQ2pDLE9BQU8sS0FBSyxRQUFRLE1BQU0sVUFBVSxDQUFBO0FBQ3BDLE9BQU8sS0FBSyxFQUFFLE1BQU0sWUFBWSxDQUFBO0FBR2hDLE1BQU0sVUFBZ0IsS0FBSyxDQUN6QixHQUFZLEVBQ1osT0FBa0Q7O1FBRWxELE1BQU0sVUFBVSxHQUFHLEVBQUUsQ0FBQyxnQkFBZ0IsQ0FDcEMsV0FBVyxFQUNYLEVBQUUsRUFDRixFQUFFLENBQUMsWUFBWSxDQUFDLE1BQU0sRUFDdEIsS0FBSyxFQUNMLEVBQUUsQ0FBQyxVQUFVLENBQUMsRUFBRSxDQUNqQixDQUFDO1FBQ0YsTUFBTSxPQUFPLEdBQUcsRUFBRSxDQUFDLGFBQWEsQ0FBQztZQUMvQixPQUFPLEVBQUUsRUFBRSxDQUFDLFdBQVcsQ0FBQyxRQUFRO1lBQ2hDLHFCQUFxQixFQUFFLElBQUk7U0FDNUIsQ0FBQyxDQUFDO1FBQ0gsTUFBTSxNQUFNLEdBQUcsT0FBTzthQUNuQixTQUFTLENBQUMsRUFBRSxDQUFDLFFBQVEsQ0FBQyxXQUFXLEVBQUUsR0FBRyxFQUFFLFVBQVUsQ0FBQzthQUNuRCxVQUFVLENBQ1QsS0FBSyxPQUFPLENBQUMsZ0JBQWdCLEdBQUcsRUFDaEMsT0FBTyxPQUFPLENBQUMsZ0JBQWdCLEdBQUcsQ0FDbkMsQ0FBQztRQUVKLE1BQU0sY0FBYyxHQUFHLE1BQU0scUJBQXFCLEVBQUUsQ0FBQztRQUNyRCxNQUFNLFNBQVMsR0FBRyxNQUFNLFFBQVEsQ0FBQyxNQUFNLENBQUMsTUFBTSxrQkFDNUMsTUFBTSxFQUFFLFlBQVksSUFDakIsY0FBYyxFQUNqQixDQUFDO1FBQ0gsT0FBTyxTQUFTLENBQUM7SUFDbkIsQ0FBQztDQUFBO0FBRUQsU0FBZSxxQkFBcUI7O1FBQ2xDLGtFQUFrRTtRQUNsRSx5RkFBeUY7UUFDekYsTUFBTSxZQUFZLEdBQUcsSUFBSSxDQUFDLE9BQU8sQ0FBQyxPQUFPLENBQUMsR0FBRyxFQUFFLEVBQUUsV0FBVyxDQUFDLENBQUE7UUFDN0QsTUFBTSxXQUFXLEdBQUcsTUFBTSxRQUFRLENBQUMsYUFBYSxDQUFDLFlBQVksQ0FBQyxDQUFDO1FBRS9ELE9BQU8sQ0FDTCxXQUFXLGFBQVgsV0FBVyxjQUFYLFdBQVcsR0FBSTtZQUNiLElBQUksRUFBRSxLQUFLO1lBQ1gsV0FBVyxFQUFFLElBQUk7U0FDbEIsQ0FDRixDQUFDO0lBQ0osQ0FBQztDQUFBIn0=
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicHJpbnRlci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uL3NyYy9wcmludGVyLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sS0FBSyxJQUFJLE1BQU0sV0FBVyxDQUFBO0FBQ2pDLE9BQU8sS0FBSyxRQUFRLE1BQU0sVUFBVSxDQUFBO0FBQ3BDLE9BQU8sS0FBSyxFQUFFLE1BQU0sWUFBWSxDQUFBO0FBR2hDLE1BQU0sQ0FBQyxLQUFLLFVBQVUsS0FBSyxDQUN6QixHQUFZLEVBQ1osT0FBa0Q7SUFFbEQsTUFBTSxVQUFVLEdBQUcsRUFBRSxDQUFDLGdCQUFnQixDQUNwQyxXQUFXLEVBQ1gsRUFBRSxFQUNGLEVBQUUsQ0FBQyxZQUFZLENBQUMsTUFBTSxFQUN0QixLQUFLLEVBQ0wsRUFBRSxDQUFDLFVBQVUsQ0FBQyxFQUFFLENBQ2pCLENBQUM7SUFDRixNQUFNLE9BQU8sR0FBRyxFQUFFLENBQUMsYUFBYSxDQUFDO1FBQy9CLE9BQU8sRUFBRSxFQUFFLENBQUMsV0FBVyxDQUFDLFFBQVE7UUFDaEMscUJBQXFCLEVBQUUsSUFBSTtLQUM1QixDQUFDLENBQUM7SUFDSCxNQUFNLE1BQU0sR0FBRyxPQUFPO1NBQ25CLFNBQVMsQ0FBQyxFQUFFLENBQUMsUUFBUSxDQUFDLFdBQVcsRUFBRSxHQUFHLEVBQUUsVUFBVSxDQUFDO1NBQ25ELFVBQVUsQ0FDVCxLQUFLLE9BQU8sQ0FBQyxnQkFBZ0IsR0FBRyxFQUNoQyxPQUFPLE9BQU8sQ0FBQyxnQkFBZ0IsR0FBRyxDQUNuQyxDQUFDO0lBRUosTUFBTSxjQUFjLEdBQUcsTUFBTSxxQkFBcUIsRUFBRSxDQUFDO0lBQ3JELE1BQU0sU0FBUyxHQUFHLE1BQU0sUUFBUSxDQUFDLE1BQU0sQ0FBQyxNQUFNLEVBQUU7UUFDOUMsTUFBTSxFQUFFLFlBQVk7UUFDcEIsR0FBRyxjQUFjO0tBQ2xCLENBQUMsQ0FBQztJQUNILE9BQU8sU0FBUyxDQUFDO0FBQ25CLENBQUM7QUFFRCxLQUFLLFVBQVUscUJBQXFCO0lBQ2xDLGtFQUFrRTtJQUNsRSx5RkFBeUY7SUFDekYsTUFBTSxZQUFZLEdBQUcsSUFBSSxDQUFDLE9BQU8sQ0FBQyxPQUFPLENBQUMsR0FBRyxFQUFFLEVBQUUsV0FBVyxDQUFDLENBQUE7SUFDN0QsTUFBTSxXQUFXLEdBQUcsTUFBTSxRQUFRLENBQUMsYUFBYSxDQUFDLFlBQVksQ0FBQyxDQUFDO0lBRS9ELE9BQU8sQ0FDTCxXQUFXLElBQUk7UUFDYixJQUFJLEVBQUUsS0FBSztRQUNYLFdBQVcsRUFBRSxJQUFJO0tBQ2xCLENBQ0YsQ0FBQztBQUNKLENBQUMifQ==

@@ -12,2 +12,3 @@ import * as ts from "typescript";

class Inspector {
inspector;
constructor(inspector) {

@@ -32,2 +33,4 @@ this.inspector = inspector;

class Filter {
filterKind;
callback;
constructor(kind, inspector) {

@@ -91,2 +94,2 @@ this.filterKind = kind;

}
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidXRpbC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uL3NyYy91dGlsLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUNBLE9BQU8sS0FBSyxFQUFFLE1BQU0sWUFBWSxDQUFDO0FBTWpDLE1BQU0sVUFBVSxJQUFJLENBQUMsT0FBaUIsRUFBRSxJQUFtQjtJQUN6RCxNQUFNLElBQUksR0FBRyxPQUFPLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxDQUFDO0lBQ2pDLElBQUksQ0FBQyxJQUFJLEVBQUUsQ0FBQztRQUNWLE9BQU87SUFDVCxDQUFDO0lBRUQsS0FBSyxNQUFNLENBQUMsSUFBSSxJQUFJLENBQUMsYUFBYSxFQUFFLEVBQUUsQ0FBQztRQUNyQyxJQUFJLENBQUMsSUFBSSxFQUFFLENBQUMsQ0FBQyxDQUFDO0lBQ2hCLENBQUM7QUFDSCxDQUFDO0FBSUQsTUFBTSxTQUFTO0lBR2IsWUFBWSxTQUFtQztRQUM3QyxJQUFJLENBQUMsU0FBUyxHQUFHLFNBQVMsQ0FBQztJQUM3QixDQUFDO0lBRUQsS0FBSyxDQUFDLElBQW1CO1FBQ3ZCLElBQUksSUFBSSxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDO1lBQ3pCLE9BQU8sSUFBSSxDQUFDO1FBQ2QsQ0FBQztRQUNELE9BQU8sSUFBSSxDQUFDO0lBQ2QsQ0FBQztDQUNGO0FBRUQsTUFBTSxVQUFVLE9BQU8sQ0FBQyxJQUFtQixFQUFFLFFBQXdCO0lBQ25FLE1BQU0sU0FBUyxHQUFHLElBQUksU0FBUyxDQUFDLFFBQVEsQ0FBQyxDQUFDO0lBQzFDLElBQUksQ0FBQyxTQUFTLEVBQUUsSUFBSSxDQUFDLENBQUM7QUFDeEIsQ0FBQztBQXNERCxNQUFNLFVBQVUsVUFBVSxDQUN4QixJQUFtQixFQUNuQixJQUFPLEVBQ1AsUUFBZ0M7SUFFaEMsTUFBTSxDQUFDLEdBQUcsSUFBSSxNQUFNLENBQUMsSUFBSSxFQUFFLFFBQVEsQ0FBQyxDQUFDO0lBQ3JDLElBQUksQ0FBQyxDQUFDLEVBQUUsSUFBSSxDQUFDLENBQUM7QUFDaEIsQ0FBQztBQUVELE1BQU0sTUFBTTtJQUlWLFlBQVksSUFBTyxFQUFFLFNBQWlDO1FBQ3BELElBQUksQ0FBQyxVQUFVLEdBQUcsSUFBSSxDQUFDO1FBQ3ZCLElBQUksQ0FBQyxRQUFRLEdBQUcsU0FBUyxDQUFDO0lBQzVCLENBQUM7SUFFRCxLQUFLLENBQUMsSUFBbUI7UUFDdkIsSUFBSSxJQUFJLENBQUMsSUFBSSxLQUFLLElBQUksQ0FBQyxVQUFVLEVBQUUsQ0FBQztZQUNsQyxJQUFJLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxJQUFtQixDQUFDLEVBQUUsQ0FBQztnQkFDeEMsT0FBTyxJQUFJLENBQUM7WUFDZCxDQUFDO1FBQ0gsQ0FBQztRQUNELE9BQU8sSUFBSSxDQUFDO0lBQ2QsQ0FBQztDQUNGO0FBRUQ7Ozs7Ozs7R0FPRztBQUNILE1BQU0sVUFBVSxpQkFBaUIsQ0FBQyxJQUFtQjtJQUNuRCxPQUFPLENBQ0wsSUFBSSxLQUFLLEVBQUUsQ0FBQyxVQUFVLENBQUMsYUFBYTtRQUNwQyxJQUFJLEtBQUssRUFBRSxDQUFDLFVBQVUsQ0FBQyxjQUFjO1FBQ3JDLElBQUksS0FBSyxFQUFFLENBQUMsVUFBVSxDQUFDLGdCQUFnQjtRQUN2QyxJQUFJLEtBQUssRUFBRSxDQUFDLFVBQVUsQ0FBQyxlQUFlO1FBQ3RDLElBQUksS0FBSyxFQUFFLENBQUMsVUFBVSxDQUFDLFdBQVc7UUFDbEMsSUFBSSxLQUFLLEVBQUUsQ0FBQyxVQUFVLENBQUMsZUFBZTtRQUN0QyxJQUFJLEtBQUssRUFBRSxDQUFDLFVBQVUsQ0FBQyxVQUFVO1FBQ2pDLElBQUksS0FBSyxFQUFFLENBQUMsVUFBVSxDQUFDLGVBQWU7UUFDdEMsSUFBSSxLQUFLLEVBQUUsQ0FBQyxVQUFVLENBQUMsbUJBQW1CO1FBQzFDLElBQUksS0FBSyxFQUFFLENBQUMsVUFBVSxDQUFDLGtCQUFrQjtRQUN6QyxJQUFJLEtBQUssRUFBRSxDQUFDLFVBQVUsQ0FBQyxXQUFXO1FBQ2xDLElBQUksS0FBSyxFQUFFLENBQUMsVUFBVSxDQUFDLFlBQVk7UUFDbkMsSUFBSSxLQUFLLEVBQUUsQ0FBQyxVQUFVLENBQUMsdUJBQXVCO1FBQzlDLElBQUksS0FBSyxFQUFFLENBQUMsVUFBVSxDQUFDLGVBQWU7UUFDdEMsSUFBSSxLQUFLLEVBQUUsQ0FBQyxVQUFVLENBQUMsb0JBQW9CO1FBQzNDLElBQUksS0FBSyxFQUFFLENBQUMsVUFBVSxDQUFDLFlBQVk7UUFDbkMsSUFBSSxLQUFLLEVBQUUsQ0FBQyxVQUFVLENBQUMsaUJBQWlCO1FBQ3hDLElBQUksS0FBSyxFQUFFLENBQUMsVUFBVSxDQUFDLGVBQWU7UUFDdEMsSUFBSSxLQUFLLEVBQUUsQ0FBQyxVQUFVLENBQUMsaUJBQWlCO1FBQ3hDLElBQUksS0FBSyxFQUFFLENBQUMsVUFBVSxDQUFDLDBCQUEwQjtRQUNqRCxJQUFJLEtBQUssRUFBRSxDQUFDLFVBQVUsQ0FBQyxlQUFlO1FBQ3RDLElBQUksS0FBSyxFQUFFLENBQUMsVUFBVSxDQUFDLFNBQVM7UUFDaEMsSUFBSSxLQUFLLEVBQUUsQ0FBQyxVQUFVLENBQUMsa0JBQWtCO1FBQ3pDLElBQUksS0FBSyxFQUFFLENBQUMsVUFBVSxDQUFDLG1CQUFtQjtRQUMxQyxJQUFJLEtBQUssRUFBRSxDQUFDLFVBQVUsQ0FBQyxpQkFBaUI7UUFDeEMsSUFBSSxLQUFLLEVBQUUsQ0FBQyxVQUFVLENBQUMsV0FBVztRQUNsQyxJQUFJLEtBQUssRUFBRSxDQUFDLFVBQVUsQ0FBQywyQkFBMkI7UUFDbEQsSUFBSSxLQUFLLEVBQUUsQ0FBQyxVQUFVLENBQUMsb0JBQW9CO1FBQzNDLElBQUksS0FBSyxFQUFFLENBQUMsVUFBVSxDQUFDLGFBQWE7UUFDcEMsSUFBSSxLQUFLLEVBQUUsQ0FBQyxVQUFVLENBQUMsbUJBQW1CO1FBQzFDLElBQUksS0FBSyxFQUFFLENBQUMsVUFBVSxDQUFDLGVBQWU7UUFDdEMsSUFBSSxLQUFLLEVBQUUsQ0FBQyxVQUFVLENBQUMsZ0JBQWdCO1FBQ3ZDLElBQUksS0FBSyxFQUFFLENBQUMsVUFBVSxDQUFDLGdCQUFnQjtRQUN2QyxJQUFJLEtBQUssRUFBRSxDQUFDLFVBQVUsQ0FBQyxpQkFBaUIsQ0FBQyw0R0FBNEc7S0FDdEosQ0FBQztBQUNKLENBQUMifQ==
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidXRpbC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uL3NyYy91dGlsLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUNBLE9BQU8sS0FBSyxFQUFFLE1BQU0sWUFBWSxDQUFDO0FBTWpDLE1BQU0sVUFBVSxJQUFJLENBQUMsT0FBaUIsRUFBRSxJQUFtQjtJQUN6RCxNQUFNLElBQUksR0FBRyxPQUFPLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxDQUFDO0lBQ2pDLElBQUksQ0FBQyxJQUFJLEVBQUUsQ0FBQztRQUNWLE9BQU87SUFDVCxDQUFDO0lBRUQsS0FBSyxNQUFNLENBQUMsSUFBSSxJQUFJLENBQUMsYUFBYSxFQUFFLEVBQUUsQ0FBQztRQUNyQyxJQUFJLENBQUMsSUFBSSxFQUFFLENBQUMsQ0FBQyxDQUFDO0lBQ2hCLENBQUM7QUFDSCxDQUFDO0FBSUQsTUFBTSxTQUFTO0lBQ0ksU0FBUyxDQUEyQjtJQUVyRCxZQUFZLFNBQW1DO1FBQzdDLElBQUksQ0FBQyxTQUFTLEdBQUcsU0FBUyxDQUFDO0lBQzdCLENBQUM7SUFFRCxLQUFLLENBQUMsSUFBbUI7UUFDdkIsSUFBSSxJQUFJLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUM7WUFDekIsT0FBTyxJQUFJLENBQUM7UUFDZCxDQUFDO1FBQ0QsT0FBTyxJQUFJLENBQUM7SUFDZCxDQUFDO0NBQ0Y7QUFFRCxNQUFNLFVBQVUsT0FBTyxDQUFDLElBQW1CLEVBQUUsUUFBd0I7SUFDbkUsTUFBTSxTQUFTLEdBQUcsSUFBSSxTQUFTLENBQUMsUUFBUSxDQUFDLENBQUM7SUFDMUMsSUFBSSxDQUFDLFNBQVMsRUFBRSxJQUFJLENBQUMsQ0FBQztBQUN4QixDQUFDO0FBc0RELE1BQU0sVUFBVSxVQUFVLENBQ3hCLElBQW1CLEVBQ25CLElBQU8sRUFDUCxRQUFnQztJQUVoQyxNQUFNLENBQUMsR0FBRyxJQUFJLE1BQU0sQ0FBQyxJQUFJLEVBQUUsUUFBUSxDQUFDLENBQUM7SUFDckMs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
{
"name": "generate-jsdoc-example-tests",
"version": "0.1.0",
"version": "0.1.1",
"main": "./lib/app.js",

@@ -10,4 +10,7 @@ "types": "./lib/app.d.ts",

},
"files": [
"lib/**/*"
],
"license": "Apache-2.0",
"repository": "SacDeNoeuds/generate-jsdoc-example-tests",
"repository": "https://github.com/SacDeNoeuds/generate-jsdoc-example-tests",
"author": {

@@ -17,2 +20,12 @@ "name": "SacDeNoeuds",

},
"keywords": [
"documentation",
"generate",
"jsdoc",
"example",
"test",
"vitest",
"jest",
"tsdoc"
],
"scripts": {

@@ -22,4 +35,5 @@ "test": "vitest src/__tests__",

"prepack": "npm run build",
"postbuild": "rimraf ./lib/__tests__",
"clean": "rimraf ./lib/*",
"try": "npm run build && chmod +x ./lib/cli.js && ./lib/cli.js './examples/*'"
"debug": "npm run build && chmod +x ./lib/cli.js && ./lib/cli.js './examples/*'"
},

@@ -26,0 +40,0 @@ "devDependencies": {

# generate-jsdoc-example-tests
Generate test files from your JSDoc @example comments. See [vitest](#vitest) cookbook and adapt it to your test runner 😊.
Generate test files from your JSDoc @example comments. See configuration details in the [vitest](#vitest) cookbook and adapt it to your favorite test runner 😊.
**It offers you the certainty that your JSDoc @example are valid.**
## Why
## Why – TL;DR
JSDoc is an awesome documentation tool with great IDE support providing intellisense on-demand. Pure love.
Full announcement [here](https://sacdenoeuds.github.io/generate-jsdoc-example-tests/2025-04-announcement.html).
Yet it is easy for the code examples to go out-of-sync with the implementation. This library bridges this gap.
I love documenting my functions using JSDoc examples – imo example are the best doc one can have! – but I was tired of my doc getting obsolete. And tests don't provide in-IDE doc, so I figured: why not reconcile the 2 ?<br>
Write JSDoc examples, and generate tests from them…
1. To make sure examples never go obsolete 😍.
2. … And to test my stuff like I would anyway, you sillies πŸ€“
I do not aim at writing a test runner though, this is a whole area of expertise and lots of people do an incredible job at it, offering goodies like coverage and various test reporters.
So here comes… generate-jsdoc-example-tests πŸŽ‰.
**I aim at integrating with test runners.**
<details>
<summary>Prior art</summary>
- [tsdoc-testify](https://github.com/akito0107/tsdoc-testify) – see [Thanks](#thanks). Very old and unmaintained project, an excellent base to build this one 😁.
- [jsdoc-spec](https://github.com/AT-290690/jsdoc-spec) – both an example parser _and_ the test runner, without the test runner goodies.
- [ts-docs](https://ts-docs.github.io/ts-docs/pages/Guides/Documentation%20Tests.html) – same, on the test side, it is both an example parser _and_ a test runner, without the test runner goodies. Stuck to TypeScript v4.
</details>
## Installation

@@ -21,4 +32,174 @@

npm i -D generate-jsdoc-example-tests
# or directly via npx without installation:
npx generate-jsdoc-example-tests
```
## Demo
You document your functions, methods, constants & classes, for coworkers or your future self, you get tests for free:
<details>
<summary>Documenting a function</summary>
```ts
// src/date-formatter.ts
/**
* @example
* ```ts
* import { formatDateYear } from './date-formatter'
*
* expect(formatDateYear(new Date('2026-01-01')).toBe('2026')
* ```
*/
export function formatDateYear(date: Date) {…}
```
Generate tests:
```sh
npx gen-jet 'src/**' \
--header 'import { expect, test } from "vitest"' \
--test-file-extension '.example.test' # do not provide the `.ts` or `.js`
```
Generated test:
```ts
// src/date-formatter.example.test.ts
// DO NOT EDIT …
import { expect, test } from 'vitest' // the provided header
import { formatDateYear } from './date-formatter'
test('Example 1', () => {
expect(formatDateYear(new Date('2026-01-01'))).toBe('2026')
})
```
</details>
<details>
<summary>Documenting a class</summary>
```ts
// src/date-formatter.ts
class DateFormatter {
/**
* @example
* ```ts
* import { DateFormatter } from './date-formatter'
*
* const formatter = new DateFormatter()
* expect(formatter.formatYear(new Date('2026-01-01')).toBe('2026')
* ```
*/
formatYear(date: Date) {…}
}
```
Generate tests:
```sh
npx gen-jet 'src/**' \
--header 'import { expect, test } from "vitest"' \
--test-file-extension '.example.test' # do not provide the `.ts` or `.js`
```
Generated test:
```ts
// src/date-formatter.example.test.ts
// DO NOT EDIT …
import { expect, test } from 'vitest' // the provided header
import { DateFormatter } from './date-formatter'
test('Example 1', () => {
const formatter = new DateFormatter()
expect(formatter.formatYear(new Date('2026-01-01'))).toBe('2026')
})
```
</details>
<details>
<summary>Documenting a constant</summary>
```ts
// src/date-formatter.ts
/**
* @example
* ```ts
* import { formatDate, yearFormat } from './date-formatter'
*
* const date = new Date('2026-01-01')
* expect(formatDate(date, yearFormat)).toBe('2026')
* ```
*/
export const yearFormat = 'YYYY'
export const formatDate = (date: Date, format: string): string => {…}
```
Generate tests:
```sh
npx gen-jet 'src/**' \
--header 'import { expect, test } from "vitest"' \
--test-file-extension '.example.test' # do not provide the `.ts` or `.js`
```
Generated test:
```ts
// src/date-formatter.example.test.ts
// DO NOT EDIT …
import { expect, test } from 'vitest' // the provided header
import { formatDate, yearFormat } from './date-formatter'
test('Example 1', () => {
const date = new Date('2026-01-01')
expect(formatDate(date, yearFormat)).toBe('2026')
})
```
</details>
<details>
<summary>Documenting an interface / a type</summary>
```ts
// src/date-formatter.ts
interface DateFormatter {
/**
* @example
* ```ts
* import { makeDateFormatter } from './date-formatter'
*
* const formatter = makeDateFormatter()
* expect(formatter.formatYear(new Date('2026-01-01')).toBe('2026')
* ```
*/
formatYear(date: Date): string
}
export const makeDateFormatter = (): DateFormatter => ({
formatYear: () => {…},
})
```
Generate tests:
```sh
npx gen-jet 'src/**' \
--header 'import { expect, test } from "vitest"' \
--test-file-extension '.example.test' # do not provide the `.ts` or `.js`
```
Generated test:
```ts
// src/date-formatter.example.test.ts
// DO NOT EDIT …
import { expect, test } from 'vitest' // the provided header
import { makeDateFormatter } from './date-formatter'
test('Example 1', () => {
const formatter = makeDateFormatter()
expect(formatter.formatYear(new Date('2026-01-01'))).toBe('2026')
})
```
</details>
## Usage

@@ -28,19 +209,17 @@

`gen-jet`: gen = `generate` + j = `jsdoc` + e = `example` + t = `tests`.
`gen-jet`: gen = **gen**erate ; jet = **J**sdoc + **E**xample + **T**ests.
```sh
$ npx gen-jet --help
Usage:
$ gen-jet npx gen-jet './src/**'
$ npx gen-jet 'src/**'
Commands:
[pattern] Generate tests from JSDoc @example
# Usage with options:
$ npx gen-jet 'src/**' \
--test-file-extension '.example.test' \
--test-function-name 'it' \
--header 'import { it, expect } from "vitest | jest | whatever"'
--header 'import { myGlobalImport } from "~/some-global-stuff"'
--include-example-containing expect,assert,assertStrict
Options:
--test-function-name [name] Name of test function (default: "test") (default: test)
--test-file-extension [ext] Test file extension (default: ".example.test") (default: .example.test)
--header [texts] Header texts to include in test files, ie: --header 'import { test } from "vitest"' --header 'import …' (default: )
--include-example-containing <strings> Only generate test files for examples including one of the given strings (default: assert,expect)
-v, --version Display version number
-h, --help Display this message
# For a full CLI usage, checkout
$ gen-jet --help
```

@@ -51,3 +230,3 @@

```ts
import { generateTests } from 'generate-jsdoc-example-tests'
import { generateTests, type GenerateOptions } from 'generate-jsdoc-example-tests'

@@ -58,3 +237,5 @@ generateTests('./src/**')

generateTests('./src/**', { ...options })
const myOptions: GenerateOptions = { … }
generateTests('./src/**', myOptions)
.then(() => console.info('tests generated'))

@@ -75,6 +256,8 @@ .catch(console.error)

generateTests('./src/**', {
testFunctionName: 'it',
testFileExtension: '.generated.test', // default is '.example.test' ; do not provide `.ts` or `.js` !
testFunctionName: 'it', // default is 'test'
headers: ['import { it, expect } from "vitest"'],
includeExampleContaining: ['expect'],
testFileExtension: '.generated.test', // do not provide `.ts` or `.js`
// keywords the JSDoc @example body must contain to be included in the generated tests.
includeExampleContaining: ['expect'], // default is ['assert', 'expect']
})

@@ -85,28 +268,4 @@ .then(() => console.info('tests generated'))

Then you can write examples like this:
```ts
/**
* @example
* ```ts
* import { myFn } from './my-fn'
*
* expect(myFn()).toBe(true)
* ```
*/
export const myFn = () => true
```
## FAQ
It will the generate the following file:
```ts
import { it, expect } from 'vitest'
import { myFn } from './my-fn'
it('myFn', () => {
expect(myFn()).toBe(true)
})
```
## Options
### Which tests are included ?

@@ -120,3 +279,3 @@

/**
* @example This one is included
* @example This one is included because it contains `expect`
* ```ts

@@ -126,5 +285,8 @@ * import { myFn } from './my-fn'

* ```
* @example this one is omitted
* {@skipTest}
* @example This is omitted because there is no `expect` or `assert`
* ```ts
* myFn('toto') // invalid arg.
* ```
* @example this one is explicitly omitted {@skipTest}
* ```ts
* import { myFn } from './my-fn'

@@ -151,3 +313,3 @@ * expect(myFn()).toBe(false)

* ```
* import * as assert from "assert";
* import assert from "assert";
* import { sum } from "./sample";

@@ -164,3 +326,3 @@ *

```ts
import * as assert from "assert";
import assert from "assert";
import { sum } from "./sample";

@@ -184,1 +346,12 @@

This project is licensed under the Apache License 2.0 License - see the [LICENSE](LICENSE) file for details
## Contributing
First of all, thank you deeply if you want to participate.
Please visit the [contributing](./CONTRIBUTING.md) section for a detailed guide (getting started, roadmap).
> If you like the project but don't have time to contribute, all good ! There are other ways to support the project and show your appreciation, which we would also be very happy about:
> - Star the project
> - Tweet about it
> - Refer this project in your project’s readme
> - Mention the project at local meetups and tell your friends/colleagues