@nestia/core
Version:
Super-fast validation decorators of NestJS
80 lines • 3.42 kB
JavaScript
;
var __importDefault = (this && this.__importDefault) || function (mod) {
return (mod && mod.__esModule) ? mod : { "default": mod };
};
Object.defineProperty(exports, "__esModule", { value: true });
exports.FileTransformer = void 0;
const typescript_1 = __importDefault(require("typescript"));
const ImportProgrammer_1 = require("typia/lib/programmers/ImportProgrammer");
const NodeTransformer_1 = require("./NodeTransformer");
var FileTransformer;
(function (FileTransformer) {
FileTransformer.transform = (context) => (transformer) => (file) => {
if (file.isDeclarationFile)
return file;
const importer = new ImportProgrammer_1.ImportProgrammer({
internalPrefix: "nestia_core_transform",
});
file = typescript_1.default.visitEachChild(file, (node) => iterate_node({
context: Object.assign(Object.assign({}, context), { transformer,
importer }),
file,
node,
}), transformer);
const index = find_import_injection_index(file);
return typescript_1.default.factory.updateSourceFile(file, [
...file.statements.slice(0, index),
...importer.toStatements(),
...file.statements.slice(index),
], false, file.referencedFiles, file.typeReferenceDirectives, file.hasNoDefaultLib, file.libReferenceDirectives);
};
const iterate_node = (props) => {
var _a;
return typescript_1.default.visitEachChild((_a = try_transform_node(props)) !== null && _a !== void 0 ? _a : props.node, (child) => iterate_node({
context: props.context,
file: props.file,
node: child,
}), props.context.transformer);
};
const try_transform_node = (props) => {
var _a;
var _b;
try {
return NodeTransformer_1.NodeTransformer.transform(props);
}
catch (exp) {
// ONLY ACCEPT TRANSFORMER-ERROR
if (!isTransformerError(exp))
throw exp;
// AVOID SPECIAL BUG OF TYPESCRIPT COMPILER API
(_a = (_b = props.node).parent) !== null && _a !== void 0 ? _a : (_b.parent = props.file);
// REPORT DIAGNOSTIC
const diagnostic = typescript_1.default.createDiagnosticForNode(props.node, {
key: exp.code,
category: typescript_1.default.DiagnosticCategory.Error,
message: exp.message,
code: `(${exp.code})`,
});
props.context.extras.addDiagnostic(diagnostic);
return null;
}
};
const find_import_injection_index = (file) => {
let i = 0;
for (; i < file.statements.length; ++i) {
const stmt = file.statements[i];
if (typescript_1.default.isExpressionStatement(stmt) &&
typescript_1.default.isStringLiteralLike(stmt.expression) &&
stmt.expression.text.startsWith("use "))
continue;
break;
}
return i;
};
})(FileTransformer || (exports.FileTransformer = FileTransformer = {}));
const isTransformerError = (error) => typeof error === "object" &&
error !== null &&
error.constructor.name === "TransformerError" &&
typeof error.code === "string" &&
typeof error.message === "string";
//# sourceMappingURL=FileTransformer.js.map