nestjs-auto-reflect-metadata-emitter
Version:
[](https://github.com/Codibre/nestjs-auto-reflect-metadata-emitter/actions) [ || (Object.create ? (function(o, m, k, k2) {
if (k2 === undefined) k2 = k;
var desc = Object.getOwnPropertyDescriptor(m, k);
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
desc = { enumerable: true, get: function() { return m[k]; } };
}
Object.defineProperty(o, k2, desc);
}) : (function(o, m, k, k2) {
if (k2 === undefined) k2 = k;
o[k2] = m[k];
}));
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
Object.defineProperty(o, "default", { enumerable: true, value: v });
}) : function(o, v) {
o["default"] = v;
});
var __importStar = (this && this.__importStar) || function (mod) {
if (mod && mod.__esModule) return mod;
var result = {};
if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
__setModuleDefault(result, mod);
return result;
};
Object.defineProperty(exports, "__esModule", { value: true });
exports.before = before;
exports.simpleDecorator = simpleDecorator;
const ts = __importStar(require("typescript"));
const module_exists_1 = require("./module-exists");
const ts_loader_1 = require("./ts-loader");
function addRef(p, imports, mustImport) {
if (p.type) {
const ref = imports.get(p.type.getText());
if (ref)
mustImport.add(ref);
}
}
function* emitPropertyAssignments(obj) {
for (const k in obj) {
if (k in obj) {
yield ts_loader_1.tsBinary.factory.createPropertyAssignment(k, obj[k]
? ts_loader_1.tsBinary.factory.createTrue()
: ts_loader_1.tsBinary.factory.createFalse());
}
}
}
function getProperties(node) {
const modifiers = new Set();
for (const modifier of ts_loader_1.tsBinary.getModifiers(node) ?? []) {
modifiers.add(modifier.kind);
}
const access = {
private: modifiers.has(ts.SyntaxKind.PrivateKeyword),
protected: modifiers.has(ts.SyntaxKind.ProtectedKeyword),
};
const properties = {
exported: modifiers.has(ts.SyntaxKind.ExportKeyword),
...access,
public: !access.private && !access.protected,
readonly: modifiers.has(ts.SyntaxKind.ReadonlyKeyword),
static: modifiers.has(ts.SyntaxKind.StaticKeyword),
abstract: modifiers.has(ts.SyntaxKind.AbstractKeyword),
accessor: modifiers.has(ts.SyntaxKind.AccessorKeyword),
async: modifiers.has(ts.SyntaxKind.AsyncKeyword),
const: modifiers.has(ts.SyntaxKind.ConstKeyword),
override: modifiers.has(ts.SyntaxKind.OverrideKeyword),
};
return [
...emitPropertyAssignments(properties),
];
}
function addParameterRefs(node, imports, mustImport) {
for (const p of node.parameters) {
addRef(p, imports, mustImport);
}
}
function before() {
return (ctx) => {
return (sf) => {
const imports = new Map();
const mustImport = new Set();
const visitNode = (node) => {
try {
if (ts_loader_1.tsBinary.isImportClause(node)) {
const { namedBindings } = node;
if (namedBindings) {
for (const item of ts.isNamedImports(namedBindings)
? namedBindings.elements
: []) {
imports.set(item.name.getText(), node);
}
}
}
else if (ts_loader_1.tsBinary.isMethodDeclaration(node) ||
ts_loader_1.tsBinary.isPropertyDeclaration(node) ||
ts_loader_1.tsBinary.isClassDeclaration(node)) {
let identifier;
const modifiers = getProperties(node);
if (!ts_loader_1.tsBinary.isClassDeclaration(node)) {
if (node.type)
addRef(node, imports, mustImport);
if (ts_loader_1.tsBinary.isMethodDeclaration(node)) {
addParameterRefs(node, imports, mustImport);
identifier = 'registerMethodMetadata';
}
else {
identifier = 'registerPropertyMetadata';
}
}
else {
identifier = 'registerClassMetadata';
for (const member of node.members) {
if (ts_loader_1.tsBinary.isConstructorDeclaration(member)) {
addParameterRefs(member, imports, mustImport);
break;
}
}
}
const requireCall = ts_loader_1.tsBinary.factory.createCallExpression(ts_loader_1.tsBinary.factory.createIdentifier('require'), undefined, [
ts_loader_1.tsBinary.factory.createStringLiteral('nestjs-auto-reflect-metadata-emitter/decorators'),
]);
const decoratorAccess = ts_loader_1.tsBinary.factory.createPropertyAccessChain(requireCall, undefined, ts_loader_1.tsBinary.factory.createIdentifier(identifier));
const decoratorCall = ts_loader_1.tsBinary.factory.createCallExpression(decoratorAccess, undefined, [ts_loader_1.tsBinary.factory.createObjectLiteralExpression(modifiers)]);
const decorator = ts_loader_1.tsBinary.factory.createDecorator(decoratorCall);
node = ts_loader_1.tsBinary.factory.replaceDecoratorsAndModifiers(node, [
...(node.modifiers ?? []),
decorator,
]);
return ts_loader_1.tsBinary.isClassDeclaration(node)
? ts_loader_1.tsBinary.visitEachChild(node, visitNode, ctx)
: node;
}
return ts_loader_1.tsBinary.visitEachChild(node, visitNode, ctx);
}
catch (err) {
console.log(err.stack);
return node;
}
};
const processImports = (node) => {
try {
if (ts_loader_1.tsBinary.isImportClause(node) &&
(0, module_exists_1.moduleExists)(sf, node.parent.moduleSpecifier.text)) {
const { namedBindings } = node;
if (namedBindings) {
for (const item of ts.isNamedImports(namedBindings)
? namedBindings.elements
: []) {
item.symbol.flags |= 33554432;
item.symbol.links = { referenced: true };
break;
}
}
return ts_loader_1.tsBinary.factory.updateImportClause(node, false, node.name, node.namedBindings);
}
return ts_loader_1.tsBinary.visitEachChild(node, processImports, ctx);
}
catch (err) {
console.log(err.stack);
return node;
}
};
const nodeResult = ts_loader_1.tsBinary.visitNode(sf, visitNode);
return ts_loader_1.tsBinary.visitNode(nodeResult, processImports);
};
};
}
function simpleDecorator() {
}
//# sourceMappingURL=emitter.js.map