@nestjs/core
Version:
Nest - modern, fast, powerful node.js web framework (@core)
127 lines (126 loc) • 5.35 kB
JavaScript
Object.defineProperty(exports, "__esModule", { value: true });
exports.ReplContext = void 0;
const common_1 = require("@nestjs/common");
const application_config_1 = require("../application-config");
const injector_1 = require("../injector");
const internal_core_module_1 = require("../injector/internal-core-module/internal-core-module");
const native_functions_1 = require("./native-functions");
class ReplContext {
constructor(app, nativeFunctionsClassRefs) {
this.app = app;
this.logger = new common_1.Logger(ReplContext.name);
this.debugRegistry = {};
this.globalScope = Object.create(null);
this.nativeFunctions = new Map();
this.container = app.container; // Using `any` because `app.container` is not public.
this.initializeContext();
this.initializeNativeFunctions(nativeFunctionsClassRefs || []);
}
writeToStdout(text) {
process.stdout.write(text);
}
initializeContext() {
const modules = this.container.getModules();
modules.forEach(moduleRef => {
let moduleName = moduleRef.metatype.name;
if (moduleName === internal_core_module_1.InternalCoreModule.name) {
return;
}
if (this.globalScope[moduleName]) {
moduleName += ` (${moduleRef.token})`;
}
this.introspectCollection(moduleRef, moduleName, 'providers');
this.introspectCollection(moduleRef, moduleName, 'controllers');
// For in REPL auto-complete functionality
Object.defineProperty(this.globalScope, moduleName, {
value: moduleRef.metatype,
configurable: false,
enumerable: true,
});
});
}
introspectCollection(moduleRef, moduleKey, collection) {
const moduleDebugEntry = {};
moduleRef[collection].forEach(({ token }) => {
const stringifiedToken = this.stringifyToken(token);
if (stringifiedToken === application_config_1.ApplicationConfig.name ||
stringifiedToken === moduleRef.metatype.name) {
return;
}
if (!this.globalScope[stringifiedToken]) {
// For in REPL auto-complete functionality
Object.defineProperty(this.globalScope, stringifiedToken, {
value: token,
configurable: false,
enumerable: true,
});
}
if (stringifiedToken === injector_1.ModuleRef.name) {
return;
}
moduleDebugEntry[stringifiedToken] = token;
});
this.debugRegistry[moduleKey] = {
...this.debugRegistry?.[moduleKey],
[collection]: moduleDebugEntry,
};
}
stringifyToken(token) {
return typeof token !== 'string'
? typeof token === 'function'
? token.name
: token?.toString()
: `"${token}"`;
}
addNativeFunction(NativeFunctionRef) {
const nativeFunction = new NativeFunctionRef(this);
const nativeFunctions = [nativeFunction];
this.nativeFunctions.set(nativeFunction.fnDefinition.name, nativeFunction);
nativeFunction.fnDefinition.aliases?.forEach(aliasName => {
const aliasNativeFunction = Object.create(nativeFunction);
aliasNativeFunction.fnDefinition = {
name: aliasName,
description: aliasNativeFunction.fnDefinition.description,
signature: aliasNativeFunction.fnDefinition.signature,
};
this.nativeFunctions.set(aliasName, aliasNativeFunction);
nativeFunctions.push(aliasNativeFunction);
});
return nativeFunctions;
}
registerFunctionIntoGlobalScope(nativeFunction) {
// Bind the method to REPL's context:
this.globalScope[nativeFunction.fnDefinition.name] =
nativeFunction.action.bind(nativeFunction);
// Load the help trigger as a `help` getter on each native function:
const functionBoundRef = this.globalScope[nativeFunction.fnDefinition.name];
Object.defineProperty(functionBoundRef, 'help', {
enumerable: false,
configurable: false,
get: () =>
// Dynamically builds the help message as will unlikely to be called
// several times.
this.writeToStdout(nativeFunction.makeHelpMessage()),
});
}
initializeNativeFunctions(nativeFunctionsClassRefs) {
const builtInFunctionsClassRefs = [
native_functions_1.HelpReplFn,
native_functions_1.GetReplFn,
native_functions_1.ResolveReplFn,
native_functions_1.SelectReplFn,
native_functions_1.DebugReplFn,
native_functions_1.MethodsReplFn,
];
builtInFunctionsClassRefs
.concat(nativeFunctionsClassRefs)
.forEach(NativeFunction => {
const nativeFunctions = this.addNativeFunction(NativeFunction);
nativeFunctions.forEach(nativeFunction => {
this.registerFunctionIntoGlobalScope(nativeFunction);
});
});
}
}
exports.ReplContext = ReplContext;
;