dts-jest
Version:
A preprocessor for Jest to snapshot test TypeScript declaration (.d.ts) files
114 lines (113 loc) • 4.99 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", { value: true });
exports.remap_cli = void 0;
var fs = require("fs");
var globby = require("globby");
var intersection = require("lodash.intersection");
var make_dir = require("make-dir");
var path = require("path");
var remap_1 = require("./remap");
var create_message_1 = require("./utils/create-message");
var create_typescript_info_1 = require("./utils/create-typescript-info");
var load_typescript_1 = require("./utils/load-typescript");
var remap_cli = function (args) {
// istanbul ignore next
var globs = args._, _a = args.check, check = _a === void 0 ? false : _a, _b = args.listDifferent, list_different = _b === void 0 ? false : _b, output_directory = args.outDir, rename_template = args.rename, typescript_id = args.typescript;
var source_filenames = globby.sync(globs, { absolute: true });
var logger = create_logger();
if (source_filenames.length === 0) {
logger.log('There is no matched file.');
return;
}
var invalid_filenames = get_invalid_filenames(source_filenames, output_directory, rename_template);
if (invalid_filenames.length !== 0) {
throw new Error((0, create_message_1.create_message)('Input and output filename cannot be the same:', invalid_filenames, 'Consider adjusting option `--outDir` or `--rename` to redirect output'));
}
if (!check && output_directory !== undefined) {
make_dir.sync(output_directory);
}
var _c = (0, load_typescript_1.load_typescript)(typescript_id), ts = _c.typescript, typescript_path = _c.typescript_path;
logger.log((0, create_typescript_info_1.create_typescript_info)(ts.version, typescript_path));
var differents = [];
source_filenames.forEach(function (source_filename) {
var source_content = fs.readFileSync(source_filename, 'utf8');
var snapshot_filename = get_snapshot_filename(source_filename);
var snapshot_content = fs.readFileSync(snapshot_filename, 'utf8');
var output_filename = get_output_filename(source_filename, output_directory, rename_template);
var output_content = (0, remap_1.remap)(source_content, snapshot_content, {
typescript: ts,
source_filename: source_filename,
});
if (check || list_different) {
var target_content = void 0;
try {
target_content = fs.readFileSync(output_filename, 'utf8');
}
catch (e) {
target_content = undefined;
}
if (output_content !== target_content) {
differents.push({ source_filename: source_filename, output_filename: output_filename });
}
}
if (!check) {
fs.writeFileSync(output_filename, output_content);
}
});
if (differents.length === 0) {
return;
}
var erorr_message = 'Difference(s) detected';
if (check && !list_different) {
throw new Error(erorr_message);
}
var message = (0, create_message_1.create_message)('Listing files that their target content is different from output content:', differents.map(function (different) {
return "".concat(different.source_filename, " -> ").concat(different.output_filename);
}), check ? erorr_message : undefined);
if (check) {
throw new Error(message);
}
logger.log(message);
};
exports.remap_cli = remap_cli;
function get_invalid_filenames(filenames, output_directory, rename_template) {
return intersection(filenames, filenames.map(function (filepath) {
return get_output_filename(filepath, output_directory, rename_template);
}));
}
function get_output_filename(filename, output_directory, rename_template) {
var redirect_dirpath = output_directory === undefined
? path.dirname(filename)
: path.resolve(output_directory);
var renamed_filename = rename_filename(filename, rename_template);
return path.join(redirect_dirpath, renamed_filename);
}
function rename_filename(filename, template) {
var base_filename = path.basename(filename);
if (template === undefined) {
return base_filename;
}
var extname = path.extname(filename);
var basename = path.basename(filename, extname);
return template
.replace('{{filename}}', base_filename)
.replace('{{basename}}', basename)
.replace('{{extname}}', extname.slice(1) /* remove leading dot */);
}
function get_snapshot_filename(filename) {
return path.join(path.dirname(filename), '__snapshots__', "".concat(path.basename(filename), ".snap"));
}
function create_logger() {
return new (/** @class */ (function () {
function class_1() {
this.counter = 0;
}
class_1.prototype.log = function (message) {
if (this.counter++ !== 0) {
console.log('');
}
console.log(message);
};
return class_1;
}()))();
}