UNPKG

dts-jest

Version:

A preprocessor for Jest to snapshot test TypeScript declaration (.d.ts) files

114 lines (113 loc) 4.99 kB
"use strict"; 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; }()))(); }